@bevel-software/platform-core-backend 0.20.0 → 0.21.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 (576) hide show
  1. package/dist/core/catalog-cache-invalidation.d.ts +7 -2
  2. package/dist/core/catalog-cache-invalidation.d.ts.map +1 -1
  3. package/dist/core/catalog-cache-invalidation.js +8 -9
  4. package/dist/core/catalog-cache-invalidation.js.map +1 -1
  5. package/dist/core/core-ports.d.ts +19 -0
  6. package/dist/core/core-ports.d.ts.map +1 -1
  7. package/dist/core/core-ports.js.map +1 -1
  8. package/dist/core/create-core-server.d.ts +2 -0
  9. package/dist/core/create-core-server.d.ts.map +1 -1
  10. package/dist/core/create-core-server.js +23 -105
  11. package/dist/core/create-core-server.js.map +1 -1
  12. package/dist/core/create-core-services.d.ts +30 -5
  13. package/dist/core/create-core-services.d.ts.map +1 -1
  14. package/dist/core/create-core-services.js +136 -81
  15. package/dist/core/create-core-services.js.map +1 -1
  16. package/dist/core/lifecycle.d.ts +74 -28
  17. package/dist/core/lifecycle.d.ts.map +1 -1
  18. package/dist/core/lifecycle.js +157 -20
  19. package/dist/core/lifecycle.js.map +1 -1
  20. package/dist/core/public-config.d.ts +5 -1
  21. package/dist/core/public-config.d.ts.map +1 -1
  22. package/dist/core/public-config.js +7 -5
  23. package/dist/core/public-config.js.map +1 -1
  24. package/dist/core-config.d.ts +95 -1
  25. package/dist/core-config.d.ts.map +1 -1
  26. package/dist/core-config.js +24 -8
  27. package/dist/core-config.js.map +1 -1
  28. package/dist/index.d.ts +5 -3
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +6 -3
  31. package/dist/index.js.map +1 -1
  32. package/dist/modules/access/access-control.service.d.ts +18 -1
  33. package/dist/modules/access/access-control.service.d.ts.map +1 -1
  34. package/dist/modules/access/access-control.service.js +19 -8
  35. package/dist/modules/access/access-control.service.js.map +1 -1
  36. package/dist/modules/access/access.routes.d.ts +2 -1
  37. package/dist/modules/access/access.routes.d.ts.map +1 -1
  38. package/dist/modules/access/access.routes.js +10 -10
  39. package/dist/modules/access/access.routes.js.map +1 -1
  40. package/dist/modules/access/change-read-gate.d.ts +6 -3
  41. package/dist/modules/access/change-read-gate.d.ts.map +1 -1
  42. package/dist/modules/access/change-read-gate.js +9 -6
  43. package/dist/modules/access/change-read-gate.js.map +1 -1
  44. package/dist/modules/access/creator-access.d.ts +4 -2
  45. package/dist/modules/access/creator-access.d.ts.map +1 -1
  46. package/dist/modules/access/creator-access.js +7 -4
  47. package/dist/modules/access/creator-access.js.map +1 -1
  48. package/dist/modules/agent-instructions/read-preamble.d.ts +2 -1
  49. package/dist/modules/agent-instructions/read-preamble.d.ts.map +1 -1
  50. package/dist/modules/agent-instructions/read-preamble.js +6 -9
  51. package/dist/modules/agent-instructions/read-preamble.js.map +1 -1
  52. package/dist/modules/auth/account-admission.d.ts +40 -0
  53. package/dist/modules/auth/account-admission.d.ts.map +1 -0
  54. package/dist/modules/auth/account-admission.js +17 -0
  55. package/dist/modules/auth/account-admission.js.map +1 -0
  56. package/dist/modules/auth/account.routes.d.ts.map +1 -1
  57. package/dist/modules/auth/account.routes.js +4 -1
  58. package/dist/modules/auth/account.routes.js.map +1 -1
  59. package/dist/modules/auth/auth.service.d.ts +19 -1
  60. package/dist/modules/auth/auth.service.d.ts.map +1 -1
  61. package/dist/modules/auth/auth.service.js +33 -1
  62. package/dist/modules/auth/auth.service.js.map +1 -1
  63. package/dist/modules/auth/oidc-auth-provider.d.ts.map +1 -1
  64. package/dist/modules/auth/oidc-auth-provider.js +9 -0
  65. package/dist/modules/auth/oidc-auth-provider.js.map +1 -1
  66. package/dist/modules/connection-probe/connection-probe.service.d.ts +13 -1
  67. package/dist/modules/connection-probe/connection-probe.service.d.ts.map +1 -1
  68. package/dist/modules/connection-probe/connection-probe.service.js +10 -2
  69. package/dist/modules/connection-probe/connection-probe.service.js.map +1 -1
  70. package/dist/modules/database/advisory-lock.d.ts +17 -0
  71. package/dist/modules/database/advisory-lock.d.ts.map +1 -1
  72. package/dist/modules/database/advisory-lock.js +24 -3
  73. package/dist/modules/database/advisory-lock.js.map +1 -1
  74. package/dist/modules/database/connection.d.ts +67 -2
  75. package/dist/modules/database/connection.d.ts.map +1 -1
  76. package/dist/modules/database/connection.js +118 -12
  77. package/dist/modules/database/connection.js.map +1 -1
  78. package/dist/modules/database/migrate.d.ts +1 -1
  79. package/dist/modules/database/migrate.d.ts.map +1 -1
  80. package/dist/modules/database/migrate.js +27 -3
  81. package/dist/modules/database/migrate.js.map +1 -1
  82. package/dist/modules/kb-fs/branch-name.d.ts +0 -1
  83. package/dist/modules/kb-fs/branch-name.d.ts.map +1 -1
  84. package/dist/modules/kb-fs/branch-name.js +3 -3
  85. package/dist/modules/kb-fs/branch-name.js.map +1 -1
  86. package/dist/modules/kb-fs/clone-config.d.ts +9 -8
  87. package/dist/modules/kb-fs/clone-config.d.ts.map +1 -1
  88. package/dist/modules/kb-fs/clone-config.js +14 -12
  89. package/dist/modules/kb-fs/clone-config.js.map +1 -1
  90. package/dist/modules/mcp/mcp.service.d.ts +7 -0
  91. package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
  92. package/dist/modules/mcp/mcp.service.js +4 -4
  93. package/dist/modules/mcp/mcp.service.js.map +1 -1
  94. package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts +4 -4
  95. package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts.map +1 -1
  96. package/dist/modules/plugins/compile/marketplace-compiler.service.js +7 -10
  97. package/dist/modules/plugins/compile/marketplace-compiler.service.js.map +1 -1
  98. package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.d.ts +4 -1
  99. package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.d.ts.map +1 -1
  100. package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.js +5 -3
  101. package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.js.map +1 -1
  102. package/dist/modules/plugins/discovery/kb-plugin-source.d.ts +6 -1
  103. package/dist/modules/plugins/discovery/kb-plugin-source.d.ts.map +1 -1
  104. package/dist/modules/plugins/discovery/kb-plugin-source.js +14 -9
  105. package/dist/modules/plugins/discovery/kb-plugin-source.js.map +1 -1
  106. package/dist/modules/plugins/discovery/native.source.d.ts +4 -1
  107. package/dist/modules/plugins/discovery/native.source.d.ts.map +1 -1
  108. package/dist/modules/plugins/discovery/native.source.js +4 -2
  109. package/dist/modules/plugins/discovery/native.source.js.map +1 -1
  110. package/dist/modules/plugins/index.d.ts +1 -1
  111. package/dist/modules/plugins/index.d.ts.map +1 -1
  112. package/dist/modules/plugins/index.js +1 -1
  113. package/dist/modules/plugins/index.js.map +1 -1
  114. package/dist/modules/plugins/join-request-jobs.service.d.ts +3 -1
  115. package/dist/modules/plugins/join-request-jobs.service.d.ts.map +1 -1
  116. package/dist/modules/plugins/join-request-jobs.service.js +6 -6
  117. package/dist/modules/plugins/join-request-jobs.service.js.map +1 -1
  118. package/dist/modules/plugins/join-requests.service.d.ts +3 -1
  119. package/dist/modules/plugins/join-requests.service.d.ts.map +1 -1
  120. package/dist/modules/plugins/join-requests.service.js +9 -8
  121. package/dist/modules/plugins/join-requests.service.js.map +1 -1
  122. package/dist/modules/plugins/plugin-links.d.ts +65 -10
  123. package/dist/modules/plugins/plugin-links.d.ts.map +1 -1
  124. package/dist/modules/plugins/plugin-links.js +136 -31
  125. package/dist/modules/plugins/plugin-links.js.map +1 -1
  126. package/dist/modules/plugins/plugin-links.service.d.ts +107 -5
  127. package/dist/modules/plugins/plugin-links.service.d.ts.map +1 -1
  128. package/dist/modules/plugins/plugin-links.service.js +151 -21
  129. package/dist/modules/plugins/plugin-links.service.js.map +1 -1
  130. package/dist/modules/plugins/plugin-provision.service.d.ts +10 -3
  131. package/dist/modules/plugins/plugin-provision.service.d.ts.map +1 -1
  132. package/dist/modules/plugins/plugin-provision.service.js +33 -26
  133. package/dist/modules/plugins/plugin-provision.service.js.map +1 -1
  134. package/dist/modules/plugins/plugin-rename.service.d.ts +4 -2
  135. package/dist/modules/plugins/plugin-rename.service.d.ts.map +1 -1
  136. package/dist/modules/plugins/plugin-rename.service.js +10 -12
  137. package/dist/modules/plugins/plugin-rename.service.js.map +1 -1
  138. package/dist/modules/plugins/plugins.routes.d.ts +3 -0
  139. package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
  140. package/dist/modules/plugins/plugins.routes.js +45 -15
  141. package/dist/modules/plugins/plugins.routes.js.map +1 -1
  142. package/dist/modules/plugins/plugins.service.d.ts +4 -4
  143. package/dist/modules/plugins/plugins.service.d.ts.map +1 -1
  144. package/dist/modules/plugins/plugins.service.js +7 -10
  145. package/dist/modules/plugins/plugins.service.js.map +1 -1
  146. package/dist/modules/plugins/teams.routes.d.ts +4 -1
  147. package/dist/modules/plugins/teams.routes.d.ts.map +1 -1
  148. package/dist/modules/plugins/teams.routes.js +11 -9
  149. package/dist/modules/plugins/teams.routes.js.map +1 -1
  150. package/dist/modules/secrets-vault/index.d.ts +1 -1
  151. package/dist/modules/secrets-vault/index.d.ts.map +1 -1
  152. package/dist/modules/secrets-vault/index.js +1 -1
  153. package/dist/modules/secrets-vault/index.js.map +1 -1
  154. package/dist/modules/secrets-vault/secrets-variable-loader.d.ts +29 -11
  155. package/dist/modules/secrets-vault/secrets-variable-loader.d.ts.map +1 -1
  156. package/dist/modules/secrets-vault/secrets-variable-loader.js +46 -21
  157. package/dist/modules/secrets-vault/secrets-variable-loader.js.map +1 -1
  158. package/dist/modules/secrets-vault/secrets-vault.routes.d.ts +3 -0
  159. package/dist/modules/secrets-vault/secrets-vault.routes.d.ts.map +1 -1
  160. package/dist/modules/secrets-vault/secrets-vault.routes.js +4 -6
  161. package/dist/modules/secrets-vault/secrets-vault.routes.js.map +1 -1
  162. package/dist/modules/settings/deployment-settings.service.d.ts +12 -8
  163. package/dist/modules/settings/deployment-settings.service.d.ts.map +1 -1
  164. package/dist/modules/settings/deployment-settings.service.js +20 -22
  165. package/dist/modules/settings/deployment-settings.service.js.map +1 -1
  166. package/dist/modules/settings/setup.routes.d.ts +9 -2
  167. package/dist/modules/settings/setup.routes.d.ts.map +1 -1
  168. package/dist/modules/settings/setup.routes.js +20 -14
  169. package/dist/modules/settings/setup.routes.js.map +1 -1
  170. package/dist/modules/skills/allowed-tools-check.d.ts +4 -3
  171. package/dist/modules/skills/allowed-tools-check.d.ts.map +1 -1
  172. package/dist/modules/skills/allowed-tools-check.js +8 -8
  173. package/dist/modules/skills/allowed-tools-check.js.map +1 -1
  174. package/dist/modules/skills/pending-skills.service.d.ts +3 -1
  175. package/dist/modules/skills/pending-skills.service.d.ts.map +1 -1
  176. package/dist/modules/skills/pending-skills.service.js +9 -6
  177. package/dist/modules/skills/pending-skills.service.js.map +1 -1
  178. package/dist/modules/skills/skill-access-requests.routes.d.ts +2 -1
  179. package/dist/modules/skills/skill-access-requests.routes.d.ts.map +1 -1
  180. package/dist/modules/skills/skill-access-requests.routes.js +6 -6
  181. package/dist/modules/skills/skill-access-requests.routes.js.map +1 -1
  182. package/dist/modules/skills/skills.routes.d.ts +4 -1
  183. package/dist/modules/skills/skills.routes.d.ts.map +1 -1
  184. package/dist/modules/skills/skills.routes.js +4 -4
  185. package/dist/modules/skills/skills.routes.js.map +1 -1
  186. package/dist/modules/skills/skills.service.d.ts +4 -2
  187. package/dist/modules/skills/skills.service.d.ts.map +1 -1
  188. package/dist/modules/skills/skills.service.js +13 -11
  189. package/dist/modules/skills/skills.service.js.map +1 -1
  190. package/dist/modules/tool-manuals/mcp-json-discovery.d.ts +2 -1
  191. package/dist/modules/tool-manuals/mcp-json-discovery.d.ts.map +1 -1
  192. package/dist/modules/tool-manuals/mcp-json-discovery.js +6 -5
  193. package/dist/modules/tool-manuals/mcp-json-discovery.js.map +1 -1
  194. package/dist/modules/tool-manuals/mcp-server-edit.service.d.ts +4 -2
  195. package/dist/modules/tool-manuals/mcp-server-edit.service.d.ts.map +1 -1
  196. package/dist/modules/tool-manuals/mcp-server-edit.service.js +12 -10
  197. package/dist/modules/tool-manuals/mcp-server-edit.service.js.map +1 -1
  198. package/dist/modules/tool-manuals/pending-tools.service.d.ts +3 -1
  199. package/dist/modules/tool-manuals/pending-tools.service.d.ts.map +1 -1
  200. package/dist/modules/tool-manuals/pending-tools.service.js +19 -16
  201. package/dist/modules/tool-manuals/pending-tools.service.js.map +1 -1
  202. package/dist/modules/tool-manuals/tool-delete.service.d.ts +4 -2
  203. package/dist/modules/tool-manuals/tool-delete.service.d.ts.map +1 -1
  204. package/dist/modules/tool-manuals/tool-delete.service.js +14 -12
  205. package/dist/modules/tool-manuals/tool-delete.service.js.map +1 -1
  206. package/dist/modules/tool-manuals/tool-manuals.routes.d.ts +3 -1
  207. package/dist/modules/tool-manuals/tool-manuals.routes.d.ts.map +1 -1
  208. package/dist/modules/tool-manuals/tool-manuals.routes.js +7 -7
  209. package/dist/modules/tool-manuals/tool-manuals.routes.js.map +1 -1
  210. package/dist/modules/tool-manuals/tool-manuals.service.d.ts +4 -2
  211. package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
  212. package/dist/modules/tool-manuals/tool-manuals.service.js +15 -12
  213. package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -1
  214. package/dist/modules/tool-manuals/tool-manuals.tools.d.ts +3 -0
  215. package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
  216. package/dist/modules/tool-manuals/tool-manuals.tools.js +4 -6
  217. package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
  218. package/dist/modules/workflow/agent-tools/workflow.tools.d.ts +3 -2
  219. package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +1 -1
  220. package/dist/modules/workflow/agent-tools/workflow.tools.js +9 -9
  221. package/dist/modules/workflow/agent-tools/workflow.tools.js.map +1 -1
  222. package/dist/modules/workflow/git/git.service.d.ts +11 -5
  223. package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
  224. package/dist/modules/workflow/git/git.service.js +23 -14
  225. package/dist/modules/workflow/git/git.service.js.map +1 -1
  226. package/dist/modules/workflow/git/node-git-runner.d.ts +26 -2
  227. package/dist/modules/workflow/git/node-git-runner.d.ts.map +1 -1
  228. package/dist/modules/workflow/git/node-git-runner.js +35 -5
  229. package/dist/modules/workflow/git/node-git-runner.js.map +1 -1
  230. package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts.map +1 -1
  231. package/dist/modules/workflow/review-workflow/review-workflow.service.js +9 -4
  232. package/dist/modules/workflow/review-workflow/review-workflow.service.js.map +1 -1
  233. package/dist/modules/workflow/session-ontology.service.d.ts +6 -1
  234. package/dist/modules/workflow/session-ontology.service.d.ts.map +1 -1
  235. package/dist/modules/workflow/session-ontology.service.js +6 -2
  236. package/dist/modules/workflow/session-ontology.service.js.map +1 -1
  237. package/dist/modules/workflow/workflow.service.d.ts +8 -3
  238. package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
  239. package/dist/modules/workflow/workflow.service.js +33 -23
  240. package/dist/modules/workflow/workflow.service.js.map +1 -1
  241. package/dist/modules/workspace/session-ontology.gate.d.ts +3 -1
  242. package/dist/modules/workspace/session-ontology.gate.d.ts.map +1 -1
  243. package/dist/modules/workspace/session-ontology.gate.js +3 -3
  244. package/dist/modules/workspace/session-ontology.gate.js.map +1 -1
  245. package/dist/modules/workspace/startup/kb-git.d.ts +4 -3
  246. package/dist/modules/workspace/startup/kb-git.d.ts.map +1 -1
  247. package/dist/modules/workspace/startup/kb-git.js +15 -13
  248. package/dist/modules/workspace/startup/kb-git.js.map +1 -1
  249. package/dist/modules/workspace/startup/kb-startup-runner.d.ts +5 -8
  250. package/dist/modules/workspace/startup/kb-startup-runner.d.ts.map +1 -1
  251. package/dist/modules/workspace/startup/kb-startup-runner.js +35 -38
  252. package/dist/modules/workspace/startup/kb-startup-runner.js.map +1 -1
  253. package/dist/modules/workspace/startup/steps/groups-to-plugins.step.d.ts +7 -1
  254. package/dist/modules/workspace/startup/steps/groups-to-plugins.step.d.ts.map +1 -1
  255. package/dist/modules/workspace/startup/steps/groups-to-plugins.step.js +23 -16
  256. package/dist/modules/workspace/startup/steps/groups-to-plugins.step.js.map +1 -1
  257. package/dist/modules/workspace/startup/steps/personal-spaces.step.d.ts +7 -1
  258. package/dist/modules/workspace/startup/steps/personal-spaces.step.d.ts.map +1 -1
  259. package/dist/modules/workspace/startup/steps/personal-spaces.step.js +12 -5
  260. package/dist/modules/workspace/startup/steps/personal-spaces.step.js.map +1 -1
  261. package/dist/modules/workspace/startup/steps/plugin-display-names.step.d.ts +7 -1
  262. package/dist/modules/workspace/startup/steps/plugin-display-names.step.d.ts.map +1 -1
  263. package/dist/modules/workspace/startup/steps/plugin-display-names.step.js +12 -5
  264. package/dist/modules/workspace/startup/steps/plugin-display-names.step.js.map +1 -1
  265. package/dist/modules/workspace/startup/steps/plugin-manifests.step.d.ts +7 -1
  266. package/dist/modules/workspace/startup/steps/plugin-manifests.step.d.ts.map +1 -1
  267. package/dist/modules/workspace/startup/steps/plugin-manifests.step.js +12 -5
  268. package/dist/modules/workspace/startup/steps/plugin-manifests.step.js.map +1 -1
  269. package/dist/modules/workspace/startup/steps/seed-tree.d.ts +4 -1
  270. package/dist/modules/workspace/startup/steps/seed-tree.d.ts.map +1 -1
  271. package/dist/modules/workspace/startup/steps/seed-tree.js +14 -11
  272. package/dist/modules/workspace/startup/steps/seed-tree.js.map +1 -1
  273. package/dist/modules/workspace/startup/steps/template-files.step.d.ts +17 -3
  274. package/dist/modules/workspace/startup/steps/template-files.step.d.ts.map +1 -1
  275. package/dist/modules/workspace/startup/steps/template-files.step.js +36 -30
  276. package/dist/modules/workspace/startup/steps/template-files.step.js.map +1 -1
  277. package/dist/modules/workspace/startup/steps/template-source.d.ts +6 -1
  278. package/dist/modules/workspace/startup/steps/template-source.d.ts.map +1 -1
  279. package/dist/modules/workspace/startup/steps/template-source.js +10 -6
  280. package/dist/modules/workspace/startup/steps/template-source.js.map +1 -1
  281. package/dist/modules/workspace/workspace.routes.d.ts +2 -1
  282. package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
  283. package/dist/modules/workspace/workspace.routes.js +8 -7
  284. package/dist/modules/workspace/workspace.routes.js.map +1 -1
  285. package/dist/modules/workspace/workspace.service.d.ts +18 -12
  286. package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
  287. package/dist/modules/workspace/workspace.service.js +32 -28
  288. package/dist/modules/workspace/workspace.service.js.map +1 -1
  289. package/dist/modules/workspace/workspace.tools.d.ts +2 -1
  290. package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
  291. package/dist/modules/workspace/workspace.tools.js +20 -18
  292. package/dist/modules/workspace/workspace.tools.js.map +1 -1
  293. package/dist/modules/workspace/write-denial.d.ts +3 -2
  294. package/dist/modules/workspace/write-denial.d.ts.map +1 -1
  295. package/dist/modules/workspace/write-denial.js +6 -5
  296. package/dist/modules/workspace/write-denial.js.map +1 -1
  297. package/dist/shared/git.contract.d.ts +52 -7
  298. package/dist/shared/git.contract.d.ts.map +1 -1
  299. package/dist/shared/git.contract.js +30 -8
  300. package/dist/shared/git.contract.js.map +1 -1
  301. package/dist/shared/kb-context.d.ts +76 -0
  302. package/dist/shared/kb-context.d.ts.map +1 -0
  303. package/dist/shared/kb-context.js +108 -0
  304. package/dist/shared/kb-context.js.map +1 -0
  305. package/dist/shared/kb-layout.d.ts +3 -2
  306. package/dist/shared/kb-layout.d.ts.map +1 -1
  307. package/dist/shared/kb-layout.js +4 -3
  308. package/dist/shared/kb-layout.js.map +1 -1
  309. package/dist/shared/kb-layout.test.js +35 -27
  310. package/dist/shared/kb-layout.test.js.map +1 -1
  311. package/dist/shared/pending-proposals.d.ts +4 -1
  312. package/dist/shared/pending-proposals.d.ts.map +1 -1
  313. package/dist/shared/pending-proposals.js +3 -4
  314. package/dist/shared/pending-proposals.js.map +1 -1
  315. package/dist/shared/redact-secret.d.ts +5 -5
  316. package/dist/shared/redact-secret.js +5 -5
  317. package/dist/tenancy/index.d.ts +13 -0
  318. package/dist/tenancy/index.d.ts.map +1 -0
  319. package/dist/tenancy/index.js +13 -0
  320. package/dist/tenancy/index.js.map +1 -0
  321. package/dist/tenancy/static-tenant-source.d.ts +98 -0
  322. package/dist/tenancy/static-tenant-source.d.ts.map +1 -0
  323. package/dist/tenancy/static-tenant-source.js +220 -0
  324. package/dist/tenancy/static-tenant-source.js.map +1 -0
  325. package/dist/tenancy/tenant-host.d.ts +80 -0
  326. package/dist/tenancy/tenant-host.d.ts.map +1 -0
  327. package/dist/tenancy/tenant-host.js +217 -0
  328. package/dist/tenancy/tenant-host.js.map +1 -0
  329. package/dist/tenancy/tenant-runtime.d.ts +91 -0
  330. package/dist/tenancy/tenant-runtime.d.ts.map +1 -0
  331. package/dist/tenancy/tenant-runtime.js +174 -0
  332. package/dist/tenancy/tenant-runtime.js.map +1 -0
  333. package/dist/tenancy/tenant-secrets.d.ts +24 -0
  334. package/dist/tenancy/tenant-secrets.d.ts.map +1 -0
  335. package/dist/tenancy/tenant-secrets.js +30 -0
  336. package/dist/tenancy/tenant-secrets.js.map +1 -0
  337. package/dist/tenancy/tenant-source.contract.d.ts +45 -0
  338. package/dist/tenancy/tenant-source.contract.d.ts.map +1 -0
  339. package/dist/tenancy/tenant-source.contract.js +21 -0
  340. package/dist/tenancy/tenant-source.contract.js.map +1 -0
  341. package/migrations/0000_core_init.sql +14 -14
  342. package/migrations/0003_deployment_settings.sql +1 -1
  343. package/migrations/0005_github_facade.sql +1 -1
  344. package/migrations/0012_agent_audit.sql +6 -6
  345. package/package.json +3 -3
  346. package/src/__tests__/branch-model.test.ts +7 -6
  347. package/src/__tests__/kb-context.ts +30 -0
  348. package/src/__tests__/kb-layout-config.test.ts +35 -30
  349. package/src/core/__tests__/catalog-cache-invalidation.test.ts +2 -1
  350. package/src/core/__tests__/lifecycle.test.ts +78 -1
  351. package/src/core/__tests__/public-config.test.ts +5 -1
  352. package/src/core/catalog-cache-invalidation.ts +16 -11
  353. package/src/core/core-ports.ts +19 -0
  354. package/src/core/create-core-server.ts +27 -106
  355. package/src/core/create-core-services.ts +180 -95
  356. package/src/core/lifecycle.ts +214 -29
  357. package/src/core/public-config.ts +8 -5
  358. package/src/core-config.ts +107 -8
  359. package/src/index.ts +25 -2
  360. package/src/modules/access/__tests__/access-control.admin-root-floor.test.ts +2 -1
  361. package/src/modules/access/__tests__/access.routes.batch.test.ts +2 -1
  362. package/src/modules/access/__tests__/access.routes.folder-governs.test.ts +2 -1
  363. package/src/modules/access/__tests__/access.routes.group-grant.test.ts +2 -1
  364. package/src/modules/access/__tests__/access.routes.overrides.test.ts +2 -1
  365. package/src/modules/access/__tests__/access.routes.proposal-branch.test.ts +2 -1
  366. package/src/modules/access/__tests__/access.routes.prospective.test.ts +2 -1
  367. package/src/modules/access/__tests__/access.routes.revoke.test.ts +2 -1
  368. package/src/modules/access/__tests__/access.routes.unknown-email.test.ts +2 -1
  369. package/src/modules/access/__tests__/change-read-gate.test.ts +13 -11
  370. package/src/modules/access/__tests__/creator-access.test.ts +3 -2
  371. package/src/modules/access/__tests__/roles.routes.test.ts +2 -1
  372. package/src/modules/access/access-control.service.ts +20 -6
  373. package/src/modules/access/access.routes.ts +10 -13
  374. package/src/modules/access/change-read-gate.ts +10 -4
  375. package/src/modules/access/creator-access.ts +7 -2
  376. package/src/modules/agent-instructions/__tests__/read-preamble.test.ts +13 -12
  377. package/src/modules/agent-instructions/read-preamble.ts +10 -12
  378. package/src/modules/auth/__tests__/account.routes.test.ts +15 -0
  379. package/src/modules/auth/__tests__/auth.service.test.ts +60 -0
  380. package/src/modules/auth/account-admission.ts +44 -0
  381. package/src/modules/auth/account.routes.ts +4 -1
  382. package/src/modules/auth/auth.service.ts +33 -1
  383. package/src/modules/auth/oidc-auth-provider.ts +9 -0
  384. package/src/modules/connection-probe/connection-probe.service.ts +7 -1
  385. package/src/modules/database/__tests__/advisory-lock.test.ts +23 -1
  386. package/src/modules/database/__tests__/connection.test.ts +98 -0
  387. package/src/modules/database/__tests__/migrations-unqualified.test.ts +32 -0
  388. package/src/modules/database/advisory-lock.ts +28 -4
  389. package/src/modules/database/connection.ts +143 -13
  390. package/src/modules/database/migrate.ts +48 -14
  391. package/src/modules/diff/__tests__/diff.service.seed-atomicity.test.ts +2 -1
  392. package/src/modules/diff/__tests__/diff.service.test.ts +2 -1
  393. package/src/modules/kb-fs/__tests__/branch-name.test.ts +6 -6
  394. package/src/modules/kb-fs/__tests__/clone-config.test.ts +24 -20
  395. package/src/modules/kb-fs/branch-name.ts +3 -3
  396. package/src/modules/kb-fs/clone-config.ts +15 -12
  397. package/src/modules/marketplace/__tests__/marketplace-repo.head.test.ts +2 -1
  398. package/src/modules/mcp/mcp.service.ts +11 -4
  399. package/src/modules/plugins/__tests__/bundle-dialect.e2e.test.ts +12 -11
  400. package/src/modules/plugins/__tests__/bundle-dialect.test.ts +2 -1
  401. package/src/modules/plugins/__tests__/compile-marketplace.test.ts +6 -4
  402. package/src/modules/plugins/__tests__/join-request-jobs.service.test.ts +2 -1
  403. package/src/modules/plugins/__tests__/join-requests.service.test.ts +2 -1
  404. package/src/modules/plugins/__tests__/plugin-creation-display-name.test.ts +4 -3
  405. package/src/modules/plugins/__tests__/plugin-index.service.test.ts +6 -4
  406. package/src/modules/plugins/__tests__/plugin-links.service.test.ts +220 -5
  407. package/src/modules/plugins/__tests__/plugin-provision.service.test.ts +3 -1
  408. package/src/modules/plugins/__tests__/plugin-rename.service.test.ts +7 -6
  409. package/src/modules/plugins/__tests__/plugins.routes.test.ts +11 -2
  410. package/src/modules/plugins/__tests__/teams.routes.test.ts +2 -1
  411. package/src/modules/plugins/compile/marketplace-compiler.service.ts +7 -9
  412. package/src/modules/plugins/discovery/__tests__/kb-plugin-source.test.ts +20 -16
  413. package/src/modules/plugins/discovery/bundle-dialect/bundle.source.ts +9 -2
  414. package/src/modules/plugins/discovery/kb-plugin-source.ts +15 -8
  415. package/src/modules/plugins/discovery/native.source.ts +4 -1
  416. package/src/modules/plugins/index.ts +1 -1
  417. package/src/modules/plugins/join-request-jobs.service.ts +8 -7
  418. package/src/modules/plugins/join-requests.service.ts +7 -7
  419. package/src/modules/plugins/plugin-links.service.ts +192 -19
  420. package/src/modules/plugins/plugin-links.ts +147 -27
  421. package/src/modules/plugins/plugin-provision.service.ts +54 -27
  422. package/src/modules/plugins/plugin-rename.service.ts +10 -10
  423. package/src/modules/plugins/plugins.routes.ts +45 -15
  424. package/src/modules/plugins/plugins.service.ts +7 -11
  425. package/src/modules/plugins/teams.routes.ts +16 -8
  426. package/src/modules/secrets-vault/__tests__/connect-pending.route.test.ts +7 -0
  427. package/src/modules/secrets-vault/__tests__/secrets-variable-loader.test.ts +40 -0
  428. package/src/modules/secrets-vault/__tests__/tool-owner-gate.route.test.ts +2 -0
  429. package/src/modules/secrets-vault/index.ts +2 -0
  430. package/src/modules/secrets-vault/secrets-variable-loader.ts +51 -21
  431. package/src/modules/secrets-vault/secrets-vault.routes.ts +7 -6
  432. package/src/modules/settings/__tests__/deployment-settings.service.test.ts +24 -11
  433. package/src/modules/settings/__tests__/git-root-folders.test.ts +2 -1
  434. package/src/modules/settings/__tests__/setup.routes.boot-failure.test.ts +2 -1
  435. package/src/modules/settings/__tests__/setup.routes.layout-phase.test.ts +7 -4
  436. package/src/modules/settings/__tests__/setup.routes.oidc.test.ts +2 -0
  437. package/src/modules/settings/__tests__/setup.routes.sync-status.test.ts +2 -0
  438. package/src/modules/settings/__tests__/setup.routes.test.ts +33 -52
  439. package/src/modules/settings/deployment-settings.service.ts +21 -20
  440. package/src/modules/settings/setup.routes.ts +26 -16
  441. package/src/modules/skills/__tests__/allowed-tools-check.test.ts +11 -10
  442. package/src/modules/skills/__tests__/allowed-tools-warn.tools.test.ts +4 -3
  443. package/src/modules/skills/__tests__/pending-skills.service.test.ts +3 -1
  444. package/src/modules/skills/__tests__/skill-access-requests.routes.test.ts +2 -1
  445. package/src/modules/skills/__tests__/skills.routes.warnings.test.ts +2 -1
  446. package/src/modules/skills/__tests__/skills.service.test.ts +3 -2
  447. package/src/modules/skills/allowed-tools-check.ts +7 -6
  448. package/src/modules/skills/pending-skills.service.ts +9 -8
  449. package/src/modules/skills/skill-access-requests.routes.ts +7 -7
  450. package/src/modules/skills/skills.routes.ts +4 -3
  451. package/src/modules/skills/skills.service.ts +13 -9
  452. package/src/modules/tool-helpers/__tests__/agent-roles-write.test.ts +3 -2
  453. package/src/modules/tool-helpers/__tests__/phase4-tools.test.ts +3 -2
  454. package/src/modules/tool-manuals/__tests__/mcp-json-discovery.test.ts +17 -12
  455. package/src/modules/tool-manuals/__tests__/mcp-server-edit.service.test.ts +2 -1
  456. package/src/modules/tool-manuals/__tests__/pending-tools.service.test.ts +4 -1
  457. package/src/modules/tool-manuals/__tests__/tool-delete.service.test.ts +2 -1
  458. package/src/modules/tool-manuals/__tests__/tool-manuals.archive.route.test.ts +2 -1
  459. package/src/modules/tool-manuals/__tests__/tool-manuals.cli.test.ts +5 -4
  460. package/src/modules/tool-manuals/__tests__/tool-manuals.detail.route.test.ts +2 -1
  461. package/src/modules/tool-manuals/__tests__/tool-manuals.invalid.routes.test.ts +4 -2
  462. package/src/modules/tool-manuals/__tests__/tool-manuals.invalid.test.ts +13 -5
  463. package/src/modules/tool-manuals/__tests__/tool-manuals.mcp-oauth.test.ts +2 -1
  464. package/src/modules/tool-manuals/__tests__/tool-manuals.restart.test.ts +9 -1
  465. package/src/modules/tool-manuals/__tests__/tool-manuals.service.test.ts +3 -2
  466. package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +2 -0
  467. package/src/modules/tool-manuals/mcp-json-discovery.ts +6 -4
  468. package/src/modules/tool-manuals/mcp-server-edit.service.ts +13 -11
  469. package/src/modules/tool-manuals/pending-tools.service.ts +19 -16
  470. package/src/modules/tool-manuals/tool-delete.service.ts +13 -10
  471. package/src/modules/tool-manuals/tool-manuals.routes.ts +10 -8
  472. package/src/modules/tool-manuals/tool-manuals.service.ts +15 -13
  473. package/src/modules/tool-manuals/tool-manuals.tools.ts +7 -6
  474. package/src/modules/workflow/__tests__/apply-failure.test.ts +2 -1
  475. package/src/modules/workflow/__tests__/merge-announces-tree.test.ts +14 -26
  476. package/src/modules/workflow/__tests__/preserve-roles-yaml.test.ts +2 -1
  477. package/src/modules/workflow/__tests__/session-ontology.service.test.ts +3 -2
  478. package/src/modules/workflow/__tests__/workflow.routes.lock-path.test.ts +2 -1
  479. package/src/modules/workflow/__tests__/workflow.service.branch-in-use.test.ts +3 -10
  480. package/src/modules/workflow/__tests__/workflow.service.commitFileWhileLocked.test.ts +2 -1
  481. package/src/modules/workflow/__tests__/workflow.service.deleted-branch-sweep.test.ts +3 -10
  482. package/src/modules/workflow/__tests__/workflow.service.facade.test.ts +28 -27
  483. package/src/modules/workflow/__tests__/workflow.service.folder-proposals.test.ts +2 -1
  484. package/src/modules/workflow/__tests__/workflow.service.platform-restore.test.ts +2 -1
  485. package/src/modules/workflow/__tests__/workflow.service.read-gate.test.ts +3 -2
  486. package/src/modules/workflow/__tests__/workflow.service.releaseLock.test.ts +2 -1
  487. package/src/modules/workflow/__tests__/workflow.service.sync.test.ts +5 -4
  488. package/src/modules/workflow/__tests__/workflow.service.update-from-target.test.ts +2 -1
  489. package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +2 -1
  490. package/src/modules/workflow/agent-tools/workflow.tools.ts +11 -9
  491. package/src/modules/workflow/git/__tests__/git.service.accessGating.test.ts +5 -4
  492. package/src/modules/workflow/git/__tests__/git.service.changedFilesForPr.test.ts +12 -11
  493. package/src/modules/workflow/git/__tests__/git.service.commitChanges.test.ts +9 -8
  494. package/src/modules/workflow/git/__tests__/git.service.commitFile.strayPath.test.ts +8 -7
  495. package/src/modules/workflow/git/__tests__/git.service.commitFile.test.ts +6 -5
  496. package/src/modules/workflow/git/__tests__/git.service.createBranch.test.ts +3 -2
  497. package/src/modules/workflow/git/__tests__/git.service.deleteBranch.test.ts +3 -2
  498. package/src/modules/workflow/git/__tests__/git.service.diffFileAtCommit.test.ts +7 -6
  499. package/src/modules/workflow/git/__tests__/git.service.diffFileBetweenBranches.test.ts +16 -15
  500. package/src/modules/workflow/git/__tests__/git.service.fileContentsAtCommit.test.ts +3 -2
  501. package/src/modules/workflow/git/__tests__/git.service.forkPoint.test.ts +2 -1
  502. package/src/modules/workflow/git/__tests__/git.service.history-guards.test.ts +2 -1
  503. package/src/modules/workflow/git/__tests__/git.service.list-branches.test.ts +10 -9
  504. package/src/modules/workflow/git/__tests__/git.service.listTrackedFiles.test.ts +2 -1
  505. package/src/modules/workflow/git/__tests__/git.service.logForFile.test.ts +6 -5
  506. package/src/modules/workflow/git/__tests__/git.service.mergeChangeRequest.test.ts +9 -8
  507. package/src/modules/workflow/git/__tests__/git.service.pendingChanges.test.ts +2 -1
  508. package/src/modules/workflow/git/__tests__/git.service.postMergePull.test.ts +4 -3
  509. package/src/modules/workflow/git/__tests__/git.service.pull.test.ts +9 -8
  510. package/src/modules/workflow/git/__tests__/git.service.readFileAtRef.test.ts +2 -1
  511. package/src/modules/workflow/git/__tests__/git.service.revertPathsAndPush.test.ts +2 -1
  512. package/src/modules/workflow/git/__tests__/git.service.status.test.ts +4 -3
  513. package/src/modules/workflow/git/__tests__/git.service.syncFromRemote.test.ts +8 -7
  514. package/src/modules/workflow/git/__tests__/node-git-runner.test.ts +41 -3
  515. package/src/modules/workflow/git/git.service.ts +24 -13
  516. package/src/modules/workflow/git/node-git-runner.ts +37 -4
  517. package/src/modules/workflow/review-workflow/review-workflow.service.ts +9 -6
  518. package/src/modules/workflow/session-ontology.service.ts +7 -2
  519. package/src/modules/workflow/workflow.service.ts +31 -24
  520. package/src/modules/workspace/__tests__/file-stat-access.test.ts +3 -2
  521. package/src/modules/workspace/__tests__/git-internals.security.test.ts +10 -9
  522. package/src/modules/workspace/__tests__/session-ontology.gate.test.ts +4 -2
  523. package/src/modules/workspace/__tests__/workspace-paths-inside-the-repo.test.ts +3 -2
  524. package/src/modules/workspace/__tests__/workspace.routes.branch-errors.test.ts +2 -1
  525. package/src/modules/workspace/__tests__/workspace.routes.create-grant.test.ts +2 -1
  526. package/src/modules/workspace/__tests__/workspace.routes.delete.test.ts +2 -1
  527. package/src/modules/workspace/__tests__/workspace.routes.download-implies-read.test.ts +2 -1
  528. package/src/modules/workspace/__tests__/workspace.routes.download.test.ts +2 -1
  529. package/src/modules/workspace/__tests__/workspace.routes.file-writes.test.ts +2 -1
  530. package/src/modules/workspace/__tests__/workspace.routes.folders.test.ts +5 -4
  531. package/src/modules/workspace/__tests__/workspace.routes.move-platform-files.test.ts +2 -1
  532. package/src/modules/workspace/__tests__/workspace.routes.read-gate.test.ts +2 -1
  533. package/src/modules/workspace/__tests__/workspace.service.ensure-remotes-fetched.test.ts +2 -2
  534. package/src/modules/workspace/__tests__/workspace.service.list-cloned.test.ts +6 -5
  535. package/src/modules/workspace/__tests__/workspace.service.move-never-overwrites.test.ts +2 -1
  536. package/src/modules/workspace/__tests__/workspace.service.read-filter.test.ts +2 -1
  537. package/src/modules/workspace/__tests__/workspace.service.test.ts +84 -50
  538. package/src/modules/workspace/__tests__/workspace.service.unknown-branch.test.ts +2 -1
  539. package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +10 -7
  540. package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +4 -3
  541. package/src/modules/workspace/__tests__/workspace.tools.test.ts +9 -8
  542. package/src/modules/workspace/__tests__/write-denial.test.ts +5 -4
  543. package/src/modules/workspace/session-ontology.gate.ts +6 -4
  544. package/src/modules/workspace/startup/__tests__/kb-startup-runner.degraded.test.ts +6 -2
  545. package/src/modules/workspace/startup/__tests__/kb-startup-runner.test.ts +29 -21
  546. package/src/modules/workspace/startup/kb-git.ts +15 -22
  547. package/src/modules/workspace/startup/kb-startup-runner.ts +40 -46
  548. package/src/modules/workspace/startup/steps/__tests__/steps.test.ts +104 -98
  549. package/src/modules/workspace/startup/steps/groups-to-plugins.step.ts +24 -16
  550. package/src/modules/workspace/startup/steps/personal-spaces.step.ts +14 -5
  551. package/src/modules/workspace/startup/steps/plugin-display-names.step.ts +13 -5
  552. package/src/modules/workspace/startup/steps/plugin-manifests.step.ts +14 -5
  553. package/src/modules/workspace/startup/steps/seed-tree.ts +11 -9
  554. package/src/modules/workspace/startup/steps/template-files.step.ts +43 -34
  555. package/src/modules/workspace/startup/steps/template-source.ts +8 -5
  556. package/src/modules/workspace/workspace.routes.ts +8 -7
  557. package/src/modules/workspace/workspace.service.ts +30 -27
  558. package/src/modules/workspace/workspace.tools.ts +21 -20
  559. package/src/modules/workspace/write-denial.ts +7 -5
  560. package/src/shared/__tests__/kb-layout.plugin.test.ts +19 -16
  561. package/src/shared/git.contract.ts +70 -8
  562. package/src/shared/kb-context.ts +130 -0
  563. package/src/shared/kb-layout.test.ts +37 -27
  564. package/src/shared/kb-layout.ts +4 -3
  565. package/src/shared/pending-proposals.ts +7 -4
  566. package/src/shared/redact-secret.ts +5 -5
  567. package/src/tenancy/__tests__/static-tenant-source.test.ts +177 -0
  568. package/src/tenancy/__tests__/tenant-host.test.ts +372 -0
  569. package/src/tenancy/__tests__/tenant-runtime.test.ts +221 -0
  570. package/src/tenancy/__tests__/tenant-secrets.test.ts +35 -0
  571. package/src/tenancy/index.ts +35 -0
  572. package/src/tenancy/static-tenant-source.ts +296 -0
  573. package/src/tenancy/tenant-host.ts +261 -0
  574. package/src/tenancy/tenant-runtime.ts +208 -0
  575. package/src/tenancy/tenant-secrets.ts +41 -0
  576. package/src/tenancy/tenant-source.contract.ts +59 -0
