@bevel-software/platform-core-backend 0.19.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 (799) 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 +45 -105
  11. package/dist/core/create-core-server.js.map +1 -1
  12. package/dist/core/create-core-services.d.ts +33 -5
  13. package/dist/core/create-core-services.d.ts.map +1 -1
  14. package/dist/core/create-core-services.js +146 -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.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/audit/agent-audit.service.d.ts +54 -0
  53. package/dist/modules/audit/agent-audit.service.d.ts.map +1 -0
  54. package/dist/modules/audit/agent-audit.service.js +290 -0
  55. package/dist/modules/audit/agent-audit.service.js.map +1 -0
  56. package/dist/modules/audit/agent-rest-audit.middleware.d.ts +40 -0
  57. package/dist/modules/audit/agent-rest-audit.middleware.d.ts.map +1 -0
  58. package/dist/modules/audit/agent-rest-audit.middleware.js +75 -0
  59. package/dist/modules/audit/agent-rest-audit.middleware.js.map +1 -0
  60. package/dist/modules/audit/audit.contract.d.ts +145 -0
  61. package/dist/modules/audit/audit.contract.d.ts.map +1 -0
  62. package/dist/modules/audit/audit.contract.js +35 -0
  63. package/dist/modules/audit/audit.contract.js.map +1 -0
  64. package/dist/modules/audit/audit.routes.d.ts +21 -0
  65. package/dist/modules/audit/audit.routes.d.ts.map +1 -0
  66. package/dist/modules/audit/audit.routes.js +157 -0
  67. package/dist/modules/audit/audit.routes.js.map +1 -0
  68. package/dist/modules/audit/event-classifier.d.ts +52 -0
  69. package/dist/modules/audit/event-classifier.d.ts.map +1 -0
  70. package/dist/modules/audit/event-classifier.js +123 -0
  71. package/dist/modules/audit/event-classifier.js.map +1 -0
  72. package/dist/modules/audit/index.d.ts +7 -0
  73. package/dist/modules/audit/index.d.ts.map +1 -0
  74. package/dist/modules/audit/index.js +7 -0
  75. package/dist/modules/audit/index.js.map +1 -0
  76. package/dist/modules/audit/request-audit.d.ts +57 -0
  77. package/dist/modules/audit/request-audit.d.ts.map +1 -0
  78. package/dist/modules/audit/request-audit.js +117 -0
  79. package/dist/modules/audit/request-audit.js.map +1 -0
  80. package/dist/modules/auth/account-admission.d.ts +40 -0
  81. package/dist/modules/auth/account-admission.d.ts.map +1 -0
  82. package/dist/modules/auth/account-admission.js +17 -0
  83. package/dist/modules/auth/account-admission.js.map +1 -0
  84. package/dist/modules/auth/account.routes.d.ts.map +1 -1
  85. package/dist/modules/auth/account.routes.js +4 -1
  86. package/dist/modules/auth/account.routes.js.map +1 -1
  87. package/dist/modules/auth/auth.service.d.ts +19 -1
  88. package/dist/modules/auth/auth.service.d.ts.map +1 -1
  89. package/dist/modules/auth/auth.service.js +33 -1
  90. package/dist/modules/auth/auth.service.js.map +1 -1
  91. package/dist/modules/auth/oidc-auth-provider.d.ts.map +1 -1
  92. package/dist/modules/auth/oidc-auth-provider.js +9 -0
  93. package/dist/modules/auth/oidc-auth-provider.js.map +1 -1
  94. package/dist/modules/connection-probe/connection-probe.service.d.ts +13 -1
  95. package/dist/modules/connection-probe/connection-probe.service.d.ts.map +1 -1
  96. package/dist/modules/connection-probe/connection-probe.service.js +10 -2
  97. package/dist/modules/connection-probe/connection-probe.service.js.map +1 -1
  98. package/dist/modules/database/advisory-lock.d.ts +17 -0
  99. package/dist/modules/database/advisory-lock.d.ts.map +1 -1
  100. package/dist/modules/database/advisory-lock.js +24 -3
  101. package/dist/modules/database/advisory-lock.js.map +1 -1
  102. package/dist/modules/database/connection.d.ts +67 -2
  103. package/dist/modules/database/connection.d.ts.map +1 -1
  104. package/dist/modules/database/connection.js +118 -12
  105. package/dist/modules/database/connection.js.map +1 -1
  106. package/dist/modules/database/core-schema.d.ts +414 -0
  107. package/dist/modules/database/core-schema.d.ts.map +1 -1
  108. package/dist/modules/database/core-schema.js +99 -0
  109. package/dist/modules/database/core-schema.js.map +1 -1
  110. package/dist/modules/database/migrate.d.ts +1 -1
  111. package/dist/modules/database/migrate.d.ts.map +1 -1
  112. package/dist/modules/database/migrate.js +27 -3
  113. package/dist/modules/database/migrate.js.map +1 -1
  114. package/dist/modules/diff/diff.service.d.ts.map +1 -1
  115. package/dist/modules/diff/diff.service.js +6 -1
  116. package/dist/modules/diff/diff.service.js.map +1 -1
  117. package/dist/modules/kb-fs/branch-name.d.ts +0 -1
  118. package/dist/modules/kb-fs/branch-name.d.ts.map +1 -1
  119. package/dist/modules/kb-fs/branch-name.js +3 -3
  120. package/dist/modules/kb-fs/branch-name.js.map +1 -1
  121. package/dist/modules/kb-fs/clone-config.d.ts +9 -8
  122. package/dist/modules/kb-fs/clone-config.d.ts.map +1 -1
  123. package/dist/modules/kb-fs/clone-config.js +14 -12
  124. package/dist/modules/kb-fs/clone-config.js.map +1 -1
  125. package/dist/modules/kb-fs/git-guarded-filesystem.d.ts +9 -1
  126. package/dist/modules/kb-fs/git-guarded-filesystem.d.ts.map +1 -1
  127. package/dist/modules/kb-fs/git-guarded-filesystem.js +16 -3
  128. package/dist/modules/kb-fs/git-guarded-filesystem.js.map +1 -1
  129. package/dist/modules/mcp/mcp-auth.middleware.d.ts +1 -0
  130. package/dist/modules/mcp/mcp-auth.middleware.d.ts.map +1 -1
  131. package/dist/modules/mcp/mcp-auth.middleware.js +32 -0
  132. package/dist/modules/mcp/mcp-auth.middleware.js.map +1 -1
  133. package/dist/modules/mcp/mcp.routes.d.ts.map +1 -1
  134. package/dist/modules/mcp/mcp.routes.js +8 -1
  135. package/dist/modules/mcp/mcp.routes.js.map +1 -1
  136. package/dist/modules/mcp/mcp.service.d.ts +16 -1
  137. package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
  138. package/dist/modules/mcp/mcp.service.js +52 -9
  139. package/dist/modules/mcp/mcp.service.js.map +1 -1
  140. package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts +59 -0
  141. package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts.map +1 -1
  142. package/dist/modules/mcp/oauth/bevel-oauth-provider.js +180 -8
  143. package/dist/modules/mcp/oauth/bevel-oauth-provider.js.map +1 -1
  144. package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts +4 -4
  145. package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts.map +1 -1
  146. package/dist/modules/plugins/compile/marketplace-compiler.service.js +7 -10
  147. package/dist/modules/plugins/compile/marketplace-compiler.service.js.map +1 -1
  148. package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.d.ts +4 -1
  149. package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.d.ts.map +1 -1
  150. package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.js +5 -3
  151. package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.js.map +1 -1
  152. package/dist/modules/plugins/discovery/kb-plugin-source.d.ts +6 -1
  153. package/dist/modules/plugins/discovery/kb-plugin-source.d.ts.map +1 -1
  154. package/dist/modules/plugins/discovery/kb-plugin-source.js +14 -9
  155. package/dist/modules/plugins/discovery/kb-plugin-source.js.map +1 -1
  156. package/dist/modules/plugins/discovery/native.source.d.ts +4 -1
  157. package/dist/modules/plugins/discovery/native.source.d.ts.map +1 -1
  158. package/dist/modules/plugins/discovery/native.source.js +4 -2
  159. package/dist/modules/plugins/discovery/native.source.js.map +1 -1
  160. package/dist/modules/plugins/index.d.ts +1 -1
  161. package/dist/modules/plugins/index.d.ts.map +1 -1
  162. package/dist/modules/plugins/index.js +1 -1
  163. package/dist/modules/plugins/index.js.map +1 -1
  164. package/dist/modules/plugins/join-request-jobs.service.d.ts +3 -1
  165. package/dist/modules/plugins/join-request-jobs.service.d.ts.map +1 -1
  166. package/dist/modules/plugins/join-request-jobs.service.js +6 -6
  167. package/dist/modules/plugins/join-request-jobs.service.js.map +1 -1
  168. package/dist/modules/plugins/join-requests.service.d.ts +3 -1
  169. package/dist/modules/plugins/join-requests.service.d.ts.map +1 -1
  170. package/dist/modules/plugins/join-requests.service.js +9 -8
  171. package/dist/modules/plugins/join-requests.service.js.map +1 -1
  172. package/dist/modules/plugins/plugin-links.d.ts +65 -10
  173. package/dist/modules/plugins/plugin-links.d.ts.map +1 -1
  174. package/dist/modules/plugins/plugin-links.js +136 -31
  175. package/dist/modules/plugins/plugin-links.js.map +1 -1
  176. package/dist/modules/plugins/plugin-links.service.d.ts +107 -5
  177. package/dist/modules/plugins/plugin-links.service.d.ts.map +1 -1
  178. package/dist/modules/plugins/plugin-links.service.js +151 -21
  179. package/dist/modules/plugins/plugin-links.service.js.map +1 -1
  180. package/dist/modules/plugins/plugin-provision.service.d.ts +10 -3
  181. package/dist/modules/plugins/plugin-provision.service.d.ts.map +1 -1
  182. package/dist/modules/plugins/plugin-provision.service.js +33 -26
  183. package/dist/modules/plugins/plugin-provision.service.js.map +1 -1
  184. package/dist/modules/plugins/plugin-rename.service.d.ts +4 -2
  185. package/dist/modules/plugins/plugin-rename.service.d.ts.map +1 -1
  186. package/dist/modules/plugins/plugin-rename.service.js +10 -12
  187. package/dist/modules/plugins/plugin-rename.service.js.map +1 -1
  188. package/dist/modules/plugins/plugins.routes.d.ts +3 -0
  189. package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
  190. package/dist/modules/plugins/plugins.routes.js +45 -15
  191. package/dist/modules/plugins/plugins.routes.js.map +1 -1
  192. package/dist/modules/plugins/plugins.service.d.ts +4 -4
  193. package/dist/modules/plugins/plugins.service.d.ts.map +1 -1
  194. package/dist/modules/plugins/plugins.service.js +7 -10
  195. package/dist/modules/plugins/plugins.service.js.map +1 -1
  196. package/dist/modules/plugins/teams.routes.d.ts +4 -1
  197. package/dist/modules/plugins/teams.routes.d.ts.map +1 -1
  198. package/dist/modules/plugins/teams.routes.js +11 -9
  199. package/dist/modules/plugins/teams.routes.js.map +1 -1
  200. package/dist/modules/secrets-vault/index.d.ts +1 -1
  201. package/dist/modules/secrets-vault/index.d.ts.map +1 -1
  202. package/dist/modules/secrets-vault/index.js +1 -1
  203. package/dist/modules/secrets-vault/index.js.map +1 -1
  204. package/dist/modules/secrets-vault/secrets-variable-loader.d.ts +29 -11
  205. package/dist/modules/secrets-vault/secrets-variable-loader.d.ts.map +1 -1
  206. package/dist/modules/secrets-vault/secrets-variable-loader.js +46 -21
  207. package/dist/modules/secrets-vault/secrets-variable-loader.js.map +1 -1
  208. package/dist/modules/secrets-vault/secrets-vault.routes.d.ts +3 -0
  209. package/dist/modules/secrets-vault/secrets-vault.routes.d.ts.map +1 -1
  210. package/dist/modules/secrets-vault/secrets-vault.routes.js +4 -6
  211. package/dist/modules/secrets-vault/secrets-vault.routes.js.map +1 -1
  212. package/dist/modules/settings/deployment-settings.service.d.ts +22 -10
  213. package/dist/modules/settings/deployment-settings.service.d.ts.map +1 -1
  214. package/dist/modules/settings/deployment-settings.service.js +52 -28
  215. package/dist/modules/settings/deployment-settings.service.js.map +1 -1
  216. package/dist/modules/settings/setup.routes.d.ts +9 -2
  217. package/dist/modules/settings/setup.routes.d.ts.map +1 -1
  218. package/dist/modules/settings/setup.routes.js +20 -14
  219. package/dist/modules/settings/setup.routes.js.map +1 -1
  220. package/dist/modules/skills/allowed-tools-check.d.ts +4 -3
  221. package/dist/modules/skills/allowed-tools-check.d.ts.map +1 -1
  222. package/dist/modules/skills/allowed-tools-check.js +8 -8
  223. package/dist/modules/skills/allowed-tools-check.js.map +1 -1
  224. package/dist/modules/skills/pending-skills.service.d.ts +3 -1
  225. package/dist/modules/skills/pending-skills.service.d.ts.map +1 -1
  226. package/dist/modules/skills/pending-skills.service.js +9 -6
  227. package/dist/modules/skills/pending-skills.service.js.map +1 -1
  228. package/dist/modules/skills/skill-access-requests.routes.d.ts +2 -1
  229. package/dist/modules/skills/skill-access-requests.routes.d.ts.map +1 -1
  230. package/dist/modules/skills/skill-access-requests.routes.js +6 -6
  231. package/dist/modules/skills/skill-access-requests.routes.js.map +1 -1
  232. package/dist/modules/skills/skills.routes.d.ts +4 -1
  233. package/dist/modules/skills/skills.routes.d.ts.map +1 -1
  234. package/dist/modules/skills/skills.routes.js +4 -4
  235. package/dist/modules/skills/skills.routes.js.map +1 -1
  236. package/dist/modules/skills/skills.service.d.ts +4 -2
  237. package/dist/modules/skills/skills.service.d.ts.map +1 -1
  238. package/dist/modules/skills/skills.service.js +13 -11
  239. package/dist/modules/skills/skills.service.js.map +1 -1
  240. package/dist/modules/tool-auth/external-api-key.interface.d.ts +21 -5
  241. package/dist/modules/tool-auth/external-api-key.interface.d.ts.map +1 -1
  242. package/dist/modules/tool-auth/external-api-key.interface.js.map +1 -1
  243. package/dist/modules/tool-auth/external-api-key.service.d.ts +1 -0
  244. package/dist/modules/tool-auth/external-api-key.service.d.ts.map +1 -1
  245. package/dist/modules/tool-auth/external-api-key.service.js +22 -9
  246. package/dist/modules/tool-auth/external-api-key.service.js.map +1 -1
  247. package/dist/modules/tool-auth/internal-token.service.d.ts +10 -0
  248. package/dist/modules/tool-auth/internal-token.service.d.ts.map +1 -1
  249. package/dist/modules/tool-auth/internal-token.service.js +1 -0
  250. package/dist/modules/tool-auth/internal-token.service.js.map +1 -1
  251. package/dist/modules/tool-auth/tool-auth.middleware.d.ts +8 -0
  252. package/dist/modules/tool-auth/tool-auth.middleware.d.ts.map +1 -1
  253. package/dist/modules/tool-auth/tool-auth.middleware.js +9 -1
  254. package/dist/modules/tool-auth/tool-auth.middleware.js.map +1 -1
  255. package/dist/modules/tool-manuals/mcp-json-discovery.d.ts +2 -1
  256. package/dist/modules/tool-manuals/mcp-json-discovery.d.ts.map +1 -1
  257. package/dist/modules/tool-manuals/mcp-json-discovery.js +6 -5
  258. package/dist/modules/tool-manuals/mcp-json-discovery.js.map +1 -1
  259. package/dist/modules/tool-manuals/mcp-server-edit.service.d.ts +4 -2
  260. package/dist/modules/tool-manuals/mcp-server-edit.service.d.ts.map +1 -1
  261. package/dist/modules/tool-manuals/mcp-server-edit.service.js +12 -10
  262. package/dist/modules/tool-manuals/mcp-server-edit.service.js.map +1 -1
  263. package/dist/modules/tool-manuals/pending-tools.service.d.ts +3 -1
  264. package/dist/modules/tool-manuals/pending-tools.service.d.ts.map +1 -1
  265. package/dist/modules/tool-manuals/pending-tools.service.js +19 -16
  266. package/dist/modules/tool-manuals/pending-tools.service.js.map +1 -1
  267. package/dist/modules/tool-manuals/tool-delete.service.d.ts +4 -2
  268. package/dist/modules/tool-manuals/tool-delete.service.d.ts.map +1 -1
  269. package/dist/modules/tool-manuals/tool-delete.service.js +14 -12
  270. package/dist/modules/tool-manuals/tool-delete.service.js.map +1 -1
  271. package/dist/modules/tool-manuals/tool-manuals.routes.d.ts +3 -1
  272. package/dist/modules/tool-manuals/tool-manuals.routes.d.ts.map +1 -1
  273. package/dist/modules/tool-manuals/tool-manuals.routes.js +7 -7
  274. package/dist/modules/tool-manuals/tool-manuals.routes.js.map +1 -1
  275. package/dist/modules/tool-manuals/tool-manuals.service.d.ts +4 -2
  276. package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
  277. package/dist/modules/tool-manuals/tool-manuals.service.js +15 -12
  278. package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -1
  279. package/dist/modules/tool-manuals/tool-manuals.tools.d.ts +3 -0
  280. package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
  281. package/dist/modules/tool-manuals/tool-manuals.tools.js +4 -6
  282. package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
  283. package/dist/modules/workflow/agent-tools/workflow.tools.d.ts +3 -2
  284. package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +1 -1
  285. package/dist/modules/workflow/agent-tools/workflow.tools.js +9 -9
  286. package/dist/modules/workflow/agent-tools/workflow.tools.js.map +1 -1
  287. package/dist/modules/workflow/git/git.service.d.ts +11 -5
  288. package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
  289. package/dist/modules/workflow/git/git.service.js +23 -14
  290. package/dist/modules/workflow/git/git.service.js.map +1 -1
  291. package/dist/modules/workflow/git/node-git-runner.d.ts +26 -2
  292. package/dist/modules/workflow/git/node-git-runner.d.ts.map +1 -1
  293. package/dist/modules/workflow/git/node-git-runner.js +35 -5
  294. package/dist/modules/workflow/git/node-git-runner.js.map +1 -1
  295. package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts.map +1 -1
  296. package/dist/modules/workflow/review-workflow/review-workflow.service.js +9 -4
  297. package/dist/modules/workflow/review-workflow/review-workflow.service.js.map +1 -1
  298. package/dist/modules/workflow/session-ontology.service.d.ts +6 -1
  299. package/dist/modules/workflow/session-ontology.service.d.ts.map +1 -1
  300. package/dist/modules/workflow/session-ontology.service.js +6 -2
  301. package/dist/modules/workflow/session-ontology.service.js.map +1 -1
  302. package/dist/modules/workflow/workflow.service.d.ts +8 -3
  303. package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
  304. package/dist/modules/workflow/workflow.service.js +33 -23
  305. package/dist/modules/workflow/workflow.service.js.map +1 -1
  306. package/dist/modules/workspace/session-ontology.gate.d.ts +3 -1
  307. package/dist/modules/workspace/session-ontology.gate.d.ts.map +1 -1
  308. package/dist/modules/workspace/session-ontology.gate.js +3 -3
  309. package/dist/modules/workspace/session-ontology.gate.js.map +1 -1
  310. package/dist/modules/workspace/startup/kb-git.d.ts +4 -3
  311. package/dist/modules/workspace/startup/kb-git.d.ts.map +1 -1
  312. package/dist/modules/workspace/startup/kb-git.js +15 -13
  313. package/dist/modules/workspace/startup/kb-git.js.map +1 -1
  314. package/dist/modules/workspace/startup/kb-startup-runner.d.ts +5 -8
  315. package/dist/modules/workspace/startup/kb-startup-runner.d.ts.map +1 -1
  316. package/dist/modules/workspace/startup/kb-startup-runner.js +35 -38
  317. package/dist/modules/workspace/startup/kb-startup-runner.js.map +1 -1
  318. package/dist/modules/workspace/startup/steps/groups-to-plugins.step.d.ts +7 -1
  319. package/dist/modules/workspace/startup/steps/groups-to-plugins.step.d.ts.map +1 -1
  320. package/dist/modules/workspace/startup/steps/groups-to-plugins.step.js +23 -16
  321. package/dist/modules/workspace/startup/steps/groups-to-plugins.step.js.map +1 -1
  322. package/dist/modules/workspace/startup/steps/personal-spaces.step.d.ts +7 -1
  323. package/dist/modules/workspace/startup/steps/personal-spaces.step.d.ts.map +1 -1
  324. package/dist/modules/workspace/startup/steps/personal-spaces.step.js +12 -5
  325. package/dist/modules/workspace/startup/steps/personal-spaces.step.js.map +1 -1
  326. package/dist/modules/workspace/startup/steps/plugin-display-names.step.d.ts +7 -1
  327. package/dist/modules/workspace/startup/steps/plugin-display-names.step.d.ts.map +1 -1
  328. package/dist/modules/workspace/startup/steps/plugin-display-names.step.js +12 -5
  329. package/dist/modules/workspace/startup/steps/plugin-display-names.step.js.map +1 -1
  330. package/dist/modules/workspace/startup/steps/plugin-manifests.step.d.ts +7 -1
  331. package/dist/modules/workspace/startup/steps/plugin-manifests.step.d.ts.map +1 -1
  332. package/dist/modules/workspace/startup/steps/plugin-manifests.step.js +12 -5
  333. package/dist/modules/workspace/startup/steps/plugin-manifests.step.js.map +1 -1
  334. package/dist/modules/workspace/startup/steps/seed-tree.d.ts +4 -1
  335. package/dist/modules/workspace/startup/steps/seed-tree.d.ts.map +1 -1
  336. package/dist/modules/workspace/startup/steps/seed-tree.js +14 -11
  337. package/dist/modules/workspace/startup/steps/seed-tree.js.map +1 -1
  338. package/dist/modules/workspace/startup/steps/template-files.step.d.ts +17 -3
  339. package/dist/modules/workspace/startup/steps/template-files.step.d.ts.map +1 -1
  340. package/dist/modules/workspace/startup/steps/template-files.step.js +36 -30
  341. package/dist/modules/workspace/startup/steps/template-files.step.js.map +1 -1
  342. package/dist/modules/workspace/startup/steps/template-source.d.ts +6 -1
  343. package/dist/modules/workspace/startup/steps/template-source.d.ts.map +1 -1
  344. package/dist/modules/workspace/startup/steps/template-source.js +10 -6
  345. package/dist/modules/workspace/startup/steps/template-source.js.map +1 -1
  346. package/dist/modules/workspace/workspace.routes.d.ts +2 -1
  347. package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
  348. package/dist/modules/workspace/workspace.routes.js +8 -7
  349. package/dist/modules/workspace/workspace.routes.js.map +1 -1
  350. package/dist/modules/workspace/workspace.service.d.ts +26 -12
  351. package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
  352. package/dist/modules/workspace/workspace.service.js +41 -28
  353. package/dist/modules/workspace/workspace.service.js.map +1 -1
  354. package/dist/modules/workspace/workspace.tools.d.ts +2 -1
  355. package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
  356. package/dist/modules/workspace/workspace.tools.js +69 -31
  357. package/dist/modules/workspace/workspace.tools.js.map +1 -1
  358. package/dist/modules/workspace/write-denial.d.ts +3 -2
  359. package/dist/modules/workspace/write-denial.d.ts.map +1 -1
  360. package/dist/modules/workspace/write-denial.js +6 -5
  361. package/dist/modules/workspace/write-denial.js.map +1 -1
  362. package/dist/shared/git-internals.d.ts +7 -1
  363. package/dist/shared/git-internals.d.ts.map +1 -1
  364. package/dist/shared/git-internals.js +67 -9
  365. package/dist/shared/git-internals.js.map +1 -1
  366. package/dist/shared/git.contract.d.ts +52 -7
  367. package/dist/shared/git.contract.d.ts.map +1 -1
  368. package/dist/shared/git.contract.js +30 -8
  369. package/dist/shared/git.contract.js.map +1 -1
  370. package/dist/shared/kb-context.d.ts +76 -0
  371. package/dist/shared/kb-context.d.ts.map +1 -0
  372. package/dist/shared/kb-context.js +108 -0
  373. package/dist/shared/kb-context.js.map +1 -0
  374. package/dist/shared/kb-layout.d.ts +3 -2
  375. package/dist/shared/kb-layout.d.ts.map +1 -1
  376. package/dist/shared/kb-layout.js +4 -3
  377. package/dist/shared/kb-layout.js.map +1 -1
  378. package/dist/shared/kb-layout.test.js +35 -27
  379. package/dist/shared/kb-layout.test.js.map +1 -1
  380. package/dist/shared/pending-proposals.d.ts +4 -1
  381. package/dist/shared/pending-proposals.d.ts.map +1 -1
  382. package/dist/shared/pending-proposals.js +3 -4
  383. package/dist/shared/pending-proposals.js.map +1 -1
  384. package/dist/shared/redact-secret.d.ts +5 -5
  385. package/dist/shared/redact-secret.js +5 -5
  386. package/dist/tenancy/index.d.ts +13 -0
  387. package/dist/tenancy/index.d.ts.map +1 -0
  388. package/dist/tenancy/index.js +13 -0
  389. package/dist/tenancy/index.js.map +1 -0
  390. package/dist/tenancy/static-tenant-source.d.ts +98 -0
  391. package/dist/tenancy/static-tenant-source.d.ts.map +1 -0
  392. package/dist/tenancy/static-tenant-source.js +220 -0
  393. package/dist/tenancy/static-tenant-source.js.map +1 -0
  394. package/dist/tenancy/tenant-host.d.ts +80 -0
  395. package/dist/tenancy/tenant-host.d.ts.map +1 -0
  396. package/dist/tenancy/tenant-host.js +217 -0
  397. package/dist/tenancy/tenant-host.js.map +1 -0
  398. package/dist/tenancy/tenant-runtime.d.ts +91 -0
  399. package/dist/tenancy/tenant-runtime.d.ts.map +1 -0
  400. package/dist/tenancy/tenant-runtime.js +174 -0
  401. package/dist/tenancy/tenant-runtime.js.map +1 -0
  402. package/dist/tenancy/tenant-secrets.d.ts +24 -0
  403. package/dist/tenancy/tenant-secrets.d.ts.map +1 -0
  404. package/dist/tenancy/tenant-secrets.js +30 -0
  405. package/dist/tenancy/tenant-secrets.js.map +1 -0
  406. package/dist/tenancy/tenant-source.contract.d.ts +45 -0
  407. package/dist/tenancy/tenant-source.contract.d.ts.map +1 -0
  408. package/dist/tenancy/tenant-source.contract.js +21 -0
  409. package/dist/tenancy/tenant-source.contract.js.map +1 -0
  410. package/migrations/0000_core_init.sql +14 -14
  411. package/migrations/0003_deployment_settings.sql +1 -1
  412. package/migrations/0005_github_facade.sql +1 -1
  413. package/migrations/0012_agent_audit.sql +41 -0
  414. package/migrations/0013_agent_identity_and_key_soft_delete.sql +29 -0
  415. package/migrations/meta/0012_snapshot.json +2247 -0
  416. package/migrations/meta/0013_snapshot.json +2259 -0
  417. package/migrations/meta/_journal.json +14 -0
  418. package/package.json +4 -4
  419. package/src/__tests__/branch-model.test.ts +7 -6
  420. package/src/__tests__/kb-context.ts +30 -0
  421. package/src/__tests__/kb-layout-config.test.ts +35 -30
  422. package/src/core/__tests__/catalog-cache-invalidation.test.ts +2 -1
  423. package/src/core/__tests__/lifecycle.test.ts +78 -1
  424. package/src/core/__tests__/public-config.test.ts +5 -1
  425. package/src/core/catalog-cache-invalidation.ts +16 -11
  426. package/src/core/core-ports.ts +19 -0
  427. package/src/core/create-core-server.ts +55 -106
  428. package/src/core/create-core-services.ts +193 -95
  429. package/src/core/lifecycle.ts +214 -29
  430. package/src/core/public-config.ts +8 -5
  431. package/src/core-config.ts +107 -8
  432. package/src/index.ts +25 -2
  433. package/src/modules/access/__tests__/access-control.admin-root-floor.test.ts +2 -1
  434. package/src/modules/access/__tests__/access.routes.batch.test.ts +2 -1
  435. package/src/modules/access/__tests__/access.routes.folder-governs.test.ts +2 -1
  436. package/src/modules/access/__tests__/access.routes.group-grant.test.ts +2 -1
  437. package/src/modules/access/__tests__/access.routes.overrides.test.ts +2 -1
  438. package/src/modules/access/__tests__/access.routes.proposal-branch.test.ts +2 -1
  439. package/src/modules/access/__tests__/access.routes.prospective.test.ts +2 -1
  440. package/src/modules/access/__tests__/access.routes.revoke.test.ts +2 -1
  441. package/src/modules/access/__tests__/access.routes.unknown-email.test.ts +2 -1
  442. package/src/modules/access/__tests__/change-read-gate.test.ts +13 -11
  443. package/src/modules/access/__tests__/creator-access.test.ts +3 -2
  444. package/src/modules/access/__tests__/roles.routes.test.ts +2 -1
  445. package/src/modules/access/access-control.service.ts +20 -6
  446. package/src/modules/access/access.routes.ts +10 -13
  447. package/src/modules/access/change-read-gate.ts +10 -4
  448. package/src/modules/access/creator-access.ts +7 -2
  449. package/src/modules/agent-instructions/__tests__/read-preamble.test.ts +13 -12
  450. package/src/modules/agent-instructions/read-preamble.ts +10 -12
  451. package/src/modules/audit/__tests__/agent-audit.service.test.ts +370 -0
  452. package/src/modules/audit/__tests__/agent-rest-audit.middleware.test.ts +113 -0
  453. package/src/modules/audit/__tests__/audit.routes.test.ts +201 -0
  454. package/src/modules/audit/__tests__/event-classifier.test.ts +121 -0
  455. package/src/modules/audit/agent-audit.service.ts +316 -0
  456. package/src/modules/audit/agent-rest-audit.middleware.ts +83 -0
  457. package/src/modules/audit/audit.contract.ts +164 -0
  458. package/src/modules/audit/audit.routes.ts +168 -0
  459. package/src/modules/audit/event-classifier.ts +155 -0
  460. package/src/modules/audit/index.ts +14 -0
  461. package/src/modules/audit/request-audit.ts +141 -0
  462. package/src/modules/auth/__tests__/account.routes.test.ts +15 -0
  463. package/src/modules/auth/__tests__/auth.service.test.ts +60 -0
  464. package/src/modules/auth/account-admission.ts +44 -0
  465. package/src/modules/auth/account.routes.ts +4 -1
  466. package/src/modules/auth/auth.service.ts +33 -1
  467. package/src/modules/auth/oidc-auth-provider.ts +9 -0
  468. package/src/modules/connection-probe/connection-probe.service.ts +7 -1
  469. package/src/modules/database/__tests__/advisory-lock.test.ts +23 -1
  470. package/src/modules/database/__tests__/connection.test.ts +98 -0
  471. package/src/modules/database/__tests__/migrations-unqualified.test.ts +32 -0
  472. package/src/modules/database/advisory-lock.ts +28 -4
  473. package/src/modules/database/connection.ts +143 -13
  474. package/src/modules/database/core-schema.ts +104 -0
  475. package/src/modules/database/migrate.ts +48 -14
  476. package/src/modules/diff/__tests__/diff.service.seed-atomicity.test.ts +2 -1
  477. package/src/modules/diff/__tests__/diff.service.test.ts +2 -1
  478. package/src/modules/diff/diff.service.ts +6 -1
  479. package/src/modules/kb-fs/__tests__/branch-name.test.ts +6 -6
  480. package/src/modules/kb-fs/__tests__/clone-config.test.ts +24 -20
  481. package/src/modules/kb-fs/branch-name.ts +3 -3
  482. package/src/modules/kb-fs/clone-config.ts +15 -12
  483. package/src/modules/kb-fs/git-guarded-filesystem.ts +16 -3
  484. package/src/modules/marketplace/__tests__/marketplace-repo.head.test.ts +2 -1
  485. package/src/modules/mcp/__tests__/bevel-oauth-provider.test.ts +183 -13
  486. package/src/modules/mcp/__tests__/mcp-auth.middleware.test.ts +60 -2
  487. package/src/modules/mcp/__tests__/mcp.routes.local-token.test.ts +24 -4
  488. package/src/modules/mcp/__tests__/mcp.routes.stateless.test.ts +1 -1
  489. package/src/modules/mcp/__tests__/mcp.service.test.ts +120 -3
  490. package/src/modules/mcp/mcp-auth.middleware.ts +31 -0
  491. package/src/modules/mcp/mcp.routes.ts +11 -1
  492. package/src/modules/mcp/mcp.service.ts +73 -8
  493. package/src/modules/mcp/oauth/bevel-oauth-provider.ts +184 -6
  494. package/src/modules/plugins/__tests__/bundle-dialect.e2e.test.ts +12 -11
  495. package/src/modules/plugins/__tests__/bundle-dialect.test.ts +2 -1
  496. package/src/modules/plugins/__tests__/compile-marketplace.test.ts +6 -4
  497. package/src/modules/plugins/__tests__/join-request-jobs.service.test.ts +2 -1
  498. package/src/modules/plugins/__tests__/join-requests.service.test.ts +2 -1
  499. package/src/modules/plugins/__tests__/plugin-creation-display-name.test.ts +4 -3
  500. package/src/modules/plugins/__tests__/plugin-index.service.test.ts +6 -4
  501. package/src/modules/plugins/__tests__/plugin-links.service.test.ts +220 -5
  502. package/src/modules/plugins/__tests__/plugin-provision.service.test.ts +3 -1
  503. package/src/modules/plugins/__tests__/plugin-rename.service.test.ts +7 -6
  504. package/src/modules/plugins/__tests__/plugins.routes.test.ts +11 -2
  505. package/src/modules/plugins/__tests__/teams.routes.test.ts +2 -1
  506. package/src/modules/plugins/compile/marketplace-compiler.service.ts +7 -9
  507. package/src/modules/plugins/discovery/__tests__/kb-plugin-source.test.ts +20 -16
  508. package/src/modules/plugins/discovery/bundle-dialect/bundle.source.ts +9 -2
  509. package/src/modules/plugins/discovery/kb-plugin-source.ts +15 -8
  510. package/src/modules/plugins/discovery/native.source.ts +4 -1
  511. package/src/modules/plugins/index.ts +1 -1
  512. package/src/modules/plugins/join-request-jobs.service.ts +8 -7
  513. package/src/modules/plugins/join-requests.service.ts +7 -7
  514. package/src/modules/plugins/plugin-links.service.ts +192 -19
  515. package/src/modules/plugins/plugin-links.ts +147 -27
  516. package/src/modules/plugins/plugin-provision.service.ts +54 -27
  517. package/src/modules/plugins/plugin-rename.service.ts +10 -10
  518. package/src/modules/plugins/plugins.routes.ts +45 -15
  519. package/src/modules/plugins/plugins.service.ts +7 -11
  520. package/src/modules/plugins/teams.routes.ts +16 -8
  521. package/src/modules/secrets-vault/__tests__/connect-pending.route.test.ts +7 -0
  522. package/src/modules/secrets-vault/__tests__/secrets-variable-loader.test.ts +40 -0
  523. package/src/modules/secrets-vault/__tests__/tool-owner-gate.route.test.ts +2 -0
  524. package/src/modules/secrets-vault/index.ts +2 -0
  525. package/src/modules/secrets-vault/secrets-variable-loader.ts +51 -21
  526. package/src/modules/secrets-vault/secrets-vault.routes.ts +7 -6
  527. package/src/modules/settings/__tests__/deployment-settings.service.test.ts +59 -11
  528. package/src/modules/settings/__tests__/git-root-folders.test.ts +2 -1
  529. package/src/modules/settings/__tests__/setup.routes.boot-failure.test.ts +2 -1
  530. package/src/modules/settings/__tests__/setup.routes.layout-phase.test.ts +7 -4
  531. package/src/modules/settings/__tests__/setup.routes.oidc.test.ts +2 -0
  532. package/src/modules/settings/__tests__/setup.routes.sync-status.test.ts +2 -0
  533. package/src/modules/settings/__tests__/setup.routes.test.ts +33 -52
  534. package/src/modules/settings/deployment-settings.service.ts +68 -28
  535. package/src/modules/settings/setup.routes.ts +26 -16
  536. package/src/modules/skills/__tests__/allowed-tools-check.test.ts +11 -10
  537. package/src/modules/skills/__tests__/allowed-tools-warn.tools.test.ts +4 -3
  538. package/src/modules/skills/__tests__/pending-skills.service.test.ts +3 -1
  539. package/src/modules/skills/__tests__/skill-access-requests.routes.test.ts +2 -1
  540. package/src/modules/skills/__tests__/skills.routes.warnings.test.ts +2 -1
  541. package/src/modules/skills/__tests__/skills.service.test.ts +3 -2
  542. package/src/modules/skills/allowed-tools-check.ts +7 -6
  543. package/src/modules/skills/pending-skills.service.ts +9 -8
  544. package/src/modules/skills/skill-access-requests.routes.ts +7 -7
  545. package/src/modules/skills/skills.routes.ts +4 -3
  546. package/src/modules/skills/skills.service.ts +13 -9
  547. package/src/modules/tool-auth/__tests__/external-api-key.service.test.ts +29 -8
  548. package/src/modules/tool-auth/__tests__/internal-token.service.test.ts +6 -0
  549. package/src/modules/tool-auth/external-api-key.interface.ts +22 -5
  550. package/src/modules/tool-auth/external-api-key.service.ts +25 -8
  551. package/src/modules/tool-auth/internal-token.service.ts +11 -0
  552. package/src/modules/tool-auth/tool-auth.middleware.ts +17 -1
  553. package/src/modules/tool-helpers/__tests__/agent-roles-write.test.ts +3 -2
  554. package/src/modules/tool-helpers/__tests__/phase4-tools.test.ts +3 -2
  555. package/src/modules/tool-manuals/__tests__/mcp-json-discovery.test.ts +17 -12
  556. package/src/modules/tool-manuals/__tests__/mcp-server-edit.service.test.ts +2 -1
  557. package/src/modules/tool-manuals/__tests__/pending-tools.service.test.ts +4 -1
  558. package/src/modules/tool-manuals/__tests__/tool-delete.service.test.ts +2 -1
  559. package/src/modules/tool-manuals/__tests__/tool-manuals.archive.route.test.ts +2 -1
  560. package/src/modules/tool-manuals/__tests__/tool-manuals.cli.test.ts +5 -4
  561. package/src/modules/tool-manuals/__tests__/tool-manuals.detail.route.test.ts +2 -1
  562. package/src/modules/tool-manuals/__tests__/tool-manuals.invalid.routes.test.ts +4 -2
  563. package/src/modules/tool-manuals/__tests__/tool-manuals.invalid.test.ts +13 -5
  564. package/src/modules/tool-manuals/__tests__/tool-manuals.mcp-oauth.test.ts +2 -1
  565. package/src/modules/tool-manuals/__tests__/tool-manuals.restart.test.ts +9 -1
  566. package/src/modules/tool-manuals/__tests__/tool-manuals.service.test.ts +3 -2
  567. package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +2 -0
  568. package/src/modules/tool-manuals/mcp-json-discovery.ts +6 -4
  569. package/src/modules/tool-manuals/mcp-server-edit.service.ts +13 -11
  570. package/src/modules/tool-manuals/pending-tools.service.ts +19 -16
  571. package/src/modules/tool-manuals/tool-delete.service.ts +13 -10
  572. package/src/modules/tool-manuals/tool-manuals.routes.ts +10 -8
  573. package/src/modules/tool-manuals/tool-manuals.service.ts +15 -13
  574. package/src/modules/tool-manuals/tool-manuals.tools.ts +7 -6
  575. package/src/modules/workflow/__tests__/apply-failure.test.ts +2 -1
  576. package/src/modules/workflow/__tests__/merge-announces-tree.test.ts +14 -26
  577. package/src/modules/workflow/__tests__/preserve-roles-yaml.test.ts +2 -1
  578. package/src/modules/workflow/__tests__/session-ontology.service.test.ts +3 -2
  579. package/src/modules/workflow/__tests__/workflow.routes.lock-path.test.ts +2 -1
  580. package/src/modules/workflow/__tests__/workflow.service.branch-in-use.test.ts +3 -10
  581. package/src/modules/workflow/__tests__/workflow.service.commitFileWhileLocked.test.ts +2 -1
  582. package/src/modules/workflow/__tests__/workflow.service.deleted-branch-sweep.test.ts +3 -10
  583. package/src/modules/workflow/__tests__/workflow.service.facade.test.ts +28 -27
  584. package/src/modules/workflow/__tests__/workflow.service.folder-proposals.test.ts +2 -1
  585. package/src/modules/workflow/__tests__/workflow.service.platform-restore.test.ts +2 -1
  586. package/src/modules/workflow/__tests__/workflow.service.read-gate.test.ts +3 -2
  587. package/src/modules/workflow/__tests__/workflow.service.releaseLock.test.ts +2 -1
  588. package/src/modules/workflow/__tests__/workflow.service.sync.test.ts +5 -4
  589. package/src/modules/workflow/__tests__/workflow.service.update-from-target.test.ts +2 -1
  590. package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +2 -1
  591. package/src/modules/workflow/agent-tools/workflow.tools.ts +11 -9
  592. package/src/modules/workflow/git/__tests__/git.service.accessGating.test.ts +5 -4
  593. package/src/modules/workflow/git/__tests__/git.service.changedFilesForPr.test.ts +12 -11
  594. package/src/modules/workflow/git/__tests__/git.service.commitChanges.test.ts +9 -8
  595. package/src/modules/workflow/git/__tests__/git.service.commitFile.strayPath.test.ts +8 -7
  596. package/src/modules/workflow/git/__tests__/git.service.commitFile.test.ts +6 -5
  597. package/src/modules/workflow/git/__tests__/git.service.createBranch.test.ts +3 -2
  598. package/src/modules/workflow/git/__tests__/git.service.deleteBranch.test.ts +3 -2
  599. package/src/modules/workflow/git/__tests__/git.service.diffFileAtCommit.test.ts +7 -6
  600. package/src/modules/workflow/git/__tests__/git.service.diffFileBetweenBranches.test.ts +16 -15
  601. package/src/modules/workflow/git/__tests__/git.service.fileContentsAtCommit.test.ts +3 -2
  602. package/src/modules/workflow/git/__tests__/git.service.forkPoint.test.ts +2 -1
  603. package/src/modules/workflow/git/__tests__/git.service.history-guards.test.ts +2 -1
  604. package/src/modules/workflow/git/__tests__/git.service.list-branches.test.ts +10 -9
  605. package/src/modules/workflow/git/__tests__/git.service.listTrackedFiles.test.ts +2 -1
  606. package/src/modules/workflow/git/__tests__/git.service.logForFile.test.ts +6 -5
  607. package/src/modules/workflow/git/__tests__/git.service.mergeChangeRequest.test.ts +9 -8
  608. package/src/modules/workflow/git/__tests__/git.service.pendingChanges.test.ts +2 -1
  609. package/src/modules/workflow/git/__tests__/git.service.postMergePull.test.ts +4 -3
  610. package/src/modules/workflow/git/__tests__/git.service.pull.test.ts +9 -8
  611. package/src/modules/workflow/git/__tests__/git.service.readFileAtRef.test.ts +2 -1
  612. package/src/modules/workflow/git/__tests__/git.service.revertPathsAndPush.test.ts +2 -1
  613. package/src/modules/workflow/git/__tests__/git.service.status.test.ts +4 -3
  614. package/src/modules/workflow/git/__tests__/git.service.syncFromRemote.test.ts +8 -7
  615. package/src/modules/workflow/git/__tests__/node-git-runner.test.ts +41 -3
  616. package/src/modules/workflow/git/git.service.ts +24 -13
  617. package/src/modules/workflow/git/node-git-runner.ts +37 -4
  618. package/src/modules/workflow/review-workflow/review-workflow.service.ts +9 -6
  619. package/src/modules/workflow/session-ontology.service.ts +7 -2
  620. package/src/modules/workflow/workflow.service.ts +31 -24
  621. package/src/modules/workspace/__tests__/file-stat-access.test.ts +3 -2
  622. package/src/modules/workspace/__tests__/git-internals.security.test.ts +144 -52
  623. package/src/modules/workspace/__tests__/session-ontology.gate.test.ts +4 -2
  624. package/src/modules/workspace/__tests__/workspace-paths-inside-the-repo.test.ts +3 -2
  625. package/src/modules/workspace/__tests__/workspace.routes.branch-errors.test.ts +2 -1
  626. package/src/modules/workspace/__tests__/workspace.routes.create-grant.test.ts +2 -1
  627. package/src/modules/workspace/__tests__/workspace.routes.delete.test.ts +2 -1
  628. package/src/modules/workspace/__tests__/workspace.routes.download-implies-read.test.ts +2 -1
  629. package/src/modules/workspace/__tests__/workspace.routes.download.test.ts +2 -1
  630. package/src/modules/workspace/__tests__/workspace.routes.file-writes.test.ts +2 -1
  631. package/src/modules/workspace/__tests__/workspace.routes.folders.test.ts +5 -4
  632. package/src/modules/workspace/__tests__/workspace.routes.move-platform-files.test.ts +2 -1
  633. package/src/modules/workspace/__tests__/workspace.routes.read-gate.test.ts +2 -1
  634. package/src/modules/workspace/__tests__/workspace.service.ensure-remotes-fetched.test.ts +2 -2
  635. package/src/modules/workspace/__tests__/workspace.service.list-cloned.test.ts +6 -5
  636. package/src/modules/workspace/__tests__/workspace.service.move-never-overwrites.test.ts +2 -1
  637. package/src/modules/workspace/__tests__/workspace.service.read-filter.test.ts +2 -1
  638. package/src/modules/workspace/__tests__/workspace.service.test.ts +84 -50
  639. package/src/modules/workspace/__tests__/workspace.service.unknown-branch.test.ts +2 -1
  640. package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +10 -7
  641. package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +4 -3
  642. package/src/modules/workspace/__tests__/workspace.tools.test.ts +9 -8
  643. package/src/modules/workspace/__tests__/write-denial.test.ts +5 -4
  644. package/src/modules/workspace/session-ontology.gate.ts +6 -4
  645. package/src/modules/workspace/startup/__tests__/kb-startup-runner.degraded.test.ts +6 -2
  646. package/src/modules/workspace/startup/__tests__/kb-startup-runner.test.ts +29 -21
  647. package/src/modules/workspace/startup/kb-git.ts +15 -22
  648. package/src/modules/workspace/startup/kb-startup-runner.ts +40 -46
  649. package/src/modules/workspace/startup/steps/__tests__/steps.test.ts +104 -98
  650. package/src/modules/workspace/startup/steps/groups-to-plugins.step.ts +24 -16
  651. package/src/modules/workspace/startup/steps/personal-spaces.step.ts +14 -5
  652. package/src/modules/workspace/startup/steps/plugin-display-names.step.ts +13 -5
  653. package/src/modules/workspace/startup/steps/plugin-manifests.step.ts +14 -5
  654. package/src/modules/workspace/startup/steps/seed-tree.ts +11 -9
  655. package/src/modules/workspace/startup/steps/template-files.step.ts +43 -34
  656. package/src/modules/workspace/startup/steps/template-source.ts +8 -5
  657. package/src/modules/workspace/workspace.routes.ts +8 -7
  658. package/src/modules/workspace/workspace.service.ts +39 -27
  659. package/src/modules/workspace/workspace.tools.ts +68 -31
  660. package/src/modules/workspace/write-denial.ts +7 -5
  661. package/src/shared/__tests__/git-internals.test.ts +41 -0
  662. package/src/shared/__tests__/kb-layout.plugin.test.ts +19 -16
  663. package/src/shared/git-internals.ts +61 -6
  664. package/src/shared/git.contract.ts +70 -8
  665. package/src/shared/kb-context.ts +130 -0
  666. package/src/shared/kb-layout.test.ts +37 -27
  667. package/src/shared/kb-layout.ts +4 -3
  668. package/src/shared/pending-proposals.ts +7 -4
  669. package/src/shared/redact-secret.ts +5 -5
  670. package/src/tenancy/__tests__/static-tenant-source.test.ts +177 -0
  671. package/src/tenancy/__tests__/tenant-host.test.ts +372 -0
  672. package/src/tenancy/__tests__/tenant-runtime.test.ts +221 -0
  673. package/src/tenancy/__tests__/tenant-secrets.test.ts +35 -0
  674. package/src/tenancy/index.ts +35 -0
  675. package/src/tenancy/static-tenant-source.ts +296 -0
  676. package/src/tenancy/tenant-host.ts +261 -0
  677. package/src/tenancy/tenant-runtime.ts +208 -0
  678. package/src/tenancy/tenant-secrets.ts +41 -0
  679. package/src/tenancy/tenant-source.contract.ts +59 -0
  680. package/dist/modules/access/access-errors.d.ts +0 -34
  681. package/dist/modules/access/access-errors.d.ts.map +0 -1
  682. package/dist/modules/access/access-errors.js +0 -40
  683. package/dist/modules/access/access-errors.js.map +0 -1
  684. package/dist/modules/access/access-splice.d.ts +0 -140
  685. package/dist/modules/access/access-splice.d.ts.map +0 -1
  686. package/dist/modules/access/access-splice.js +0 -389
  687. package/dist/modules/access/access-splice.js.map +0 -1
  688. package/dist/modules/access/group-files.d.ts +0 -83
  689. package/dist/modules/access/group-files.d.ts.map +0 -1
  690. package/dist/modules/access/group-files.js +0 -167
  691. package/dist/modules/access/group-files.js.map +0 -1
  692. package/dist/modules/access/kb-read-filter.d.ts +0 -41
  693. package/dist/modules/access/kb-read-filter.d.ts.map +0 -1
  694. package/dist/modules/access/kb-read-filter.js +0 -60
  695. package/dist/modules/access/kb-read-filter.js.map +0 -1
  696. package/dist/modules/access/render-roles-yaml.d.ts +0 -22
  697. package/dist/modules/access/render-roles-yaml.d.ts.map +0 -1
  698. package/dist/modules/access/render-roles-yaml.js +0 -56
  699. package/dist/modules/access/render-roles-yaml.js.map +0 -1
  700. package/dist/modules/access/roles-yaml-guard.d.ts +0 -56
  701. package/dist/modules/access/roles-yaml-guard.d.ts.map +0 -1
  702. package/dist/modules/access/roles-yaml-guard.js +0 -79
  703. package/dist/modules/access/roles-yaml-guard.js.map +0 -1
  704. package/dist/modules/diff/diff-paths.d.ts +0 -2
  705. package/dist/modules/diff/diff-paths.d.ts.map +0 -1
  706. package/dist/modules/diff/diff-paths.js +0 -9
  707. package/dist/modules/diff/diff-paths.js.map +0 -1
  708. package/dist/modules/groups/group-provision.service.d.ts +0 -130
  709. package/dist/modules/groups/group-provision.service.d.ts.map +0 -1
  710. package/dist/modules/groups/group-provision.service.js +0 -288
  711. package/dist/modules/groups/group-provision.service.js.map +0 -1
  712. package/dist/modules/groups/groups.contract.d.ts +0 -106
  713. package/dist/modules/groups/groups.contract.d.ts.map +0 -1
  714. package/dist/modules/groups/groups.contract.js +0 -36
  715. package/dist/modules/groups/groups.contract.js.map +0 -1
  716. package/dist/modules/groups/groups.routes.d.ts +0 -42
  717. package/dist/modules/groups/groups.routes.d.ts.map +0 -1
  718. package/dist/modules/groups/groups.routes.js +0 -379
  719. package/dist/modules/groups/groups.routes.js.map +0 -1
  720. package/dist/modules/groups/groups.service.d.ts +0 -60
  721. package/dist/modules/groups/groups.service.d.ts.map +0 -1
  722. package/dist/modules/groups/groups.service.js +0 -172
  723. package/dist/modules/groups/groups.service.js.map +0 -1
  724. package/dist/modules/groups/index.d.ts +0 -7
  725. package/dist/modules/groups/index.d.ts.map +0 -1
  726. package/dist/modules/groups/index.js +0 -6
  727. package/dist/modules/groups/index.js.map +0 -1
  728. package/dist/modules/groups/join-proposals.d.ts +0 -53
  729. package/dist/modules/groups/join-proposals.d.ts.map +0 -1
  730. package/dist/modules/groups/join-proposals.js +0 -67
  731. package/dist/modules/groups/join-proposals.js.map +0 -1
  732. package/dist/modules/groups/join-requests.service.d.ts +0 -81
  733. package/dist/modules/groups/join-requests.service.d.ts.map +0 -1
  734. package/dist/modules/groups/join-requests.service.js +0 -135
  735. package/dist/modules/groups/join-requests.service.js.map +0 -1
  736. package/dist/modules/mcp/mcp-session-store.d.ts +0 -74
  737. package/dist/modules/mcp/mcp-session-store.d.ts.map +0 -1
  738. package/dist/modules/mcp/mcp-session-store.js +0 -131
  739. package/dist/modules/mcp/mcp-session-store.js.map +0 -1
  740. package/dist/modules/workflow/file-change-notifier.d.ts +0 -38
  741. package/dist/modules/workflow/file-change-notifier.d.ts.map +0 -1
  742. package/dist/modules/workflow/file-change-notifier.js +0 -22
  743. package/dist/modules/workflow/file-change-notifier.js.map +0 -1
  744. package/dist/modules/workflow/git/branch-name.d.ts +0 -10
  745. package/dist/modules/workflow/git/branch-name.d.ts.map +0 -1
  746. package/dist/modules/workflow/git/branch-name.js +0 -76
  747. package/dist/modules/workflow/git/branch-name.js.map +0 -1
  748. package/dist/modules/workflow/git/clone-config.d.ts +0 -61
  749. package/dist/modules/workflow/git/clone-config.d.ts.map +0 -1
  750. package/dist/modules/workflow/git/clone-config.js +0 -69
  751. package/dist/modules/workflow/git/clone-config.js.map +0 -1
  752. package/dist/modules/workflow/git/mutex.d.ts +0 -11
  753. package/dist/modules/workflow/git/mutex.d.ts.map +0 -1
  754. package/dist/modules/workflow/git/mutex.js +0 -23
  755. package/dist/modules/workflow/git/mutex.js.map +0 -1
  756. package/dist/modules/workflow/locking-filesystem.d.ts +0 -137
  757. package/dist/modules/workflow/locking-filesystem.d.ts.map +0 -1
  758. package/dist/modules/workflow/locking-filesystem.js +0 -553
  759. package/dist/modules/workflow/locking-filesystem.js.map +0 -1
  760. package/dist/modules/workflow/read-only-filesystem.d.ts +0 -24
  761. package/dist/modules/workflow/read-only-filesystem.d.ts.map +0 -1
  762. package/dist/modules/workflow/read-only-filesystem.js +0 -39
  763. package/dist/modules/workflow/read-only-filesystem.js.map +0 -1
  764. package/dist/modules/workflow/workflow.errors.d.ts +0 -197
  765. package/dist/modules/workflow/workflow.errors.d.ts.map +0 -1
  766. package/dist/modules/workflow/workflow.errors.js +0 -298
  767. package/dist/modules/workflow/workflow.errors.js.map +0 -1
  768. package/dist/modules/workspace/bevel-ignore.d.ts +0 -30
  769. package/dist/modules/workspace/bevel-ignore.d.ts.map +0 -1
  770. package/dist/modules/workspace/bevel-ignore.js +0 -61
  771. package/dist/modules/workspace/bevel-ignore.js.map +0 -1
  772. package/dist/modules/workspace/kb-seed.interface.d.ts +0 -36
  773. package/dist/modules/workspace/kb-seed.interface.d.ts.map +0 -1
  774. package/dist/modules/workspace/kb-seed.interface.js +0 -2
  775. package/dist/modules/workspace/kb-seed.interface.js.map +0 -1
  776. package/dist/modules/workspace/kb-seed.service.d.ts +0 -125
  777. package/dist/modules/workspace/kb-seed.service.d.ts.map +0 -1
  778. package/dist/modules/workspace/kb-seed.service.js +0 -535
  779. package/dist/modules/workspace/kb-seed.service.js.map +0 -1
  780. package/dist/modules/workspace/plugins-migration.d.ts +0 -50
  781. package/dist/modules/workspace/plugins-migration.d.ts.map +0 -1
  782. package/dist/modules/workspace/plugins-migration.js +0 -379
  783. package/dist/modules/workspace/plugins-migration.js.map +0 -1
  784. package/dist/shared/fs-errors.d.ts +0 -8
  785. package/dist/shared/fs-errors.d.ts.map +0 -1
  786. package/dist/shared/fs-errors.js +0 -11
  787. package/dist/shared/fs-errors.js.map +0 -1
  788. package/dist/shared/fs-walk.d.ts +0 -23
  789. package/dist/shared/fs-walk.d.ts.map +0 -1
  790. package/dist/shared/fs-walk.js +0 -42
  791. package/dist/shared/fs-walk.js.map +0 -1
  792. package/dist/shared/hash-email.d.ts +0 -11
  793. package/dist/shared/hash-email.d.ts.map +0 -1
  794. package/dist/shared/hash-email.js +0 -14
  795. package/dist/shared/hash-email.js.map +0 -1
  796. package/dist/shared/kb-walk.d.ts +0 -52
  797. package/dist/shared/kb-walk.d.ts.map +0 -1
  798. package/dist/shared/kb-walk.js +0 -76
  799. package/dist/shared/kb-walk.js.map +0 -1
