@bevel-software/platform-core-backend 0.32.0 → 0.34.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 (1188) hide show
  1. package/agent-guide/access-control.md +24 -8
  2. package/agent-guide/html-views.md +277 -15
  3. package/agent-guide/tool-manuals.md +1 -1
  4. package/dist/core/catalog-revision.d.ts +12 -1
  5. package/dist/core/catalog-revision.d.ts.map +1 -1
  6. package/dist/core/catalog-revision.js +23 -3
  7. package/dist/core/catalog-revision.js.map +1 -1
  8. package/dist/core/core-ports.d.ts +41 -0
  9. package/dist/core/core-ports.d.ts.map +1 -1
  10. package/dist/core/core-ports.js.map +1 -1
  11. package/dist/core/create-core-server.d.ts.map +1 -1
  12. package/dist/core/create-core-server.js +42 -10
  13. package/dist/core/create-core-server.js.map +1 -1
  14. package/dist/core/create-core-services.d.ts +22 -6
  15. package/dist/core/create-core-services.d.ts.map +1 -1
  16. package/dist/core/create-core-services.js +58 -17
  17. package/dist/core/create-core-services.js.map +1 -1
  18. package/dist/core/lifecycle.d.ts +24 -0
  19. package/dist/core/lifecycle.d.ts.map +1 -1
  20. package/dist/core/lifecycle.js +16 -2
  21. package/dist/core/lifecycle.js.map +1 -1
  22. package/dist/core/public-config.d.ts +10 -0
  23. package/dist/core/public-config.d.ts.map +1 -1
  24. package/dist/core/public-config.js +10 -0
  25. package/dist/core/public-config.js.map +1 -1
  26. package/dist/index.d.ts +1 -1
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js.map +1 -1
  29. package/dist/modules/access/access-control.interface.d.ts +17 -9
  30. package/dist/modules/access/access-control.interface.d.ts.map +1 -1
  31. package/dist/modules/access/access-control.service.d.ts +13 -3
  32. package/dist/modules/access/access-control.service.d.ts.map +1 -1
  33. package/dist/modules/access/access-control.service.js +165 -77
  34. package/dist/modules/access/access-control.service.js.map +1 -1
  35. package/dist/modules/access/access-declarations.d.ts +1 -1
  36. package/dist/modules/access/access-declarations.d.ts.map +1 -1
  37. package/dist/modules/access/access-declarations.js +1 -1
  38. package/dist/modules/access/access-declarations.js.map +1 -1
  39. package/dist/modules/access/access-mutation.service.d.ts +28 -25
  40. package/dist/modules/access/access-mutation.service.d.ts.map +1 -1
  41. package/dist/modules/access/access-mutation.service.js +50 -53
  42. package/dist/modules/access/access-mutation.service.js.map +1 -1
  43. package/dist/modules/access/access-requests.contract.d.ts +1 -1
  44. package/dist/modules/access/access-requests.contract.d.ts.map +1 -1
  45. package/dist/modules/access/access-requests.routes.d.ts +3 -3
  46. package/dist/modules/access/access-requests.routes.d.ts.map +1 -1
  47. package/dist/modules/access/access-requests.routes.js +7 -7
  48. package/dist/modules/access/access-requests.routes.js.map +1 -1
  49. package/dist/modules/access/access-requests.service.d.ts +21 -20
  50. package/dist/modules/access/access-requests.service.d.ts.map +1 -1
  51. package/dist/modules/access/access-requests.service.js +22 -68
  52. package/dist/modules/access/access-requests.service.js.map +1 -1
  53. package/dist/modules/access/access-view.d.ts +1 -1
  54. package/dist/modules/access/access-view.d.ts.map +1 -1
  55. package/dist/modules/access/access-view.js +12 -11
  56. package/dist/modules/access/access-view.js.map +1 -1
  57. package/dist/modules/access/access.routes.d.ts +8 -7
  58. package/dist/modules/access/access.routes.d.ts.map +1 -1
  59. package/dist/modules/access/access.routes.js +38 -32
  60. package/dist/modules/access/access.routes.js.map +1 -1
  61. package/dist/modules/access/admin-locked-commit.d.ts +2 -2
  62. package/dist/modules/access/admin-locked-commit.d.ts.map +1 -1
  63. package/dist/modules/access/admin-locked-commit.js +1 -1
  64. package/dist/modules/access/admin-locked-commit.js.map +1 -1
  65. package/dist/modules/access/capability-registry.js +1 -1
  66. package/dist/modules/access/capability-registry.js.map +1 -1
  67. package/dist/modules/access/change-read-gate.d.ts +2 -2
  68. package/dist/modules/access/change-read-gate.d.ts.map +1 -1
  69. package/dist/modules/access/change-read-gate.js +1 -3
  70. package/dist/modules/access/change-read-gate.js.map +1 -1
  71. package/dist/modules/access/creator-access.d.ts +2 -2
  72. package/dist/modules/access/creator-access.d.ts.map +1 -1
  73. package/dist/modules/access/creator-access.js +2 -4
  74. package/dist/modules/access/creator-access.js.map +1 -1
  75. package/dist/modules/access/directory-sync-bot.d.ts +1 -1
  76. package/dist/modules/access/directory-sync-bot.d.ts.map +1 -1
  77. package/dist/modules/access/directory-sync-bot.js +1 -1
  78. package/dist/modules/access/directory-sync-bot.js.map +1 -1
  79. package/dist/modules/access/groups-admin.routes.d.ts +2 -2
  80. package/dist/modules/access/groups-admin.routes.d.ts.map +1 -1
  81. package/dist/modules/access/groups-admin.routes.js +6 -4
  82. package/dist/modules/access/groups-admin.routes.js.map +1 -1
  83. package/dist/modules/access/groups-admin.service.d.ts +45 -14
  84. package/dist/modules/access/groups-admin.service.d.ts.map +1 -1
  85. package/dist/modules/access/groups-admin.service.js +80 -39
  86. package/dist/modules/access/groups-admin.service.js.map +1 -1
  87. package/dist/modules/access/groups-edit.d.ts +1 -1
  88. package/dist/modules/access/groups-edit.d.ts.map +1 -1
  89. package/dist/modules/access/groups-edit.js +3 -3
  90. package/dist/modules/access/groups-edit.js.map +1 -1
  91. package/dist/modules/access/index.d.ts +17 -0
  92. package/dist/modules/access/index.d.ts.map +1 -0
  93. package/dist/modules/access/index.js +6 -0
  94. package/dist/modules/access/index.js.map +1 -0
  95. package/dist/modules/access/reference-scan.d.ts +116 -24
  96. package/dist/modules/access/reference-scan.d.ts.map +1 -1
  97. package/dist/modules/access/reference-scan.js +305 -44
  98. package/dist/modules/access/reference-scan.js.map +1 -1
  99. package/dist/modules/access/roles-admin.service.d.ts +18 -9
  100. package/dist/modules/access/roles-admin.service.d.ts.map +1 -1
  101. package/dist/modules/access/roles-admin.service.js +32 -26
  102. package/dist/modules/access/roles-admin.service.js.map +1 -1
  103. package/dist/modules/access/roles-edit.js +1 -1
  104. package/dist/modules/access/roles-edit.js.map +1 -1
  105. package/dist/modules/access/synced-groups-committer.d.ts +2 -2
  106. package/dist/modules/access/synced-groups-committer.d.ts.map +1 -1
  107. package/dist/modules/access/synced-groups-committer.js +2 -2
  108. package/dist/modules/access/synced-groups-committer.js.map +1 -1
  109. package/dist/modules/access/synced-groups-writer.js +2 -2
  110. package/dist/modules/access/synced-groups-writer.js.map +1 -1
  111. package/dist/modules/access/user-access-removal.service.d.ts +1 -1
  112. package/dist/modules/access/user-access-removal.service.d.ts.map +1 -1
  113. package/dist/modules/access/user-access-removal.service.js +2 -5
  114. package/dist/modules/access/user-access-removal.service.js.map +1 -1
  115. package/dist/modules/access-model/access-grammar.d.ts +35 -10
  116. package/dist/modules/access-model/access-grammar.d.ts.map +1 -1
  117. package/dist/modules/access-model/access-grammar.js +60 -20
  118. package/dist/modules/access-model/access-grammar.js.map +1 -1
  119. package/dist/modules/access-model/access-splice.d.ts +22 -18
  120. package/dist/modules/access-model/access-splice.d.ts.map +1 -1
  121. package/dist/modules/access-model/access-splice.js +20 -14
  122. package/dist/modules/access-model/access-splice.js.map +1 -1
  123. package/dist/modules/access-model/group-files.d.ts +1 -0
  124. package/dist/modules/access-model/group-files.d.ts.map +1 -1
  125. package/dist/modules/access-model/group-files.js +5 -1
  126. package/dist/modules/access-model/group-files.js.map +1 -1
  127. package/dist/modules/access-model/index.d.ts +20 -5
  128. package/dist/modules/access-model/index.d.ts.map +1 -1
  129. package/dist/modules/access-model/index.js +18 -5
  130. package/dist/modules/access-model/index.js.map +1 -1
  131. package/dist/modules/access-model/roles-yaml-guard.d.ts +1 -1
  132. package/dist/modules/access-model/roles-yaml-guard.d.ts.map +1 -1
  133. package/dist/modules/admin/admin-access.routes.d.ts +1 -1
  134. package/dist/modules/admin/admin-access.routes.d.ts.map +1 -1
  135. package/dist/modules/admin/admin-access.routes.js +1 -1
  136. package/dist/modules/admin/admin-access.routes.js.map +1 -1
  137. package/dist/modules/admin/admin-access.service.d.ts +2 -2
  138. package/dist/modules/admin/admin-access.service.d.ts.map +1 -1
  139. package/dist/modules/admin/index.d.ts +8 -0
  140. package/dist/modules/admin/index.d.ts.map +1 -0
  141. package/dist/modules/admin/index.js +2 -0
  142. package/dist/modules/admin/index.js.map +1 -0
  143. package/dist/modules/agent-guide/agent-guide.js +1 -1
  144. package/dist/modules/agent-guide/agent-guide.js.map +1 -1
  145. package/dist/modules/agent-guide/agent-guide.tools.d.ts +3 -3
  146. package/dist/modules/agent-guide/agent-guide.tools.d.ts.map +1 -1
  147. package/dist/modules/agent-guide/agent-guide.tools.js +15 -7
  148. package/dist/modules/agent-guide/agent-guide.tools.js.map +1 -1
  149. package/dist/modules/agent-guide/index.d.ts +1 -1
  150. package/dist/modules/agent-guide/index.d.ts.map +1 -1
  151. package/dist/modules/agent-guide/index.js +1 -1
  152. package/dist/modules/agent-guide/index.js.map +1 -1
  153. package/dist/modules/agent-instructions/compose.d.ts +3 -1
  154. package/dist/modules/agent-instructions/compose.d.ts.map +1 -1
  155. package/dist/modules/agent-instructions/compose.js +3 -1
  156. package/dist/modules/agent-instructions/compose.js.map +1 -1
  157. package/dist/modules/agent-instructions/read-preamble.d.ts +1 -1
  158. package/dist/modules/agent-instructions/read-preamble.d.ts.map +1 -1
  159. package/dist/modules/agent-instructions/shared-file-rules.d.ts +5 -1
  160. package/dist/modules/agent-instructions/shared-file-rules.d.ts.map +1 -1
  161. package/dist/modules/agent-instructions/shared-file-rules.js +16 -1
  162. package/dist/modules/agent-instructions/shared-file-rules.js.map +1 -1
  163. package/dist/modules/agent-scope/agent-scope.contract.d.ts +67 -0
  164. package/dist/modules/agent-scope/agent-scope.contract.d.ts.map +1 -0
  165. package/dist/modules/agent-scope/agent-scope.contract.js +27 -0
  166. package/dist/modules/agent-scope/agent-scope.contract.js.map +1 -0
  167. package/dist/modules/agent-scope/connection-scope.d.ts +111 -0
  168. package/dist/modules/agent-scope/connection-scope.d.ts.map +1 -0
  169. package/dist/modules/agent-scope/connection-scope.js +165 -0
  170. package/dist/modules/agent-scope/connection-scope.js.map +1 -0
  171. package/dist/modules/agent-scope/index.d.ts +3 -0
  172. package/dist/modules/agent-scope/index.d.ts.map +1 -0
  173. package/dist/modules/agent-scope/index.js +3 -0
  174. package/dist/modules/agent-scope/index.js.map +1 -0
  175. package/dist/modules/audit/agent-audit.service.d.ts +2 -2
  176. package/dist/modules/audit/agent-audit.service.d.ts.map +1 -1
  177. package/dist/modules/audit/agent-audit.service.js +3 -1
  178. package/dist/modules/audit/agent-audit.service.js.map +1 -1
  179. package/dist/modules/audit/agent-connection.routes.d.ts +1 -1
  180. package/dist/modules/audit/agent-connection.routes.d.ts.map +1 -1
  181. package/dist/modules/audit/agent-connection.routes.js +1 -1
  182. package/dist/modules/audit/agent-connection.routes.js.map +1 -1
  183. package/dist/modules/audit/agent-rest-audit.middleware.d.ts +1 -1
  184. package/dist/modules/audit/agent-rest-audit.middleware.d.ts.map +1 -1
  185. package/dist/modules/audit/agent-rest-audit.middleware.js +1 -1
  186. package/dist/modules/audit/agent-rest-audit.middleware.js.map +1 -1
  187. package/dist/modules/audit/audit.contract.d.ts +6 -0
  188. package/dist/modules/audit/audit.contract.d.ts.map +1 -1
  189. package/dist/modules/audit/audit.contract.js.map +1 -1
  190. package/dist/modules/audit/audit.routes.d.ts +3 -3
  191. package/dist/modules/audit/audit.routes.d.ts.map +1 -1
  192. package/dist/modules/audit/audit.routes.js +2 -2
  193. package/dist/modules/audit/audit.routes.js.map +1 -1
  194. package/dist/modules/auth/account-admission.d.ts +12 -0
  195. package/dist/modules/auth/account-admission.d.ts.map +1 -1
  196. package/dist/modules/auth/account-admission.js +15 -0
  197. package/dist/modules/auth/account-admission.js.map +1 -1
  198. package/dist/modules/auth/account-erasure.service.d.ts +3 -3
  199. package/dist/modules/auth/account-erasure.service.d.ts.map +1 -1
  200. package/dist/modules/auth/account-erasure.service.js +1 -5
  201. package/dist/modules/auth/account-erasure.service.js.map +1 -1
  202. package/dist/modules/auth/account-switch-lock.d.ts +1 -1
  203. package/dist/modules/auth/account-switch-lock.d.ts.map +1 -1
  204. package/dist/modules/auth/account-switch-lock.js +1 -1
  205. package/dist/modules/auth/account-switch-lock.js.map +1 -1
  206. package/dist/modules/auth/account.routes.d.ts +2 -2
  207. package/dist/modules/auth/account.routes.d.ts.map +1 -1
  208. package/dist/modules/auth/account.routes.js +1 -1
  209. package/dist/modules/auth/account.routes.js.map +1 -1
  210. package/dist/modules/auth/auth.middleware.d.ts +27 -1
  211. package/dist/modules/auth/auth.middleware.d.ts.map +1 -1
  212. package/dist/modules/auth/auth.middleware.js +42 -4
  213. package/dist/modules/auth/auth.middleware.js.map +1 -1
  214. package/dist/modules/auth/auth.routes.d.ts +13 -9
  215. package/dist/modules/auth/auth.routes.d.ts.map +1 -1
  216. package/dist/modules/auth/auth.routes.js +35 -29
  217. package/dist/modules/auth/auth.routes.js.map +1 -1
  218. package/dist/modules/auth/auth.service.d.ts +56 -7
  219. package/dist/modules/auth/auth.service.d.ts.map +1 -1
  220. package/dist/modules/auth/auth.service.js +131 -37
  221. package/dist/modules/auth/auth.service.js.map +1 -1
  222. package/dist/modules/auth/index.d.ts +3 -1
  223. package/dist/modules/auth/index.d.ts.map +1 -1
  224. package/dist/modules/auth/index.js +1 -1
  225. package/dist/modules/auth/index.js.map +1 -1
  226. package/dist/modules/auth/oidc-auth-provider.d.ts.map +1 -1
  227. package/dist/modules/auth/oidc-auth-provider.js +3 -10
  228. package/dist/modules/auth/oidc-auth-provider.js.map +1 -1
  229. package/dist/modules/code-mode/code-mode.tool.d.ts +1 -1
  230. package/dist/modules/code-mode/code-mode.tool.d.ts.map +1 -1
  231. package/dist/modules/connection-probe/connection-probe.service.d.ts +2 -2
  232. package/dist/modules/connection-probe/connection-probe.service.d.ts.map +1 -1
  233. package/dist/modules/connection-probe/connection-probe.service.js +1 -4
  234. package/dist/modules/connection-probe/connection-probe.service.js.map +1 -1
  235. package/dist/modules/database/core-schema.d.ts +175 -234
  236. package/dist/modules/database/core-schema.d.ts.map +1 -1
  237. package/dist/modules/database/core-schema.js +72 -35
  238. package/dist/modules/database/core-schema.js.map +1 -1
  239. package/dist/modules/database/index.d.ts +10 -0
  240. package/dist/modules/database/index.d.ts.map +1 -0
  241. package/dist/modules/database/index.js +4 -0
  242. package/dist/modules/database/index.js.map +1 -0
  243. package/dist/modules/database/migrate.d.ts.map +1 -1
  244. package/dist/modules/database/migrate.js +78 -3
  245. package/dist/modules/database/migrate.js.map +1 -1
  246. package/dist/modules/declared-variables/declared-variables.routes.d.ts +10 -3
  247. package/dist/modules/declared-variables/declared-variables.routes.d.ts.map +1 -1
  248. package/dist/modules/declared-variables/declared-variables.routes.js +13 -2
  249. package/dist/modules/declared-variables/declared-variables.routes.js.map +1 -1
  250. package/dist/modules/diff/diff.routes.d.ts +3 -3
  251. package/dist/modules/diff/diff.routes.d.ts.map +1 -1
  252. package/dist/modules/diff/diff.routes.js +3 -3
  253. package/dist/modules/diff/diff.routes.js.map +1 -1
  254. package/dist/modules/diff/diff.service.d.ts +2 -2
  255. package/dist/modules/diff/diff.service.d.ts.map +1 -1
  256. package/dist/modules/diff/index.d.ts +7 -0
  257. package/dist/modules/diff/index.d.ts.map +1 -0
  258. package/dist/modules/diff/index.js +2 -0
  259. package/dist/modules/diff/index.js.map +1 -0
  260. package/dist/modules/embed/account-link.service.d.ts +1 -1
  261. package/dist/modules/embed/account-link.service.d.ts.map +1 -1
  262. package/dist/modules/embed/account-link.service.js +1 -1
  263. package/dist/modules/embed/account-link.service.js.map +1 -1
  264. package/dist/modules/embed/embed.routes.d.ts +1 -1
  265. package/dist/modules/embed/embed.routes.d.ts.map +1 -1
  266. package/dist/modules/embed/embed.routes.js +2 -2
  267. package/dist/modules/embed/embed.routes.js.map +1 -1
  268. package/dist/modules/embed/embed.service.d.ts +1 -1
  269. package/dist/modules/embed/embed.service.d.ts.map +1 -1
  270. package/dist/modules/embed/embed.tools.d.ts +4 -4
  271. package/dist/modules/embed/embed.tools.d.ts.map +1 -1
  272. package/dist/modules/embed/embed.tools.js +8 -5
  273. package/dist/modules/embed/embed.tools.js.map +1 -1
  274. package/dist/modules/github-app/github-app.connection.d.ts +1 -1
  275. package/dist/modules/github-app/github-app.connection.d.ts.map +1 -1
  276. package/dist/modules/github-app/github-app.routes.d.ts +3 -3
  277. package/dist/modules/github-app/github-app.routes.d.ts.map +1 -1
  278. package/dist/modules/github-app/github-app.routes.js +1 -1
  279. package/dist/modules/github-app/github-app.routes.js.map +1 -1
  280. package/dist/modules/kb-fs/index.d.ts +12 -0
  281. package/dist/modules/kb-fs/index.d.ts.map +1 -1
  282. package/dist/modules/kb-fs/index.js +11 -0
  283. package/dist/modules/kb-fs/index.js.map +1 -1
  284. package/dist/modules/kb-fs/locking-filesystem.d.ts +1 -1
  285. package/dist/modules/kb-fs/locking-filesystem.d.ts.map +1 -1
  286. package/dist/modules/kb-fs/locking-filesystem.js +7 -1
  287. package/dist/modules/kb-fs/locking-filesystem.js.map +1 -1
  288. package/dist/modules/kb-fs/repo-path.d.ts +26 -6
  289. package/dist/modules/kb-fs/repo-path.d.ts.map +1 -1
  290. package/dist/modules/kb-fs/repo-path.js +22 -7
  291. package/dist/modules/kb-fs/repo-path.js.map +1 -1
  292. package/dist/modules/kb-fs/tmp-ref.d.ts +36 -0
  293. package/dist/modules/kb-fs/tmp-ref.d.ts.map +1 -0
  294. package/dist/modules/kb-fs/tmp-ref.js +76 -0
  295. package/dist/modules/kb-fs/tmp-ref.js.map +1 -0
  296. package/dist/modules/kb-sync/kb-sync.routes.d.ts +1 -1
  297. package/dist/modules/kb-sync/kb-sync.routes.d.ts.map +1 -1
  298. package/dist/modules/kb-sync/kb-sync.routes.js +2 -2
  299. package/dist/modules/kb-sync/kb-sync.routes.js.map +1 -1
  300. package/dist/modules/kb-sync/kb-sync.service.js +1 -1
  301. package/dist/modules/kb-sync/kb-sync.service.js.map +1 -1
  302. package/dist/modules/kb-sync/sync-auth.js +1 -1
  303. package/dist/modules/kb-sync/sync-auth.js.map +1 -1
  304. package/dist/modules/kb-sync/sync-payload.js +1 -1
  305. package/dist/modules/kb-sync/sync-payload.js.map +1 -1
  306. package/dist/modules/marketplace/git-http.routes.d.ts +1 -1
  307. package/dist/modules/marketplace/git-http.routes.d.ts.map +1 -1
  308. package/dist/modules/marketplace/git-http.routes.js +1 -1
  309. package/dist/modules/marketplace/git-http.routes.js.map +1 -1
  310. package/dist/modules/marketplace/github-facade/github-facade-admin.routes.d.ts +1 -1
  311. package/dist/modules/marketplace/github-facade/github-facade-admin.routes.d.ts.map +1 -1
  312. package/dist/modules/marketplace/github-facade/github-facade-admin.routes.js +1 -1
  313. package/dist/modules/marketplace/github-facade/github-facade-admin.routes.js.map +1 -1
  314. package/dist/modules/marketplace/github-facade/github-facade-codes.store.d.ts +1 -1
  315. package/dist/modules/marketplace/github-facade/github-facade-codes.store.d.ts.map +1 -1
  316. package/dist/modules/marketplace/github-facade/github-facade-codes.store.js +1 -1
  317. package/dist/modules/marketplace/github-facade/github-facade-codes.store.js.map +1 -1
  318. package/dist/modules/marketplace/github-facade/github-facade-credentials.service.d.ts +1 -1
  319. package/dist/modules/marketplace/github-facade/github-facade-credentials.service.d.ts.map +1 -1
  320. package/dist/modules/marketplace/github-facade/github-facade-credentials.service.js +1 -1
  321. package/dist/modules/marketplace/github-facade/github-facade-credentials.service.js.map +1 -1
  322. package/dist/modules/marketplace/github-facade/github-facade.routes.d.ts +2 -2
  323. package/dist/modules/marketplace/github-facade/github-facade.routes.d.ts.map +1 -1
  324. package/dist/modules/marketplace/github-facade/github-facade.routes.js +2 -2
  325. package/dist/modules/marketplace/github-facade/github-facade.routes.js.map +1 -1
  326. package/dist/modules/marketplace/github-facade/github-facade.service.d.ts +2 -2
  327. package/dist/modules/marketplace/github-facade/github-facade.service.d.ts.map +1 -1
  328. package/dist/modules/marketplace/github-facade/github-facade.service.js +1 -1
  329. package/dist/modules/marketplace/github-facade/github-facade.service.js.map +1 -1
  330. package/dist/modules/marketplace/marketplace-repo.service.d.ts +1 -1
  331. package/dist/modules/marketplace/marketplace-repo.service.d.ts.map +1 -1
  332. package/dist/modules/marketplace/marketplace-repo.service.js +1 -1
  333. package/dist/modules/mcp/index.d.ts +8 -0
  334. package/dist/modules/mcp/index.d.ts.map +1 -0
  335. package/dist/modules/mcp/index.js +7 -0
  336. package/dist/modules/mcp/index.js.map +1 -0
  337. package/dist/modules/mcp/mcp-auth.middleware.d.ts +11 -5
  338. package/dist/modules/mcp/mcp-auth.middleware.d.ts.map +1 -1
  339. package/dist/modules/mcp/mcp-auth.middleware.js +18 -5
  340. package/dist/modules/mcp/mcp-auth.middleware.js.map +1 -1
  341. package/dist/modules/mcp/mcp.routes.d.ts +9 -5
  342. package/dist/modules/mcp/mcp.routes.d.ts.map +1 -1
  343. package/dist/modules/mcp/mcp.routes.js +41 -6
  344. package/dist/modules/mcp/mcp.routes.js.map +1 -1
  345. package/dist/modules/mcp/mcp.service.d.ts +25 -4
  346. package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
  347. package/dist/modules/mcp/mcp.service.js +84 -19
  348. package/dist/modules/mcp/mcp.service.js.map +1 -1
  349. package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts +25 -2
  350. package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts.map +1 -1
  351. package/dist/modules/mcp/oauth/bevel-oauth-provider.js +46 -11
  352. package/dist/modules/mcp/oauth/bevel-oauth-provider.js.map +1 -1
  353. package/dist/modules/mcp/oauth/oauth-consent.routes.d.ts +10 -1
  354. package/dist/modules/mcp/oauth/oauth-consent.routes.d.ts.map +1 -1
  355. package/dist/modules/mcp/oauth/oauth-consent.routes.js +35 -2
  356. package/dist/modules/mcp/oauth/oauth-consent.routes.js.map +1 -1
  357. package/dist/modules/onboarding/onboarding.routes.d.ts +1 -1
  358. package/dist/modules/onboarding/onboarding.routes.d.ts.map +1 -1
  359. package/dist/modules/onboarding/onboarding.routes.js +1 -1
  360. package/dist/modules/onboarding/onboarding.routes.js.map +1 -1
  361. package/dist/modules/onboarding/starter-pack.service.d.ts +4 -5
  362. package/dist/modules/onboarding/starter-pack.service.d.ts.map +1 -1
  363. package/dist/modules/onboarding/starter-pack.service.js +2 -2
  364. package/dist/modules/onboarding/starter-pack.service.js.map +1 -1
  365. package/dist/modules/plugins/compile/compile-marketplace.d.ts +1 -1
  366. package/dist/modules/plugins/compile/compile-marketplace.d.ts.map +1 -1
  367. package/dist/modules/plugins/compile/compile-marketplace.js +1 -1
  368. package/dist/modules/plugins/compile/compile-marketplace.js.map +1 -1
  369. package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts +3 -3
  370. package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts.map +1 -1
  371. package/dist/modules/plugins/discovery/bundle-dialect/registry.d.ts +1 -1
  372. package/dist/modules/plugins/discovery/bundle-dialect/registry.d.ts.map +1 -1
  373. package/dist/modules/plugins/discovery/bundle-dialect/registry.js +1 -1
  374. package/dist/modules/plugins/discovery/bundle-dialect/registry.js.map +1 -1
  375. package/dist/modules/plugins/index.d.ts +2 -1
  376. package/dist/modules/plugins/index.d.ts.map +1 -1
  377. package/dist/modules/plugins/index.js +2 -0
  378. package/dist/modules/plugins/index.js.map +1 -1
  379. package/dist/modules/plugins/join-proposals.d.ts +2 -2
  380. package/dist/modules/plugins/join-proposals.d.ts.map +1 -1
  381. package/dist/modules/plugins/join-proposals.js +1 -1
  382. package/dist/modules/plugins/join-proposals.js.map +1 -1
  383. package/dist/modules/plugins/join-request-jobs.service.d.ts +1 -1
  384. package/dist/modules/plugins/join-request-jobs.service.d.ts.map +1 -1
  385. package/dist/modules/plugins/join-request-jobs.service.js +2 -2
  386. package/dist/modules/plugins/join-request-jobs.service.js.map +1 -1
  387. package/dist/modules/plugins/join-request-records.store.d.ts +1 -1
  388. package/dist/modules/plugins/join-request-records.store.d.ts.map +1 -1
  389. package/dist/modules/plugins/join-request-records.store.js +1 -1
  390. package/dist/modules/plugins/join-request-records.store.js.map +1 -1
  391. package/dist/modules/plugins/join-requests.service.d.ts +3 -3
  392. package/dist/modules/plugins/join-requests.service.d.ts.map +1 -1
  393. package/dist/modules/plugins/join-requests.service.js +1 -1
  394. package/dist/modules/plugins/join-requests.service.js.map +1 -1
  395. package/dist/modules/plugins/plugin-links.d.ts +21 -5
  396. package/dist/modules/plugins/plugin-links.d.ts.map +1 -1
  397. package/dist/modules/plugins/plugin-links.js +1 -1
  398. package/dist/modules/plugins/plugin-links.js.map +1 -1
  399. package/dist/modules/plugins/plugin-links.service.d.ts +8 -5
  400. package/dist/modules/plugins/plugin-links.service.d.ts.map +1 -1
  401. package/dist/modules/plugins/plugin-links.service.js +8 -6
  402. package/dist/modules/plugins/plugin-links.service.js.map +1 -1
  403. package/dist/modules/plugins/plugin-provision.service.d.ts +2 -2
  404. package/dist/modules/plugins/plugin-provision.service.d.ts.map +1 -1
  405. package/dist/modules/plugins/plugin-provision.service.js +2 -3
  406. package/dist/modules/plugins/plugin-provision.service.js.map +1 -1
  407. package/dist/modules/plugins/plugin-rename.service.d.ts +2 -2
  408. package/dist/modules/plugins/plugin-rename.service.d.ts.map +1 -1
  409. package/dist/modules/plugins/plugin-rename.service.js +1 -1
  410. package/dist/modules/plugins/plugin-rename.service.js.map +1 -1
  411. package/dist/modules/plugins/plugins.contract.d.ts +1 -1
  412. package/dist/modules/plugins/plugins.contract.d.ts.map +1 -1
  413. package/dist/modules/plugins/plugins.routes.d.ts +7 -3
  414. package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
  415. package/dist/modules/plugins/plugins.routes.js +35 -8
  416. package/dist/modules/plugins/plugins.routes.js.map +1 -1
  417. package/dist/modules/plugins/plugins.service.d.ts +4 -4
  418. package/dist/modules/plugins/plugins.service.d.ts.map +1 -1
  419. package/dist/modules/plugins/plugins.service.js +1 -1
  420. package/dist/modules/plugins/plugins.service.js.map +1 -1
  421. package/dist/modules/plugins/plugins.tools.d.ts +1 -1
  422. package/dist/modules/plugins/plugins.tools.d.ts.map +1 -1
  423. package/dist/modules/plugins/plugins.tools.js +3 -3
  424. package/dist/modules/plugins/plugins.tools.js.map +1 -1
  425. package/dist/modules/plugins/teams.routes.d.ts +3 -3
  426. package/dist/modules/plugins/teams.routes.d.ts.map +1 -1
  427. package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts +1 -1
  428. package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts.map +1 -1
  429. package/dist/modules/secrets-vault/db-secrets-vault.service.js +1 -1
  430. package/dist/modules/secrets-vault/db-secrets-vault.service.js.map +1 -1
  431. package/dist/modules/secrets-vault/index.d.ts +1 -0
  432. package/dist/modules/secrets-vault/index.d.ts.map +1 -1
  433. package/dist/modules/secrets-vault/index.js +2 -0
  434. package/dist/modules/secrets-vault/index.js.map +1 -1
  435. package/dist/modules/secrets-vault/secrets-vault.routes.d.ts +13 -4
  436. package/dist/modules/secrets-vault/secrets-vault.routes.d.ts.map +1 -1
  437. package/dist/modules/secrets-vault/secrets-vault.routes.js +16 -4
  438. package/dist/modules/secrets-vault/secrets-vault.routes.js.map +1 -1
  439. package/dist/modules/settings/connection-check.js +1 -1
  440. package/dist/modules/settings/connection-check.js.map +1 -1
  441. package/dist/modules/settings/deployment-settings.service.d.ts +7 -1
  442. package/dist/modules/settings/deployment-settings.service.d.ts.map +1 -1
  443. package/dist/modules/settings/deployment-settings.service.js +45 -3
  444. package/dist/modules/settings/deployment-settings.service.js.map +1 -1
  445. package/dist/modules/settings/git-root-folders.js +1 -1
  446. package/dist/modules/settings/git-root-folders.js.map +1 -1
  447. package/dist/modules/settings/index.d.ts +13 -0
  448. package/dist/modules/settings/index.d.ts.map +1 -0
  449. package/dist/modules/settings/index.js +3 -0
  450. package/dist/modules/settings/index.js.map +1 -0
  451. package/dist/modules/settings/setup.routes.d.ts +3 -3
  452. package/dist/modules/settings/setup.routes.d.ts.map +1 -1
  453. package/dist/modules/settings/setup.routes.js +2 -2
  454. package/dist/modules/settings/setup.routes.js.map +1 -1
  455. package/dist/modules/skills/allowed-tools-check.d.ts +2 -2
  456. package/dist/modules/skills/allowed-tools-check.d.ts.map +1 -1
  457. package/dist/modules/skills/allowed-tools-check.js +1 -1
  458. package/dist/modules/skills/allowed-tools-check.js.map +1 -1
  459. package/dist/modules/skills/index.d.ts +4 -3
  460. package/dist/modules/skills/index.d.ts.map +1 -1
  461. package/dist/modules/skills/index.js +0 -2
  462. package/dist/modules/skills/index.js.map +1 -1
  463. package/dist/modules/skills/pending-skills.service.d.ts +3 -3
  464. package/dist/modules/skills/pending-skills.service.d.ts.map +1 -1
  465. package/dist/modules/skills/pending-skills.service.js.map +1 -1
  466. package/dist/modules/skills/skill-access-requests.routes.d.ts +5 -5
  467. package/dist/modules/skills/skill-access-requests.routes.d.ts.map +1 -1
  468. package/dist/modules/skills/skill-access-requests.routes.js +6 -13
  469. package/dist/modules/skills/skill-access-requests.routes.js.map +1 -1
  470. package/dist/modules/skills/skills.contract.d.ts +16 -0
  471. package/dist/modules/skills/skills.contract.d.ts.map +1 -1
  472. package/dist/modules/skills/skills.routes.d.ts +1 -1
  473. package/dist/modules/skills/skills.routes.d.ts.map +1 -1
  474. package/dist/modules/skills/skills.routes.js +1 -1
  475. package/dist/modules/skills/skills.routes.js.map +1 -1
  476. package/dist/modules/skills/skills.service.d.ts +2 -2
  477. package/dist/modules/skills/skills.service.d.ts.map +1 -1
  478. package/dist/modules/skills/skills.service.js +6 -1
  479. package/dist/modules/skills/skills.service.js.map +1 -1
  480. package/dist/modules/skills/skills.tools.d.ts +3 -3
  481. package/dist/modules/skills/skills.tools.d.ts.map +1 -1
  482. package/dist/modules/skills/skills.tools.js +27 -19
  483. package/dist/modules/skills/skills.tools.js.map +1 -1
  484. package/dist/modules/tool-auth/connection-key-rejection.js +1 -1
  485. package/dist/modules/tool-auth/connection-key-rejection.js.map +1 -1
  486. package/dist/modules/tool-auth/connection-keys-admin.routes.d.ts +2 -2
  487. package/dist/modules/tool-auth/connection-keys-admin.routes.d.ts.map +1 -1
  488. package/dist/modules/tool-auth/connection-keys-admin.routes.js +1 -1
  489. package/dist/modules/tool-auth/connection-keys-admin.routes.js.map +1 -1
  490. package/dist/modules/tool-auth/external-api-key.interface.d.ts +11 -0
  491. package/dist/modules/tool-auth/external-api-key.interface.d.ts.map +1 -1
  492. package/dist/modules/tool-auth/external-api-key.interface.js.map +1 -1
  493. package/dist/modules/tool-auth/external-api-key.service.d.ts +2 -1
  494. package/dist/modules/tool-auth/external-api-key.service.d.ts.map +1 -1
  495. package/dist/modules/tool-auth/external-api-key.service.js +5 -2
  496. package/dist/modules/tool-auth/external-api-key.service.js.map +1 -1
  497. package/dist/modules/tool-auth/index.d.ts +15 -0
  498. package/dist/modules/tool-auth/index.d.ts.map +1 -0
  499. package/dist/modules/tool-auth/index.js +11 -0
  500. package/dist/modules/tool-auth/index.js.map +1 -0
  501. package/dist/modules/tool-auth/internal-token.service.d.ts +9 -0
  502. package/dist/modules/tool-auth/internal-token.service.d.ts.map +1 -1
  503. package/dist/modules/tool-auth/internal-token.service.js +1 -0
  504. package/dist/modules/tool-auth/internal-token.service.js.map +1 -1
  505. package/dist/modules/tool-auth/tool-auth.middleware.d.ts +29 -5
  506. package/dist/modules/tool-auth/tool-auth.middleware.d.ts.map +1 -1
  507. package/dist/modules/tool-auth/tool-auth.middleware.js +33 -7
  508. package/dist/modules/tool-auth/tool-auth.middleware.js.map +1 -1
  509. package/dist/modules/tool-helpers/default-branch-write.d.ts +1 -1
  510. package/dist/modules/tool-helpers/default-branch-write.d.ts.map +1 -1
  511. package/dist/modules/tool-helpers/index.d.ts +4 -1
  512. package/dist/modules/tool-helpers/index.d.ts.map +1 -1
  513. package/dist/modules/tool-helpers/index.js +3 -0
  514. package/dist/modules/tool-helpers/index.js.map +1 -1
  515. package/dist/modules/tool-helpers/route-argument-check.js +1 -1
  516. package/dist/modules/tool-helpers/route-argument-check.js.map +1 -1
  517. package/dist/modules/tool-helpers/route-tool-schemas.d.ts +1 -1
  518. package/dist/modules/tool-helpers/route-tool-schemas.d.ts.map +1 -1
  519. package/dist/modules/tool-helpers/tool-context.d.ts +12 -6
  520. package/dist/modules/tool-helpers/tool-context.d.ts.map +1 -1
  521. package/dist/modules/tool-helpers/tool-context.js +5 -3
  522. package/dist/modules/tool-helpers/tool-context.js.map +1 -1
  523. package/dist/modules/tool-helpers/tool-def.d.ts +4 -2
  524. package/dist/modules/tool-helpers/tool-def.d.ts.map +1 -1
  525. package/dist/modules/tool-helpers/tool-def.js +3 -1
  526. package/dist/modules/tool-helpers/tool-def.js.map +1 -1
  527. package/dist/modules/tool-helpers/tool-handler.d.ts +17 -2
  528. package/dist/modules/tool-helpers/tool-handler.d.ts.map +1 -1
  529. package/dist/modules/tool-helpers/tool-handler.js +21 -2
  530. package/dist/modules/tool-helpers/tool-handler.js.map +1 -1
  531. package/dist/modules/tool-helpers/tool.contract.d.ts +12 -2
  532. package/dist/modules/tool-helpers/tool.contract.d.ts.map +1 -1
  533. package/dist/modules/tool-helpers/tool.contract.js.map +1 -1
  534. package/dist/modules/tool-helpers/validate-token.d.ts +3 -2
  535. package/dist/modules/tool-helpers/validate-token.d.ts.map +1 -1
  536. package/dist/modules/tool-helpers/validate-token.js +2 -2
  537. package/dist/modules/tool-helpers/validate-token.js.map +1 -1
  538. package/dist/modules/tool-manuals/index.d.ts +8 -3
  539. package/dist/modules/tool-manuals/index.d.ts.map +1 -1
  540. package/dist/modules/tool-manuals/index.js +4 -2
  541. package/dist/modules/tool-manuals/index.js.map +1 -1
  542. package/dist/modules/tool-manuals/mcp-server-edit.service.d.ts +2 -2
  543. package/dist/modules/tool-manuals/mcp-server-edit.service.d.ts.map +1 -1
  544. package/dist/modules/tool-manuals/pending-tools.service.d.ts +2 -2
  545. package/dist/modules/tool-manuals/pending-tools.service.d.ts.map +1 -1
  546. package/dist/modules/tool-manuals/tool-delete.service.d.ts +5 -6
  547. package/dist/modules/tool-manuals/tool-delete.service.d.ts.map +1 -1
  548. package/dist/modules/tool-manuals/tool-delete.service.js.map +1 -1
  549. package/dist/modules/tool-manuals/tool-manuals.contract.d.ts +19 -6
  550. package/dist/modules/tool-manuals/tool-manuals.contract.d.ts.map +1 -1
  551. package/dist/modules/tool-manuals/tool-manuals.routes.d.ts +12 -6
  552. package/dist/modules/tool-manuals/tool-manuals.routes.d.ts.map +1 -1
  553. package/dist/modules/tool-manuals/tool-manuals.routes.js +43 -6
  554. package/dist/modules/tool-manuals/tool-manuals.routes.js.map +1 -1
  555. package/dist/modules/tool-manuals/tool-manuals.service.d.ts +16 -9
  556. package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
  557. package/dist/modules/tool-manuals/tool-manuals.service.js +23 -15
  558. package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -1
  559. package/dist/modules/tool-manuals/tool-manuals.tools.d.ts +3 -3
  560. package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
  561. package/dist/modules/tool-manuals/tool-manuals.tools.js +26 -12
  562. package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
  563. package/dist/modules/tool-registry/description-length.js +2 -2
  564. package/dist/modules/tool-registry/description-length.js.map +1 -1
  565. package/dist/modules/tool-registry/index.d.ts +8 -0
  566. package/dist/modules/tool-registry/index.d.ts.map +1 -0
  567. package/dist/modules/tool-registry/index.js +8 -0
  568. package/dist/modules/tool-registry/index.js.map +1 -0
  569. package/dist/modules/tool-registry/manual.routes.d.ts +44 -2
  570. package/dist/modules/tool-registry/manual.routes.d.ts.map +1 -1
  571. package/dist/modules/tool-registry/manual.routes.js +38 -11
  572. package/dist/modules/tool-registry/manual.routes.js.map +1 -1
  573. package/dist/modules/tool-registry/read-only-hints.contract.d.ts +52 -0
  574. package/dist/modules/tool-registry/read-only-hints.contract.d.ts.map +1 -0
  575. package/dist/modules/tool-registry/read-only-hints.contract.js +2 -0
  576. package/dist/modules/tool-registry/read-only-hints.contract.js.map +1 -0
  577. package/dist/modules/tool-registry/read-only-hints.d.ts +89 -0
  578. package/dist/modules/tool-registry/read-only-hints.d.ts.map +1 -0
  579. package/dist/modules/tool-registry/read-only-hints.js +212 -0
  580. package/dist/modules/tool-registry/read-only-hints.js.map +1 -0
  581. package/dist/modules/tool-registry/tool.contract.d.ts +15 -0
  582. package/dist/modules/tool-registry/tool.contract.d.ts.map +1 -1
  583. package/dist/modules/tool-registry/tool.contract.js +10 -1
  584. package/dist/modules/tool-registry/tool.contract.js.map +1 -1
  585. package/dist/modules/update-check/update-check.routes.d.ts +2 -2
  586. package/dist/modules/update-check/update-check.routes.d.ts.map +1 -1
  587. package/dist/modules/update-check/update-check.routes.js +1 -1
  588. package/dist/modules/update-check/update-check.routes.js.map +1 -1
  589. package/dist/modules/workflow/agent-tools/change-request-read-shape.d.ts +9 -104
  590. package/dist/modules/workflow/agent-tools/change-request-read-shape.d.ts.map +1 -1
  591. package/dist/modules/workflow/agent-tools/change-request-read-shape.js +8 -118
  592. package/dist/modules/workflow/agent-tools/change-request-read-shape.js.map +1 -1
  593. package/dist/modules/workflow/agent-tools/change-request-read.tools.d.ts +16 -17
  594. package/dist/modules/workflow/agent-tools/change-request-read.tools.d.ts.map +1 -1
  595. package/dist/modules/workflow/agent-tools/change-request-read.tools.js +19 -86
  596. package/dist/modules/workflow/agent-tools/change-request-read.tools.js.map +1 -1
  597. package/dist/modules/workflow/agent-tools/change-request-summary.d.ts +5 -1
  598. package/dist/modules/workflow/agent-tools/change-request-summary.d.ts.map +1 -1
  599. package/dist/modules/workflow/agent-tools/change-request-summary.js +10 -1
  600. package/dist/modules/workflow/agent-tools/change-request-summary.js.map +1 -1
  601. package/dist/modules/workflow/agent-tools/workflow.tools.d.ts +7 -5
  602. package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +1 -1
  603. package/dist/modules/workflow/agent-tools/workflow.tools.js +60 -77
  604. package/dist/modules/workflow/agent-tools/workflow.tools.js.map +1 -1
  605. package/dist/modules/workflow/change-request-hooks.d.ts +1 -1
  606. package/dist/modules/workflow/event-bus.d.ts.map +1 -1
  607. package/dist/modules/workflow/event-bus.js +3 -1
  608. package/dist/modules/workflow/event-bus.js.map +1 -1
  609. package/dist/modules/workflow/events-delivery.d.ts +120 -0
  610. package/dist/modules/workflow/events-delivery.d.ts.map +1 -0
  611. package/dist/modules/workflow/events-delivery.js +202 -0
  612. package/dist/modules/workflow/events-delivery.js.map +1 -0
  613. package/dist/modules/workflow/events.routes.d.ts +16 -7
  614. package/dist/modules/workflow/events.routes.d.ts.map +1 -1
  615. package/dist/modules/workflow/events.routes.js +23 -4
  616. package/dist/modules/workflow/events.routes.js.map +1 -1
  617. package/dist/modules/workflow/file-lock.service.d.ts +1 -1
  618. package/dist/modules/workflow/file-lock.service.d.ts.map +1 -1
  619. package/dist/modules/workflow/file-lock.service.js +1 -1
  620. package/dist/modules/workflow/file-lock.service.js.map +1 -1
  621. package/dist/modules/workflow/git/git.service.d.ts +4 -4
  622. package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
  623. package/dist/modules/workflow/git/git.service.js +23 -41
  624. package/dist/modules/workflow/git/git.service.js.map +1 -1
  625. package/dist/modules/workflow/git/node-git-runner.js +1 -1
  626. package/dist/modules/workflow/git/node-git-runner.js.map +1 -1
  627. package/dist/modules/workflow/git/pull-request.service.d.ts +6 -7
  628. package/dist/modules/workflow/git/pull-request.service.d.ts.map +1 -1
  629. package/dist/modules/workflow/git/pull-request.service.js +40 -33
  630. package/dist/modules/workflow/git/pull-request.service.js.map +1 -1
  631. package/dist/modules/workflow/index.d.ts +14 -2
  632. package/dist/modules/workflow/index.d.ts.map +1 -1
  633. package/dist/modules/workflow/index.js +11 -2
  634. package/dist/modules/workflow/index.js.map +1 -1
  635. package/dist/modules/workflow/pending-commits.service.d.ts +1 -1
  636. package/dist/modules/workflow/pending-commits.service.d.ts.map +1 -1
  637. package/dist/modules/workflow/pending-commits.service.js +1 -1
  638. package/dist/modules/workflow/pending-commits.service.js.map +1 -1
  639. package/dist/modules/workflow/read-on-branch.d.ts +1 -1
  640. package/dist/modules/workflow/read-on-branch.d.ts.map +1 -1
  641. package/dist/modules/workflow/recovery-bot.d.ts +1 -1
  642. package/dist/modules/workflow/recovery-bot.d.ts.map +1 -1
  643. package/dist/modules/workflow/recovery-bot.js +1 -1
  644. package/dist/modules/workflow/recovery-bot.js.map +1 -1
  645. package/dist/modules/workflow/review-workflow/approval-lock.d.ts +1 -1
  646. package/dist/modules/workflow/review-workflow/approval-lock.d.ts.map +1 -1
  647. package/dist/modules/workflow/review-workflow/review-workflow.interface.d.ts +4 -20
  648. package/dist/modules/workflow/review-workflow/review-workflow.interface.d.ts.map +1 -1
  649. package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts +4 -8
  650. package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts.map +1 -1
  651. package/dist/modules/workflow/review-workflow/review-workflow.service.js +3 -138
  652. package/dist/modules/workflow/review-workflow/review-workflow.service.js.map +1 -1
  653. package/dist/modules/workflow/workflow.routes.d.ts +5 -5
  654. package/dist/modules/workflow/workflow.routes.d.ts.map +1 -1
  655. package/dist/modules/workflow/workflow.routes.js +42 -94
  656. package/dist/modules/workflow/workflow.routes.js.map +1 -1
  657. package/dist/modules/workflow/workflow.service.d.ts +41 -50
  658. package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
  659. package/dist/modules/workflow/workflow.service.js +221 -154
  660. package/dist/modules/workflow/workflow.service.js.map +1 -1
  661. package/dist/modules/workspace/agent-access.gate.d.ts +3 -3
  662. package/dist/modules/workspace/agent-access.gate.d.ts.map +1 -1
  663. package/dist/modules/workspace/agent-download.builder.d.ts +1 -1
  664. package/dist/modules/workspace/agent-download.builder.d.ts.map +1 -1
  665. package/dist/modules/workspace/agent-download.builder.js +1 -1
  666. package/dist/modules/workspace/agent-download.builder.js.map +1 -1
  667. package/dist/modules/workspace/agent-upload.routes.d.ts.map +1 -1
  668. package/dist/modules/workspace/agent-upload.routes.js +19 -0
  669. package/dist/modules/workspace/agent-upload.routes.js.map +1 -1
  670. package/dist/modules/workspace/agent-upload.store.d.ts +11 -0
  671. package/dist/modules/workspace/agent-upload.store.d.ts.map +1 -1
  672. package/dist/modules/workspace/agent-upload.store.js +18 -0
  673. package/dist/modules/workspace/agent-upload.store.js.map +1 -1
  674. package/dist/modules/workspace/file-readers/doc-extract.service.d.ts +82 -14
  675. package/dist/modules/workspace/file-readers/doc-extract.service.d.ts.map +1 -1
  676. package/dist/modules/workspace/file-readers/doc-extract.service.js +109 -36
  677. package/dist/modules/workspace/file-readers/doc-extract.service.js.map +1 -1
  678. package/dist/modules/workspace/file-readers/doc-extract.types.d.ts +9 -2
  679. package/dist/modules/workspace/file-readers/doc-extract.types.d.ts.map +1 -1
  680. package/dist/modules/workspace/file-readers/doc-extract.types.js.map +1 -1
  681. package/dist/modules/workspace/file-readers/document-extractor.contract.d.ts +41 -0
  682. package/dist/modules/workspace/file-readers/document-extractor.contract.d.ts.map +1 -0
  683. package/dist/modules/workspace/file-readers/document-extractor.contract.js +5 -0
  684. package/dist/modules/workspace/file-readers/document-extractor.contract.js.map +1 -0
  685. package/dist/modules/workspace/file-readers/document-extractors.d.ts +9 -0
  686. package/dist/modules/workspace/file-readers/document-extractors.d.ts.map +1 -0
  687. package/dist/modules/workspace/file-readers/document-extractors.js +26 -0
  688. package/dist/modules/workspace/file-readers/document-extractors.js.map +1 -0
  689. package/dist/modules/workspace/file-readers/document-formats.d.ts +12 -0
  690. package/dist/modules/workspace/file-readers/document-formats.d.ts.map +1 -0
  691. package/dist/modules/workspace/file-readers/document-formats.js +11 -0
  692. package/dist/modules/workspace/file-readers/document-formats.js.map +1 -0
  693. package/dist/modules/workspace/file-readers/document-reader.d.ts +21 -17
  694. package/dist/modules/workspace/file-readers/document-reader.d.ts.map +1 -1
  695. package/dist/modules/workspace/file-readers/document-reader.js +38 -34
  696. package/dist/modules/workspace/file-readers/document-reader.js.map +1 -1
  697. package/dist/modules/workspace/file-readers/extract-in-worker.d.ts +60 -0
  698. package/dist/modules/workspace/file-readers/extract-in-worker.d.ts.map +1 -0
  699. package/dist/modules/workspace/file-readers/extract-in-worker.js +140 -0
  700. package/dist/modules/workspace/file-readers/extract-in-worker.js.map +1 -0
  701. package/dist/modules/workspace/file-readers/extract-pdf.d.ts +2 -0
  702. package/dist/modules/workspace/file-readers/extract-pdf.d.ts.map +1 -1
  703. package/dist/modules/workspace/file-readers/extract-pdf.js +20 -3
  704. package/dist/modules/workspace/file-readers/extract-pdf.js.map +1 -1
  705. package/dist/modules/workspace/file-readers/extract.worker.d.ts +2 -0
  706. package/dist/modules/workspace/file-readers/extract.worker.d.ts.map +1 -0
  707. package/dist/modules/workspace/file-readers/extract.worker.js +5 -0
  708. package/dist/modules/workspace/file-readers/extract.worker.js.map +1 -0
  709. package/dist/modules/workspace/file-readers/extraction-cache.d.ts +21 -5
  710. package/dist/modules/workspace/file-readers/extraction-cache.d.ts.map +1 -1
  711. package/dist/modules/workspace/file-readers/extraction-cache.js +24 -10
  712. package/dist/modules/workspace/file-readers/extraction-cache.js.map +1 -1
  713. package/dist/modules/workspace/file-readers/extraction-worker.d.ts +42 -0
  714. package/dist/modules/workspace/file-readers/extraction-worker.d.ts.map +1 -0
  715. package/dist/modules/workspace/file-readers/extraction-worker.js +69 -0
  716. package/dist/modules/workspace/file-readers/extraction-worker.js.map +1 -0
  717. package/dist/modules/workspace/file-readers/file-reader.d.ts +13 -4
  718. package/dist/modules/workspace/file-readers/file-reader.d.ts.map +1 -1
  719. package/dist/modules/workspace/file-readers/file-reader.js.map +1 -1
  720. package/dist/modules/workspace/file-readers/file-reader.registry.d.ts +3 -2
  721. package/dist/modules/workspace/file-readers/file-reader.registry.d.ts.map +1 -1
  722. package/dist/modules/workspace/file-readers/file-reader.registry.js +6 -20
  723. package/dist/modules/workspace/file-readers/file-reader.registry.js.map +1 -1
  724. package/dist/modules/workspace/first-run.js +1 -1
  725. package/dist/modules/workspace/first-run.js.map +1 -1
  726. package/dist/modules/workspace/git-internals.middleware.d.ts +1 -1
  727. package/dist/modules/workspace/git-internals.middleware.d.ts.map +1 -1
  728. package/dist/modules/workspace/git-internals.middleware.js +1 -1
  729. package/dist/modules/workspace/git-internals.middleware.js.map +1 -1
  730. package/dist/modules/workspace/index.d.ts +24 -0
  731. package/dist/modules/workspace/index.d.ts.map +1 -1
  732. package/dist/modules/workspace/index.js +21 -0
  733. package/dist/modules/workspace/index.js.map +1 -1
  734. package/dist/modules/workspace/kb-repository.d.ts.map +1 -1
  735. package/dist/modules/workspace/kb-repository.js +1 -1
  736. package/dist/modules/workspace/kb-repository.js.map +1 -1
  737. package/dist/modules/workspace/not-found.d.ts +1 -1
  738. package/dist/modules/workspace/not-found.d.ts.map +1 -1
  739. package/dist/modules/workspace/not-found.js +1 -1
  740. package/dist/modules/workspace/not-found.js.map +1 -1
  741. package/dist/modules/workspace/nul-scan.d.ts +19 -0
  742. package/dist/modules/workspace/nul-scan.d.ts.map +1 -0
  743. package/dist/modules/workspace/nul-scan.js +55 -0
  744. package/dist/modules/workspace/nul-scan.js.map +1 -0
  745. package/dist/modules/workspace/pattern-matcher.contract.d.ts +111 -28
  746. package/dist/modules/workspace/pattern-matcher.contract.d.ts.map +1 -1
  747. package/dist/modules/workspace/pattern-matcher.contract.js +31 -14
  748. package/dist/modules/workspace/pattern-matcher.contract.js.map +1 -1
  749. package/dist/modules/workspace/ripgrep-search.d.ts +54 -0
  750. package/dist/modules/workspace/ripgrep-search.d.ts.map +1 -0
  751. package/dist/modules/workspace/ripgrep-search.js +657 -0
  752. package/dist/modules/workspace/ripgrep-search.js.map +1 -0
  753. package/dist/modules/workspace/ripgrep-version.d.ts +15 -0
  754. package/dist/modules/workspace/ripgrep-version.d.ts.map +1 -0
  755. package/dist/modules/workspace/ripgrep-version.js +31 -0
  756. package/dist/modules/workspace/ripgrep-version.js.map +1 -0
  757. package/dist/modules/workspace/routine-write-policy.js +1 -1
  758. package/dist/modules/workspace/routine-write-policy.js.map +1 -1
  759. package/dist/modules/workspace/startup/beside-checkout.d.ts +8 -5
  760. package/dist/modules/workspace/startup/beside-checkout.d.ts.map +1 -1
  761. package/dist/modules/workspace/startup/beside-checkout.js +14 -5
  762. package/dist/modules/workspace/startup/beside-checkout.js.map +1 -1
  763. package/dist/modules/workspace/startup/kb-git.js +1 -1
  764. package/dist/modules/workspace/startup/kb-git.js.map +1 -1
  765. package/dist/modules/workspace/startup/kb-startup-runner.d.ts.map +1 -1
  766. package/dist/modules/workspace/startup/kb-startup-runner.js +1 -2
  767. package/dist/modules/workspace/startup/kb-startup-runner.js.map +1 -1
  768. package/dist/modules/workspace/startup/steps/groups-to-plugins.step.js +2 -2
  769. package/dist/modules/workspace/startup/steps/groups-to-plugins.step.js.map +1 -1
  770. package/dist/modules/workspace/startup/steps/personal-spaces.step.js +2 -2
  771. package/dist/modules/workspace/startup/steps/personal-spaces.step.js.map +1 -1
  772. package/dist/modules/workspace/startup/steps/plugin-layout.js +1 -1
  773. package/dist/modules/workspace/startup/steps/plugin-layout.js.map +1 -1
  774. package/dist/modules/workspace/startup/steps/roles-yaml.step.js +1 -1
  775. package/dist/modules/workspace/startup/steps/roles-yaml.step.js.map +1 -1
  776. package/dist/modules/workspace/startup/steps/seed-tree.js +2 -2
  777. package/dist/modules/workspace/startup/steps/seed-tree.js.map +1 -1
  778. package/dist/modules/workspace/startup/steps/template-files.step.d.ts +1 -1
  779. package/dist/modules/workspace/startup/steps/template-files.step.d.ts.map +1 -1
  780. package/dist/modules/workspace/startup/steps/template-files.step.js +2 -2
  781. package/dist/modules/workspace/startup/steps/template-files.step.js.map +1 -1
  782. package/dist/modules/workspace/startup/steps/template-source.js +2 -2
  783. package/dist/modules/workspace/startup/steps/template-source.js.map +1 -1
  784. package/dist/modules/workspace/worker-pool.d.ts +99 -0
  785. package/dist/modules/workspace/worker-pool.d.ts.map +1 -0
  786. package/dist/modules/workspace/worker-pool.js +156 -0
  787. package/dist/modules/workspace/worker-pool.js.map +1 -0
  788. package/dist/modules/workspace/workspace-tmp.d.ts +146 -0
  789. package/dist/modules/workspace/workspace-tmp.d.ts.map +1 -0
  790. package/dist/modules/workspace/workspace-tmp.js +435 -0
  791. package/dist/modules/workspace/workspace-tmp.js.map +1 -0
  792. package/dist/modules/workspace/workspace.routes.d.ts +7 -8
  793. package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
  794. package/dist/modules/workspace/workspace.routes.js +9 -32
  795. package/dist/modules/workspace/workspace.routes.js.map +1 -1
  796. package/dist/modules/workspace/workspace.service.d.ts +48 -7
  797. package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
  798. package/dist/modules/workspace/workspace.service.js +89 -12
  799. package/dist/modules/workspace/workspace.service.js.map +1 -1
  800. package/dist/modules/workspace/workspace.tools.d.ts +7 -7
  801. package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
  802. package/dist/modules/workspace/workspace.tools.js +502 -140
  803. package/dist/modules/workspace/workspace.tools.js.map +1 -1
  804. package/dist/modules/workspace/write-denial.d.ts +4 -4
  805. package/dist/modules/workspace/write-denial.d.ts.map +1 -1
  806. package/dist/modules/workspace/write-denial.js +2 -3
  807. package/dist/modules/workspace/write-denial.js.map +1 -1
  808. package/dist/modules/write-access/index.d.ts +8 -0
  809. package/dist/modules/write-access/index.d.ts.map +1 -0
  810. package/dist/modules/write-access/index.js +7 -0
  811. package/dist/modules/write-access/index.js.map +1 -0
  812. package/dist/shared/path-order.d.ts +28 -8
  813. package/dist/shared/path-order.d.ts.map +1 -1
  814. package/dist/shared/path-order.js +37 -8
  815. package/dist/shared/path-order.js.map +1 -1
  816. package/migrations/0020_change_request_body_is_the_description.sql +20 -0
  817. package/migrations/0021_data_migrations_ledger.sql +11 -0
  818. package/migrations/0022_session_version.sql +6 -0
  819. package/migrations/0023_agent_path.sql +3 -0
  820. package/migrations/meta/0020_snapshot.json +2321 -0
  821. package/migrations/meta/0021_snapshot.json +2353 -0
  822. package/migrations/meta/0022_snapshot.json +2360 -0
  823. package/migrations/meta/0023_snapshot.json +2378 -0
  824. package/migrations/meta/_journal.json +28 -0
  825. package/package.json +3 -3
  826. package/src/__tests__/pg-scratch.test.ts +69 -0
  827. package/src/__tests__/pg-scratch.ts +31 -0
  828. package/src/__tests__/slow-ripgrep.ts +65 -0
  829. package/src/core/__tests__/boot-without-ripgrep.test.ts +34 -0
  830. package/src/core/__tests__/catalog-revision.test.ts +89 -0
  831. package/src/core/__tests__/damaged-document.tools.test.ts +374 -0
  832. package/src/core/__tests__/gated-boot.test.ts +8 -1
  833. package/src/core/__tests__/lifecycle.test.ts +46 -13
  834. package/src/core/__tests__/public-config.test.ts +5 -0
  835. package/src/core/catalog-revision.ts +24 -2
  836. package/src/core/core-ports.ts +42 -0
  837. package/src/core/create-core-server.ts +45 -3
  838. package/src/core/create-core-services.ts +81 -17
  839. package/src/core/lifecycle.ts +36 -2
  840. package/src/core/public-config.ts +10 -0
  841. package/src/index.ts +1 -1
  842. package/src/modules/access/__tests__/access-control.admin-root-floor.test.ts +12 -0
  843. package/src/modules/access/__tests__/access-control.colliding-name-cases.test.ts +113 -0
  844. package/src/modules/access/__tests__/access-control.frontmatter-head.test.ts +117 -0
  845. package/src/modules/access/__tests__/access-control.group-named-admin.test.ts +122 -0
  846. package/src/modules/access/__tests__/access-control.preview-relocation.test.ts +50 -0
  847. package/src/modules/access/__tests__/access-declarations.test.ts +19 -0
  848. package/src/modules/access/__tests__/access-groups.test.ts +55 -22
  849. package/src/modules/access/__tests__/access-mutation.service.test.ts +85 -59
  850. package/src/modules/access/__tests__/access-requests.routes.test.ts +29 -15
  851. package/src/modules/access/__tests__/access-restrict-here.test.ts +7 -5
  852. package/src/modules/access/__tests__/access.routes.admins.test.ts +1 -0
  853. package/src/modules/access/__tests__/access.routes.batch.test.ts +2 -0
  854. package/src/modules/access/__tests__/access.routes.folder-governs.test.ts +2 -0
  855. package/src/modules/access/__tests__/access.routes.group-grant.test.ts +50 -14
  856. package/src/modules/access/__tests__/access.routes.overrides.test.ts +2 -1
  857. package/src/modules/access/__tests__/access.routes.proposal-branch.test.ts +1 -0
  858. package/src/modules/access/__tests__/access.routes.prospective.test.ts +2 -0
  859. package/src/modules/access/__tests__/access.routes.revoke.test.ts +18 -13
  860. package/src/modules/access/__tests__/access.routes.unknown-email.test.ts +2 -0
  861. package/src/modules/access/__tests__/grant-sources.test.ts +20 -15
  862. package/src/modules/access/__tests__/groups-admin.routes.test.ts +61 -0
  863. package/src/modules/access/__tests__/groups-admin.service.test.ts +211 -18
  864. package/src/modules/access/__tests__/reference-scan.test.ts +366 -14
  865. package/src/modules/access/__tests__/roles-admin.security.test.ts +1 -1
  866. package/src/modules/access/__tests__/roles-admin.service.test.ts +43 -22
  867. package/src/modules/access/__tests__/roles-capabilities.test.ts +6 -2
  868. package/src/modules/access/__tests__/roles.routes.test.ts +1 -1
  869. package/src/modules/access/access-control.interface.ts +17 -10
  870. package/src/modules/access/access-control.service.ts +161 -76
  871. package/src/modules/access/access-declarations.ts +1 -1
  872. package/src/modules/access/access-mutation.service.ts +58 -57
  873. package/src/modules/access/access-requests.contract.ts +1 -1
  874. package/src/modules/access/access-requests.routes.ts +10 -15
  875. package/src/modules/access/access-requests.service.ts +29 -71
  876. package/src/modules/access/access-view.ts +13 -11
  877. package/src/modules/access/access.routes.ts +51 -43
  878. package/src/modules/access/admin-locked-commit.ts +3 -2
  879. package/src/modules/access/capability-registry.ts +1 -1
  880. package/src/modules/access/change-read-gate.ts +3 -5
  881. package/src/modules/access/creator-access.ts +3 -5
  882. package/src/modules/access/directory-sync-bot.ts +2 -2
  883. package/src/modules/access/groups-admin.routes.ts +7 -5
  884. package/src/modules/access/groups-admin.service.ts +116 -47
  885. package/src/modules/access/groups-edit.ts +3 -3
  886. package/src/modules/access/index.ts +17 -0
  887. package/src/modules/access/reference-scan.ts +320 -47
  888. package/src/modules/access/roles-admin.service.ts +45 -31
  889. package/src/modules/access/roles-edit.ts +1 -1
  890. package/src/modules/access/synced-groups-committer.ts +4 -4
  891. package/src/modules/access/synced-groups-writer.ts +3 -3
  892. package/src/modules/access/user-access-removal.service.ts +3 -6
  893. package/src/modules/access-model/__tests__/access-grammar.test.ts +38 -1
  894. package/src/modules/access-model/__tests__/access-splice.test.ts +50 -8
  895. package/src/modules/access-model/access-grammar.ts +65 -20
  896. package/src/modules/access-model/access-splice.ts +31 -23
  897. package/src/modules/access-model/group-files.ts +5 -0
  898. package/src/modules/access-model/index.ts +21 -5
  899. package/src/modules/access-model/roles-yaml-guard.ts +1 -1
  900. package/src/modules/admin/admin-access.routes.ts +1 -1
  901. package/src/modules/admin/admin-access.service.ts +2 -2
  902. package/src/modules/admin/index.ts +7 -0
  903. package/src/modules/agent-guide/__tests__/agent-guide.test.ts +36 -0
  904. package/src/modules/agent-guide/agent-guide.tools.ts +17 -8
  905. package/src/modules/agent-guide/agent-guide.ts +1 -1
  906. package/src/modules/agent-guide/index.ts +1 -1
  907. package/src/modules/agent-instructions/__tests__/shared-file-rules.test.ts +1 -0
  908. package/src/modules/agent-instructions/compose.ts +3 -1
  909. package/src/modules/agent-instructions/read-preamble.ts +1 -1
  910. package/src/modules/agent-instructions/shared-file-rules.ts +17 -1
  911. package/src/modules/agent-scope/__tests__/agent-surfaces.connect-as.test.ts +421 -0
  912. package/src/modules/agent-scope/__tests__/connection-scope.test.ts +46 -0
  913. package/src/modules/agent-scope/__tests__/in-memory-kb.ts +148 -0
  914. package/src/modules/agent-scope/agent-scope.contract.ts +83 -0
  915. package/src/modules/agent-scope/connection-scope.ts +199 -0
  916. package/src/modules/agent-scope/index.ts +15 -0
  917. package/src/modules/audit/agent-audit.service.ts +5 -3
  918. package/src/modules/audit/agent-connection.routes.ts +1 -1
  919. package/src/modules/audit/agent-rest-audit.middleware.ts +1 -1
  920. package/src/modules/audit/audit.contract.ts +6 -0
  921. package/src/modules/audit/audit.routes.ts +4 -4
  922. package/src/modules/auth/__tests__/auth.middleware.test.ts +30 -2
  923. package/src/modules/auth/__tests__/auth.routes.test.ts +71 -5
  924. package/src/modules/auth/__tests__/auth.service.test.ts +90 -9
  925. package/src/modules/auth/__tests__/password-change-sessions.pg.test.ts +269 -0
  926. package/src/modules/auth/account-admission.ts +19 -0
  927. package/src/modules/auth/account-erasure.service.ts +4 -9
  928. package/src/modules/auth/account-switch-lock.ts +2 -2
  929. package/src/modules/auth/account.routes.ts +3 -3
  930. package/src/modules/auth/auth.middleware.ts +45 -4
  931. package/src/modules/auth/auth.routes.ts +46 -29
  932. package/src/modules/auth/auth.service.ts +139 -38
  933. package/src/modules/auth/index.ts +5 -0
  934. package/src/modules/auth/oidc-auth-provider.ts +3 -10
  935. package/src/modules/code-mode/code-mode.tool.ts +1 -1
  936. package/src/modules/connection-probe/connection-probe.service.ts +3 -6
  937. package/src/modules/database/__tests__/legacy-change-request-body.test.ts +118 -0
  938. package/src/modules/database/__tests__/legacy-request-bodies.pg.test.ts +258 -0
  939. package/src/modules/database/__tests__/pii-backfill.pg.test.ts +15 -18
  940. package/src/modules/database/__tests__/session-version-migration.pg.test.ts +133 -0
  941. package/src/modules/database/core-schema.ts +76 -36
  942. package/src/modules/database/index.ts +9 -0
  943. package/src/modules/database/migrate.ts +79 -3
  944. package/src/modules/declared-variables/__tests__/declared-variables.route.test.ts +44 -1
  945. package/src/modules/declared-variables/declared-variables.routes.ts +14 -3
  946. package/src/modules/diff/diff.routes.ts +5 -5
  947. package/src/modules/diff/diff.service.ts +2 -2
  948. package/src/modules/diff/index.ts +6 -0
  949. package/src/modules/embed/__tests__/embed.tools.test.ts +12 -0
  950. package/src/modules/embed/account-link.service.ts +2 -2
  951. package/src/modules/embed/embed.routes.ts +2 -2
  952. package/src/modules/embed/embed.service.ts +1 -1
  953. package/src/modules/embed/embed.tools.ts +11 -9
  954. package/src/modules/github-app/github-app.connection.ts +1 -1
  955. package/src/modules/github-app/github-app.routes.ts +3 -3
  956. package/src/modules/kb-fs/__tests__/locking-filesystem.test.ts +25 -0
  957. package/src/modules/kb-fs/__tests__/repo-path.test.ts +53 -8
  958. package/src/modules/kb-fs/index.ts +13 -0
  959. package/src/modules/kb-fs/locking-filesystem.ts +8 -2
  960. package/src/modules/kb-fs/repo-path.ts +33 -7
  961. package/src/modules/kb-fs/tmp-ref.ts +81 -0
  962. package/src/modules/kb-sync/kb-sync.routes.ts +3 -3
  963. package/src/modules/kb-sync/kb-sync.service.ts +1 -1
  964. package/src/modules/kb-sync/sync-auth.ts +1 -1
  965. package/src/modules/kb-sync/sync-payload.ts +1 -1
  966. package/src/modules/marketplace/git-http.routes.ts +1 -1
  967. package/src/modules/marketplace/github-facade/github-facade-admin.routes.ts +1 -1
  968. package/src/modules/marketplace/github-facade/github-facade-codes.store.ts +2 -2
  969. package/src/modules/marketplace/github-facade/github-facade-credentials.service.ts +2 -2
  970. package/src/modules/marketplace/github-facade/github-facade.routes.ts +2 -2
  971. package/src/modules/marketplace/github-facade/github-facade.service.ts +2 -2
  972. package/src/modules/marketplace/marketplace-repo.service.ts +2 -2
  973. package/src/modules/mcp/__tests__/connect-as.pg.test.ts +137 -0
  974. package/src/modules/mcp/__tests__/mcp-auth.middleware.test.ts +29 -5
  975. package/src/modules/mcp/__tests__/mcp-routes-harness.ts +8 -0
  976. package/src/modules/mcp/__tests__/mcp.connect-as.test.ts +195 -0
  977. package/src/modules/mcp/__tests__/mcp.routes.connect-as.test.ts +192 -0
  978. package/src/modules/mcp/__tests__/oauth-consent.connect-as.test.ts +146 -0
  979. package/src/modules/mcp/__tests__/read-only-hint.e2e.test.ts +213 -0
  980. package/src/modules/mcp/index.ts +7 -0
  981. package/src/modules/mcp/mcp-auth.middleware.ts +25 -9
  982. package/src/modules/mcp/mcp.routes.ts +42 -8
  983. package/src/modules/mcp/mcp.service.ts +136 -29
  984. package/src/modules/mcp/oauth/bevel-oauth-provider.ts +48 -10
  985. package/src/modules/mcp/oauth/oauth-consent.routes.ts +42 -2
  986. package/src/modules/onboarding/onboarding.routes.ts +1 -1
  987. package/src/modules/onboarding/starter-pack.service.ts +5 -6
  988. package/src/modules/plugins/__tests__/bundle-dialect.e2e.test.ts +2 -1
  989. package/src/modules/plugins/__tests__/plugin-links.service.test.ts +2 -1
  990. package/src/modules/plugins/__tests__/plugins.tools.test.ts +38 -2
  991. package/src/modules/plugins/compile/compile-marketplace.ts +2 -2
  992. package/src/modules/plugins/compile/marketplace-compiler.service.ts +3 -3
  993. package/src/modules/plugins/discovery/bundle-dialect/registry.ts +1 -1
  994. package/src/modules/plugins/index.ts +3 -1
  995. package/src/modules/plugins/join-proposals.ts +2 -2
  996. package/src/modules/plugins/join-request-jobs.service.ts +3 -3
  997. package/src/modules/plugins/join-request-records.store.ts +2 -2
  998. package/src/modules/plugins/join-requests.service.ts +4 -4
  999. package/src/modules/plugins/plugin-links.service.ts +10 -11
  1000. package/src/modules/plugins/plugin-links.ts +23 -6
  1001. package/src/modules/plugins/plugin-provision.service.ts +4 -5
  1002. package/src/modules/plugins/plugin-rename.service.ts +3 -3
  1003. package/src/modules/plugins/plugins.contract.ts +1 -1
  1004. package/src/modules/plugins/plugins.routes.ts +39 -8
  1005. package/src/modules/plugins/plugins.service.ts +5 -5
  1006. package/src/modules/plugins/plugins.tools.ts +4 -4
  1007. package/src/modules/plugins/teams.routes.ts +3 -3
  1008. package/src/modules/secrets-vault/__tests__/connect-pending.route.test.ts +113 -0
  1009. package/src/modules/secrets-vault/db-secrets-vault.service.ts +2 -2
  1010. package/src/modules/secrets-vault/index.ts +2 -0
  1011. package/src/modules/secrets-vault/secrets-vault.routes.ts +27 -7
  1012. package/src/modules/settings/__tests__/deployment-settings.service.test.ts +88 -1
  1013. package/src/modules/settings/connection-check.ts +1 -1
  1014. package/src/modules/settings/deployment-settings.service.ts +44 -4
  1015. package/src/modules/settings/git-root-folders.ts +1 -1
  1016. package/src/modules/settings/index.ts +12 -0
  1017. package/src/modules/settings/setup.routes.ts +5 -4
  1018. package/src/modules/skills/__tests__/allowed-tools-warn.tools.test.ts +2 -2
  1019. package/src/modules/skills/__tests__/skill-access-requests.routes.test.ts +6 -3
  1020. package/src/modules/skills/__tests__/skills.service.test.ts +34 -0
  1021. package/src/modules/skills/allowed-tools-check.ts +2 -6
  1022. package/src/modules/skills/index.ts +9 -2
  1023. package/src/modules/skills/pending-skills.service.ts +3 -4
  1024. package/src/modules/skills/skill-access-requests.routes.ts +10 -17
  1025. package/src/modules/skills/skills.contract.ts +17 -0
  1026. package/src/modules/skills/skills.routes.ts +1 -1
  1027. package/src/modules/skills/skills.service.ts +7 -3
  1028. package/src/modules/skills/skills.tools.ts +49 -22
  1029. package/src/modules/tool-auth/__tests__/external-api-key.service.test.ts +4 -0
  1030. package/src/modules/tool-auth/connection-key-rejection.ts +1 -1
  1031. package/src/modules/tool-auth/connection-keys-admin.routes.ts +2 -2
  1032. package/src/modules/tool-auth/external-api-key.interface.ts +11 -1
  1033. package/src/modules/tool-auth/external-api-key.service.ts +7 -4
  1034. package/src/modules/tool-auth/index.ts +14 -0
  1035. package/src/modules/tool-auth/internal-token.service.ts +10 -0
  1036. package/src/modules/tool-auth/tool-auth.middleware.ts +48 -6
  1037. package/src/modules/tool-helpers/__tests__/agent-roles-write.test.ts +2 -2
  1038. package/src/modules/tool-helpers/__tests__/can-write.tools.test.ts +5 -3
  1039. package/src/modules/tool-helpers/__tests__/phase4-tools.test.ts +2 -2
  1040. package/src/modules/tool-helpers/default-branch-write.ts +1 -1
  1041. package/src/modules/tool-helpers/index.ts +5 -1
  1042. package/src/modules/tool-helpers/route-argument-check.ts +1 -1
  1043. package/src/modules/tool-helpers/route-tool-schemas.ts +1 -1
  1044. package/src/modules/tool-helpers/tool-context.ts +18 -10
  1045. package/src/modules/tool-helpers/tool-def.ts +7 -3
  1046. package/src/modules/tool-helpers/tool-handler.ts +36 -2
  1047. package/src/modules/tool-helpers/tool.contract.ts +12 -2
  1048. package/src/modules/tool-helpers/validate-token.ts +5 -4
  1049. package/src/modules/tool-manuals/__tests__/tool-manuals.archive.route.test.ts +80 -4
  1050. package/src/modules/tool-manuals/__tests__/tool-manuals.service.test.ts +42 -0
  1051. package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +3 -3
  1052. package/src/modules/tool-manuals/index.ts +12 -2
  1053. package/src/modules/tool-manuals/mcp-server-edit.service.ts +2 -2
  1054. package/src/modules/tool-manuals/pending-tools.service.ts +2 -2
  1055. package/src/modules/tool-manuals/tool-delete.service.ts +5 -6
  1056. package/src/modules/tool-manuals/tool-manuals.contract.ts +18 -6
  1057. package/src/modules/tool-manuals/tool-manuals.routes.ts +45 -8
  1058. package/src/modules/tool-manuals/tool-manuals.service.ts +34 -18
  1059. package/src/modules/tool-manuals/tool-manuals.tools.ts +32 -17
  1060. package/src/modules/tool-registry/__tests__/read-only-hints.test.ts +439 -0
  1061. package/src/modules/tool-registry/__tests__/tool-description-length.test.ts +2 -2
  1062. package/src/modules/tool-registry/__tests__/tool-registry.test.ts +9 -2
  1063. package/src/modules/tool-registry/description-length.ts +2 -2
  1064. package/src/modules/tool-registry/index.ts +22 -0
  1065. package/src/modules/tool-registry/manual.routes.ts +38 -11
  1066. package/src/modules/tool-registry/read-only-hints.contract.ts +54 -0
  1067. package/src/modules/tool-registry/read-only-hints.ts +225 -0
  1068. package/src/modules/tool-registry/tool.contract.ts +18 -0
  1069. package/src/modules/update-check/update-check.routes.ts +2 -2
  1070. package/src/modules/workflow/__tests__/event-bus.test.ts +14 -2
  1071. package/src/modules/workflow/__tests__/events-delivery.test.ts +778 -0
  1072. package/src/modules/workflow/__tests__/workflow.service.facade.test.ts +85 -22
  1073. package/src/modules/workflow/__tests__/workflow.service.sync.test.ts +1 -1
  1074. package/src/modules/workflow/__tests__/workflow.service.update-change-request.pg.test.ts +120 -0
  1075. package/src/modules/workflow/__tests__/workflow.service.update-change-request.test.ts +346 -0
  1076. package/src/modules/workflow/agent-tools/__tests__/change-request-read-shape.test.ts +32 -209
  1077. package/src/modules/workflow/agent-tools/__tests__/change-request-read.tools.test.ts +16 -245
  1078. package/src/modules/workflow/agent-tools/__tests__/update-change-request.parity.test.ts +306 -0
  1079. package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +87 -60
  1080. package/src/modules/workflow/agent-tools/change-request-read-shape.ts +18 -153
  1081. package/src/modules/workflow/agent-tools/change-request-read.tools.ts +24 -96
  1082. package/src/modules/workflow/agent-tools/change-request-summary.ts +16 -2
  1083. package/src/modules/workflow/agent-tools/workflow.tools.ts +63 -84
  1084. package/src/modules/workflow/change-request-hooks.ts +1 -1
  1085. package/src/modules/workflow/event-bus.ts +3 -1
  1086. package/src/modules/workflow/events-delivery.ts +278 -0
  1087. package/src/modules/workflow/events.routes.ts +30 -9
  1088. package/src/modules/workflow/file-lock.service.ts +2 -2
  1089. package/src/modules/workflow/git/__tests__/git.service.list-branches.test.ts +130 -3
  1090. package/src/modules/workflow/git/__tests__/pull-request.service.getPrDetail.test.ts +24 -9
  1091. package/src/modules/workflow/git/git.service.ts +34 -56
  1092. package/src/modules/workflow/git/node-git-runner.ts +1 -1
  1093. package/src/modules/workflow/git/pull-request.service.ts +34 -29
  1094. package/src/modules/workflow/index.ts +15 -2
  1095. package/src/modules/workflow/pending-commits.service.ts +2 -2
  1096. package/src/modules/workflow/read-on-branch.ts +1 -1
  1097. package/src/modules/workflow/recovery-bot.ts +2 -2
  1098. package/src/modules/workflow/review-workflow/approval-lock.ts +1 -1
  1099. package/src/modules/workflow/review-workflow/review-workflow.interface.ts +3 -35
  1100. package/src/modules/workflow/review-workflow/review-workflow.service.ts +6 -165
  1101. package/src/modules/workflow/workflow.routes.ts +46 -100
  1102. package/src/modules/workflow/workflow.service.ts +277 -191
  1103. package/src/modules/workspace/__tests__/agent-downloads.test.ts +2 -1
  1104. package/src/modules/workspace/__tests__/agent-uploads.test.ts +87 -1
  1105. package/src/modules/workspace/__tests__/escape-sequences.routes.test.ts +2 -1
  1106. package/src/modules/workspace/__tests__/file-stat-access.test.ts +2 -1
  1107. package/src/modules/workspace/__tests__/git-internals.security.test.ts +4 -3
  1108. package/src/modules/workspace/__tests__/holds-nul.test.ts +66 -0
  1109. package/src/modules/workspace/__tests__/rest-tool-arguments.test.ts +5 -4
  1110. package/src/modules/workspace/__tests__/ripgrep-search.test.ts +570 -0
  1111. package/src/modules/workspace/__tests__/ripgrep-version.test.ts +29 -0
  1112. package/src/modules/workspace/__tests__/worker-pool.test.ts +118 -0
  1113. package/src/modules/workspace/__tests__/workspace-paths-inside-the-repo.test.ts +3 -2
  1114. package/src/modules/workspace/__tests__/workspace-tmp.tools.test.ts +928 -0
  1115. package/src/modules/workspace/__tests__/workspace.routes.read-gate.test.ts +17 -37
  1116. package/src/modules/workspace/__tests__/workspace.service.ensure-remotes-fetched.test.ts +30 -0
  1117. package/src/modules/workspace/__tests__/workspace.service.read-filter.test.ts +20 -8
  1118. package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +4 -3
  1119. package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +24 -11
  1120. package/src/modules/workspace/__tests__/workspace.tools.test.ts +423 -117
  1121. package/src/modules/workspace/agent-access.gate.ts +3 -3
  1122. package/src/modules/workspace/agent-download.builder.ts +1 -1
  1123. package/src/modules/workspace/agent-upload.routes.ts +19 -0
  1124. package/src/modules/workspace/agent-upload.store.ts +18 -0
  1125. package/src/modules/workspace/file-readers/README.md +9 -0
  1126. package/src/modules/workspace/file-readers/__tests__/doc-extract.service.test.ts +175 -0
  1127. package/src/modules/workspace/file-readers/__tests__/doc-extract.test.ts +21 -16
  1128. package/src/modules/workspace/file-readers/__tests__/extract-in-worker.test.ts +229 -0
  1129. package/src/modules/workspace/file-readers/__tests__/file-reader.registry.test.ts +2 -1
  1130. package/src/modules/workspace/file-readers/__tests__/fixtures/damaged-pdf.ts +34 -0
  1131. package/src/modules/workspace/file-readers/__tests__/fixtures/misbehaving-extract.worker.ts +57 -0
  1132. package/src/modules/workspace/file-readers/__tests__/fixtures/pdf-in-trouble.worker.ts +20 -0
  1133. package/src/modules/workspace/file-readers/__tests__/fixtures/unloadable-extract.worker.ts +2 -0
  1134. package/src/modules/workspace/file-readers/doc-extract.service.ts +144 -36
  1135. package/src/modules/workspace/file-readers/doc-extract.types.ts +13 -3
  1136. package/src/modules/workspace/file-readers/document-extractor.contract.ts +42 -0
  1137. package/src/modules/workspace/file-readers/document-extractors.ts +28 -0
  1138. package/src/modules/workspace/file-readers/document-formats.ts +13 -0
  1139. package/src/modules/workspace/file-readers/document-reader.ts +40 -36
  1140. package/src/modules/workspace/file-readers/extract-in-worker.ts +183 -0
  1141. package/src/modules/workspace/file-readers/extract-pdf.ts +23 -4
  1142. package/src/modules/workspace/file-readers/extract.worker.ts +5 -0
  1143. package/src/modules/workspace/file-readers/extraction-cache.ts +33 -12
  1144. package/src/modules/workspace/file-readers/extraction-worker.ts +86 -0
  1145. package/src/modules/workspace/file-readers/file-reader.registry.ts +6 -20
  1146. package/src/modules/workspace/file-readers/file-reader.ts +14 -4
  1147. package/src/modules/workspace/first-run.ts +1 -1
  1148. package/src/modules/workspace/git-internals.middleware.ts +1 -1
  1149. package/src/modules/workspace/index.ts +37 -0
  1150. package/src/modules/workspace/kb-repository.ts +3 -2
  1151. package/src/modules/workspace/not-found.ts +1 -1
  1152. package/src/modules/workspace/nul-scan.ts +50 -0
  1153. package/src/modules/workspace/pattern-matcher.contract.ts +124 -33
  1154. package/src/modules/workspace/ripgrep-search.ts +715 -0
  1155. package/src/modules/workspace/ripgrep-version.ts +35 -0
  1156. package/src/modules/workspace/routine-write-policy.ts +1 -1
  1157. package/src/modules/workspace/startup/__tests__/beside-checkout.test.ts +11 -0
  1158. package/src/modules/workspace/startup/beside-checkout.ts +13 -5
  1159. package/src/modules/workspace/startup/kb-git.ts +1 -1
  1160. package/src/modules/workspace/startup/kb-startup-runner.ts +1 -2
  1161. package/src/modules/workspace/startup/steps/groups-to-plugins.step.ts +3 -3
  1162. package/src/modules/workspace/startup/steps/personal-spaces.step.ts +2 -2
  1163. package/src/modules/workspace/startup/steps/plugin-layout.ts +1 -1
  1164. package/src/modules/workspace/startup/steps/roles-yaml.step.ts +1 -1
  1165. package/src/modules/workspace/startup/steps/seed-tree.ts +2 -2
  1166. package/src/modules/workspace/startup/steps/template-files.step.ts +2 -2
  1167. package/src/modules/workspace/startup/steps/template-source.ts +2 -2
  1168. package/src/modules/workspace/worker-pool.ts +192 -0
  1169. package/src/modules/workspace/workspace-tmp.ts +457 -0
  1170. package/src/modules/workspace/workspace.routes.ts +15 -39
  1171. package/src/modules/workspace/workspace.service.ts +96 -22
  1172. package/src/modules/workspace/workspace.tools.ts +550 -186
  1173. package/src/modules/workspace/write-denial.ts +4 -5
  1174. package/src/modules/write-access/index.ts +7 -0
  1175. package/src/shared/__tests__/module-boundaries.lint.test.ts +301 -0
  1176. package/src/shared/path-order.ts +37 -8
  1177. package/starter-packs/engineering/Plugins/engineering-starter/access.md +1 -1
  1178. package/starter-packs/general/Plugins/general-starter/access.md +1 -1
  1179. package/starter-packs/operations/Plugins/operations-starter/access.md +1 -1
  1180. package/starter-packs/sales/Plugins/sales-starter/access.md +1 -1
  1181. package/starter-packs/support/Plugins/support-starter/access.md +1 -1
  1182. package/dist/modules/workspace/bounded-matcher.d.ts +0 -79
  1183. package/dist/modules/workspace/bounded-matcher.d.ts.map +0 -1
  1184. package/dist/modules/workspace/bounded-matcher.js +0 -261
  1185. package/dist/modules/workspace/bounded-matcher.js.map +0 -1
  1186. package/src/modules/workflow/__tests__/format-affected-owners.test.ts +0 -85
  1187. package/src/modules/workspace/__tests__/bounded-matcher.test.ts +0 -213
  1188. package/src/modules/workspace/bounded-matcher.ts +0 -328
