@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
@@ -38,8 +38,6 @@ import type { IFsProbe } from '../../shared/fs.contract.js';
38
38
  import type { Discovery, PluginSource } from './discovery/plugin-source.js';
39
39
 
40
40
  import {
41
- DEFAULT_BRANCH,
42
- PLUGINS_DIR,
43
41
  PLUGIN_MANIFEST_FILE,
44
42
  PLUGIN_SKILLS_DIR,
45
43
  pluginDisplayNameOf,
@@ -52,6 +50,7 @@ import {
52
50
  validateFilename,
53
51
  type AuthUser,
54
52
  } from '@bevel-software/platform-shared';
53
+ import type { KbContext } from '../../shared/kb-context.js';
55
54
  import type { WorkspaceService } from '../workspace/workspace.service.js';
56
55
  import type { IAccessControl } from '../access/access-control.interface.js';
57
56
  import { creatorPrincipal } from '../access-model/creator.js';
@@ -65,7 +64,8 @@ export interface ProvisionCommitDriver {
65
64
  branch: string,
66
65
  targetPath: string,
67
66
  user: AuthUser,
68
- opts?: { systemAuthorized?: boolean },
67
+ /** `summary` overrides the path-derived commit subject — see `GitService.commitFile`. */
68
+ opts?: { systemAuthorized?: boolean; summary?: string },
69
69
  ): Promise<void>;
70
70
  }
71
71
 
@@ -129,8 +129,14 @@ export class PluginProvisionError extends Error {
129
129
  }
130
130
 
131
131
  /** The one shape every provisioning answer has: the folder in both spellings, and where its skills go. */
