@bevel-software/platform-core-backend 0.33.0 → 0.35.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 (602) hide show
  1. package/agent-guide/access-control.md +146 -289
  2. package/agent-guide/conventions.md +23 -25
  3. package/agent-guide/directory-structure.md +72 -120
  4. package/agent-guide/drafts-and-change-requests.md +92 -0
  5. package/agent-guide/for-git-users.md +47 -0
  6. package/agent-guide/glossary.md +36 -0
  7. package/agent-guide/how-agents-find-things.md +49 -0
  8. package/agent-guide/html-views.md +239 -8
  9. package/agent-guide/new-knowledge-base.md +9 -8
  10. package/agent-guide/skills.md +67 -42
  11. package/agent-guide/start-here.md +65 -0
  12. package/agent-guide/tool-manuals.md +133 -155
  13. package/agent-guide/tools.md +67 -0
  14. package/agent-guide/where-a-new-file-goes.md +45 -28
  15. package/dist/core/catalog-revision.d.ts +12 -1
  16. package/dist/core/catalog-revision.d.ts.map +1 -1
  17. package/dist/core/catalog-revision.js +23 -3
  18. package/dist/core/catalog-revision.js.map +1 -1
  19. package/dist/core/core-ports.d.ts +41 -0
  20. package/dist/core/core-ports.d.ts.map +1 -1
  21. package/dist/core/core-ports.js.map +1 -1
  22. package/dist/core/create-core-server.d.ts.map +1 -1
  23. package/dist/core/create-core-server.js +15 -8
  24. package/dist/core/create-core-server.js.map +1 -1
  25. package/dist/core/create-core-services.d.ts +22 -5
  26. package/dist/core/create-core-services.d.ts.map +1 -1
  27. package/dist/core/create-core-services.js +44 -16
  28. package/dist/core/create-core-services.js.map +1 -1
  29. package/dist/core/lifecycle.d.ts +16 -0
  30. package/dist/core/lifecycle.d.ts.map +1 -1
  31. package/dist/core/lifecycle.js +12 -2
  32. package/dist/core/lifecycle.js.map +1 -1
  33. package/dist/index.d.ts +1 -1
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js.map +1 -1
  36. package/dist/modules/access/access-control.interface.d.ts +39 -9
  37. package/dist/modules/access/access-control.interface.d.ts.map +1 -1
  38. package/dist/modules/access/access-control.service.d.ts +15 -3
  39. package/dist/modules/access/access-control.service.d.ts.map +1 -1
  40. package/dist/modules/access/access-control.service.js +239 -75
  41. package/dist/modules/access/access-control.service.js.map +1 -1
  42. package/dist/modules/access/access-mutation.service.d.ts +22 -24
  43. package/dist/modules/access/access-mutation.service.d.ts.map +1 -1
  44. package/dist/modules/access/access-mutation.service.js +48 -51
  45. package/dist/modules/access/access-mutation.service.js.map +1 -1
  46. package/dist/modules/access/access-view.d.ts.map +1 -1
  47. package/dist/modules/access/access-view.js +12 -11
  48. package/dist/modules/access/access-view.js.map +1 -1
  49. package/dist/modules/access/access.routes.d.ts +3 -0
  50. package/dist/modules/access/access.routes.d.ts.map +1 -1
  51. package/dist/modules/access/access.routes.js +58 -33
  52. package/dist/modules/access/access.routes.js.map +1 -1
  53. package/dist/modules/access/groups-admin.routes.d.ts.map +1 -1
  54. package/dist/modules/access/groups-admin.routes.js +4 -2
  55. package/dist/modules/access/groups-admin.routes.js.map +1 -1
  56. package/dist/modules/access/groups-admin.service.d.ts +44 -13
  57. package/dist/modules/access/groups-admin.service.d.ts.map +1 -1
  58. package/dist/modules/access/groups-admin.service.js +80 -38
  59. package/dist/modules/access/groups-admin.service.js.map +1 -1
  60. package/dist/modules/access/groups-edit.d.ts +1 -1
  61. package/dist/modules/access/groups-edit.d.ts.map +1 -1
  62. package/dist/modules/access/groups-edit.js +1 -1
  63. package/dist/modules/access/groups-edit.js.map +1 -1
  64. package/dist/modules/access/index.d.ts +1 -1
  65. package/dist/modules/access/index.d.ts.map +1 -1
  66. package/dist/modules/access/reference-scan.d.ts +116 -24
  67. package/dist/modules/access/reference-scan.d.ts.map +1 -1
  68. package/dist/modules/access/reference-scan.js +305 -44
  69. package/dist/modules/access/reference-scan.js.map +1 -1
  70. package/dist/modules/access/roles-admin.service.d.ts +17 -8
  71. package/dist/modules/access/roles-admin.service.d.ts.map +1 -1
  72. package/dist/modules/access/roles-admin.service.js +32 -23
  73. package/dist/modules/access/roles-admin.service.js.map +1 -1
  74. package/dist/modules/access-model/access-grammar.d.ts +35 -10
  75. package/dist/modules/access-model/access-grammar.d.ts.map +1 -1
  76. package/dist/modules/access-model/access-grammar.js +60 -20
  77. package/dist/modules/access-model/access-grammar.js.map +1 -1
  78. package/dist/modules/access-model/access-splice.d.ts +22 -18
  79. package/dist/modules/access-model/access-splice.d.ts.map +1 -1
  80. package/dist/modules/access-model/access-splice.js +20 -14
  81. package/dist/modules/access-model/access-splice.js.map +1 -1
  82. package/dist/modules/access-model/group-files.d.ts +1 -0
  83. package/dist/modules/access-model/group-files.d.ts.map +1 -1
  84. package/dist/modules/access-model/group-files.js +5 -1
  85. package/dist/modules/access-model/group-files.js.map +1 -1
  86. package/dist/modules/agent-guide/agent-guide.d.ts +47 -7
  87. package/dist/modules/agent-guide/agent-guide.d.ts.map +1 -1
  88. package/dist/modules/agent-guide/agent-guide.js +103 -13
  89. package/dist/modules/agent-guide/agent-guide.js.map +1 -1
  90. package/dist/modules/agent-guide/agent-guide.tools.d.ts +6 -2
  91. package/dist/modules/agent-guide/agent-guide.tools.d.ts.map +1 -1
  92. package/dist/modules/agent-guide/agent-guide.tools.js +46 -22
  93. package/dist/modules/agent-guide/agent-guide.tools.js.map +1 -1
  94. package/dist/modules/agent-guide/guide-budget.d.ts +48 -0
  95. package/dist/modules/agent-guide/guide-budget.d.ts.map +1 -0
  96. package/dist/modules/agent-guide/guide-budget.js +67 -0
  97. package/dist/modules/agent-guide/guide-budget.js.map +1 -0
  98. package/dist/modules/agent-guide/index.d.ts +2 -1
  99. package/dist/modules/agent-guide/index.d.ts.map +1 -1
  100. package/dist/modules/agent-guide/index.js +2 -1
  101. package/dist/modules/agent-guide/index.js.map +1 -1
  102. package/dist/modules/agent-instructions/compose.d.ts +3 -1
  103. package/dist/modules/agent-instructions/compose.d.ts.map +1 -1
  104. package/dist/modules/agent-instructions/compose.js +7 -1
  105. package/dist/modules/agent-instructions/compose.js.map +1 -1
  106. package/dist/modules/agent-instructions/shared-file-rules.d.ts +5 -1
  107. package/dist/modules/agent-instructions/shared-file-rules.d.ts.map +1 -1
  108. package/dist/modules/agent-instructions/shared-file-rules.js +26 -9
  109. package/dist/modules/agent-instructions/shared-file-rules.js.map +1 -1
  110. package/dist/modules/agent-scope/agent-scope.contract.d.ts +67 -0
  111. package/dist/modules/agent-scope/agent-scope.contract.d.ts.map +1 -0
  112. package/dist/modules/agent-scope/agent-scope.contract.js +27 -0
  113. package/dist/modules/agent-scope/agent-scope.contract.js.map +1 -0
  114. package/dist/modules/agent-scope/connection-scope.d.ts +111 -0
  115. package/dist/modules/agent-scope/connection-scope.d.ts.map +1 -0
  116. package/dist/modules/agent-scope/connection-scope.js +165 -0
  117. package/dist/modules/agent-scope/connection-scope.js.map +1 -0
  118. package/dist/modules/agent-scope/index.d.ts +3 -0
  119. package/dist/modules/agent-scope/index.d.ts.map +1 -0
  120. package/dist/modules/agent-scope/index.js +3 -0
  121. package/dist/modules/agent-scope/index.js.map +1 -0
  122. package/dist/modules/audit/agent-audit.service.d.ts.map +1 -1
  123. package/dist/modules/audit/agent-audit.service.js +2 -0
  124. package/dist/modules/audit/agent-audit.service.js.map +1 -1
  125. package/dist/modules/audit/audit.contract.d.ts +6 -0
  126. package/dist/modules/audit/audit.contract.d.ts.map +1 -1
  127. package/dist/modules/audit/audit.contract.js.map +1 -1
  128. package/dist/modules/auth/account-admission.d.ts +12 -0
  129. package/dist/modules/auth/account-admission.d.ts.map +1 -1
  130. package/dist/modules/auth/account-admission.js +15 -0
  131. package/dist/modules/auth/account-admission.js.map +1 -1
  132. package/dist/modules/auth/auth.middleware.d.ts +27 -1
  133. package/dist/modules/auth/auth.middleware.d.ts.map +1 -1
  134. package/dist/modules/auth/auth.middleware.js +42 -4
  135. package/dist/modules/auth/auth.middleware.js.map +1 -1
  136. package/dist/modules/auth/auth.routes.d.ts +13 -9
  137. package/dist/modules/auth/auth.routes.d.ts.map +1 -1
  138. package/dist/modules/auth/auth.routes.js +35 -29
  139. package/dist/modules/auth/auth.routes.js.map +1 -1
  140. package/dist/modules/auth/auth.service.d.ts +55 -6
  141. package/dist/modules/auth/auth.service.d.ts.map +1 -1
  142. package/dist/modules/auth/auth.service.js +128 -34
  143. package/dist/modules/auth/auth.service.js.map +1 -1
  144. package/dist/modules/auth/index.d.ts +1 -1
  145. package/dist/modules/auth/index.d.ts.map +1 -1
  146. package/dist/modules/auth/index.js +1 -1
  147. package/dist/modules/auth/index.js.map +1 -1
  148. package/dist/modules/auth/oidc-auth-provider.d.ts.map +1 -1
  149. package/dist/modules/auth/oidc-auth-provider.js +2 -9
  150. package/dist/modules/auth/oidc-auth-provider.js.map +1 -1
  151. package/dist/modules/code-mode/code-mode.tool.js +2 -2
  152. package/dist/modules/code-mode/code-mode.tool.js.map +1 -1
  153. package/dist/modules/connection-probe/connection-probe.service.d.ts +0 -12
  154. package/dist/modules/connection-probe/connection-probe.service.d.ts.map +1 -1
  155. package/dist/modules/connection-probe/connection-probe.service.js +1 -38
  156. package/dist/modules/connection-probe/connection-probe.service.js.map +1 -1
  157. package/dist/modules/database/core-schema.d.ts +68 -0
  158. package/dist/modules/database/core-schema.d.ts.map +1 -1
  159. package/dist/modules/database/core-schema.js +33 -0
  160. package/dist/modules/database/core-schema.js.map +1 -1
  161. package/dist/modules/declared-variables/declared-variables.routes.d.ts +8 -1
  162. package/dist/modules/declared-variables/declared-variables.routes.d.ts.map +1 -1
  163. package/dist/modules/declared-variables/declared-variables.routes.js +13 -2
  164. package/dist/modules/declared-variables/declared-variables.routes.js.map +1 -1
  165. package/dist/modules/embed/embed.tools.d.ts.map +1 -1
  166. package/dist/modules/embed/embed.tools.js +5 -0
  167. package/dist/modules/embed/embed.tools.js.map +1 -1
  168. package/dist/modules/kb-fs/index.d.ts +2 -0
  169. package/dist/modules/kb-fs/index.d.ts.map +1 -1
  170. package/dist/modules/kb-fs/index.js +1 -0
  171. package/dist/modules/kb-fs/index.js.map +1 -1
  172. package/dist/modules/kb-fs/locking-filesystem.d.ts.map +1 -1
  173. package/dist/modules/kb-fs/locking-filesystem.js +7 -1
  174. package/dist/modules/kb-fs/locking-filesystem.js.map +1 -1
  175. package/dist/modules/kb-fs/repo-path.d.ts +26 -6
  176. package/dist/modules/kb-fs/repo-path.d.ts.map +1 -1
  177. package/dist/modules/kb-fs/repo-path.js +22 -7
  178. package/dist/modules/kb-fs/repo-path.js.map +1 -1
  179. package/dist/modules/kb-fs/tmp-ref.d.ts +36 -0
  180. package/dist/modules/kb-fs/tmp-ref.d.ts.map +1 -0
  181. package/dist/modules/kb-fs/tmp-ref.js +76 -0
  182. package/dist/modules/kb-fs/tmp-ref.js.map +1 -0
  183. package/dist/modules/mcp/mcp-auth.middleware.d.ts +7 -0
  184. package/dist/modules/mcp/mcp-auth.middleware.d.ts.map +1 -1
  185. package/dist/modules/mcp/mcp-auth.middleware.js +14 -1
  186. package/dist/modules/mcp/mcp-auth.middleware.js.map +1 -1
  187. package/dist/modules/mcp/mcp.routes.d.ts +7 -1
  188. package/dist/modules/mcp/mcp.routes.d.ts.map +1 -1
  189. package/dist/modules/mcp/mcp.routes.js +39 -4
  190. package/dist/modules/mcp/mcp.routes.js.map +1 -1
  191. package/dist/modules/mcp/mcp.service.d.ts +11 -0
  192. package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
  193. package/dist/modules/mcp/mcp.service.js +74 -48
  194. package/dist/modules/mcp/mcp.service.js.map +1 -1
  195. package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts +24 -1
  196. package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts.map +1 -1
  197. package/dist/modules/mcp/oauth/bevel-oauth-provider.js +45 -10
  198. package/dist/modules/mcp/oauth/bevel-oauth-provider.js.map +1 -1
  199. package/dist/modules/mcp/oauth/oauth-consent.routes.d.ts +9 -0
  200. package/dist/modules/mcp/oauth/oauth-consent.routes.d.ts.map +1 -1
  201. package/dist/modules/mcp/oauth/oauth-consent.routes.js +34 -1
  202. package/dist/modules/mcp/oauth/oauth-consent.routes.js.map +1 -1
  203. package/dist/modules/plugins/index.d.ts +1 -1
  204. package/dist/modules/plugins/index.d.ts.map +1 -1
  205. package/dist/modules/plugins/index.js.map +1 -1
  206. package/dist/modules/plugins/plugin-links.d.ts +18 -2
  207. package/dist/modules/plugins/plugin-links.d.ts.map +1 -1
  208. package/dist/modules/plugins/plugin-links.js.map +1 -1
  209. package/dist/modules/plugins/plugins.routes.d.ts +5 -1
  210. package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
  211. package/dist/modules/plugins/plugins.routes.js +32 -5
  212. package/dist/modules/plugins/plugins.routes.js.map +1 -1
  213. package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts +11 -1
  214. package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts.map +1 -1
  215. package/dist/modules/secrets-vault/db-secrets-vault.service.js +159 -24
  216. package/dist/modules/secrets-vault/db-secrets-vault.service.js.map +1 -1
  217. package/dist/modules/secrets-vault/index.d.ts +1 -1
  218. package/dist/modules/secrets-vault/index.d.ts.map +1 -1
  219. package/dist/modules/secrets-vault/index.js +1 -1
  220. package/dist/modules/secrets-vault/index.js.map +1 -1
  221. package/dist/modules/secrets-vault/secrets-vault.contract.d.ts +53 -11
  222. package/dist/modules/secrets-vault/secrets-vault.contract.d.ts.map +1 -1
  223. package/dist/modules/secrets-vault/secrets-vault.contract.js +27 -0
  224. package/dist/modules/secrets-vault/secrets-vault.contract.js.map +1 -1
  225. package/dist/modules/secrets-vault/secrets-vault.routes.d.ts +9 -0
  226. package/dist/modules/secrets-vault/secrets-vault.routes.d.ts.map +1 -1
  227. package/dist/modules/secrets-vault/secrets-vault.routes.js +100 -42
  228. package/dist/modules/secrets-vault/secrets-vault.routes.js.map +1 -1
  229. package/dist/modules/settings/oidc-check.d.ts.map +1 -1
  230. package/dist/modules/settings/oidc-check.js +5 -17
  231. package/dist/modules/settings/oidc-check.js.map +1 -1
  232. package/dist/modules/skills/index.d.ts +3 -3
  233. package/dist/modules/skills/index.d.ts.map +1 -1
  234. package/dist/modules/skills/index.js +0 -2
  235. package/dist/modules/skills/index.js.map +1 -1
  236. package/dist/modules/skills/skills.contract.d.ts +16 -0
  237. package/dist/modules/skills/skills.contract.d.ts.map +1 -1
  238. package/dist/modules/skills/skills.service.d.ts.map +1 -1
  239. package/dist/modules/skills/skills.service.js +6 -1
  240. package/dist/modules/skills/skills.service.js.map +1 -1
  241. package/dist/modules/skills/skills.tools.d.ts.map +1 -1
  242. package/dist/modules/skills/skills.tools.js +25 -13
  243. package/dist/modules/skills/skills.tools.js.map +1 -1
  244. package/dist/modules/tool-auth/external-api-key.interface.d.ts +11 -0
  245. package/dist/modules/tool-auth/external-api-key.interface.d.ts.map +1 -1
  246. package/dist/modules/tool-auth/external-api-key.interface.js.map +1 -1
  247. package/dist/modules/tool-auth/external-api-key.service.d.ts +1 -0
  248. package/dist/modules/tool-auth/external-api-key.service.d.ts.map +1 -1
  249. package/dist/modules/tool-auth/external-api-key.service.js +4 -1
  250. package/dist/modules/tool-auth/external-api-key.service.js.map +1 -1
  251. package/dist/modules/tool-auth/index.d.ts +1 -1
  252. package/dist/modules/tool-auth/index.d.ts.map +1 -1
  253. package/dist/modules/tool-auth/internal-token.service.d.ts +9 -0
  254. package/dist/modules/tool-auth/internal-token.service.d.ts.map +1 -1
  255. package/dist/modules/tool-auth/internal-token.service.js +1 -0
  256. package/dist/modules/tool-auth/internal-token.service.js.map +1 -1
  257. package/dist/modules/tool-auth/tool-auth.middleware.d.ts +27 -3
  258. package/dist/modules/tool-auth/tool-auth.middleware.d.ts.map +1 -1
  259. package/dist/modules/tool-auth/tool-auth.middleware.js +32 -6
  260. package/dist/modules/tool-auth/tool-auth.middleware.js.map +1 -1
  261. package/dist/modules/tool-helpers/tool-context.d.ts +7 -0
  262. package/dist/modules/tool-helpers/tool-context.d.ts.map +1 -1
  263. package/dist/modules/tool-helpers/tool-context.js +3 -0
  264. package/dist/modules/tool-helpers/tool-context.js.map +1 -1
  265. package/dist/modules/tool-helpers/tool-def.js +1 -1
  266. package/dist/modules/tool-helpers/tool-def.js.map +1 -1
  267. package/dist/modules/tool-helpers/tool-handler.d.ts +15 -0
  268. package/dist/modules/tool-helpers/tool-handler.d.ts.map +1 -1
  269. package/dist/modules/tool-helpers/tool-handler.js +19 -0
  270. package/dist/modules/tool-helpers/tool-handler.js.map +1 -1
  271. package/dist/modules/tool-helpers/tool.contract.d.ts +10 -0
  272. package/dist/modules/tool-helpers/tool.contract.d.ts.map +1 -1
  273. package/dist/modules/tool-helpers/tool.contract.js.map +1 -1
  274. package/dist/modules/tool-helpers/validate-token.d.ts +3 -1
  275. package/dist/modules/tool-helpers/validate-token.d.ts.map +1 -1
  276. package/dist/modules/tool-helpers/validate-token.js +1 -1
  277. package/dist/modules/tool-helpers/validate-token.js.map +1 -1
  278. package/dist/modules/tool-manuals/index.d.ts +3 -3
  279. package/dist/modules/tool-manuals/index.d.ts.map +1 -1
  280. package/dist/modules/tool-manuals/index.js +0 -2
  281. package/dist/modules/tool-manuals/index.js.map +1 -1
  282. package/dist/modules/tool-manuals/mcp-json-discovery.d.ts +7 -1
  283. package/dist/modules/tool-manuals/mcp-json-discovery.d.ts.map +1 -1
  284. package/dist/modules/tool-manuals/mcp-json-discovery.js +69 -38
  285. package/dist/modules/tool-manuals/mcp-json-discovery.js.map +1 -1
  286. package/dist/modules/tool-manuals/tool-manuals.contract.d.ts +46 -6
  287. package/dist/modules/tool-manuals/tool-manuals.contract.d.ts.map +1 -1
  288. package/dist/modules/tool-manuals/tool-manuals.routes.d.ts +7 -1
  289. package/dist/modules/tool-manuals/tool-manuals.routes.d.ts.map +1 -1
  290. package/dist/modules/tool-manuals/tool-manuals.routes.js +41 -4
  291. package/dist/modules/tool-manuals/tool-manuals.routes.js.map +1 -1
  292. package/dist/modules/tool-manuals/tool-manuals.service.d.ts +24 -13
  293. package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
  294. package/dist/modules/tool-manuals/tool-manuals.service.js +138 -59
  295. package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -1
  296. package/dist/modules/tool-manuals/tool-manuals.tools.d.ts +8 -2
  297. package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
  298. package/dist/modules/tool-manuals/tool-manuals.tools.js +56 -20
  299. package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
  300. package/dist/modules/tool-registry/manual.routes.d.ts +8 -1
  301. package/dist/modules/tool-registry/manual.routes.d.ts.map +1 -1
  302. package/dist/modules/tool-registry/manual.routes.js +27 -7
  303. package/dist/modules/tool-registry/manual.routes.js.map +1 -1
  304. package/dist/modules/tool-registry/tool.contract.d.ts +7 -0
  305. package/dist/modules/tool-registry/tool.contract.d.ts.map +1 -1
  306. package/dist/modules/tool-registry/tool.contract.js.map +1 -1
  307. package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +1 -1
  308. package/dist/modules/workflow/agent-tools/workflow.tools.js +36 -27
  309. package/dist/modules/workflow/agent-tools/workflow.tools.js.map +1 -1
  310. package/dist/modules/workflow/git/git.service.d.ts +2 -2
  311. package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
  312. package/dist/modules/workflow/git/git.service.js +20 -35
  313. package/dist/modules/workflow/git/git.service.js.map +1 -1
  314. package/dist/modules/workflow/workflow.service.d.ts +2 -1
  315. package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
  316. package/dist/modules/workflow/workflow.service.js +3 -0
  317. package/dist/modules/workflow/workflow.service.js.map +1 -1
  318. package/dist/modules/workspace/agent-access.gate.d.ts +1 -1
  319. package/dist/modules/workspace/agent-access.gate.d.ts.map +1 -1
  320. package/dist/modules/workspace/agent-access.gate.js +1 -1
  321. package/dist/modules/workspace/agent-access.gate.js.map +1 -1
  322. package/dist/modules/workspace/file-readers/doc-extract.service.d.ts +28 -4
  323. package/dist/modules/workspace/file-readers/doc-extract.service.d.ts.map +1 -1
  324. package/dist/modules/workspace/file-readers/doc-extract.service.js +61 -40
  325. package/dist/modules/workspace/file-readers/doc-extract.service.js.map +1 -1
  326. package/dist/modules/workspace/index.d.ts +8 -0
  327. package/dist/modules/workspace/index.d.ts.map +1 -1
  328. package/dist/modules/workspace/index.js +8 -0
  329. package/dist/modules/workspace/index.js.map +1 -1
  330. package/dist/modules/workspace/nul-scan.d.ts +19 -0
  331. package/dist/modules/workspace/nul-scan.d.ts.map +1 -0
  332. package/dist/modules/workspace/nul-scan.js +55 -0
  333. package/dist/modules/workspace/nul-scan.js.map +1 -0
  334. package/dist/modules/workspace/pattern-matcher.contract.d.ts +110 -27
  335. package/dist/modules/workspace/pattern-matcher.contract.d.ts.map +1 -1
  336. package/dist/modules/workspace/pattern-matcher.contract.js +30 -13
  337. package/dist/modules/workspace/pattern-matcher.contract.js.map +1 -1
  338. package/dist/modules/workspace/ripgrep-search.d.ts +54 -0
  339. package/dist/modules/workspace/ripgrep-search.d.ts.map +1 -0
  340. package/dist/modules/workspace/ripgrep-search.js +657 -0
  341. package/dist/modules/workspace/ripgrep-search.js.map +1 -0
  342. package/dist/modules/workspace/ripgrep-version.d.ts +15 -0
  343. package/dist/modules/workspace/ripgrep-version.d.ts.map +1 -0
  344. package/dist/modules/workspace/ripgrep-version.js +31 -0
  345. package/dist/modules/workspace/ripgrep-version.js.map +1 -0
  346. package/dist/modules/workspace/startup/beside-checkout.d.ts +8 -5
  347. package/dist/modules/workspace/startup/beside-checkout.d.ts.map +1 -1
  348. package/dist/modules/workspace/startup/beside-checkout.js +14 -5
  349. package/dist/modules/workspace/startup/beside-checkout.js.map +1 -1
  350. package/dist/modules/workspace/worker-pool.d.ts +3 -4
  351. package/dist/modules/workspace/worker-pool.d.ts.map +1 -1
  352. package/dist/modules/workspace/worker-pool.js.map +1 -1
  353. package/dist/modules/workspace/workspace-tmp.d.ts +146 -0
  354. package/dist/modules/workspace/workspace-tmp.d.ts.map +1 -0
  355. package/dist/modules/workspace/workspace-tmp.js +435 -0
  356. package/dist/modules/workspace/workspace-tmp.js.map +1 -0
  357. package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
  358. package/dist/modules/workspace/workspace.routes.js +5 -26
  359. package/dist/modules/workspace/workspace.routes.js.map +1 -1
  360. package/dist/modules/workspace/workspace.service.d.ts +47 -6
  361. package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
  362. package/dist/modules/workspace/workspace.service.js +86 -6
  363. package/dist/modules/workspace/workspace.service.js.map +1 -1
  364. package/dist/modules/workspace/workspace.tools.d.ts +3 -2
  365. package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
  366. package/dist/modules/workspace/workspace.tools.js +531 -137
  367. package/dist/modules/workspace/workspace.tools.js.map +1 -1
  368. package/dist/shared/oauth-token-error.d.ts +23 -0
  369. package/dist/shared/oauth-token-error.d.ts.map +1 -0
  370. package/dist/shared/oauth-token-error.js +47 -0
  371. package/dist/shared/oauth-token-error.js.map +1 -0
  372. package/dist/shared/path-order.d.ts +28 -8
  373. package/dist/shared/path-order.d.ts.map +1 -1
  374. package/dist/shared/path-order.js +37 -8
  375. package/dist/shared/path-order.js.map +1 -1
  376. package/dist/shared/read-capped.d.ts +19 -0
  377. package/dist/shared/read-capped.d.ts.map +1 -0
  378. package/dist/shared/read-capped.js +45 -0
  379. package/dist/shared/read-capped.js.map +1 -0
  380. package/migrations/0022_session_version.sql +6 -0
  381. package/migrations/0023_agent_path.sql +3 -0
  382. package/migrations/meta/0022_snapshot.json +2360 -0
  383. package/migrations/meta/0023_snapshot.json +2378 -0
  384. package/migrations/meta/_journal.json +14 -0
  385. package/package.json +4 -3
  386. package/src/__tests__/hexis-catalog.ts +144 -0
  387. package/src/__tests__/pg-scratch.test.ts +69 -0
  388. package/src/__tests__/pg-scratch.ts +31 -0
  389. package/src/__tests__/real-disk.ts +21 -0
  390. package/src/__tests__/slow-ripgrep.ts +65 -0
  391. package/src/__tests__/tokens.ts +19 -0
  392. package/src/__tests__/tool-manuals.ts +32 -0
  393. package/src/__tests__/tool-wiring.ts +25 -0
  394. package/src/core/__tests__/boot-without-ripgrep.test.ts +34 -0
  395. package/src/core/__tests__/catalog-revision.test.ts +89 -0
  396. package/src/core/__tests__/damaged-document.tools.test.ts +2 -2
  397. package/src/core/__tests__/gated-boot.test.ts +8 -1
  398. package/src/core/__tests__/lifecycle.test.ts +46 -13
  399. package/src/core/__tests__/oauth-sign-in-real-file.test.ts +179 -0
  400. package/src/core/catalog-revision.ts +24 -2
  401. package/src/core/core-ports.ts +42 -0
  402. package/src/core/create-core-server.ts +14 -1
  403. package/src/core/create-core-services.ts +62 -15
  404. package/src/core/lifecycle.ts +26 -2
  405. package/src/index.ts +1 -1
  406. package/src/modules/access/__tests__/access-control.admin-root-floor.test.ts +12 -0
  407. package/src/modules/access/__tests__/access-control.colliding-name-cases.test.ts +113 -0
  408. package/src/modules/access/__tests__/access-control.frontmatter-head.test.ts +117 -0
  409. package/src/modules/access/__tests__/access-control.group-named-admin.test.ts +122 -0
  410. package/src/modules/access/__tests__/access-control.preview-relocation.test.ts +50 -0
  411. package/src/modules/access/__tests__/access-declarations.test.ts +19 -0
  412. package/src/modules/access/__tests__/access-groups.test.ts +55 -22
  413. package/src/modules/access/__tests__/access-mutation.service.test.ts +85 -59
  414. package/src/modules/access/__tests__/access-restrict-here.test.ts +7 -5
  415. package/src/modules/access/__tests__/access.routes.admins.test.ts +1 -0
  416. package/src/modules/access/__tests__/access.routes.batch.test.ts +2 -0
  417. package/src/modules/access/__tests__/access.routes.folder-governs.test.ts +2 -0
  418. package/src/modules/access/__tests__/access.routes.group-grant.test.ts +50 -14
  419. package/src/modules/access/__tests__/access.routes.overrides.test.ts +2 -1
  420. package/src/modules/access/__tests__/access.routes.proposal-branch.test.ts +1 -0
  421. package/src/modules/access/__tests__/access.routes.prospective.test.ts +52 -10
  422. package/src/modules/access/__tests__/access.routes.revoke.test.ts +18 -13
  423. package/src/modules/access/__tests__/access.routes.unknown-email.test.ts +2 -0
  424. package/src/modules/access/__tests__/grant-sources.test.ts +20 -15
  425. package/src/modules/access/__tests__/groups-admin.routes.test.ts +61 -0
  426. package/src/modules/access/__tests__/groups-admin.service.test.ts +211 -18
  427. package/src/modules/access/__tests__/holder-changes.test.ts +127 -0
  428. package/src/modules/access/__tests__/reference-scan.test.ts +366 -14
  429. package/src/modules/access/__tests__/roles-admin.security.test.ts +1 -1
  430. package/src/modules/access/__tests__/roles-admin.service.test.ts +43 -22
  431. package/src/modules/access/__tests__/roles-capabilities.test.ts +6 -2
  432. package/src/modules/access/__tests__/roles.routes.test.ts +1 -1
  433. package/src/modules/access/access-control.interface.ts +43 -10
  434. package/src/modules/access/access-control.service.ts +250 -72
  435. package/src/modules/access/access-mutation.service.ts +48 -53
  436. package/src/modules/access/access-view.ts +12 -10
  437. package/src/modules/access/access.routes.ts +66 -37
  438. package/src/modules/access/groups-admin.routes.ts +4 -2
  439. package/src/modules/access/groups-admin.service.ts +114 -44
  440. package/src/modules/access/groups-edit.ts +1 -1
  441. package/src/modules/access/index.ts +1 -1
  442. package/src/modules/access/reference-scan.ts +319 -46
  443. package/src/modules/access/roles-admin.service.ts +43 -26
  444. package/src/modules/access/synced-groups-writer.ts +1 -1
  445. package/src/modules/access-model/__tests__/access-grammar.test.ts +38 -1
  446. package/src/modules/access-model/__tests__/access-splice.test.ts +50 -8
  447. package/src/modules/access-model/access-grammar.ts +65 -20
  448. package/src/modules/access-model/access-splice.ts +31 -23
  449. package/src/modules/access-model/group-files.ts +5 -0
  450. package/src/modules/agent-guide/__tests__/agent-guide.test.ts +110 -25
  451. package/src/modules/agent-guide/__tests__/agent-guide.tools.test.ts +38 -11
  452. package/src/modules/agent-guide/__tests__/guide-budget.test.ts +95 -0
  453. package/src/modules/agent-guide/__tests__/guide-eval.test.ts +182 -0
  454. package/src/modules/agent-guide/__tests__/guide-matches-code.test.ts +263 -0
  455. package/src/modules/agent-guide/__tests__/tool-surface.json +514 -0
  456. package/src/modules/agent-guide/__tests__/tool-surface.test.ts +75 -0
  457. package/src/modules/agent-guide/agent-guide.tools.ts +51 -22
  458. package/src/modules/agent-guide/agent-guide.ts +120 -13
  459. package/src/modules/agent-guide/guide-budget.ts +73 -0
  460. package/src/modules/agent-guide/index.ts +12 -0
  461. package/src/modules/agent-instructions/__tests__/shared-file-rules.test.ts +5 -4
  462. package/src/modules/agent-instructions/compose.ts +7 -1
  463. package/src/modules/agent-instructions/shared-file-rules.ts +27 -9
  464. package/src/modules/agent-scope/__tests__/agent-surfaces.connect-as.test.ts +421 -0
  465. package/src/modules/agent-scope/__tests__/connection-scope.test.ts +46 -0
  466. package/src/modules/agent-scope/__tests__/in-memory-kb.ts +148 -0
  467. package/src/modules/agent-scope/agent-scope.contract.ts +83 -0
  468. package/src/modules/agent-scope/connection-scope.ts +199 -0
  469. package/src/modules/agent-scope/index.ts +15 -0
  470. package/src/modules/audit/agent-audit.service.ts +2 -0
  471. package/src/modules/audit/audit.contract.ts +6 -0
  472. package/src/modules/auth/__tests__/auth.middleware.test.ts +30 -2
  473. package/src/modules/auth/__tests__/auth.routes.test.ts +71 -5
  474. package/src/modules/auth/__tests__/auth.service.test.ts +90 -9
  475. package/src/modules/auth/__tests__/password-change-sessions.pg.test.ts +269 -0
  476. package/src/modules/auth/account-admission.ts +19 -0
  477. package/src/modules/auth/auth.middleware.ts +45 -4
  478. package/src/modules/auth/auth.routes.ts +46 -29
  479. package/src/modules/auth/auth.service.ts +135 -34
  480. package/src/modules/auth/index.ts +2 -0
  481. package/src/modules/auth/oidc-auth-provider.ts +2 -9
  482. package/src/modules/code-mode/code-mode.tool.ts +2 -2
  483. package/src/modules/connection-probe/__tests__/connection-probe.service.test.ts +5 -24
  484. package/src/modules/connection-probe/connection-probe.service.ts +1 -34
  485. package/src/modules/database/__tests__/session-version-migration.pg.test.ts +133 -0
  486. package/src/modules/database/core-schema.ts +33 -0
  487. package/src/modules/declared-variables/__tests__/declared-variables.route.test.ts +44 -1
  488. package/src/modules/declared-variables/declared-variables.routes.ts +12 -1
  489. package/src/modules/embed/__tests__/embed.tools.test.ts +12 -0
  490. package/src/modules/embed/embed.tools.ts +5 -0
  491. package/src/modules/kb-fs/__tests__/locking-filesystem.test.ts +25 -0
  492. package/src/modules/kb-fs/__tests__/repo-path.test.ts +53 -8
  493. package/src/modules/kb-fs/index.ts +2 -0
  494. package/src/modules/kb-fs/locking-filesystem.ts +7 -1
  495. package/src/modules/kb-fs/repo-path.ts +33 -7
  496. package/src/modules/kb-fs/tmp-ref.ts +81 -0
  497. package/src/modules/mcp/__tests__/connect-as.pg.test.ts +137 -0
  498. package/src/modules/mcp/__tests__/mcp-auth.middleware.test.ts +29 -5
  499. package/src/modules/mcp/__tests__/mcp-routes-harness.ts +8 -0
  500. package/src/modules/mcp/__tests__/mcp.connect-as.test.ts +195 -0
  501. package/src/modules/mcp/__tests__/mcp.routes.connect-as.test.ts +192 -0
  502. package/src/modules/mcp/__tests__/oauth-consent.connect-as.test.ts +146 -0
  503. package/src/modules/mcp/mcp-auth.middleware.ts +19 -2
  504. package/src/modules/mcp/mcp.routes.ts +39 -3
  505. package/src/modules/mcp/mcp.service.ts +112 -52
  506. package/src/modules/mcp/oauth/bevel-oauth-provider.ts +46 -8
  507. package/src/modules/mcp/oauth/oauth-consent.routes.ts +41 -1
  508. package/src/modules/plugins/__tests__/plugins.tools.test.ts +38 -2
  509. package/src/modules/plugins/index.ts +1 -1
  510. package/src/modules/plugins/plugin-links.ts +19 -2
  511. package/src/modules/plugins/plugins.routes.ts +35 -4
  512. package/src/modules/secrets-vault/__tests__/connect-pending.route.test.ts +113 -0
  513. package/src/modules/secrets-vault/__tests__/db-secrets-vault.oauth.test.ts +430 -3
  514. package/src/modules/secrets-vault/__tests__/oauth-live-declaration.route.test.ts +218 -0
  515. package/src/modules/secrets-vault/__tests__/oauth-return-to.route.test.ts +39 -6
  516. package/src/modules/secrets-vault/db-secrets-vault.service.ts +170 -27
  517. package/src/modules/secrets-vault/index.ts +1 -1
  518. package/src/modules/secrets-vault/secrets-vault.contract.ts +61 -11
  519. package/src/modules/secrets-vault/secrets-vault.routes.ts +114 -42
  520. package/src/modules/settings/oidc-check.ts +5 -18
  521. package/src/modules/skills/__tests__/skills.service.test.ts +34 -0
  522. package/src/modules/skills/index.ts +7 -2
  523. package/src/modules/skills/skills.contract.ts +17 -0
  524. package/src/modules/skills/skills.service.ts +5 -1
  525. package/src/modules/skills/skills.tools.ts +45 -14
  526. package/src/modules/tool-auth/__tests__/external-api-key.service.test.ts +4 -0
  527. package/src/modules/tool-auth/external-api-key.interface.ts +11 -1
  528. package/src/modules/tool-auth/external-api-key.service.ts +5 -2
  529. package/src/modules/tool-auth/index.ts +1 -1
  530. package/src/modules/tool-auth/internal-token.service.ts +10 -0
  531. package/src/modules/tool-auth/tool-auth.middleware.ts +45 -3
  532. package/src/modules/tool-helpers/__tests__/agent-roles-write.test.ts +19 -11
  533. package/src/modules/tool-helpers/__tests__/can-write.tools.test.ts +3 -1
  534. package/src/modules/tool-helpers/__tests__/route-tool-schemas.catalog.test.ts +38 -0
  535. package/src/modules/tool-helpers/tool-context.ts +10 -0
  536. package/src/modules/tool-helpers/tool-def.ts +1 -1
  537. package/src/modules/tool-helpers/tool-handler.ts +34 -0
  538. package/src/modules/tool-helpers/tool.contract.ts +10 -0
  539. package/src/modules/tool-helpers/validate-token.ts +4 -2
  540. package/src/modules/tool-manuals/__tests__/tool-manuals.archive.route.test.ts +80 -4
  541. package/src/modules/tool-manuals/__tests__/tool-manuals.mcp-oauth.test.ts +197 -11
  542. package/src/modules/tool-manuals/__tests__/tool-manuals.service.test.ts +42 -0
  543. package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +99 -8
  544. package/src/modules/tool-manuals/index.ts +6 -2
  545. package/src/modules/tool-manuals/mcp-json-discovery.ts +73 -34
  546. package/src/modules/tool-manuals/tool-manuals.contract.ts +40 -6
  547. package/src/modules/tool-manuals/tool-manuals.routes.ts +40 -3
  548. package/src/modules/tool-manuals/tool-manuals.service.ts +169 -61
  549. package/src/modules/tool-manuals/tool-manuals.tools.ts +81 -25
  550. package/src/modules/tool-registry/__tests__/tool-description-length.test.ts +6 -113
  551. package/src/modules/tool-registry/manual.routes.ts +26 -5
  552. package/src/modules/tool-registry/tool.contract.ts +7 -0
  553. package/src/modules/workflow/__tests__/workflow.service.facade.test.ts +1 -1
  554. package/src/modules/workflow/__tests__/workflow.service.sync.test.ts +1 -1
  555. package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +54 -3
  556. package/src/modules/workflow/agent-tools/workflow.tools.ts +36 -27
  557. package/src/modules/workflow/git/__tests__/git.service.list-branches.test.ts +130 -3
  558. package/src/modules/workflow/git/git.service.ts +29 -48
  559. package/src/modules/workflow/workflow.service.ts +5 -0
  560. package/src/modules/workspace/__tests__/git-internals.security.test.ts +2 -2
  561. package/src/modules/workspace/__tests__/holds-nul.test.ts +66 -0
  562. package/src/modules/workspace/__tests__/rest-tool-arguments.test.ts +3 -3
  563. package/src/modules/workspace/__tests__/ripgrep-search.test.ts +570 -0
  564. package/src/modules/workspace/__tests__/ripgrep-version.test.ts +29 -0
  565. package/src/modules/workspace/__tests__/workspace-tmp.tools.test.ts +928 -0
  566. package/src/modules/workspace/__tests__/workspace.routes.read-gate.test.ts +17 -37
  567. package/src/modules/workspace/__tests__/workspace.service.read-filter.test.ts +20 -8
  568. package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +10 -12
  569. package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +22 -10
  570. package/src/modules/workspace/__tests__/workspace.tools.test.ts +549 -162
  571. package/src/modules/workspace/agent-access.gate.ts +1 -1
  572. package/src/modules/workspace/file-readers/__tests__/doc-extract.service.test.ts +10 -0
  573. package/src/modules/workspace/file-readers/doc-extract.service.ts +71 -38
  574. package/src/modules/workspace/index.ts +20 -0
  575. package/src/modules/workspace/nul-scan.ts +50 -0
  576. package/src/modules/workspace/pattern-matcher.contract.ts +123 -32
  577. package/src/modules/workspace/ripgrep-search.ts +715 -0
  578. package/src/modules/workspace/ripgrep-version.ts +35 -0
  579. package/src/modules/workspace/startup/__tests__/beside-checkout.test.ts +11 -0
  580. package/src/modules/workspace/startup/beside-checkout.ts +13 -5
  581. package/src/modules/workspace/worker-pool.ts +3 -4
  582. package/src/modules/workspace/workspace-tmp.ts +457 -0
  583. package/src/modules/workspace/workspace.routes.ts +6 -27
  584. package/src/modules/workspace/workspace.service.ts +92 -15
  585. package/src/modules/workspace/workspace.tools.ts +574 -176
  586. package/src/shared/__tests__/read-capped.test.ts +68 -0
  587. package/src/shared/oauth-token-error.ts +46 -0
  588. package/src/shared/path-order.ts +37 -8
  589. package/src/shared/read-capped.ts +40 -0
  590. package/starter-packs/engineering/Plugins/engineering-starter/access.md +1 -1
  591. package/starter-packs/general/Plugins/general-starter/access.md +1 -1
  592. package/starter-packs/operations/Plugins/operations-starter/access.md +1 -1
  593. package/starter-packs/sales/Plugins/sales-starter/access.md +1 -1
  594. package/starter-packs/support/Plugins/support-starter/access.md +1 -1
  595. package/agent-guide/finding-things.md +0 -7
  596. package/agent-guide/introduction.md +0 -27
  597. package/dist/modules/workspace/bounded-matcher.d.ts +0 -73
  598. package/dist/modules/workspace/bounded-matcher.d.ts.map +0 -1
  599. package/dist/modules/workspace/bounded-matcher.js +0 -200
  600. package/dist/modules/workspace/bounded-matcher.js.map +0 -1
  601. package/src/modules/workspace/__tests__/bounded-matcher.test.ts +0 -213
  602. package/src/modules/workspace/bounded-matcher.ts +0 -271
