@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,14 +2,16 @@ import path from 'node:path';
2
2
  import { logger } from '../shared/logging.js';
3
3
  import type { AuthProviderPlugin } from '../modules/auth/auth.routes.js';
4
4
  import type { AuthUser } from '@bevel-software/platform-shared';
5
- import {
6
- DEFAULT_BRANCH,
7
- configureBranchModel,
8
- validateBranchModel,
9
- PROTECTED_BRANCHES,
10
- configureKbLayout,
11
- } from '@bevel-software/platform-shared';
12
- import { CoreConfig } from '../core-config.js';
5
+ // The browser-side live bindings, imported here and nowhere else in this
6
+ // package: `mirrorSharedBindings` below keeps them in step with `kb` for an
7
+ // overlay that still reads them. Core's own modules read only `KbContext`.
8
+ // eslint-disable-next-line no-restricted-imports
9
+ import { configureBranchModel, configureKbLayout } from '@bevel-software/platform-shared';
10
+ import type { TenantConfig } from '../core-config.js';
11
+ import { sql } from 'drizzle-orm';
12
+ import { DEFAULT_DB_SCHEMA, assertSearchPath } from '../modules/database/connection.js';
13
+ import { DEFAULT_SECRETS_SCOPE } from '../modules/secrets-vault/secrets-variable-loader.js';
14
+ import { KbContext } from '../shared/kb-context.js';
13
15
  import { getDb, type Database } from '../modules/database/connection.js';
14
16
  import { runCoreMigrations } from '../modules/database/migrate.js';
15
17
  import { coreMigrationsDir } from '../assets.js';
@@ -28,7 +30,7 @@ import { KbSyncService } from '../modules/kb-sync/kb-sync.service.js';
28
30
  import { NodeFs } from '../modules/kb-fs/node-fs.js';
29
31
  import { assertKbDirNameFree } from '../modules/kb-fs/repo-path.js';
30
32
  import type { IFsProbe, ITreeWalker } from '../shared/fs.contract.js';
31
- import type { IGitRunner } from '../shared/git.contract.js';
33
+ import { gitCredentials, type IGitRunner } from '../shared/git.contract.js';
32
34
  import { AdvisoryLease, AdvisoryLock } from '../modules/database/advisory-lock.js';
33
35
  import { holdCommitWorkerLease, withStartupTask, type LeaseLoopHandle } from './lifecycle.js';
34
36
 
@@ -155,7 +157,7 @@ import { registerCatalogCacheInvalidation } from './catalog-cache-invalidation.j
155
157
  * core services to construct). See {@link CorePorts} for the pattern.
156
158
  */