@@ -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
 
@@ -130,6 +132,7 @@ import {
130
132
  } from '../modules/tool-auth/tool-auth.middleware.js';
131
133
  import { unmeteredLlmUsage, type ILlmUsageMeter } from '../modules/tool-auth/llm-usage-meter.js';
132
134
  import { McpService } from '../modules/mcp/mcp.service.js';
135
+ import { AgentAuditService, retentionDaysFrom } from '../modules/audit/agent-audit.service.js';
133
136
  import { readAgentPreamble, type AgentPreambleReader } from '../modules/agent-instructions/index.js';
134
137
  import { createMcpAuthMiddleware } from '../modules/mcp/mcp-auth.middleware.js';
135
138
  import { BevelOAuthProvider } from '../modules/mcp/oauth/bevel-oauth-provider.js';
@@ -154,7 +157,7 @@ import { registerCatalogCacheInvalidation } from './catalog-cache-invalidation.j
154
157
  * core services to construct). See {@link CorePorts} for the pattern.
155
158
  */
156
159
  export interface CoreServices {
157
- config: CoreConfig;
160
+ config: TenantConfig;
158
161
  db: Database;
159
162
  /**
160
163
  * Reading the disk without locks — the one tree walk and the one path
@@ -183,6 +186,20 @@ export interface CoreServices {
183
186
  * first-time setup completion — and never again while the process serves.
184
187
  */
185
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;
186
203
  spillStore: SpillStore;
187
204
  docExtractService: DocExtractService;
188
205
  accessControl: AccessControlService;
@@ -263,12 +280,20 @@ export interface CoreServices {
263
280
  updateCheckService: UpdateCheckService;
264
281
  /** Deployment settings, env-first — the KB remote resolves through these. */
265
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;
266
291
  /**
267
292
  * The knowledge-base directory name IN EFFECT — environment first, then the
268
293
  * stored setting, then the default. Published here because `config.kbDirName`
269
294
  * is only the environment's half of that answer: reading it directly gives
270
295
  * the empty string on any deployment configured through the setup screen, and
271
- * every path built from it would be wrong.
296
+ * every path built from it would be wrong. The same value as `kb.kbDirName`.
272
297
  */
273
298
  kbDirName: string;
274
299
  secretsVaultService: DbSecretsVaultService;
@@ -284,6 +309,8 @@ export interface CoreServices {
284
309
  * advertise the same pointer the auth middleware does.
285
310
  */
286
311
  mcpResourceMetadataUrl: string;
312
+ /** The Audit log: what every connected agent and key called, and the revoke of an agent's grant. */
313
+ agentAuditService: AgentAuditService;
287
314
  toolRegistry: ToolRegistry;
288
315
  toolAuthMiddleware: ReturnType<typeof createToolAuthMiddleware>;
289
316
  manualAuthMiddleware: ReturnType<typeof createManualAuthMiddleware>;
@@ -298,14 +325,28 @@ export interface CoreServices {
298
325
  }
299
326
 
300
327
  export async function createCoreServices(
301
- config: CoreConfig,
328
+ config: TenantConfig,
302
329
  ports: CorePorts = {},
303
330
  ): Promise<CoreServices> {
304
331
  // Fail fast on a runtime whose git is too old for `--no-write-fetch-head`
305
332
  // (see `git-version.ts`): every clone, fetch and refresh below depends on it,
306
333
  // so an unsupported binary is better surfaced here than at the first merge.
307
334
  await assertGitVersion();
308
- 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
+ }
309
350
  // Migrations must run BEFORE any service that reads or writes a managed
310
351
  // table. `PendingCommitsService.startupReconcile` (called later in this
311
352
  // function) hits `pending_commits` — on a fresh DB, deferring migrations to
@@ -322,40 +363,13 @@ export async function createCoreServices(
322
363
  // is resolved through them, and a fresh install has none of it in the
323
364
  // environment. `load()` is env-first, so an existing deployment sees exactly
324
365
  // what it saw before — a stored row only answers where a variable is silent.
325
- const settings = new DeploymentSettingsService(db, config.secretsEncKey);
366
+ const settings = new DeploymentSettingsService(db, config.secretsEncKey, undefined, { env: config.settingsEnv });
326
367
  await settings.load();
327
368
 
328
- /**
329
- * The branch model, before anything reads it. It used to be applied at import
330
- * time from the environment, which is what forced the frontend to bake it
331
- * into its bundle; it now comes through the settings store like the rest of
332
- * the deployment's configuration (environment first, as always).
333
- *
334
- * UNCONFIGURED IS ALLOWED, and that is the point: a fresh deployment has no
335
- * branch model, and refusing to boot would take away the setup screen where
336
- * one gets entered. What reads it before then is the setup path itself, which
337
- * does not need it — the bootstrap admin is recognised without a workspace.
338
- * `isComplete` keeps the rest of the app behind the gate until it is set, and
339
- * the setting is restart-to-apply because services take the value at
340
- * construction.
341
- */
342
- const branchModel = {
343
- defaultBranch: settings.resolve('defaultBranch'),
344
- protectedBranches: settings.resolve('protectedBranches'),
345
- };
346
- if (!validateBranchModel(branchModel)) configureBranchModel(branchModel);
347
369
  // The layout variables that were retired this release, folded into their
348
370
  // saved settings before anything reads the layout — so the boot that imports
349
371
  // them also RUNS on the imported names rather than on the defaults.
350
372
  await settings.importLegacyLayoutEnv();
351
- // The KB layout — the three renameable roots and the agent guide's file name
352
- // — applied the same way and at the same moment, before any service captures
353
- // one of them. Unlike the branch model it always resolves (every name has a
354
- // default), so an invalid value is a real misconfiguration and stops the boot.
355
- configureKbLayout(settings.resolveKbLayout());
356
- // A token supplied through the setup screen has to reach the credential
357
- // helper, which reads `$GITHUB_TOKEN` at call time.
358
- settings.syncGitTokenEnv();
359
373
 
360
374
  // `kbDirName` is read ONCE and threaded into a dozen services as a plain
361
375
  // string, which is why changing it needs a restart (the setting says so).
@@ -367,19 +381,73 @@ export async function createCoreServices(
367
381
  // unnameable. Both are operator settings, so the collision is refused here,
368
382
  // by name, before any service captures either.
369
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
+ }
370
428
  // The disk: one walk, one probe, for every reader below.
371
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
+ );
372
441
  // How git is run, for every module that runs it: one environment, one buffer
373
442
  // ceiling, one error shape, and — the reason it exists — one deadline, so a
374
443
  // git that never returns cannot hold a workspace (and with it the commit
375
444
  // queue) open indefinitely. See `shared/git.contract.ts`.
376
- const gitRunner = new NodeGitRunner(config.gitTimeoutMs);
445
+ const gitRunner = new NodeGitRunner(config.gitTimeoutMs, gitCredentialsInEffect);
377
446
  const workspaceService = new WorkspaceService(
378
447
  config.workspacesRoot,
379
448
  () => settings.resolve('kbRepoUrl'),
380
- kbDirName,
449
+ kb,
381
450
  disk,
382
- () => settings.resolve('gitUsername') || 'x-access-token',
383
451
  gitRunner,
384
452
  );
385
453
  // The KB startup phase: every seeding, scaffolding and migration concern,
@@ -397,18 +465,18 @@ export async function createCoreServices(
397
465
  // read-only, needs no remote, and must be said even on a deployment whose
398
466
  // setup never finished — so `noteBesideCheckout` runs once from the server
399
467
  // builder, ahead of this gated phase.)
400
- new GroupsToPluginsStep(disk),
401
- new PluginManifestsStep(disk),
468
+ new GroupsToPluginsStep(disk, kb),
469
+ new PluginManifestsStep(disk, kb),
402
470
  // After the manifests step: a folder that only just got its manifest got
403
471
  // one the renderer wrote, which already carries the display name — the
404
472
  // backfill then has nothing to do for it. Ordered the other way, the
405
473
  // backfill would walk a tree still missing those manifests.
406
- new PluginDisplayNamesStep(disk),
407
- new PersonalSpacesStep(disk),
474
+ new PluginDisplayNamesStep(disk, kb),
475
+ new PersonalSpacesStep(disk, kb),
408
476
  // A getter, not a value: the step is built here, while the process may
409
477
  // still hold the defaults, and the save that completes first-run setup
410
478
  // applies the admin's answer afterwards.
411
- new TemplateFilesStep(disk, extraDirs, () => settings.resolveAgentsFileLink()),
479
+ new TemplateFilesStep(disk, kb, extraDirs, () => settings.resolveAgentsFileLink()),
412
480
  new RolesYamlStep(disk, [config.adminEmail]),
413
481
  ...(ports.kbStartupSteps ?? []),
414
482
  ];
@@ -417,18 +485,16 @@ export async function createCoreServices(
417
485
  // setup screen after this object exists, and the setup-completion run is
418
486
  // the first thing that needs them.
419
487
  kbRepoUrl: () => settings.resolve('kbRepoUrl'),
420
- gitUsername: () => settings.resolve('gitUsername') || 'x-access-token',
421
- gitToken: () => settings.resolve('gitToken'),
422
488
  workspacesRoot: config.workspacesRoot,
423
489
  kbDirName,
424
490
  templateDir: config.kbTemplateDir,
425
- defaultBranch: () => DEFAULT_BRANCH,
426
- protectedBranches: () => [...PROTECTED_BRANCHES],
491
+ defaultBranch: () => kb.defaultBranch,
492
+ protectedBranches: () => [...kb.protectedBranches],
427
493
  // The deployment owner is the initial Admin of a freshly seeded KB — the
428
494
  // same answer `SEED_ADMIN_EMAILS` used to ask for a second time.
429
495
  seedAdminEmails: [config.adminEmail],
430
496
  steps: kbStartupSteps,
431
- buildSeedTree: buildSeedTree(disk, config.kbTemplateDir, extraDirs, [config.adminEmail]),
497
+ buildSeedTree: buildSeedTree(disk, config.kbTemplateDir, extraDirs, [config.adminEmail], kb),
432
498
  gitRunner,
433
499
  });
434
500
  // Shared, workspace-independent store for oversized `call_tool_chain` results,
@@ -449,49 +515,50 @@ export async function createCoreServices(
449
515
  disk,
450
516
  [config.adminEmail],
451
517
  gitRunner,
518
+ kb,
452
519
  );
453
520
  // Creator read-grant on creation: read is default-deny and the roots grant
454
521
  // it to nobody, so every surface that starts a new folder at a root (human
455
522
  // routes, agent tools, upload apply) consults this planner to keep the new
456
523
  // folder visible to its creator.
457
- const creatorAccess = new CreatorAccessService(workspaceService, accessControl, kbDirName, disk);
524
+ const creatorAccess = new CreatorAccessService(workspaceService, accessControl, kb, disk);
458
525
  // Read-before-write: the gate every lock acquire asks, on every branch —
459
526
  // nothing is created, changed or removed where its author cannot read,
460
527
  // except that new folder at a root (see `access-model/change-gate.ts`).
461
- const changeGate = new ChangeReadGate(workspaceService, accessControl, kbDirName, disk);
528
+ const changeGate = new ChangeReadGate(workspaceService, accessControl, kb, disk);
462
529
 
463
530
  // Ontology-session boundary: records each agent run's touched ontologies and
464
531
  // blocks writes once a run has crossed ontologies. Postgres-backed so the
465
532
  // boundary survives a restart.
466
- const sessionOntologyService = new SessionOntologyService(db);
533
+ const sessionOntologyService = new SessionOntologyService(db, kb);
467
534
  // Per-run write restriction (by file extension). Shared by the workspace tool
468
535
  // surface (which enforces it) and the routine runner (which sets it for
469
536
  // dashboard-only `watchlist_check` runs). In-memory: a restriction lives only for
470
537
  // one run, unlike the Postgres-backed ontology touched-set above.
471
538
  const routineWritePolicy = new RoutineWritePolicyService();
472
539
  // Skills: discovered from the default-branch workspace only (global catalog).
473
- const skillService = new SkillService(workspaceService, accessControl, kbDirName, disk);
540
+ const skillService = new SkillService(workspaceService, accessControl, kb, disk);
474
541
  // Tool manuals: user-authored `*.tool` files under `Plugins/` in the default
475
542
  // branch — access-controlled like Skills, served to external agents via
476
543
  // `GET /api/agent/all-tools` and registered on the MCP proxy's UTCP client.
477
544
  // Where plugins come from: one walk of the plugins root that reads every
478
545
  // plugin folder in whichever file shape it carries (see
479
546
  // modules/plugins/discovery). Nothing to configure, nothing to document.
480
- const pluginSource = new KbPluginSource(disk);
481
- 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);
482
549
  // Plugins: the folders under `Plugins/` that carry a
483
550
  // team's skills AND the tools they need. Enumerated for EVERY authenticated
484
551
  // caller — a plugin they cannot read still exists for them, as a locked one —
485
552
  // with the counts read off the two catalogs above rather than a second scan.
486
553
  // The link index resolves manifests against the released catalog, and the
487
554
  // plugin index counts through it (inline + linked), so it comes first.
488
- const pluginLinkIndex = new PluginLinkIndex(workspaceService, skillService, accessControl, kbDirName, pluginSource);
555
+ const pluginLinkIndex = new PluginLinkIndex(workspaceService, skillService, accessControl, kb, pluginSource);
489
556
  const pluginIndexService = new PluginIndexService(
490
557
  workspaceService,
491
558
  accessControl,
492
559
  skillService,
493
560
  toolManualService,
494
- kbDirName,
561
+ kb,
495
562
  pluginSource,
496
563
  Date.now,
497
564
  pluginLinkIndex,
@@ -501,13 +568,17 @@ export async function createCoreServices(
501
568
  // PullRequestService no longer depends on it for attribution.)
502
569
  // The allow-list is resolved, not read off the environment: it is settable
503
570
  // from the setup screen alongside the SSO configuration it guards.
504
- const authService = new AuthService(db, {
505
- jwtSecret: config.jwtSecret,
506
- adminEmail: config.adminEmail,
507
- adminPassword: config.adminPassword,
508
- allowedEmailDomains: parseDomainList(settings.resolve('allowedEmailDomains')),
509
- loginPasswordEnabled: config.loginPasswordEnabled,
510
- });
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
+ );
511
582
  const authMiddleware = createAuthMiddleware(authService);
512
583
 
513
584
  // Shared mutex so git and diff operations on the same workspace serialize
@@ -523,7 +594,7 @@ export async function createCoreServices(
523
594
  const gitService = new GitService(
524
595
  workspaceService,
525
596
  workflowHooks,
526
- kbDirName,
597
+ kb,
527
598
  workspaceMutex,
528
599
  accessControl,
529
600
  gitRunner,
@@ -608,7 +679,7 @@ export async function createCoreServices(
608
679
  accessControl,
609
680
  fileLockService,
610
681
  pendingCommitsService,
611
- kbDirName,
682
+ kb,
612
683
  changeGate,
613
684
  eventBus,
614
685
  fileChangeNotifier,
@@ -622,7 +693,7 @@ export async function createCoreServices(
622
693
  // (the request's branch vs the default branch), so it holds no state — it
623
694
  // only needs to read files at refs and to close a request whose proposals
624
695
  // have all landed.
625
- const joinRequestsService = new JoinRequestsService(workspaceService, workflowService);
696
+ const joinRequestsService = new JoinRequestsService(workspaceService, workflowService, kb);
626
697
  // The OTHER half of a join request: the row the subscribe endpoint writes
627
698
  // before it answers, and the branch/clone/commit/push/change-request work
628
699
  // that runs against it afterwards. The row is what lets the click be
@@ -631,7 +702,7 @@ export async function createCoreServices(
631
702
  const pluginJoinRequestJobs = new PluginJoinRequestJobs(new DbJoinRequestStore(db), {
632
703
  workflow: workflowService,
633
704
  workspaceService,
634
- kbDirName,
705
+ kb,
635
706
  // A record keys on the plugin's primary FOLDER below the root, which the
636
707
  // catalog is the only thing that can turn back into a path and a name
637
708
  // people read. Null once nothing answers to the key — a deleted plugin,
@@ -663,7 +734,7 @@ export async function createCoreServices(
663
734
  accessControl,
664
735
  skillService,
665
736
  pluginLinkIndex,
666
- kbDirName,
737
+ kb,
667
738
  eventBus,
668
739
  () => pluginIndexService.invalidate(),
669
740
  );
@@ -675,7 +746,7 @@ export async function createCoreServices(
675
746
  accessControl,
676
747
  pluginSource,
677
748
  disk,
678
- kbDirName,
749
+ kb,
679
750
  eventBus,
680
751
  () => {
681
752
  pluginIndexService.invalidate();
@@ -689,7 +760,7 @@ export async function createCoreServices(
689
760
  accessControl,
690
761
  skillService,
691
762
  pluginLinkIndex,
692
- kbDirName,
763
+ kb,
693
764
  {
694
765
  name: 'hexis',
695
766
  owner: 'Hexis',
@@ -724,7 +795,7 @@ export async function createCoreServices(
724
795
  workflowService,
725
796
  accessControl,
726
797
  toolManualService,
727
- kbDirName,
798
+ kb,
728
799
  disk,
729
800
  );
730
801
 
@@ -736,7 +807,7 @@ export async function createCoreServices(
736
807
  workspaceService,
737
808
  workflowService,
738
809
  accessControl,
739
- kbDirName,
810
+ kb,
740
811
  eventBus,
741
812
  pluginSource,
742
813
  disk,
@@ -752,6 +823,7 @@ export async function createCoreServices(
752
823
  accessControl,
753
824
  skillService,
754
825
  workflowService,
826
+ kb,
755
827
  );
756
828
 
757
829
  // The same missing half, for tools: a `.tool` manual or an `mcp.json` server
@@ -763,6 +835,7 @@ export async function createCoreServices(
763
835
  accessControl,
764
836
  toolManualService,
765
837
  workflowService,
838
+ kb,
766
839
  );
767
840
 
768
841
  // Catalog freshness: the skill / tool-manual / plugin-index caches all scan
@@ -774,7 +847,7 @@ export async function createCoreServices(
774
847
  registerCatalogCacheInvalidation({
775
848
  eventBus,
776
849
  fileChangeNotifier,
777
- kbDirName,
850
+ kb,
778
851
  catalogs: [toolManualService, skillService, pluginIndexService, pluginLinkIndex],
779
852
  accessControl,
780
853
  });
@@ -784,7 +857,7 @@ export async function createCoreServices(
784
857
  const adminAccess = new AdminAccessService(
785
858
  accessControl,
786
859
  workspaceService,
787
- () => DEFAULT_BRANCH,
860
+ () => kb.defaultBranch,
788
861
  // The deployment owner administers accounts/roles even before the KB's
789
862
  // roles.yaml lists them, and whatever the sign-in method — this list is
790
863
  // consulted before any roles.yaml lookup, so it holds for SSO too.
@@ -815,8 +888,11 @@ export async function createCoreServices(
815
888
  (key) => toolManualService.scopeOfVariable(key),
816
889
  );
817
890
  // Register the `bevel-secrets` UTCP variable loader against this vault so any
818
- // UTCP client can resolve `${VAR}` from the caller's secrets at tool-call time.
819
- 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);
820
896
 
821
897
  // Deleting ONE tool from its page — the owner's verb, the other end of the
822
898
  // promise that made them the owner. Built here because it is the one service
@@ -832,7 +908,7 @@ export async function createCoreServices(
832
908
  pluginIndexService,
833
909
  pluginSource,
834
910
  secretsVaultService,
835
- kbDirName,
911
+ kb,
836
912
  disk,
837
913
  );
838
914
 
@@ -842,7 +918,7 @@ export async function createCoreServices(
842
918
  // call, the vault to resolve the credential to call it with. Holds no state
843
919
  // and takes no `db`: a verdict is returned to the caller that asked for it and
844
920
  // never outlives their page (see `ProbeVerdict`).
845
- const connectionProbeService = new ConnectionProbeService(toolManualService, secretsVaultService);
921
+ const connectionProbeService = new ConnectionProbeService(toolManualService, secretsVaultService, secretsScope);
846
922
 
847
923
  // Zero-config OAuth for bare `type: mcp` `.tool`s: when the remote server
848
924
  // demands OAuth (MCP authorization spec), discover its authorization server,
@@ -914,13 +990,20 @@ export async function createCoreServices(
914
990
  // for readers, and the preamble is a broadcast). One reader, two consumers:
915
991
  // the proxy below composes in-process per request; the agent-facing route
916
992
  // serves the same composition to the local bridge and the frontend card.
917
- const readPreamble: AgentPreambleReader = () => readAgentPreamble(workspaceService, kbDirName, disk);
993
+ const readPreamble: AgentPreambleReader = () => readAgentPreamble(workspaceService, kb, disk);
994
+ // The Audit log. Records through the proxy below (every call an external
995
+ // agent makes), reads keys through the key service so their shape is
996
+ // defined once, and prunes past the retention setting — read per sweep, so
997
+ // a change on the Deployment page applies without a restart.
998
+ const agentAuditService = new AgentAuditService(db, externalApiKeyService, () =>
999
+ retentionDaysFrom(settings.resolve('auditRetentionDays')),
1000
+ );
918
1001
  const mcpService = new McpService(
919
1002
  {
920
1003
  // Loopback to our own REST tool surface — 127.0.0.1 (not localhost) to pin
921
1004
  // IPv4 and dodge resolver ambiguity. The proxy authenticates each call with
922
1005
  // the caller's own connection key.
923
- loopbackBaseUrl: `http://127.0.0.1:${config.port}`,
1006
+ loopbackBaseUrl: config.loopbackBaseUrl ?? `http://127.0.0.1:${config.port}`,
924
1007
  // Manual namespace + UTCP variable prefix (KNOWLEDGE_BASE_API_URL / …).
925
1008
  manualName: 'KNOWLEDGE_BASE',
926
1009
  // Oversized chain results spill here too — an external MCP caller has no
@@ -929,6 +1012,7 @@ export async function createCoreServices(
929
1012
  // For the needs-authorization setup link surfaced to external agents.
930
1013
  publicFrontendUrl: config.publicFrontendUrl,
931
1014
  readAgentPreamble: readPreamble,
1015
+ secretsScope,
932
1016
  },
933
1017
  // Pre-dispatch per-user credential check: the vault answers "has this caller
934
1018
  // set it?" and the manual catalog answers "which user-scoped vars does this
@@ -942,6 +1026,8 @@ export async function createCoreServices(
942
1026
  // provider is constructed just below (it needs nothing from McpService;
943
1027
  // the binding is only dereferenced at call time, long after boot).
944
1028
  (bearer) => mcpOAuthProvider.revokeByAccessToken(bearer),
1029
+ // Every attributable call lands in the Audit log through this.
1030
+ agentAuditService,
945
1031
  );
946
1032
  // A changed secret invalidates what the proxy built from the old value for
947
1033
  // that user (null = shared secret → everyone): remembered manual failures,
@@ -1048,12 +1134,6 @@ export async function createCoreServices(
1048
1134
  },
1049
1135
  });
1050
1136
  const leased = withStartupTask(pendingCommitsWorker, reconcileQueue);
1051
- // Not `start()`: the worker runs only while this process holds the
1052
- // commit-worker lease. On a redeploy the outgoing container still holds it,
1053
- // so this one serves requests and declines to drain until that one exits;
1054
- // then it takes the lease and starts. Two processes draining one shared
1055
- // clone volume is the failure this prevents — see `core/lifecycle.ts`.
1056
- const commitWorker = holdCommitWorkerLease(new AdvisoryLease(db, AdvisoryLock.CommitWorker), leased);
1057
1137
 
1058
1138
  // SSO providers. The array REFERENCE is shared with the caller's port — an
1059
1139
  // overlay pushes its own plugins into it after construction (they mount when
@@ -1100,7 +1180,7 @@ export async function createCoreServices(
1100
1180
  eventBus,
1101
1181
  kbDirName,
1102
1182
  bot,
1103
- defaultBranchOf: () => DEFAULT_BRANCH,
1183
+ defaultBranchOf: () => kb.defaultBranch,
1104
1184
  }),
1105
1185
  debounceMs: opts?.debounceMs,
1106
1186
  log: opts?.log ?? ((message) => logger('directory-sync').warn(message)),
@@ -1114,7 +1194,7 @@ export async function createCoreServices(
1114
1194
  workflowService,
1115
1195
  accessControl,
1116
1196
  kbDirName,
1117
- () => DEFAULT_BRANCH,
1197
+ () => kb.defaultBranch,
1118
1198
  eventBus,
1119
1199
  );
1120
1200
  // Account deletion's optional half: the erased address out of roles.yaml,
@@ -1126,22 +1206,39 @@ export async function createCoreServices(
1126
1206
  accessControl,
1127
1207
  disk,
1128
1208
  kbDirName,
1129
- () => DEFAULT_BRANCH,
1209
+ () => kb.defaultBranch,
1130
1210
  eventBus,
1131
1211
  [config.adminEmail],
1132
1212
  );
1133
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
+
1134
1227
  return {
1135
1228
  config,
1136
1229
  db,
1137
1230
  gitRunner,
1138
1231
  commitWorker,
1232
+ startupRetry: null,
1233
+ tenantKey,
1234
+ secretsScope,
1139
1235
  disk,
1140
1236
  mcpServerEditService,
1141
1237
  toolDeleteService,
1142
1238
  workspaceService,
1143
1239
  kbStartupRunner,
1144
1240
  settings,
1241
+ kb,
1145
1242
  kbDirName,
1146
1243
  spillStore,
1147
1244
  docExtractService,
@@ -1194,6 +1291,7 @@ export async function createCoreServices(
1194
1291
  mcpAuthMiddleware,
1195
1292
  mcpOAuthProvider,
1196
1293
  mcpResourceMetadataUrl,
1294
+ agentAuditService,
1197
1295
  toolRegistry,
1198
1296
  toolAuthMiddleware,
1199
1297
  manualAuthMiddleware,