@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
@@ -19,9 +19,9 @@
19
19
  * all branches and to reads).
20
20
  */
21
21
 
22
- import type { JsonSchema } from '../tool-registry/tool.contract.js';
23
- import type { ToolContext } from '../tool-helpers/tool.contract.js';
24
- import type { WorkflowHooks } from '../workflow/workflow-hooks.js';
22
+ import type { JsonSchema } from '../tool-registry/index.js';
23
+ import type { ToolContext } from '../tool-helpers/index.js';
24
+ import type { WorkflowHooks } from '../workflow/index.js';
25
25
 
26
26
  /**
27
27
  * What the `sessionId` input says on its own, before any deployment note. The
@@ -1,6 +1,6 @@
1
1
  import { createHash } from 'node:crypto';
2
2
  import AdmZip from 'adm-zip';
3
- import { hasHttpStatus, ToolError } from '../tool-helpers/tool.contract.js';
3
+ import { hasHttpStatus, ToolError } from '../tool-helpers/index.js';
4
4
  import { isAbsence } from '../../shared/fs.contract.js';
5
5
  import type { DownloadArtifact } from './agent-download.store.js';
6
6
 
@@ -135,6 +135,25 @@ export function createAgentUploadRoutes(deps: AgentUploadRouteDeps): express.Rou
135
135
  router.post(AGENT_UPLOAD_ROUTE, handle);
136
136
  router.post(AGENT_UPLOAD_HEADER_ROUTE, handle);
137
137
 
138
+ // `DELETE /api/agent/uploads` with the token in `x-upload-token`: give the
139
+ // token up unapplied, and its bytes with it, now rather than at its expiry
140
+ // (see `AgentUploadStore.discard`). The app sends it when a page's
141
+ // `uploadFile` was refused, since nobody else holds that token to retry.
142
+ // Header form only: the token stays out of the address here too.
143
+ router.delete(AGENT_UPLOAD_HEADER_ROUTE, async (req, res) => {
144
+ try {
145
+ await uploads.discard(tokenOf(req));
146
+ res.status(204).end();
147
+ } catch (err) {
148
+ if (err instanceof UploadTokenError) {
149
+ res.status(err.status).json({ error: err.message });
150
+ return;
151
+ }
152
+ log.error('discarding an upload failed:', { err });
153
+ res.status(500).json({ error: 'Discarding the upload failed' });
154
+ }
155
+ });
156
+
138
157
  return router;
139
158
  }
140
159
 
@@ -417,6 +417,24 @@ export class AgentUploadStore {
417
417
  }
418
418
  }
419
419
 
420
+ /**
421
+ * Give `token` up unapplied: spend it and delete any bytes sent with it NOW,
422
+ * rather than when it expires. For a caller that will not retry — the app
423
+ * answering a page's `uploadFile`, which holds the token on the page's behalf
424
+ * and drops it when the upload or the apply is refused.
425
+ *
426
+ * Refused with the one refusal, like every unusable token, and also while
427
+ * the token is busy — bytes still arriving, or an apply holding it — so a
428
+ * discard never deletes a file somebody is writing or reading.
429
+ */
430
+ async discard(token: string): Promise<void> {
431
+ const record = this.find(token);
432
+ // `attaching` stays set once the bytes are in; only without `received` are they still arriving.
433
+ const arriving = record.attaching && record.received === undefined;
434
+ if (arriving || record.claimed) throw new UploadTokenError(UPLOAD_TOKEN_REFUSAL, 404);
435
+ await this.consume(token);
436
+ }
437
+
420
438
  /** Spend the token and delete its bytes. Idempotent. */
