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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (666) hide show
  1. package/dist/core/catalog-cache-invalidation.d.ts +7 -2
  2. package/dist/core/catalog-cache-invalidation.d.ts.map +1 -1
  3. package/dist/core/catalog-cache-invalidation.js +8 -9
  4. package/dist/core/catalog-cache-invalidation.js.map +1 -1
  5. package/dist/core/core-ports.d.ts +19 -0
  6. package/dist/core/core-ports.d.ts.map +1 -1
  7. package/dist/core/core-ports.js.map +1 -1
  8. package/dist/core/create-core-server.d.ts +2 -0
  9. package/dist/core/create-core-server.d.ts.map +1 -1
  10. package/dist/core/create-core-server.js +55 -107
  11. package/dist/core/create-core-server.js.map +1 -1
  12. package/dist/core/create-core-services.d.ts +41 -4
  13. package/dist/core/create-core-services.d.ts.map +1 -1
  14. package/dist/core/create-core-services.js +183 -82
  15. package/dist/core/create-core-services.js.map +1 -1
  16. package/dist/core/lifecycle.d.ts +74 -28
  17. package/dist/core/lifecycle.d.ts.map +1 -1
  18. package/dist/core/lifecycle.js +157 -20
  19. package/dist/core/lifecycle.js.map +1 -1
  20. package/dist/core/public-config.d.ts +5 -1
  21. package/dist/core/public-config.d.ts.map +1 -1
  22. package/dist/core/public-config.js +7 -5
  23. package/dist/core/public-config.js.map +1 -1
  24. package/dist/core-config.d.ts +95 -1
  25. package/dist/core-config.d.ts.map +1 -1
  26. package/dist/core-config.js +24 -8
  27. package/dist/core-config.js.map +1 -1
  28. package/dist/index.d.ts +5 -3
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +6 -3
  31. package/dist/index.js.map +1 -1
  32. package/dist/modules/access/access-control.service.d.ts +18 -1
  33. package/dist/modules/access/access-control.service.d.ts.map +1 -1
  34. package/dist/modules/access/access-control.service.js +19 -8
  35. package/dist/modules/access/access-control.service.js.map +1 -1
  36. package/dist/modules/access/access-requests.contract.d.ts +75 -0
  37. package/dist/modules/access/access-requests.contract.d.ts.map +1 -0
  38. package/dist/modules/access/access-requests.contract.js +20 -0
  39. package/dist/modules/access/access-requests.contract.js.map +1 -0
  40. package/dist/modules/access/access-requests.routes.d.ts +35 -0
  41. package/dist/modules/access/access-requests.routes.d.ts.map +1 -0
  42. package/dist/modules/access/access-requests.routes.js +237 -0
  43. package/dist/modules/access/access-requests.routes.js.map +1 -0
  44. package/dist/modules/access/access-requests.service.d.ts +123 -0
  45. package/dist/modules/access/access-requests.service.d.ts.map +1 -0
  46. package/dist/modules/access/access-requests.service.js +337 -0
  47. package/dist/modules/access/access-requests.service.js.map +1 -0
  48. package/dist/modules/access/access.routes.d.ts +2 -1
  49. package/dist/modules/access/access.routes.d.ts.map +1 -1
  50. package/dist/modules/access/access.routes.js +10 -10
  51. package/dist/modules/access/access.routes.js.map +1 -1
  52. package/dist/modules/access/change-read-gate.d.ts +6 -3
  53. package/dist/modules/access/change-read-gate.d.ts.map +1 -1
  54. package/dist/modules/access/change-read-gate.js +9 -6
  55. package/dist/modules/access/change-read-gate.js.map +1 -1
  56. package/dist/modules/access/creator-access.d.ts +4 -2
  57. package/dist/modules/access/creator-access.d.ts.map +1 -1
  58. package/dist/modules/access/creator-access.js +7 -4
  59. package/dist/modules/access/creator-access.js.map +1 -1
  60. package/dist/modules/access-model/access-grammar.d.ts +12 -0
  61. package/dist/modules/access-model/access-grammar.d.ts.map +1 -1
  62. package/dist/modules/access-model/access-grammar.js +24 -0
  63. package/dist/modules/access-model/access-grammar.js.map +1 -1
  64. package/dist/modules/agent-instructions/read-preamble.d.ts +2 -1
  65. package/dist/modules/agent-instructions/read-preamble.d.ts.map +1 -1
  66. package/dist/modules/agent-instructions/read-preamble.js +6 -9
  67. package/dist/modules/agent-instructions/read-preamble.js.map +1 -1
  68. package/dist/modules/auth/account-admission.d.ts +40 -0
  69. package/dist/modules/auth/account-admission.d.ts.map +1 -0
  70. package/dist/modules/auth/account-admission.js +17 -0
  71. package/dist/modules/auth/account-admission.js.map +1 -0
  72. package/dist/modules/auth/account.routes.d.ts.map +1 -1
  73. package/dist/modules/auth/account.routes.js +4 -1
  74. package/dist/modules/auth/account.routes.js.map +1 -1
  75. package/dist/modules/auth/auth.service.d.ts +45 -2
  76. package/dist/modules/auth/auth.service.d.ts.map +1 -1
  77. package/dist/modules/auth/auth.service.js +44 -3
  78. package/dist/modules/auth/auth.service.js.map +1 -1
  79. package/dist/modules/auth/oidc-auth-provider.d.ts.map +1 -1
  80. package/dist/modules/auth/oidc-auth-provider.js +9 -0
  81. package/dist/modules/auth/oidc-auth-provider.js.map +1 -1
  82. package/dist/modules/connection-probe/connection-probe.service.d.ts +13 -1
  83. package/dist/modules/connection-probe/connection-probe.service.d.ts.map +1 -1
  84. package/dist/modules/connection-probe/connection-probe.service.js +10 -2
  85. package/dist/modules/connection-probe/connection-probe.service.js.map +1 -1
  86. package/dist/modules/database/advisory-lock.d.ts +17 -0
  87. package/dist/modules/database/advisory-lock.d.ts.map +1 -1
  88. package/dist/modules/database/advisory-lock.js +24 -3
  89. package/dist/modules/database/advisory-lock.js.map +1 -1
  90. package/dist/modules/database/connection.d.ts +67 -2
  91. package/dist/modules/database/connection.d.ts.map +1 -1
  92. package/dist/modules/database/connection.js +118 -12
  93. package/dist/modules/database/connection.js.map +1 -1
  94. package/dist/modules/database/migrate.d.ts +1 -1
  95. package/dist/modules/database/migrate.d.ts.map +1 -1
  96. package/dist/modules/database/migrate.js +27 -3
  97. package/dist/modules/database/migrate.js.map +1 -1
  98. package/dist/modules/github-app/github-app.client.d.ts +101 -0
  99. package/dist/modules/github-app/github-app.client.d.ts.map +1 -0
  100. package/dist/modules/github-app/github-app.client.js +222 -0
  101. package/dist/modules/github-app/github-app.client.js.map +1 -0
  102. package/dist/modules/github-app/github-app.connection.d.ts +102 -0
  103. package/dist/modules/github-app/github-app.connection.d.ts.map +1 -0
  104. package/dist/modules/github-app/github-app.connection.js +185 -0
  105. package/dist/modules/github-app/github-app.connection.js.map +1 -0
  106. package/dist/modules/github-app/github-app.routes.d.ts +59 -0
  107. package/dist/modules/github-app/github-app.routes.d.ts.map +1 -0
  108. package/dist/modules/github-app/github-app.routes.js +323 -0
  109. package/dist/modules/github-app/github-app.routes.js.map +1 -0
  110. package/dist/modules/github-app/index.d.ts +4 -0
  111. package/dist/modules/github-app/index.d.ts.map +1 -0
  112. package/dist/modules/github-app/index.js +4 -0
  113. package/dist/modules/github-app/index.js.map +1 -0
  114. package/dist/modules/kb-fs/branch-name.d.ts +0 -1
  115. package/dist/modules/kb-fs/branch-name.d.ts.map +1 -1
  116. package/dist/modules/kb-fs/branch-name.js +3 -3
  117. package/dist/modules/kb-fs/branch-name.js.map +1 -1
  118. package/dist/modules/kb-fs/clone-config.d.ts +9 -8
  119. package/dist/modules/kb-fs/clone-config.d.ts.map +1 -1
  120. package/dist/modules/kb-fs/clone-config.js +14 -12
  121. package/dist/modules/kb-fs/clone-config.js.map +1 -1
  122. package/dist/modules/kb-fs/remote-url.d.ts +22 -0
  123. package/dist/modules/kb-fs/remote-url.d.ts.map +1 -0
  124. package/dist/modules/kb-fs/remote-url.js +35 -0
  125. package/dist/modules/kb-fs/remote-url.js.map +1 -0
  126. package/dist/modules/mcp/mcp.service.d.ts +7 -0
  127. package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
  128. package/dist/modules/mcp/mcp.service.js +4 -4
  129. package/dist/modules/mcp/mcp.service.js.map +1 -1
  130. package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts +4 -4
  131. package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts.map +1 -1
  132. package/dist/modules/plugins/compile/marketplace-compiler.service.js +7 -10
  133. package/dist/modules/plugins/compile/marketplace-compiler.service.js.map +1 -1
  134. package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.d.ts +4 -1
  135. package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.d.ts.map +1 -1
  136. package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.js +5 -3
  137. package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.js.map +1 -1
  138. package/dist/modules/plugins/discovery/kb-plugin-source.d.ts +6 -1
  139. package/dist/modules/plugins/discovery/kb-plugin-source.d.ts.map +1 -1
  140. package/dist/modules/plugins/discovery/kb-plugin-source.js +14 -9
  141. package/dist/modules/plugins/discovery/kb-plugin-source.js.map +1 -1
  142. package/dist/modules/plugins/discovery/native.source.d.ts +4 -1
  143. package/dist/modules/plugins/discovery/native.source.d.ts.map +1 -1
  144. package/dist/modules/plugins/discovery/native.source.js +4 -2
  145. package/dist/modules/plugins/discovery/native.source.js.map +1 -1
  146. package/dist/modules/plugins/index.d.ts +1 -1
  147. package/dist/modules/plugins/index.d.ts.map +1 -1
  148. package/dist/modules/plugins/index.js +1 -1
  149. package/dist/modules/plugins/index.js.map +1 -1
  150. package/dist/modules/plugins/join-proposals.d.ts +17 -5
  151. package/dist/modules/plugins/join-proposals.d.ts.map +1 -1
  152. package/dist/modules/plugins/join-proposals.js +76 -22
  153. package/dist/modules/plugins/join-proposals.js.map +1 -1
  154. package/dist/modules/plugins/join-request-jobs.service.d.ts +3 -1
  155. package/dist/modules/plugins/join-request-jobs.service.d.ts.map +1 -1
  156. package/dist/modules/plugins/join-request-jobs.service.js +6 -6
  157. package/dist/modules/plugins/join-request-jobs.service.js.map +1 -1
  158. package/dist/modules/plugins/join-requests.service.d.ts +113 -18
  159. package/dist/modules/plugins/join-requests.service.d.ts.map +1 -1
  160. package/dist/modules/plugins/join-requests.service.js +178 -33
  161. package/dist/modules/plugins/join-requests.service.js.map +1 -1
  162. package/dist/modules/plugins/plugin-links.d.ts +65 -10
  163. package/dist/modules/plugins/plugin-links.d.ts.map +1 -1
  164. package/dist/modules/plugins/plugin-links.js +136 -31
  165. package/dist/modules/plugins/plugin-links.js.map +1 -1
  166. package/dist/modules/plugins/plugin-links.service.d.ts +107 -5
  167. package/dist/modules/plugins/plugin-links.service.d.ts.map +1 -1
  168. package/dist/modules/plugins/plugin-links.service.js +151 -21
  169. package/dist/modules/plugins/plugin-links.service.js.map +1 -1
  170. package/dist/modules/plugins/plugin-provision.service.d.ts +10 -3
  171. package/dist/modules/plugins/plugin-provision.service.d.ts.map +1 -1
  172. package/dist/modules/plugins/plugin-provision.service.js +33 -26
  173. package/dist/modules/plugins/plugin-provision.service.js.map +1 -1
  174. package/dist/modules/plugins/plugin-rename.service.d.ts +4 -2
  175. package/dist/modules/plugins/plugin-rename.service.d.ts.map +1 -1
  176. package/dist/modules/plugins/plugin-rename.service.js +10 -12
  177. package/dist/modules/plugins/plugin-rename.service.js.map +1 -1
  178. package/dist/modules/plugins/plugins.routes.d.ts +3 -0
  179. package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
  180. package/dist/modules/plugins/plugins.routes.js +48 -17
  181. package/dist/modules/plugins/plugins.routes.js.map +1 -1
  182. package/dist/modules/plugins/plugins.service.d.ts +4 -4
  183. package/dist/modules/plugins/plugins.service.d.ts.map +1 -1
  184. package/dist/modules/plugins/plugins.service.js +7 -10
  185. package/dist/modules/plugins/plugins.service.js.map +1 -1
  186. package/dist/modules/plugins/teams.routes.d.ts +4 -1
  187. package/dist/modules/plugins/teams.routes.d.ts.map +1 -1
  188. package/dist/modules/plugins/teams.routes.js +11 -9
  189. package/dist/modules/plugins/teams.routes.js.map +1 -1
  190. package/dist/modules/secrets-vault/index.d.ts +1 -1
  191. package/dist/modules/secrets-vault/index.d.ts.map +1 -1
  192. package/dist/modules/secrets-vault/index.js +1 -1
  193. package/dist/modules/secrets-vault/index.js.map +1 -1
  194. package/dist/modules/secrets-vault/secrets-variable-loader.d.ts +29 -11
  195. package/dist/modules/secrets-vault/secrets-variable-loader.d.ts.map +1 -1
  196. package/dist/modules/secrets-vault/secrets-variable-loader.js +46 -21
  197. package/dist/modules/secrets-vault/secrets-variable-loader.js.map +1 -1
  198. package/dist/modules/secrets-vault/secrets-vault.routes.d.ts +3 -0
  199. package/dist/modules/secrets-vault/secrets-vault.routes.d.ts.map +1 -1
  200. package/dist/modules/secrets-vault/secrets-vault.routes.js +4 -6
  201. package/dist/modules/secrets-vault/secrets-vault.routes.js.map +1 -1
  202. package/dist/modules/settings/deployment-settings.service.d.ts +34 -9
  203. package/dist/modules/settings/deployment-settings.service.d.ts.map +1 -1
  204. package/dist/modules/settings/deployment-settings.service.js +113 -26
  205. package/dist/modules/settings/deployment-settings.service.js.map +1 -1
  206. package/dist/modules/settings/managed-repository.d.ts +43 -0
  207. package/dist/modules/settings/managed-repository.d.ts.map +1 -0
  208. package/dist/modules/settings/managed-repository.js +60 -0
  209. package/dist/modules/settings/managed-repository.js.map +1 -0
  210. package/dist/modules/settings/repository-source.d.ts +128 -0
  211. package/dist/modules/settings/repository-source.d.ts.map +1 -0
  212. package/dist/modules/settings/repository-source.js +150 -0
  213. package/dist/modules/settings/repository-source.js.map +1 -0
  214. package/dist/modules/settings/setup.routes.d.ts +34 -4
  215. package/dist/modules/settings/setup.routes.d.ts.map +1 -1
  216. package/dist/modules/settings/setup.routes.js +198 -18
  217. package/dist/modules/settings/setup.routes.js.map +1 -1
  218. package/dist/modules/skills/allowed-tools-check.d.ts +4 -3
  219. package/dist/modules/skills/allowed-tools-check.d.ts.map +1 -1
  220. package/dist/modules/skills/allowed-tools-check.js +8 -8
  221. package/dist/modules/skills/allowed-tools-check.js.map +1 -1
  222. package/dist/modules/skills/pending-skills.service.d.ts +3 -1
  223. package/dist/modules/skills/pending-skills.service.d.ts.map +1 -1
  224. package/dist/modules/skills/pending-skills.service.js +9 -6
  225. package/dist/modules/skills/pending-skills.service.js.map +1 -1
  226. package/dist/modules/skills/skill-access-requests.routes.d.ts +8 -9
  227. package/dist/modules/skills/skill-access-requests.routes.d.ts.map +1 -1
  228. package/dist/modules/skills/skill-access-requests.routes.js +26 -65
  229. package/dist/modules/skills/skill-access-requests.routes.js.map +1 -1
  230. package/dist/modules/skills/skills.routes.d.ts +4 -1
  231. package/dist/modules/skills/skills.routes.d.ts.map +1 -1
  232. package/dist/modules/skills/skills.routes.js +4 -4
  233. package/dist/modules/skills/skills.routes.js.map +1 -1
  234. package/dist/modules/skills/skills.service.d.ts +4 -2
  235. package/dist/modules/skills/skills.service.d.ts.map +1 -1
  236. package/dist/modules/skills/skills.service.js +13 -11
  237. package/dist/modules/skills/skills.service.js.map +1 -1
  238. package/dist/modules/tool-helpers/tool-context.d.ts.map +1 -1
  239. package/dist/modules/tool-helpers/tool-context.js +15 -0
  240. package/dist/modules/tool-helpers/tool-context.js.map +1 -1
  241. package/dist/modules/tool-manuals/mcp-json-discovery.d.ts +2 -1
  242. package/dist/modules/tool-manuals/mcp-json-discovery.d.ts.map +1 -1
  243. package/dist/modules/tool-manuals/mcp-json-discovery.js +6 -5
  244. package/dist/modules/tool-manuals/mcp-json-discovery.js.map +1 -1
  245. package/dist/modules/tool-manuals/mcp-server-edit.service.d.ts +4 -2
  246. package/dist/modules/tool-manuals/mcp-server-edit.service.d.ts.map +1 -1
  247. package/dist/modules/tool-manuals/mcp-server-edit.service.js +12 -10
  248. package/dist/modules/tool-manuals/mcp-server-edit.service.js.map +1 -1
  249. package/dist/modules/tool-manuals/pending-tools.service.d.ts +3 -1
  250. package/dist/modules/tool-manuals/pending-tools.service.d.ts.map +1 -1
  251. package/dist/modules/tool-manuals/pending-tools.service.js +19 -16
  252. package/dist/modules/tool-manuals/pending-tools.service.js.map +1 -1
  253. package/dist/modules/tool-manuals/tool-delete.service.d.ts +4 -2
  254. package/dist/modules/tool-manuals/tool-delete.service.d.ts.map +1 -1
  255. package/dist/modules/tool-manuals/tool-delete.service.js +14 -12
  256. package/dist/modules/tool-manuals/tool-delete.service.js.map +1 -1
  257. package/dist/modules/tool-manuals/tool-manuals.routes.d.ts +3 -1
  258. package/dist/modules/tool-manuals/tool-manuals.routes.d.ts.map +1 -1
  259. package/dist/modules/tool-manuals/tool-manuals.routes.js +7 -7
  260. package/dist/modules/tool-manuals/tool-manuals.routes.js.map +1 -1
  261. package/dist/modules/tool-manuals/tool-manuals.service.d.ts +4 -2
  262. package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
  263. package/dist/modules/tool-manuals/tool-manuals.service.js +15 -12
  264. package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -1
  265. package/dist/modules/tool-manuals/tool-manuals.tools.d.ts +3 -0
  266. package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
  267. package/dist/modules/tool-manuals/tool-manuals.tools.js +4 -6
  268. package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
  269. package/dist/modules/workflow/agent-tools/workflow.tools.d.ts +3 -2
  270. package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +1 -1
  271. package/dist/modules/workflow/agent-tools/workflow.tools.js +47 -11
  272. package/dist/modules/workflow/agent-tools/workflow.tools.js.map +1 -1
  273. package/dist/modules/workflow/git/git.service.d.ts +14 -6
  274. package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
  275. package/dist/modules/workflow/git/git.service.js +40 -18
  276. package/dist/modules/workflow/git/git.service.js.map +1 -1
  277. package/dist/modules/workflow/git/node-git-runner.d.ts +26 -2
  278. package/dist/modules/workflow/git/node-git-runner.d.ts.map +1 -1
  279. package/dist/modules/workflow/git/node-git-runner.js +40 -5
  280. package/dist/modules/workflow/git/node-git-runner.js.map +1 -1
  281. package/dist/modules/workflow/git/pull-request.service.d.ts +45 -0
  282. package/dist/modules/workflow/git/pull-request.service.d.ts.map +1 -1
  283. package/dist/modules/workflow/git/pull-request.service.js +99 -0
  284. package/dist/modules/workflow/git/pull-request.service.js.map +1 -1
  285. package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts.map +1 -1
  286. package/dist/modules/workflow/review-workflow/review-workflow.service.js +9 -4
  287. package/dist/modules/workflow/review-workflow/review-workflow.service.js.map +1 -1
  288. package/dist/modules/workflow/session-ontology.service.d.ts +6 -1
  289. package/dist/modules/workflow/session-ontology.service.d.ts.map +1 -1
  290. package/dist/modules/workflow/session-ontology.service.js +6 -2
  291. package/dist/modules/workflow/session-ontology.service.js.map +1 -1
  292. package/dist/modules/workflow/workflow.routes.d.ts.map +1 -1
  293. package/dist/modules/workflow/workflow.routes.js +3 -1
  294. package/dist/modules/workflow/workflow.routes.js.map +1 -1
  295. package/dist/modules/workflow/workflow.service.d.ts +42 -10
  296. package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
  297. package/dist/modules/workflow/workflow.service.js +181 -71
  298. package/dist/modules/workflow/workflow.service.js.map +1 -1
  299. package/dist/modules/workspace/session-ontology.gate.d.ts +3 -1
  300. package/dist/modules/workspace/session-ontology.gate.d.ts.map +1 -1
  301. package/dist/modules/workspace/session-ontology.gate.js +3 -3
  302. package/dist/modules/workspace/session-ontology.gate.js.map +1 -1
  303. package/dist/modules/workspace/startup/kb-git.d.ts +4 -3
  304. package/dist/modules/workspace/startup/kb-git.d.ts.map +1 -1
  305. package/dist/modules/workspace/startup/kb-git.js +15 -13
  306. package/dist/modules/workspace/startup/kb-git.js.map +1 -1
  307. package/dist/modules/workspace/startup/kb-startup-runner.d.ts +70 -7
  308. package/dist/modules/workspace/startup/kb-startup-runner.d.ts.map +1 -1
  309. package/dist/modules/workspace/startup/kb-startup-runner.js +183 -38
  310. package/dist/modules/workspace/startup/kb-startup-runner.js.map +1 -1
  311. package/dist/modules/workspace/startup/steps/groups-to-plugins.step.d.ts +7 -1
  312. package/dist/modules/workspace/startup/steps/groups-to-plugins.step.d.ts.map +1 -1
  313. package/dist/modules/workspace/startup/steps/groups-to-plugins.step.js +23 -16
  314. package/dist/modules/workspace/startup/steps/groups-to-plugins.step.js.map +1 -1
  315. package/dist/modules/workspace/startup/steps/personal-spaces.step.d.ts +7 -1
  316. package/dist/modules/workspace/startup/steps/personal-spaces.step.d.ts.map +1 -1
  317. package/dist/modules/workspace/startup/steps/personal-spaces.step.js +12 -5
  318. package/dist/modules/workspace/startup/steps/personal-spaces.step.js.map +1 -1
  319. package/dist/modules/workspace/startup/steps/plugin-display-names.step.d.ts +7 -1
  320. package/dist/modules/workspace/startup/steps/plugin-display-names.step.d.ts.map +1 -1
  321. package/dist/modules/workspace/startup/steps/plugin-display-names.step.js +12 -5
  322. package/dist/modules/workspace/startup/steps/plugin-display-names.step.js.map +1 -1
  323. package/dist/modules/workspace/startup/steps/plugin-manifests.step.d.ts +7 -1
  324. package/dist/modules/workspace/startup/steps/plugin-manifests.step.d.ts.map +1 -1
  325. package/dist/modules/workspace/startup/steps/plugin-manifests.step.js +12 -5
  326. package/dist/modules/workspace/startup/steps/plugin-manifests.step.js.map +1 -1
  327. package/dist/modules/workspace/startup/steps/seed-tree.d.ts +4 -1
  328. package/dist/modules/workspace/startup/steps/seed-tree.d.ts.map +1 -1
  329. package/dist/modules/workspace/startup/steps/seed-tree.js +14 -11
  330. package/dist/modules/workspace/startup/steps/seed-tree.js.map +1 -1
  331. package/dist/modules/workspace/startup/steps/template-files.step.d.ts +17 -3
  332. package/dist/modules/workspace/startup/steps/template-files.step.d.ts.map +1 -1
  333. package/dist/modules/workspace/startup/steps/template-files.step.js +36 -30
  334. package/dist/modules/workspace/startup/steps/template-files.step.js.map +1 -1
  335. package/dist/modules/workspace/startup/steps/template-source.d.ts +6 -1
  336. package/dist/modules/workspace/startup/steps/template-source.d.ts.map +1 -1
  337. package/dist/modules/workspace/startup/steps/template-source.js +10 -6
  338. package/dist/modules/workspace/startup/steps/template-source.js.map +1 -1
  339. package/dist/modules/workspace/workspace.routes.d.ts +2 -1
  340. package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
  341. package/dist/modules/workspace/workspace.routes.js +8 -7
  342. package/dist/modules/workspace/workspace.routes.js.map +1 -1
  343. package/dist/modules/workspace/workspace.service.d.ts +18 -12
  344. package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
  345. package/dist/modules/workspace/workspace.service.js +49 -29
  346. package/dist/modules/workspace/workspace.service.js.map +1 -1
  347. package/dist/modules/workspace/workspace.tools.d.ts +2 -1
  348. package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
  349. package/dist/modules/workspace/workspace.tools.js +48 -20
  350. package/dist/modules/workspace/workspace.tools.js.map +1 -1
  351. package/dist/modules/workspace/write-denial.d.ts +3 -2
  352. package/dist/modules/workspace/write-denial.d.ts.map +1 -1
  353. package/dist/modules/workspace/write-denial.js +6 -5
  354. package/dist/modules/workspace/write-denial.js.map +1 -1
  355. package/dist/shared/domain-errors.d.ts +39 -0
  356. package/dist/shared/domain-errors.d.ts.map +1 -1
  357. package/dist/shared/domain-errors.js +55 -0
  358. package/dist/shared/domain-errors.js.map +1 -1
  359. package/dist/shared/git.contract.d.ts +62 -7
  360. package/dist/shared/git.contract.d.ts.map +1 -1
  361. package/dist/shared/git.contract.js +30 -8
  362. package/dist/shared/git.contract.js.map +1 -1
  363. package/dist/shared/kb-context.d.ts +76 -0
  364. package/dist/shared/kb-context.d.ts.map +1 -0
  365. package/dist/shared/kb-context.js +108 -0
  366. package/dist/shared/kb-context.js.map +1 -0
  367. package/dist/shared/kb-layout.d.ts +3 -2
  368. package/dist/shared/kb-layout.d.ts.map +1 -1
  369. package/dist/shared/kb-layout.js +4 -3
  370. package/dist/shared/kb-layout.js.map +1 -1
  371. package/dist/shared/kb-layout.test.js +35 -27
  372. package/dist/shared/kb-layout.test.js.map +1 -1
  373. package/dist/shared/pending-proposals.d.ts +4 -1
  374. package/dist/shared/pending-proposals.d.ts.map +1 -1
  375. package/dist/shared/pending-proposals.js +3 -4
  376. package/dist/shared/pending-proposals.js.map +1 -1
  377. package/dist/shared/redact-secret.d.ts +5 -5
  378. package/dist/shared/redact-secret.js +5 -5
  379. package/dist/tenancy/index.d.ts +13 -0
  380. package/dist/tenancy/index.d.ts.map +1 -0
  381. package/dist/tenancy/index.js +13 -0
  382. package/dist/tenancy/index.js.map +1 -0
  383. package/dist/tenancy/static-tenant-source.d.ts +98 -0
  384. package/dist/tenancy/static-tenant-source.d.ts.map +1 -0
  385. package/dist/tenancy/static-tenant-source.js +220 -0
  386. package/dist/tenancy/static-tenant-source.js.map +1 -0
  387. package/dist/tenancy/tenant-host.d.ts +80 -0
  388. package/dist/tenancy/tenant-host.d.ts.map +1 -0
  389. package/dist/tenancy/tenant-host.js +217 -0
  390. package/dist/tenancy/tenant-host.js.map +1 -0
  391. package/dist/tenancy/tenant-runtime.d.ts +91 -0
  392. package/dist/tenancy/tenant-runtime.d.ts.map +1 -0
  393. package/dist/tenancy/tenant-runtime.js +174 -0
  394. package/dist/tenancy/tenant-runtime.js.map +1 -0
  395. package/dist/tenancy/tenant-secrets.d.ts +24 -0
  396. package/dist/tenancy/tenant-secrets.d.ts.map +1 -0
  397. package/dist/tenancy/tenant-secrets.js +30 -0
  398. package/dist/tenancy/tenant-secrets.js.map +1 -0
  399. package/dist/tenancy/tenant-source.contract.d.ts +45 -0
  400. package/dist/tenancy/tenant-source.contract.d.ts.map +1 -0
  401. package/dist/tenancy/tenant-source.contract.js +21 -0
  402. package/dist/tenancy/tenant-source.contract.js.map +1 -0
  403. package/migrations/0000_core_init.sql +14 -14
  404. package/migrations/0003_deployment_settings.sql +1 -1
  405. package/migrations/0005_github_facade.sql +1 -1
  406. package/migrations/0012_agent_audit.sql +6 -6
  407. package/package.json +3 -3
  408. package/src/__tests__/branch-model.test.ts +7 -6
  409. package/src/__tests__/kb-context.ts +30 -0
  410. package/src/__tests__/kb-layout-config.test.ts +35 -30
  411. package/src/core/__tests__/catalog-cache-invalidation.test.ts +2 -1
  412. package/src/core/__tests__/lifecycle.test.ts +78 -1
  413. package/src/core/__tests__/public-config.test.ts +5 -1
  414. package/src/core/catalog-cache-invalidation.ts +16 -11
  415. package/src/core/core-ports.ts +19 -0
  416. package/src/core/create-core-server.ts +64 -107
  417. package/src/core/create-core-services.ts +238 -96
  418. package/src/core/lifecycle.ts +214 -29
  419. package/src/core/public-config.ts +8 -5
  420. package/src/core-config.ts +107 -8
  421. package/src/index.ts +25 -2
  422. package/src/modules/access/__tests__/access-control.admin-root-floor.test.ts +2 -1
  423. package/src/modules/access/__tests__/access-requests.recut.test.ts +134 -0
  424. package/src/modules/access/__tests__/access-requests.routes.test.ts +610 -0
  425. package/src/modules/access/__tests__/access.routes.batch.test.ts +2 -1
  426. package/src/modules/access/__tests__/access.routes.folder-governs.test.ts +2 -1
  427. package/src/modules/access/__tests__/access.routes.group-grant.test.ts +2 -1
  428. package/src/modules/access/__tests__/access.routes.overrides.test.ts +2 -1
  429. package/src/modules/access/__tests__/access.routes.proposal-branch.test.ts +2 -1
  430. package/src/modules/access/__tests__/access.routes.prospective.test.ts +2 -1
  431. package/src/modules/access/__tests__/access.routes.revoke.test.ts +2 -1
  432. package/src/modules/access/__tests__/access.routes.unknown-email.test.ts +2 -1
  433. package/src/modules/access/__tests__/change-read-gate.test.ts +13 -11
  434. package/src/modules/access/__tests__/creator-access.test.ts +3 -2
  435. package/src/modules/access/__tests__/roles.routes.test.ts +2 -1
  436. package/src/modules/access/access-control.service.ts +20 -6
  437. package/src/modules/access/access-requests.contract.ts +93 -0
  438. package/src/modules/access/access-requests.routes.ts +286 -0
  439. package/src/modules/access/access-requests.service.ts +420 -0
  440. package/src/modules/access/access.routes.ts +10 -13
  441. package/src/modules/access/change-read-gate.ts +10 -4
  442. package/src/modules/access/creator-access.ts +7 -2
  443. package/src/modules/access-model/access-grammar.ts +22 -0
  444. package/src/modules/agent-instructions/__tests__/read-preamble.test.ts +13 -12
  445. package/src/modules/agent-instructions/read-preamble.ts +10 -12
  446. package/src/modules/auth/__tests__/account.routes.test.ts +15 -0
  447. package/src/modules/auth/__tests__/auth.service.test.ts +98 -0
  448. package/src/modules/auth/account-admission.ts +44 -0
  449. package/src/modules/auth/account.routes.ts +4 -1
  450. package/src/modules/auth/auth.service.ts +61 -2
  451. package/src/modules/auth/oidc-auth-provider.ts +9 -0
  452. package/src/modules/connection-probe/connection-probe.service.ts +7 -1
  453. package/src/modules/database/__tests__/advisory-lock.test.ts +23 -1
  454. package/src/modules/database/__tests__/connection.test.ts +98 -0
  455. package/src/modules/database/__tests__/migrations-unqualified.test.ts +32 -0
  456. package/src/modules/database/advisory-lock.ts +28 -4
  457. package/src/modules/database/connection.ts +143 -13
  458. package/src/modules/database/migrate.ts +48 -14
  459. package/src/modules/diff/__tests__/diff.service.seed-atomicity.test.ts +2 -1
  460. package/src/modules/diff/__tests__/diff.service.test.ts +2 -1
  461. package/src/modules/github-app/__tests__/github-app.test.ts +848 -0
  462. package/src/modules/github-app/github-app.client.ts +268 -0
  463. package/src/modules/github-app/github-app.connection.ts +204 -0
  464. package/src/modules/github-app/github-app.routes.ts +359 -0
  465. package/src/modules/github-app/index.ts +19 -0
  466. package/src/modules/kb-fs/__tests__/branch-name.test.ts +6 -6
  467. package/src/modules/kb-fs/__tests__/clone-config.test.ts +24 -20
  468. package/src/modules/kb-fs/__tests__/remote-url.test.ts +38 -0
  469. package/src/modules/kb-fs/branch-name.ts +3 -3
  470. package/src/modules/kb-fs/clone-config.ts +15 -12
  471. package/src/modules/kb-fs/remote-url.ts +35 -0
  472. package/src/modules/marketplace/__tests__/marketplace-repo.head.test.ts +2 -1
  473. package/src/modules/mcp/mcp.service.ts +11 -4
  474. package/src/modules/plugins/__tests__/bundle-dialect.e2e.test.ts +12 -11
  475. package/src/modules/plugins/__tests__/bundle-dialect.test.ts +2 -1
  476. package/src/modules/plugins/__tests__/compile-marketplace.test.ts +6 -4
  477. package/src/modules/plugins/__tests__/join-proposals.test.ts +100 -19
  478. package/src/modules/plugins/__tests__/join-request-jobs.service.test.ts +2 -1
  479. package/src/modules/plugins/__tests__/join-requests.service.test.ts +28 -11
  480. package/src/modules/plugins/__tests__/join-requests.settlement.test.ts +371 -0
  481. package/src/modules/plugins/__tests__/plugin-creation-display-name.test.ts +4 -3
  482. package/src/modules/plugins/__tests__/plugin-index.service.test.ts +6 -4
  483. package/src/modules/plugins/__tests__/plugin-links.service.test.ts +220 -5
  484. package/src/modules/plugins/__tests__/plugin-provision.service.test.ts +3 -1
  485. package/src/modules/plugins/__tests__/plugin-rename.service.test.ts +7 -6
  486. package/src/modules/plugins/__tests__/plugins.routes.test.ts +12 -3
  487. package/src/modules/plugins/__tests__/teams.routes.test.ts +2 -1
  488. package/src/modules/plugins/compile/marketplace-compiler.service.ts +7 -9
  489. package/src/modules/plugins/discovery/__tests__/kb-plugin-source.test.ts +20 -16
  490. package/src/modules/plugins/discovery/bundle-dialect/bundle.source.ts +9 -2
  491. package/src/modules/plugins/discovery/kb-plugin-source.ts +15 -8
  492. package/src/modules/plugins/discovery/native.source.ts +4 -1
  493. package/src/modules/plugins/index.ts +1 -1
  494. package/src/modules/plugins/join-proposals.ts +87 -19
  495. package/src/modules/plugins/join-request-jobs.service.ts +8 -7
  496. package/src/modules/plugins/join-requests.service.ts +203 -43
  497. package/src/modules/plugins/plugin-links.service.ts +192 -19
  498. package/src/modules/plugins/plugin-links.ts +147 -27
  499. package/src/modules/plugins/plugin-provision.service.ts +54 -27
  500. package/src/modules/plugins/plugin-rename.service.ts +10 -10
  501. package/src/modules/plugins/plugins.routes.ts +48 -17
  502. package/src/modules/plugins/plugins.service.ts +7 -11
  503. package/src/modules/plugins/teams.routes.ts +16 -8
  504. package/src/modules/secrets-vault/__tests__/connect-pending.route.test.ts +7 -0
  505. package/src/modules/secrets-vault/__tests__/secrets-variable-loader.test.ts +40 -0
  506. package/src/modules/secrets-vault/__tests__/tool-owner-gate.route.test.ts +2 -0
  507. package/src/modules/secrets-vault/index.ts +2 -0
  508. package/src/modules/secrets-vault/secrets-variable-loader.ts +51 -21
  509. package/src/modules/secrets-vault/secrets-vault.routes.ts +7 -6
  510. package/src/modules/settings/__tests__/deployment-settings.service.test.ts +24 -11
  511. package/src/modules/settings/__tests__/git-root-folders.test.ts +2 -1
  512. package/src/modules/settings/__tests__/repository-source.test.ts +191 -0
  513. package/src/modules/settings/__tests__/setup.routes.boot-failure.test.ts +2 -1
  514. package/src/modules/settings/__tests__/setup.routes.git-mode.test.ts +353 -0
  515. package/src/modules/settings/__tests__/setup.routes.github-app.test.ts +282 -0
  516. package/src/modules/settings/__tests__/setup.routes.layout-phase.test.ts +7 -4
  517. package/src/modules/settings/__tests__/setup.routes.managed-phase.test.ts +233 -0
  518. package/src/modules/settings/__tests__/setup.routes.oidc.test.ts +2 -0
  519. package/src/modules/settings/__tests__/setup.routes.sync-status.test.ts +2 -0
  520. package/src/modules/settings/__tests__/setup.routes.test.ts +33 -52
  521. package/src/modules/settings/deployment-settings.service.ts +130 -23
  522. package/src/modules/settings/managed-repository.ts +68 -0
  523. package/src/modules/settings/repository-source.ts +197 -0
  524. package/src/modules/settings/setup.routes.ts +233 -19
  525. package/src/modules/skills/__tests__/allowed-tools-check.test.ts +11 -10
  526. package/src/modules/skills/__tests__/allowed-tools-warn.tools.test.ts +4 -3
  527. package/src/modules/skills/__tests__/pending-skills.service.test.ts +3 -1
  528. package/src/modules/skills/__tests__/skill-access-requests.routes.test.ts +7 -2
  529. package/src/modules/skills/__tests__/skills.routes.warnings.test.ts +2 -1
  530. package/src/modules/skills/__tests__/skills.service.test.ts +3 -2
  531. package/src/modules/skills/allowed-tools-check.ts +7 -6
  532. package/src/modules/skills/pending-skills.service.ts +9 -8
  533. package/src/modules/skills/skill-access-requests.routes.ts +29 -79
  534. package/src/modules/skills/skills.routes.ts +4 -3
  535. package/src/modules/skills/skills.service.ts +13 -9
  536. package/src/modules/tool-helpers/__tests__/agent-roles-write.test.ts +3 -2
  537. package/src/modules/tool-helpers/__tests__/phase4-tools.test.ts +3 -2
  538. package/src/modules/tool-helpers/tool-context.ts +15 -0
  539. package/src/modules/tool-manuals/__tests__/mcp-json-discovery.test.ts +17 -12
  540. package/src/modules/tool-manuals/__tests__/mcp-server-edit.service.test.ts +2 -1
  541. package/src/modules/tool-manuals/__tests__/pending-tools.service.test.ts +4 -1
  542. package/src/modules/tool-manuals/__tests__/tool-delete.service.test.ts +2 -1
  543. package/src/modules/tool-manuals/__tests__/tool-manuals.archive.route.test.ts +2 -1
  544. package/src/modules/tool-manuals/__tests__/tool-manuals.cli.test.ts +5 -4
  545. package/src/modules/tool-manuals/__tests__/tool-manuals.detail.route.test.ts +2 -1
  546. package/src/modules/tool-manuals/__tests__/tool-manuals.invalid.routes.test.ts +4 -2
  547. package/src/modules/tool-manuals/__tests__/tool-manuals.invalid.test.ts +13 -5
  548. package/src/modules/tool-manuals/__tests__/tool-manuals.mcp-oauth.test.ts +2 -1
  549. package/src/modules/tool-manuals/__tests__/tool-manuals.restart.test.ts +9 -1
  550. package/src/modules/tool-manuals/__tests__/tool-manuals.service.test.ts +3 -2
  551. package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +2 -0
  552. package/src/modules/tool-manuals/mcp-json-discovery.ts +6 -4
  553. package/src/modules/tool-manuals/mcp-server-edit.service.ts +13 -11
  554. package/src/modules/tool-manuals/pending-tools.service.ts +19 -16
  555. package/src/modules/tool-manuals/tool-delete.service.ts +13 -10
  556. package/src/modules/tool-manuals/tool-manuals.routes.ts +10 -8
  557. package/src/modules/tool-manuals/tool-manuals.service.ts +15 -13
  558. package/src/modules/tool-manuals/tool-manuals.tools.ts +7 -6
  559. package/src/modules/workflow/__tests__/apply-failure.test.ts +11 -2
  560. package/src/modules/workflow/__tests__/merge-announces-tree.test.ts +14 -26
  561. package/src/modules/workflow/__tests__/preserve-roles-yaml.test.ts +2 -1
  562. package/src/modules/workflow/__tests__/session-ontology.service.test.ts +3 -2
  563. package/src/modules/workflow/__tests__/workflow.routes.lock-path.test.ts +2 -1
  564. package/src/modules/workflow/__tests__/workflow.service.branch-in-use.test.ts +3 -10
  565. package/src/modules/workflow/__tests__/workflow.service.commitFileWhileLocked.test.ts +2 -1
  566. package/src/modules/workflow/__tests__/workflow.service.deleted-branch-sweep.test.ts +3 -10
  567. package/src/modules/workflow/__tests__/workflow.service.facade.test.ts +187 -35
  568. package/src/modules/workflow/__tests__/workflow.service.folder-proposals.test.ts +2 -1
  569. package/src/modules/workflow/__tests__/workflow.service.platform-restore.test.ts +2 -1
  570. package/src/modules/workflow/__tests__/workflow.service.read-gate.test.ts +3 -2
  571. package/src/modules/workflow/__tests__/workflow.service.releaseLock.test.ts +2 -1
  572. package/src/modules/workflow/__tests__/workflow.service.sync.test.ts +5 -4
  573. package/src/modules/workflow/__tests__/workflow.service.update-from-target.test.ts +148 -41
  574. package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +143 -2
  575. package/src/modules/workflow/agent-tools/workflow.tools.ts +60 -12
  576. package/src/modules/workflow/git/__tests__/git.service.accessGating.test.ts +5 -4
  577. package/src/modules/workflow/git/__tests__/git.service.changedFilesForPr.test.ts +12 -11
  578. package/src/modules/workflow/git/__tests__/git.service.commitChanges.test.ts +9 -8
  579. package/src/modules/workflow/git/__tests__/git.service.commitFile.strayPath.test.ts +8 -7
  580. package/src/modules/workflow/git/__tests__/git.service.commitFile.test.ts +6 -5
  581. package/src/modules/workflow/git/__tests__/git.service.createBranch.test.ts +3 -2
  582. package/src/modules/workflow/git/__tests__/git.service.deleteBranch.test.ts +3 -2
  583. package/src/modules/workflow/git/__tests__/git.service.diffFileAtCommit.test.ts +7 -6
  584. package/src/modules/workflow/git/__tests__/git.service.diffFileBetweenBranches.test.ts +16 -15
  585. package/src/modules/workflow/git/__tests__/git.service.fileContentsAtCommit.test.ts +3 -2
  586. package/src/modules/workflow/git/__tests__/git.service.forkPoint.test.ts +2 -1
  587. package/src/modules/workflow/git/__tests__/git.service.history-guards.test.ts +2 -1
  588. package/src/modules/workflow/git/__tests__/git.service.list-branches.test.ts +10 -9
  589. package/src/modules/workflow/git/__tests__/git.service.listTrackedFiles.test.ts +2 -1
  590. package/src/modules/workflow/git/__tests__/git.service.logForFile.test.ts +6 -5
  591. package/src/modules/workflow/git/__tests__/git.service.mergeChangeRequest.test.ts +9 -8
  592. package/src/modules/workflow/git/__tests__/git.service.pendingChanges.test.ts +2 -1
  593. package/src/modules/workflow/git/__tests__/git.service.postMergePull.test.ts +4 -3
  594. package/src/modules/workflow/git/__tests__/git.service.pull.test.ts +130 -8
  595. package/src/modules/workflow/git/__tests__/git.service.readFileAtRef.test.ts +2 -1
  596. package/src/modules/workflow/git/__tests__/git.service.revertPathsAndPush.test.ts +2 -1
  597. package/src/modules/workflow/git/__tests__/git.service.status.test.ts +4 -3
  598. package/src/modules/workflow/git/__tests__/git.service.syncFromRemote.test.ts +8 -7
  599. package/src/modules/workflow/git/__tests__/node-git-runner.test.ts +41 -3
  600. package/src/modules/workflow/git/__tests__/pull-request.service.getPrDetail.test.ts +145 -2
  601. package/src/modules/workflow/git/__tests__/pull-request.service.viewer-can-delete.test.ts +166 -0
  602. package/src/modules/workflow/git/git.service.ts +49 -17
  603. package/src/modules/workflow/git/node-git-runner.ts +43 -4
  604. package/src/modules/workflow/git/pull-request.service.ts +119 -0
  605. package/src/modules/workflow/review-workflow/review-workflow.service.ts +9 -6
  606. package/src/modules/workflow/session-ontology.service.ts +7 -2
  607. package/src/modules/workflow/workflow.routes.ts +3 -1
  608. package/src/modules/workflow/workflow.service.ts +201 -76
  609. package/src/modules/workspace/__tests__/file-stat-access.test.ts +3 -2
  610. package/src/modules/workspace/__tests__/git-internals.security.test.ts +10 -9
  611. package/src/modules/workspace/__tests__/session-ontology.gate.test.ts +4 -2
  612. package/src/modules/workspace/__tests__/workspace-paths-inside-the-repo.test.ts +3 -2
  613. package/src/modules/workspace/__tests__/workspace.routes.branch-errors.test.ts +2 -1
  614. package/src/modules/workspace/__tests__/workspace.routes.create-grant.test.ts +2 -1
  615. package/src/modules/workspace/__tests__/workspace.routes.delete.test.ts +2 -1
  616. package/src/modules/workspace/__tests__/workspace.routes.download-implies-read.test.ts +2 -1
  617. package/src/modules/workspace/__tests__/workspace.routes.download.test.ts +2 -1
  618. package/src/modules/workspace/__tests__/workspace.routes.file-writes.test.ts +2 -1
  619. package/src/modules/workspace/__tests__/workspace.routes.folders.test.ts +5 -4
  620. package/src/modules/workspace/__tests__/workspace.routes.move-platform-files.test.ts +2 -1
  621. package/src/modules/workspace/__tests__/workspace.routes.read-gate.test.ts +2 -1
  622. package/src/modules/workspace/__tests__/workspace.service.ensure-remotes-fetched.test.ts +2 -2
  623. package/src/modules/workspace/__tests__/workspace.service.list-cloned.test.ts +6 -5
  624. package/src/modules/workspace/__tests__/workspace.service.move-never-overwrites.test.ts +2 -1
  625. package/src/modules/workspace/__tests__/workspace.service.read-filter.test.ts +2 -1
  626. package/src/modules/workspace/__tests__/workspace.service.test.ts +84 -50
  627. package/src/modules/workspace/__tests__/workspace.service.unknown-branch.test.ts +45 -1
  628. package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +10 -7
  629. package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +237 -10
  630. package/src/modules/workspace/__tests__/workspace.tools.test.ts +44 -11
  631. package/src/modules/workspace/__tests__/write-denial.test.ts +5 -4
  632. package/src/modules/workspace/session-ontology.gate.ts +6 -4
  633. package/src/modules/workspace/startup/__tests__/kb-startup-runner.degraded.test.ts +6 -2
  634. package/src/modules/workspace/startup/__tests__/kb-startup-runner.test.ts +240 -21
  635. package/src/modules/workspace/startup/kb-git.ts +15 -22
  636. package/src/modules/workspace/startup/kb-startup-runner.ts +198 -45
  637. package/src/modules/workspace/startup/steps/__tests__/steps.test.ts +104 -98
  638. package/src/modules/workspace/startup/steps/groups-to-plugins.step.ts +24 -16
  639. package/src/modules/workspace/startup/steps/personal-spaces.step.ts +14 -5
  640. package/src/modules/workspace/startup/steps/plugin-display-names.step.ts +13 -5
  641. package/src/modules/workspace/startup/steps/plugin-manifests.step.ts +14 -5
  642. package/src/modules/workspace/startup/steps/seed-tree.ts +11 -9
  643. package/src/modules/workspace/startup/steps/template-files.step.ts +43 -34
  644. package/src/modules/workspace/startup/steps/template-source.ts +8 -5
  645. package/src/modules/workspace/workspace.routes.ts +8 -7
  646. package/src/modules/workspace/workspace.service.ts +47 -28
  647. package/src/modules/workspace/workspace.tools.ts +56 -20
  648. package/src/modules/workspace/write-denial.ts +7 -5
  649. package/src/shared/__tests__/kb-layout.plugin.test.ts +19 -16
  650. package/src/shared/domain-errors.ts +58 -0
  651. package/src/shared/git.contract.ts +80 -8
  652. package/src/shared/kb-context.ts +130 -0
  653. package/src/shared/kb-layout.test.ts +37 -27
  654. package/src/shared/kb-layout.ts +4 -3
  655. package/src/shared/pending-proposals.ts +7 -4
  656. package/src/shared/redact-secret.ts +5 -5
  657. package/src/tenancy/__tests__/static-tenant-source.test.ts +177 -0
  658. package/src/tenancy/__tests__/tenant-host.test.ts +372 -0
  659. package/src/tenancy/__tests__/tenant-runtime.test.ts +221 -0
  660. package/src/tenancy/__tests__/tenant-secrets.test.ts +35 -0
  661. package/src/tenancy/index.ts +35 -0
  662. package/src/tenancy/static-tenant-source.ts +296 -0
  663. package/src/tenancy/tenant-host.ts +261 -0
  664. package/src/tenancy/tenant-runtime.ts +208 -0
  665. package/src/tenancy/tenant-secrets.ts +41 -0
  666. package/src/tenancy/tenant-source.contract.ts +59 -0