@@ -8,13 +8,14 @@ import AdmZip from 'adm-zip';
8
8
  import express from 'express';
9
9
  import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
10
10
  import { testKbContext } from '../../../__tests__/kb-context.js';
11
+ import { slowRipgrep } from '../../../__tests__/slow-ripgrep.js';
11
12
  import { LocalFilesystem } from '@mastra/core/workspace';
12
13
  import { ToolRegistry } from '../../tool-registry/tool-registry.js';
13
14
  import { createToolHandlerFactory } from '../../tool-helpers/tool-handler.js';
14
15
  import { ToolError, type ToolContext } from '../../tool-helpers/tool.contract.js';
15
16
  import type { ToolAuth } from '../../tool-auth/tool-auth.middleware.js';
16
17
  import { registerWorkspaceTools } from '../workspace.tools.js';
17
- import { WorkerPatternMatcher, type WorkerPatternMatcherOptions } from '../bounded-matcher.js';
18
+ import { RipgrepPatternMatcher, type RipgrepPatternMatcherOptions } from '../index.js';
18
19
  import { sharedFileRules, sharedFileRulesSection } from '../../agent-instructions/shared-file-rules.js';
19
20
  import { composeAgentGuide } from '../../agent-guide/agent-guide.js';
20
21
  import { GUIDE_FIRST_SENTENCE } from '../../tool-registry/guide-first.js';