421
439
  async consume(token: string): Promise<void> {
422
440
  const key = hash(token);
@@ -8,6 +8,15 @@ under an `[extracted text of …]` marker whose summary states what was left out
8
8
  When an extractor's OUTPUT changes, bump `EXTRACTION_SCHEMA` in
9
9
  `doc-extract.service.ts` so cached extractions of unchanged bytes refresh.
10
10
 
11
+ No extractor runs on the server's request thread: `DocExtractService` hands the
12
+ bytes to `WorkerDocumentExtractor` (`extract-in-worker.ts`), a pool of worker
13
+ threads running `extract.worker.ts` (the table in `document-extractors.ts`)
14
+ under a 10-second budget per file. A failed extraction is cached under the same
15
+ key — a parser's refusal for good, a timeout or crash for an hour — and a fresh
16
+ failure is reported as the `document-unreadable` event. A new format is added
17
+ to `document-formats.ts` and to the worker's table; the compiler holds the two
18
+ together.
19
+
11
20
  ## Word (`.docx`)
12
21
 
13
22
  - Paragraphs become lines; table rows become lines of tab-separated cells.
@@ -0,0 +1,175 @@
1
+ import { mkdtemp, rm } from 'node:fs/promises';
2
+ import { tmpdir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
5
+ import { DocExtractService, TIMEOUT_MEMORY_MS, type UnreadableDocument } from '../doc-extract.service.js';
6
+ import type { IDocumentExtractor, IsolatedExtraction } from '../document-extractor.contract.js';
7
+ import { WorkerDocumentExtractor } from '../extract-in-worker.js';
8
+ import { xrefPdf } from './fixtures/damaged-pdf.js';
9
+
10
+ /**
11
+ * What `DocExtractService` remembers about a failed extraction, and whom it
12
+ * tells: a parser's refusal for good, a timeout or crash for an hour, "busy"
13
+ * not at all; a fresh failure reported once, a remembered one never.
14
+ */
15
+
16
+ /** An extractor that answers what each test scripts, and counts the extractions it was asked for. */
17
+ function scriptedExtractor(answer: (extension: string, bytes: Buffer) => IsolatedExtraction): IDocumentExtractor & { calls: number } {
18
+ return {
19
+ calls: 0,
20
+ async extract(extension, bytes) {
21
+ this.calls++;
22
+ return answer(extension, bytes);
23
+ },
24
+ close: async () => {},
25
+ };
26
+ }
27
+
28
+ const TIMEOUT: IsolatedExtraction = {
29
+ ok: false,
30
+ failure: 'timeout',
31
+ message: 'could not be read: extracting its text took longer than 10 seconds',
32
+ };
33
+ const ORIGIN = { workspaceId: 'main' };
34
+
35
+ let cacheRoot = '';
36
+ let clock = 0;
37
+ let told: UnreadableDocument[] = [];
38
+ const now = () => clock;
39
+ const onUnreadable = (doc: UnreadableDocument) => told.push(doc);
40
+
41
+ beforeEach(async () => {
42
+ cacheRoot = await mkdtemp(join(tmpdir(), 'doc-extract-service-'));
43
+ clock = 1_800_000_000_000;
44
+ told = [];
45
+ });
46
+ afterEach(() => rm(cacheRoot, { recursive: true, force: true }));
47
+
48
+ describe('DocExtractService — a damaged PDF, through the real worker', () => {
49
+ let extractor: WorkerDocumentExtractor;
50
+ beforeEach(() => {
51
+ extractor = new WorkerDocumentExtractor();
52
+ });
53
+ afterEach(() => extractor.close());
54
+
55
+ it('is extracted once; every later read and the cheap lookup answer the remembered notice', async () => {
56
+ let extractions = 0;
57
+ const counting: IDocumentExtractor = {
58
+ extract: (ext, bytes) => {
59
+ extractions++;
60
+ return extractor.extract(ext, bytes);
61
+ },
62
+ close: () => extractor.close(),
63
+ };
64
+ const service = new DocExtractService(cacheRoot, counting, { now, onUnreadable });
65
+ const pdf = xrefPdf('Hello', { damage: true });
66
+ const first = await service.extract('kb/Supplier-Agreement.pdf', pdf, ORIGIN);
67
+ expect(first).toEqual({ ok: false, message: "could not extract the PDF's text (Bad (uncompressed) XRef entry: 4R)" });
68
+ expect(await service.extract('kb/Supplier-Agreement.pdf', pdf, ORIGIN)).toEqual(first);
69
+ expect(await service.getCached('kb/Supplier-Agreement.pdf', pdf)).toEqual(first);
70
+ expect(extractions).toBe(1);
71
+ // Told once, for the fresh failure only — under the reason the explorer shows.
72
+ expect(told).toEqual([
73
+ { workspaceId: 'main', path: 'kb/Supplier-Agreement.pdf', reason: "could not extract the PDF's text (Bad (uncompressed) XRef entry: 4R)" },
74
+ ]);
75
+ });
76
+
77
+ it('extracts the repaired file — new content — and reads it normally', async () => {
78
+ const service = new DocExtractService(cacheRoot, extractor, { now, onUnreadable });
79
+ await service.extract('a.pdf', xrefPdf('Hello', { damage: true }), ORIGIN);
80
+ const repaired = await service.extract('a.pdf', xrefPdf('Hello', { damage: false }), ORIGIN);
81
+ expect(repaired).toMatchObject({ ok: true, text: '[page 1]\nHello' });
82
+ });
83
+ });
84
+
85
+ describe('DocExtractService — how long a failure is remembered', () => {
86
+ it('remembers a parser failure for good — even long past an hour', async () => {
87
+ const extractor = scriptedExtractor(() => ({ ok: false, failure: 'parser', message: 'could not be parsed as a PDF (x)' }));
88
+ const service = new DocExtractService(cacheRoot, extractor, { now });
89
+ const bytes = Buffer.from('damaged');
90
+ await service.extract('a.pdf', bytes);
91
+ clock += 30 * TIMEOUT_MEMORY_MS;
92
+ expect(await service.extract('a.pdf', bytes)).toEqual({ ok: false, message: 'could not be parsed as a PDF (x)' });
93
+ expect(extractor.calls).toBe(1);
94
+ });
95
+
96
+ it('remembers a timeout for one hour, then extracts again', async () => {
97
+ let answer: IsolatedExtraction = TIMEOUT;
98
+ const extractor = scriptedExtractor(() => answer);
99
+ const service = new DocExtractService(cacheRoot, extractor, { now, onUnreadable });
100
+ const bytes = Buffer.from('slow');
101
+ expect(await service.extract('big.pdf', bytes, ORIGIN)).toEqual({ ok: false, message: TIMEOUT.message });
102
+ // Within the hour: the notice, at once, from every read and from the cheap lookup.
103
+ clock += TIMEOUT_MEMORY_MS - 1;
104
+ expect(await service.extract('big.pdf', bytes, ORIGIN)).toEqual({ ok: false, message: TIMEOUT.message });
105
+ expect(await service.getCached('big.pdf', bytes)).toEqual({ ok: false, message: TIMEOUT.message });
106
+ expect(extractor.calls).toBe(1);
107
+ // After it: tried again, and this time the server had the moment to spare.
108
+ clock += 1;
109
+ expect(await service.getCached('big.pdf', bytes)).toBeUndefined();
110
+ answer = { ok: true, summary: '1 page', text: '[page 1]\nfinally' };
111
+ expect(await service.extract('big.pdf', bytes, ORIGIN)).toMatchObject({ ok: true, text: '[page 1]\nfinally' });
112
+ expect(extractor.calls).toBe(2);
113
+ expect(told).toEqual([{ workspaceId: 'main', path: 'big.pdf', reason: 'extracting its text took longer than 10 seconds' }]);
114
+ });
115
+
116
+ it('remembers a crashed extraction for an hour, like a timeout', async () => {
117
+ const extractor = scriptedExtractor(() => ({ ok: false, failure: 'crashed', message: 'could not be read: its extraction stopped unexpectedly (exit code 3)' }));
118
+ const service = new DocExtractService(cacheRoot, extractor, { now });
119
+ const bytes = Buffer.from('oom');
120
+ await service.extract('a.pdf', bytes);
121
+ await service.extract('a.pdf', bytes);
122
+ expect(extractor.calls).toBe(1);
123
+ clock += TIMEOUT_MEMORY_MS;
124
+ await service.extract('a.pdf', bytes);
125
+ expect(extractor.calls).toBe(2);
126
+ });
127
+
128
+ it('remembers nothing, and tells no one, when no worker was free', async () => {
129
+ const extractor = scriptedExtractor(() => ({ ok: false, failure: 'busy', message: 'could not be read: too many documents are being extracted at once; try again in a few seconds' }));
130
+ const service = new DocExtractService(cacheRoot, extractor, { now, onUnreadable });
131
+ const bytes = Buffer.from('fine');
132
+ expect((await service.extract('a.pdf', bytes, ORIGIN)).ok).toBe(false);
133
+ expect(await service.getCached('a.pdf', bytes)).toBeUndefined();
134
+ await service.extract('a.pdf', bytes, ORIGIN);
135
+ expect(extractor.calls).toBe(2);
136
+ expect(told).toEqual([]);
137
+ });
138
+
139
+ it('tells no one about a failure of a read with no origin', async () => {
140
+ const extractor = scriptedExtractor(() => TIMEOUT);
141
+ const service = new DocExtractService(cacheRoot, extractor, { now, onUnreadable });
142
+ await service.extract('a.pdf', Buffer.from('x'));
143
+ expect(told).toEqual([]);
144
+ });
145
+
146
+ it('tells once when two reads of the same document fail together', async () => {
147
+ const extractor = scriptedExtractor(() => TIMEOUT);
148
+ const service = new DocExtractService(cacheRoot, extractor, { now, onUnreadable });
149
+ const bytes = Buffer.from('twice');
150
+ await Promise.all([service.extract('a.pdf', bytes, ORIGIN), service.extract('a.pdf', bytes, ORIGIN)]);
151
+ expect(extractor.calls).toBe(1);
152
+ expect(told).toHaveLength(1);
153
+ });
154
+
155
+ it('two reads of the same bytes at different paths share one extraction, and each marker names its own path', async () => {
156
+ const extractor = scriptedExtractor(() => ({ ok: true, summary: '1 page', text: '[page 1]\nshared' }));
157
+ const service = new DocExtractService(cacheRoot, extractor, { now, onUnreadable });
158
+ const bytes = Buffer.from('same bytes, two names');
159
+ const [a, b] = await Promise.all([service.extract('a/deck.pdf', bytes, ORIGIN), service.extract('b/copy.pdf', bytes, ORIGIN)]);
160
+ expect(extractor.calls).toBe(1);
161
+ expect(a).toEqual({ ok: true, marker: '[extracted text of a/deck.pdf — 1 page]', text: '[page 1]\nshared' });
162
+ expect(b).toEqual({ ok: true, marker: '[extracted text of b/copy.pdf — 1 page]', text: '[page 1]\nshared' });
163
+ });
164
+
165
+ it('still answers the read when whoever is told throws', async () => {
166
+ const extractor = scriptedExtractor(() => TIMEOUT);
167
+ const service = new DocExtractService(cacheRoot, extractor, {
168
+ now,
169
+ onUnreadable: () => {
170
+ throw new Error('listener broke');
171
+ },
172
+ });
173
+ expect(await service.extract('a.pdf', Buffer.from('x'), ORIGIN)).toEqual({ ok: false, message: TIMEOUT.message });
174
+ });
175
+ });
@@ -7,18 +7,18 @@ import AdmZip from 'adm-zip';
7
7
  import * as XLSX from 'xlsx';
8
8
  import { afterEach, beforeEach, describe, expect, it } from 'vitest';
9
9
  import { extractDocx } from '../extract-docx.js';
10
- import { extractPptx } from '../extract-pptx.js';
10
+ import { extractPptx, notesTargetFromRels } from '../extract-pptx.js';
11
11
  import { extractXlsx } from '../extract-xlsx.js';
12
12
  import { extractPdf } from '../extract-pdf.js';
13
13
  import { extractOdt } from '../extract-odt.js';
14
14
  import { extractOdp } from '../extract-odp.js';
15
15
  import { extractOds } from '../extract-ods.js';
16
16
  import { DocExtractService, EXTRACTION_SCHEMA } from '../doc-extract.service.js';
17
+ import { WorkerDocumentExtractor } from '../extract-in-worker.js';
17
18
  import { DocExtractionCache, gitBlobSha } from '../extraction-cache.js';
18
19
  import { fileExtension } from '../doc-extract.types.js';
19
20
  import { MAX_ODF_NS_ALIASES, normalizeOdfPrefixes, odfParagraphBlocks } from '../odf-text.js';
20
21
  import { decodeXmlEntities, xmlAttrValue, xmlAttrValueByLocalName } from '../ooxml-text.js';
21
- import { notesTargetFromRels } from '../extract-pptx.js';
22
22
 
23
23
  /**
24
24
  * REAL fixtures, no mocks: docx/pptx are handcrafted OOXML zips built with
@@ -612,7 +612,7 @@ describe('DocExtractService cache', () => {
612
612
 
613
613
  beforeEach(async () => {
614
614
  cacheRoot = await mkdtemp(join(tmpdir(), 'doc-extract-cache-'));
615
- service = new DocExtractService(cacheRoot);
615
+ service = new DocExtractService(cacheRoot, new WorkerDocumentExtractor());
616
616
  });
617
617
  afterEach(async () => {
618
618
  await rm(cacheRoot, { recursive: true, force: true });
@@ -620,7 +620,7 @@ describe('DocExtractService cache', () => {
620
620
 
621
621
  it('extracts ONCE per content: the second read is served from the cache file', async () => {
622
622
  const bytes = docxBytes(para('Cache me once'));
623
- const first = await service.extract('a.docx', bytes, extractDocx);
623
+ const first = await service.extract('a.docx', bytes);
624
624
  expect(first.ok).toBe(true);
625
625
  const entries = await readdir(cacheRoot);
626
626
  expect(entries).toEqual([`${gitBlobSha(bytes)}.docx.${EXTRACTION_SCHEMA}.json`]);
@@ -629,7 +629,7 @@ describe('DocExtractService cache', () => {
629
629
  // text, it came from the cache — the parser did NOT run again. (Real-files
630
630
  // proof without spying on module internals.)
631
631
  await writeFile(join(cacheRoot, entries[0]), JSON.stringify({ summary: 'tampered summary', text: 'FROM CACHE' }), 'utf8');
632
- const second = await service.extract('a.docx', bytes, extractDocx);
632
+ const second = await service.extract('a.docx', bytes);
633
633
  if (!second.ok) throw new Error(second.message);
634
634
  expect(second.text).toBe('FROM CACHE');
635
635
  expect(second.marker).toBe('[extracted text of a.docx — tampered summary]');
@@ -638,9 +638,9 @@ describe('DocExtractService cache', () => {
638
638
  it('is invalidated by CONTENT change (new blob sha → fresh extraction, new entry)', async () => {
639
639
  const v1 = docxBytes(para('version one'));
640
640
  const v2 = docxBytes(para('version two'));
641
- await service.extract('a.docx', v1, extractDocx);
641
+ await service.extract('a.docx', v1);
642
642
  const after1 = await readdir(cacheRoot);
643
- const res = await service.extract('a.docx', v2, extractDocx);
643
+ const res = await service.extract('a.docx', v2);
644
644
  if (!res.ok) throw new Error(res.message);
645
645
  expect(res.text).toBe('version two');
646
646
  const after2 = await readdir(cacheRoot);
@@ -650,9 +650,9 @@ describe('DocExtractService cache', () => {
650
650
 
651
651
  it('keys by content, not path: the same bytes under another path reuse the entry, marker names the read path', async () => {
652
652
  const bytes = docxBytes(para('Shared content'));
653
- await service.extract('one.docx', bytes, extractDocx);
653
+ await service.extract('one.docx', bytes);
654
654
  expect(await readdir(cacheRoot)).toHaveLength(1);
655
- const other = await service.extract('two/other.docx', bytes, extractDocx);
655
+ const other = await service.extract('two/other.docx', bytes);
656
656
  if (!other.ok) throw new Error(other.message);
657
657
  expect(other.marker).toMatch(/^\[extracted text of two\/other\.docx — /);
658
658
  expect(await readdir(cacheRoot)).toHaveLength(1);
@@ -661,15 +661,20 @@ describe('DocExtractService cache', () => {
661
661
  it('getCached misses before extraction and hits after — the grep budget contract', async () => {
662
662
  const bytes = docxBytes(para('Budget line'));
663
663
  expect(await service.getCached('a.docx', bytes)).toBeUndefined();
664
- await service.extract('a.docx', bytes, extractDocx);
664
+ await service.extract('a.docx', bytes);
665
665
  const hit = await service.getCached('a.docx', bytes);
666
666
  expect(hit?.text).toBe('Budget line');
667
667
  });
668
668
 
669
- it('does NOT cache failures — a corrupt file is re-tried on the next read', async () => {
670
- const res = await service.extract('bad.docx', Buffer.from('junk'), extractDocx);
669
+ it('remembers a parser failure under the content key — a corrupt file is answered from the cache', async () => {
670
+ // Reversed on purpose (Damaged-Document-Never-Hangs): a damaged file was
671
+ // extracted again on every read and every grep; now its failure is kept
672
+ // like a success, and the cheap lookup answers it too.
673
+ const junk = Buffer.from('junk');
674
+ const res = await service.extract('bad.docx', junk);
671
675
  expect(res.ok).toBe(false);
672
- expect(await readdir(cacheRoot)).toHaveLength(0);
676
+ expect(await readdir(cacheRoot)).toEqual([`${gitBlobSha(junk)}.docx.${EXTRACTION_SCHEMA}.json`]);
677
+ expect(await service.getCached('bad.docx', junk)).toEqual(res);
673
678
  });
674
679
 
675
680
  it('computes the git blob sha (matches `git hash-object`)', async () => {
@@ -679,7 +684,7 @@ describe('DocExtractService cache', () => {
679
684
 
680
685
  it('the cached entry on disk is the {summary, text} JSON', async () => {
681
686
  const bytes = docxBytes(para('On disk'));
682
- await service.extract('a.docx', bytes, extractDocx);
687
+ await service.extract('a.docx', bytes);
683
688
  const raw = JSON.parse(await readFile(join(cacheRoot, `${gitBlobSha(bytes)}.docx.${EXTRACTION_SCHEMA}.json`), 'utf8')) as { summary: string; text: string };
684
689
  expect(raw.text).toBe('On disk');
685
690
  expect(typeof raw.summary).toBe('string');
@@ -694,12 +699,12 @@ describe('DocExtractService cache', () => {
694
699
  `${odsCell('cell')}` +
695
700
  '</table:table-row></table:table></office:text>',
696
701
  );
697
- const asOdt = await service.extract('doc.odt', bytes, extractOdt);
702
+ const asOdt = await service.extract('doc.odt', bytes);
698
703
  if (!asOdt.ok) throw new Error(asOdt.message);
699
704
  expect(asOdt.text).toContain('Prose line');
700
705
 
701
706
  // Same bytes, renamed .ods: the odt extraction must NOT come back.
702
- const asOds = await service.extract('doc.ods', bytes, extractOds);
707
+ const asOds = await service.extract('doc.ods', bytes);
703
708
  if (!asOds.ok) throw new Error(asOds.message);
704
709
  expect(asOds.text.split('\n')[0]).toBe('[sheet: Grid]');
705
710
  expect(asOds.marker).toContain('sheet');
@@ -0,0 +1,229 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
3
+ import { extractionTimeoutNotice } from '../document-extractor.contract.js';
4
+ import { extractDocx } from '../extract-docx.js';
5
+ import { EXTRACTION_BUDGET_MS, EXTRACTION_WORKER_FAILED, WorkerDocumentExtractor, type ExtractionWorkerEntry } from '../extract-in-worker.js';
6
+ import { extractPdf } from '../extract-pdf.js';
7
+ import { xrefPdf } from './fixtures/damaged-pdf.js';
8
+
9
+ /**
10
+ * The extraction worker kind: every document's extractor runs in a pooled
11
+ * worker thread under a budget, and nothing a parser does — an error, a
12
+ * rejection it never hands back, a loop, a crash — reaches this process.
13
+ */
14
+
15
+ /** A worker module from this suite's fixtures, loaded as the suites are (TypeScript, through tsx). */
16
+ function fixtureEntry(name: string): ExtractionWorkerEntry {
17
+ return { url: new URL(`./fixtures/${name}`, import.meta.url), execArgv: ['--import', 'tsx'] };
18
+ }
19
+
20
+ /** Every unhandled rejection and uncaught exception THIS process sees while a test runs. */
21
+ let processSaw: unknown[] = [];
22
+ const onRejection = (reason: unknown) => processSaw.push(reason);
23
+ const onException = (err: unknown) => processSaw.push(err);
24
+ beforeEach(() => {
25
+ processSaw = [];
26
+ process.on('unhandledRejection', onRejection);
27
+ process.on('uncaughtException', onException);
28
+ });
29
+ afterEach(() => {
30
+ process.off('unhandledRejection', onRejection);
31
+ process.off('uncaughtException', onException);
32
+ });
33
+
34
+ describe('WorkerDocumentExtractor — the real document extractors', () => {
35
+ let extractor: WorkerDocumentExtractor;
36
+ beforeEach(() => {
37
+ extractor = new WorkerDocumentExtractor();
38
+ });
39
+ afterEach(() => extractor.close());
40
+
41
+ it('budgets ten seconds per file by default, and words a timeout as the ticket does', () => {
42
+ expect(EXTRACTION_BUDGET_MS).toBe(10_000);
43
+ expect(extractionTimeoutNotice(EXTRACTION_BUDGET_MS)).toBe(
44
+ 'could not be read: extracting its text took longer than 10 seconds',
45
+ );
46
+ });
47
+
48
+ it('answers a PDF with a damaged cross-reference table with pdf.js’s own message, as a parser failure', async () => {
49
+ const res = await extractor.extract('.pdf', xrefPdf('Hello', { damage: true }));
50
+ expect(res).toEqual({
51
+ ok: false,
52
+ failure: 'parser',
53
+ message: "could not extract the PDF's text (Bad (uncompressed) XRef entry: 4R)",
54
+ });
55
+ // Long enough for any rejection pdf.js left behind to have surfaced.
56
+ await new Promise((r) => setTimeout(r, 50));
57
+ expect(processSaw).toEqual([]);
58
+ });
59
+
60
+ it('extracts a sound document exactly as the extractor does on its own — same text, same summary', async () => {
61
+ const pdf = xrefPdf('Hello PDF world', { damage: false });
62
+ const docx = await readFile(new URL('./fixtures/tab.docx', import.meta.url));
63
+ const inProcess = [await extractPdf(pdf), await extractDocx(docx)];
64
+ const inWorker = [await extractor.extract('.pdf', pdf), await extractor.extract('.docx', docx)];
65
+ expect(inWorker).toEqual(inProcess);
66
+ expect(inWorker[0]).toMatchObject({ ok: true, text: '[page 1]\nHello PDF world' });
67
+ });
68
+
69
+ it('leaves the caller’s buffer as it was — the worker gets a copy', async () => {
70
+ const pdf = xrefPdf('Keep me', { damage: false });
71
+ const before = Buffer.from(pdf);
72
+ await extractor.extract('.pdf', pdf);
73
+ expect(pdf.byteLength).toBe(before.byteLength);
74
+ expect(pdf.equals(before)).toBe(true);
75
+ });
76
+ });
77
+
78
+ describe('WorkerDocumentExtractor — a parser that misbehaves', () => {
79
+ let extractor: WorkerDocumentExtractor;
80
+ afterEach(() => extractor.close());
81
+
82
+ it('turns a rejection the parser never hands back into the job’s failure — this process sees none', async () => {
83
+ extractor = new WorkerDocumentExtractor({ entry: fixtureEntry('misbehaving-extract.worker.ts') });
84
+ const res = await extractor.extract('.dangling', Buffer.from('x'));
85
+ expect(res).toEqual({
86
+ ok: false,
87
+ failure: 'parser',
88
+ message: 'could not be extracted (XRefEntryException: Bad (uncompressed) XRef entry)',
89
+ });
90
+ await new Promise((r) => setTimeout(r, 50));
91
+ expect(processSaw).toEqual([]);
92
+ // The worker it happened in is retired; the next job gets a sound one.
93
+ expect(await extractor.extract('.echo', Buffer.from('after'))).toMatchObject({ ok: true, text: 'after' });
94
+ });
95
+
96
+ it('keeps a rejection left behind AFTER an answer out of this process and out of the next job', async () => {
97
+ extractor = new WorkerDocumentExtractor({ entry: fixtureEntry('misbehaving-extract.worker.ts'), poolMax: 1 });
98
+ expect(await extractor.extract('.straggler', Buffer.from('x'))).toMatchObject({ ok: true, text: 'answered first' });
99
+ await new Promise((r) => setTimeout(r, 100));
100
+ expect(await extractor.extract('.echo', Buffer.from('next'))).toMatchObject({ ok: true, text: 'next' });
101
+ expect(processSaw).toEqual([]);
102
+ });
103
+
104
+ it('never pins an earlier job’s late rejection on the job the worker runs next — reused at once', async () => {
105
+ extractor = new WorkerDocumentExtractor({ entry: fixtureEntry('misbehaving-extract.worker.ts'), poolMax: 1 });
106
+ expect(await extractor.extract('.straggler', Buffer.from('x'))).toMatchObject({ ok: true, text: 'answered first' });
107
+ // No pause: the one worker gets this job straight away, and the straggler lands while it runs.
108
+ expect(await extractor.extract('.slow-echo', Buffer.from('mine'))).toEqual({ ok: true, summary: 'echo', text: 'mine' });
109
+ expect(processSaw).toEqual([]);
110
+ });
111
+
112
+ it('never answers the next job as crashed when the worker ends itself over a straggler between jobs', async () => {
113
+ extractor = new WorkerDocumentExtractor({ entry: fixtureEntry('misbehaving-extract.worker.ts'), poolMax: 1 });
114
+ expect(await extractor.extract('.straggler-between-jobs', Buffer.from('x'))).toMatchObject({ ok: true });
115
+ // The one worker is handed this job at once, and exits (code 0) before taking it up:
116
+ // the job runs again in a fresh worker and is answered as its own.
117
+ expect(await extractor.extract('.echo', Buffer.from('mine'))).toEqual({ ok: true, summary: 'echo', text: 'mine' });
118
+ expect(processSaw).toEqual([]);
119
+ });
120
+
121
+ it('gives a job rerun over another file’s straggler the whole budget again, not what was left', async () => {
122
+ // Budget 1500 ms. The straggler lands 600 ms into the next job, which
123
+ // needs 1100 ms: the 900 ms the budget had left would not do, the whole
124
+ // budget does. A rerun on the leftover would time out a sound document
125
+ // and remember that timeout for an hour.
126
+ extractor = new WorkerDocumentExtractor({ entry: fixtureEntry('misbehaving-extract.worker.ts'), poolMax: 1, budgetMs: 1500 });
127
+ expect(await extractor.extract('.straggler-late', Buffer.from('x'))).toMatchObject({ ok: true, text: 'answered first' });
128
+ // No pause: the one worker gets this job straight away, and the straggler lands while it runs.
129
+ expect(await extractor.extract('.slow-echo-long', Buffer.from('mine'))).toEqual({ ok: true, summary: 'echo', text: 'mine' });
130
+ expect(processSaw).toEqual([]);
131
+ }, 10_000);
132
+
133
+ it('still pins a rejection on its own job when the worker had served another first', async () => {
134
+ extractor = new WorkerDocumentExtractor({ entry: fixtureEntry('misbehaving-extract.worker.ts'), poolMax: 1 });
135
+ expect(await extractor.extract('.echo', Buffer.from('warm'))).toMatchObject({ ok: true });
136
+ expect(await extractor.extract('.dangling', Buffer.from('x'))).toEqual({
137
+ ok: false,
138
+ failure: 'parser',
139
+ message: 'could not be extracted (XRefEntryException: Bad (uncompressed) XRef entry)',
140
+ });
141
+ expect(await extractor.extract('.echo', Buffer.from('after'))).toMatchObject({ ok: true, text: 'after' });
142
+ expect(processSaw).toEqual([]);
143
+ });
144
+
145
+ it('answers a parser that throws with its message', async () => {
146
+ extractor = new WorkerDocumentExtractor({ entry: fixtureEntry('misbehaving-extract.worker.ts') });
147
+ expect(await extractor.extract('.throw', Buffer.from('x'))).toEqual({
148
+ ok: false,
149
+ failure: 'parser',
150
+ message: 'could not be extracted (boom)',
151
+ });
152
+ });
153
+
154
+ it('terminates a parser past its budget and answers the timeout notice — while this thread stays free', async () => {
155
+ extractor = new WorkerDocumentExtractor({ entry: fixtureEntry('misbehaving-extract.worker.ts'), budgetMs: 300 });
156
+ // Warm the worker so its start-up is not part of the budget measured below.
157
+ await extractor.extract('.echo', Buffer.from('warm'));
158
+ const started = Date.now();
159
+ let ticks = 0;
160
+ const ticker = setInterval(() => ticks++, 20);
161
+ const res = await extractor.extract('.hang', Buffer.from('x'));
162
+ clearInterval(ticker);
163
+ expect(res).toEqual({
164
+ ok: false,
165
+ failure: 'timeout',
166
+ message: 'could not be read: extracting its text took longer than 0.3 seconds',
167
+ });
168
+ expect(Date.now() - started).toBeLessThan(2_000);
169
+ // The loop ran on the worker's thread: this one kept turning the whole time.
170
+ expect(ticks).toBeGreaterThan(5);
171
+ expect(await extractor.extract('.echo', Buffer.from('again'))).toMatchObject({ ok: true, text: 'again' });
172
+ });
173
+
174
+ it('gives three documents at once a worker and a budget each', async () => {
175
+ extractor = new WorkerDocumentExtractor({ entry: fixtureEntry('misbehaving-extract.worker.ts'), budgetMs: 500 });
176
+ await Promise.all([1, 2, 3].map(() => extractor.extract('.echo', Buffer.from('warm'))));
177
+ const started = Date.now();
178
+ const results = await Promise.all([1, 2, 3].map(() => extractor.extract('.hang', Buffer.from('x'))));
179
+ expect(results.map((r) => !r.ok && r.failure)).toEqual(['timeout', 'timeout', 'timeout']);
180
+ // Side by side, not one after another: none waited a budget for a worker.
181
+ expect(Date.now() - started).toBeLessThan(1_000);
182
+ });
183
+
184
+ it('answers a worker that dies under the job as crashed, and one that cannot load the same way', async () => {
185
+ extractor = new WorkerDocumentExtractor({ entry: fixtureEntry('misbehaving-extract.worker.ts') });
186
+ expect(await extractor.extract('.exit', Buffer.from('x'))).toEqual({
187
+ ok: false,
188
+ failure: 'crashed',
189
+ message: 'could not be read: its extraction stopped unexpectedly (exit code 3)',
190
+ });
191
+ await extractor.close();
192
+ extractor = new WorkerDocumentExtractor({ entry: fixtureEntry('unloadable-extract.worker.ts') });
193
+ const res = await extractor.extract('.pdf', Buffer.from('x'));
194
+ expect(res.ok).toBe(false);
195
+ expect(!res.ok && res.failure).toBe('crashed');
196
+ expect(!res.ok && res.message).toBe(EXTRACTION_WORKER_FAILED);
197
+ expect(processSaw).toEqual([]);
198
+ });
199
+
200
+ it('answers a parser that did not load as crashed — remembered for the hour, not for good', async () => {
201
+ extractor = new WorkerDocumentExtractor({ entry: fixtureEntry('misbehaving-extract.worker.ts') });
202
+ expect(await extractor.extract('.transient', Buffer.from('x'))).toEqual({
203
+ ok: false,
204
+ failure: 'crashed',
205
+ message: 'could not be read: the PDF reader did not load on the server; try again later',
206
+ });
207
+ });
208
+
209
+ it('answers busy — nothing learned about the file — when every worker is taken and no one may wait', async () => {
210
+ extractor = new WorkerDocumentExtractor({
211
+ entry: fixtureEntry('misbehaving-extract.worker.ts'),
212
+ budgetMs: 500,
213
+ poolMax: 1,
214
+ maxWaiting: 0,
215
+ });
216
+ const hanging = extractor.extract('.hang', Buffer.from('x'));
217
+ await new Promise((r) => setTimeout(r, 50));
218
+ expect(await extractor.extract('.echo', Buffer.from('y'))).toMatchObject({ ok: false, failure: 'busy' });
219
+ expect(await hanging).toMatchObject({ failure: 'timeout' });
220
+ });
221
+
222
+ it('answers busy for an extraction running when the graph stops', async () => {
223
+ extractor = new WorkerDocumentExtractor({ entry: fixtureEntry('misbehaving-extract.worker.ts'), budgetMs: 5_000 });
224
+ const hanging = extractor.extract('.hang', Buffer.from('x'));
225
+ await new Promise((r) => setTimeout(r, 300));
226
+ await extractor.close();
227
+ expect(await hanging).toMatchObject({ ok: false, failure: 'busy' });
228
+ });
229
+ });
@@ -2,6 +2,7 @@ import { tmpdir } from 'node:os';
2
2
  import { join } from 'node:path';
3
3
  import { describe, expect, it } from 'vitest';
4
4
  import { DocExtractService } from '../doc-extract.service.js';
5
+ import { WorkerDocumentExtractor } from '../extract-in-worker.js';
5
6
  import { DocumentReader } from '../document-reader.js';
6
7
  import { EmailReader } from '../email-reader.js';
7
8
  import { FileReaderRegistry, type FileReader, type ReadResult } from '../file-reader.js';
@@ -21,7 +22,7 @@ import { accessFrontmatterExtensionList } from '../../../access-model/access-gra
21
22
  */
22
23
 
23
24
  const registry = createFileReaderRegistry(
24
- new DocExtractService(join(tmpdir(), 'bevel-test-file-reader-registry')),
25
+ new DocExtractService(join(tmpdir(), 'bevel-test-file-reader-registry'), new WorkerDocumentExtractor()),
25
26
  );
26
27
 
27
28
  describe('file-reader registry routing', () => {