132
- function provisioned(folder: string, name: string, displayName: string, created: boolean): ProvisionedPlugin {
133
- const path = `${PLUGINS_DIR}/${folder}`;
132
+ function provisioned(
133
+ pluginsDir: string,
134
+ folder: string,
135
+ name: string,
136
+ displayName: string,
137
+ created: boolean,
138
+ ): ProvisionedPlugin {
139
+ const path = `${pluginsDir}/${folder}`;
134
140
  return { folder, path, skillsDir: `${path}/${PLUGIN_SKILLS_DIR}`, name, displayName, created };
135
141
  }
136
142
 
@@ -149,13 +155,22 @@ export class PluginProvisionService {
149
155
  private readonly workspaceService: WorkspaceService,
150
156
  private readonly commits: ProvisionCommitDriver,
151
157
  private readonly accessControl: IAccessControl,
152
- private readonly kbDirName: string,
158
+ private readonly kb: KbContext,
153
159
  private readonly events: { emit(event: { kind: 'fs-tree-changed'; workspaceId: string; branch: string }): void } | undefined,
154
160
  /** Which names are TAKEN is discovery's answer — the same one every catalog gets. */
155
161
  private readonly source: PluginSource,
156
162
  private readonly disk: IFsProbe,
157
163
  ) {}
158
164
 
165
+ private get kbDirName(): string {
166
+ return this.kb.kbDirName;
167
+ }
168
+
169
+ /** The plugins root's name, read per use: a deployment may rename it from the setup screen. */
170
+ private get pluginsRoot(): string {
171
+ return this.kb.layout.pluginsDir;
172
+ }
173
+
159
174
  /**
160
175
  * Create `Plugins/<name>/` — or `Plugins/<parent>/<name>/` — for `user`.
161
176
  * Throws `PluginProvisionError` 422 on a name the filesystem or the model
@@ -226,7 +241,7 @@ export class PluginProvisionService {
226
241
  // `name` is the creator's own spelling, trimmed — the folder's leaf AND
227
242
  // the display name persisted for it, whether or not it equals either.
228
243
  await this.provision(user, folder, name, pluginAccessMd(user));
229
- return provisioned(folder, pluginManifestName(name), name, true);
244
+ return provisioned(this.pluginsRoot, folder, pluginManifestName(name), name, true);
230
245
  });
231
246
  }
232
247
 
@@ -246,7 +261,7 @@ export class PluginProvisionService {
246
261
  if (segments.some((s) => validateFilename(s) !== null || s.startsWith('.'))) {
247
262
  throw new PluginProvisionError(`"${rawParent}" is not a folder name the knowledge base can carry.`, 422);
248
263
  }
249
- const rel = `${PLUGINS_DIR}/${rawParent}`;
264
+ const rel = `${this.pluginsRoot}/${rawParent}`;
250
265
  // The personal namespace is the FIRST segment below the root — the same
251
266
  // structural rule as `isPersonalPluginDir`, applied to the parent and
252
267
  // everything under it. A `personal-*` folder there is a personal space
@@ -257,8 +272,8 @@ export class PluginProvisionService {
257
272
  }
258
273
  const wsId = await this.readyWorkspaceId();
259
274
  const wsDir = await this.workspaceService.getWorkspacePath(wsId);
260
- if (!(await this.exactFolderExists(path.join(wsDir, this.kbDirName, PLUGINS_DIR), segments))) {
261
- throw new PluginProvisionError(`There is no folder "${rawParent}" under ${PLUGINS_DIR}/.`, 404);
275
+ if (!(await this.exactFolderExists(path.join(wsDir, this.kbDirName, this.pluginsRoot), segments))) {
276
+ throw new PluginProvisionError(`There is no folder "${rawParent}" under ${this.pluginsRoot}/.`, 404);
262
277
  }
263
278
  // Judged against every folder discovery CLAIMS, not only the plugins it
264
279
  // lists: a twin skipped for its slug still owns its subtree, and a
@@ -287,7 +302,13 @@ export class PluginProvisionService {
287
302
  return this.creations.run(`plugin:${pluginManifestName(folder)}`, async () => {
288
303
  const existing = await this.existingFolder(folder);
289
304
  if (existing !== null) {
290
- return provisioned(folder, pluginManifestName(folder), await this.persistedDisplayName(existing, folder), false);
305
+ return provisioned(
306
+ this.pluginsRoot,
307
+ folder,
308
+ pluginManifestName(folder),
309
+ await this.persistedDisplayName(existing, folder),
310
+ false,
311
+ );
291
312
  }
292
313
  try {
293
314
  await this.provision(user, folder, folder, personalAccessMd(user));
@@ -296,11 +317,17 @@ export class PluginProvisionService {
296
317
  // process, a checkout that appeared between check and write): the
297
318
  // folder existing is this method's success case, never its error.
298
319
  if (err instanceof PluginProvisionError && err.status === 409) {
299
- return provisioned(folder, pluginManifestName(folder), await this.persistedDisplayName(folder, folder), false);
320
+ return provisioned(
321
+ this.pluginsRoot,
322
+ folder,
323
+ pluginManifestName(folder),
324
+ await this.persistedDisplayName(folder, folder),
325
+ false,
326
+ );
300
327
  }
301
328
  throw err;
302
329
  }
303
- return provisioned(folder, pluginManifestName(folder), folder, true);
330
+ return provisioned(this.pluginsRoot, folder, pluginManifestName(folder), folder, true);
304
331
  });
305
332
  }
306
333
 
@@ -343,14 +370,14 @@ export class PluginProvisionService {
343
370
  if (!name || segments.some((s) => validateFilename(s) !== null || s.startsWith('.'))) {
344
371
  throw new PluginProvisionError('A plugin needs a name.', 422);
345
372
  }
346
- if (isPersonalPluginDir(`${PLUGINS_DIR}/${name}`)) {
373
+ if (isPersonalPluginDir(`${this.pluginsRoot}/${name}`, this.kb.layout)) {
347
374
  // Personal folders are not plugins (the catalog never lists them), and
348
375
  // nobody deletes somebody's private shelf through the plugin door.
349
376
  throw new PluginProvisionError('Unknown plugin', 404);
350
377
  }
351
378
  const wsId = await this.readyWorkspaceId();
352
379
  const wsDir = await this.workspaceService.getWorkspacePath(wsId);
353
- const pluginsDir = path.join(wsDir, this.kbDirName, PLUGINS_DIR);
380
+ const pluginsDir = path.join(wsDir, this.kbDirName, this.pluginsRoot);
354
381
  const folderDir = path.join(pluginsDir, ...segments);
355
382
  // Locked on the plugin's IDENTITY — the same key a creation of that name
356
383
  // takes — not on a slug of the folder path, which for a nested plugin is a
@@ -361,7 +388,7 @@ export class PluginProvisionService {
361
388
  // discovery refuses, as it does for creation. A folder discovery does not
362
389
  // list (no manifest at all) locks on its own slug — nothing else can
363
390
  // claim that identity either.
364
- const identity = await this.discoveredIdentity(`${PLUGINS_DIR}/${name}`, segments[segments.length - 1]!);
391
+ const identity = await this.discoveredIdentity(`${this.pluginsRoot}/${name}`, segments[segments.length - 1]!);
365
392
  return this.creations.run(`plugin:${identity}`, async () => {
366
393
  // Exact spelling of EVERY component — the catalog hands the route the
367
394
  // on-disk spelling, so a mismatch means the plugin is gone (or was
@@ -392,8 +419,8 @@ export class PluginProvisionService {
392
419
  // deletion under it: one commit, one removed plugin.
393
420
  await this.commits.runPendingCommit(
394
421
  wsId,
395
- DEFAULT_BRANCH,
396
- `${this.kbDirName}/${PLUGINS_DIR}/${name}`,
422
+ this.kb.defaultBranch,
423
+ `${this.kbDirName}/${this.pluginsRoot}/${name}`,
397
424
  user,
398
425
  { systemAuthorized: true },
399
426
  );
@@ -411,7 +438,7 @@ export class PluginProvisionService {
411
438
  // The folder's rules left the access model — drop the resolver cache
412
439
  // so the very next check runs against a tree without them.
413
440
  this.accessControl.invalidate(wsId);
414
- this.events?.emit({ kind: 'fs-tree-changed', workspaceId: wsId, branch: DEFAULT_BRANCH });
441
+ this.events?.emit({ kind: 'fs-tree-changed', workspaceId: wsId, branch: this.kb.defaultBranch });
415
442
  });
416
443
  }
417
444
 
@@ -422,7 +449,7 @@ export class PluginProvisionService {
422
449
  */
423
450
  private async exactFolderExists(root: string, segments: string[]): Promise<boolean> {
424
451
  let dir = root;
425
- let rel = PLUGINS_DIR;
452
+ let rel = this.pluginsRoot;
426
453
  for (const segment of segments) {
427
454
  const entries = await listDirOrIncomplete(this.disk, dir, rel);
428
455
  if (!entries?.some((e) => e.isDirectory() && e.name === segment)) return false;
@@ -439,7 +466,7 @@ export class PluginProvisionService {
439
466
  private async existingFolder(name: string, parent = ''): Promise<string | null> {
440
467
  const wsId = await this.readyWorkspaceId();
441
468
  const wsDir = await this.workspaceService.getWorkspacePath(wsId);
442
- const rel = parent ? `${PLUGINS_DIR}/${parent}` : PLUGINS_DIR;
469
+ const rel = parent ? `${this.pluginsRoot}/${parent}` : this.pluginsRoot;
443
470
  // No Plugins/ root yet — nothing can collide.
444
471
  const children = await listDirOrIncomplete(this.disk, path.join(wsDir, this.kbDirName, rel), rel);
445
472
  if (!children) return null;
@@ -461,7 +488,7 @@ export class PluginProvisionService {
461
488
  const wsId = await this.readyWorkspaceId();
462
489
  const wsDir = await this.workspaceService.getWorkspacePath(wsId);
463
490
  const manifest = await this.disk.readJsonObject(
464
- path.join(wsDir, this.kbDirName, PLUGINS_DIR, ...folder.split('/'), PLUGIN_MANIFEST_FILE),
491
+ path.join(wsDir, this.kbDirName, this.pluginsRoot, ...folder.split('/'), PLUGIN_MANIFEST_FILE),
465
492
  );
466
493
  return pluginDisplayNameOf(manifest) || fallback;
467
494
  }
@@ -518,7 +545,7 @@ export class PluginProvisionService {
518
545
  */
519
546
  private async provision(user: AuthUser, folder: string, leaf: string, accessMd: string): Promise<void> {
520
547
  const wsId = await this.readyWorkspaceId();
521
- const folderPath = `${this.kbDirName}/${PLUGINS_DIR}/${folder}`;
548
+ const folderPath = `${this.kbDirName}/${this.pluginsRoot}/${folder}`;
522
549
  const wsRelPath = `${folderPath}/access.md`;
523
550
  try {
524
551
  // Exclusive create — the fs is the arbiter of a same-name race, not
@@ -557,7 +584,7 @@ export class PluginProvisionService {
557
584
  // rule this endpoint exists to carve through. The endpoint has already
558
585
  // authorized the write (any signed-in user, unused name, exclusive
559
586
  // create), so the per-user gate is skipped for exactly this commit.
560
- await this.commits.runPendingCommit(wsId, DEFAULT_BRANCH, folderPath, user, {
587
+ await this.commits.runPendingCommit(wsId, this.kb.defaultBranch, folderPath, user, {
561
588
  systemAuthorized: true,
562
589
  });
563
590
  } catch (err) {
@@ -568,7 +595,7 @@ export class PluginProvisionService {
568
595
  // so a concurrent writer's bytes can't be collateral.
569
596
  try {
570
597
  const wsDir = await this.workspaceService.getWorkspacePath(wsId);
571
- const folderDir = path.join(wsDir, this.kbDirName, PLUGINS_DIR, folder);
598
+ const folderDir = path.join(wsDir, this.kbDirName, this.pluginsRoot, folder);
572
599
  await fs.rm(path.join(folderDir, 'access.md'), { force: true });
573
600
  await fs.rm(path.join(folderDir, PLUGIN_MANIFEST_FILE), { force: true });
574
601
  await fs.rmdir(folderDir).catch(() => {});
@@ -580,11 +607,11 @@ export class PluginProvisionService {
580
607
  // The folder's rules changed the access model — drop the resolver cache
581
608
  // so the very next check (the creator's first skill write) sees them.
582
609
  this.accessControl.invalidate(wsId);
583
- this.events?.emit({ kind: 'fs-tree-changed', workspaceId: wsId, branch: DEFAULT_BRANCH });
610
+ this.events?.emit({ kind: 'fs-tree-changed', workspaceId: wsId, branch: this.kb.defaultBranch });
584
611
  }
585
612
 
586
613
  private async readyWorkspaceId(): Promise<string> {
587
- const ws = await this.workspaceService.getOrCreateForBranch(DEFAULT_BRANCH);
614
+ const ws = await this.workspaceService.getOrCreateForBranch(this.kb.defaultBranch);
588
615
  return ws.id;
589
616
  }
590
617
  }
@@ -18,8 +18,8 @@ import {
18
18
  parsePluginPrincipalKey,
19
19
  } from '../access-model/access-grammar.js';
20
20
  import type { WorkspaceService } from '../workspace/workspace.service.js';
21
+ import type { KbContext } from '../../shared/kb-context.js';
21
22
  import type { PluginSource } from './discovery/plugin-source.js';
22
- import { linksWorkspaceId } from './plugin-links.js';
23
23
 
24
24
  export class PluginRenameError extends Error {
25
25
  constructor(
@@ -70,15 +70,19 @@ export class PluginRenameService {
70
70
  private readonly accessControl: IAccessControl,
71
71
  private readonly source: PluginSource,
72
72
  private readonly disk: ITreeWalker,
73
- private readonly kbDirName: string,
73
+ private readonly kb: KbContext,
74
74
  private readonly events?: {
75
75
  emit(event: { kind: 'fs-tree-changed'; workspaceId: string; branch: string }): void;
76
76
  },
77
77
  private readonly onChanged?: () => void,
78
78
  ) {}
79
79
 
80
+ private get kbDirName(): string {
81
+ return this.kb.kbDirName;
82
+ }
83
+
80
84
  private noteChanged(wsId: string): void {
81
- noteChangedFor(this.accessControl, this.events, this.onChanged, wsId);
85
+ noteChangedFor(this.accessControl, this.events, this.onChanged, wsId, this.kb.defaultBranch);
82
86
  }
83
87
 
84
88
  /** The READ phase must have seen everything it needed; a hole refuses the rename before any write. */
@@ -96,7 +100,7 @@ export class PluginRenameService {
96
100
  current: string,
97
101
  patch: { name?: unknown; displayName?: unknown },
98
102
  ): Promise<RenameResult> {
99
- const wsId = linksWorkspaceId();
103
+ const wsId = this.kb.defaultWorkspaceId();
100
104
  const kbRoot = path.join(await this.workspaceService.getWorkspacePath(wsId), this.kbDirName);
101
105
  // ONE walk of the checkout for everything the rename needs to know:
102
106
  // the plugins (discovery's listener) and every file that can carry a
@@ -277,9 +281,10 @@ function noteChangedFor(
277
281
  events: PluginRenameService['events'],
278
282
  onChanged: (() => void) | undefined,
279
283
  wsId: string,
284
+ branch: string,
280
285
  ): void {
281
286
  accessControl.invalidate(wsId);
282
- events?.emit({ kind: 'fs-tree-changed', workspaceId: wsId, branch: linksWorkspaceIdBranch() });
287
+ events?.emit({ kind: 'fs-tree-changed', workspaceId: wsId, branch });
283
288
  onChanged?.();
284
289
  }
285
290
 
@@ -303,8 +308,3 @@ export function renamePluginPrincipalInText(text: string, oldName: string, nextN
303
308
  })
304
309
  .join('\n');
305
310
  }
306
-
307
- function linksWorkspaceIdBranch(): string {
308
- // The default branch's workspace id IS its encoded branch name.
309
- return decodeURIComponent(linksWorkspaceId());
310
- }
@@ -13,11 +13,13 @@ import {
13
13
  import type { IAccessControl } from '../access/access-control.interface.js';
14
14
  import { WorkflowDomainError } from '../../shared/domain-errors.js';
15
15
  import { domainErrorBody } from '../../shared/http-errors.js';
16
- import { pluginsWorkspaceId, pluginFolderBelowRoot } from './plugins.service.js';
16
+ import { pluginFolderBelowRoot } from './plugins.service.js';
17
+ import type { KbContext } from '../../shared/kb-context.js';
17
18
  import { PluginProvisionError, type PluginProvisionService } from './plugin-provision.service.js';
18
19
  import { PluginLinkError, type PluginLinksService } from './plugin-links.service.js';
19
20
  import { PluginRenameError, type PluginRenameService } from './plugin-rename.service.js';
20
21
  import type { JoinRequestsService } from './join-requests.service.js';
22
+ import { folderTarget } from '../access/access-requests.contract.js';
21
23
  import type { PluginJoinRequestJobs } from './join-request-jobs.service.js';
22
24
  import type { JoinRequestRecord } from './join-request-records.store.js';
23
25
  import type {
@@ -159,6 +161,8 @@ export function createPluginsRoutes(
159
161
  joinRequestJobs: PluginJoinRequestJobs,
160
162
  provision: PluginProvisionService,
161
163
  resolveUser: (req: express.Request) => Promise<AuthUser | null>,
164
+ /** The released branch's clone — every verdict here is read from it. */
165
+ kb: Pick<KbContext, 'defaultWorkspaceId'>,
162
166
  /** Optional: a host without the link machinery simply has no link routes. */
163
167
  links?: PluginLinksService,
164
168
  /** Optional: a host without it has no rename route. */
@@ -209,11 +213,30 @@ export function createPluginsRoutes(
209
213
  * POST /api/plugins/:name/links { skillPath } → { root, skills }
210
214
  * DELETE /api/plugins/:name/links?skillPath= → { root, revoked }
211
215
  * POST /api/plugins/:name/links/repair { skillPath } → { root }
216
+ * POST /api/plugins/:name/links/repair-all → { repaired, skipped }
212
217
  *
213
218
  * Refusals carry a `kind` the UI branches on — `needs-skill-write` (409) is
214
219
  * the one that becomes "request write access".
220
+ *
221
+ * `repair-all` is the plugin PAGE's: it repairs every link of the plugin the
222
+ * caller can, and reports what it could not. A caller who may not write the
223
+ * plugin gets the same 404 every other link route gives them, so probing it
224
+ * confirms nothing about a plugin they cannot see.
215
225
  */
216
226
  if (links) {
227
+ /** The one refusal mapping every link route answers with. */
228
+ const linkFailure = (res: express.Response, err: unknown) => {
229
+ if (err instanceof PluginLinkError) {
230
+ res.status(err.status).json({ error: err.message, ...err.payload });
231
+ return;
232
+ }
233
+ if (err instanceof WorkflowDomainError) {
234
+ res.status(err.status).json(domainErrorBody(err));
235
+ return;
236
+ }
237
+ log.error('link operation failed:', { err });
238
+ res.status(500).json({ error: 'Failed to update the plugin\'s links' });
239
+ };
217
240
  const linkOp = async (
218
241
  req: express.Request,
219
242
  res: express.Response,
@@ -237,16 +260,7 @@ export function createPluginsRoutes(
237
260
  try {
238
261
  res.json(await op(user, String(req.params.name), skillPath));
239
262
  } catch (err) {
240
- if (err instanceof PluginLinkError) {
241
- res.status(err.status).json({ error: err.message, ...err.payload });
242
- return;
243
- }
244
- if (err instanceof WorkflowDomainError) {
245
- res.status(err.status).json(domainErrorBody(err));
246
- return;
247
- }
248
- log.error('link operation failed:', { err });
249
- res.status(500).json({ error: 'Failed to update the plugin\'s links' });
263
+ linkFailure(res, err);
250
264
  }
251
265
  };
252
266
  const bodyPath = (req: express.Request) => ((req.body ?? {}) as { skillPath?: unknown }).skillPath;
@@ -254,6 +268,23 @@ export function createPluginsRoutes(
254
268
  router.post('/plugins/:name/links/repair', (req, res) =>
255
269
  linkOp(req, res, (u, p, s) => links.repair(u, p, s), bodyPath),
256
270
  );
271
+ // No `skillPath`: this one is about the plugin, so it cannot ride `linkOp`.
272
+ router.post('/plugins/:name/links/repair-all', async (req, res) => {
273
+ if (!req.userEmail) {
274
+ res.status(401).json({ error: 'Unauthenticated' });
275
+ return;
276
+ }
277
+ const user = await resolveUser(req);
278
+ if (!user) {
279
+ res.status(401).json({ error: 'Unauthenticated' });
280
+ return;
281
+ }
282
+ try {
283
+ res.json(await links.repairAll(user, String(req.params.name)));
284
+ } catch (err) {
285
+ linkFailure(res, err);
286
+ }
287
+ });
257
288
  router.delete('/plugins/:name/links', (req, res) =>
258
289
  linkOp(req, res, (u, p, s) => links.unlink(u, p, s), (r) => r.query.skillPath),
259
290
  );
@@ -296,7 +327,7 @@ export function createPluginsRoutes(
296
327
  res.json({ plugins: [] });
297
328
  return;
298
329
  }
299
- const wsId = pluginsWorkspaceId();
330
+ const wsId = kb.defaultWorkspaceId();
300
331
  const probes = probesFor(catalog);
301
332
  const [readable, writable, owned] = await Promise.all([
302
333
  accessControl.canReadBatch(wsId, email, probes),
@@ -453,7 +484,7 @@ export function createPluginsRoutes(
453
484
  }
454
485
  // By identity — the manifest name the catalog keys on.
455
486
  const plugin = (await pluginIndex.catalog()).find((g) => g.name === req.params.name);
456
- const wsId = pluginsWorkspaceId();
487
+ const wsId = kb.defaultWorkspaceId();
457
488
  const ownerVerdicts = plugin
458
489
  ? await Promise.all(
459
490
  plugin.folders.map((f) => accessControl.canOwner(wsId, email, memberProbe(f))),
@@ -494,7 +525,7 @@ export function createPluginsRoutes(
494
525
  const catalog = await pluginIndex.catalog();
495
526
  // By identity — the manifest name the catalog keys on.
496
527
  const plugin = catalog.find((g) => g.name === req.params.name);
497
- const wsId = pluginsWorkspaceId();
528
+ const wsId = kb.defaultWorkspaceId();
498
529
  // Same ANY-folder shape `GET /plugins` resolves with, so a plugin can
499
530
  // never be listed as discoverable there and rejected as unknown here.
500
531
  const verdicts = plugin
@@ -567,7 +598,7 @@ export function createPluginsRoutes(
567
598
  return null;
568
599
  }
569
600
  const writable = await accessControl.canWriteBatch(
570
- pluginsWorkspaceId(),
601
+ kb.defaultWorkspaceId(),
571
602
  email,
572
603
  plugin.folders.map(accessMdOf),
573
604
  );
@@ -589,7 +620,7 @@ export function createPluginsRoutes(
589
620
  if (!ctx) return;
590
621
  const crs = await workflow.listChangeRequests();
591
622
  res.json({
592
- requests: await joinRequests.list(joinKeyOf(ctx.plugin), ctx.folder, crs, ctx.user),
623
+ requests: await joinRequests.list(joinKeyOf(ctx.plugin), folderTarget(ctx.folder), crs, ctx.user),
593
624
  });
594
625
  } catch (err) {
595
626
  log.error('failed to list join requests:', { err });
@@ -619,7 +650,7 @@ export function createPluginsRoutes(
619
650
  res.status(404).json({ error: 'Not found' });
620
651
  return;
621
652
  }
622
- res.json({ closed: await joinRequests.reconcile(joinKeyOf(ctx.plugin), ctx.folder, cr, ctx.user) });
653
+ res.json({ closed: await joinRequests.reconcile(joinKeyOf(ctx.plugin), folderTarget(ctx.folder), cr, ctx.user) });
623
654
  } catch (err) {
624
655
  log.error('failed to reconcile a join request:', { err });
625
656
  res.status(500).json({ error: 'Failed to update the request' });
@@ -3,13 +3,10 @@ import { logger } from '../../shared/logging.js';
3
3
 
4
4
  const log = logger('plugins');
5
5
  import path from 'node:path';
6
- import {
7
- DEFAULT_BRANCH,
8
- } from '@bevel-software/platform-shared';
9
6
  import { isPrivateAccessMd } from '../access-model/access-grammar.js';
10
7
  import { isAbsence } from '../../shared/fs.contract.js';
11
8
  import type { WorkspaceService } from '../workspace/workspace.service.js';
12
- import { workspaceIdForBranch } from '../../shared/workspace-id.js';
9
+ import type { KbContext } from '../../shared/kb-context.js';
13
10
  import type { IAccessControl } from '../access/access-control.interface.js';
14
11
  import type { ISkillService } from '../skills/skills.contract.js';
15
12
  import type { IToolManualService } from '../tool-manuals/tool-manuals.contract.js';
@@ -63,7 +60,7 @@ export class PluginIndexService implements IPluginIndexService {
63
60
  private readonly accessControl: IAccessControl,
64
61
  private readonly skillService: ISkillService,
65
62
  private readonly toolManualService: IToolManualService,
66
- private readonly kbDirName: string,
63
+ private readonly kb: KbContext,
67
64
  /** Where plugins come from — the one discovery every catalog shares. */
68
65
  private readonly source: PluginSource,
69
66
  now: () => number = Date.now,
@@ -77,6 +74,10 @@ export class PluginIndexService implements IPluginIndexService {
77
74
  this.cache = new TtlCache(CACHE_TTL_MS, now);
78
75
  }
79
76
 
77
+ private get kbDirName(): string {
78
+ return this.kb.kbDirName;
79
+ }
80
+
80
81
  invalidate(): void {
81
82
  this.cache.invalidate();
82
83
  }
@@ -115,7 +116,7 @@ export class PluginIndexService implements IPluginIndexService {
115
116
  */
116
117
  private async build(): Promise<PluginCatalogEntry[] | null> {
117
118
  try {
118
- const wsId = (await this.workspaceService.getOrCreateForBranch(DEFAULT_BRANCH)).id;
119
+ const wsId = (await this.workspaceService.getOrCreateForBranch(this.kb.defaultBranch)).id;
119
120
  const kbRoot = path.join(await this.workspaceService.getWorkspacePath(wsId), this.kbDirName);
120
121
 
121
122
  const scanned = await this.scanFolders(kbRoot);
@@ -301,11 +302,6 @@ function bucketByFolder(items: { path: string }[], folders: Map<string, string[]
301
302
  return counts;
302
303
  }
303
304
 
304
- /** The default-branch workspace id every plugin resolution runs against. */
305
- export function pluginsWorkspaceId(): string {
306
- return workspaceIdForBranch(DEFAULT_BRANCH);
307
- }
308
-
309
305
  /**
310
306
  * A plugin folder's path BELOW the plugins root: `GTM`, or `teams/deep`.
311
307
  *
@@ -2,12 +2,17 @@ import express from 'express';
2
2
  import { logger } from '../../shared/logging.js';
3
3
 
4
4
  const log = logger('teams');
5
- import { isPersonalPluginDir, isPersonalPluginFolder, pluginOfPath } from '@bevel-software/platform-shared';
5
+ import {
6
+ isPersonalPluginDir,
7
+ isPersonalPluginFolder,
8
+ pluginOfPath,
9
+ type KbLayout,
10
+ } from '@bevel-software/platform-shared';
6
11
  import type { IAccessControl } from '../access/access-control.interface.js';
12
+ import type { KbContext } from '../../shared/kb-context.js';
7
13
  import type { ISkillService } from '../skills/skills.contract.js';
8
14
  import type { IToolManualService } from '../tool-manuals/tool-manuals.contract.js';
9
15
  import type { IPluginIndexService, PluginCatalogEntry } from './plugins.contract.js';
10
- import { pluginsWorkspaceId } from './plugins.service.js';
11
16
 
12
17
  /**
13
18
  * What one team can use, by id — the Library's "Your teams" lens.
@@ -51,6 +56,8 @@ export function createTeamsRoutes(
51
56
  pluginIndex: IPluginIndexService,
52
57
  skillService: Pick<ISkillService, 'listSkills'>,
53
58
  toolManuals: Pick<IToolManualService, 'listAllSummaries'>,
59
+ /** The released branch's clone the verdicts are read from, and the layout that names the plugins root. */
60
+ kb: Pick<KbContext, 'defaultWorkspaceId' | 'layout'>,
54
61
  ): express.Router {
55
62
  const router = express.Router();
56
63
 
@@ -61,7 +68,7 @@ export function createTeamsRoutes(
61
68
  return;
62
69
  }
63
70
  try {
64
- const wsId = pluginsWorkspaceId();
71
+ const wsId = kb.defaultWorkspaceId();
65
72
  const [{ groups }, catalog, allSkills, allTools] = await Promise.all([
66
73
  accessControl.kbPrincipals(wsId),
67
74
  pluginIndex.catalog(),
@@ -73,9 +80,10 @@ export function createTeamsRoutes(
73
80
  // be a team's to read — whatever a hand-written grant in there says.
74
81
  // One rule for the plugin and for its contents, so the two cannot
75
82
  // disagree.
76
- const plugins = catalog.filter((g) => !g.folders.every(isPersonalPluginDir));
77
- const skills = allSkills.filter((s) => !inPersonalPlugin(s.path));
78
- const tools = allTools.filter((t) => !inPersonalPlugin(t.path));
83
+ const layout = kb.layout;
84
+ const plugins = catalog.filter((g) => !g.folders.every((f) => isPersonalPluginDir(f, layout)));
85
+ const skills = allSkills.filter((s) => !inPersonalPlugin(s.path, layout));
86
+ const tools = allTools.filter((t) => !inPersonalPlugin(t.path, layout));
79
87
  const folderProbes = plugins.flatMap((g) => g.folders);
80
88
  const discoverProbes = folderProbes.map(accessMdOf);
81
89
  const skillProbes = skills.map((s) => skillMdOf(s.path));
@@ -123,7 +131,7 @@ export function createTeamsRoutes(
123
131
  const accessMdOf = (folder: string) => `${folder}/access.md`;
124
132
  const skillMdOf = (skillPath: string) => `${skillPath}/SKILL.md`;
125
133
  /** Under `Plugins/personal-<id>/…` — one person's space, whatever it grants. */
126
- const inPersonalPlugin = (repoPath: string) => {
127
- const folder = pluginOfPath(repoPath);
134
+ const inPersonalPlugin = (repoPath: string, layout: KbLayout) => {
135
+ const folder = pluginOfPath(repoPath, layout);
128
136
  return folder !== null && isPersonalPluginFolder(folder);
129
137
  };
@@ -2,6 +2,7 @@ import type { Server as HttpServer } from 'node:http';
2
2
  import express from 'express';
3
3
  import { afterEach, describe, expect, it } from 'vitest';
4
4
  import { createSecretsVaultRoutes } from '../secrets-vault.routes.js';
5
+ import { testKbContext } from '../../../__tests__/kb-context.js';
5
6
 
6
7
  /**
7
8
  * The aggregated `/connect/pending` surface: everything standing between the
@@ -85,6 +86,7 @@ async function baseUrlWith(auth: { userId?: string; email?: string }): Promise<s
85
86
  app.use(
86
87
  '/api',
87
88
  createSecretsVaultRoutes({
89
+ kb: testKbContext(),
88
90
  secretsVault,
89
91
  toolManualService,
90
92
  accessControl,
@@ -170,6 +172,7 @@ describe('GET /api/connect/pending — the workspace tier', () => {
170
172
  app.use(
171
173
  '/api',
172
174
  createSecretsVaultRoutes({
175
+ kb: testKbContext(),
173
176
  secretsVault: {
174
177
  statusFor: async (_u: string, keys: string[]) =>
175
178
  keys.map((key) => ({
@@ -258,6 +261,7 @@ describe('GET /api/connect/pending — readability', () => {
258
261
  app.use(
259
262
  '/api',
260
263
  createSecretsVaultRoutes({
264
+ kb: testKbContext(),
261
265
  secretsVault: {
262
266
  statusFor: async (_u: string, keys: string[]) =>
263
267
  keys.map((key) => ({
@@ -384,6 +388,7 @@ describe('GET /api/connect/pending — OAuth scope coverage', () => {
384
388
  app.use(
385
389
  '/api',
386
390
  createSecretsVaultRoutes({
391
+ kb: testKbContext(),
387
392
  secretsVault: vaultWithGranted(grantedScopes),
388
393
  toolManualService: oauthTool,
389
394
  accessControl,
@@ -478,6 +483,7 @@ describe('GET /api/connect/pending — tool sign-ins are not double-listed as st
478
483
  app.use(
479
484
  '/api',
480
485
  createSecretsVaultRoutes({
486
+ kb: testKbContext(),
481
487
  secretsVault: vault,
482
488
  toolManualService: oauthTool,
483
489
  accessControl,
@@ -538,6 +544,7 @@ describe('GET /api/connect/pending — a row of the wrong KIND is not "set up"',
538
544
  app.use(
539
545
  '/api',
540
546
  createSecretsVaultRoutes({
547
+ kb: testKbContext(),
541
548
  secretsVault: {
542
549
  statusFor: async (_u: string, keys: string[]) => keys.map(opts.status),
543
550
  list: async () => [],