@@ -25,6 +26,7 @@ import { WorkflowHooks, type AgentOperationContext } from '../../workflow/workfl
25
26
  import { SESSION_ID_DESCRIPTION, ToolDescriptionNotes } from '../agent-access.gate.js';
26
27
  import { SpillStore } from '../spill-store.js';
27
28
  import { DocExtractService } from '../file-readers/doc-extract.service.js';
29
+ import { WorkerDocumentExtractor } from '../file-readers/extract-in-worker.js';
28
30
  import { OCTET_STREAM_FALLBACK_NOTE } from '../file-readers/content-mode.js';
29
31
  import type { IAccessControl } from '../../access/access-control.interface.js';
30
32
  import { AccessControlService } from '../../access/access-control.service.js';
@@ -143,8 +145,13 @@ let raceHook: (() => Promise<void>) | null = null;
143
145
  * The grep matcher `start()` wires, built from `matcherOptions` (the
144
146
  * defaults, unless a test narrows the pool) and closed after each test.
145
147
  */
146
- let patternMatcher: WorkerPatternMatcher | undefined;
147
- let matcherOptions: WorkerPatternMatcherOptions = {};
148
+ let patternMatcher: RipgrepPatternMatcher | undefined;
149
+ /**
150
+ * The document extractor `start()` wires, closed after each test: its workers
151
+ * are made lazily, and `unref()` lets the process exit but keeps them alive.
152
+ */
153
+ let docExtractor: WorkerDocumentExtractor | undefined;
154
+ let matcherOptions: RipgrepPatternMatcherOptions = {};
148
155
 
