@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
@@ -16,6 +16,7 @@ import { workspaceIdForBranch } from '../../../shared/workspace-id.js';
16
16
  import type { WorkspaceService } from '../../workspace/workspace.service.js';
17
17
  import type { IAccessControl } from '../../access/access-control.interface.js';
18
18
  import type { IToolManualService, ToolManualDetail } from '../tool-manuals.contract.js';
19
+ import { testKbContext } from '../../../__tests__/kb-context.js';
19
20
 
20
21
  /**
21
22
  * `GET /api/tools/:slug` — the browser tool page's detail read. Two halves:
@@ -165,7 +166,7 @@ describe('ToolManualService.getDetail — capabilities + access', () => {
165
166
  canReadBatch: async (_w: string, _e: string, paths: string[]) => new Map(paths.map((p) => [p, false])),
166
167
  } as unknown as IAccessControl;
167
168
 
168
- const svc = (access: IAccessControl = allowAll) => new ToolManualService(workspaceService, access, KB_DIR, disk, new KbPluginSource(disk));
169
+ const svc = (access: IAccessControl = allowAll) => new ToolManualService(workspaceService, access, testKbContext({ kbDirName: KB_DIR }), disk, new KbPluginSource(disk, testKbContext({ kbDirName: KB_DIR })));
169
170
 
170
171
  /** Write one `.tool` into a fresh temp KB and return the service over it. */