@@ -20,6 +20,7 @@ import {
20
20
  validateKbLayout,
21
21
  validateKbRootName,
22
22
  normalizeSkillRoot,
23
+ type KbLayout,
23
24
  } from '@bevel-software/platform-shared';
24
25
 
25
26
  /**
@@ -29,6 +30,10 @@ import {
29
30
  */
30
31
  afterEach(() => configureKbLayout({ ...DEFAULT_KB_LAYOUT }));
31
32
 
33
+ /** The helpers under the browser's configured layout — the shape these cases were written against. */
34
+ const validateGuideName = (name: string, roots: KbLayout = DEFAULT_KB_LAYOUT) => validateAgentsFileName(name, roots);
35
+ const platformFile = (path: string) => isPlatformFile(path, currentKbLayout());
36
+
32
37
  describe('KB layout — validation', () => {
33
38
  test('accepts the defaults and any three distinct plain folder names', () => {
34
39
  expect(validateKbLayout({ ...DEFAULT_KB_LAYOUT })).toBeNull();
@@ -100,12 +105,12 @@ describe('KB layout — configuration', () => {
100
105
 
101
106
  test('the derived sets follow the configured names rather than snapshotting the defaults', () => {
102
107
  configureKbLayout({ knowledgeBaseDir: 'docs', skillsDir: 'skills', pluginsDir: 'plugins' });
103
- expect(ontologyRoots()).toEqual(['docs', 'Data']);
104
- expect(reservedRootDirNames().has('plugins')).toBe(true);
105
- expect(reservedRootDirNames().has('Plugins')).toBe(false);
106
- // Path rules read the live name too.
107
- expect(pluginOfPath('plugins/GTM/skills/x/SKILL.md')).toBe('GTM');
108
- expect(pluginOfPath('Plugins/GTM/skills/x/SKILL.md')).toBeNull();
108
+ expect(ontologyRoots(currentKbLayout())).toEqual(['docs', 'Data']);
109
+ expect(reservedRootDirNames(currentKbLayout()).has('plugins')).toBe(true);
110
+ expect(reservedRootDirNames(currentKbLayout()).has('Plugins')).toBe(false);
111
+ // Path rules read the configured name too.
112
+ expect(pluginOfPath('plugins/GTM/skills/x/SKILL.md', currentKbLayout())).toBe('GTM');
113
+ expect(pluginOfPath('Plugins/GTM/skills/x/SKILL.md', currentKbLayout())).toBeNull();
109
114
  });
110
115
 
111
116
  test('throws on an invalid layout and leaves the current one untouched', () => {
@@ -137,7 +142,7 @@ describe('KB layout — the agent guide\'s file name', () => {
137
142
  });
138
143
 
139
144
  test('accepts a plain markdown name and applies it to the live binding', () => {
140
- expect(validateAgentsFileName('HEXIS.md')).toBeNull();
145
+ expect(validateGuideName('HEXIS.md')).toBeNull();
141
146
  configureKbLayout({ ...DEFAULT_KB_LAYOUT, agentsFile: 'HEXIS.md' });
142
147
  expect(AGENTS_FILE).toBe('HEXIS.md');
143
148
  expect(currentKbLayout().agentsFile).toBe('HEXIS.md');
@@ -145,30 +150,30 @@ describe('KB layout — the agent guide\'s file name', () => {
145
150
 
146
151
  test('refuses every shape that is not one markdown file name of its own', () => {
147
152
  // A folder path: the guide is read from the repository root and nowhere else.
148
- expect(validateAgentsFileName('guides/HEXIS.md')).toMatch(/single file name/);
149
- expect(validateAgentsFileName('guides\\HEXIS.md')).toMatch(/single file name/);
153
+ expect(validateGuideName('guides/HEXIS.md')).toMatch(/single file name/);
154
+ expect(validateGuideName('guides\\HEXIS.md')).toMatch(/single file name/);
150
155
  // Not markdown: the per-file access rules apply to `.md` alone.
151
- expect(validateAgentsFileName('HEXIS.txt')).toMatch(/end in \.md/);
156
+ expect(validateGuideName('HEXIS.txt')).toMatch(/end in \.md/);
152
157
  // Nothing at all.
153
- expect(validateAgentsFileName('')).toMatch(/required/);
154
- expect(validateAgentsFileName(' ')).toMatch(/required/);
158
+ expect(validateGuideName('')).toMatch(/required/);
159
+ expect(validateGuideName(' ')).toMatch(/required/);
155
160
  // A dot-file every scanner skips — including the one that draws the tree.
156
- expect(validateAgentsFileName('.hidden.md')).toMatch(/start with a dot/);
161
+ expect(validateGuideName('.hidden.md')).toMatch(/start with a dot/);
157
162
  // The guide's own pre-rename name stays legacy content.
158
- expect(validateAgentsFileName('CLAUDE.md')).toMatch(/pre-rename name/);
159
- expect(validateAgentsFileName('claude.md')).toMatch(/pre-rename name/);
163
+ expect(validateGuideName('CLAUDE.md')).toMatch(/pre-rename name/);
164
+ expect(validateGuideName('claude.md')).toMatch(/pre-rename name/);
160
165
  // The other platform files: two platform roles on one path.
161
- expect(validateAgentsFileName('access.md')).toMatch(/platform file name/);
162
- expect(validateAgentsFileName('roles.yaml')).toMatch(/platform file name/);
163
- expect(validateAgentsFileName('.bevelignore')).toMatch(/platform file name/);
164
- expect(validateAgentsFileName('mcp-description.md')).toMatch(/platform file name/);
166
+ expect(validateGuideName('access.md')).toMatch(/platform file name/);
167
+ expect(validateGuideName('roles.yaml')).toMatch(/platform file name/);
168
+ expect(validateGuideName('.bevelignore')).toMatch(/platform file name/);
169
+ expect(validateGuideName('mcp-description.md')).toMatch(/platform file name/);
165
170
  // The rule every path component passes.
166
- expect(validateAgentsFileName('CON.md')).not.toBeNull();
167
- expect(validateAgentsFileName('a:b.md')).not.toBeNull();
171
+ expect(validateGuideName('CON.md')).not.toBeNull();
172
+ expect(validateGuideName('a:b.md')).not.toBeNull();
168
173
  });
169
174
 
170
175
  test('refuses the name of a root folder, whichever of the two the save names', () => {
171
- expect(validateAgentsFileName('Plugins.md', { ...DEFAULT_KB_LAYOUT, pluginsDir: 'Plugins.md' }))
176
+ expect(validateGuideName('Plugins.md', { ...DEFAULT_KB_LAYOUT, pluginsDir: 'Plugins.md' }))
172
177
  .toMatch(/already the plugins folder/);
173
178
  // Case-insensitively, like the folders are to each other: one entry on a
174
179
  // case-insensitive disk.
@@ -197,16 +202,16 @@ describe('KB layout — the agent guide\'s file name', () => {
197
202
  '.bevelignore',
198
203
  'AGENTS.md',
199
204
  ]);
200
- expect(isPlatformFile('AGENTS.md')).toBe(true);
205
+ expect(platformFile('AGENTS.md')).toBe(true);
201
206
 
202
207
  configureKbLayout({ ...DEFAULT_KB_LAYOUT, agentsFile: 'HEXIS.md' });
203
- expect(platformFileNames()).toEqual(['access.md', 'roles.yaml', '.bevelignore', 'HEXIS.md']);
208
+ expect(platformFileNames(currentKbLayout())).toEqual(['access.md', 'roles.yaml', '.bevelignore', 'HEXIS.md']);
204
209
  // The guide the platform writes is immovable and undeletable…
205
- expect(isPlatformFile('HEXIS.md')).toBe(true);
210
+ expect(platformFile('HEXIS.md')).toBe(true);
206
211
  // …and the customer's own AGENTS.md is a page like any other.
207
- expect(isPlatformFile('AGENTS.md')).toBe(false);
212
+ expect(platformFile('AGENTS.md')).toBe(false);
208
213
  // Still root-only, as `roles.yaml` is: a nested copy is content.
209
- expect(isPlatformFile('KnowledgeBase/HEXIS.md')).toBe(false);
214
+ expect(platformFile('KnowledgeBase/HEXIS.md')).toBe(false);
210
215
  });
211
216
 
212
217
  test('the pointer sentence is one sentence, naming the guide twice, from one place', () => {
@@ -215,7 +220,7 @@ describe('KB layout — the agent guide\'s file name', () => {
215
220
  "it is the platform's guide to its layout, files and rules.",
216
221
  );
217
222
  configureKbLayout({ ...DEFAULT_KB_LAYOUT, agentsFile: 'HEXIS.md' });
218
- expect(agentsFilePointerSentence()).toContain('HEXIS.md');
223
+ expect(agentsFilePointerSentence(currentKbLayout().agentsFile)).toContain('HEXIS.md');
219
224
  });
220
225
 
221
226
  /**
@@ -226,7 +231,7 @@ describe('KB layout — the agent guide\'s file name', () => {
226
231
  */
227
232
  test('the pointer sentence links correctly for a name full of markdown punctuation', () => {
228
233
  const name = 'Our [Agent] Guide (v2).md';
229
- expect(validateAgentsFileName(name)).toBeNull();
234
+ expect(validateGuideName(name)).toBeNull();
230
235
  const sentence = agentsFilePointerSentence(name);
231
236
  // The label cannot end early: the brackets in it are escaped…
232
237
  expect(sentence).toContain('[Our \\[Agent\\] Guide (v2).md]');
@@ -240,7 +245,7 @@ describe('KB layout — the agent guide\'s file name', () => {
240
245
  test('the pointer sentence encodes a name that would otherwise open a URL fragment', () => {
241
246
  // `#` is legal in a filename and opens a fragment in a URL: `./#2 Guide.md`
242
247
  // links to the customer's OWN file with a fragment, not to the guide.
243
- expect(validateAgentsFileName('#2 Guide.md')).toBeNull();
248
+ expect(validateGuideName('#2 Guide.md')).toBeNull();
244
249
  expect(agentsFilePointerSentence('#2 Guide.md')).toContain('(./%232%20Guide.md)');
245
250
  // `%` is legal too, and an unencoded one is a malformed escape.
246
251
  expect(agentsFilePointerSentence('100%.md')).toContain('(./100%25.md)');
@@ -4,6 +4,7 @@ import { FileChangeNotifier } from '../../modules/kb-fs/file-change-notifier.js'
4
4
  import { WorkflowEventBus } from '../../modules/workflow/event-bus.js';
5
5
  import { registerCatalogCacheInvalidation } from '../catalog-cache-invalidation.js';
6
6
  import { workspaceIdForBranch } from '../../shared/workspace-id.js';
7
+ import { testKbContext } from '../../__tests__/kb-context.js';
7
8
 
8
9
  const KB_DIR = 'knowledge-base';
9
10
 
@@ -25,7 +26,7 @@ function setup() {
25
26
  const off = registerCatalogCacheInvalidation({
26
27
  eventBus,
27
28
  fileChangeNotifier,
28
- kbDirName: KB_DIR,
29
+ kb: testKbContext({ kbDirName: KB_DIR }),
29
30
  catalogs,
30
31
  accessControl,
31
32
  });
@@ -1,5 +1,6 @@
1
1
  import { describe, it, expect } from 'vitest';
2
- import { createShutdown, holdCommitWorkerLease, withStartupTask, type LeasedWorker } from '../lifecycle.js';
2
+ import { createShutdown, holdCommitWorkerLease, stopCore, withStartupTask, type LeasedWorker } from '../lifecycle.js';
3
+ import { BevelSecretsVariableLoader, registerBevelSecretsVariableLoader } from '../../modules/secrets-vault/secrets-variable-loader.js';
3
4
  import type { AdvisoryLease } from '../../modules/database/advisory-lock.js';
4
5
 
5
6
  /** A lease the suite scripts: what each `tryAcquire` answers, and a way to lose it. */
@@ -367,3 +368,79 @@ describe('createShutdown', () => {
367
368
  expect(d.order.filter((step) => step === 'db.end')).toHaveLength(1);
368
369
  });
369
370
  });
371
+
372
+ describe('stopCore', () => {
373
+ function graph() {
374
+ const order: string[] = [];
375
+ return {
376
+ order,
377
+ core: {
378
+ commitWorker: {
379
+ async stop() {
380
+ order.push('commitWorker.stop');
381
+ },
382
+ },
383
+ backgroundJobs: {
384
+ stopSweeping() {
385
+ order.push('backgroundJobs.stopSweeping');
386
+ },
387
+ async drain() {
388
+ order.push('backgroundJobs.drain');
389
+ },
390
+ },
391
+ startupRetry: {
392
+ stop() {
393
+ order.push('startupRetry.stop');
394
+ },
395
+ },
396
+ db: {
397
+ $client: {
398
+ async end() {
399
+ order.push('db.end');
400
+ },
401
+ },
402
+ },
403
+ secretsScope: 'acme/t_acme',
404
+ log: () => undefined,
405
+ },
406
+ };
407
+ }
408
+
409
+ it('stops a graph without a server: sweeps and the retry first, the worker, then the pool', async () => {
410
+ const g = graph();
411
+ await stopCore(g.core as never);
412
+ expect(g.order).toEqual([
413
+ 'backgroundJobs.stopSweeping',
414
+ 'startupRetry.stop',
415
+ 'backgroundJobs.drain',
416
+ 'commitWorker.stop',
417
+ 'db.end',
418
+ ]);
419
+ });
420
+
421
+ it('forgets the graph\'s secrets scope, so a descriptor that outlives it resolves nothing', async () => {
422
+ const g = graph();
423
+ registerBevelSecretsVariableLoader(
424
+ { resolve: async () => 'sk-live' } as never,
425
+ g.core.secretsScope,
426
+ );
427
+ const loader = new BevelSecretsVariableLoader('user-1', g.core.secretsScope);
428
+ expect(await loader.get('weather_KEY')).toBe('sk-live');
429
+ await stopCore(g.core as never);
430
+ expect(await loader.get('weather_KEY')).toBeNull();
431
+ });
432
+
433
+ it('stops a graph that never left a retry asking and never registered a scope', async () => {
434
+ const g = graph();
435
+ const core = { ...g.core, startupRetry: null, secretsScope: undefined };
436
+ await stopCore(core as never);
437
+ expect(g.order).toEqual(['backgroundJobs.stopSweeping', 'backgroundJobs.drain', 'commitWorker.stop', 'db.end']);
438
+ });
439
+
440
+ it('does not wait past the budget for a worker that never stops, and still ends the pool', async () => {
441
+ const g = graph();
442
+ const core = { ...g.core, commitWorker: { stop: () => new Promise<void>(() => undefined) } };
443
+ await stopCore(core as never, { deadlineMs: 50 });
444
+ expect(g.order).toEqual(['backgroundJobs.stopSweeping', 'startupRetry.stop', 'backgroundJobs.drain', 'db.end']);
445
+ });
446
+ });
@@ -1,9 +1,13 @@
1
1
  import { describe, expect, it } from 'vitest';
2
2
  import { DEFAULT_BRANCH } from '@bevel-software/platform-shared';
3
3
  import { publicConfig } from '../public-config.js';
4
+ import { testKbContext } from '../../__tests__/kb-context.js';
4
5
 
5
6
  describe('GET /api/config payload', () => {
6
- const body = publicConfig({ marketplaceGitUrl: 'https://kb.acme.com/git/marketplace.git', mcpUrl: 'https://kb.acme.com/api/mcp' });
7
+ const body = publicConfig(testKbContext(), {
8
+ marketplaceGitUrl: 'https://kb.acme.com/git/marketplace.git',
9
+ mcpUrl: 'https://kb.acme.com/api/mcp',
10
+ });
7
11
 
8
12
  it('advertises the agent-instructions capability, which the local bridge keys on', () => {
9
13
  expect(body.agentInstructions).toBe(true);
@@ -1,7 +1,6 @@
1
- import { DEFAULT_BRANCH, PLUGINS_DIR, SKILLS_DIR } from '@bevel-software/platform-shared';
2
1
  import type { FileChangeNotifier } from '../modules/kb-fs/file-change-notifier.js';
3
2
  import type { WorkflowEventBus } from '../modules/workflow/event-bus.js';
4
- import { workspaceIdForBranch } from '../shared/workspace-id.js';
3
+ import type { KbContext } from '../shared/kb-context.js';
5
4
 
6
5
  /**
7
6
  * A catalog that scans the DEFAULT branch's working tree and caches the result
@@ -26,8 +25,12 @@ export interface InvalidatableCatalog {
26
25
  export function registerCatalogCacheInvalidation(deps: {
27
26
  eventBus: WorkflowEventBus;
28
27
  fileChangeNotifier: FileChangeNotifier;
29
- /** The KB folder inside the workspace — `paths` are workspace-relative. */
30
- kbDirName: string;
28
+ /**
29
+ * The KB folder inside the workspace (`paths` are workspace-relative), the
30
+ * released branch, and the roots the catalogs read — read per event, never
31
+ * captured: a deployment may rename the roots from the setup screen.
32
+ */
33
+ kb: Pick<KbContext, 'kbDirName' | 'defaultBranch' | 'defaultWorkspaceId' | 'layout'>;
31
34
  catalogs: InvalidatableCatalog[];
32
35
  /**
33
36
  * The read gate every one of those catalogs is FILTERED through, dropped on
@@ -44,13 +47,13 @@ export function registerCatalogCacheInvalidation(deps: {
44
47
  */
45
48
  accessControl: { invalidate(workspaceId: string): void };
46
49
  }): () => void {
47
- const { eventBus, fileChangeNotifier, kbDirName, catalogs, accessControl } = deps;
50
+ const { eventBus, fileChangeNotifier, kb, catalogs, accessControl } = deps;
48
51
  const invalidateAll = () => {
49
52
  for (const c of catalogs) c.invalidate();
50
53
  // Scoped to the branch the catalogs read, and no wider: a drop here costs
51
54
  // the next reader one model load, so it must not reach workspaces this
52
55
  // event says nothing about.
53
- accessControl.invalidate(workspaceIdForBranch(DEFAULT_BRANCH));
56
+ accessControl.invalidate(kb.defaultWorkspaceId());
54
57
  };
55
58
 
56
59
  // Subscriber A — COMMIT-time freshness: a committed change drops the affected
@@ -61,17 +64,19 @@ export function registerCatalogCacheInvalidation(deps: {
61
64
  // service it belongs to — the caches are independent, so the split preserves
62
65
  // behavior.)
63
66
  const offFiles = fileChangeNotifier.onFilesChanged(({ branch, paths }) => {
64
- if (branch !== DEFAULT_BRANCH) return;
67
+ if (branch !== kb.defaultBranch) return;
65
68
  // Skills, tools, the plugin index and the link index all read `Plugins/`
66
69
  // or `Skills/`, so one touch check drives every cache. An access grant
67
70
  // lands as a default-branch change to `Plugins/<plugin>/access.md` or a
68
71
  // skill folder's `access.md`, so this is also what makes a newly-granted
69
72
  // plugin or link unlock within one round-trip instead of one TTL. Both
70
- // names are live bindings (a deployment may rename the roots), hence read
71
- // per event rather than captured.
73
+ // names are read per event rather than captured: a deployment may rename
74
+ // the roots.
75
+ const { kbDirName, layout } = kb;
72
76
  if (
73
77
  paths.some(
74
- (p) => p.startsWith(`${kbDirName}/${PLUGINS_DIR}/`) || p.startsWith(`${kbDirName}/${SKILLS_DIR}/`),
78
+ (p) =>
79
+ p.startsWith(`${kbDirName}/${layout.pluginsDir}/`) || p.startsWith(`${kbDirName}/${layout.skillsDir}/`),
75
80
  )
76
81
  ) {
77
82
  invalidateAll();
@@ -100,7 +105,7 @@ export function registerCatalogCacheInvalidation(deps: {
100
105
  if (event.kind !== 'fs-tree-changed' && event.kind !== 'git-sync-recovered') return;
101
106
  // Both events declare `branch`, so no `in` guard: the kind check above has
102
107
  // already narrowed the union to the two that carry one.
103
- if (event.branch !== DEFAULT_BRANCH) return;
108
+ if (event.branch !== kb.defaultBranch) return;
104
109
  invalidateAll();
105
110
  });
106
111
 
@@ -6,6 +6,7 @@ import type {
6
6
  import type { ILlmUsageMeter } from '../modules/tool-auth/llm-usage-meter.js';
7
7
  import type { AuthProviderPlugin } from '../modules/auth/auth.routes.js';
8
8
  import type { IErasureParticipant } from '../modules/auth/account-erasure.service.js';
9
+ import type { IAccountAdmission } from '../modules/auth/account-admission.js';
9
10
  import type { OnServerStart } from '../modules/workspace/startup/on-server-start.js';
10
11
 
11
12
  /**
@@ -98,6 +99,24 @@ export interface CorePorts {
98
99
  * contract each step signs up to). Core default: `[]`.
99
100
  */
100
101
  kbStartupSteps?: readonly OnServerStart[];
102
+ /**
103
+ * Mirror this composition's branch model and knowledge-base layout onto the
104
+ * shared package's PROCESS-WIDE live bindings (`DEFAULT_BRANCH`,
105
+ * `PLUGINS_DIR`, …), for an overlay that still reads them. Core itself
106
+ * reads only `CoreServices.kb`. Default true, so an overlay behaves as it
107
+ * did; a host that serves several knowledge bases in one process passes
108
+ * false, since there is no single value to put there.
109
+ */
110
+ mirrorSharedBindings?: boolean;
111
+ /**
112
+ * Whether a NEW account may be provisioned, asked before the row is
113
+ * inserted on every path that creates one (a first SSO sign-in, an admin
114
+ * creating an account, the owner's bootstrap sign-in, an embed identity).
115
+ * Core default: everyone is admitted. A host that sells seats answers
116
+ * from its plan; a refusal carries the port's own words to the person or
117
+ * admin who asked. See `modules/auth/account-admission.ts`.
118
+ */
119
+ accountAdmission?: IAccountAdmission;
101
120
  }
102
121
 
103
122
  /**
@@ -1,16 +1,11 @@
1
1
  import express from 'express';
2
- import { logger } from '../shared/logging.js';
3
-
4
- const startupLog = logger('kb-startup');
5
- const crLog = logger('cr');
6
2
  import cors from 'cors';
7
3
  import path from 'node:path';
8
4
  import type { Router, RequestHandler } from 'express';
9
5
  import { createAuthRoutes } from '../modules/auth/auth.routes.js';
10
6
  import { createWorkspaceRoutes } from '../modules/workspace/workspace.routes.js';
11
7
  import { createGitInternalsRouteGuard } from '../modules/workspace/git-internals.middleware.js';
12
- import { noteBesideCheckout } from '../modules/workspace/startup/beside-checkout.js';
13
- import { printable } from '../shared/printable.js';
8
+ import { startCore } from './lifecycle.js';
14
9
  import { createDiffRoutes } from '../modules/diff/diff.routes.js';
15
10
  import { createWorkflowRoutes } from '../modules/workflow/workflow.routes.js';
16
11
  import { createEventsRoutes } from '../modules/workflow/events.routes.js';
@@ -73,7 +68,6 @@ import type { AuthUser } from '@bevel-software/platform-shared';
73
68
  import { GIT_SHA } from '../version.js';
74
69
  import { publicConfig } from './public-config.js';
75
70
  import { createReadiness } from './readiness.js';
76
- import { KbRemoteUnreachableError } from '../modules/workspace/startup/kb-startup-runner.js';
77
71
  import { createAgentInstructionsRoutes } from '../modules/agent-instructions/index.js';
78
72
  import type { CoreServices } from './create-core-services.js';
79
73
 
@@ -143,7 +137,11 @@ export interface ServerExtensions {
143
137
  export async function createCoreServer(
144
138
  core: CoreServices,
145
139
  ext: ServerExtensions = {},
146
- opts: { staticDir?: string } = {},
140
+ opts: {
141
+ staticDir?: string;
142
+ /** Run {@link startCore} at the usual point of the mount order. Default true. */
143
+ boot?: boolean;
144
+ } = {},
147
145
  ): Promise<ExpressApp> {
148
146
  const app = express();
149
147
 
@@ -277,7 +275,7 @@ export async function createCoreServer(
277
275
  * on purpose; see `publicConfig` for what it discloses and why.
278
276
  */
279
277
  app.get('/api/config', (_req, res) => {
280
- res.json(publicConfig({ marketplaceGitUrl: marketplaceGitUrl.toString(), mcpUrl: mcpResourceUrl.toString() }));
278
+ res.json(publicConfig(core.kb, { marketplaceGitUrl: marketplaceGitUrl.toString(), mcpUrl: mcpResourceUrl.toString() }));
281
279
  });
282
280
 
283
281
  // The per-user marketplace as a git remote. Outside `/api` and ahead of
@@ -310,93 +308,12 @@ export async function createCoreServer(
310
308
  }),
311
309
  );
312
310
 
313
- // Overlay boot-time side effects (startup reconciles, periodic sweeps).
314
- await ext.onBoot?.(core);
315
-
316
- // What is already sitting beside a checkout, named once per boot and touched
317
- // by nothing. Outside the KB startup phase below on purpose: that phase is
318
- // gated on the branch model and the repository URL, and a deployment whose
319
- // setup never finished — or whose remote is down — is exactly one whose
320
- // strays would otherwise go unmentioned. A diagnostic never stops a boot, so
321
- // an unreadable workspaces root is logged and the boot carries on.
322
- try {
323
- await noteBesideCheckout(core.config.workspacesRoot, core.kbDirName);
324
- } catch (err) {
325
- // `printable`, because the message quotes a path off the disk (an ENOENT
326
- // or EACCES names the file it failed on) and a name carrying a control
327
- // character would forge a second line of the operator's log.
328
- startupLog.warn('could not look for content beside the checkouts:', {
329
- detail: printable(err instanceof Error ? err.message : String(err)),
330
- });
331
- }
332
-
333
- // The KB startup phase — AFTER the distribution's onBoot, because a FATAL
334
- // template finding raised there must stop the boot before anything seeds
335
- // from that template; the runner then brings every branch up to this build
336
- // before any route can serve KB content. Throws to stop the boot (the
337
- // container's restart policy is the retry) — see kb-startup-runner.ts.
338
- //
339
- // Runs in the booting process whether or not it holds the commit-worker
340
- // lease, so on a redeploy it overlaps the outgoing holder's commits for the
341
- // seconds it takes — the documented window at `holdCommitWorkerLease`.
342
- try {
343
- await core.kbStartupRunner.runAll();
344
- } catch (err) {
345
- // The one failure a boot survives: the remote cannot be reached. That
346
- // says nothing about the knowledge base — what we would write is not
347
- // known to be wrong, we cannot get there — so refusing to boot only took
348
- // away the login and setup screens an operator needs to fix it (a
349
- // rotated token, say). The deployment comes up GATED: the setup routes
350
- // read the runner's standing failure and keep the app shut, the setup
351
- // screen shows why, saving it retries, and the runner keeps trying on
352
- // its own. Every other failure still stops the boot, because it means
353
- // the template or a step would write something wrong.
354
- if (!(err instanceof KbRemoteUnreachableError)) throw err;
355
- startupLog.error('booting UNMAINTAINED and gated — the knowledge-base remote could not be reached:', {
356
- detail: err.message,
357
- });
358
- core.kbStartupRunner.retryUntilMaintained();
359
- }
360
-
361
- // Close change requests whose source branch has been deleted. SEQUENCED
362
- // AFTER the startup phase above, for two reasons: the sweep's fresh fetch
363
- // lazily bootstraps and fetches the same default-branch clone the runner
364
- // maintains (kicking it off earlier races the runner's clone/fetch of that
365
- // very directory), and on a brand-new deployment it would run before the
366
- // empty remote is seeded, fail its clone, swallow the error, and leave
367
- // deleted-branch CRs open for the whole process. Still not awaited from
368
- // here on: a slow or unreachable remote must not hold up the server —
369
- // nothing downstream depends on the result, and the requests it closes
370
- // have been unusable since the branch went away, so landing a few seconds
371
- // into uptime is soon enough. Errors are swallowed inside the sweep, which
372
- // fails safe by closing nothing.
373
- void core.workflowService
374
- .closeChangeRequestsWithDeletedBranches()
375
- .then((n) => {
376
- if (n > 0) {
377
- crLog.info(`closed ${n} change request${n === 1 ? '' : 's'} with a deleted branch`);
378
- }
379
- })
380
- .catch((err) => crLog.warn('deleted-branch sweep failed:', { err }));
381
-
382
- // Recorded join requests that are still owed, resumed — now, and then on a
383
- // timer. SEQUENCED AFTER the startup phase for the same reason as the sweep
384
- // above: the work needs the default-branch clone the runner maintains and
385
- // the plugin catalog read from it, and a sweep that ran first would refuse
386
- // every row for a knowledge base that simply was not ready — telling people
387
- // their request could not be sent when nothing had gone wrong with it.
388
- //
389
- // ON A TIMER rather than at boot alone, because boot cannot cover the
390
- // redeploy: this process sweeps while the outgoing one still holds a
391
- // record, skips it (correctly — two servers must not do git on one branch),
392
- // and the outgoing process then exits mid-work. Nothing else would look at
393
- // that row again. The requester cannot prompt it either: a pending record
394
- // shows them the "Requested" card, not a button.
395
- //
396
- // Not awaited, and nothing to report here but the failure to read the table
397
- // at all: a first request from a person is a full clone, nothing else at
398
- // boot depends on it, and each row records its own outcome.
399
- core.pluginJoinRequestJobs.startSweeping();
311
+ // The graph's boot side effects — the distribution's onBoot, the
312
+ // knowledge-base startup phase, the sweeps — live in `startCore` so a host
313
+ // that activates a graph on demand can run and later undo them. Here, at
314
+ // this point in the mount order, for a single-tenant deployment; a caller
315
+ // that has already started the graph (or will) passes `boot: false`.
316
+ if (opts.boot ?? true) await startCore(core, ext);
400
317
 
401
318
  // Auth routes (unprotected — login endpoint must be accessible)
402
319
  app.use(
@@ -468,6 +385,7 @@ export async function createCoreServer(
468
385
  stateSecret: core.config.jwtSecret,
469
386
  publicBackendUrl: core.config.publicBackendUrl,
470
387
  publicFrontendUrl: core.config.publicFrontendUrl,
388
+ kb: core.kb,
471
389
  };
472
390
  app.use('/api', createSecretsVaultPublicRoutes(secretsVaultRoutesDeps));
473
391
 
@@ -508,16 +426,16 @@ export async function createCoreServer(
508
426
  const sessionOntologyGate = {
509
427
  service: core.sessionOntologyService,
510
428
  enabled: core.config.ontologySessionBlock,
511
- kbDirName: core.kbDirName,
429
+ kb: core.kb,
512
430
  recoveryBotEmail: RECOVERY_BOT_EMAIL,
513
431
  hooks: core.workflowService.hooks,
514
432
  };
515
433
  // A skill's `allowed-tools`, checked against what the caller can see — on
516
434
  // every save surface (agent write tools, the app's PUT /file) and on
517
435
  // `get_skill`. Warnings only; it never refuses a save.
518
- const allowedToolsChecker = new AllowedToolsChecker(core.toolRegistry, core.toolManualService, core.kbDirName);
519
- registerWorkflowTools(core.toolRegistry, toolsRouter, ta, th, core.kbDirName);
520
- registerWorkspaceTools(core.toolRegistry, toolsRouter, ta, th, core.spillStore, core.docExtractService, core.accessControl, core.kbDirName, sessionOntologyGate, core.routineWritePolicy, core.sessionSink, allowedToolsChecker, core.changeGate);
436
+ const allowedToolsChecker = new AllowedToolsChecker(core.toolRegistry, core.toolManualService, core.kb);
437
+ registerWorkflowTools(core.toolRegistry, toolsRouter, ta, th, core.kb);
438
+ registerWorkspaceTools(core.toolRegistry, toolsRouter, ta, th, core.spillStore, core.docExtractService, core.accessControl, core.kb, sessionOntologyGate, core.routineWritePolicy, core.sessionSink, allowedToolsChecker, core.changeGate);
521
439
  registerSkillsTools(core.toolRegistry, toolsRouter, ta, th, core.skillService, allowedToolsChecker);
522
440
  // Definitions only: the endpoints they describe are the app's own plugin
523
441
  // creation routes, mounted below behind the key-or-session gate.
@@ -527,6 +445,7 @@ export async function createCoreServer(
527
445
  // The vault satisfies the module's local VariableStatusPort — `list_tool_setup`
528
446
  // reports configuration booleans only; secret values never ride through tools.
529
447
  variableStatus: core.secretsVaultService,
448
+ kb: core.kb,
530
449
  });
531
450
  // Overlay tool registrations (defs + module-hosted endpoints).
532
451
  ext.tools?.({
@@ -552,7 +471,7 @@ export async function createCoreServer(
552
471
  {
553
472
  workspaceService: core.workspaceService,
554
473
  accessControl: core.accessControl,
555
- kbDirName: core.kbDirName,
474
+ kb: core.kb,
556
475
  disk: core.disk,
557
476
  pluginIndex: core.pluginIndexService,
558
477
  },
@@ -631,7 +550,7 @@ export async function createCoreServer(
631
550
  core.workflowService,
632
551
  core.eventBus,
633
552
  core.accessControl,
634
- core.kbDirName,
553
+ core.kb,
635
554
  core.creatorAccess,
636
555
  core.adminAccess,
637
556
  core.disk,
@@ -669,13 +588,13 @@ export async function createCoreServer(
669
588
  core.workflowService,
670
589
  core.eventBus,
671
590
  core.db,
672
- core.kbDirName,
591
+ core.kb,
673
592
  [core.config.adminEmail],
674
593
  ));
675
594
  app.use(
676
595
  '/api',
677
596
  core.authMiddleware,
678
- createSkillsRoutes(core.skillService, core.pendingSkillsService, core.pluginLinkIndex, core.accessControl, allowedToolsChecker),
597
+ createSkillsRoutes(core.skillService, core.kb, core.pendingSkillsService, core.pluginLinkIndex, core.accessControl, allowedToolsChecker),
679
598
  );
680
599
  // Asking for write on a shared skill — the join-request machinery pointed
681
600
  // at a skill folder. Same JWT gate, same fail-closed shape.
@@ -688,7 +607,7 @@ export async function createCoreServer(
688
607
  workflow: core.workflowService,
689
608
  workspaceService: core.workspaceService,
690
609
  joinRequests: core.joinRequestsService,
691
- kbDirName: core.kbDirName,
610
+ kb: core.kb,
692
611
  resolveUser: async (req) =>
693
612
  req.userId ? ((await core.authService.getUserById(req.userId)) ?? null) : null,
694
613
  }),
@@ -707,6 +626,7 @@ export async function createCoreServer(
707
626
  core.pluginJoinRequestJobs,
708
627
  core.pluginProvisionService,
709
628
  async (req) => (req.userId ? ((await core.authService.getUserById(req.userId)) ?? null) : null),
629
+ core.kb,
710
630
  core.pluginLinksService,
711
631
  core.pluginRenameService,
712
632
  ));
@@ -716,7 +636,7 @@ export async function createCoreServer(
716
636
  app.use(
717
637
  '/api',
718
638
  core.authMiddleware,
719
- createTeamsRoutes(core.accessControl, core.pluginIndexService, core.skillService, core.toolManualService),
639
+ createTeamsRoutes(core.accessControl, core.pluginIndexService, core.skillService, core.toolManualService, core.kb),
720
640
  );
721
641
  // Admin-status resolver (CORE — see the note in admin-access.routes.ts;
722
642
  // the full admin router is an enterprise `ext.authed` extension).
@@ -768,6 +688,7 @@ export async function createCoreServer(
768
688
  core.settings,
769
689
  core.adminAccess,
770
690
  core.kbStartupRunner,
691
+ core.kb,
771
692
  {
772
693
  // Same address family as the MCP endpoint above, userinfo stripped for
773
694
  // the same reason: this string is handed to admins to paste elsewhere.