@bevel-software/platform-core-backend 0.20.0 → 0.22.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 (666) 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 +55 -107
  11. package/dist/core/create-core-server.js.map +1 -1
  12. package/dist/core/create-core-services.d.ts +41 -4
  13. package/dist/core/create-core-services.d.ts.map +1 -1
  14. package/dist/core/create-core-services.js +183 -82
  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-requests.contract.d.ts +75 -0
  37. package/dist/modules/access/access-requests.contract.d.ts.map +1 -0
  38. package/dist/modules/access/access-requests.contract.js +20 -0
  39. package/dist/modules/access/access-requests.contract.js.map +1 -0
  40. package/dist/modules/access/access-requests.routes.d.ts +35 -0
  41. package/dist/modules/access/access-requests.routes.d.ts.map +1 -0
  42. package/dist/modules/access/access-requests.routes.js +237 -0
  43. package/dist/modules/access/access-requests.routes.js.map +1 -0
  44. package/dist/modules/access/access-requests.service.d.ts +123 -0
  45. package/dist/modules/access/access-requests.service.d.ts.map +1 -0
  46. package/dist/modules/access/access-requests.service.js +337 -0
  47. package/dist/modules/access/access-requests.service.js.map +1 -0
  48. package/dist/modules/access/access.routes.d.ts +2 -1
  49. package/dist/modules/access/access.routes.d.ts.map +1 -1
  50. package/dist/modules/access/access.routes.js +10 -10
  51. package/dist/modules/access/access.routes.js.map +1 -1
  52. package/dist/modules/access/change-read-gate.d.ts +6 -3
  53. package/dist/modules/access/change-read-gate.d.ts.map +1 -1
  54. package/dist/modules/access/change-read-gate.js +9 -6
  55. package/dist/modules/access/change-read-gate.js.map +1 -1
  56. package/dist/modules/access/creator-access.d.ts +4 -2
  57. package/dist/modules/access/creator-access.d.ts.map +1 -1
  58. package/dist/modules/access/creator-access.js +7 -4
  59. package/dist/modules/access/creator-access.js.map +1 -1
  60. package/dist/modules/access-model/access-grammar.d.ts +12 -0
  61. package/dist/modules/access-model/access-grammar.d.ts.map +1 -1
  62. package/dist/modules/access-model/access-grammar.js +24 -0
  63. package/dist/modules/access-model/access-grammar.js.map +1 -1
  64. package/dist/modules/agent-instructions/read-preamble.d.ts +2 -1
  65. package/dist/modules/agent-instructions/read-preamble.d.ts.map +1 -1
  66. package/dist/modules/agent-instructions/read-preamble.js +6 -9
  67. package/dist/modules/agent-instructions/read-preamble.js.map +1 -1
  68. package/dist/modules/auth/account-admission.d.ts +40 -0
  69. package/dist/modules/auth/account-admission.d.ts.map +1 -0
  70. package/dist/modules/auth/account-admission.js +17 -0
  71. package/dist/modules/auth/account-admission.js.map +1 -0
  72. package/dist/modules/auth/account.routes.d.ts.map +1 -1
  73. package/dist/modules/auth/account.routes.js +4 -1
  74. package/dist/modules/auth/account.routes.js.map +1 -1
  75. package/dist/modules/auth/auth.service.d.ts +45 -2
  76. package/dist/modules/auth/auth.service.d.ts.map +1 -1
  77. package/dist/modules/auth/auth.service.js +44 -3
  78. package/dist/modules/auth/auth.service.js.map +1 -1
  79. package/dist/modules/auth/oidc-auth-provider.d.ts.map +1 -1
  80. package/dist/modules/auth/oidc-auth-provider.js +9 -0
  81. package/dist/modules/auth/oidc-auth-provider.js.map +1 -1
  82. package/dist/modules/connection-probe/connection-probe.service.d.ts +13 -1
  83. package/dist/modules/connection-probe/connection-probe.service.d.ts.map +1 -1
  84. package/dist/modules/connection-probe/connection-probe.service.js +10 -2
  85. package/dist/modules/connection-probe/connection-probe.service.js.map +1 -1
  86. package/dist/modules/database/advisory-lock.d.ts +17 -0
  87. package/dist/modules/database/advisory-lock.d.ts.map +1 -1
  88. package/dist/modules/database/advisory-lock.js +24 -3
  89. package/dist/modules/database/advisory-lock.js.map +1 -1
  90. package/dist/modules/database/connection.d.ts +67 -2
  91. package/dist/modules/database/connection.d.ts.map +1 -1
  92. package/dist/modules/database/connection.js +118 -12
  93. package/dist/modules/database/connection.js.map +1 -1
  94. package/dist/modules/database/migrate.d.ts +1 -1
  95. package/dist/modules/database/migrate.d.ts.map +1 -1
  96. package/dist/modules/database/migrate.js +27 -3
  97. package/dist/modules/database/migrate.js.map +1 -1
  98. package/dist/modules/github-app/github-app.client.d.ts +101 -0
  99. package/dist/modules/github-app/github-app.client.d.ts.map +1 -0
  100. package/dist/modules/github-app/github-app.client.js +222 -0
  101. package/dist/modules/github-app/github-app.client.js.map +1 -0
  102. package/dist/modules/github-app/github-app.connection.d.ts +102 -0
  103. package/dist/modules/github-app/github-app.connection.d.ts.map +1 -0
  104. package/dist/modules/github-app/github-app.connection.js +185 -0
  105. package/dist/modules/github-app/github-app.connection.js.map +1 -0
  106. package/dist/modules/github-app/github-app.routes.d.ts +59 -0
  107. package/dist/modules/github-app/github-app.routes.d.ts.map +1 -0
  108. package/dist/modules/github-app/github-app.routes.js +323 -0
  109. package/dist/modules/github-app/github-app.routes.js.map +1 -0
  110. package/dist/modules/github-app/index.d.ts +4 -0
  111. package/dist/modules/github-app/index.d.ts.map +1 -0
  112. package/dist/modules/github-app/index.js +4 -0
  113. package/dist/modules/github-app/index.js.map +1 -0
  114. package/dist/modules/kb-fs/branch-name.d.ts +0 -1
  115. package/dist/modules/kb-fs/branch-name.d.ts.map +1 -1
  116. package/dist/modules/kb-fs/branch-name.js +3 -3
  117. package/dist/modules/kb-fs/branch-name.js.map +1 -1
  118. package/dist/modules/kb-fs/clone-config.d.ts +9 -8
  119. package/dist/modules/kb-fs/clone-config.d.ts.map +1 -1
  120. package/dist/modules/kb-fs/clone-config.js +14 -12
  121. package/dist/modules/kb-fs/clone-config.js.map +1 -1
  122. package/dist/modules/kb-fs/remote-url.d.ts +22 -0
  123. package/dist/modules/kb-fs/remote-url.d.ts.map +1 -0
  124. package/dist/modules/kb-fs/remote-url.js +35 -0
  125. package/dist/modules/kb-fs/remote-url.js.map +1 -0
  126. package/dist/modules/mcp/mcp.service.d.ts +7 -0
  127. package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
  128. package/dist/modules/mcp/mcp.service.js +4 -4
  129. package/dist/modules/mcp/mcp.service.js.map +1 -1
  130. package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts +4 -4
  131. package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts.map +1 -1
  132. package/dist/modules/plugins/compile/marketplace-compiler.service.js +7 -10
  133. package/dist/modules/plugins/compile/marketplace-compiler.service.js.map +1 -1
  134. package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.d.ts +4 -1
  135. package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.d.ts.map +1 -1
  136. package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.js +5 -3
  137. package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.js.map +1 -1
  138. package/dist/modules/plugins/discovery/kb-plugin-source.d.ts +6 -1
  139. package/dist/modules/plugins/discovery/kb-plugin-source.d.ts.map +1 -1
  140. package/dist/modules/plugins/discovery/kb-plugin-source.js +14 -9
  141. package/dist/modules/plugins/discovery/kb-plugin-source.js.map +1 -1
  142. package/dist/modules/plugins/discovery/native.source.d.ts +4 -1
  143. package/dist/modules/plugins/discovery/native.source.d.ts.map +1 -1
  144. package/dist/modules/plugins/discovery/native.source.js +4 -2
  145. package/dist/modules/plugins/discovery/native.source.js.map +1 -1
  146. package/dist/modules/plugins/index.d.ts +1 -1
  147. package/dist/modules/plugins/index.d.ts.map +1 -1
  148. package/dist/modules/plugins/index.js +1 -1
  149. package/dist/modules/plugins/index.js.map +1 -1
  150. package/dist/modules/plugins/join-proposals.d.ts +17 -5
  151. package/dist/modules/plugins/join-proposals.d.ts.map +1 -1
  152. package/dist/modules/plugins/join-proposals.js +76 -22
  153. package/dist/modules/plugins/join-proposals.js.map +1 -1
  154. package/dist/modules/plugins/join-request-jobs.service.d.ts +3 -1
  155. package/dist/modules/plugins/join-request-jobs.service.d.ts.map +1 -1
  156. package/dist/modules/plugins/join-request-jobs.service.js +6 -6
  157. package/dist/modules/plugins/join-request-jobs.service.js.map +1 -1
  158. package/dist/modules/plugins/join-requests.service.d.ts +113 -18
  159. package/dist/modules/plugins/join-requests.service.d.ts.map +1 -1
  160. package/dist/modules/plugins/join-requests.service.js +178 -33
  161. package/dist/modules/plugins/join-requests.service.js.map +1 -1
  162. package/dist/modules/plugins/plugin-links.d.ts +65 -10
  163. package/dist/modules/plugins/plugin-links.d.ts.map +1 -1
  164. package/dist/modules/plugins/plugin-links.js +136 -31
  165. package/dist/modules/plugins/plugin-links.js.map +1 -1
  166. package/dist/modules/plugins/plugin-links.service.d.ts +107 -5
  167. package/dist/modules/plugins/plugin-links.service.d.ts.map +1 -1
  168. package/dist/modules/plugins/plugin-links.service.js +151 -21
  169. package/dist/modules/plugins/plugin-links.service.js.map +1 -1
  170. package/dist/modules/plugins/plugin-provision.service.d.ts +10 -3
  171. package/dist/modules/plugins/plugin-provision.service.d.ts.map +1 -1
  172. package/dist/modules/plugins/plugin-provision.service.js +33 -26
  173. package/dist/modules/plugins/plugin-provision.service.js.map +1 -1
  174. package/dist/modules/plugins/plugin-rename.service.d.ts +4 -2
  175. package/dist/modules/plugins/plugin-rename.service.d.ts.map +1 -1
  176. package/dist/modules/plugins/plugin-rename.service.js +10 -12
  177. package/dist/modules/plugins/plugin-rename.service.js.map +1 -1
  178. package/dist/modules/plugins/plugins.routes.d.ts +3 -0
  179. package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
  180. package/dist/modules/plugins/plugins.routes.js +48 -17
  181. package/dist/modules/plugins/plugins.routes.js.map +1 -1
  182. package/dist/modules/plugins/plugins.service.d.ts +4 -4
  183. package/dist/modules/plugins/plugins.service.d.ts.map +1 -1
  184. package/dist/modules/plugins/plugins.service.js +7 -10
  185. package/dist/modules/plugins/plugins.service.js.map +1 -1
  186. package/dist/modules/plugins/teams.routes.d.ts +4 -1
  187. package/dist/modules/plugins/teams.routes.d.ts.map +1 -1
  188. package/dist/modules/plugins/teams.routes.js +11 -9
  189. package/dist/modules/plugins/teams.routes.js.map +1 -1
  190. package/dist/modules/secrets-vault/index.d.ts +1 -1
  191. package/dist/modules/secrets-vault/index.d.ts.map +1 -1
  192. package/dist/modules/secrets-vault/index.js +1 -1
  193. package/dist/modules/secrets-vault/index.js.map +1 -1
  194. package/dist/modules/secrets-vault/secrets-variable-loader.d.ts +29 -11
  195. package/dist/modules/secrets-vault/secrets-variable-loader.d.ts.map +1 -1
  196. package/dist/modules/secrets-vault/secrets-variable-loader.js +46 -21
  197. package/dist/modules/secrets-vault/secrets-variable-loader.js.map +1 -1
  198. package/dist/modules/secrets-vault/secrets-vault.routes.d.ts +3 -0
  199. package/dist/modules/secrets-vault/secrets-vault.routes.d.ts.map +1 -1
  200. package/dist/modules/secrets-vault/secrets-vault.routes.js +4 -6
  201. package/dist/modules/secrets-vault/secrets-vault.routes.js.map +1 -1
  202. package/dist/modules/settings/deployment-settings.service.d.ts +34 -9
  203. package/dist/modules/settings/deployment-settings.service.d.ts.map +1 -1
  204. package/dist/modules/settings/deployment-settings.service.js +113 -26
  205. package/dist/modules/settings/deployment-settings.service.js.map +1 -1
  206. package/dist/modules/settings/managed-repository.d.ts +43 -0
  207. package/dist/modules/settings/managed-repository.d.ts.map +1 -0
  208. package/dist/modules/settings/managed-repository.js +60 -0
  209. package/dist/modules/settings/managed-repository.js.map +1 -0
  210. package/dist/modules/settings/repository-source.d.ts +128 -0
  211. package/dist/modules/settings/repository-source.d.ts.map +1 -0
  212. package/dist/modules/settings/repository-source.js +150 -0
  213. package/dist/modules/settings/repository-source.js.map +1 -0
  214. package/dist/modules/settings/setup.routes.d.ts +34 -4
  215. package/dist/modules/settings/setup.routes.d.ts.map +1 -1
  216. package/dist/modules/settings/setup.routes.js +198 -18
  217. package/dist/modules/settings/setup.routes.js.map +1 -1
  218. package/dist/modules/skills/allowed-tools-check.d.ts +4 -3
  219. package/dist/modules/skills/allowed-tools-check.d.ts.map +1 -1
  220. package/dist/modules/skills/allowed-tools-check.js +8 -8
  221. package/dist/modules/skills/allowed-tools-check.js.map +1 -1
  222. package/dist/modules/skills/pending-skills.service.d.ts +3 -1
  223. package/dist/modules/skills/pending-skills.service.d.ts.map +1 -1
  224. package/dist/modules/skills/pending-skills.service.js +9 -6
  225. package/dist/modules/skills/pending-skills.service.js.map +1 -1
  226. package/dist/modules/skills/skill-access-requests.routes.d.ts +8 -9
  227. package/dist/modules/skills/skill-access-requests.routes.d.ts.map +1 -1
  228. package/dist/modules/skills/skill-access-requests.routes.js +26 -65
  229. package/dist/modules/skills/skill-access-requests.routes.js.map +1 -1
  230. package/dist/modules/skills/skills.routes.d.ts +4 -1
  231. package/dist/modules/skills/skills.routes.d.ts.map +1 -1
  232. package/dist/modules/skills/skills.routes.js +4 -4
  233. package/dist/modules/skills/skills.routes.js.map +1 -1
  234. package/dist/modules/skills/skills.service.d.ts +4 -2
  235. package/dist/modules/skills/skills.service.d.ts.map +1 -1
  236. package/dist/modules/skills/skills.service.js +13 -11
  237. package/dist/modules/skills/skills.service.js.map +1 -1
  238. package/dist/modules/tool-helpers/tool-context.d.ts.map +1 -1
  239. package/dist/modules/tool-helpers/tool-context.js +15 -0
  240. package/dist/modules/tool-helpers/tool-context.js.map +1 -1
  241. package/dist/modules/tool-manuals/mcp-json-discovery.d.ts +2 -1
  242. package/dist/modules/tool-manuals/mcp-json-discovery.d.ts.map +1 -1
  243. package/dist/modules/tool-manuals/mcp-json-discovery.js +6 -5
  244. package/dist/modules/tool-manuals/mcp-json-discovery.js.map +1 -1
  245. package/dist/modules/tool-manuals/mcp-server-edit.service.d.ts +4 -2
  246. package/dist/modules/tool-manuals/mcp-server-edit.service.d.ts.map +1 -1
  247. package/dist/modules/tool-manuals/mcp-server-edit.service.js +12 -10
  248. package/dist/modules/tool-manuals/mcp-server-edit.service.js.map +1 -1
  249. package/dist/modules/tool-manuals/pending-tools.service.d.ts +3 -1
  250. package/dist/modules/tool-manuals/pending-tools.service.d.ts.map +1 -1
  251. package/dist/modules/tool-manuals/pending-tools.service.js +19 -16
  252. package/dist/modules/tool-manuals/pending-tools.service.js.map +1 -1
  253. package/dist/modules/tool-manuals/tool-delete.service.d.ts +4 -2
  254. package/dist/modules/tool-manuals/tool-delete.service.d.ts.map +1 -1
  255. package/dist/modules/tool-manuals/tool-delete.service.js +14 -12
  256. package/dist/modules/tool-manuals/tool-delete.service.js.map +1 -1
  257. package/dist/modules/tool-manuals/tool-manuals.routes.d.ts +3 -1
  258. package/dist/modules/tool-manuals/tool-manuals.routes.d.ts.map +1 -1
  259. package/dist/modules/tool-manuals/tool-manuals.routes.js +7 -7
  260. package/dist/modules/tool-manuals/tool-manuals.routes.js.map +1 -1
  261. package/dist/modules/tool-manuals/tool-manuals.service.d.ts +4 -2
  262. package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
  263. package/dist/modules/tool-manuals/tool-manuals.service.js +15 -12
  264. package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -1
  265. package/dist/modules/tool-manuals/tool-manuals.tools.d.ts +3 -0
  266. package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
  267. package/dist/modules/tool-manuals/tool-manuals.tools.js +4 -6
  268. package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
  269. package/dist/modules/workflow/agent-tools/workflow.tools.d.ts +3 -2
  270. package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +1 -1
  271. package/dist/modules/workflow/agent-tools/workflow.tools.js +47 -11
  272. package/dist/modules/workflow/agent-tools/workflow.tools.js.map +1 -1
  273. package/dist/modules/workflow/git/git.service.d.ts +14 -6
  274. package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
  275. package/dist/modules/workflow/git/git.service.js +40 -18
  276. package/dist/modules/workflow/git/git.service.js.map +1 -1
  277. package/dist/modules/workflow/git/node-git-runner.d.ts +26 -2
  278. package/dist/modules/workflow/git/node-git-runner.d.ts.map +1 -1
  279. package/dist/modules/workflow/git/node-git-runner.js +40 -5
  280. package/dist/modules/workflow/git/node-git-runner.js.map +1 -1
  281. package/dist/modules/workflow/git/pull-request.service.d.ts +45 -0
  282. package/dist/modules/workflow/git/pull-request.service.d.ts.map +1 -1
  283. package/dist/modules/workflow/git/pull-request.service.js +99 -0
  284. package/dist/modules/workflow/git/pull-request.service.js.map +1 -1
  285. package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts.map +1 -1
  286. package/dist/modules/workflow/review-workflow/review-workflow.service.js +9 -4
  287. package/dist/modules/workflow/review-workflow/review-workflow.service.js.map +1 -1
  288. package/dist/modules/workflow/session-ontology.service.d.ts +6 -1
  289. package/dist/modules/workflow/session-ontology.service.d.ts.map +1 -1
  290. package/dist/modules/workflow/session-ontology.service.js +6 -2
  291. package/dist/modules/workflow/session-ontology.service.js.map +1 -1
  292. package/dist/modules/workflow/workflow.routes.d.ts.map +1 -1
  293. package/dist/modules/workflow/workflow.routes.js +3 -1
  294. package/dist/modules/workflow/workflow.routes.js.map +1 -1
  295. package/dist/modules/workflow/workflow.service.d.ts +42 -10
  296. package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
  297. package/dist/modules/workflow/workflow.service.js +181 -71
  298. package/dist/modules/workflow/workflow.service.js.map +1 -1
  299. package/dist/modules/workspace/session-ontology.gate.d.ts +3 -1
  300. package/dist/modules/workspace/session-ontology.gate.d.ts.map +1 -1
  301. package/dist/modules/workspace/session-ontology.gate.js +3 -3
  302. package/dist/modules/workspace/session-ontology.gate.js.map +1 -1
  303. package/dist/modules/workspace/startup/kb-git.d.ts +4 -3
  304. package/dist/modules/workspace/startup/kb-git.d.ts.map +1 -1
  305. package/dist/modules/workspace/startup/kb-git.js +15 -13
  306. package/dist/modules/workspace/startup/kb-git.js.map +1 -1
  307. package/dist/modules/workspace/startup/kb-startup-runner.d.ts +70 -7
  308. package/dist/modules/workspace/startup/kb-startup-runner.d.ts.map +1 -1
  309. package/dist/modules/workspace/startup/kb-startup-runner.js +183 -38
  310. package/dist/modules/workspace/startup/kb-startup-runner.js.map +1 -1
  311. package/dist/modules/workspace/startup/steps/groups-to-plugins.step.d.ts +7 -1
  312. package/dist/modules/workspace/startup/steps/groups-to-plugins.step.d.ts.map +1 -1
  313. package/dist/modules/workspace/startup/steps/groups-to-plugins.step.js +23 -16
  314. package/dist/modules/workspace/startup/steps/groups-to-plugins.step.js.map +1 -1
  315. package/dist/modules/workspace/startup/steps/personal-spaces.step.d.ts +7 -1
  316. package/dist/modules/workspace/startup/steps/personal-spaces.step.d.ts.map +1 -1
  317. package/dist/modules/workspace/startup/steps/personal-spaces.step.js +12 -5
  318. package/dist/modules/workspace/startup/steps/personal-spaces.step.js.map +1 -1
  319. package/dist/modules/workspace/startup/steps/plugin-display-names.step.d.ts +7 -1
  320. package/dist/modules/workspace/startup/steps/plugin-display-names.step.d.ts.map +1 -1
  321. package/dist/modules/workspace/startup/steps/plugin-display-names.step.js +12 -5
  322. package/dist/modules/workspace/startup/steps/plugin-display-names.step.js.map +1 -1
  323. package/dist/modules/workspace/startup/steps/plugin-manifests.step.d.ts +7 -1
  324. package/dist/modules/workspace/startup/steps/plugin-manifests.step.d.ts.map +1 -1
  325. package/dist/modules/workspace/startup/steps/plugin-manifests.step.js +12 -5
  326. package/dist/modules/workspace/startup/steps/plugin-manifests.step.js.map +1 -1
  327. package/dist/modules/workspace/startup/steps/seed-tree.d.ts +4 -1
  328. package/dist/modules/workspace/startup/steps/seed-tree.d.ts.map +1 -1
  329. package/dist/modules/workspace/startup/steps/seed-tree.js +14 -11
  330. package/dist/modules/workspace/startup/steps/seed-tree.js.map +1 -1
  331. package/dist/modules/workspace/startup/steps/template-files.step.d.ts +17 -3
  332. package/dist/modules/workspace/startup/steps/template-files.step.d.ts.map +1 -1
  333. package/dist/modules/workspace/startup/steps/template-files.step.js +36 -30
  334. package/dist/modules/workspace/startup/steps/template-files.step.js.map +1 -1
  335. package/dist/modules/workspace/startup/steps/template-source.d.ts +6 -1
  336. package/dist/modules/workspace/startup/steps/template-source.d.ts.map +1 -1
  337. package/dist/modules/workspace/startup/steps/template-source.js +10 -6
  338. package/dist/modules/workspace/startup/steps/template-source.js.map +1 -1
  339. package/dist/modules/workspace/workspace.routes.d.ts +2 -1
  340. package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
  341. package/dist/modules/workspace/workspace.routes.js +8 -7
  342. package/dist/modules/workspace/workspace.routes.js.map +1 -1
  343. package/dist/modules/workspace/workspace.service.d.ts +18 -12
  344. package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
  345. package/dist/modules/workspace/workspace.service.js +49 -29
  346. package/dist/modules/workspace/workspace.service.js.map +1 -1
  347. package/dist/modules/workspace/workspace.tools.d.ts +2 -1
  348. package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
  349. package/dist/modules/workspace/workspace.tools.js +48 -20
  350. package/dist/modules/workspace/workspace.tools.js.map +1 -1
  351. package/dist/modules/workspace/write-denial.d.ts +3 -2
  352. package/dist/modules/workspace/write-denial.d.ts.map +1 -1
  353. package/dist/modules/workspace/write-denial.js +6 -5
  354. package/dist/modules/workspace/write-denial.js.map +1 -1
  355. package/dist/shared/domain-errors.d.ts +39 -0
  356. package/dist/shared/domain-errors.d.ts.map +1 -1
  357. package/dist/shared/domain-errors.js +55 -0
  358. package/dist/shared/domain-errors.js.map +1 -1
  359. package/dist/shared/git.contract.d.ts +62 -7
  360. package/dist/shared/git.contract.d.ts.map +1 -1
  361. package/dist/shared/git.contract.js +30 -8
  362. package/dist/shared/git.contract.js.map +1 -1
  363. package/dist/shared/kb-context.d.ts +76 -0
  364. package/dist/shared/kb-context.d.ts.map +1 -0
  365. package/dist/shared/kb-context.js +108 -0
  366. package/dist/shared/kb-context.js.map +1 -0
  367. package/dist/shared/kb-layout.d.ts +3 -2
  368. package/dist/shared/kb-layout.d.ts.map +1 -1
  369. package/dist/shared/kb-layout.js +4 -3
  370. package/dist/shared/kb-layout.js.map +1 -1
  371. package/dist/shared/kb-layout.test.js +35 -27
  372. package/dist/shared/kb-layout.test.js.map +1 -1
  373. package/dist/shared/pending-proposals.d.ts +4 -1
  374. package/dist/shared/pending-proposals.d.ts.map +1 -1
  375. package/dist/shared/pending-proposals.js +3 -4
  376. package/dist/shared/pending-proposals.js.map +1 -1
  377. package/dist/shared/redact-secret.d.ts +5 -5
  378. package/dist/shared/redact-secret.js +5 -5
  379. package/dist/tenancy/index.d.ts +13 -0
  380. package/dist/tenancy/index.d.ts.map +1 -0
  381. package/dist/tenancy/index.js +13 -0
  382. package/dist/tenancy/index.js.map +1 -0
  383. package/dist/tenancy/static-tenant-source.d.ts +98 -0
  384. package/dist/tenancy/static-tenant-source.d.ts.map +1 -0
  385. package/dist/tenancy/static-tenant-source.js +220 -0
  386. package/dist/tenancy/static-tenant-source.js.map +1 -0
  387. package/dist/tenancy/tenant-host.d.ts +80 -0
  388. package/dist/tenancy/tenant-host.d.ts.map +1 -0
  389. package/dist/tenancy/tenant-host.js +217 -0
  390. package/dist/tenancy/tenant-host.js.map +1 -0
  391. package/dist/tenancy/tenant-runtime.d.ts +91 -0
  392. package/dist/tenancy/tenant-runtime.d.ts.map +1 -0
  393. package/dist/tenancy/tenant-runtime.js +174 -0
  394. package/dist/tenancy/tenant-runtime.js.map +1 -0
  395. package/dist/tenancy/tenant-secrets.d.ts +24 -0
  396. package/dist/tenancy/tenant-secrets.d.ts.map +1 -0
  397. package/dist/tenancy/tenant-secrets.js +30 -0
  398. package/dist/tenancy/tenant-secrets.js.map +1 -0
  399. package/dist/tenancy/tenant-source.contract.d.ts +45 -0
  400. package/dist/tenancy/tenant-source.contract.d.ts.map +1 -0
  401. package/dist/tenancy/tenant-source.contract.js +21 -0
  402. package/dist/tenancy/tenant-source.contract.js.map +1 -0
  403. package/migrations/0000_core_init.sql +14 -14
  404. package/migrations/0003_deployment_settings.sql +1 -1
  405. package/migrations/0005_github_facade.sql +1 -1
  406. package/migrations/0012_agent_audit.sql +6 -6
  407. package/package.json +3 -3
  408. package/src/__tests__/branch-model.test.ts +7 -6
  409. package/src/__tests__/kb-context.ts +30 -0
  410. package/src/__tests__/kb-layout-config.test.ts +35 -30
  411. package/src/core/__tests__/catalog-cache-invalidation.test.ts +2 -1
  412. package/src/core/__tests__/lifecycle.test.ts +78 -1
  413. package/src/core/__tests__/public-config.test.ts +5 -1
  414. package/src/core/catalog-cache-invalidation.ts +16 -11
  415. package/src/core/core-ports.ts +19 -0
  416. package/src/core/create-core-server.ts +64 -107
  417. package/src/core/create-core-services.ts +238 -96
  418. package/src/core/lifecycle.ts +214 -29
  419. package/src/core/public-config.ts +8 -5
  420. package/src/core-config.ts +107 -8
  421. package/src/index.ts +25 -2
  422. package/src/modules/access/__tests__/access-control.admin-root-floor.test.ts +2 -1
  423. package/src/modules/access/__tests__/access-requests.recut.test.ts +134 -0
  424. package/src/modules/access/__tests__/access-requests.routes.test.ts +610 -0
  425. package/src/modules/access/__tests__/access.routes.batch.test.ts +2 -1
  426. package/src/modules/access/__tests__/access.routes.folder-governs.test.ts +2 -1
  427. package/src/modules/access/__tests__/access.routes.group-grant.test.ts +2 -1
  428. package/src/modules/access/__tests__/access.routes.overrides.test.ts +2 -1
  429. package/src/modules/access/__tests__/access.routes.proposal-branch.test.ts +2 -1
  430. package/src/modules/access/__tests__/access.routes.prospective.test.ts +2 -1
  431. package/src/modules/access/__tests__/access.routes.revoke.test.ts +2 -1
  432. package/src/modules/access/__tests__/access.routes.unknown-email.test.ts +2 -1
  433. package/src/modules/access/__tests__/change-read-gate.test.ts +13 -11
  434. package/src/modules/access/__tests__/creator-access.test.ts +3 -2
  435. package/src/modules/access/__tests__/roles.routes.test.ts +2 -1
  436. package/src/modules/access/access-control.service.ts +20 -6
  437. package/src/modules/access/access-requests.contract.ts +93 -0
  438. package/src/modules/access/access-requests.routes.ts +286 -0
  439. package/src/modules/access/access-requests.service.ts +420 -0
  440. package/src/modules/access/access.routes.ts +10 -13
  441. package/src/modules/access/change-read-gate.ts +10 -4
  442. package/src/modules/access/creator-access.ts +7 -2
  443. package/src/modules/access-model/access-grammar.ts +22 -0
  444. package/src/modules/agent-instructions/__tests__/read-preamble.test.ts +13 -12
  445. package/src/modules/agent-instructions/read-preamble.ts +10 -12
  446. package/src/modules/auth/__tests__/account.routes.test.ts +15 -0
  447. package/src/modules/auth/__tests__/auth.service.test.ts +98 -0
  448. package/src/modules/auth/account-admission.ts +44 -0
  449. package/src/modules/auth/account.routes.ts +4 -1
  450. package/src/modules/auth/auth.service.ts +61 -2
  451. package/src/modules/auth/oidc-auth-provider.ts +9 -0
  452. package/src/modules/connection-probe/connection-probe.service.ts +7 -1
  453. package/src/modules/database/__tests__/advisory-lock.test.ts +23 -1
  454. package/src/modules/database/__tests__/connection.test.ts +98 -0
  455. package/src/modules/database/__tests__/migrations-unqualified.test.ts +32 -0
  456. package/src/modules/database/advisory-lock.ts +28 -4
  457. package/src/modules/database/connection.ts +143 -13
  458. package/src/modules/database/migrate.ts +48 -14
  459. package/src/modules/diff/__tests__/diff.service.seed-atomicity.test.ts +2 -1
  460. package/src/modules/diff/__tests__/diff.service.test.ts +2 -1
  461. package/src/modules/github-app/__tests__/github-app.test.ts +848 -0
  462. package/src/modules/github-app/github-app.client.ts +268 -0
  463. package/src/modules/github-app/github-app.connection.ts +204 -0
  464. package/src/modules/github-app/github-app.routes.ts +359 -0
  465. package/src/modules/github-app/index.ts +19 -0
  466. package/src/modules/kb-fs/__tests__/branch-name.test.ts +6 -6
  467. package/src/modules/kb-fs/__tests__/clone-config.test.ts +24 -20
  468. package/src/modules/kb-fs/__tests__/remote-url.test.ts +38 -0
  469. package/src/modules/kb-fs/branch-name.ts +3 -3
  470. package/src/modules/kb-fs/clone-config.ts +15 -12
  471. package/src/modules/kb-fs/remote-url.ts +35 -0
  472. package/src/modules/marketplace/__tests__/marketplace-repo.head.test.ts +2 -1
  473. package/src/modules/mcp/mcp.service.ts +11 -4
  474. package/src/modules/plugins/__tests__/bundle-dialect.e2e.test.ts +12 -11
  475. package/src/modules/plugins/__tests__/bundle-dialect.test.ts +2 -1
  476. package/src/modules/plugins/__tests__/compile-marketplace.test.ts +6 -4
  477. package/src/modules/plugins/__tests__/join-proposals.test.ts +100 -19
  478. package/src/modules/plugins/__tests__/join-request-jobs.service.test.ts +2 -1
  479. package/src/modules/plugins/__tests__/join-requests.service.test.ts +28 -11
  480. package/src/modules/plugins/__tests__/join-requests.settlement.test.ts +371 -0
  481. package/src/modules/plugins/__tests__/plugin-creation-display-name.test.ts +4 -3
  482. package/src/modules/plugins/__tests__/plugin-index.service.test.ts +6 -4
  483. package/src/modules/plugins/__tests__/plugin-links.service.test.ts +220 -5
  484. package/src/modules/plugins/__tests__/plugin-provision.service.test.ts +3 -1
  485. package/src/modules/plugins/__tests__/plugin-rename.service.test.ts +7 -6
  486. package/src/modules/plugins/__tests__/plugins.routes.test.ts +12 -3
  487. package/src/modules/plugins/__tests__/teams.routes.test.ts +2 -1
  488. package/src/modules/plugins/compile/marketplace-compiler.service.ts +7 -9
  489. package/src/modules/plugins/discovery/__tests__/kb-plugin-source.test.ts +20 -16
  490. package/src/modules/plugins/discovery/bundle-dialect/bundle.source.ts +9 -2
  491. package/src/modules/plugins/discovery/kb-plugin-source.ts +15 -8
  492. package/src/modules/plugins/discovery/native.source.ts +4 -1
  493. package/src/modules/plugins/index.ts +1 -1
  494. package/src/modules/plugins/join-proposals.ts +87 -19
  495. package/src/modules/plugins/join-request-jobs.service.ts +8 -7
  496. package/src/modules/plugins/join-requests.service.ts +203 -43
  497. package/src/modules/plugins/plugin-links.service.ts +192 -19
  498. package/src/modules/plugins/plugin-links.ts +147 -27
  499. package/src/modules/plugins/plugin-provision.service.ts +54 -27
  500. package/src/modules/plugins/plugin-rename.service.ts +10 -10
  501. package/src/modules/plugins/plugins.routes.ts +48 -17
  502. package/src/modules/plugins/plugins.service.ts +7 -11
  503. package/src/modules/plugins/teams.routes.ts +16 -8
  504. package/src/modules/secrets-vault/__tests__/connect-pending.route.test.ts +7 -0
  505. package/src/modules/secrets-vault/__tests__/secrets-variable-loader.test.ts +40 -0
  506. package/src/modules/secrets-vault/__tests__/tool-owner-gate.route.test.ts +2 -0
  507. package/src/modules/secrets-vault/index.ts +2 -0
  508. package/src/modules/secrets-vault/secrets-variable-loader.ts +51 -21
  509. package/src/modules/secrets-vault/secrets-vault.routes.ts +7 -6
  510. package/src/modules/settings/__tests__/deployment-settings.service.test.ts +24 -11
  511. package/src/modules/settings/__tests__/git-root-folders.test.ts +2 -1
  512. package/src/modules/settings/__tests__/repository-source.test.ts +191 -0
  513. package/src/modules/settings/__tests__/setup.routes.boot-failure.test.ts +2 -1
  514. package/src/modules/settings/__tests__/setup.routes.git-mode.test.ts +353 -0
  515. package/src/modules/settings/__tests__/setup.routes.github-app.test.ts +282 -0
  516. package/src/modules/settings/__tests__/setup.routes.layout-phase.test.ts +7 -4
  517. package/src/modules/settings/__tests__/setup.routes.managed-phase.test.ts +233 -0
  518. package/src/modules/settings/__tests__/setup.routes.oidc.test.ts +2 -0
  519. package/src/modules/settings/__tests__/setup.routes.sync-status.test.ts +2 -0
  520. package/src/modules/settings/__tests__/setup.routes.test.ts +33 -52
  521. package/src/modules/settings/deployment-settings.service.ts +130 -23
  522. package/src/modules/settings/managed-repository.ts +68 -0
  523. package/src/modules/settings/repository-source.ts +197 -0
  524. package/src/modules/settings/setup.routes.ts +233 -19
  525. package/src/modules/skills/__tests__/allowed-tools-check.test.ts +11 -10
  526. package/src/modules/skills/__tests__/allowed-tools-warn.tools.test.ts +4 -3
  527. package/src/modules/skills/__tests__/pending-skills.service.test.ts +3 -1
  528. package/src/modules/skills/__tests__/skill-access-requests.routes.test.ts +7 -2
  529. package/src/modules/skills/__tests__/skills.routes.warnings.test.ts +2 -1
  530. package/src/modules/skills/__tests__/skills.service.test.ts +3 -2
  531. package/src/modules/skills/allowed-tools-check.ts +7 -6
  532. package/src/modules/skills/pending-skills.service.ts +9 -8
  533. package/src/modules/skills/skill-access-requests.routes.ts +29 -79
  534. package/src/modules/skills/skills.routes.ts +4 -3
  535. package/src/modules/skills/skills.service.ts +13 -9
  536. package/src/modules/tool-helpers/__tests__/agent-roles-write.test.ts +3 -2
  537. package/src/modules/tool-helpers/__tests__/phase4-tools.test.ts +3 -2
  538. package/src/modules/tool-helpers/tool-context.ts +15 -0
  539. package/src/modules/tool-manuals/__tests__/mcp-json-discovery.test.ts +17 -12
  540. package/src/modules/tool-manuals/__tests__/mcp-server-edit.service.test.ts +2 -1
  541. package/src/modules/tool-manuals/__tests__/pending-tools.service.test.ts +4 -1
  542. package/src/modules/tool-manuals/__tests__/tool-delete.service.test.ts +2 -1
  543. package/src/modules/tool-manuals/__tests__/tool-manuals.archive.route.test.ts +2 -1
  544. package/src/modules/tool-manuals/__tests__/tool-manuals.cli.test.ts +5 -4
  545. package/src/modules/tool-manuals/__tests__/tool-manuals.detail.route.test.ts +2 -1
  546. package/src/modules/tool-manuals/__tests__/tool-manuals.invalid.routes.test.ts +4 -2
  547. package/src/modules/tool-manuals/__tests__/tool-manuals.invalid.test.ts +13 -5
  548. package/src/modules/tool-manuals/__tests__/tool-manuals.mcp-oauth.test.ts +2 -1
  549. package/src/modules/tool-manuals/__tests__/tool-manuals.restart.test.ts +9 -1
  550. package/src/modules/tool-manuals/__tests__/tool-manuals.service.test.ts +3 -2
  551. package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +2 -0
  552. package/src/modules/tool-manuals/mcp-json-discovery.ts +6 -4
  553. package/src/modules/tool-manuals/mcp-server-edit.service.ts +13 -11
  554. package/src/modules/tool-manuals/pending-tools.service.ts +19 -16
  555. package/src/modules/tool-manuals/tool-delete.service.ts +13 -10
  556. package/src/modules/tool-manuals/tool-manuals.routes.ts +10 -8
  557. package/src/modules/tool-manuals/tool-manuals.service.ts +15 -13
  558. package/src/modules/tool-manuals/tool-manuals.tools.ts +7 -6
  559. package/src/modules/workflow/__tests__/apply-failure.test.ts +11 -2
  560. package/src/modules/workflow/__tests__/merge-announces-tree.test.ts +14 -26
  561. package/src/modules/workflow/__tests__/preserve-roles-yaml.test.ts +2 -1
  562. package/src/modules/workflow/__tests__/session-ontology.service.test.ts +3 -2
  563. package/src/modules/workflow/__tests__/workflow.routes.lock-path.test.ts +2 -1
  564. package/src/modules/workflow/__tests__/workflow.service.branch-in-use.test.ts +3 -10
  565. package/src/modules/workflow/__tests__/workflow.service.commitFileWhileLocked.test.ts +2 -1
  566. package/src/modules/workflow/__tests__/workflow.service.deleted-branch-sweep.test.ts +3 -10
  567. package/src/modules/workflow/__tests__/workflow.service.facade.test.ts +187 -35
  568. package/src/modules/workflow/__tests__/workflow.service.folder-proposals.test.ts +2 -1
  569. package/src/modules/workflow/__tests__/workflow.service.platform-restore.test.ts +2 -1
  570. package/src/modules/workflow/__tests__/workflow.service.read-gate.test.ts +3 -2
  571. package/src/modules/workflow/__tests__/workflow.service.releaseLock.test.ts +2 -1
  572. package/src/modules/workflow/__tests__/workflow.service.sync.test.ts +5 -4
  573. package/src/modules/workflow/__tests__/workflow.service.update-from-target.test.ts +148 -41
  574. package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +143 -2
  575. package/src/modules/workflow/agent-tools/workflow.tools.ts +60 -12
  576. package/src/modules/workflow/git/__tests__/git.service.accessGating.test.ts +5 -4
  577. package/src/modules/workflow/git/__tests__/git.service.changedFilesForPr.test.ts +12 -11
  578. package/src/modules/workflow/git/__tests__/git.service.commitChanges.test.ts +9 -8
  579. package/src/modules/workflow/git/__tests__/git.service.commitFile.strayPath.test.ts +8 -7
  580. package/src/modules/workflow/git/__tests__/git.service.commitFile.test.ts +6 -5
  581. package/src/modules/workflow/git/__tests__/git.service.createBranch.test.ts +3 -2
  582. package/src/modules/workflow/git/__tests__/git.service.deleteBranch.test.ts +3 -2
  583. package/src/modules/workflow/git/__tests__/git.service.diffFileAtCommit.test.ts +7 -6
  584. package/src/modules/workflow/git/__tests__/git.service.diffFileBetweenBranches.test.ts +16 -15
  585. package/src/modules/workflow/git/__tests__/git.service.fileContentsAtCommit.test.ts +3 -2
  586. package/src/modules/workflow/git/__tests__/git.service.forkPoint.test.ts +2 -1
  587. package/src/modules/workflow/git/__tests__/git.service.history-guards.test.ts +2 -1
  588. package/src/modules/workflow/git/__tests__/git.service.list-branches.test.ts +10 -9
  589. package/src/modules/workflow/git/__tests__/git.service.listTrackedFiles.test.ts +2 -1
  590. package/src/modules/workflow/git/__tests__/git.service.logForFile.test.ts +6 -5
  591. package/src/modules/workflow/git/__tests__/git.service.mergeChangeRequest.test.ts +9 -8
  592. package/src/modules/workflow/git/__tests__/git.service.pendingChanges.test.ts +2 -1
  593. package/src/modules/workflow/git/__tests__/git.service.postMergePull.test.ts +4 -3
  594. package/src/modules/workflow/git/__tests__/git.service.pull.test.ts +130 -8
  595. package/src/modules/workflow/git/__tests__/git.service.readFileAtRef.test.ts +2 -1
  596. package/src/modules/workflow/git/__tests__/git.service.revertPathsAndPush.test.ts +2 -1
  597. package/src/modules/workflow/git/__tests__/git.service.status.test.ts +4 -3
  598. package/src/modules/workflow/git/__tests__/git.service.syncFromRemote.test.ts +8 -7
  599. package/src/modules/workflow/git/__tests__/node-git-runner.test.ts +41 -3
  600. package/src/modules/workflow/git/__tests__/pull-request.service.getPrDetail.test.ts +145 -2
  601. package/src/modules/workflow/git/__tests__/pull-request.service.viewer-can-delete.test.ts +166 -0
  602. package/src/modules/workflow/git/git.service.ts +49 -17
  603. package/src/modules/workflow/git/node-git-runner.ts +43 -4
  604. package/src/modules/workflow/git/pull-request.service.ts +119 -0
  605. package/src/modules/workflow/review-workflow/review-workflow.service.ts +9 -6
  606. package/src/modules/workflow/session-ontology.service.ts +7 -2
  607. package/src/modules/workflow/workflow.routes.ts +3 -1
  608. package/src/modules/workflow/workflow.service.ts +201 -76
  609. package/src/modules/workspace/__tests__/file-stat-access.test.ts +3 -2
  610. package/src/modules/workspace/__tests__/git-internals.security.test.ts +10 -9
  611. package/src/modules/workspace/__tests__/session-ontology.gate.test.ts +4 -2
  612. package/src/modules/workspace/__tests__/workspace-paths-inside-the-repo.test.ts +3 -2
  613. package/src/modules/workspace/__tests__/workspace.routes.branch-errors.test.ts +2 -1
  614. package/src/modules/workspace/__tests__/workspace.routes.create-grant.test.ts +2 -1
  615. package/src/modules/workspace/__tests__/workspace.routes.delete.test.ts +2 -1
  616. package/src/modules/workspace/__tests__/workspace.routes.download-implies-read.test.ts +2 -1
  617. package/src/modules/workspace/__tests__/workspace.routes.download.test.ts +2 -1
  618. package/src/modules/workspace/__tests__/workspace.routes.file-writes.test.ts +2 -1
  619. package/src/modules/workspace/__tests__/workspace.routes.folders.test.ts +5 -4
  620. package/src/modules/workspace/__tests__/workspace.routes.move-platform-files.test.ts +2 -1
  621. package/src/modules/workspace/__tests__/workspace.routes.read-gate.test.ts +2 -1
  622. package/src/modules/workspace/__tests__/workspace.service.ensure-remotes-fetched.test.ts +2 -2
  623. package/src/modules/workspace/__tests__/workspace.service.list-cloned.test.ts +6 -5
  624. package/src/modules/workspace/__tests__/workspace.service.move-never-overwrites.test.ts +2 -1
  625. package/src/modules/workspace/__tests__/workspace.service.read-filter.test.ts +2 -1
  626. package/src/modules/workspace/__tests__/workspace.service.test.ts +84 -50
  627. package/src/modules/workspace/__tests__/workspace.service.unknown-branch.test.ts +45 -1
  628. package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +10 -7
  629. package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +237 -10
  630. package/src/modules/workspace/__tests__/workspace.tools.test.ts +44 -11
  631. package/src/modules/workspace/__tests__/write-denial.test.ts +5 -4
  632. package/src/modules/workspace/session-ontology.gate.ts +6 -4
  633. package/src/modules/workspace/startup/__tests__/kb-startup-runner.degraded.test.ts +6 -2
  634. package/src/modules/workspace/startup/__tests__/kb-startup-runner.test.ts +240 -21
  635. package/src/modules/workspace/startup/kb-git.ts +15 -22
  636. package/src/modules/workspace/startup/kb-startup-runner.ts +198 -45
  637. package/src/modules/workspace/startup/steps/__tests__/steps.test.ts +104 -98
  638. package/src/modules/workspace/startup/steps/groups-to-plugins.step.ts +24 -16
  639. package/src/modules/workspace/startup/steps/personal-spaces.step.ts +14 -5
  640. package/src/modules/workspace/startup/steps/plugin-display-names.step.ts +13 -5
  641. package/src/modules/workspace/startup/steps/plugin-manifests.step.ts +14 -5
  642. package/src/modules/workspace/startup/steps/seed-tree.ts +11 -9
  643. package/src/modules/workspace/startup/steps/template-files.step.ts +43 -34
  644. package/src/modules/workspace/startup/steps/template-source.ts +8 -5
  645. package/src/modules/workspace/workspace.routes.ts +8 -7
  646. package/src/modules/workspace/workspace.service.ts +47 -28
  647. package/src/modules/workspace/workspace.tools.ts +56 -20
  648. package/src/modules/workspace/write-denial.ts +7 -5
  649. package/src/shared/__tests__/kb-layout.plugin.test.ts +19 -16
  650. package/src/shared/domain-errors.ts +58 -0
  651. package/src/shared/git.contract.ts +80 -8
  652. package/src/shared/kb-context.ts +130 -0
  653. package/src/shared/kb-layout.test.ts +37 -27
  654. package/src/shared/kb-layout.ts +4 -3
  655. package/src/shared/pending-proposals.ts +7 -4
  656. package/src/shared/redact-secret.ts +5 -5
  657. package/src/tenancy/__tests__/static-tenant-source.test.ts +177 -0
  658. package/src/tenancy/__tests__/tenant-host.test.ts +372 -0
  659. package/src/tenancy/__tests__/tenant-runtime.test.ts +221 -0
  660. package/src/tenancy/__tests__/tenant-secrets.test.ts +35 -0
  661. package/src/tenancy/index.ts +35 -0
  662. package/src/tenancy/static-tenant-source.ts +296 -0
  663. package/src/tenancy/tenant-host.ts +261 -0
  664. package/src/tenancy/tenant-runtime.ts +208 -0
  665. package/src/tenancy/tenant-secrets.ts +41 -0
  666. package/src/tenancy/tenant-source.contract.ts +59 -0