149
156
  async function start(
150
157
  scope: 'read' | 'write' = 'write',
@@ -154,7 +161,10 @@ async function start(
154
161
  ): Promise<string> {
155
162
  raceHook = null;
156
163
  await patternMatcher?.close();
157
- patternMatcher = new WorkerPatternMatcher(matcherOptions);
164
+ patternMatcher = new RipgrepPatternMatcher(matcherOptions);
165
+ await docExtractor?.close();
166
+ const extractor = new WorkerDocumentExtractor();
167
+ docExtractor = extractor;
158
168
  hooks = new WorkflowHooks();
159
169
  notes = new ToolDescriptionNotes();
160
170
  callerSource = 'internal';
@@ -309,7 +319,7 @@ async function start(
309
319
  const app = express();
310
320
  app.use(express.json());
311
321
  const router = express.Router();
312
- registerWorkspaceTools(registry, router, fakeAuth, toolHandler, new SpillStore(join(tmpdir(), 'bevel-test-spills')), new DocExtractService(docCacheDir), access, testKbContext({ kbDirName: KB_DIR }), {
322
+ registerWorkspaceTools(registry, router, fakeAuth, toolHandler, new SpillStore(join(tmpdir(), 'bevel-test-spills')), new DocExtractService(docCacheDir, extractor), access, testKbContext({ kbDirName: KB_DIR }), {
313
323
  // The hooks and the notes a test registers against; with neither
314
324
  // registered (the default, and every Hexis-only deployment) the gate
315
325
  // refuses nothing and the descriptions say nothing extra.
@@ -354,6 +364,8 @@ afterEach(async () => {
354
364
  httpServer = undefined;
355
365
  await patternMatcher?.close();
356
366
  patternMatcher = undefined;
367
+ await docExtractor?.close();
368
+ docExtractor = undefined;
357
369
  if (tempDir) {
358
370
  await rm(tempDir, { recursive: true, force: true });
359
371
  tempDir = '';
@@ -1004,6 +1016,10 @@ describe("the agent guide at the guide's name", () => {
1004
1016
  expect((await grep(base, 'needle', 'AGENTS.md')).matches).toEqual([{ path: GUIDE, line: 3, text: 'Name every needle you plant.' }]);
1005
1017
  // A search under a folder does not reach a file that is not under it.
1006
1018
  expect((await grep(base, 'needle', `${KB_DIR}/Handbook`)).matches.map((m) => m.path)).toEqual([`${KB_DIR}/Handbook/a.md`]);
1019
+ // A folder named with a trailing slash answers the same paths, spelled
1020
+ // once, and the guide once.
1021
+ expect((await grep(base, 'needle', `${KB_DIR}/Handbook/`)).matches.map((m) => m.path)).toEqual([`${KB_DIR}/Handbook/a.md`]);
1022
+ expect((await grep(base, 'needle', `${KB_DIR}/`)).matches).toEqual(fromRoot.matches);
1007
1023
 
1008
1024
  // With the knowledge base's own AGENTS.md, the search covers the composed
1009
1025
  // text — the own file first, then the guide — and once: the walk's own
@@ -1018,17 +1034,18 @@ describe("the agent guide at the guide's name", () => {
1018
1034
  ]);
1019
1035
  expect((await grep(base, 'needle', GUIDE)).matches).toEqual(composed);
1020
1036
 
1021
- // The own file does not use up `max_results` twice: the walk leaves it to
1022
- // the composed search, so a file later in the tree is still reached when
1023
- // the own file alone has more matches than the cap. Without that, the
1024
- // walk filled the cap from AGENTS.md, those matches were dropped as
1025
- // duplicates, and Handbook/ was never searched.
1037
+ // The own file does not use up `max_results` twice: the tree search
1038
+ // leaves it to the composed search, so its lines are counted once and the
1039
+ // file after it in path order is still reached. Counted twice, its five
1040
+ // lines and their duplicates would fill a cap of seven, and Handbook/
1041
+ // would be cut.
1026
1042
  await fs.writeFile(`${KB_DIR}/AGENTS.md`, `# Acme\n\n${'needle\n'.repeat(5)}`);
1027
- const capped = (await (await post(`${base}/api/agent/tools/grep`, { pattern: 'needle', max_results: 3 })).json()) as {
1028
- matches: { path: string }[];
1043
+ const capped = (await (await post(`${base}/api/agent/tools/grep`, { pattern: 'needle', max_results: 7 })).json()) as {
1044
+ matches: { path: string; line: number }[];
1029
1045
  };
1030
- expect(capped.matches.map((m) => m.path)).toContain(`${KB_DIR}/Handbook/a.md`);
1031
- expect(capped.matches).toHaveLength(3);
1046
+ // Five lines of the own file and the guide's one, then the file after it.
1047
+ expect(capped.matches.map((m) => m.path)).toEqual([...Array<string>(6).fill(GUIDE), `${KB_DIR}/Handbook/a.md`]);
1048
+ expect(new Set(capped.matches.map((m) => `${m.path}:${m.line}`)).size).toBe(7);
1032
1049
  await fs.writeFile(`${KB_DIR}/AGENTS.md`, '# Acme\n\nOur needle rule.\n');
1033
1050
 
1034
1051
  // A caller who may not read the own file searches the guide alone, from
@@ -1181,6 +1198,22 @@ describe('grep with a path that names a file', () => {
1181
1198
  }
1182
1199
  });
1183
1200
 
1201
+ it('a named text file answers the lines a folder search answers from it, valid UTF-8 lines of a file holding others included', async () => {
1202
+ const base = await start();
1203
+ await fs.writeFile(`${KB_DIR}/mixed/latin.txt`, Buffer.concat([Buffer.from('needle \xff\n', 'latin1'), Buffer.from('needle ok\n')]));
1204
+ const named = await grep(base, { pattern: 'needle', path: `${KB_DIR}/mixed/latin.txt` });
1205
+ const folder = await grep(base, { pattern: 'needle', path: `${KB_DIR}/mixed` });
1206
+ expect(named.matches).toEqual([{ path: `${KB_DIR}/mixed/latin.txt`, line: 2, text: 'needle ok' }]);
1207
+ expect(named.matches).toEqual(folder.matches);
1208
+ expect(named.note).toBeUndefined();
1209
+ // A line that is not UTF-8 counts toward ripgrep's cap, yet the line after it is still answered.
1210
+ for (const path of [`${KB_DIR}/mixed/latin.txt`, `${KB_DIR}/mixed`]) {
1211
+ const one = await grep(base, { pattern: 'needle', path, max_results: 1 });
1212
+ expect(one.matches).toEqual([{ path: `${KB_DIR}/mixed/latin.txt`, line: 2, text: 'needle ok' }]);
1213
+ expect(one.truncated).toBe(true);
1214
+ }
1215
+ });
1216
+
1184
1217
  it('a path with nothing at it fails with an error naming the path — never an empty success', async () => {
1185
1218
  const base = await start();
1186
1219
  const res = await post(`${base}/api/agent/tools/grep`, { pattern: 'needle', path: `${KB_DIR}/notes/ghost.md` });
@@ -1267,119 +1300,356 @@ describe('grep with a path that names a file', () => {
1267
1300
  });
1268
1301
 
1269
1302
  /**
1270
- * A caller's pattern runs off the event loop under a budget (WorkerPatternMatcher):
1271
- * one that backtracks for ever is stopped with a worded 400, and every other
1272
- * request keeps being served meanwhile — here, a `read_file` on the same
1273
- * server, which shares the one loop the pattern used to hold.
1303
+ * grep runs ripgrep (RipgrepPatternMatcher), as a child process: the pattern
1304
+ * is ripgrep's default engine's to judge, a search is stopped at its budget
1305
+ * while every other request keeps being served, and the walk covers every
1306
+ * text file the caller may read — hidden, git-ignored and untracked alike —
1307
+ * without following a link or entering `.git`.
1274
1308
  */
1275
- describe('a pattern too expensive to match', () => {
1276
- const LONG_LINE = `${'a'.repeat(39)}!`;
1309
+ describe('grep runs ripgrep', () => {
1310
+ type GrepBody = { matches: { path: string; line: number; text: string }[]; truncated: boolean; note?: string; error?: string; code?: string };
1311
+ const grep = async (base: string, body: Record<string, unknown>): Promise<{ status: number; body: GrepBody }> => {
1312
+ const res = await post(`${base}/api/agent/tools/grep`, body);
1313
+ return { status: res.status, body: (await res.json()) as GrepBody };
1314
+ };
1315
+ const git = (...args: string[]) => promisify(execFile)('git', args, { cwd: join(tempDir, KB_DIR) });
1316
+
1317
+ it('stops a search at its 5 s budget with the 400 "too expensive", leaves no ripgrep running, and serves other calls meanwhile', async () => {
1318
+ const slow = await slowRipgrep();
1319
+ try {
1320
+ matcherOptions = {};
1321
+ const base = await start();
1322
+ await fs.writeFile(`${KB_DIR}/hit.md`, 'needle\n');
1323
+ const started = Date.now();
1324
+ const searching = grep(base, { pattern: 'needle' }).then((r) => ({ ...r, took: Date.now() - started }));
1325
+ // Probe while the search runs: each read must answer well within a second.
1326
+ const probes: number[] = [];
1327
+ let done = false;
1328
+ void searching.finally(() => (done = true));
1329
+ while (!done) {
1330
+ const t = Date.now();
1331
+ const res = await post(`${base}/api/agent/tools/read_file`, { path: `${KB_DIR}/a.md` });
1332
+ expect(res.status).toBe(200);
1333
+ probes.push(Date.now() - t);
1334
+ await new Promise((r) => setTimeout(r, 100));
1335
+ }
1336
+ const { status, body, took } = await searching;
1337
+ expect(status).toBe(400);
1338
+ expect(body.code).toBe('pattern_too_expensive');
1339
+ expect(body.error).toMatch(/^Pattern too expensive: /);
1340
+ expect(body.error).toContain("this search's 5 s budget");
1341
+ expect(took).toBeGreaterThanOrEqual(5_000);
1342
+ expect(took).toBeLessThan(5_000 + 2_000);
1343
+ expect(probes.length).toBeGreaterThan(10);
1344
+ expect(Math.max(...probes)).toBeLessThan(1_000);
1345
+ expect(await slow.alive()).toEqual([]);
1346
+ } finally {
1347
+ await slow.remove();
1348
+ }
1349
+ }, 15_000);
1350
+
1351
+ it('answers 503 when every search slot is taken and the queue is full, rather than an incomplete result', async () => {
1352
+ const slow = await slowRipgrep();
1353
+ try {
1354
+ matcherOptions = { budgetMs: 1_000, maxRunning: 1, maxWaiting: 1 };
1355
+ const base = await start();
1356
+ await fs.writeFile(`${KB_DIR}/hit.md`, 'needle\n');
1357
+ const holding = grep(base, { pattern: 'needle' }).then((r) => r.status);
1358
+ while ((await slow.alive()).length === 0) await new Promise((r) => setTimeout(r, 20));
1359
+ const queued = grep(base, { pattern: 'needle' }).then((r) => r.status);
1360
+ await new Promise((r) => setTimeout(r, 100));
1361
+ const refused = await grep(base, { pattern: 'needle' });
1362
+ expect(refused.status).toBe(503);
1363
+ expect(refused.body.code).toBe('search_busy');
1364
+ expect(await Promise.all([holding, queued])).toEqual([400, 400]);
1365
+ expect(await slow.alive()).toEqual([]);
1366
+ // A slot is free again: with the real ripgrep back, a search answers.
1367
+ await slow.remove();
1368
+ const after = await grep(base, { pattern: 'needle', path: `${KB_DIR}/hit.md` });
1369
+ expect(after.status).toBe(200);
1370
+ expect(after.body.matches).toEqual([{ path: `${KB_DIR}/hit.md`, line: 1, text: 'needle' }]);
1371
+ } finally {
1372
+ await slow.remove();
1373
+ }
1374
+ });
1375
+
1376
+ it.each([
1377
+ ['look-ahead', 'foo(?=bar)', /look-around/],
1378
+ ['look-behind', '(?<=foo)bar', /look-around/],
1379
+ ['a backreference', '(a)\\1', /backreferences are not supported/],
1380
+ ['invalid syntax', 'a(', /unclosed group/],
1381
+ ])('refuses %s with a 400 quoting ripgrep and naming the dialect, whatever path it names', async (_what, pattern, reason) => {
1382
+ const base = await start();
1383
+ await fs.writeFile(`${KB_DIR}/img.png`, Buffer.from([0x89, 0x50, 0x4e, 0x47, 0, 0, 0]));
1384
+ for (const path of [undefined, `${KB_DIR}/a.md`, `${KB_DIR}/img.png`]) {
1385
+ const res = await grep(base, path === undefined ? { pattern } : { pattern, path });
1386
+ expect(res.status).toBe(400);
1387
+ expect(res.body.code).toBe('invalid_pattern');
1388
+ expect(res.body.error).toMatch(/^Invalid regex: /);
1389
+ expect(res.body.error).toMatch(reason);
1390
+ expect(res.body.error).toContain('RE2-style patterns: no look-around and no backreferences');
1391
+ // ripgrep's advice to pass a flag the caller cannot pass is not repeated.
1392
+ expect(res.body.error).not.toContain('--pcre2');
1393
+ }
1394
+ });
1395
+
1396
+ it('the description and the pattern input say which patterns the engine takes', async () => {
1397
+ await start();
1398
+ const def = (await toolRegistry.listInternal()).find((t) => t.name === 'grep');
1399
+ expect(def?.description).toContain("grep runs ripgrep's default regex engine, which takes RE2-style patterns: no look-around and no backreferences.");
1400
+ expect(JSON.stringify(def?.inputSchema ?? def)).toContain('RE2-style (ripgrep): no look-around, no backreferences.');
1401
+ });
1277
1402
 
1278
- it('answers 400 "too expensive" fast over a 40-character line, while other calls stay under a second', async () => {
1403
+ it('a pattern that backtracks for ever in JavaScript is answered at once: the engine does not backtrack', async () => {
1279
1404
  const base = await start();
1280
- await fs.writeFile(`${KB_DIR}/redos.md`, `intro\n${LONG_LINE}\n`);
1405
+ const longLine = `${'a'.repeat(5_000)}!`;
1406
+ await fs.writeFile(`${KB_DIR}/redos.md`, `intro\n${longLine}\n`);
1281
1407
  const started = Date.now();
1282
- const searching = post(`${base}/api/agent/tools/grep`, { pattern: '^(a+)+$', path: `${KB_DIR}/redos.md` }).then(
1283
- async (res) => ({ status: res.status, body: (await res.json()) as { error: string; code?: string }, took: Date.now() - started }),
1284
- );
1285
- // Probe while the search runs: each read must answer within a second.
1286
- const probes: number[] = [];
1287
- let done = false;
1288
- void searching.finally(() => (done = true));
1289
- while (!done) {
1290
- const t = Date.now();
1291
- const res = await post(`${base}/api/agent/tools/read_file`, { path: `${KB_DIR}/a.md` });
1408
+ const none = await grep(base, { pattern: '^(a+)+$' });
1409
+ expect(none.status).toBe(200);
1410
+ expect(none.body.matches).toEqual([]);
1411
+ const some = await grep(base, { pattern: '^a+!$', path: `${KB_DIR}/redos.md` });
1412
+ expect(some.body.matches).toEqual([{ path: `${KB_DIR}/redos.md`, line: 2, text: longLine.slice(0, 300) }]);
1413
+ expect(Date.now() - started).toBeLessThan(2_000);
1414
+ });
1415
+
1416
+ it('searches hidden, git-ignored and untracked files, never .git, and never through a link', async () => {
1417
+ const base = await start();
1418
+ const outside = await mkdtemp(join(tmpdir(), 'grep-outside-'));
1419
+ try {
1420
+ await writeFile(join(outside, 'secret.md'), 'needle from outside\n');
1421
+ await git('init', '-q');
1422
+ await fs.writeFile(`${KB_DIR}/.gitignore`, 'build/\nignored.md\n');
1423
+ await fs.writeFile(`${KB_DIR}/tracked.md`, 'needle tracked\n');
1424
+ await git('add', '.gitignore', 'tracked.md');
1425
+ await git('-c', 'user.email=t@x', '-c', 'user.name=t', 'commit', '-qm', 'init');
1426
+ await fs.writeFile(`${KB_DIR}/.notes.md`, 'needle hidden\n');
1427
+ await fs.writeFile(`${KB_DIR}/.hidden/deep.md`, 'needle in a hidden folder\n');
1428
+ await fs.writeFile(`${KB_DIR}/build/out.txt`, 'needle ignored folder\n');
1429
+ await fs.writeFile(`${KB_DIR}/ignored.md`, 'needle ignored file\n');
1430
+ await fs.writeFile(`${KB_DIR}/untracked.md`, 'needle untracked\n');
1431
+ await writeFile(join(tempDir, KB_DIR, '.git', 'needle-in-git'), 'needle git internals\n');
1432
+ await mkdir(join(tempDir, KB_DIR, 'sub', '.GIT'), { recursive: true });
1433
+ await writeFile(join(tempDir, KB_DIR, 'sub', '.GIT', 'x'), 'needle git internals\n');
1434
+ await symlink(join(outside, 'secret.md'), join(tempDir, KB_DIR, 'link.md'));
1435
+ await symlink(outside, join(tempDir, KB_DIR, 'linked-dir'));
1436
+ await fs.writeFile(`${KB_DIR}/binary.dat`, Buffer.concat([Buffer.from('needle in binary\n'), Buffer.from([0, 1, 2])]));
1437
+ const res = await grep(base, { pattern: 'needle' });
1292
1438
  expect(res.status).toBe(200);
1293
- probes.push(Date.now() - t);
1294
- await new Promise((r) => setTimeout(r, 50));
1439
+ expect(res.body.matches.map((m) => m.path)).toEqual([
1440
+ `${KB_DIR}/.hidden/deep.md`,
1441
+ `${KB_DIR}/.notes.md`,
1442
+ `${KB_DIR}/build/out.txt`,
1443
+ `${KB_DIR}/ignored.md`,
1444
+ `${KB_DIR}/tracked.md`,
1445
+ `${KB_DIR}/untracked.md`,
1446
+ ]);
1447
+ expect(JSON.stringify(res.body)).not.toContain('outside');
1448
+ expect(JSON.stringify(res.body)).not.toContain('git internals');
1449
+ } finally {
1450
+ await rm(outside, { recursive: true, force: true });
1295
1451
  }
1296
- const { status, body, took } = await searching;
1297
- expect(status).toBe(400);
1298
- expect(body.error).toMatch(/^Pattern too expensive: /);
1299
- expect(body.code).toBe('pattern_too_expensive');
1300
- expect(body.error).toContain("this search's 5 s budget");
1301
- expect(took).toBeLessThan(5_000 + 2_000);
1302
- expect(probes.length).toBeGreaterThan(0);
1303
- expect(Math.max(...probes)).toBeLessThan(1_000);
1304
1452
  });
1305
1453
 
1306
- it('stops it in a directory walk too, rather than skipping the file as unreadable', async () => {
1307
- const base = await start();
1308
- await fs.writeFile(`${KB_DIR}/redos.md`, `${LONG_LINE}\n`);
1309
- const res = await post(`${base}/api/agent/tools/grep`, { pattern: '^(a+)+$' });
1310
- expect(res.status).toBe(400);
1311
- expect(((await res.json()) as { error: string }).error).toMatch(/^Pattern too expensive: /);
1454
+ it('never answers a line from a file the caller may not read, nor counts it against max_results', async () => {
1455
+ const base = await start('read', denyReads(new Set(['a-secret.md', 'Locked/b.md'])));
1456
+ await fs.writeFile(`${KB_DIR}/a-secret.md`, 'needle 1\nneedle 2\nneedle 3\n');
1457
+ await fs.writeFile(`${KB_DIR}/Locked/b.md`, 'needle locked\n');
1458
+ await fs.writeFile(`${KB_DIR}/open.md`, 'needle open\n');
1459
+ const res = await grep(base, { pattern: 'needle', max_results: 1 });
1460
+ expect(res.body.matches).toEqual([{ path: `${KB_DIR}/open.md`, line: 1, text: 'needle open' }]);
1461
+ expect(res.body.truncated).toBe(true);
1312
1462
  });
1313
1463
 
1314
- it('answers a directory walk 503 when no worker is free, rather than skipping every file as unreadable', async () => {
1315
- // One worker and room for one search to wait: two expensive greps fill both.
1316
- matcherOptions = { budgetMs: 1_000, poolMax: 1, maxWaiting: 1 };
1464
+ // Four million matching lines: a file ripgrep searched would spend far more
1465
+ // than the 1.5 s budget answering them.
1466
+ const huge = 'needle\n'.repeat(4_000_000);
1467
+
1468
+ it('never searches a file the caller may not read, so what it holds cannot turn the answer into a 400', async () => {
1469
+ matcherOptions = { budgetMs: 1_500 };
1470
+ const base = await start('read', denyReads(new Set(['Locked/huge.md'])));
1471
+ await fs.writeFile(`${KB_DIR}/Locked/huge.md`, huge);
1472
+ await fs.writeFile(`${KB_DIR}/open.md`, 'needle open\n');
1473
+ const res = await grep(base, { pattern: 'needle' });
1474
+ expect(res.status).toBe(200);
1475
+ expect(res.body.matches).toEqual([{ path: `${KB_DIR}/open.md`, line: 1, text: 'needle open' }]);
1476
+ }, 20_000);
1477
+
1478
+ it('spends the budget on judging who may read what too: a verdict that outlasts it answers the 400 at the budget', async () => {
1479
+ matcherOptions = { budgetMs: 1_000 };
1480
+ // An access check that takes ten seconds, as a cold one over a large tree could.
1481
+ const slowAccess = {
1482
+ ...allowAll,
1483
+ canReadBatch: (_w: string, _u: string, paths: string[]) =>
1484
+ new Promise<Map<string, boolean>>((resolve) => setTimeout(() => resolve(new Map(paths.map((p) => [p, true]))), 10_000)),
1485
+ } as unknown as IAccessControl;
1486
+ const base = await start('read', slowAccess);
1487
+ await fs.writeFile(`${KB_DIR}/open.md`, 'needle open\n');
1488
+ const started = Date.now();
1489
+ const res = await grep(base, { pattern: 'needle' });
1490
+ expect(res.status).toBe(400);
1491
+ expect(res.body.code).toBe('pattern_too_expensive');
1492
+ expect(Date.now() - started).toBeLessThan(3_000);
1493
+ }, 20_000);
1494
+
1495
+ it('stops the search at the file that fills max_results, so what comes after it costs nothing', async () => {
1496
+ matcherOptions = { budgetMs: 1_500 };
1317
1497
  const base = await start();
1318
- await fs.writeFile(`${KB_DIR}/redos.md`, `${LONG_LINE}\n`);
1319
- await fs.writeFile(`${KB_DIR}/hit.md`, 'needle\n');
1320
- const expensive = () =>
1321
- post(`${base}/api/agent/tools/grep`, { pattern: '^(a+)+$', path: `${KB_DIR}/redos.md` }).then((r) => r.status);
1322
- const holding = expensive();
1323
- await new Promise((r) => setTimeout(r, 200));
1324
- const queued = expensive();
1325
- await new Promise((r) => setTimeout(r, 100));
1326
- const res = await post(`${base}/api/agent/tools/grep`, { pattern: 'needle' });
1327
- expect(res.status).toBe(503);
1328
- expect(((await res.json()) as { code?: string }).code).toBe('search_busy');
1329
- // The two that held the pool answered as they always would, and it serves again after.
1330
- expect(await Promise.all([holding, queued])).toEqual([400, 400]);
1331
- const after = await post(`${base}/api/agent/tools/grep`, { pattern: 'needle' });
1332
- expect(after.status).toBe(200);
1333
- });
1334
-
1335
- it('spends one budget across every file a search reads: each alone fits, all of them together do not', async () => {
1336
- // How long the pattern takes over one line IN A WORKER, which backtracks at
1337
- // its own pace, not this thread's: once on a fresh worker (`first`, which
1338
- // can be several times slower) and then again on the same one (`again`).
1339
- // Timed through a probe matcher of the same kind, on a line long enough
1340
- // that `again` is at least 50 ms.
1341
- let line = '';
1342
- let first = 0;
1343
- let again = 0;
1344
- for (let n = 16; again < 50; n++) {
1345
- line = `${'a'.repeat(n)}!`;
1346
- const probe = new WorkerPatternMatcher();
1347
- try {
1348
- await probe.search('x', '').matchingLines(['x'], 1); // the worker is up before anything is timed
1349
- let t = performance.now();
1350
- await probe.search('^(a+)+$', '').matchingLines([line], 1);
1351
- first = performance.now() - t;
1352
- t = performance.now();
1353
- await probe.search('^(a+)+$', '').matchingLines([line], 1);
1354
- again = performance.now() - t;
1355
- } finally {
1356
- await probe.close();
1357
- }
1498
+ await fs.writeFile(`${KB_DIR}/a.md`, 'needle first\n');
1499
+ await fs.writeFile(`${KB_DIR}/z/huge.md`, huge);
1500
+ const res = await grep(base, { pattern: 'needle', max_results: 1 });
1501
+ expect(res.status).toBe(200);
1502
+ expect(res.body.matches).toEqual([{ path: `${KB_DIR}/a.md`, line: 1, text: 'needle first' }]);
1503
+ expect(res.body.truncated).toBe(true);
1504
+ }, 20_000);
1505
+
1506
+ it('reads a file of millions of matching lines only as far as max_results, in a tree and named alone', async () => {
1507
+ matcherOptions = { budgetMs: 1_500 };
1508
+ const base = await start();
1509
+ await fs.writeFile(`${KB_DIR}/a/huge.md`, huge);
1510
+ await fs.writeFile(`${KB_DIR}/b.md`, 'needle b\n');
1511
+ const expected = Array.from({ length: 200 }, (_, i) => ({ path: `${KB_DIR}/a/huge.md`, line: i + 1, text: 'needle' }));
1512
+ for (const path of [KB_DIR, `${KB_DIR}/a/huge.md`]) {
1513
+ const res = await grep(base, { pattern: 'needle', path });
1514
+ expect(res.status).toBe(200);
1515
+ expect(res.body.matches).toEqual(expected);
1516
+ expect(res.body.truncated).toBe(true);
1358
1517
  }
1359
- // A budget well above what any one file costs, and enough files that
1360
- // together they cost about twice the budget.
1361
- const budgetMs = Math.ceil(Math.max(first, again) * 1.5) + 200;
1362
- const files = Math.ceil((2 * budgetMs) / again);
1363
- matcherOptions = { budgetMs };
1518
+ }, 20_000);
1519
+
1520
+ it('a named file whose only NUL lies past the first 64 KB has no searchable text; the same length of text has no matches and no note', async () => {
1521
+ matcherOptions = {};
1364
1522
  const base = await start();
1365
- for (let i = 1; i <= files; i++) await fs.writeFile(`${KB_DIR}/slow-${String(i).padStart(3, '0')}.md`, `${line}\n`);
1366
- const all = await post(`${base}/api/agent/tools/grep`, { pattern: '^(a+)+$' });
1367
- expect(all.status).toBe(400);
1368
- const body = (await all.json()) as { error: string; code?: string };
1369
- expect(body.code).toBe('pattern_too_expensive');
1370
- expect(body.error).toMatch(/^Pattern too expensive: /);
1371
- // Any one of the same files, searched alone, fits the same budget.
1372
- const one = await post(`${base}/api/agent/tools/grep`, { pattern: '^(a+)+$', path: `${KB_DIR}/slow-001.md` });
1373
- expect(one.status).toBe(200);
1374
- expect(((await one.json()) as { matches: unknown[] }).matches).toEqual([]);
1375
- });
1376
-
1377
- it('a control pattern over the same line still matches', async () => {
1523
+ // ripgrep stops reading a file at the lines the answer can take, so a NUL
1524
+ // far past the pattern's last chance is found by the read that follows,
1525
+ // chunk by chunk — here in the fourth chunk.
1526
+ const filler = Buffer.alloc(200 * 1024, 'x');
1527
+ await fs.writeFile(`${KB_DIR}/late.md`, Buffer.concat([filler, Buffer.from([0])]));
1528
+ await fs.writeFile(`${KB_DIR}/plain.md`, filler);
1529
+ const binary = await grep(base, { pattern: 'needle', path: `${KB_DIR}/late.md` });
1530
+ expect(binary.status).toBe(200);
1531
+ expect(binary.body.matches).toEqual([]);
1532
+ expect(binary.body.note).toContain('no searchable text');
1533
+ const text = await grep(base, { pattern: 'needle', path: `${KB_DIR}/plain.md` });
1534
+ expect(text.status).toBe(200);
1535
+ expect(text.body.matches).toEqual([]);
1536
+ expect(text.body.note).toBeUndefined();
1537
+ });
1538
+
1539
+ it('stops the search when its caller goes away, leaving no ripgrep running', async () => {
1540
+ const slow = await slowRipgrep();
1541
+ try {
1542
+ matcherOptions = {};
1543
+ const base = await start();
1544
+ const gone = new AbortController();
1545
+ const call = fetch(`${base}/api/agent/tools/grep`, {
1546
+ method: 'POST',
1547
+ headers: { 'content-type': 'application/json', authorization: 'Bearer x' },
1548
+ body: JSON.stringify({ branch: 'main', pattern: 'needle' }),
1549
+ signal: gone.signal,
1550
+ }).catch(() => undefined);
1551
+ while ((await slow.alive()).length === 0) await new Promise((r) => setTimeout(r, 20));
1552
+ const left = Date.now();
1553
+ gone.abort();
1554
+ await call;
1555
+ // Well inside the 5 s budget the search would otherwise have run to.
1556
+ while ((await slow.alive()).length > 0 && Date.now() - left < 4_000) await new Promise((r) => setTimeout(r, 20));
1557
+ expect(await slow.alive()).toEqual([]);
1558
+ expect(Date.now() - left).toBeLessThan(1_000);
1559
+ } finally {
1560
+ await slow.remove();
1561
+ }
1562
+ }, 15_000);
1563
+
1564
+ it('searches node_modules and folders of any depth, and a link inside the workspace only where it points', async () => {
1378
1565
  const base = await start();
1379
- await fs.writeFile(`${KB_DIR}/redos.md`, `intro\n${LONG_LINE}\n`);
1380
- const res = await post(`${base}/api/agent/tools/grep`, { pattern: '^a+!$', path: `${KB_DIR}/redos.md` });
1566
+ const deep = Array.from({ length: 15 }, (_, i) => `d${i}`).join('/');
1567
+ await fs.writeFile(`${KB_DIR}/node_modules/pkg/readme.md`, 'needle in node_modules\n');
1568
+ await fs.writeFile(`${KB_DIR}/${deep}/deep.md`, 'needle fifteen levels down\n');
1569
+ await fs.writeFile(`${KB_DIR}/real/target.md`, 'needle at the target\n');
1570
+ await symlink(join(tempDir, KB_DIR, 'real', 'target.md'), join(tempDir, KB_DIR, 'file-link.md'));
1571
+ await symlink(join(tempDir, KB_DIR, 'real'), join(tempDir, KB_DIR, 'folder-link'));
1572
+ const res = await grep(base, { pattern: 'needle' });
1381
1573
  expect(res.status).toBe(200);
1382
- expect(((await res.json()) as { matches: unknown[] }).matches).toEqual([{ path: `${KB_DIR}/redos.md`, line: 2, text: LONG_LINE }]);
1574
+ expect(res.body.matches.map((m) => m.path)).toEqual([
1575
+ `${KB_DIR}/${deep}/deep.md`,
1576
+ `${KB_DIR}/node_modules/pkg/readme.md`,
1577
+ `${KB_DIR}/real/target.md`,
1578
+ ]);
1579
+ });
1580
+
1581
+ it('leaves out a file whose name holds a line break, which no tool can read, and answers the rest', async () => {
1582
+ const base = await start();
1583
+ await writeFile(join(tempDir, KB_DIR, 'two\nlines.md'), 'needle in an odd name\n');
1584
+ await fs.writeFile(`${KB_DIR}/plain.md`, 'needle plain\n');
1585
+ expect((await post(`${base}/api/agent/tools/read_file`, { path: `${KB_DIR}/two\nlines.md` })).status).toBe(400);
1586
+ const res = await grep(base, { pattern: 'needle' });
1587
+ expect(res.status).toBe(200);
1588
+ expect(res.body.matches).toEqual([{ path: `${KB_DIR}/plain.md`, line: 1, text: 'needle plain' }]);
1589
+ });
1590
+
1591
+ it('answers the first max_results by path then line, whatever reads them, and marks the answer truncated', async () => {
1592
+ const docx = (text: string): Buffer => {
1593
+ const zip = new AdmZip();
1594
+ zip.addFile('[Content_Types].xml', Buffer.from('<?xml version="1.0"?><Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types"/>'));
1595
+ zip.addFile(
1596
+ 'word/document.xml',
1597
+ Buffer.from(`<?xml version="1.0"?><w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"><w:body><w:p><w:r><w:t>${text}</w:t></w:r></w:p></w:body></w:document>`),
1598
+ );
1599
+ return zip.toBuffer();
1600
+ };
1601
+ const base = await start();
1602
+ await fs.writeFile(`${KB_DIR}/b.md`, 'x\nneedle b2\nneedle b3\n');
1603
+ await fs.writeFile(`${KB_DIR}/a/z.md`, 'needle a/z\n');
1604
+ await fs.writeFile(`${KB_DIR}/a.md`, 'needle a.md\n');
1605
+ await fs.writeFile(`${KB_DIR}/a/m.docx`, docx('needle in a document'));
1606
+ await fs.writeFile(`${KB_DIR}/c.md`, `needle ${'c'.repeat(400)}\n`);
1607
+ const all = await grep(base, { pattern: 'needle' });
1608
+ expect(all.body.matches.map((m) => [m.path, m.line])).toEqual([
1609
+ [`${KB_DIR}/a/m.docx`, 2],
1610
+ [`${KB_DIR}/a/z.md`, 1],
1611
+ [`${KB_DIR}/a.md`, 1],
1612
+ [`${KB_DIR}/b.md`, 2],
1613
+ [`${KB_DIR}/b.md`, 3],
1614
+ [`${KB_DIR}/c.md`, 1],
1615
+ ]);
1616
+ expect(all.body.truncated).toBe(false);
1617
+ expect(all.body.matches[5]!.text).toHaveLength(300);
1618
+ const capped = await grep(base, { pattern: 'needle', max_results: 4 });
1619
+ expect(capped.body.matches).toEqual(all.body.matches.slice(0, 4));
1620
+ expect(capped.body.truncated).toBe(true);
1621
+ // The default cap is 200.
1622
+ await fs.writeFile(`${KB_DIR}/many.md`, 'needle\n'.repeat(250));
1623
+ const many = await grep(base, { pattern: 'needle', path: `${KB_DIR}/many.md` });
1624
+ expect(many.body.matches).toHaveLength(200);
1625
+ expect(many.body.truncated).toBe(true);
1626
+ });
1627
+
1628
+ it('honours ignore_case', async () => {
1629
+ const base = await start();
1630
+ await fs.writeFile(`${KB_DIR}/case.md`, 'Needle\nneedle\nNEEDLE\n');
1631
+ expect((await grep(base, { pattern: 'NEEDLE', path: `${KB_DIR}/case.md` })).body.matches.map((m) => m.line)).toEqual([3]);
1632
+ expect((await grep(base, { pattern: 'NEEDLE', path: `${KB_DIR}/case.md`, ignore_case: true })).body.matches.map((m) => m.line)).toEqual([1, 2, 3]);
1633
+ expect((await grep(base, { pattern: 'NEEDLE', ignore_case: true })).body.matches.map((m) => m.line)).toEqual([1, 2, 3]);
1634
+ });
1635
+
1636
+ it('searches a pattern and a path beginning with `-` as text, never as an option', async () => {
1637
+ const base = await start();
1638
+ await fs.writeFile(`${KB_DIR}/-dir/-n.md`, 'run it with -n\nnothing here\n');
1639
+ for (const path of [undefined, `${KB_DIR}/-dir`, `${KB_DIR}/-dir/-n.md`, '-dir']) {
1640
+ const res = await grep(base, path === undefined ? { pattern: '-n' } : { pattern: '-n', path });
1641
+ expect(res.status).toBe(200);
1642
+ expect(res.body.matches).toEqual([{ path: path === '-dir' ? `${KB_DIR}/-dir/-n.md` : `${KB_DIR}/-dir/-n.md`, line: 1, text: 'run it with -n' }]);
1643
+ }
1644
+ // `--files` as a pattern is a pattern too: it matches nothing here rather than listing files.
1645
+ expect((await grep(base, { pattern: '--files' })).body.matches).toEqual([]);
1646
+ });
1647
+
1648
+ it('a pattern carrying a NUL is refused with the escape to use instead', async () => {
1649
+ const base = await start();
1650
+ const res = await grep(base, { pattern: 'a\u0000b' });
1651
+ expect(res.status).toBe(400);
1652
+ expect(res.body.error).toContain('\\x00');
1383
1653
  });
1384
1654
  });
1385
1655
 
@@ -2137,6 +2407,7 @@ describe('images', () => {
2137
2407
  describe('start_session', () => {
2138
2408
  // Minimal harness: own app + a fake ISessionSink that records createSession.
2139
2409
  let server: HttpServer | undefined;
2410
+ let sessionExtractor: WorkerDocumentExtractor | undefined;
2140
2411
  let created: Array<{ userId: string; startedAt: Date }> = [];
2141
2412
 
2142
2413
  async function startSessionApp(
@@ -2189,9 +2460,12 @@ describe('start_session', () => {
2189
2460
  const app = express();
2190
2461
  app.use(express.json());
2191
2462
  const router = express.Router();
2463
+ await sessionExtractor?.close();
2464
+ const extractor = new WorkerDocumentExtractor();
2465
+ sessionExtractor = extractor;
2192
2466
  registerWorkspaceTools(
2193
2467
  registry, router, auth, toolHandler,
2194
- new SpillStore(join(tmpdir(), 'bevel-test-spills')), new DocExtractService(join(tmpdir(), 'bevel-test-doc-extract')), access, testKbContext({ kbDirName: KB_DIR }),
2468
+ new SpillStore(join(tmpdir(), 'bevel-test-spills')), new DocExtractService(join(tmpdir(), 'bevel-test-doc-extract'), extractor), access, testKbContext({ kbDirName: KB_DIR }),
2195
2469
  { recoveryBotEmail: RECOVERY_BOT, hooks: new WorkflowHooks(), notes: new ToolDescriptionNotes() },
2196
2470
  new RoutineWritePolicyService(),
2197
2471
  sink ?? fakeSessionSink,
@@ -2213,6 +2487,8 @@ describe('start_session', () => {
2213
2487
  afterEach(async () => {
2214
2488
  if (server) await new Promise<void>((r) => server!.close(() => r()));
2215
2489
  server = undefined;
2490
+ await sessionExtractor?.close();
2491
+ sessionExtractor = undefined;
2216
2492
  });
2217
2493
 
2218
2494
  it('returns the sink-minted id as sessionId', async () => {
@@ -2321,9 +2597,10 @@ describe('start_session', () => {
2321
2597
  const registry = new ToolRegistry();
2322
2598
  const router = express.Router();
2323
2599
  const noopAuth: express.RequestHandler = (_req, _res, next) => next();
2600
+ const extractor = new WorkerDocumentExtractor();
2324
2601
  registerWorkspaceTools(
2325
2602
  registry, router, noopAuth, (() => () => {}) as never,
2326
- new SpillStore(join(tmpdir(), 'bevel-test-spills')), new DocExtractService(join(tmpdir(), 'bevel-test-doc-extract')), allowAll, testKbContext({ kbDirName: KB_DIR }),
2603
+ new SpillStore(join(tmpdir(), 'bevel-test-spills')), new DocExtractService(join(tmpdir(), 'bevel-test-doc-extract'), extractor), allowAll, testKbContext({ kbDirName: KB_DIR }),
2327
2604
  { recoveryBotEmail: RECOVERY_BOT, hooks: new WorkflowHooks(), notes: new ToolDescriptionNotes() },
2328
2605
  new RoutineWritePolicyService(),
2329
2606
  {} as never,
@@ -2341,6 +2618,7 @@ describe('start_session', () => {
2341
2618
  // And that the answer may carry a note to act on, so an agent reading
2342
2619
  // only the catalog knows the field is not noise.
2343
2620
  expect(description).toContain('`firstRun`');
2621
+ await extractor.close();
2344
2622
  });
2345
2623
 
2346
2624
  /**
@@ -2484,9 +2762,16 @@ describe('start_session', () => {
2484
2762
  * schema layer, complementing the handler-level guard exercised above.
2485
2763
  */
2486
2764
  describe('branch is a required parameter in the tool contract', () => {
2765
+ /** Every extractor a registry was built with, closed after each test. */
2766
+ const extractors: WorkerDocumentExtractor[] = [];
2767
+ afterEach(async () => {
2768
+ await Promise.all(extractors.splice(0).map((e) => e.close()));
2769
+ });
2487
2770
  /** Register the workspace tools into a fresh registry (no server needed). */
2488
2771
  function buildRegistry(): ToolRegistry {
2489
2772
  const registry = new ToolRegistry();
2773
+ const extractor = new WorkerDocumentExtractor();
2774
+ extractors.push(extractor);
2490
2775
  const router = express.Router();
2491
2776
  const noopAuth: express.RequestHandler = (_req, _res, next) => next();
2492
2777
  // The handler factory is only invoked to build routes; its output is never
@@ -2498,7 +2783,7 @@ describe('branch is a required parameter in the tool contract', () => {
2498
2783
  noopAuth,
2499
2784
  toolHandler,
2500
2785
  new SpillStore(join(tmpdir(), 'bevel-test-spills')),
2501
- new DocExtractService(join(tmpdir(), 'bevel-test-doc-extract')),
2786
+ new DocExtractService(join(tmpdir(), 'bevel-test-doc-extract'), extractor),
2502
2787
  allowAll,
2503
2788
  testKbContext({ kbDirName: KB_DIR }),
2504
2789
  { recoveryBotEmail: RECOVERY_BOT, hooks: new WorkflowHooks(), notes: new ToolDescriptionNotes() },
@@ -2513,7 +2798,7 @@ describe('branch is a required parameter in the tool contract', () => {
2513
2798
  undefined,
2514
2799
  undefined,
2515
2800
  // So `grep` is mounted; it spawns no worker, as nothing here searches.
2516
- new WorkerPatternMatcher(),
2801
+ new RipgrepPatternMatcher(),
2517
2802
  );
2518
2803
  return registry;
2519
2804
  }
@@ -4542,17 +4827,38 @@ describe('agent read/write hooks', () => {
4542
4827
  expect(writes).toEqual([]);
4543
4828
  });
4544
4829
 
4545
- it('grep tells the read hook about every file the walk opens, not only its root', async () => {
4830
+ it('grep tells the read hook about every file it opens — a file with no matching line included — not only its root', async () => {
4546
4831
  const base = await start();
4547
4832
  record();
4548
4833
  await fs.mkdir(`${KB_DIR}/KnowledgeBase/Product/Knowledge`, { recursive: true });
4549
4834
  await fs.mkdir(`${KB_DIR}/KnowledgeBase/Legal/Knowledge`, { recursive: true });
4550
4835
  await fs.writeFile(`${KB_DIR}/KnowledgeBase/Product/Knowledge/P.md`, 'needle');
4551
4836
  await fs.writeFile(`${KB_DIR}/KnowledgeBase/Legal/Knowledge/L.md`, 'needle');
4837
+ // Searched and read by ripgrep like the others; it answers no line.
4838
+ await fs.writeFile(`${KB_DIR}/KnowledgeBase/Legal/Knowledge/Quiet.md`, 'nothing of the sort');
4552
4839
  await post(`${base}/api/agent/tools/grep`, { pattern: 'needle', path: KB_DIR, sessionId: 's1' });
4553
4840
  const paths = reads.map((r) => r.wsPath);
4554
4841
  expect(paths).toContain(`${KB_DIR}/KnowledgeBase/Product/Knowledge/P.md`);
4555
4842
  expect(paths).toContain(`${KB_DIR}/KnowledgeBase/Legal/Knowledge/L.md`);
4843
+ expect(paths).toContain(`${KB_DIR}/KnowledgeBase/Legal/Knowledge/Quiet.md`);
4844
+ expect(paths.filter((p) => p === `${KB_DIR}/KnowledgeBase/Legal/Knowledge/Quiet.md`)).toHaveLength(1);
4845
+ });
4846
+
4847
+ it('a read hook that refuses a file the search would open ends the grep as it ends a read_file, even one that matches nothing', async () => {
4848
+ const base = await start();
4849
+ record();
4850
+ hooks.onAgentRead(async (op) => {
4851
+ if (op.wsPath === `${KB_DIR}/KnowledgeBase/Legal/Knowledge/Quiet.md`) throw new ToolError('Quiet.md is off limits to this run', 403);
4852
+ });
4853
+ await fs.mkdir(`${KB_DIR}/KnowledgeBase/Product/Knowledge`, { recursive: true });
4854
+ await fs.mkdir(`${KB_DIR}/KnowledgeBase/Legal/Knowledge`, { recursive: true });
4855
+ await fs.writeFile(`${KB_DIR}/KnowledgeBase/Product/Knowledge/P.md`, 'needle');
4856
+ await fs.writeFile(`${KB_DIR}/KnowledgeBase/Legal/Knowledge/Quiet.md`, 'nothing of the sort');
4857
+ const res = await post(`${base}/api/agent/tools/grep`, { pattern: 'needle', path: KB_DIR, sessionId: 's1' });
4858
+ expect(res.status).toBe(403);
4859
+ expect(await res.json()).toMatchObject({ error: 'Quiet.md is off limits to this run' });
4860
+ // The refusal came at admission: the hook heard of the file, and the search answered nothing from any file.
4861
+ expect(reads.map((r) => r.wsPath)).toContain(`${KB_DIR}/KnowledgeBase/Legal/Knowledge/Quiet.md`);
4556
4862
  });
4557
4863
 
4558
4864
  it('the write hook covers write_file, edit_file and mkdir, once per path', async () => {