157
159
  export interface CoreServices {
158
- config: CoreConfig;
160
+ config: TenantConfig;
159
161
  db: Database;
160
162
  /**
161
163
  * Reading the disk without locks — the one tree walk and the one path
@@ -184,6 +186,20 @@ export interface CoreServices {
184
186
  * first-time setup completion — and never again while the process serves.
185
187
  */
186
188
  kbStartupRunner: KbStartupRunner;
189
+ /**
190
+ * The startup phase's retry when the boot survived an unreachable remote
191
+ * — set by `startCore`, stopped by `stopCore` (see `core/lifecycle.ts`);
192
+ * null while nothing is asking.
193
+ */
194
+ startupRetry: { stop(): void } | null;
195
+ /**
196
+ * What tells this graph's locks, migration ledger and secrets scope apart
197
+ * from another graph's in the same process and database: the schema name,
198
+ * or `''` for the default schema (the single-tenant ids).
199
+ */
200
+ tenantKey: string;
201
+ /** The scope this graph's vault is registered under with the UTCP variable loader. */
202
+ secretsScope: string;
187
203
  spillStore: SpillStore;
188
204
  docExtractService: DocExtractService;
189
205
  accessControl: AccessControlService;
@@ -264,12 +280,20 @@ export interface CoreServices {
264
280
  updateCheckService: UpdateCheckService;
265
281
  /** Deployment settings, env-first — the KB remote resolves through these. */
266
282
  settings: DeploymentSettingsService;
283
+ /**
284
+ * The knowledge base as this composition names it: the checkout folder,
285
+ * the branch model and the layout — the one object every core service reads
286
+ * those from (see `shared/kb-context.ts`). The setup-completing save applies
287
+ * the branch model and the layout to it, so an overlay reads the answer in
288
+ * effect here rather than from the shared package's live bindings.
289
+ */
290
+ kb: KbContext;
267
291
  /**
268
292
  * The knowledge-base directory name IN EFFECT — environment first, then the
269
293
  * stored setting, then the default. Published here because `config.kbDirName`
270
294
  * is only the environment's half of that answer: reading it directly gives
271
295
  * the empty string on any deployment configured through the setup screen, and
272
- * every path built from it would be wrong.
296
+ * every path built from it would be wrong. The same value as `kb.kbDirName`.
273
297
  */
274
298
  kbDirName: string;
275
299
  secretsVaultService: DbSecretsVaultService;
@@ -301,14 +325,28 @@ export interface CoreServices {
301
325
  }
302
326
 
303
327
  export async function createCoreServices(
304
- config: CoreConfig,
328
+ config: TenantConfig,
305
329
  ports: CorePorts = {},
306
330
  ): Promise<CoreServices> {
307
331
  // Fail fast on a runtime whose git is too old for `--no-write-fetch-head`
308
332
  // (see `git-version.ts`): every clone, fetch and refresh below depends on it,
309
333
  // so an unsupported binary is better surfaced here than at the first merge.
310
334
  await assertGitVersion();
311
- const db = getDb(config.databaseUrl);
335
+ // What tells this knowledge base's locks, migration ledger and secrets
336
+ // loader apart from another's in the same process and database. Empty for
337
+ // the default schema, so a single-tenant deployment keeps the lock ids and
338
+ // the ledger it always had.
339
+ const tenantKey = config.dbSchema === DEFAULT_DB_SCHEMA ? '' : config.dbSchema;
340
+ const db = getDb(config.databaseUrl, { schema: config.dbSchema });
341
+ // A schema of its own is created on first use, so a tenant's first
342
+ // activation needs nothing done by hand; `public` always exists. Then the
343
+ // server is asked whether the connections really search that schema: a
344
+ // pooler that dropped the startup parameter would otherwise land every
345
+ // tenant's tables in `public`, silently — see `assertSearchPath`.
346
+ if (tenantKey) {
347
+ await db.execute(sql.raw(`create schema if not exists "${config.dbSchema}"`));
348
+ await assertSearchPath(db, config.dbSchema);
349
+ }
312
350
  // Migrations must run BEFORE any service that reads or writes a managed
313
351
  // table. `PendingCommitsService.startupReconcile` (called later in this
314
352
  // function) hits `pending_commits` — on a fresh DB, deferring migrations to
@@ -325,40 +363,13 @@ export async function createCoreServices(
325
363
  // is resolved through them, and a fresh install has none of it in the
326
364
  // environment. `load()` is env-first, so an existing deployment sees exactly
327
365
  // what it saw before — a stored row only answers where a variable is silent.
328
- const settings = new DeploymentSettingsService(db, config.secretsEncKey);
366
+ const settings = new DeploymentSettingsService(db, config.secretsEncKey, undefined, { env: config.settingsEnv });
329
367
  await settings.load();
330
368
 
331
- /**
332
- * The branch model, before anything reads it. It used to be applied at import
333
- * time from the environment, which is what forced the frontend to bake it
334
- * into its bundle; it now comes through the settings store like the rest of
335
- * the deployment's configuration (environment first, as always).
336
- *
337
- * UNCONFIGURED IS ALLOWED, and that is the point: a fresh deployment has no
338
- * branch model, and refusing to boot would take away the setup screen where
339
- * one gets entered. What reads it before then is the setup path itself, which
340
- * does not need it — the bootstrap admin is recognised without a workspace.
341
- * `isComplete` keeps the rest of the app behind the gate until it is set, and
342
- * the setting is restart-to-apply because services take the value at
343
- * construction.
344
- */
345
- const branchModel = {
346
- defaultBranch: settings.resolve('defaultBranch'),
347
- protectedBranches: settings.resolve('protectedBranches'),
348
- };
349
- if (!validateBranchModel(branchModel)) configureBranchModel(branchModel);
350
369
  // The layout variables that were retired this release, folded into their
351
370
  // saved settings before anything reads the layout — so the boot that imports
352
371
  // them also RUNS on the imported names rather than on the defaults.
353
372
  await settings.importLegacyLayoutEnv();
354
- // The KB layout — the three renameable roots and the agent guide's file name
355
- // — applied the same way and at the same moment, before any service captures
356
- // one of them. Unlike the branch model it always resolves (every name has a
357
- // default), so an invalid value is a real misconfiguration and stops the boot.
358
- configureKbLayout(settings.resolveKbLayout());
359
- // A token supplied through the setup screen has to reach the credential
360
- // helper, which reads `$GITHUB_TOKEN` at call time.
361
- settings.syncGitTokenEnv();
362
373
 
363
374
  // `kbDirName` is read ONCE and threaded into a dozen services as a plain
364
375
  // string, which is why changing it needs a restart (the setting says so).
@@ -370,19 +381,73 @@ export async function createCoreServices(
370
381
  // unnameable. Both are operator settings, so the collision is refused here,
371
382
  // by name, before any service captures either.
372
383
  assertKbDirNameFree(kbDirName, settings.resolveKbLayout());
384
+ /**
385
+ * The knowledge base's context — the checkout folder, the branch model and
386
+ * the layout — built before any service, and handed to each one that reads
387
+ * a name from it (see `shared/kb-context.ts`). The values come through the
388
+ * settings store like the rest of the deployment's configuration
389
+ * (environment first, as always).
390
+ *
391
+ * The branch model: UNCONFIGURED IS ALLOWED, and that is the point. A fresh
392
+ * deployment has no branch model, and refusing to boot would take away the
393
+ * setup screen where one gets entered. What reads it before then is the
394
+ * setup path itself, which does not need it — the bootstrap admin is
395
+ * recognised without a workspace. `isComplete` keeps the rest of the app
396
+ * behind the gate until it is set, and the save that completes setup applies
397
+ * it to this very object, which every service reads at use rather than
398
+ * capturing at construction.
399
+ *
400
+ * The layout — the three renameable roots and the agent guide's file name —
401
+ * always resolves (every name has a default), so an invalid value is a real
402
+ * misconfiguration and stops the boot.
403
+ */
404
+ const kb = new KbContext(
405
+ kbDirName,
406
+ KbContext.branchModelOrUnconfigured({
407
+ defaultBranch: settings.resolve('defaultBranch'),
408
+ protectedBranches: settings.resolve('protectedBranches'),
409
+ }),
410
+ settings.resolveKbLayout(),
411
+ );
412
+ // The shared package's process-wide live bindings, kept in step with `kb`
413
+ // for an overlay that still reads them — now, and again when the setup-
414
+ // completing save applies a model or a layout. Nothing in this package
415
+ // reads them; a host serving several knowledge bases turns this off.
416
+ if (ports.mirrorSharedBindings !== false) {
417
+ const mirrorBranchModel = () => {
418
+ if (kb.isBranchModelConfigured()) {
419
+ configureBranchModel({ defaultBranch: kb.defaultBranch, protectedBranches: [...kb.protectedBranches] });
420
+ }
421
+ };
422
+ const mirrorLayout = () => configureKbLayout(kb.layout);
423
+ mirrorBranchModel();
424
+ mirrorLayout();
425
+ kb.onBranchModelApplied(mirrorBranchModel);
426
+ kb.onLayoutApplied(mirrorLayout);
427
+ }
373
428
  // The disk: one walk, one probe, for every reader below.
374
429
  const disk = new NodeFs();
430
+ // What git authenticates with, read on every call: the username and token
431
+ // the setup screen stored, or the environment's. Environment first for the
432
+ // token, as for every setting (`resolve` is env-first); the legacy
433
+ // `GITHUB_TOKEN` / `GH_TOKEN` spellings only through `config`, since the
434
+ // settings catalogue knows `GIT_TOKEN` alone. Handed to the runner, which
435
+ // puts the token into each child's environment — never into this
436
+ // process's, which several knowledge bases may share.
437
+ const gitCredentialsInEffect = gitCredentials(
438
+ () => settings.resolve('gitUsername') || config.gitUsername,
439
+ () => settings.resolve('gitToken') || config.gitToken || null,
440
+ );
375
441
  // How git is run, for every module that runs it: one environment, one buffer
376
442
  // ceiling, one error shape, and — the reason it exists — one deadline, so a
377
443
  // git that never returns cannot hold a workspace (and with it the commit
378
444
  // queue) open indefinitely. See `shared/git.contract.ts`.
379
- const gitRunner = new NodeGitRunner(config.gitTimeoutMs);
445
+ const gitRunner = new NodeGitRunner(config.gitTimeoutMs, gitCredentialsInEffect);
380
446
  const workspaceService = new WorkspaceService(
381
447
  config.workspacesRoot,
382
448
  () => settings.resolve('kbRepoUrl'),
383
- kbDirName,
449
+ kb,
384
450
  disk,
385
- () => settings.resolve('gitUsername') || 'x-access-token',
386
451
  gitRunner,
387
452
  );
388
453
  // The KB startup phase: every seeding, scaffolding and migration concern,
@@ -400,18 +465,18 @@ export async function createCoreServices(
400
465
  // read-only, needs no remote, and must be said even on a deployment whose
401
466
  // setup never finished — so `noteBesideCheckout` runs once from the server
402
467
  // builder, ahead of this gated phase.)
403
- new GroupsToPluginsStep(disk),
404
- new PluginManifestsStep(disk),
468
+ new GroupsToPluginsStep(disk, kb),
469
+ new PluginManifestsStep(disk, kb),
405
470
  // After the manifests step: a folder that only just got its manifest got
406
471
  // one the renderer wrote, which already carries the display name — the
407
472
  // backfill then has nothing to do for it. Ordered the other way, the
408
473
  // backfill would walk a tree still missing those manifests.
409
- new PluginDisplayNamesStep(disk),
410
- new PersonalSpacesStep(disk),
474
+ new PluginDisplayNamesStep(disk, kb),
475
+ new PersonalSpacesStep(disk, kb),
411
476
  // A getter, not a value: the step is built here, while the process may
412
477
  // still hold the defaults, and the save that completes first-run setup
413
478
  // applies the admin's answer afterwards.
414
- new TemplateFilesStep(disk, extraDirs, () => settings.resolveAgentsFileLink()),
479
+ new TemplateFilesStep(disk, kb, extraDirs, () => settings.resolveAgentsFileLink()),
415
480
  new RolesYamlStep(disk, [config.adminEmail]),
416
481
  ...(ports.kbStartupSteps ?? []),
417
482
  ];
@@ -420,18 +485,16 @@ export async function createCoreServices(
420
485
  // setup screen after this object exists, and the setup-completion run is
421
486
  // the first thing that needs them.
422
487
  kbRepoUrl: () => settings.resolve('kbRepoUrl'),
423
- gitUsername: () => settings.resolve('gitUsername') || 'x-access-token',
424
- gitToken: () => settings.resolve('gitToken'),
425
488
  workspacesRoot: config.workspacesRoot,
426
489
  kbDirName,
427
490
  templateDir: config.kbTemplateDir,
428
- defaultBranch: () => DEFAULT_BRANCH,
429
- protectedBranches: () => [...PROTECTED_BRANCHES],
491
+ defaultBranch: () => kb.defaultBranch,
492
+ protectedBranches: () => [...kb.protectedBranches],
430
493
  // The deployment owner is the initial Admin of a freshly seeded KB — the
431
494
  // same answer `SEED_ADMIN_EMAILS` used to ask for a second time.
432
495
  seedAdminEmails: [config.adminEmail],
433
496
  steps: kbStartupSteps,
434
- buildSeedTree: buildSeedTree(disk, config.kbTemplateDir, extraDirs, [config.adminEmail]),
497
+ buildSeedTree: buildSeedTree(disk, config.kbTemplateDir, extraDirs, [config.adminEmail], kb),
435
498
  gitRunner,
436
499
  });
437
500
  // Shared, workspace-independent store for oversized `call_tool_chain` results,
@@ -452,49 +515,50 @@ export async function createCoreServices(
452
515
  disk,
453
516
  [config.adminEmail],
454
517
  gitRunner,
518
+ kb,
455
519
  );
456
520
  // Creator read-grant on creation: read is default-deny and the roots grant
457
521
  // it to nobody, so every surface that starts a new folder at a root (human
458
522
  // routes, agent tools, upload apply) consults this planner to keep the new
459
523
  // folder visible to its creator.
460
- const creatorAccess = new CreatorAccessService(workspaceService, accessControl, kbDirName, disk);
524
+ const creatorAccess = new CreatorAccessService(workspaceService, accessControl, kb, disk);
461
525
  // Read-before-write: the gate every lock acquire asks, on every branch —
462
526
  // nothing is created, changed or removed where its author cannot read,
463
527
  // except that new folder at a root (see `access-model/change-gate.ts`).
464
- const changeGate = new ChangeReadGate(workspaceService, accessControl, kbDirName, disk);
528
+ const changeGate = new ChangeReadGate(workspaceService, accessControl, kb, disk);
465
529
 
466
530
  // Ontology-session boundary: records each agent run's touched ontologies and
467
531
  // blocks writes once a run has crossed ontologies. Postgres-backed so the
468
532
  // boundary survives a restart.
469
- const sessionOntologyService = new SessionOntologyService(db);
533
+ const sessionOntologyService = new SessionOntologyService(db, kb);
470
534
  // Per-run write restriction (by file extension). Shared by the workspace tool
471
535
  // surface (which enforces it) and the routine runner (which sets it for
472
536
  // dashboard-only `watchlist_check` runs). In-memory: a restriction lives only for
473
537
  // one run, unlike the Postgres-backed ontology touched-set above.
474
538
  const routineWritePolicy = new RoutineWritePolicyService();
475
539
  // Skills: discovered from the default-branch workspace only (global catalog).
476
- const skillService = new SkillService(workspaceService, accessControl, kbDirName, disk);
540
+ const skillService = new SkillService(workspaceService, accessControl, kb, disk);
477
541
  // Tool manuals: user-authored `*.tool` files under `Plugins/` in the default
478
542
  // branch — access-controlled like Skills, served to external agents via
479
543
  // `GET /api/agent/all-tools` and registered on the MCP proxy's UTCP client.
480
544
  // Where plugins come from: one walk of the plugins root that reads every
481
545
  // plugin folder in whichever file shape it carries (see
482
546
  // modules/plugins/discovery). Nothing to configure, nothing to document.
483
- const pluginSource = new KbPluginSource(disk);
484
- const toolManualService = new ToolManualService(workspaceService, accessControl, kbDirName, disk, pluginSource);
547
+ const pluginSource = new KbPluginSource(disk, kb);
548
+ const toolManualService = new ToolManualService(workspaceService, accessControl, kb, disk, pluginSource);
485
549
  // Plugins: the folders under `Plugins/` that carry a
486
550
  // team's skills AND the tools they need. Enumerated for EVERY authenticated
487
551
  // caller — a plugin they cannot read still exists for them, as a locked one —
488
552
  // with the counts read off the two catalogs above rather than a second scan.
489
553
  // The link index resolves manifests against the released catalog, and the
490
554
  // plugin index counts through it (inline + linked), so it comes first.
491
- const pluginLinkIndex = new PluginLinkIndex(workspaceService, skillService, accessControl, kbDirName, pluginSource);
555
+ const pluginLinkIndex = new PluginLinkIndex(workspaceService, skillService, accessControl, kb, pluginSource);
492
556
  const pluginIndexService = new PluginIndexService(
493
557
  workspaceService,
494
558
  accessControl,
495
559
  skillService,
496
560
  toolManualService,
497
- kbDirName,
561
+ kb,
498
562
  pluginSource,
499
563
  Date.now,
500
564
  pluginLinkIndex,
@@ -504,13 +568,17 @@ export async function createCoreServices(
504
568
  // PullRequestService no longer depends on it for attribution.)
505
569
  // The allow-list is resolved, not read off the environment: it is settable
506
570
  // from the setup screen alongside the SSO configuration it guards.
507
- const authService = new AuthService(db, {
508
- jwtSecret: config.jwtSecret,
509
- adminEmail: config.adminEmail,
510
- adminPassword: config.adminPassword,
511
- allowedEmailDomains: parseDomainList(settings.resolve('allowedEmailDomains')),
512
- loginPasswordEnabled: config.loginPasswordEnabled,
513
- });
571
+ const authService = new AuthService(
572
+ db,
573
+ {
574
+ jwtSecret: config.jwtSecret,
575
+ adminEmail: config.adminEmail,
576
+ adminPassword: config.adminPassword,
577
+ allowedEmailDomains: parseDomainList(settings.resolve('allowedEmailDomains')),
578
+ loginPasswordEnabled: config.loginPasswordEnabled,
579
+ },
580
+ ports.accountAdmission,
581
+ );
514
582
  const authMiddleware = createAuthMiddleware(authService);
515
583
 
516
584
  // Shared mutex so git and diff operations on the same workspace serialize
@@ -526,7 +594,7 @@ export async function createCoreServices(
526
594
  const gitService = new GitService(
527
595
  workspaceService,
528
596
  workflowHooks,
529
- kbDirName,
597
+ kb,
530
598
  workspaceMutex,
531
599
  accessControl,
532
600
  gitRunner,
@@ -611,7 +679,7 @@ export async function createCoreServices(
611
679
  accessControl,
612
680
  fileLockService,
613
681
  pendingCommitsService,
614
- kbDirName,
682
+ kb,
615
683
  changeGate,
616
684
  eventBus,
617
685
  fileChangeNotifier,
@@ -625,7 +693,7 @@ export async function createCoreServices(
625
693
  // (the request's branch vs the default branch), so it holds no state — it
626
694
  // only needs to read files at refs and to close a request whose proposals
627
695
  // have all landed.
628
- const joinRequestsService = new JoinRequestsService(workspaceService, workflowService);
696
+ const joinRequestsService = new JoinRequestsService(workspaceService, workflowService, kb);
629
697
  // The OTHER half of a join request: the row the subscribe endpoint writes
630
698
  // before it answers, and the branch/clone/commit/push/change-request work
631
699
  // that runs against it afterwards. The row is what lets the click be
@@ -634,7 +702,7 @@ export async function createCoreServices(
634
702
  const pluginJoinRequestJobs = new PluginJoinRequestJobs(new DbJoinRequestStore(db), {
635
703
  workflow: workflowService,
636
704
  workspaceService,
637
- kbDirName,
705
+ kb,
638
706
  // A record keys on the plugin's primary FOLDER below the root, which the
639
707
  // catalog is the only thing that can turn back into a path and a name
640
708
  // people read. Null once nothing answers to the key — a deleted plugin,
@@ -666,7 +734,7 @@ export async function createCoreServices(
666
734
  accessControl,
667
735
  skillService,
668
736
  pluginLinkIndex,
669
- kbDirName,
737
+ kb,
670
738
  eventBus,
671
739
  () => pluginIndexService.invalidate(),
672
740
  );
@@ -678,7 +746,7 @@ export async function createCoreServices(
678
746
  accessControl,
679
747
  pluginSource,
680
748
  disk,
681
- kbDirName,
749
+ kb,
682
750
  eventBus,
683
751
  () => {
684
752
  pluginIndexService.invalidate();
@@ -692,7 +760,7 @@ export async function createCoreServices(
692
760
  accessControl,
693
761
  skillService,
694
762
  pluginLinkIndex,
695
- kbDirName,
763
+ kb,
696
764
  {
697
765
  name: 'hexis',
698
766
  owner: 'Hexis',
@@ -727,7 +795,7 @@ export async function createCoreServices(
727
795
  workflowService,
728
796
  accessControl,
729
797
  toolManualService,
730
- kbDirName,
798
+ kb,
731
799
  disk,
732
800
  );
733
801
 
@@ -739,7 +807,7 @@ export async function createCoreServices(
739
807
  workspaceService,
740
808
  workflowService,
741
809
  accessControl,
742
- kbDirName,
810
+ kb,
743
811
  eventBus,
744
812
  pluginSource,
745
813
  disk,
@@ -755,6 +823,7 @@ export async function createCoreServices(
755
823
  accessControl,
756
824
  skillService,
757
825
  workflowService,
826
+ kb,
758
827
  );
759
828
 
760
829
  // The same missing half, for tools: a `.tool` manual or an `mcp.json` server
@@ -766,6 +835,7 @@ export async function createCoreServices(
766
835
  accessControl,
767
836
  toolManualService,
768
837
  workflowService,
838
+ kb,
769
839
  );
770
840
 
771
841
  // Catalog freshness: the skill / tool-manual / plugin-index caches all scan
@@ -777,7 +847,7 @@ export async function createCoreServices(
777
847
  registerCatalogCacheInvalidation({
778
848
  eventBus,
779
849
  fileChangeNotifier,
780
- kbDirName,
850
+ kb,
781
851
  catalogs: [toolManualService, skillService, pluginIndexService, pluginLinkIndex],
782
852
  accessControl,
783
853
  });
@@ -787,7 +857,7 @@ export async function createCoreServices(
787
857
  const adminAccess = new AdminAccessService(
788
858
  accessControl,
789
859
  workspaceService,
790
- () => DEFAULT_BRANCH,
860
+ () => kb.defaultBranch,
791
861
  // The deployment owner administers accounts/roles even before the KB's
792
862
  // roles.yaml lists them, and whatever the sign-in method — this list is
793
863
  // consulted before any roles.yaml lookup, so it holds for SSO too.
@@ -818,8 +888,11 @@ export async function createCoreServices(
818
888
  (key) => toolManualService.scopeOfVariable(key),
819
889
  );
820
890
  // Register the `bevel-secrets` UTCP variable loader against this vault so any
821
- // UTCP client can resolve `${VAR}` from the caller's secrets at tool-call time.
822
- registerBevelSecretsVariableLoader(secretsVaultService);
891
+ // UTCP client can resolve `${VAR}` from the caller's secrets at tool-call
892
+ // time — under this knowledge base's scope, since the loader registry is
893
+ // UTCP's and process-wide while the vault is this graph's.
894
+ const secretsScope = tenantKey ? `${config.tenantId}/${config.dbSchema}` : DEFAULT_SECRETS_SCOPE;
895
+ registerBevelSecretsVariableLoader(secretsVaultService, secretsScope);
823
896
 
824
897
  // Deleting ONE tool from its page — the owner's verb, the other end of the
825
898
  // promise that made them the owner. Built here because it is the one service
@@ -835,7 +908,7 @@ export async function createCoreServices(
835
908
  pluginIndexService,
836
909
  pluginSource,
837
910
  secretsVaultService,
838
- kbDirName,
911
+ kb,
839
912
  disk,
840
913
  );
841
914
 
@@ -845,7 +918,7 @@ export async function createCoreServices(
845
918
  // call, the vault to resolve the credential to call it with. Holds no state
846
919
  // and takes no `db`: a verdict is returned to the caller that asked for it and
847
920
  // never outlives their page (see `ProbeVerdict`).
848
- const connectionProbeService = new ConnectionProbeService(toolManualService, secretsVaultService);
921
+ const connectionProbeService = new ConnectionProbeService(toolManualService, secretsVaultService, secretsScope);
849
922
 
850
923
  // Zero-config OAuth for bare `type: mcp` `.tool`s: when the remote server
851
924
  // demands OAuth (MCP authorization spec), discover its authorization server,
@@ -917,7 +990,7 @@ export async function createCoreServices(
917
990
  // for readers, and the preamble is a broadcast). One reader, two consumers:
918
991
  // the proxy below composes in-process per request; the agent-facing route
919
992
  // serves the same composition to the local bridge and the frontend card.
920
- const readPreamble: AgentPreambleReader = () => readAgentPreamble(workspaceService, kbDirName, disk);
993
+ const readPreamble: AgentPreambleReader = () => readAgentPreamble(workspaceService, kb, disk);
921
994
  // The Audit log. Records through the proxy below (every call an external
922
995
  // agent makes), reads keys through the key service so their shape is
923
996
  // defined once, and prunes past the retention setting — read per sweep, so
@@ -930,7 +1003,7 @@ export async function createCoreServices(
930
1003
  // Loopback to our own REST tool surface — 127.0.0.1 (not localhost) to pin
931
1004
  // IPv4 and dodge resolver ambiguity. The proxy authenticates each call with
932
1005
  // the caller's own connection key.
933
- loopbackBaseUrl: `http://127.0.0.1:${config.port}`,
1006
+ loopbackBaseUrl: config.loopbackBaseUrl ?? `http://127.0.0.1:${config.port}`,
934
1007
  // Manual namespace + UTCP variable prefix (KNOWLEDGE_BASE_API_URL / …).
935
1008
  manualName: 'KNOWLEDGE_BASE',
936
1009
  // Oversized chain results spill here too — an external MCP caller has no
@@ -939,6 +1012,7 @@ export async function createCoreServices(
939
1012
  // For the needs-authorization setup link surfaced to external agents.
940
1013
  publicFrontendUrl: config.publicFrontendUrl,
941
1014
  readAgentPreamble: readPreamble,
1015
+ secretsScope,
942
1016
  },
943
1017
  // Pre-dispatch per-user credential check: the vault answers "has this caller
944
1018
  // set it?" and the manual catalog answers "which user-scoped vars does this
@@ -1060,12 +1134,6 @@ export async function createCoreServices(
1060
1134
  },
1061
1135
  });
1062
1136
  const leased = withStartupTask(pendingCommitsWorker, reconcileQueue);
1063
- // Not `start()`: the worker runs only while this process holds the
1064
- // commit-worker lease. On a redeploy the outgoing container still holds it,
1065
- // so this one serves requests and declines to drain until that one exits;
1066
- // then it takes the lease and starts. Two processes draining one shared
1067
- // clone volume is the failure this prevents — see `core/lifecycle.ts`.
1068
- const commitWorker = holdCommitWorkerLease(new AdvisoryLease(db, AdvisoryLock.CommitWorker), leased);
1069
1137
 
1070
1138
  // SSO providers. The array REFERENCE is shared with the caller's port — an
1071
1139
  // overlay pushes its own plugins into it after construction (they mount when
@@ -1112,7 +1180,7 @@ export async function createCoreServices(
1112
1180
  eventBus,
1113
1181
  kbDirName,
1114
1182
  bot,
1115
- defaultBranchOf: () => DEFAULT_BRANCH,
1183
+ defaultBranchOf: () => kb.defaultBranch,
1116
1184
  }),
1117
1185
  debounceMs: opts?.debounceMs,
1118
1186
  log: opts?.log ?? ((message) => logger('directory-sync').warn(message)),
@@ -1126,7 +1194,7 @@ export async function createCoreServices(
1126
1194
  workflowService,
1127
1195
  accessControl,
1128
1196
  kbDirName,
1129
- () => DEFAULT_BRANCH,
1197
+ () => kb.defaultBranch,
1130
1198
  eventBus,
1131
1199
  );
1132
1200
  // Account deletion's optional half: the erased address out of roles.yaml,
@@ -1138,22 +1206,39 @@ export async function createCoreServices(
1138
1206
  accessControl,
1139
1207
  disk,
1140
1208
  kbDirName,
1141
- () => DEFAULT_BRANCH,
1209
+ () => kb.defaultBranch,
1142
1210
  eventBus,
1143
1211
  [config.adminEmail],
1144
1212
  );
1145
1213
 
1214
+ // THE LAST THING STARTED, once everything above is built: the lease loop
1215
+ // is the one piece of this function that keeps running on its own, and a
1216
+ // throw anywhere after it would leave a loop holding — or forever asking
1217
+ // for — this knowledge base's lock with no graph to stop it. Single-tenant
1218
+ // never noticed (the process exited with the throw); a host that retries
1219
+ // an activation would. Not `start()`: the worker runs only while this
1220
+ // process holds the commit-worker lease. On a redeploy the outgoing
1221
+ // container still holds it, so this one serves requests and declines to
1222
+ // drain until that one exits; then it takes the lease and starts. Two
1223
+ // processes draining one shared clone volume is the failure this prevents
1224
+ // — see `core/lifecycle.ts`.
1225
+ const commitWorker = holdCommitWorkerLease(new AdvisoryLease(db, AdvisoryLock.CommitWorker, { tenantKey }), leased);
1226
+
1146
1227
  return {
1147
1228
  config,
1148
1229
  db,
1149
1230
  gitRunner,
1150
1231
  commitWorker,
1232
+ startupRetry: null,
1233
+ tenantKey,
1234
+ secretsScope,
1151
1235
  disk,
1152
1236
  mcpServerEditService,
1153
1237
  toolDeleteService,
1154
1238
  workspaceService,
1155
1239
  kbStartupRunner,
1156
1240
  settings,
1241
+ kb,
1157
1242
  kbDirName,
1158
1243
  spillStore,
1159
1244
  docExtractService,