@@ -1,8 +1,17 @@
1
1
  import type { Server } from 'node:http';
2
- import type { Database } from '../modules/database/connection.js';
2
+ import { closeDb, type Database } from '../modules/database/connection.js';
3
3
  import type { AdvisoryLease } from '../modules/database/advisory-lock.js';
4
+ import { KbRemoteUnreachableError, type KbStartupRunner } from '../modules/workspace/startup/kb-startup-runner.js';
5
+ import { noteBesideCheckout } from '../modules/workspace/startup/beside-checkout.js';
6
+ import { unregisterBevelSecretsVariableLoader } from '../modules/secrets-vault/secrets-variable-loader.js';
7
+ import type { WorkflowService } from '../modules/workflow/workflow.service.js';
8
+ import type { PluginJoinRequestJobs } from '../modules/plugins/join-request-jobs.service.js';
9
+ import { printable } from '../shared/printable.js';
4
10
  import { logger } from '../shared/logging.js';
5
11
 
12
+ const startupLog = logger('kb-startup');
13
+ const crLog = logger('cr');
14
+
6
15
  /**
7
16
  * The process lifecycle: who may drain the commit queue, and how the process
8
17
  * stops.
@@ -193,25 +202,166 @@ export function withStartupTask(
193
202
  };
194
203
  }
195
204
 
196
- export interface ShutdownDeps {
197
- /** The listening server — stops accepting, then drops what is connected. */
198
- server: Pick<Server, 'close' | 'closeAllConnections'>;
205
+ /**
206
+ * What one knowledge base's graph needs of itself to be STARTED: the boot
207
+ * side effects that used to run inside `createCoreServer`, named so a host
208
+ * can run them for a graph it builds on demand, and stop them again.
209
+ */
210
+ export interface BootableCore {
211
+ config: { workspacesRoot: string };
212
+ kbDirName: string;
213
+ kbStartupRunner: Pick<KbStartupRunner, 'runAll' | 'retryUntilMaintained'>;
214
+ workflowService: Pick<WorkflowService, 'closeChangeRequestsWithDeletedBranches'>;
215
+ pluginJoinRequestJobs: Pick<PluginJoinRequestJobs, 'startSweeping'>;
216
+ /**
217
+ * The startup phase's retry, when the boot survived an unreachable remote
218
+ * and is asking again on a timer; null otherwise. Set by {@link startCore},
219
+ * stopped by {@link stopCore}.
220
+ */
221
+ startupRetry: { stop(): void } | null;
222
+ }
223
+
224
+ /**
225
+ * Bring a built graph up: the distribution's boot hook, the note about what
226
+ * sits beside a checkout, the knowledge-base startup phase with its
227
+ * unreachable-remote fallback, the deleted-branch sweep and the join-request
228
+ * jobs. `createCoreServer` runs this for a single-tenant deployment; a host
229
+ * serving several knowledge bases runs it when a tenant is activated.
230
+ *
231
+ * Throws to stop the boot on every failure but an unreachable remote — the
232
+ * container's restart policy is the retry — see `kb-startup-runner.ts`.
233
+ */
234
+ export async function startCore<C extends BootableCore>(
235
+ core: C,
236
+ ext: { onBoot?(core: C): Promise<void> | void } = {},
237
+ ): Promise<void> {
238
+ // Overlay boot-time side effects (startup reconciles, periodic sweeps).
239
+ await ext.onBoot?.(core);
240
+
241
+ // What is already sitting beside a checkout, named once per boot and touched
242
+ // by nothing. Outside the KB startup phase below on purpose: that phase is
243
+ // gated on the branch model and the repository URL, and a deployment whose
244
+ // setup never finished — or whose remote is down — is exactly one whose
245
+ // strays would otherwise go unmentioned. A diagnostic never stops a boot, so
246
+ // an unreadable workspaces root is logged and the boot carries on.
247
+ try {
248
+ await noteBesideCheckout(core.config.workspacesRoot, core.kbDirName);
249
+ } catch (err) {
250
+ // `printable`, because the message quotes a path off the disk (an ENOENT
251
+ // or EACCES names the file it failed on) and a name carrying a control
252
+ // character would forge a second line of the operator's log.
253
+ startupLog.warn('could not look for content beside the checkouts:', {
254
+ detail: printable(err instanceof Error ? err.message : String(err)),
255
+ });
256
+ }
257
+
258
+ // The KB startup phase — AFTER the distribution's onBoot, because a FATAL
259
+ // template finding raised there must stop the boot before anything seeds
260
+ // from that template; the runner then brings every branch up to this build
261
+ // before any route can serve KB content. Throws to stop the boot (the
262
+ // container's restart policy is the retry) — see kb-startup-runner.ts.
263
+ //
264
+ // Runs in the booting process whether or not it holds the commit-worker
265
+ // lease, so on a redeploy it overlaps the outgoing holder's commits for the
266
+ // seconds it takes — the documented window at `holdCommitWorkerLease`.
267
+ try {
268
+ await core.kbStartupRunner.runAll();
269
+ } catch (err) {
270
+ // The one failure a boot survives: the remote cannot be reached. That
271
+ // says nothing about the knowledge base — what we would write is not
272
+ // known to be wrong, we cannot get there — so refusing to boot only took
273
+ // away the login and setup screens an operator needs to fix it (a
274
+ // rotated token, say). The deployment comes up GATED: the setup routes
275
+ // read the runner's standing failure and keep the app shut, the setup
276
+ // screen shows why, saving it retries, and the runner keeps trying on
277
+ // its own. Every other failure still stops the boot, because it means
278
+ // the template or a step would write something wrong.
279
+ if (!(err instanceof KbRemoteUnreachableError)) throw err;
280
+ startupLog.error('booting UNMAINTAINED and gated — the knowledge-base remote could not be reached:', {
281
+ detail: err.message,
282
+ });
283
+ // Kept on the graph so that stopping the graph stops the asking: a
284
+ // retry that outlived its graph would clone into a workspaces folder
285
+ // nobody serves any more.
286
+ core.startupRetry = core.kbStartupRunner.retryUntilMaintained();
287
+ }
288
+
289
+ // Close change requests whose source branch has been deleted. SEQUENCED
290
+ // AFTER the startup phase above, for two reasons: the sweep's fresh fetch
291
+ // lazily bootstraps and fetches the same default-branch clone the runner
292
+ // maintains (kicking it off earlier races the runner's clone/fetch of that
293
+ // very directory), and on a brand-new deployment it would run before the
294
+ // empty remote is seeded, fail its clone, swallow the error, and leave
295
+ // deleted-branch CRs open for the whole process. Still not awaited from
296
+ // here on: a slow or unreachable remote must not hold up the server —
297
+ // nothing downstream depends on the result, and the requests it closes
298
+ // have been unusable since the branch went away, so landing a few seconds
299
+ // into uptime is soon enough. Errors are swallowed inside the sweep, which
300
+ // fails safe by closing nothing.
301
+ void core.workflowService
302
+ .closeChangeRequestsWithDeletedBranches()
303
+ .then((n) => {
304
+ if (n > 0) {
305
+ crLog.info(`closed ${n} change request${n === 1 ? '' : 's'} with a deleted branch`);
306
+ }
307
+ })
308
+ .catch((err) => crLog.warn('deleted-branch sweep failed:', { err }));
309
+
310
+ // Recorded join requests that are still owed, resumed — now, and then on a
311
+ // timer. SEQUENCED AFTER the startup phase for the same reason as the sweep
312
+ // above: the work needs the default-branch clone the runner maintains and
313
+ // the plugin catalog read from it, and a sweep that ran first would refuse
314
+ // every row for a knowledge base that simply was not ready — telling people
315
+ // their request could not be sent when nothing had gone wrong with it.
316
+ //
317
+ // ON A TIMER rather than at boot alone, because boot cannot cover the
318
+ // redeploy: this process sweeps while the outgoing one still holds a
319
+ // record, skips it (correctly — two servers must not do git on one branch),
320
+ // and the outgoing process then exits mid-work. Nothing else would look at
321
+ // that row again. The requester cannot prompt it either: a pending record
322
+ // shows them the "Requested" card, not a button.
323
+ //
324
+ // Not awaited, and nothing to report here but the failure to read the table
325
+ // at all: a first request from a person is a full clone, nothing else at
326
+ // boot depends on it, and each row records its own outcome.
327
+ core.pluginJoinRequestJobs.startSweeping();
328
+ }
329
+
330
+ /**
331
+ * What one knowledge base's graph holds that must be let go of when it
332
+ * stops: the pieces {@link stopCore} winds down, in the order it winds
333
+ * them down. `createShutdown` takes the same, plus the listening server.
334
+ */
335
+ export interface CoreStopDeps {
199
336
  /** The lease loop from {@link holdCommitWorkerLease}: its stop finishes the in-flight commit and releases the lease. */
200
337
  commitWorker: Pick<LeaseLoopHandle, 'stop'>;
201
338
  /**
202
339
  * Background work to wind down before the pool goes — the join-request
203
- * sweep and its jobs, today. The timer is stopped after the server so
204
- * nothing new is scheduled, then the jobs already running are awaited
205
- * (within the budget) so the pool is not ended under a clone or a push
206
- * that is still writing to it. Optional: a caller that has not built them
207
- * yet passes nothing.
340
+ * sweep and its jobs, today. The timer is stopped first so nothing new is
341
+ * scheduled, then the jobs already running are awaited (within the budget)
342
+ * so the pool is not ended under a clone or a push that is still writing
343
+ * to it. Optional: a caller that has not built them yet passes nothing.
208
344
  */
209
345
  backgroundJobs?: { stopSweeping(): void; drain(): Promise<void> };
346
+ /** The startup phase's retry, if the boot left one asking — see {@link BootableCore.startupRetry}. */
347
+ startupRetry?: { stop(): void } | null;
210
348
  /** The database — its pool is ended last, once nothing above can still need it. */
211
349
  db: Pick<Database, '$client'>;
350
+ /**
351
+ * The scope this graph's secrets vault was registered under with the UTCP
352
+ * variable loader (see `secrets-variable-loader.ts`); forgotten on stop so
353
+ * a descriptor that outlives the graph resolves nothing. Optional: a
354
+ * single-tenant process exits right after, and has nothing to forget.
355
+ */
356
+ secretsScope?: string;
212
357
  log?: (message: string) => void;
213
358
  }