@@ -5,7 +5,10 @@ import { createShutdown, stopCore, withStartupTask, type LeasedWorker } from '..
5
5
  import { holdCommitWorkerLease, holdable } from '../lifecycle.js';
6
6
  import { BevelSecretsVariableLoader, registerBevelSecretsVariableLoader } from '../../modules/secrets-vault/secrets-variable-loader.js';
7
7
  import type { AdvisoryLease } from '../../modules/database/advisory-lock.js';
8
- import { WorkerPatternMatcher } from '../../modules/workspace/bounded-matcher.js';
8
+ import { realpath } from 'node:fs/promises';
9
+ import { tmpdir } from 'node:os';
10
+ import { RipgrepPatternMatcher } from '../../modules/workspace/index.js';
11
+ import { slowRipgrep } from '../../__tests__/slow-ripgrep.js';
9
12
 
10
13
  /** A lease the suite scripts: what each `tryAcquire` answers, and a way to lose it. */
11
14
  function fakeLease(answers: boolean[]) {
@@ -510,6 +513,24 @@ describe('stopCore', () => {
510
513
  expect(drained).toBeLessThan(g.order.indexOf('db.end'));
511
514
  });
512
515
 
516
+ it('stops the workspaces\' tmp sweep with the graph: the timer cleared, the sweep in flight awaited before the pool goes', async () => {
517
+ const g = graph();
518
+ const tmpSweeper = {
519
+ stopSweeping() {
520
+ g.order.push('tmpSweeper.stopSweeping');
521
+ },
522
+ async drainSweep() {
523
+ g.order.push('tmpSweeper.drainSweep');
524
+ },
525
+ };
526
+ await stopCore({ ...g.core, tmpSweeper } as never);
527
+ const stopped = g.order.indexOf('tmpSweeper.stopSweeping');
528
+ const drained = g.order.indexOf('tmpSweeper.drainSweep');
529
+ expect(stopped).toBeGreaterThanOrEqual(0);
530
+ expect(stopped).toBeLessThan(drained);
531
+ expect(drained).toBeLessThan(g.order.indexOf('db.end'));
532
+ });
533
+
513
534
  it('forgets the graph\'s secrets scope, so a descriptor that outlives it resolves nothing', async () => {
514
535
  const g = graph();
515
536
  registerBevelSecretsVariableLoader(
@@ -538,19 +559,31 @@ describe('stopCore', () => {
538
559
  ]);
539
560
  });
540
561
 
541
- it('ends the grep matcher\'s workers, so an evicted graph leaves no search running behind it', async () => {
562
+ it('ends the grep matcher\'s running searches, so an evicted graph leaves no ripgrep running behind it', async () => {
542
563
  const g = graph();
543
- const patternMatcher = new WorkerPatternMatcher();
544
- // A search holding a worker for its whole 5 s budget when the graph is stopped.
545
- const running = patternMatcher.search('^(a+)+$', '').matchingLines([`${'a'.repeat(39)}!`], 1);
546
- await new Promise((r) => setTimeout(r, 100));
547
- const started = Date.now();
548
- await stopCore({ ...g.core, patternMatcher } as never);
549
- await expect(running).rejects.toMatchObject({ status: 503, details: { code: 'search_busy' } });
550
- expect(Date.now() - started).toBeLessThan(1_000);
551
- // Closed for good: nothing after the stop starts a worker.
552
- await expect(patternMatcher.search('b', '').matchingLines(['b'], 1)).rejects.toMatchObject({ status: 503 });
553
- expect(g.order.at(-1)).toBe('db.end');
564
+ const slow = await slowRipgrep();
565
+ const patternMatcher = new RipgrepPatternMatcher();
566
+ try {
567
+ // A tree search that would hold its ripgrep for the whole 5 s budget when the graph is stopped.
568
+ const search = await patternMatcher.search('needle', { ignoreCase: false });
569
+ // A scope's cwd is canonical: where the temp folder is a link (macOS),
570
+ // the raw spelling would read as a root that has moved, and walk nothing.
571
+ const cwd = await realpath(tmpdir());
572
+ const running = (async () => {
573
+ for await (const file of search.files({ cwd, root: '.' }, { only: ['hit.md'], maxLinesPerFile: 1 })) void file;
574
+ })();
575
+ while ((await slow.alive()).length === 0) await new Promise((r) => setTimeout(r, 20));
576
+ const started = Date.now();
577
+ await stopCore({ ...g.core, patternMatcher } as never);
578
+ await expect(running).rejects.toMatchObject({ status: 503, details: { code: 'search_busy' } });
579
+ expect(Date.now() - started).toBeLessThan(1_000);
580
+ expect(await slow.alive()).toEqual([]);
581
+ // Closed for good: nothing after the stop starts a search.
582
+ await expect(patternMatcher.search('b', { ignoreCase: false })).rejects.toMatchObject({ status: 503 });
583
+ expect(g.order.at(-1)).toBe('db.end');
584
+ } finally {
585
+ await slow.remove();
586
+ }
554
587
  });
555
588
 
556
589
  it('does not wait past the budget for a worker that never stops, and still ends the pool', async () => {
@@ -0,0 +1,179 @@
1
+ import type { Server as HttpServer } from 'node:http';
2
+ import { mkdtemp, rm, mkdir, writeFile } from 'node:fs/promises';
3
+ import { tmpdir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ import express from 'express';
6
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
7
+ import { DEFAULT_BRANCH } from '@bevel-software/platform-shared';
8
+ import { createSecretsVaultRoutes } from '../../modules/secrets-vault/index.js';
9
+ import { KbPluginSource } from '../../modules/plugins/index.js';
10
+ import type { WorkspaceService } from '../../modules/workspace/index.js';
11
+ import type { IAccessControl } from '../../modules/access/index.js';
12
+ // The two concrete services this suite wires, it wires the way the composition
13
+ // root does (`create-core-services.ts`): their modules publish them as types
14
+ // only, and the composition root is the one place that constructs them from
15
+ // their files. This suite stands in for that root — the routes of one module
16
+ // over the real parser of another — which is why it lives beside it.
17
+ import { ToolManualService } from '../../modules/tool-manuals/tool-manuals.service.js';
18
+ import { realDisk } from '../../__tests__/real-disk.js';
19
+ import { workspaceIdForBranch } from '../../shared/workspace-id.js';
20
+ import { testKbContext } from '../../__tests__/kb-context.js';
21
+
22
+ /**
23
+ * The sign-in start against REAL tool files: the routes are wired to the real
24
+ * `ToolManualService` over a workspace on disk, so what the start answers is
25
+ * what the parser makes of the file, not what a stub says it makes of it.
26
+ *
27
+ * The case this exists for (Local Testing, 2026-10-27): a declaration edited to
28
+ * `tokenUrl: http://127.0.0.1/token` is refused by the parser before the vault
29
+ * ever validates it — and the start answered "Tool or variable not found"
30
+ * instead of the validation's message.
31
+ */
32
+
33
+ const KB_DIR = 'knowledge-base';
34
+ const wsId = workspaceIdForBranch(DEFAULT_BRANCH);
35
+ const USER = 'owner@x.com';
36
+ const AUTHORIZE = 'https://auth.crm.example/authorize';
37
+ const TOKEN = 'https://auth.crm.example/token';
38
+
39
+ let root: string;
40
+ let httpServer: HttpServer | undefined;
41
+
42
+ beforeEach(async () => {
43
+ root = await mkdtemp(join(tmpdir(), 'signin-live-'));
44
+ await mkdir(join(root, wsId, KB_DIR, 'Plugins', 'GTM'), { recursive: true });
45
+ });
46
+ afterEach(async () => {
47
+ await new Promise<void>((r) => (httpServer ? httpServer.close(() => r()) : r()));
48
+ httpServer = undefined;
49
+ await rm(root, { recursive: true, force: true });
50
+ vi.restoreAllMocks();
51
+ });
52
+
53
+ const toolPath = () => join(root, wsId, KB_DIR, 'Plugins', 'crm.tool');
54
+ const writeTool = (oauth: Record<string, unknown>) =>
55
+ writeFile(
56
+ toolPath(),
57
+ JSON.stringify({
58
+ name: 'crm',
59
+ type: 'http',
60
+ url: 'https://api.crm.example/openapi.json',
61
+ variables: [{ name: 'SIGNIN', scope: 'user', oauth }],
62
+ }),
63
+ );
64
+ const writePlugin = (oauth: Record<string, unknown>) =>
65
+ Promise.all([
66
+ writeFile(
67
+ join(root, wsId, KB_DIR, 'Plugins', 'GTM', 'mcp.json'),
68
+ JSON.stringify({ mcpServers: { hubspot: { type: 'streamable-http', url: 'https://mcp.hubspot.example/mcp' } } }),
69
+ ),
70
+ writeFile(
71
+ join(root, wsId, KB_DIR, 'Plugins', 'GTM', 'plugin.json'),
72
+ JSON.stringify({
73
+ name: 'gtm',
74
+ extensions: {
75
+ 'software.bevel.hexis': {
76
+ mcpServers: {
77
+ hubspot: {
78
+ headers: { Authorization: 'Bearer ${HUBSPOT_TOKEN}' },
79
+ variables: [{ name: 'HUBSPOT_TOKEN', scope: 'user', oauth }],
80
+ },
81
+ },
82
+ },
83
+ },
84
+ }),
85
+ ),
86
+ ]);
87
+
88
+ async function serve() {
89
+ const disk = realDisk();
90
+ const kb = testKbContext({ kbDirName: KB_DIR });
91
+ const accessControl = {
92
+ canRead: async () => true,
93
+ canWrite: async () => true,
94
+ canReadBatch: async (_w: string, _e: string, paths: string[]) => new Map(paths.map((p) => [p, true])),
95
+ } as unknown as IAccessControl;
96
+ const workspaceService = {
97
+ getOrCreateForBranch: async () => ({ id: wsId }),
98
+ getWorkspacePath: async (id: string) => join(root, id),
99
+ } as unknown as WorkspaceService;
100
+ const toolManualService = new ToolManualService(workspaceService, accessControl, kb, disk, new KbPluginSource(disk, kb));
101
+ toolManualService.setMcpAuthDiscovery({ statusFor: async () => ({ status: 'open' as const }) });
102
+ const beginToolOAuthByKey = vi.fn(async () => ({ id: 'row-1', url: `${AUTHORIZE}?client_id=x` }));
103
+ const deps = {
104
+ secretsVault: { beginToolOAuthByKey },
105
+ toolManualService,
106
+ accessControl,
107
+ connectionProbe: {},
108
+ kb: { defaultWorkspaceId: () => wsId },
109
+ stateSecret: 'state-secret',
110
+ publicBackendUrl: 'http://localhost:3000',
111
+ publicFrontendUrl: 'http://localhost:5173',
112
+ } as unknown as Parameters<typeof createSecretsVaultRoutes>[0];
113
+ const app = express();
114
+ app.use(express.json());
115
+ app.use((req, _res, next) => {
116
+ req.userId = 'user-1';
117
+ req.userEmail = USER;
118
+ next();
119
+ });
120
+ app.use('/api', createSecretsVaultRoutes(deps));
121
+ httpServer = await new Promise<HttpServer>((resolve) => {
122
+ const s = app.listen(0, () => resolve(s));
123
+ });
124
+ const base = `http://127.0.0.1:${(httpServer.address() as { port: number }).port}/api/secrets/tools`;
125
+ const start = (slug: string, varName: string) => fetch(`${base}/${slug}/vars/${varName}/oauth/start`, { method: 'POST' });
126
+ return { toolManualService, beginToolOAuthByKey, start };
127
+ }
128
+
129
+ describe('POST …/oauth/start — through a real tool file', () => {
130
+ it('a client id edited in the .tool after the catalog was scanned is the one handed to the vault', async () => {
131
+ await writeTool({ clientId: 'client-A', authorizationUrl: AUTHORIZE, tokenUrl: TOKEN });
132
+ const s = await serve();
133
+ await s.toolManualService.listAccessible(USER); // the catalog caches client A
134
+ await writeTool({ clientId: 'client-B', authorizationUrl: AUTHORIZE, tokenUrl: TOKEN });
135
+
136
+ expect((await s.start('crm', 'SIGNIN')).status).toBe(200);
137
+ expect(s.beginToolOAuthByKey.mock.calls[0][0]).toMatchObject({
138
+ key: 'crm_SIGNIN',
139
+ provider: { clientId: 'client-B', authorizationUrl: AUTHORIZE, tokenUrl: TOKEN, pkce: true },
140
+ });
141
+ });
142
+
143
+ it.each([
144
+ ['an http:// token endpoint', 'http://127.0.0.1/token', '`variables[0].oauth.tokenUrl` must use https'],
145
+ ['a private token endpoint', 'https://10.0.0.5/token', '`variables[0].oauth.tokenUrl` host is not allowed'],
146
+ ])('a .tool naming %s is refused with the validation message, sending nothing', async (_n, tokenUrl, message) => {
147
+ await writeTool({ clientId: 'client-A', authorizationUrl: AUTHORIZE, tokenUrl: TOKEN });
148
+ vi.spyOn(console, 'warn').mockImplementation(() => {});
149
+ const s = await serve();
150
+ await s.toolManualService.listAccessible(USER); // the catalog still holds the valid version
151
+ await writeTool({ clientId: 'client-A', authorizationUrl: AUTHORIZE, tokenUrl });
152
+ const fetchSpy = vi.spyOn(globalThis, 'fetch');
153
+
154
+ const res = await s.start('crm', 'SIGNIN');
155
+ expect(res.status).toBe(422);
156
+ expect(((await res.json()) as { error: string }).error).toBe(message);
157
+ expect(s.beginToolOAuthByKey).not.toHaveBeenCalled();
158
+ // The one fetch is the test's own call to the route: nothing went to a provider.
159
+ expect(fetchSpy).toHaveBeenCalledTimes(1);
160
+ });
161
+
162
+ it('a plugin.json sign-in naming an http:// token endpoint is refused with the validation message, sending nothing', async () => {
163
+ await writePlugin({ clientId: 'owner-app', authorizationUrl: AUTHORIZE, tokenUrl: 'http://127.0.0.1/token' });
164
+ vi.spyOn(console, 'warn').mockImplementation(() => {});
165
+ const s = await serve();
166
+ const fetchSpy = vi.spyOn(globalThis, 'fetch');
167
+
168
+ const res = await s.start('hubspot', 'HUBSPOT_TOKEN');
169
+ expect(res.status).toBe(422);
170
+ expect(((await res.json()) as { error: string }).error).toContain('`variables[0].oauth.tokenUrl` must use https');
171
+ expect(s.beginToolOAuthByKey).not.toHaveBeenCalled();
172
+ expect(fetchSpy).toHaveBeenCalledTimes(1);
173
+ });
174
+
175
+ it('a slug no file declares is still not found', async () => {
176
+ const s = await serve();
177
+ expect((await s.start('nothing', 'SIGNIN')).status).toBe(404);
178
+ });
179
+ });
@@ -4,6 +4,7 @@ import { logger } from '../shared/logging.js';
4
4
  import type { ISkillService, SkillSummary } from '../modules/skills/skills.contract.js';
5
5
  import type { IToolManualService } from '../modules/tool-manuals/tool-manuals.contract.js';
6
6
  import '../modules/tool-auth/tool-auth.middleware.js'; // Express Request augmentation (req.toolAuth)
7
+ import { resolveConnectionScope, type IAgentScopeResolver } from '../modules/agent-scope/index.js';
7
8
 
8
9
  const log = logger('catalog-revision');
9
10
 
@@ -65,6 +66,14 @@ export function catalogRevision(
65
66
  * server already running keeps serving the view it read at startup.
66
67
  */
67
68
  views: readonly { uri: string; text: string }[] = [],
69
+ /**
70
+ * The connection's agent configuration — its path and the digest of its bytes, or
71
+ * why it cannot be used (`ConnectionScope.fingerprint`) — so an edit of
72
+ * the file is a new revision even when it changes nothing listed (a new
73
+ * skill entry that names nothing yet still moves it). Absent for
74
+ * Everything, whose revision is exactly what it was before agents existed.
75
+ */
76
+ agent: string | null = null,
68
77
  ): string {
69
78
  const lines = [
70
79
  ...[...manuals].sort(),
@@ -72,6 +81,7 @@ export function catalogRevision(
72
81
  ...skills.map(skillFingerprint).sort(),
73
82
  '\u0001',
74
83
  ...views.map((v) => `${v.uri}\u0000${createHash('sha256').update(v.text).digest('hex')}`).sort(),
84
+ ...(agent !== null ? ['\u0001', agent] : []),
75
85
  ];
76
86
  return createHash('sha256').update(lines.join('\n')).digest('hex').slice(0, 32);
77
87
  }
@@ -90,6 +100,8 @@ export function createCatalogRevisionRoutes(deps: {
90
100
  toolManuals: Pick<IToolManualService, 'catalogFingerprints'>;
91
101
  skills: Pick<ISkillService, 'listSkills'>;
92
102
  manualAuth: RequestHandler;
103
+ /** Resolves the scope of a connection made as an agent configuration (`modules/agent-scope`). */
104
+ agentScope?: Pick<IAgentScopeResolver, 'resolve'>;
93
105
  /** Connection-key/internal-token user id → email, for the per-caller ACL. */
94
106
  resolveUserEmail: (userId: string) => Promise<string | undefined>;
95
107
  /** The MCP App views served; absent on a deployment that serves none. */
@@ -104,16 +116,26 @@ export function createCatalogRevisionRoutes(deps: {
104
116
  // No resolvable caller is an EMPTY catalog, not a failure: that is what
105
117
  // both list surfaces answer such a caller, so the fingerprint agrees
106
118
  // with them rather than inventing a third verdict.
119
+ // A connection made as an agent configuration is fingerprinted over what IT
120
+ // loads, plus the file itself; Everything asks exactly what it always did.
121
+ const scope = await resolveConnectionScope(deps.agentScope, email, req.toolAuth?.agentPath);
122
+ const connectors = scope.connectorFilter();
123
+ const within = scope.skillFilter();
107
124
  const [manuals, skills] = email
108
- ? await Promise.all([deps.toolManuals.catalogFingerprints(email), deps.skills.listSkills(email)])
125
+ ? await Promise.all([
126
+ connectors ? deps.toolManuals.catalogFingerprints(email, connectors) : deps.toolManuals.catalogFingerprints(email),
127
+ within ? deps.skills.listSkills(email, { within }) : deps.skills.listSkills(email),
128
+ ])
109
129
  : [[], []];
110
130
  // A manifest that cannot be read counts as no views, which is also what
111
131
  // the MCP endpoint serves in that state.
112
132
  const views = deps.mcpApps ? ((await deps.mcpApps.manifest().catch(() => null))?.resources ?? []) : [];
133
+ const connection = scope.toWire();
113
134
  res.json({
114
- revision: catalogRevision(manuals, skills, views),
135
+ revision: catalogRevision(manuals, skills, views, scope.fingerprint()),
115
136
  tools: manuals.length,
116
137
  skills: skills.length,
138
+ ...(connection ? { connection } : {}),
117
139
  });
118
140
  } catch (err) {
119
141
  log.error('catalog-revision failed:', { err });
@@ -10,7 +10,34 @@ import type { IAccountAdmission } from '../modules/auth/account-admission.js';
10
10
  import type { IWriteAccess } from '../modules/write-access/write-access.js';
11
11
  import type { OnServerStart } from '../modules/workspace/startup/on-server-start.js';
12
12
  import type { AgentGuideHook } from '../modules/agent-guide/agent-guide.js';
13
+ import type { IAgentScopeResolver } from '../modules/agent-scope/index.js';
13
14
  import type { EmbedNodeIdResolver } from '../modules/embed/embed.interface.js';
15
+ import type { IWorkspaceService } from '@bevel-software/platform-shared';
16
+ import type { IAccessControl } from '../modules/access/index.js';
17
+ import type { KbContext } from '../shared/kb-context.js';
18
+ import type { ITreeWalker } from '../shared/fs.contract.js';
19
+ import type { IPluginLinkIndex } from '../modules/plugins/index.js';
20
+
21
+ /**
22
+ * The core services a distribution's agent-scope resolver reads through,
23
+ * handed to `CorePorts.agentScope` when core makes it: the clones of the
24
+ * branches, the person's read gate, the branch model and knowledge-base
25
+ * layout, the disk walk that finds its configurations, and the plugin link
26
+ * index that says which plugins a `plugins:`-style entry stands for.
27
+ *
28
+ * Each is the service's CONTRACT, not its class: a resolver written against
29
+ * these runs on any implementation of them — core's own services in a
30
+ * deployment, a stand-in in a distribution's tests — and a resolver that
31
+ * needs more than a contract offers asks for the contract to grow, not for
32
+ * the class.
33
+ */
34
+ export interface AgentScopeCollaborators {
35
+ workspaceService: IWorkspaceService;
36
+ accessControl: IAccessControl;
37
+ kb: KbContext;
38
+ disk: ITreeWalker;
39
+ pluginLinkIndex: IPluginLinkIndex;
40
+ }
14
41
 
15
42
  /**
16
43
  * Every seam the enterprise overlay can fill in the CORE composition
@@ -112,6 +139,21 @@ export interface CorePorts {
112
139
  * `modules/agent-guide`.
113
140
  */
114
141
  agentGuide?: AgentGuideHook;
142
+ /**
143
+ * THIS distribution's agent configurations: what "Connect as" offers beside
144
+ * Everything, and what a connection made as one of them loads (see
145
+ * `modules/agent-scope`). Core owns the mechanism and no configuration —
146
+ * the file kind, where it lives and what its definition says are the
147
+ * distribution's, as the file kinds registered for access verbs are. A
148
+ * factory, since a resolver reads through core services that exist only
149
+ * once core is built: called ONCE, during construction, with those
150
+ * services (`AgentScopeCollaborators`), and its answer is the one resolver
151
+ * every surface consults from then on — the tool contexts, which capture it
152
+ * at construction, as much as the routes the server mounts later. Core
153
+ * default: `noAgentConfigurations()` — nothing is offered, and a connection
154
+ * recorded as some path loads nothing, never Everything.
155
+ */
156
+ agentScope?: (core: AgentScopeCollaborators) => IAgentScopeResolver;
115
157
  /**
116
158
  * Mirror this composition's branch model and knowledge-base layout onto the
117
159
  * shared package's PROCESS-WIDE live bindings (`DEFAULT_BRANCH`,
@@ -3,6 +3,7 @@ import cors from 'cors';
3
3
  import path from 'node:path';
4
4
  import type { Router, RequestHandler } from 'express';
5
5
  import { createAuthRoutes } from '../modules/auth/auth.routes.js';
6
+ import { authCookieSecure } from '../modules/auth/auth.middleware.js';
6
7
  import { createWorkspaceRoutes } from '../modules/workspace/workspace.routes.js';
7
8
  import {
8
9
  createAgentUploadRoutes,
@@ -364,6 +365,9 @@ export async function createCoreServer(
364
365
  core.authMiddleware,
365
366
  core.authProviders,
366
367
  core.config.loginPasswordEnabled,
368
+ // The cookie's Secure flag follows the scheme the deployment is reached
369
+ // on, as the SSO providers' does: one rule for every sign-in path.
370
+ { cookieSecure: authCookieSecure(core.config.publicBackendUrl) },
367
371
  ),
368
372
  );
369
373
 
@@ -383,6 +387,7 @@ export async function createCoreServer(
383
387
  core.internalTokenService,
384
388
  core.mcpOAuthProvider,
385
389
  core.mcpResourceMetadataUrl,
390
+ core.agentScopeService,
386
391
  ));
387
392
 
388
393
  // Remote sync — `POST /api/sync`, called by a git host's webhook or a
@@ -423,6 +428,7 @@ export async function createCoreServer(
423
428
  toolManualService: core.toolManualService,
424
429
  accessControl: core.accessControl,
425
430
  connectionProbe: core.connectionProbeService,
431
+ agents: core.agentScopeService,
426
432
  stateSecret: core.config.jwtSecret,
427
433
  publicBackendUrl: core.config.publicBackendUrl,
428
434
  publicFrontendUrl: core.config.publicFrontendUrl,
@@ -481,7 +487,7 @@ export async function createCoreServer(
481
487
  // because they are the only ones that gate their whole payload on the
482
488
  // caller's read access, so they take the access service and nothing else.
483
489
  registerChangeRequestReadTools(core.toolRegistry, toolsRouter, ta, th, core.accessControl, core.kb);
484
- const workspaceTools = registerWorkspaceTools(core.toolRegistry, toolsRouter, ta, th, core.spillStore, core.docExtractService, core.accessControl, core.kb, agentAccessGate, core.routineWritePolicy, core.sessionSink, allowedToolsChecker, core.changeGate, core.agentUploadStore, core.agentGuide, core.agentDownloadStore, core.starterPackService, core.disk, core.patternMatcher);
490
+ const workspaceTools = registerWorkspaceTools(core.toolRegistry, toolsRouter, ta, th, core.spillStore, core.docExtractService, core.accessControl, core.kb, agentAccessGate, core.routineWritePolicy, core.sessionSink, allowedToolsChecker, core.changeGate, core.agentUploadStore, core.agentGuideStart, core.agentDownloadStore, core.starterPackService, core.disk, core.patternMatcher);
485
491
  // `open_page` — the knowledge-base page shown inside a chat. Registered
486
492
  // here, on the same router as the file tools, because it answers with
487
493
  // `read_file`'s own read: the read hook, the access gate and the
@@ -552,6 +558,7 @@ export async function createCoreServer(
552
558
  core.manualAuthMiddleware,
553
559
  async (userId) => (await core.authService.getUserById(userId))?.email,
554
560
  readOnlyHints,
561
+ core.agentScopeService,
555
562
  ));
556
563
  toolsRouter.use(createToolHintsAgentRoutes(readOnlyHints, core.manualAuthMiddleware));
557
564
  // The aggregated manual list (KB + the caller's accessible `.tool`s) + inline
@@ -568,6 +575,7 @@ export async function createCoreServer(
568
575
  disk: core.disk,
569
576
  pluginIndex: core.pluginIndexService,
570
577
  },
578
+ core.agentScopeService,
571
579
  ));
572
580
  // What every connected agent is told at session start, as the hosted proxy
573
581
  // composes it: read by the local `hexis-mcp` bridge at startup and by the
@@ -582,6 +590,7 @@ export async function createCoreServer(
582
590
  skills: core.skillService,
583
591
  manualAuth: core.manualAuthMiddleware,
584
592
  resolveUserEmail: async (userId) => (await core.authService.getUserById(userId))?.email,
593
+ agentScope: core.agentScopeService,
585
594
  // The views move the revision too: a release that changes a view and no
586
595
  // manual would otherwise leave a running local server on the old one.
587
596
  mcpApps: core.mcpAppService,
@@ -596,6 +605,7 @@ export async function createCoreServer(
596
605
  core.secretsVaultService,
597
606
  core.manualAuthMiddleware,
598
607
  async (userId) => (await core.authService.getUserById(userId))?.email,
608
+ core.agentScopeService,
599
609
  ));
600
610
  app.use('/api', toolsRouter);
601
611
 
@@ -638,6 +648,7 @@ export async function createCoreServer(
638
648
  createPluginCreationRoutes(
639
649
  core.pluginProvisionService,
640
650
  async (req) => (req.userId ? ((await core.authService.getUserById(req.userId)) ?? null) : null),
651
+ core.agentScopeService,
641
652
  ),
642
653
  );
643
654
 
@@ -705,6 +716,7 @@ export async function createCoreServer(
705
716
  core.eventBus,
706
717
  core.db,
707
718
  core.kb,
719
+ core.disk,
708
720
  [core.config.adminEmail],
709
721
  ));
710
722
  // Asking for Can edit or Owner on an item from its Manage access dialog, and
@@ -904,6 +916,7 @@ export async function createCoreServer(
904
916
  clientNameFor: (st) => core.githubFacade.clientNameFor(st),
905
917
  completeConsent: (userId, st) => core.githubFacade.completeConsent(userId, st),
906
918
  },
919
+ agents: core.agentScopeService,
907
920
  }));
908
921
 
909
922
  // What an Owner pastes into Claude's admin settings to register this