171
172
  async function withTool(file: string, content: string): Promise<void> {
@@ -13,6 +13,7 @@ import { ToolManualService } from '../tool-manuals.service.js';
13
13
  import { workspaceIdForBranch } from '../../../shared/workspace-id.js';
14
14
  import type { WorkspaceService } from '../../workspace/workspace.service.js';
15
15
  import type { IAccessControl } from '../../access/access-control.interface.js';
16
+ import { testKbContext } from '../../../__tests__/kb-context.js';
16
17
 
17
18
  /**
18
19
  * THE TWO HTTP SURFACES, over a real catalog.
@@ -80,9 +81,9 @@ async function baseUrlAs(email: string | undefined): Promise<{ base: string; ser
80
81
  const service = new ToolManualService(
81
82
  workspaceService,
82
83
  accessControl,
83
- KB_DIR,
84
+ testKbContext({ kbDirName: KB_DIR }),
84
85
  disk,
85
- new KbPluginSource(disk),
86
+ new KbPluginSource(disk, testKbContext({ kbDirName: KB_DIR })),
86
87
  () => clock,
87
88
  );
88
89
  const app = express();
@@ -98,6 +99,7 @@ async function baseUrlAs(email: string | undefined): Promise<{ base: string; ser
98
99
  app.use(
99
100
  '/api',
100
101
  createSecretsVaultRoutes({
102
+ kb: testKbContext({ kbDirName: KB_DIR }),
101
103
  secretsVault: { statusFor: async () => [] } as unknown as Parameters<
102
104
  typeof createSecretsVaultRoutes
103
105
  >[0]['secretsVault'],
@@ -11,6 +11,7 @@ import { setLogger } from '../../../shared/logging.js';
11
11
  import type { ILogger } from '../../../shared/logger.contract.js';
12
12
  import type { WorkspaceService } from '../../workspace/workspace.service.js';
13
13
  import type { IAccessControl } from '../../access/access-control.interface.js';
14
+ import { testKbContext } from '../../../__tests__/kb-context.js';
14
15
 
15
16
  /**
16
17
  * ONE BAD `.tool` COSTS ONE TOOL.
@@ -92,7 +93,14 @@ describe('a malformed `.tool` is isolated, named, and forgotten the moment it is
92
93
  } as unknown as IAccessControl;
93
94
 
94
95
  const svc = (access: IAccessControl = allowAll) =>
95
- new ToolManualService(workspaceService, access, KB_DIR, disk, new KbPluginSource(disk), () => clock);
96
+ new ToolManualService(
97
+ workspaceService,
98
+ access,
99
+ testKbContext({ kbDirName: KB_DIR }),
100
+ disk,
101
+ new KbPluginSource(disk, testKbContext({ kbDirName: KB_DIR })),
102
+ () => clock,
103
+ );
96
104
 
97
105
  /**
98
106
  * The refused half of the catalog. There is no way to ask for it alone: both
@@ -512,9 +520,9 @@ describe('a malformed `.tool` is isolated, named, and forgotten the moment it is
512
520
  const service = new ToolManualService(
513
521
  workspaceService,
514
522
  countingAccess,
515
- KB_DIR,
523
+ testKbContext({ kbDirName: KB_DIR }),
516
524
  countingDisk,
517
- new KbPluginSource(countingDisk),
525
+ new KbPluginSource(countingDisk, testKbContext({ kbDirName: KB_DIR })),
518
526
  () => clock,
519
527
  );
520
528
 
@@ -546,9 +554,9 @@ describe('a malformed `.tool` is isolated, named, and forgotten the moment it is
546
554
  const service = new ToolManualService(
547
555
  workspaceService,
548
556
  allowAll,
549
- KB_DIR,
557
+ testKbContext({ kbDirName: KB_DIR }),
550
558
  countingDisk,
551
- new KbPluginSource(countingDisk),
559
+ new KbPluginSource(countingDisk, testKbContext({ kbDirName: KB_DIR })),
552
560
  () => clock,
553
561
  );
554
562
 
@@ -12,6 +12,7 @@ import { ToolManualService, type McpAuthDiscoveryPort } from '../tool-manuals.se
12
12
  import { workspaceIdForBranch } from '../../../shared/workspace-id.js';
13
13
  import type { WorkspaceService } from '../../workspace/workspace.service.js';
14
14
  import type { IAccessControl } from '../../access/access-control.interface.js';
15
+ import { testKbContext } from '../../../__tests__/kb-context.js';
15
16
 
16
17
  const KB_DIR = 'knowledge-base';
17
18
  const wsId = workspaceIdForBranch(DEFAULT_BRANCH);
@@ -62,7 +63,7 @@ describe('ToolManualService — MCP OAuth auto-discovery decoration', () => {
62
63
  });
63
64
 
64
65
  function svcWith(discovery: McpAuthDiscoveryPort) {
65
- const svc = new ToolManualService(workspaceService, allowAll, KB_DIR, disk, new KbPluginSource(disk));
66
+ const svc = new ToolManualService(workspaceService, allowAll, testKbContext({ kbDirName: KB_DIR }), disk, new KbPluginSource(disk, testKbContext({ kbDirName: KB_DIR })));
66
67
  svc.setMcpAuthDiscovery(discovery);
67
68
  return svc;
68
69
  }
@@ -20,6 +20,7 @@ import { createToolAuthMiddleware } from '../../tool-auth/tool-auth.middleware.j
20
20
  import { createToolContextResolver } from '../../tool-helpers/tool-context.js';
21
21
  import { createToolHandlerFactory } from '../../tool-helpers/tool-handler.js';
22
22
  import { registerToolManualsTools } from '../tool-manuals.tools.js';
23
+ import { testKbContext } from '../../../__tests__/kb-context.js';
23
24
 
24
25
  /**
25
26
  * A server restart must not cost a tool or a sign-in. Everything a registered
@@ -188,7 +189,13 @@ describe('external tools and their sign-ins across a restart', () => {
188
189
  ),
189
190
  } as unknown as WorkspaceService;
190
191
  const vault = vaultOver(rows);
191
- const catalog = new ToolManualService(workspaceService, allowAll, KB_DIR, disk, new KbPluginSource(disk));
192
+ const catalog = new ToolManualService(
193
+ workspaceService,
194
+ allowAll,
195
+ testKbContext({ kbDirName: KB_DIR }),
196
+ disk,
197
+ new KbPluginSource(disk, testKbContext({ kbDirName: KB_DIR })),
198
+ );
192
199
  catalog.setMcpAuthDiscovery(new McpOAuthDiscoveryService({ secretsVault: vault, redirectUri: REDIRECT_URI, fetchFn }));
193
200
 
194
201
  const internalToken = new InternalTokenService({ secret: 'test-secret' });
@@ -212,6 +219,7 @@ describe('external tools and their sign-ins across a restart', () => {
212
219
  registerToolManualsTools(new ToolRegistry(), router, createToolAuthMiddleware(apiKeys, internalToken), toolHandler, catalog, {
213
220
  accessControl: allowAll,
214
221
  variableStatus: vault,
222
+ kb: testKbContext({ kbDirName: KB_DIR }),
215
223
  });
216
224
  app.use('/api', router);
217
225
  const server = await new Promise<HttpServer>((r) => {
@@ -12,6 +12,7 @@ import { ToolManualService } from '../tool-manuals.service.js';
12
12
  import { workspaceIdForBranch } from '../../../shared/workspace-id.js';
13
13
  import type { WorkspaceService } from '../../workspace/workspace.service.js';
14
14
  import type { IAccessControl } from '../../access/access-control.interface.js';
15
+ import { testKbContext } from '../../../__tests__/kb-context.js';
15
16
 
16
17
  const KB_DIR = 'knowledge-base';
17
18
  const wsId = workspaceIdForBranch(DEFAULT_BRANCH);
@@ -69,7 +70,7 @@ describe('ToolManualService', () => {
69
70
  new Map(paths.map((p) => [p, !p.includes('weather')])),
70
71
  } as unknown as IAccessControl;
71
72
 
72
- const svc = (access: IAccessControl = allowAll) => new ToolManualService(workspaceService, access, KB_DIR, disk, new KbPluginSource(disk));
73
+ const svc = (access: IAccessControl = allowAll) => new ToolManualService(workspaceService, access, testKbContext({ kbDirName: KB_DIR }), disk, new KbPluginSource(disk, testKbContext({ kbDirName: KB_DIR })));
73
74
 
74
75
  beforeEach(async () => {
75
76
  root = await mkdtemp(join(tmpdir(), 'tools-'));
@@ -760,7 +761,7 @@ describe('ToolManualService.listDeclaredOnlyOnBranch', () => {
760
761
  await rm(root, { recursive: true, force: true });
761
762
  });
762
763
 
763
- const svc = () => new ToolManualService(workspaceService, readGate, KB_DIR, disk, new KbPluginSource(disk));
764
+ const svc = () => new ToolManualService(workspaceService, readGate, testKbContext({ kbDirName: KB_DIR }), disk, new KbPluginSource(disk, testKbContext({ kbDirName: KB_DIR })));
764
765
 
765
766
  test('names only the readable declarations the default branch does not serve', async () => {
766
767
  expect(await svc().listDeclaredOnlyOnBranch('user@example.com', DRAFT)).toEqual([
@@ -8,6 +8,7 @@ import { createToolContextResolver } from '../../tool-helpers/tool-context.js';
8
8
  import { createToolHandlerFactory } from '../../tool-helpers/tool-handler.js';
9
9
  import { registerToolManualsTools } from '../tool-manuals.tools.js';
10
10
  import type { IToolManualService } from '../tool-manuals.contract.js';
11
+ import { testKbContext } from '../../../__tests__/kb-context.js';
11
12
 
12
13
  /**
13
14
  * `list_tool_setup` MUST respect the same access controls as every other tool
@@ -114,6 +115,7 @@ async function start(): Promise<string> {
114
115
  registerToolManualsTools(registry, router, toolAuth, toolHandler, toolManualService, {
115
116
  accessControl,
116
117
  variableStatus: { statusFor },
118
+ kb: testKbContext(),
117
119
  });
118
120
  app.use('/api', router);
119
121
 
@@ -2,7 +2,7 @@ import {
2
2
  HEXIS_EXTENSION_NS,
3
3
  PLUGIN_MCP_FILE,
4
4
  PLUGIN_MANIFEST_FILE,
5
- PLUGINS_DIR,
5
+ type KbLayout,
6
6
  } from '@bevel-software/platform-shared';
7
7
  import type { ToolManualDescriptor, ToolVariable } from './tool-manuals.contract.js';
8
8
  import { logger } from '../../shared/logging.js';
@@ -317,12 +317,14 @@ export function descriptorsFromMcpJson(
317
317
  pluginFolder: string,
318
318
  mcpJsonText: string,
319
319
  pluginJsonText: string | null,
320
+ layout: KbLayout,
320
321
  ): ToolManualDescriptor[] {
322
+ const { pluginsDir } = layout;
321
323
  let mcp: unknown;
322
324
  try {
323
325
  mcp = JSON.parse(mcpJsonText);
324
326
  } catch {
325
- log.warn(`${PLUGINS_DIR}/${pluginFolder}/${PLUGIN_MCP_FILE} is not valid JSON — skipped.`);
327
+ log.warn(`${pluginsDir}/${pluginFolder}/${PLUGIN_MCP_FILE} is not valid JSON — skipped.`);
326
328
  return [];
327
329
  }
328
330
  if (!isRecord(mcp) || !isRecord(mcp.mcpServers)) return [];
@@ -336,13 +338,13 @@ export function descriptorsFromMcpJson(
336
338
  // servers themselves — they are still listed, as the spec's own
337
339
  // "invalid components are skipped, valid ones load" posture suggests.
338
340
  log.warn(
339
- `${PLUGINS_DIR}/${pluginFolder}/${PLUGIN_MANIFEST_FILE} is not valid JSON — ` +
341
+ `${pluginsDir}/${pluginFolder}/${PLUGIN_MANIFEST_FILE} is not valid JSON — ` +
340
342
  'its mcp-server auth/variable declarations are ignored.',
341
343
  );
342
344
  }
343
345
  }
344
346
  const extensions = extensionServers(manifest);
345
- const mcpJsonPath = `${PLUGINS_DIR}/${pluginFolder}/${PLUGIN_MCP_FILE}`;
347
+ const mcpJsonPath = `${pluginsDir}/${pluginFolder}/${PLUGIN_MCP_FILE}`;
346
348
 
347
349
  const out: ToolManualDescriptor[] = [];
348
350
  for (const [name, rawEntry] of Object.entries(mcp.mcpServers)) {
@@ -1,15 +1,13 @@
1
1
  import fs from 'node:fs/promises';
2
2
  import path from 'node:path';
3
3
  import {
4
- DEFAULT_BRANCH,
5
4
  HEXIS_EXTENSION_NS,
6
- PLUGINS_DIR,
7
5
  PLUGIN_MANIFEST_FILE,
8
6
  PLUGIN_MCP_FILE,
9
7
  type AuthUser,
10
8
  } from '@bevel-software/platform-shared';
11
9
  import type { WorkspaceService } from '../workspace/workspace.service.js';
12
- import { workspaceIdForBranch } from '../../shared/workspace-id.js';
10
+ import type { KbContext } from '../../shared/kb-context.js';
13
11
  import { validatedVariables } from './mcp-json-discovery.js';
14
12
  import { assertSafeFetchUrl } from '../../shared/ssrf.js';
15
13
  import { containsVariableReference, findReservedVariableRef } from '../../shared/variable-refs.js';
@@ -127,10 +125,14 @@ export class McpServerEditService {
127
125
  private readonly commits: CommitDriver,
128
126
  private readonly accessControl: IAccessControl,
129
127
  private readonly toolManuals: IToolManualService,
130
- private readonly kbDirName: string,
128
+ private readonly kb: KbContext,
131
129
  private readonly disk: IFsProbe,
132
130
  ) {}
133
131
 
132
+ private get kbDirName(): string {
133
+ return this.kb.kbDirName;
134
+ }
135
+
134
136
  /**
135
137
  * The merged view of one server, or null when unknown — including when
136
138
  * `mcp.json` is absent, is not a JSON object, or has no object entry for it
@@ -385,9 +387,9 @@ export class McpServerEditService {
385
387
  // One folder-scoped commit, ungated beyond the caller's own write access —
386
388
  // both files or neither. The catalog cache is stale the moment it lands.
387
389
  await this.commits.runPendingCommit(
388
- workspaceIdForBranch(DEFAULT_BRANCH),
389
- DEFAULT_BRANCH,
390
- `${this.kbDirName}/${PLUGINS_DIR}/${folder}`,
390
+ this.kb.defaultWorkspaceId(),
391
+ this.kb.defaultBranch,
392
+ `${this.kbDirName}/${this.kb.layout.pluginsDir}/${folder}`,
391
393
  user,
392
394
  );
393
395
  this.toolManuals.invalidate();
@@ -408,7 +410,7 @@ export class McpServerEditService {
408
410
  return {
409
411
  folder,
410
412
  name: found.name,
411
- wsId: workspaceIdForBranch(DEFAULT_BRANCH),
413
+ wsId: this.kb.defaultWorkspaceId(),
412
414
  mcpJsonPath: found.path,
413
415
  };
414
416
  }
@@ -419,10 +421,10 @@ export class McpServerEditService {
419
421
  mcpAbs: string;
420
422
  manifestAbs: string;
421
423
  }> {
422
- const wsId = workspaceIdForBranch(DEFAULT_BRANCH);
423
- await this.workspaceService.getOrCreateForBranch(DEFAULT_BRANCH);
424
+ const wsId = this.kb.defaultWorkspaceId();
425
+ await this.workspaceService.getOrCreateForBranch(this.kb.defaultBranch);
424
426
  const wsDir = await this.workspaceService.getWorkspacePath(wsId);
425
- const pluginDir = path.join(wsDir, this.kbDirName, PLUGINS_DIR, folder);
427
+ const pluginDir = path.join(wsDir, this.kbDirName, this.kb.layout.pluginsDir, folder);
426
428
  const mcpAbs = path.join(pluginDir, PLUGIN_MCP_FILE);
427
429
  const manifestAbs = path.join(pluginDir, PLUGIN_MANIFEST_FILE);
428
430
  return {
@@ -1,14 +1,13 @@
1
1
  import {
2
- PLUGINS_DIR,
3
2
  PLUGIN_MANIFEST_FILE,
4
3
  PLUGIN_MCP_FILE,
5
- DEFAULT_BRANCH,
6
4
  pluginOfPath,
7
5
  type ChangeRequest,
8
6
  type IWorkflowService,
7
+ type KbLayout,
9
8
  } from '@bevel-software/platform-shared';
10
9
  import { type WorkspaceService } from '../workspace/workspace.service.js';
11
- import { workspaceIdForBranch } from '../../shared/workspace-id.js';
10
+ import type { KbContext } from '../../shared/kb-context.js';
12
11
  import type { IAccessControl } from '../access/access-control.interface.js';
13
12
  import { readAt, visibleProposedFiles } from '../../shared/pending-proposals.js';
14
13
  import { utcpNamespacePrefix } from '../../shared/utcp-namespace.js';
@@ -56,6 +55,7 @@ export class PendingToolsService implements IPendingToolService {
56
55
  private readonly accessControl: IAccessControl,
57
56
  private readonly toolManuals: Pick<IToolManualService, 'listAllSummaries'>,
58
57
  private readonly workflow: IWorkflowService,
58
+ private readonly kb: KbContext,
59
59
  ) {}
60
60
 
61
61
  async listPendingTools(userEmail: string): Promise<PendingTool[]> {
@@ -72,19 +72,21 @@ export class PendingToolsService implements IPendingToolService {
72
72
  return [];
73
73
  }
74
74
 
75
+ const layout = this.kb.layout;
75
76
  const proposed = await visibleProposedFiles(
76
77
  {
77
78
  workspaceService: this.workspaceService,
78
79
  accessControl: this.accessControl,
79
80
  workflow: this.workflow,
81
+ kb: this.kb,
80
82
  },
81
83
  userEmail,
82
- isToolDeclaration,
84
+ (p) => isToolDeclaration(p, layout),
83
85
  );
84
86
 
85
87
  const out: PendingTool[] = [];
86
88
  for (const { cr, path, content, isAuthor } of proposed) {
87
- for (const descriptor of await this.declarationsIn(cr, path, content)) {
89
+ for (const descriptor of await this.declarationsIn(cr, path, content, layout)) {
88
90
  if (released.has(utcpNamespacePrefix(descriptor.name))) continue;
89
91
  out.push({
90
92
  slug: descriptor.slug,
@@ -92,7 +94,7 @@ export class PendingToolsService implements IPendingToolService {
92
94
  path: descriptor.path,
93
95
  type: descriptor.type,
94
96
  ...(descriptor.description ? { description: descriptor.description } : {}),
95
- plugin: pluginOfPath(descriptor.path),
97
+ plugin: pluginOfPath(descriptor.path, layout),
96
98
  changeRequestNumber: cr.number,
97
99
  branch: cr.branch,
98
100
  authorName: cr.appAuthor?.name ?? cr.author.name ?? 'Someone',
@@ -118,8 +120,9 @@ export class PendingToolsService implements IPendingToolService {
118
120
  cr: ChangeRequest,
119
121
  path: string,
120
122
  content: string,
123
+ layout: KbLayout,
121
124
  ): Promise<ToolManualDescriptor[]> {
122
- if (!isMcpJson(path)) {
125
+ if (!isMcpJson(path, layout)) {
123
126
  let descriptor: ToolManualDescriptor;
124
127
  try {
125
128
  descriptor = normalizeToolManual(baseName(path), path, content);
@@ -140,22 +143,22 @@ export class PendingToolsService implements IPendingToolService {
140
143
  // missing manifest costs a sentence, not the card. No separate access
141
144
  // check: this caller already passed the write gate on the `mcp.json`
142
145
  // beside it, which is the plugin folder's own verdict.
143
- const pluginFolder = path.slice(`${PLUGINS_DIR}/`.length, -(PLUGIN_MCP_FILE.length + 1));
146
+ const pluginFolder = path.slice(`${layout.pluginsDir}/`.length, -(PLUGIN_MCP_FILE.length + 1));
144
147
  const manifest = await readAt(
145
148
  this.workspaceService,
146
- workspaceIdForBranch(DEFAULT_BRANCH),
149
+ this.kb.defaultWorkspaceId(),
147
150
  cr.branch,
148
- `${PLUGINS_DIR}/${pluginFolder}/${PLUGIN_MANIFEST_FILE}`,
151
+ `${layout.pluginsDir}/${pluginFolder}/${PLUGIN_MANIFEST_FILE}`,
149
152
  );
150
- return descriptorsFromMcpJson(pluginFolder, content, manifest);
153
+ return descriptorsFromMcpJson(pluginFolder, content, manifest, layout);
151
154
  }
152
155
  }
153
156
 
154
157
  /** `Plugins/<…>/mcp.json` — a plugin's MCP server declarations. */
155
- function isMcpJson(repoRelPath: string): boolean {
158
+ function isMcpJson(repoRelPath: string, layout: KbLayout): boolean {
156
159
  const segments = repoRelPath.split('/');
157
160
  return (
158
- segments[0] === PLUGINS_DIR &&
161
+ segments[0] === layout.pluginsDir &&
159
162
  segments.length >= 3 &&
160
163
  segments[segments.length - 1] === PLUGIN_MCP_FILE
161
164
  );
@@ -169,11 +172,11 @@ function isMcpJson(repoRelPath: string): boolean {
169
172
  * or a plugin's `mcp.json`. `Plugins/mcp.json` is not one: there is no plugin
170
173
  * there for its servers to belong to.
171
174
  */
172
- function isToolDeclaration(repoRelPath: string): boolean {
175
+ function isToolDeclaration(repoRelPath: string, layout: KbLayout): boolean {
173
176
  const segments = repoRelPath.split('/');
174
- if (segments[0] !== PLUGINS_DIR || segments.length < 2) return false;
177
+ if (segments[0] !== layout.pluginsDir || segments.length < 2) return false;
175
178
  const last = segments[segments.length - 1] ?? '';
176
179
  // Case-insensitive, matching the catalog's own walk.
177
180
  if (last.toLowerCase().endsWith('.tool')) return true;
178
- return isMcpJson(repoRelPath);
181
+ return isMcpJson(repoRelPath, layout);
179
182
  }
@@ -2,14 +2,13 @@ import fs from 'node:fs/promises';
2
2
  import path from 'node:path';
3
3
  import { randomUUID } from 'node:crypto';
4
4
  import {
5
- DEFAULT_BRANCH,
6
5
  HEXIS_EXTENSION_NS,
7
6
  PLUGIN_MANIFEST_FILE,
8
7
  PLUGIN_MCP_FILE,
9
8
  type AuthUser,
10
9
  } from '@bevel-software/platform-shared';
11
10
  import type { WorkspaceService } from '../workspace/workspace.service.js';
12
- import { workspaceIdForBranch } from '../../shared/workspace-id.js';
11
+ import type { KbContext } from '../../shared/kb-context.js';
13
12
  import { utcpNamespacePrefix } from '../../shared/utcp-namespace.js';
14
13
  import type { IAccessControl } from '../access/access-control.interface.js';
15
14
  import type { IFsProbe } from '../../shared/fs.contract.js';
@@ -122,10 +121,14 @@ export class ToolDeleteService {
122
121
  private readonly pluginIndex: IPluginIndexService,
123
122
  private readonly source: PluginSource,
124
123
  private readonly vault: Pick<ISecretsVaultService, 'countNamespace' | 'removeNamespace'>,
125
- private readonly kbDirName: string,
124
+ private readonly kb: KbContext,
126
125
  private readonly disk: IFsProbe,
127
126
  ) {}
128
127
 
128
+ private get kbDirName(): string {
129
+ return this.kb.kbDirName;
130
+ }
131
+
129
132
  /** What deleting `slug` would affect. Owner-gated like the delete itself. */
130
133
  async dependents(userEmail: string, slug: string): Promise<ToolDependents> {
131
134
  const { tool, source, plugin, folder } = await this.authorize(userEmail, slug);
@@ -154,8 +157,8 @@ export class ToolDeleteService {
154
157
  // removing its file here would be undone by the next sync, or worse.
155
158
  throw new ToolDeleteError("This tool's plugin is managed in another format — delete it there.", 422);
156
159
  }
157
- const wsId = workspaceIdForBranch(DEFAULT_BRANCH);
158
- await this.workspaceService.getOrCreateForBranch(DEFAULT_BRANCH);
160
+ const wsId = this.kb.defaultWorkspaceId();
161
+ await this.workspaceService.getOrCreateForBranch(this.kb.defaultBranch);
159
162
  const kbRoot = path.join(await this.workspaceService.getWorkspacePath(wsId), this.kbDirName);
160
163
 
161
164
  if (source === 'manual') await this.deleteManual(user, wsId, kbRoot, tool);
@@ -205,7 +208,7 @@ export class ToolDeleteService {
205
208
  }
206
209
  }
207
210
  if (!best) return null;
208
- const owner = await this.accessControl.canOwner(workspaceIdForBranch(DEFAULT_BRANCH), userEmail, best.folder);
211
+ const owner = await this.accessControl.canOwner(this.kb.defaultWorkspaceId(), userEmail, best.folder);
209
212
  return owner ? best : null;
210
213
  }
211
214
 
@@ -263,10 +266,10 @@ export class ToolDeleteService {
263
266
  folder: string,
264
267
  home: PluginCatalogEntry,
265
268
  ): Promise<ToolDependents['plugins']> {
266
- const wsId = workspaceIdForBranch(DEFAULT_BRANCH);
269
+ const wsId = this.kb.defaultWorkspaceId();
267
270
  let discovered;
268
271
  try {
269
- await this.workspaceService.getOrCreateForBranch(DEFAULT_BRANCH);
272
+ await this.workspaceService.getOrCreateForBranch(this.kb.defaultBranch);
270
273
  const kbRoot = path.join(await this.workspaceService.getWorkspacePath(wsId), this.kbDirName);
271
274
  discovered = await this.source.discover(kbRoot);
272
275
  } catch (err) {
@@ -320,7 +323,7 @@ export class ToolDeleteService {
320
323
  const parked = path.join(path.dirname(abs), `.deleting-${randomUUID()}`);
321
324
  await fs.rename(abs, parked);
322
325
  try {
323
- await this.commits.runPendingCommit(wsId, DEFAULT_BRANCH, `${this.kbDirName}/${tool.path}`, user, {
326
+ await this.commits.runPendingCommit(wsId, this.kb.defaultBranch, `${this.kbDirName}/${tool.path}`, user, {
324
327
  // The route authorized the delete with the owner verb; see class note.
325
328
  systemAuthorized: true,
326
329
  });
@@ -393,7 +396,7 @@ export class ToolDeleteService {
393
396
  // Commit-stage failures propagate as-is: the pipeline may already hold a
394
397
  // local commit, and rewriting the tree under it is the state its own
395
398
  // recovery misreads (same contract as McpServerEditService).
396
- await this.commits.runPendingCommit(wsId, DEFAULT_BRANCH, `${this.kbDirName}/${folder}`, user, {
399
+ await this.commits.runPendingCommit(wsId, this.kb.defaultBranch, `${this.kbDirName}/${folder}`, user, {
397
400
  systemAuthorized: true,
398
401
  });
399
402
  }
@@ -5,9 +5,8 @@ const log = logger('tool-manuals');
5
5
  import path from 'node:path';
6
6
  import fs from 'node:fs/promises';
7
7
  import AdmZip from 'adm-zip';
8
- import { DEFAULT_BRANCH, PLUGINS_DIR } from '@bevel-software/platform-shared';
9
8
  import type { WorkspaceService } from '../workspace/workspace.service.js';
10
- import { workspaceIdForBranch } from '../../shared/workspace-id.js';
9
+ import type { KbContext } from '../../shared/kb-context.js';
11
10
  import { isAbsence, type IFsProbe, type ITreeWalker } from '../../shared/fs.contract.js';
12
11
  import type { IAccessControl } from '../access/access-control.interface.js';
13
12
  import type { IPluginIndexService } from '../plugins/plugins.contract.js';
@@ -54,7 +53,8 @@ export function createToolManualsAgentRoutes(
54
53
  archiveDeps?: {
55
54
  workspaceService: WorkspaceService;
56
55
  accessControl: IAccessControl;
57
- kbDirName: string;
56
+ /** The checkout folder, the released branch, and the layout that names the plugins root. */
57
+ kb: Pick<KbContext, 'kbDirName' | 'defaultBranch' | 'defaultWorkspaceId' | 'layout'>;
58
58
  disk: ITreeWalker & IFsProbe;
59
59
  /**
60
60
  * Resolves a plugin IDENTITY (its manifest name) to its folder, so a
@@ -110,17 +110,19 @@ export function createToolManualsAgentRoutes(
110
110
  if (!folder || folder === '.' || folder === '..' || /[/\\]/.test(folder)) {
111
111
  return void res.status(422).json({ error: 'Not a plugin folder name' });
112
112
  }
113
- const { workspaceService, accessControl, kbDirName, disk, pluginIndex } = archiveDeps;
114
- const wsId = workspaceIdForBranch(DEFAULT_BRANCH);
115
- await workspaceService.getOrCreateForBranch(DEFAULT_BRANCH);
113
+ const { workspaceService, accessControl, kb, disk, pluginIndex } = archiveDeps;
114
+ const { kbDirName } = kb;
115
+ const pluginsDir = kb.layout.pluginsDir;
116
+ const wsId = kb.defaultWorkspaceId();
117
+ await workspaceService.getOrCreateForBranch(kb.defaultBranch);
116
118
  const wsDir = await workspaceService.getWorkspacePath(wsId);
117
119
  // The name is a folder directly under the root, as it always was — or,
118
120
  // when no such folder exists, a plugin's IDENTITY, which the index maps
119
121
  // to its folder at any depth (`Plugins/departments/eng/ado`). Identity
120
122
  // second, so a folder that spells a nested plugin's name keeps meaning
121
123
  // the folder.
122
- let pluginRel = `${PLUGINS_DIR}/${folder}`;
123
- let pluginDir = path.join(wsDir, kbDirName, PLUGINS_DIR, folder);
124
+ let pluginRel = `${pluginsDir}/${folder}`;
125
+ let pluginDir = path.join(wsDir, kbDirName, pluginsDir, folder);
124
126
  if (pluginIndex && (await disk.lstatOrNull(pluginDir))?.isDirectory() !== true) {
125
127
  const byIdentity = (await pluginIndex.catalog()).find((p) => p.name === folder)?.folders[0];
126
128
  if (byIdentity) {
@@ -16,13 +16,10 @@ import {
16
16
  DefaultVariableSubstitutor,
17
17
  type CallTemplate,
18
18
  } from '@utcp/sdk';
19
- import {
20
- DEFAULT_BRANCH,
21
- PLUGINS_DIR,
22
- } from '@bevel-software/platform-shared';
23
19
  import { descriptorsFromMcpJson } from './mcp-json-discovery.js';
24
20
  import type { PluginSource } from '../plugins/discovery/plugin-source.js';
25
21
  import type { WorkspaceService } from '../workspace/workspace.service.js';
22
+ import type { KbContext } from '../../shared/kb-context.js';
26
23
  import { workspaceIdForBranch } from '../../shared/workspace-id.js';
27
24
  import type { IAccessControl } from '../access/access-control.interface.js';
28
25
  import { assertSafeFetchUrl } from '../../shared/ssrf.js';
@@ -265,7 +262,7 @@ export class ToolManualService implements IToolManualService {
265
262
  constructor(
266
263
  private readonly workspaceService: WorkspaceService,
267
264
  private readonly accessControl: IAccessControl,
268
- private readonly kbDirName: string,
265
+ private readonly kb: KbContext,
269
266
  private readonly disk: ITreeWalker,
270
267
  /** Where plugins (and their MCP servers) come from — the one discovery every catalog shares. */
271
268
  private readonly source: PluginSource,
@@ -274,6 +271,10 @@ export class ToolManualService implements IToolManualService {
274
271
  this.cache = new TtlCache(CACHE_TTL_MS, now);
275
272
  }
276
273
 
274
+ private get kbDirName(): string {
275
+ return this.kb.kbDirName;
276
+ }
277
+
277
278
  /**
278
279
  * Wire the MCP OAuth auto-discovery (setter injection: the discovery service
279
280
  * depends on the vault, which is constructed after this service — the same
@@ -329,7 +330,7 @@ export class ToolManualService implements IToolManualService {
329
330
  userEmail: string,
330
331
  branch: string,
331
332
  ): Promise<{ name: string; path: string; type: ToolManualType }[]> {
332
- if (!branch || branch === DEFAULT_BRANCH) return [];
333
+ if (!branch || branch === this.kb.defaultBranch) return [];
333
334
  // Only a draft this process already holds a clone of — the one the caller
334
335
  // wrote the declaration on. `scanDisk` would otherwise BOOTSTRAP any branch
335
336
  // name a caller sends, before the read gate below has had a say: a clone
@@ -456,7 +457,7 @@ export class ToolManualService implements IToolManualService {
456
457
  async resolveInlineManual(userEmail: string, slug: string): Promise<UtcpManualDict | null> {
457
458
  const found = (await this.scan()).manuals.find((m) => m.slug === slug);
458
459
  if (!found || found.type !== 'inline') return null;
459
- const wsId = workspaceIdForBranch(DEFAULT_BRANCH);
460
+ const wsId = this.kb.defaultWorkspaceId();
460
461
  if (!(await this.accessControl.canRead(wsId, userEmail, found.path))) return null;
461
462
  try {
462
463
  return manualSerializer.validateDict({
@@ -582,7 +583,7 @@ export class ToolManualService implements IToolManualService {
582
583
  private async accessibleScan(userEmail: string): Promise<ScanResult> {
583
584
  const { manuals, invalid } = await this.scan();
584
585
  if (manuals.length === 0 && invalid.length === 0) return emptyScan();
585
- const wsId = workspaceIdForBranch(DEFAULT_BRANCH);
586
+ const wsId = this.kb.defaultWorkspaceId();
586
587
  const allowed = await this.accessControl.canReadBatch(wsId, userEmail, [
587
588
  ...new Set([...manuals.map((m) => m.path), ...invalid.map((i) => i.path)]),
588
589
  ]);
@@ -859,7 +860,7 @@ export class ToolManualService implements IToolManualService {
859
860
  * calls: a refusal lives only in the scan it came from, so a fixed file is a
860
861
  * valid manual on the very next scan.
861
862
  */
862
- private async scanDisk(branch: string = DEFAULT_BRANCH): Promise<ScanResult> {
863
+ private async scanDisk(branch: string = this.kb.defaultBranch): Promise<ScanResult> {
863
864
  let wsId: string;
864
865
  try {
865
866
  wsId = (await this.workspaceService.getOrCreateForBranch(branch)).id;
@@ -870,9 +871,10 @@ export class ToolManualService implements IToolManualService {
870
871
 
871
872
  // A `.tool` sits under `Plugins/`, beside the skills that use it.
872
873
  const files: { abs: string; rel: string }[] = [];
873
- const root = path.join(kbRoot, PLUGINS_DIR);
874
+ const layout = this.kb.layout;
875
+ const root = path.join(kbRoot, layout.pluginsDir);
874
876
  for (const rel of await this.disk.walkFiles(root, (n) => n.toLowerCase().endsWith('.tool'))) {
875
- files.push({ abs: path.join(root, rel), rel: `${PLUGINS_DIR}/${rel}` });
877
+ files.push({ abs: path.join(root, rel), rel: `${layout.pluginsDir}/${rel}` });
876
878
  }
877
879
 
878
880
  // MCP servers come from each plugin's mcp.json — the AUTHORITATIVE source
@@ -891,7 +893,7 @@ export class ToolManualService implements IToolManualService {
891
893
  // (a URL, a header, an added or dropped server, a `local: true` flip)
892
894
  // moves every server's digest — which is correct, if slightly generous.
893
895
  const from = sourceDigest(plugin.mcpJsonText + '\u0000' + (plugin.manifestText ?? ''));
894
- for (const d of descriptorsFromMcpJson(plugin.relFolder, plugin.mcpJsonText, plugin.manifestText)) {
896
+ for (const d of descriptorsFromMcpJson(plugin.relFolder, plugin.mcpJsonText, plugin.manifestText, layout)) {
895
897
  d.sourceRevision = from;
896
898
  parsed.push(d);
897
899
  }
@@ -974,7 +976,7 @@ export class ToolManualService implements IToolManualService {
974
976
  // Only the CATALOG's scan talks. `listDeclaredOnlyOnBranch` re-scans a
975
977
  // draft workspace, and a draft's half-written `.tool` is not news about the
976
978
  // served catalog — it would also flap the log every time an agent saves.
977
- if (branch === DEFAULT_BRANCH) this.logInvalidOnChange(invalid);
979
+ if (branch === this.kb.defaultBranch) this.logInvalidOnChange(invalid);
978
980
  return { manuals, invalid };
979
981
  }
980
982
  }