214
359
 
360
+ export interface ShutdownDeps extends CoreStopDeps {
361
+ /** The listening server — stops accepting, then drops what is connected. */
362
+ server: Pick<Server, 'close' | 'closeAllConnections'>;
363
+ }
364
+
215
365
  export interface ShutdownOptions {
216
366
  /**
217
367
  * Total time the sequence may take. Default 8s: Docker's `stop_grace_period`
@@ -261,6 +411,60 @@ async function bounded(promise: Promise<unknown>, ms: number, label: string, log
261
411
  * died mid-commit, now the exception rather than the rule.
262
412
  * 3. End the pool.
263
413
  */
414
+ /**
415
+ * Let go of everything a graph holds, in order, within `remaining()`.
416
+ * The order is the point — see {@link createShutdown} for why each step
417
+ * sits where it does.
418
+ */
419
+ async function releaseCore(deps: CoreStopDeps, remaining: () => number, log: (m: string) => void): Promise<void> {
420
+ // First, and BEFORE the commit worker is stopped. Stopping that worker
421
+ // awaits an in-flight commit and can spend most of the remaining budget
422
+ // doing it; a sweep tick firing inside that window reads the still-open
423
+ // pool and starts fresh clone/commit/push work that the end of the
424
+ // sequence then kills mid-git. Nothing new can be recorded once the
425
+ // server is closed (or the tenant is no longer routed to), so this is the
426
+ // earliest point the interval is dead weight. Synchronous and unfailing
427
+ // — it just clears an interval — so it needs no budget of its own.
428
+ deps.backgroundJobs?.stopSweeping();
429
+ // A startup phase still asking for an unreachable remote stops asking:
430
+ // synchronous, and nothing after it must be able to clone into a
431
+ // workspaces folder that is about to belong to nobody.
432
+ deps.startupRetry?.stop();
433
+ // Clearing the interval stops future ticks; it does nothing to a job a
434
+ // tick already started, which holds a claim it heartbeats through the
435
+ // pool and is mid-clone or mid-push. Awaited here, in the budget: a job
436
+ // that finishes releases or marks its row; one that cannot in time is
437
+ // killed with the process and its claim goes stale for the next sweep
438
+ // — which is the recovery every crash already gets.
439
+ if (deps.backgroundJobs) {
440
+ await bounded(deps.backgroundJobs.drain(), remaining(), 'finishing the background jobs', log);
441
+ }
442
+ await bounded(deps.commitWorker.stop(), remaining(), 'stopping the commit worker', log);
443
+ if (deps.secretsScope !== undefined) unregisterBevelSecretsVariableLoader(deps.secretsScope);
444
+ await bounded(closeDb(deps.db), remaining(), 'ending the database pool', log);
445
+ }
446
+
447
+ export interface StopCoreOptions {
448
+ /** Total time the stop may take. Default: the shutdown's 8s. */
449
+ deadlineMs?: number;
450
+ }
451
+
452
+ /**
453
+ * Stop one knowledge base's graph without stopping the process: the
454
+ * shutdown sequence minus closing the server. What a host runs when it
455
+ * evicts a tenant, and what {@link createShutdown} runs after the server
456
+ * has closed. Bounded like the shutdown, so a step that hangs cannot hold
457
+ * the host's event loop hostage.
458
+ */
459
+ export async function stopCore(core: CoreStopDeps, opts: StopCoreOptions = {}): Promise<void> {
460
+ const log = core.log ?? ((message: string) => logger('lifecycle').info(message));
461
+ const deadlineMs = opts.deadlineMs ?? DEFAULT_SHUTDOWN_DEADLINE_MS;
462
+ const startedAt = Date.now();
463
+ const remaining = () => Math.max(0, deadlineMs - (Date.now() - startedAt));
464
+ await releaseCore(core, remaining, log);
465
+ log(`graph stopped in ${Date.now() - startedAt}ms`);
466
+ }
467
+
264
468
  export function createShutdown(
265
469
  deps: ShutdownDeps,
266
470
  opts: ShutdownOptions = {},
@@ -284,26 +488,7 @@ export function createShutdown(
284
488
  'closing the server',
285
489
  log,
286
490
  );
287
- // Immediately after the server, and BEFORE the commit worker is stopped.
288
- // Stopping that worker awaits an in-flight commit and can spend most of
289
- // the remaining budget doing it; a sweep tick firing inside that window
290
- // reads the still-open pool and starts fresh clone/commit/push work that
291
- // the `process.exit()` at the end of the sequence then kills mid-git.
292
- // Nothing new can be recorded once the server is closed, so this is the
293
- // earliest point the interval is dead weight. Synchronous and unfailing
294
- // — it just clears an interval — so it needs no budget of its own.
295
- deps.backgroundJobs?.stopSweeping();
296
- // Clearing the interval stops future ticks; it does nothing to a job a
297
- // tick already started, which holds a claim it heartbeats through the
298
- // pool and is mid-clone or mid-push. Awaited here, in the budget: a job
299
- // that finishes releases or marks its row; one that cannot in time is
300
- // killed with the process and its claim goes stale for the next sweep
301
- // — which is the recovery every crash already gets.
302
- if (deps.backgroundJobs) {
303
- await bounded(deps.backgroundJobs.drain(), remaining(), 'finishing the background jobs', log);
304
- }
305
- await bounded(deps.commitWorker.stop(), remaining(), 'stopping the commit worker', log);
306
- await bounded(deps.db.$client.end(), remaining(), 'ending the database pool', log);
491
+ await releaseCore(deps, remaining, log);
307
492
 
308
493
  log(`shutdown complete in ${Date.now() - startedAt}ms`);
309
494
  })();