@@ -5,7 +5,6 @@ import {
5
5
  HEXIS_EXTENSION_NS,
6
6
  HEXIS_TOOLS_DIR,
7
7
  LEGACY_GROUPS_DIR,
8
- PLUGINS_DIR,
9
8
  PLUGIN_MANIFEST_FILE,
10
9
  PLUGIN_MCP_FILE,
11
10
  PLUGIN_MCP_SCHEMA,
@@ -18,6 +17,7 @@ import { parseOwnAccessEntries } from '../../../access-model/access-grammar.js';
18
17
  import { containsVariableReference } from '../../../../shared/variable-refs.js';
19
18
  import { IGNORE_FILENAME, isAbsence, isSkippedEntry, type IFsProbe, type ITreeWalker } from '../../../../shared/fs.contract.js';
20
19
  import type { KbBranch, OnServerStart, ServerStartContext, StepResult } from '../on-server-start.js';
20
+ import type { KbContext } from '../../../../shared/kb-context.js';
21
21
  import { withoutIgnoreLine } from './template-files.step.js';
22
22
  import { PluginLayout, hasManifestEntry } from './plugin-layout.js';
23
23
 
@@ -163,10 +163,18 @@ export class GroupsToPluginsStep implements OnServerStart {
163
163
  /** The plugin-shaped questions, answered the same way the manifests step answers them. */
164
164
  private readonly layout: PluginLayout;
165
165
 
166
- constructor(private readonly disk: IFsProbe & ITreeWalker) {
166
+ constructor(
167
+ private readonly disk: IFsProbe & ITreeWalker,
168
+ /** Read per run, never captured: the setup-completing save may rename the plugins root first. */
169
+ private readonly kb: Pick<KbContext, 'layout'>,
170
+ ) {
167
171
  this.layout = new PluginLayout(disk);
168
172
  }
169
173
 
174
+ private get pluginsDir(): string {
175
+ return this.kb.layout.pluginsDir;
176
+ }
177
+
170
178
  async run(ctx: ServerStartContext): Promise<StepResult> {
171
179
  const refusals: string[] = [];
172
180
  for (const branch of await ctx.allBranches()) {
@@ -184,7 +192,7 @@ export class GroupsToPluginsStep implements OnServerStart {
184
192
  private async migrateBranch(branch: KbBranch, refusals: string[]): Promise<void> {
185
193
  const repoDir = await branch.repoDir();
186
194
  const legacyDir = path.join(repoDir, LEGACY_GROUPS_DIR);
187
- const pluginsDir = path.join(repoDir, PLUGINS_DIR);
195
+ const pluginsDir = path.join(repoDir, this.pluginsDir);
188
196
 
189
197
  const hasLegacy = await this.disk.isDirectory(legacyDir);
190
198
  const hasPlugins = await this.disk.isDirectory(pluginsDir);
@@ -199,9 +207,9 @@ export class GroupsToPluginsStep implements OnServerStart {
199
207
  // template-files.step.ts's reserved-dir check).
200
208
  if (!hasPlugins && (await this.disk.exists(pluginsDir))) {
201
209
  throw new Error(
202
- `Branch "${branch.name}": "${PLUGINS_DIR}" exists but is not a directory` +
203
- (hasLegacy ? `, so ${LEGACY_GROUPS_DIR}/ cannot be renamed to ${PLUGINS_DIR}/` : '') +
204
- `. Remove or rename the "${PLUGINS_DIR}" entry — the platform requires this name to be a folder.`,
210
+ `Branch "${branch.name}": "${this.pluginsDir}" exists but is not a directory` +
211
+ (hasLegacy ? `, so ${LEGACY_GROUPS_DIR}/ cannot be renamed to ${this.pluginsDir}/` : '') +
212
+ `. Remove or rename the "${this.pluginsDir}" entry — the platform requires this name to be a folder.`,
205
213
  );
206
214
  }
207
215
 
@@ -216,7 +224,7 @@ export class GroupsToPluginsStep implements OnServerStart {
216
224
  // branch with both roots (refused below) or neither (nothing to migrate)
217
225
  // is no less stale. Idempotent: nothing to drop, nothing declared.
218
226
  const changed = await this.retireIgnoreRootRules(repoDir, branch, details);
219
- const retiredSubject = `Retire the stale ${LEGACY_GROUPS_DIR}/ and ${PLUGINS_DIR}/ ignore rules`;
227
+ const retiredSubject = `Retire the stale ${LEGACY_GROUPS_DIR}/ and ${this.pluginsDir}/ ignore rules`;
220
228
 
221
229
  if (hasLegacy && hasPlugins) {
222
230
  // Both present: somebody is mid-migration by hand, or two branches merged
@@ -226,12 +234,12 @@ export class GroupsToPluginsStep implements OnServerStart {
226
234
  // ops, only a note (which surfaces in a commit only if the ignore
227
235
  // retirement above, or a later step, dirties it).
228
236
  log.warn(
229
- `${branch.name}: both ${LEGACY_GROUPS_DIR}/ and ${PLUGINS_DIR}/ exist — leaving both alone. ` +
230
- `Merge ${LEGACY_GROUPS_DIR}/ into ${PLUGINS_DIR}/ by hand; nothing is being migrated automatically.`,
237
+ `${branch.name}: both ${LEGACY_GROUPS_DIR}/ and ${this.pluginsDir}/ exist — leaving both alone. ` +
238
+ `Merge ${LEGACY_GROUPS_DIR}/ into ${this.pluginsDir}/ by hand; nothing is being migrated automatically.`,
231
239
  );
232
240
  if (changed) branch.note(retiredSubject);
233
241
  branch.note(
234
- `${LEGACY_GROUPS_DIR}/ and ${PLUGINS_DIR}/ both exist — merge by hand; nothing was migrated automatically`,
242
+ `${LEGACY_GROUPS_DIR}/ and ${this.pluginsDir}/ both exist — merge by hand; nothing was migrated automatically`,
235
243
  );
236
244
  for (const line of details) branch.note(line);
237
245
  return;
@@ -255,8 +263,8 @@ export class GroupsToPluginsStep implements OnServerStart {
255
263
  let migrated = false;
256
264
  if (hasLegacy) {
257
265
  // The Groups→Plugins root rename is ONE declared op, directory and all.
258
- branch.move(LEGACY_GROUPS_DIR, PLUGINS_DIR);
259
- details.push(`${LEGACY_GROUPS_DIR}/ → ${PLUGINS_DIR}/`);
266
+ branch.move(LEGACY_GROUPS_DIR, this.pluginsDir);
267
+ details.push(`${LEGACY_GROUPS_DIR}/ → ${this.pluginsDir}/`);
260
268
  migrated = true;
261
269
  }
262
270
 
@@ -284,9 +292,9 @@ export class GroupsToPluginsStep implements OnServerStart {
284
292
  // was not reorganised.
285
293
  branch.note(
286
294
  hasLegacy
287
- ? `Move ${LEGACY_GROUPS_DIR}/ to ${PLUGINS_DIR}/ (Agent Plugins layout)`
295
+ ? `Move ${LEGACY_GROUPS_DIR}/ to ${this.pluginsDir}/ (Agent Plugins layout)`
288
296
  : migrated
289
- ? `Reorganise ${PLUGINS_DIR}/ to the Agent Plugins layout`
297
+ ? `Reorganise ${this.pluginsDir}/ to the Agent Plugins layout`
290
298
  : retiredSubject,
291
299
  );
292
300
  for (const line of details) branch.note(line);
@@ -321,7 +329,7 @@ export class GroupsToPluginsStep implements OnServerStart {
321
329
  if (isAbsence(err)) return false;
322
330
  throw err;
323
331
  }
324
- const stale = [`${LEGACY_GROUPS_DIR}/`, `${PLUGINS_DIR}/`];
332
+ const stale = [`${LEGACY_GROUPS_DIR}/`, `${this.pluginsDir}/`];
325
333
  const present = stale.filter((rule) => current.split('\n').some((l) => l.trim() === rule));
326
334
  if (present.length === 0) return false;
327
335
  // The same drop the template step makes, so a platform comment above a
@@ -344,7 +352,7 @@ export class GroupsToPluginsStep implements OnServerStart {
344
352
  details: string[],
345
353
  refusals: string[],
346
354
  ): Promise<boolean> {
347
- const relPlugin = `${PLUGINS_DIR}/${folderName}`;
355
+ const relPlugin = `${this.pluginsDir}/${folderName}`;
348
356
  let changed = false;
349
357
 
350
358
  const entries = await this.disk.listDir(folderDir);
@@ -1,6 +1,7 @@
1
1
  import fs from 'node:fs/promises';
2
2
  import path from 'node:path';
3
- import { PLUGINS_DIR, isPersonalPluginFolder } from '@bevel-software/platform-shared';
3
+ import { isPersonalPluginFolder } from '@bevel-software/platform-shared';
4
+ import type { KbContext } from '../../../../shared/kb-context.js';
4
5
  import {
5
6
  EVERYONE_CANONICAL,
6
7
  KNOWN_VERBS,
@@ -41,7 +42,15 @@ import type { KbBranch, OnServerStart, ServerStartContext, StepResult } from '..
41
42
  export class PersonalSpacesStep implements OnServerStart {
42
43
  readonly name = 'personal-spaces';
43
44
 
44
- constructor(private readonly disk: IFsProbe) {}
45
+ constructor(
46
+ private readonly disk: IFsProbe,
47
+ /** Read per run, never captured: the setup-completing save may rename the plugins root first. */
48
+ private readonly kb: Pick<KbContext, 'layout'>,
49
+ ) {}
50
+
51
+ private get pluginsDir(): string {
52
+ return this.kb.layout.pluginsDir;
53
+ }
45
54
 
46
55
  async run(ctx: ServerStartContext): Promise<StepResult> {
47
56
  for (const branch of await ctx.allBranches()) {
@@ -52,12 +61,12 @@ export class PersonalSpacesStep implements OnServerStart {
52
61
 
53
62
  private async closePersonalSpaces(branch: KbBranch): Promise<void> {
54
63
  const repoDir = await branch.repoDir();
55
- const entries = await this.disk.listDir(path.join(repoDir, PLUGINS_DIR));
64
+ const entries = await this.disk.listDir(path.join(repoDir, this.pluginsDir));
56
65
  if (entries === null) return;
57
66
  const closed: string[] = [];
58
67
  for (const entry of entries) {
59
68
  if (!entry.isDirectory() || !isPersonalPluginFolder(entry.name)) continue;
60
- const rel = `${PLUGINS_DIR}/${entry.name}/access.md`;
69
+ const rel = `${this.pluginsDir}/${entry.name}/access.md`;
61
70
  let text: string;
62
71
  try {
63
72
  text = await fs.readFile(path.join(repoDir, rel), 'utf8');
@@ -72,7 +81,7 @@ export class PersonalSpacesStep implements OnServerStart {
72
81
  }
73
82
  if (closed.length === 0) return;
74
83
  branch.note(`Keep ${closed.length === 1 ? 'a personal space' : `${closed.length} personal spaces`} private`);
75
- for (const name of closed) branch.note(`${PLUGINS_DIR}/${name}/access.md: read denies everyone`);
84
+ for (const name of closed) branch.note(`${this.pluginsDir}/${name}/access.md: read denies everyone`);
76
85
  }
77
86
  }
78
87
 
@@ -1,10 +1,10 @@
1
1
  import path from 'node:path';
2
2
  import {
3
- PLUGINS_DIR,
4
3
  PLUGIN_MANIFEST_FILE,
5
4
  pluginDisplayNameOf,
6
5
  } from '@bevel-software/platform-shared';
7
6
  import type { IFsProbe, ITreeWalker } from '../../../../shared/fs.contract.js';
7
+ import type { KbContext } from '../../../../shared/kb-context.js';
8
8
  import { hasManifestEntry } from './plugin-layout.js';
9
9
  import type { KbBranch, OnServerStart, ServerStartContext, StepResult } from '../on-server-start.js';
10
10
 
@@ -52,7 +52,15 @@ import type { KbBranch, OnServerStart, ServerStartContext, StepResult } from '..
52
52
  export class PluginDisplayNamesStep implements OnServerStart {
53
53
  readonly name = 'plugin-display-names';
54
54
 
55
- constructor(private readonly disk: IFsProbe & ITreeWalker) {}
55
+ constructor(
56
+ private readonly disk: IFsProbe & ITreeWalker,
57
+ /** Read per run, never captured: the setup-completing save may rename the plugins root first. */
58
+ private readonly kb: Pick<KbContext, 'layout'>,
59
+ ) {}
60
+
61
+ private get pluginsDir(): string {
62
+ return this.kb.layout.pluginsDir;
63
+ }
56
64
 
57
65
  async run(ctx: ServerStartContext): Promise<StepResult> {
58
66
  for (const branch of await ctx.allBranches()) {
@@ -63,7 +71,7 @@ export class PluginDisplayNamesStep implements OnServerStart {
63
71
 
64
72
  private async backfill(branch: KbBranch): Promise<void> {
65
73
  const repoDir = await branch.repoDir();
66
- const root = path.join(repoDir, PLUGINS_DIR);
74
+ const root = path.join(repoDir, this.pluginsDir);
67
75
 
68
76
  // Plugin folders by the judgement discovery makes, entry for entry: a
69
77
  // manifest as a REGULAR file, and nothing beneath a plugin is a plugin.
@@ -119,7 +127,7 @@ export class PluginDisplayNamesStep implements OnServerStart {
119
127
  // the file for no change anyone can see.
120
128
  if (folderName === pluginDisplayNameOf(manifest)) continue;
121
129
  branch.write(
122
- `${PLUGINS_DIR}/${rel}/${PLUGIN_MANIFEST_FILE}`,
130
+ `${this.pluginsDir}/${rel}/${PLUGIN_MANIFEST_FILE}`,
123
131
  `${JSON.stringify(withDisplayName(manifest, folderName), null, 2)}\n`,
124
132
  );
125
133
  filled.push(rel);
@@ -131,7 +139,7 @@ export class PluginDisplayNamesStep implements OnServerStart {
131
139
  ? "Record a plugin's display name in its manifest"
132
140
  : `Record the display names of ${filled.length} plugins in their manifests`,
133
141
  );
134
- for (const rel of filled) branch.note(`${PLUGINS_DIR}/${rel}: displayName "${path.posix.basename(rel)}"`);
142
+ for (const rel of filled) branch.note(`${this.pluginsDir}/${rel}: displayName "${path.posix.basename(rel)}"`);
135
143
  }
136
144
  }
137
145
 
@@ -1,6 +1,7 @@
1
1
  import path from 'node:path';
2
- import { PLUGINS_DIR, PLUGIN_MANIFEST_FILE, renderPluginManifest } from '@bevel-software/platform-shared';
2
+ import { PLUGIN_MANIFEST_FILE, renderPluginManifest } from '@bevel-software/platform-shared';
3
3
  import type { ITreeWalker, WalkedEntry } from '../../../../shared/fs.contract.js';
4
+ import type { KbContext } from '../../../../shared/kb-context.js';
4
5
  import { PluginLayout, hasManifestEntry } from './plugin-layout.js';
5
6
  import type { KbBranch, OnServerStart, ServerStartContext, StepResult } from '../on-server-start.js';
6
7
 
@@ -39,10 +40,18 @@ export class PluginManifestsStep implements OnServerStart {
39
40
 
40
41
  private readonly layout: PluginLayout;
41
42
 
42
- constructor(private readonly disk: ITreeWalker) {
43
+ constructor(
44
+ private readonly disk: ITreeWalker,
45
+ /** Read per run, never captured: the setup-completing save may rename the plugins root first. */
46
+ private readonly kb: Pick<KbContext, 'layout'>,
47
+ ) {
43
48
  this.layout = new PluginLayout(disk);
44
49
  }
45
50
 
51
+ private get pluginsDir(): string {
52
+ return this.kb.layout.pluginsDir;
53
+ }
54
+
46
55
  async run(ctx: ServerStartContext): Promise<StepResult> {
47
56
  for (const branch of await ctx.allBranches()) {
48
57
  await this.addManifests(branch);
@@ -52,7 +61,7 @@ export class PluginManifestsStep implements OnServerStart {
52
61
 
53
62
  private async addManifests(branch: KbBranch): Promise<void> {
54
63
  const repoDir = await branch.repoDir();
55
- const root = path.join(repoDir, PLUGINS_DIR);
64
+ const root = path.join(repoDir, this.pluginsDir);
56
65
  const added: string[] = [];
57
66
 
58
67
  // A plugin is a folder whose OWN listing holds a manifest as a regular
@@ -78,13 +87,13 @@ export class PluginManifestsStep implements OnServerStart {
78
87
  // A grouping folder — plugins beneath it — is never a plugin itself.
79
88
  if (plugins.some((p) => p.startsWith(`${rel}/`))) continue;
80
89
  if (!(await this.layout.looksLikeLegacyPlugin(path.join(root, rel), entries))) continue;
81
- branch.write(`${PLUGINS_DIR}/${rel}/${PLUGIN_MANIFEST_FILE}`, renderPluginManifest(rel));
90
+ branch.write(`${this.pluginsDir}/${rel}/${PLUGIN_MANIFEST_FILE}`, renderPluginManifest(rel));
82
91
  added.push(rel);
83
92
  }
84
93
  if (added.length === 0) return;
85
94
  branch.note(
86
95
  `Add plugin manifests to ${added.length === 1 ? 'a legacy plugin folder' : `${added.length} legacy plugin folders`}`,
87
96
  );
88
- for (const rel of added) branch.note(`${PLUGINS_DIR}/${rel}: ${PLUGIN_MANIFEST_FILE} written`);
97
+ for (const rel of added) branch.note(`${this.pluginsDir}/${rel}: ${PLUGIN_MANIFEST_FILE} written`);
89
98
  }
90
99
  }
@@ -1,11 +1,11 @@
1
1
  import fs from 'node:fs/promises';
2
2
  import path from 'node:path';
3
3
  import {
4
- AGENTS_FILE,
5
4
  LEGACY_AGENTS_FILE,
6
5
  renderKbLayoutPlaceholders,
7
6
  } from '@bevel-software/platform-shared';
8
7
  import type { IFsProbe, ITreeWalker } from '../../../../shared/fs.contract.js';
8
+ import type { KbContext } from '../../../../shared/kb-context.js';
9
9
  import { renderRolesYaml } from '../../../access-model/render-roles-yaml.js';
10
10
  import { reservedRootDirs } from './template-files.step.js';
11
11
  import { TEMPLATE_SOURCE_FALLBACKS, TemplateSource } from './template-source.js';
@@ -36,11 +36,12 @@ export function buildSeedTree(
36
36
  templateDir: string,
37
37
  extraRootDirs: readonly string[],
38
38
  seedAdminEmails: readonly string[],
39
+ /** Read per seed, never captured: the setup-completing save may apply the layout after this builder was composed. */
40
+ kb: Pick<KbContext, 'layout'>,
39
41
  ): (dir: string) => Promise<string[]> {
40
- // Validated eagerly; resolved per seed. The core roots are live bindings the
41
- // setup-completing save may configure after this builder was composed.
42
- reservedRootDirs(extraRootDirs);
43
- const seeder = new KbSeedTree(disk, new TemplateSource(disk, templateDir), extraRootDirs, seedAdminEmails);
42
+ // Validated eagerly; resolved per seed.
43
+ reservedRootDirs(extraRootDirs, kb.layout);
44
+ const seeder = new KbSeedTree(disk, new TemplateSource(disk, templateDir, kb), extraRootDirs, seedAdminEmails, kb);
44
45
  return (dir) => seeder.seed(dir);
45
46
  }
46
47
 
@@ -58,6 +59,7 @@ class KbSeedTree {
58
59
  private readonly templates: TemplateSource,
59
60
  private readonly extraRootDirs: readonly string[],
60
61
  private readonly seedAdminEmails: readonly string[],
62
+ private readonly kb: Pick<KbContext, 'layout'>,
61
63
  ) {}
62
64
 
63
65
  /** Fill `dir` with a complete knowledge base; resolve to what was GENERATED. */
@@ -72,7 +74,7 @@ class KbSeedTree {
72
74
  // root never gets a pointless placeholder beside it.
73
75
  // Resolved NOW, not when the builder was composed: a seed that runs on the
74
76
  // save completing first-run setup must lay down the names that save applied.
75
- for (const rootDir of reservedRootDirs(this.extraRootDirs)) {
77
+ for (const rootDir of reservedRootDirs(this.extraRootDirs, this.kb.layout)) {
76
78
  const abs = path.join(dir, rootDir);
77
79
  const found = await this.disk.lstatOrNull(abs);
78
80
  if (found) {
@@ -149,7 +151,7 @@ class KbSeedTree {
149
151
  // `AGENTS.md` this seed had just laid down — two commits saying opposite
150
152
  // things about a knowledge base nobody had used yet.
151
153
  if (relDir === '' && name === LEGACY_AGENTS_FILE) {
152
- await this.copyTemplateFile(name, dest, AGENTS_FILE);
154
+ await this.copyTemplateFile(name, dest, this.kb.layout.agentsFile);
153
155
  return;
154
156
  }
155
157
  // TWO template entries, ONE destination. A custom template that happens to
@@ -161,7 +163,7 @@ class KbSeedTree {
161
163
  // is the file the platform owns, refreshes from the packaged template on
162
164
  // every start and tells every agent to read. The twin is skipped, on the
163
165
  // same reasoning as the packable spelling above.
164
- if (relDir === '' && name === AGENTS_FILE && (await this.templates.carries(LEGACY_AGENTS_FILE))) {
166
+ if (relDir === '' && name === this.kb.layout.agentsFile && (await this.templates.carries(LEGACY_AGENTS_FILE))) {
165
167
  return;
166
168
  }
167
169
  await this.copyTemplateFile(relDir ? path.join(relDir, name) : name, dest);
@@ -190,7 +192,7 @@ class KbSeedTree {
190
192
  if (text === null) {
191
193
  await fs.copyFile(from, to);
192
194
  } else {
193
- await fs.writeFile(to, renderKbLayoutPlaceholders(text), 'utf8');
195
+ await fs.writeFile(to, renderKbLayoutPlaceholders(text, this.kb.layout), 'utf8');
194
196
  }
195
197
  await fs.chmod(to, (await fs.stat(from)).mode & 0o777);
196
198
  }
@@ -1,18 +1,16 @@
1
1
  import fs from 'node:fs/promises';
2
2
  import path from 'node:path';
3
3
  import {
4
- AGENTS_FILE,
5
- KNOWLEDGE_BASE_DIR,
6
4
  LEGACY_AGENTS_FILE,
7
- PLUGINS_DIR,
8
- SKILLS_DIR,
9
5
  agentsFilePointerSentence,
10
6
  gitignoreLiteral,
11
7
  mentionsAgentsFile,
12
8
  retargetAgentsFilePointer,
13
9
  validateKbRootName,
10
+ type KbLayout,
14
11
  } from '@bevel-software/platform-shared';
15
12
  import { IGNORE_FILENAME, isAbsence, type IFsProbe } from '../../../../shared/fs.contract.js';
13
+ import type { KbContext } from '../../../../shared/kb-context.js';
16
14
  import { PREAMBLE_FILE } from '../../../agent-instructions/compose.js';
17
15
  import { TemplateSource } from './template-source.js';
18
16
  import type { KbBranch, OnServerStart, ServerStartContext, StepResult } from '../on-server-start.js';
@@ -38,14 +36,14 @@ const PREAMBLE_IGNORE_PATTERN = `/${PREAMBLE_FILE}`;
38
36
  * generated from `ADMIN_EMAIL` (see roles-yaml.step.ts), so a repo can't be
39
37
  * seeded with a stale hard-coded Admin list.
40
38
  */
41
- export function requiredFiles(): readonly string[] {
39
+ export function requiredFiles(layout: Required<KbLayout>): readonly string[] {
42
40
  return [
43
41
  'access.md',
44
42
  // The managed agent guide, under whatever this deployment calls it. The
45
43
  // PACKAGED template still carries it as `AGENTS.md` — one file, one
46
44
  // spelling in the tarball — so the write target and the template source
47
45
  // part company here and nowhere else (see {@link templateNameOf}).
48
- AGENTS_FILE,
46
+ layout.agentsFile,
49
47
  '.bevelignore',
50
48
  '.gitignore',
51
49
  // The deployment preamble every connected agent is told at session start
@@ -61,8 +59,8 @@ export function requiredFiles(): readonly string[] {
61
59
  * name on disk is a deployment's choice while its name in the template is
62
60
  * fixed; everything else is spelled the same on both sides.
63
61
  */
64
- function templateNameOf(repoRel: string): string {
65
- return repoRel === AGENTS_FILE ? LEGACY_AGENTS_FILE : repoRel;
62
+ function templateNameOf(repoRel: string, agentsFile: string): string {
63
+ return repoRel === agentsFile ? LEGACY_AGENTS_FILE : repoRel;
66
64
  }
67
65
 
68
66
  /**
@@ -105,11 +103,11 @@ export const GENERATED_FILES: readonly string[] = ['roles.yaml'];
105
103
  * that has them still renders them as roots rather than folding them into
106
104
  * Knowledge.
107
105
  *
108
- * A function: the three names are deployment-configurable live bindings, and
106
+ * A function of the layout: the three names are deployment-configurable, and
109
107
  * a module-scope array would snapshot the defaults before configuration.
110
108
  */
111
- function coreRequiredDirs(): readonly string[] {
112
- return [KNOWLEDGE_BASE_DIR, SKILLS_DIR, PLUGINS_DIR];
109
+ function coreRequiredDirs(layout: Required<KbLayout>): readonly string[] {
110
+ return [layout.knowledgeBaseDir, layout.skillsDir, layout.pluginsDir];
113
111
  }
114
112
 
115
113
  /**
@@ -145,20 +143,20 @@ function assertRootSegment(dir: string): void {
145
143
  * base. Shared with the empty-remote seed builder (seed-tree.ts) so the two
146
144
  * paths can never disagree about what a deployment guarantees.
147
145
  */
148
- export function reservedRootDirs(extraRootDirs: readonly string[]): readonly string[] {
146
+ export function reservedRootDirs(extraRootDirs: readonly string[], layout: Required<KbLayout>): readonly string[] {
149
147
  for (const dir of extraRootDirs) {
150
148
  assertRootSegment(dir);
151
149
  // A root named after a required OR generated FILE is a typo with a silent
152
150
  // outcome: the file is laid down first, so the dir check finds the path
153
151
  // taken and skips it, and the directory the caller asked for never appears
154
152
  // with nothing said about why.
155
- if (requiredFiles().includes(dir) || GENERATED_FILES.includes(dir)) {
153
+ if (requiredFiles(layout).includes(dir) || GENERATED_FILES.includes(dir)) {
156
154
  throw new Error(
157
155
  `Reserved KB root "${dir}" collides with a required or generated file of the same name`,
158
156
  );
159
157
  }
160
158
  }
161
- return [...coreRequiredDirs(), ...extraRootDirs];
159
+ return [...coreRequiredDirs(layout), ...extraRootDirs];
162
160
  }
163
161
 
164
162
  /**
@@ -195,15 +193,18 @@ export class TemplateFilesStep implements OnServerStart {
195
193
  */
196
194
  constructor(
197
195
  private readonly disk: IFsProbe,
196
+ /**
197
+ * Read per run, never captured: the save that completes first-run setup
198
+ * applies the admin's names after this step was built. A snapshot taken
199
+ * here scaffolded `Skills/` beside the `skills/` they had just chosen.
200
+ */
201
+ private readonly kb: Pick<KbContext, 'layout'>,
198
202
  private readonly extraRootDirs: readonly string[] = [],
199
203
  private readonly agentsFileLink: () => boolean = () => true,
200
204
  ) {
201
205
  // Validated NOW, so a bad extra fails at boot beside the rest of the
202
- // wiring — but the list itself is NOT kept: the core roots are live
203
- // bindings, and the save that completes first-run setup applies the
204
- // admin's names after this step was built. A snapshot taken here
205
- // scaffolded `Skills/` beside the `skills/` they had just chosen.
206
- reservedRootDirs(extraRootDirs);
206
+ // wiring — but the list itself is NOT kept, for the reason `kb` says.
207
+ reservedRootDirs(extraRootDirs, kb.layout);
207
208
  }
208
209
 
209
210
  async run(ctx: ServerStartContext): Promise<StepResult> {
@@ -217,15 +218,16 @@ export class TemplateFilesStep implements OnServerStart {
217
218
  // The template directory is runtime data (the start context's), the disk
218
219
  // port is the injected dependency — bound together once here so nothing
219
220
  // below has to carry either as an argument.
220
- const templates = new TemplateSource(this.disk, templateDir);
221
+ const templates = new TemplateSource(this.disk, templateDir, this.kb);
221
222
  const repoDir = await branch.repoDir();
222
223
  const added: string[] = [];
223
- // Read ONCE per branch: the name is a live binding, and a value re-read
224
- // between the write and the ignore rule could disagree with itself.
225
- const agentsFile = AGENTS_FILE;
224
+ // Read ONCE per branch: a value re-read between the write and the ignore
225
+ // rule could disagree with itself.
226
+ const layout = this.kb.layout;
227
+ const agentsFile = layout.agentsFile;
226
228
  const renamed = agentsFile !== LEGACY_AGENTS_FILE;
227
229
 
228
- for (const rel of requiredFiles()) {
230
+ for (const rel of requiredFiles(layout)) {
229
231
  // `lstat`, not `exists`: a DIRECTORY or SYMLINK squatting a required
230
232
  // file's name would read as "present", and a skip-if-present check
231
233
  // would then report success over a knowledge base whose root access
@@ -240,7 +242,7 @@ export class TemplateFilesStep implements OnServerStart {
240
242
  'Remove or rename it — the platform requires this name to be a readable file.',
241
243
  );
242
244
  }
243
- let content = await templates.read(templateNameOf(rel));
245
+ let content = await templates.read(templateNameOf(rel, agentsFile));
244
246
  // The on-disk merge below only runs against an EXISTING ignore file; a
245
247
  // freshly-declared one was merely assumed to carry the guide's rule —
246
248
  // true of the packaged template, not necessarily of a distribution's
@@ -259,10 +261,14 @@ export class TemplateFilesStep implements OnServerStart {
259
261
  content = withPlatformIgnorePatternRespelled(content, PREAMBLE_FILE, PREAMBLE_IGNORE_PATTERN);
260
262
  content = withoutIgnoreLine(
261
263
  withoutPlatformIgnorePattern(
262
- withIgnorePattern(withIgnorePattern(content, gitignoreLiteral(agentsFile)), PREAMBLE_IGNORE_PATTERN),
263
- `${SKILLS_DIR}/`,
264
+ withIgnorePattern(
265
+ withIgnorePattern(content, gitignoreLiteral(agentsFile), agentsFile),
266
+ PREAMBLE_IGNORE_PATTERN,
267
+ agentsFile,
268
+ ),
269
+ `${layout.skillsDir}/`,
264
270
  ),
265
- `${PLUGINS_DIR}/`,
271
+ `${layout.pluginsDir}/`,
266
272
  );
267
273
  // …and a template (a distribution's, a stale packaged one) still
268
274
  // hiding `AGENTS.md` while this deployment's guide is called something
@@ -316,8 +322,8 @@ export class TemplateFilesStep implements OnServerStart {
316
322
  // As a gitignore PATTERN: a guide name that reads as syntax there is
317
323
  // escaped, or the rule would hide nothing.
318
324
  add: [gitignoreLiteral(agentsFile), PREAMBLE_IGNORE_PATTERN],
319
- drop: [`${SKILLS_DIR}/`],
320
- dropEvery: [`${PLUGINS_DIR}/`],
325
+ drop: [`${this.kb.layout.skillsDir}/`],
326
+ dropEvery: [`${this.kb.layout.pluginsDir}/`],
321
327
  // The guide's rule FOLLOWS its name. Once the guide is `HEXIS.md`, the
322
328
  // root's `AGENTS.md` is the customer's own conventions file and they
323
329
  // must be able to see and edit it in the app — so the platform's own
@@ -472,7 +478,7 @@ export class TemplateFilesStep implements OnServerStart {
472
478
  */
473
479
  private async missingDirs(repoDir: string): Promise<string[]> {
474
480
  const missing: string[] = [];
475
- for (const rootDir of reservedRootDirs(this.extraRootDirs)) {
481
+ for (const rootDir of reservedRootDirs(this.extraRootDirs, this.kb.layout)) {
476
482
  const found = await this.disk.lstatOrNull(path.join(repoDir, rootDir));
477
483
  if (found) {
478
484
  if (found.isDirectory()) continue;
@@ -547,7 +553,10 @@ export class TemplateFilesStep implements OnServerStart {
547
553
  (text, [from, to]) => withPlatformIgnorePatternRespelled(text, from, to),
548
554
  current,
549
555
  );
550
- const added = rules.add.reduce((text, pattern) => withIgnorePattern(text, pattern), respelled);
556
+ const added = rules.add.reduce(
557
+ (text, pattern) => withIgnorePattern(text, pattern, this.kb.layout.agentsFile),
558
+ respelled,
559
+ );
551
560
  const dropped = (rules.dropEvery ?? []).reduce(
552
561
  (text, pattern) => withoutIgnoreLine(text, pattern),
553
562
  rules.drop.reduce((text, pattern) => withoutPlatformIgnorePattern(text, pattern), added),
@@ -796,7 +805,7 @@ function withPlatformIgnorePatternRespelled(text: string, from: string, to: stri
796
805
  * still standing here is the operator's: it already hides the file, and
797
806
  * appending the anchored rule beside it would say nothing they have not.
798
807
  */
799
- function withIgnorePattern(text: string, pattern: string): string {
808
+ function withIgnorePattern(text: string, pattern: string, agentsFile: string): string {
800
809
  const lines = text.split('\n').map((l) => l.trim());
801
810
  const operatorPreambleRule =
802
811
  pattern === PREAMBLE_IGNORE_PATTERN &&
@@ -808,7 +817,7 @@ function withIgnorePattern(text: string, pattern: string): string {
808
817
  const comment =
809
818
  pattern === PREAMBLE_IGNORE_PATTERN
810
819
  ? PREAMBLE_RULE_COMMENT
811
- : pattern === gitignoreLiteral(AGENTS_FILE)
820
+ : pattern === gitignoreLiteral(agentsFile)
812
821
  ? AGENTS_RULE_COMMENT
813
822
  : PLATFORM_RULE_COMMENT;
814
823
  return `${text}${separator}\n${comment}\n${pattern}\n`;
@@ -1,6 +1,7 @@
1
1
  import path from 'node:path';
2
- import { agentsFileOf, currentKbLayout, gitignoreLiteral, renderKbLayoutPlaceholders } from '@bevel-software/platform-shared';
2
+ import { gitignoreLiteral, renderKbLayoutPlaceholders } from '@bevel-software/platform-shared';
3
3
  import { IGNORE_FILENAME, isAbsence, type EntryStat, type IFsProbe } from '../../../../shared/fs.contract.js';
4
+ import type { KbContext } from '../../../../shared/kb-context.js';
4
5
  import { PREAMBLE_FILE } from '../../../agent-instructions/compose.js';
5
6
  import { defaultKbTemplateDir } from '../../../../assets.js';
6
7
  import { logger } from '../../../../shared/logging.js';
@@ -57,6 +58,8 @@ export class TemplateSource {
57
58
  constructor(
58
59
  private readonly disk: IFsProbe,
59
60
  private readonly templateDir: string,
61
+ /** The layout the placeholders render as — read per file, so a name applied by setup is the one written. */
62
+ private readonly kb: Pick<KbContext, 'layout'>,
60
63
  ) {}
61
64
 
62
65
  /**
@@ -125,7 +128,7 @@ export class TemplateSource {
125
128
  );
126
129
  // The packaged copy, read the same way — it renders its own
127
130
  // placeholders and cannot fall back again (its guard is this one).
128
- return new TemplateSource(this.disk, packaged).read(relPath);
131
+ return new TemplateSource(this.disk, packaged, this.kb).read(relPath);
129
132
  }
130
133
  // In the ignore file the guide's name is a PATTERN, and a name gitignore
131
134
  // reads as syntax (`#Guide.md`, `!Guide.md`, brackets) would hide nothing
@@ -133,11 +136,11 @@ export class TemplateSource {
133
136
  // placeholder is prose. ONE render, with the escaped name as the layout's
134
137
  // — a second pass over the rendered text would read a name that happens
135
138
  // to contain a placeholder as one.
139
+ const layout = this.kb.layout;
136
140
  if (relPath === IGNORE_FILENAME) {
137
- const layout = currentKbLayout();
138
- return renderKbLayoutPlaceholders(raw, { ...layout, agentsFile: gitignoreLiteral(agentsFileOf(layout)) });
141
+ return renderKbLayoutPlaceholders(raw, { ...layout, agentsFile: gitignoreLiteral(layout.agentsFile) });
139
142
  }
140
- return renderKbLayoutPlaceholders(raw);
143
+ return renderKbLayoutPlaceholders(raw, layout);
141
144
  }
142
145
 
143
146
  /**