@@ -1,4 +1,4 @@
1
- import { DEFAULT_BRANCH, PROTECTED_BRANCHES, currentKbLayout } from '@bevel-software/platform-shared';
1
+ import type { KbContext } from '../shared/kb-context.js';
2
2
 
3
3
  /** The two addresses the server derives once and hands to {@link publicConfig}. */
4
4
  export interface PublicConfigAddresses {
@@ -24,19 +24,22 @@ export interface PublicConfigAddresses {
24
24
  * means a rebuild.
25
25
  *
26
26
  * A pure function of its inputs, so the payload is testable without a server.
27
+ * `kb` is read at call time, not captured: the branch model arrives from the
28
+ * setup screen on a fresh deployment, and the next `/api/config` after that
29
+ * save has to carry it.
27
30
  */
28
- export function publicConfig({ marketplaceGitUrl, mcpUrl }: PublicConfigAddresses) {
31
+ export function publicConfig(kb: KbContext, { marketplaceGitUrl, mcpUrl }: PublicConfigAddresses) {
29
32
  return {
30
33
  branchModel: {
31
- defaultBranch: DEFAULT_BRANCH,
32
- protectedBranches: [...PROTECTED_BRANCHES],
34
+ defaultBranch: kb.defaultBranch,
35
+ protectedBranches: [...kb.protectedBranches],
33
36
  },
34
37
  /**
35
38
  * The three renameable KB roots, for the same reason as the branch
36
39
  * model: the file tree, the library router and every path rule read
37
40
  * them, and they used to be compile-time constants.
38
41
  */
39
- kbLayout: currentKbLayout(),
42
+ kbLayout: kb.layout,
40
43
  /**
41
44
  * The per-user marketplace git remote (see modules/marketplace). Same
42
45
  * derivation as `mcpUrl`: our address, userinfo stripped; the caller
@@ -4,6 +4,7 @@ import { fileURLToPath } from 'node:url';
4
4
  import { defaultKbTemplateDir } from './assets.js';
5
5
  import { assertKeyDecodesTo32Bytes } from './shared/token-crypto.js';
6
6
  import { DEFAULT_GIT_TIMEOUT_MS } from './modules/workflow/git/node-git-runner.js';
7
+ import { DEFAULT_DB_SCHEMA, assertSchemaName } from './modules/database/connection.js';
7
8
  import { logger } from './shared/logging.js';
8
9
 
9
10
  const log = logger('config');
@@ -57,6 +58,88 @@ export function withoutUserinfo(url: string): string {
57
58
  return url.replace(/^([a-z][a-z0-9+.-]*:\/\/)[^/?#]*@/i, '$1');
58
59
  }
59
60
 
61
+ /**
62
+ * Everything ONE knowledge base's service graph is built from — the values
63
+ * that differ between two knowledge bases a process might host. A
64
+ * single-tenant deployment reads them from the environment ({@link CoreConfig});
65
+ * a host serving several builds one of these per tenant from its registry.
66
+ * `createCoreServices` takes this shape, so the two are the same code path.
67
+ *
68
+ * `port`, `nodeEnv` and `trustProxy` are process facts a graph still needs
69
+ * (the loopback address the MCP proxy dials, cookie flags, the proxy hop
70
+ * count its Express app trusts), so they appear here as well as on
71
+ * {@link ProcessConfig}: a tenant's config carries the values of the process
72
+ * it runs in.
73
+ */
74
+ export interface TenantConfig {
75
+ readonly port: number;
76
+ readonly databaseUrl: string;
77
+ /** The Postgres schema this knowledge base's tables live in. `public` for a single-tenant deployment. */
78
+ readonly dbSchema: string;
79
+ readonly nodeEnv: string;
80
+ readonly tenantId: string;
81
+ /** The credential prefixes derived from `tenantId` — see the getters on {@link CoreConfig}. */
82
+ readonly externalApiKeyPrefix: string;
83
+ readonly internalTokenPrefix: string;
84
+ readonly uploadTokenPrefix: string;
85
+ readonly mcpOAuthTokenPrefix: string;
86
+ readonly workspacesRoot: string;
87
+ readonly backupsRoot: string;
88
+ readonly spillRoot: string;
89
+ readonly docExtractCacheRoot: string;
90
+ readonly jwtSecret: string;
91
+ readonly adminEmail: string;
92
+ readonly adminPassword: string;
93
+ readonly oidcIssuerUrl: string;
94
+ readonly oidcClientId: string;
95
+ readonly oidcClientSecret: string;
96
+ readonly oidcScopes: string;
97
+ readonly oidcProviderLabel: string;
98
+ readonly kbRepoUrl: string;
99
+ readonly kbDirName: string;
100
+ readonly gitUsername: string;
101
+ readonly gitToken: string;
102
+ readonly kbTemplateDir: string;
103
+ readonly ontologySessionBlock: boolean;
104
+ readonly updateCheckEnabled: boolean;
105
+ readonly loginPasswordEnabled: boolean;
106
+ readonly allowedEmailDomains: string[];
107
+ readonly secretsEncKey: string;
108
+ readonly internalTokenSecret: string;
109
+ readonly trustProxy: string;
110
+ readonly gitTimeoutMs: number;
111
+ readonly publicBackendUrl: string;
112
+ readonly publicFrontendUrl: string;
113
+ readonly configuredPublicFrontendUrl: string | null;
114
+ /**
115
+ * Where this graph's own REST surface is reached from inside the process
116
+ * (the MCP proxy dials it, and seeds it into the UTCP manuals it builds).
117
+ * Unset, `http://127.0.0.1:<port>`; a tenant host names its tenant on the
118
+ * path — see `tenancy/tenant-host.ts`.
119
+ */
120
+ readonly loopbackBaseUrl?: string;
121
+ /**
122
+ * The environment the deployment settings (repository, git credential,
123
+ * branch model, SSO, sync secret, …) resolve against before the stored
124
+ * layer. Unset, the process's own. A tenant host builds one per tenant
125
+ * from its record, so a variable set on the host process never reaches
126
+ * every tenant and a record's values behave as environment-pinned ones.
127
+ */
128
+ readonly settingsEnv?: NodeJS.ProcessEnv;
129
+ }
130
+
131
+ /**
132
+ * What the PROCESS is configured with, independent of how many knowledge
133
+ * bases it serves: where it listens, which proxy hops it trusts, and the
134
+ * environment name. A single-tenant deployment's {@link CoreConfig} is both
135
+ * this and its one tenant's {@link TenantConfig}.
136
+ */
137
+ export interface ProcessConfig {
138
+ readonly port: number;
139
+ readonly nodeEnv: string;
140
+ readonly trustProxy: string;
141
+ }
142
+
60
143
  /**
61
144
  * Configuration for the CORE platform: the git-backed workspace/workflow,
62
145
  * skills, tools, secrets vault, access control, and the MCP surface. Contains
@@ -64,9 +147,16 @@ export function withoutUserinfo(url: string): string {
64
147
  * `AppConfig` (config.ts), which extends this class. A core-only deployment
65
148
  * boots from exactly these env vars.
66
149
  */
67
- export class CoreConfig {
150
+ export class CoreConfig implements TenantConfig, ProcessConfig {
68
151
  readonly port: number;
69
152
  readonly databaseUrl: string;
153
+ /**
154
+ * The Postgres schema this deployment's tables live in (`DB_SCHEMA`,
155
+ * default `public`). Set it to host this knowledge base beside others in
156
+ * one database, each on a schema of its own; see
157
+ * `modules/database/connection.ts` for what that changes.
158
+ */
159
+ readonly dbSchema: string;
70
160
  readonly nodeEnv: string;
71
161
  /**
72
162
  * Tenant slug injected into every credential prefix so a deploy can brand its
@@ -155,6 +245,13 @@ export class CoreConfig {
155
245
  * credential-helper shell snippet.
156
246
  */
157
247
  readonly gitUsername: string;
248
+ /**
249
+ * The git token the environment supplied (`GIT_TOKEN`, or the legacy
250
+ * `GITHUB_TOKEN` / `GH_TOKEN`), or `''`. The setup screen's stored token is
251
+ * read through the settings service instead; the composition root folds
252
+ * the two into the runner's credentials, environment first.
253
+ */
254
+ readonly gitToken: string;
158
255
  /**
159
256
  * Filesystem path to the KB seed template (the `kb-template/` folder shipped
160
257
  * inside this package — see `defaultKbTemplateDir()`). The seeder reads this
@@ -282,6 +379,7 @@ export class CoreConfig {
282
379
  constructor() {
283
380
  this.port = parseInt(process.env.PORT || '3001', 10);
284
381
  this.databaseUrl = resolveDatabaseUrl();
382
+ this.dbSchema = assertSchemaName((process.env.DB_SCHEMA || DEFAULT_DB_SCHEMA).trim());
285
383
  this.nodeEnv = process.env.NODE_ENV || 'development';
286
384
  this.tenantId = (process.env.TENANT_ID || 'bevel').trim().toLowerCase();
287
385
  if (!/^[a-z0-9]+$/.test(this.tenantId)) {
@@ -352,13 +450,14 @@ export class CoreConfig {
352
450
  this.kbRepoUrl = (process.env.KB_REPO_URL || '').trim();
353
451
  this.kbDirName = (process.env.KB_DIR_NAME || '').trim();
354
452
  // Provider-neutral git token: operators can set GIT_TOKEN (or the legacy
355
- // GITHUB_TOKEN / GH_TOKEN). Normalize onto GITHUB_TOKEN — the name the
356
- // credential helper and every `$GITHUB_TOKEN` read + redaction use — so all
357
- // three work unchanged. GIT_TOKEN takes PRECEDENCE: it's the provider-neutral
358
- // name, so setting it must override a stale legacy GITHUB_TOKEN (e.g. when
359
- // switching the KB from GitHub to GitLab), not be shadowed by it.
360
- const gitToken = process.env.GIT_TOKEN || process.env.GITHUB_TOKEN || process.env.GH_TOKEN;
361
- if (gitToken) process.env.GITHUB_TOKEN = gitToken;
453
+ // GITHUB_TOKEN / GH_TOKEN). Read here, never written back: the git runner
454
+ // hands the token in effect to each child it spawns, so the process
455
+ // environment does not need to carry it, and a server hosting several
456
+ // knowledge bases could not carry all of theirs. GIT_TOKEN takes
457
+ // PRECEDENCE: it's the provider-neutral name, so setting it must override
458
+ // a stale legacy GITHUB_TOKEN (e.g. when switching the KB from GitHub to
459
+ // GitLab), not be shadowed by it.
460
+ this.gitToken = (process.env.GIT_TOKEN || process.env.GITHUB_TOKEN || process.env.GH_TOKEN || '').trim();
362
461
  this.gitUsername = (process.env.GIT_USERNAME || 'x-access-token').trim();
363
462
  // Interpolated into the credential-helper shell snippet, so reject anything
364
463
  // that isn't a plain token — no quotes, spaces, or shell metacharacters.
package/src/index.ts CHANGED
@@ -17,7 +17,9 @@
17
17
  * Finer-grained internals are available via the `./modules/*` subpath exports.
18
18
  */
19
19
 
20
- export { CoreConfig } from './core-config.js';
20
+ export { CoreConfig, resolveDatabaseUrl, type TenantConfig, type ProcessConfig } from './core-config.js';
21
+ // Serving several knowledge bases from one process — see docs/multi-tenant.md.
22
+ export * from './tenancy/index.js';
21
23
  export { createCoreServices, type CoreServices } from './core/create-core-services.js';
22
24
  export {
23
25
  createCoreServer,
@@ -33,9 +35,14 @@ export type { ILogger, LogFields } from './shared/logger.contract.js';
33
35
  // handle type `CoreServices.commitWorker` carries.
34
36
  export {
35
37
  createShutdown,
38
+ startCore,
39
+ stopCore,
36
40
  withStartupTask,
41
+ type BootableCore,
42
+ type CoreStopDeps,
37
43
  type ShutdownDeps,
38
44
  type ShutdownOptions,
45
+ type StopCoreOptions,
39
46
  type LeaseLoopHandle,
40
47
  type LeasedWorker,
41
48
  } from './core/lifecycle.js';
@@ -46,7 +53,16 @@ export {
46
53
  runCoreMigrations,
47
54
  runEnterpriseMigrations,
48
55
  } from './modules/database/migrate.js';
49
- export { getDb, type Database } from './modules/database/connection.js';
56
+ export {
57
+ getDb,
58
+ createDb,
59
+ closeDb,
60
+ dbSchemaOf,
61
+ assertSchemaName,
62
+ DEFAULT_DB_SCHEMA,
63
+ type Database,
64
+ type DbOptions,
65
+ } from './modules/database/connection.js';
50
66
 
51
67
  // Build identity surfaced by GET /api/health.
52
68
  export { GIT_SHA, resolveGitSha } from './version.js';
@@ -85,6 +101,13 @@ export type {
85
101
  export type { ILlmUsageMeter } from './modules/tool-auth/llm-usage-meter.js';
86
102
  export type { AuthProviderPlugin } from './modules/auth/auth.routes.js';
87
103
  export type { IErasureParticipant } from './modules/auth/account-erasure.service.js';
104
+ export {
105
+ AccountAdmissionRefusedError,
106
+ admitEveryone,
107
+ type AccountAdmissionVerdict,
108
+ type AccountProvisionReason,
109
+ type IAccountAdmission,
110
+ } from './modules/auth/account-admission.js';
88
111
  export {
89
112
  WorkflowHooks,
90
113
  type CommitValidationHook,
@@ -21,6 +21,7 @@ import {
21
21
  import { createAccessRoutes } from '../access.routes.js';
22
22
  import { AccessDeniedError } from '../../access-model/access-errors.js';
23
23
  import { workspaceIdForBranch } from '../../../shared/workspace-id.js';
24
+ import { testKbContext } from '../../../__tests__/kb-context.js';
24
25
 
25
26
  /**
26
27
  * The Admin write floor at the repository root, and the eligible lists that
@@ -287,7 +288,7 @@ describe('Admin write floor at the repository root', () => {
287
288
  } as unknown as WorkflowService,
288
289
  { emit: () => {} } as unknown as WorkflowEventBus,
289
290
  usersDbDouble(),
290
- KB,
291
+ testKbContext({ kbDirName: KB }),
291
292
  ),
292
293
  );
293
294
  server = await new Promise<Server>((resolve) => {