@opengeni/api-router 0.30.3 → 1.0.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 (434) hide show
  1. package/dist/access-grant-rls.d.ts +3 -0
  2. package/dist/admission-trace.d.ts +8 -0
  3. package/dist/api-websocket.d.ts +18 -0
  4. package/dist/app.d.ts +50 -2
  5. package/dist/app.js +12 -1
  6. package/dist/artifact-catalog-cursor.d.ts +27 -0
  7. package/dist/auth/managed-auth-attempt-context.d.ts +10 -0
  8. package/dist/auth/managed-auth-rate-limits.d.ts +167 -0
  9. package/dist/auth/managed-auth-session-adapter.d.ts +6 -0
  10. package/dist/auth/managed-auth.d.ts +102 -3
  11. package/dist/auth/managed-email.d.ts +29 -0
  12. package/dist/auth/managed-sign-in-notifications.d.ts +4 -0
  13. package/dist/auth/new-signups-gate.d.ts +23 -0
  14. package/dist/auth/organization-user-setup.d.ts +80 -0
  15. package/dist/auth/signup-funnel-metrics.d.ts +44 -0
  16. package/dist/browser-controller-authority.d.ts +1 -61
  17. package/dist/browser-ephemeral.d.ts +5 -0
  18. package/dist/browser-state-authority.d.ts +1 -27
  19. package/dist/chunk-6TZ5LG3O.js +123948 -0
  20. package/dist/chunk-6TZ5LG3O.js.map +1 -0
  21. package/dist/chunk-OGQDXVXY.js +18 -0
  22. package/dist/chunk-OGQDXVXY.js.map +1 -0
  23. package/dist/claude-subscription-account-conflicts.d.ts +1 -0
  24. package/dist/claude-subscription-account-usage.d.ts +39 -0
  25. package/dist/claude-subscription-oauth.d.ts +25 -0
  26. package/dist/claude-subscription-profile.d.ts +9 -0
  27. package/dist/claude-subscription-usage.d.ts +44 -0
  28. package/dist/claude-workspace-connection.d.ts +15 -0
  29. package/dist/codemode.d.ts +32 -1
  30. package/dist/company-brain-okf.d.ts +24 -0
  31. package/dist/connected-machine-computer-access.d.ts +11 -0
  32. package/dist/connection-ownership.d.ts +54 -0
  33. package/dist/controller-data-plane.d.ts +32 -0
  34. package/dist/editable-artifact-source-session.d.ts +3 -0
  35. package/dist/editable-artifact-websocket.d.ts +10 -18
  36. package/dist/editable-artifact-workspace-files.d.ts +1 -1
  37. package/dist/fatal-process-boundary.d.ts +25 -0
  38. package/dist/github-access.d.ts +31 -2
  39. package/dist/http/acting-person.d.ts +24 -0
  40. package/dist/http/api-contract-compat.d.ts +19 -0
  41. package/dist/http/api-error.d.ts +27 -1
  42. package/dist/http/cors.d.ts +17 -0
  43. package/dist/http/deprecation.d.ts +42 -0
  44. package/dist/http/interaction-control-error.d.ts +13 -0
  45. package/dist/http/keyed-admission.d.ts +12 -0
  46. package/dist/http/local-browser-boundary.d.ts +72 -0
  47. package/dist/http/metrics-listener.d.ts +22 -0
  48. package/dist/http/path-identifier.d.ts +17 -0
  49. package/dist/http/registered-route-label.d.ts +16 -0
  50. package/dist/http/request-body.d.ts +27 -0
  51. package/dist/http/request-source.d.ts +52 -0
  52. package/dist/http/sse.d.ts +17 -6
  53. package/dist/http/unmatched-route.d.ts +18 -0
  54. package/dist/http/user-content.d.ts +36 -0
  55. package/dist/http/websocket-upgrade-dispatch.d.ts +18 -0
  56. package/dist/index.d.ts +10 -3
  57. package/dist/index.js +1091 -162
  58. package/dist/index.js.map +1 -1
  59. package/dist/integration-endpoint-test.d.ts +20 -0
  60. package/dist/integrations/api-integrations.d.ts +2 -2
  61. package/dist/integrations/atlassian.d.ts +29 -3
  62. package/dist/integrations/connect-authority.d.ts +1 -0
  63. package/dist/integrations/connect-callback-return.d.ts +6 -0
  64. package/dist/integrations/fiken.d.ts +16 -2
  65. package/dist/integrations/github-app-connect.d.ts +47 -0
  66. package/dist/integrations/github-installation-proof.d.ts +3 -0
  67. package/dist/integrations/github-lens-connect.d.ts +116 -0
  68. package/dist/integrations/github-skill-source.d.ts +1 -5
  69. package/dist/integrations/google-drive.d.ts +24 -0
  70. package/dist/integrations/integration-commit-authority.d.ts +13 -0
  71. package/dist/integrations/marketplace-plugin.d.ts +2691 -0
  72. package/dist/integrations/oauth-client.d.ts +178 -18
  73. package/dist/integrations/oauth-profiles.d.ts +222 -0
  74. package/dist/integrations/oauth-return-path.d.ts +1 -0
  75. package/dist/integrations/personal-github-repositories.d.ts +84 -0
  76. package/dist/integrations/personal-github.d.ts +42 -0
  77. package/dist/integrations/pr-review-provider.d.ts +22 -0
  78. package/dist/integrations/provider-oauth.d.ts +19 -1
  79. package/dist/integrations/slack-app-home.d.ts +24 -0
  80. package/dist/integrations/slack-bot.d.ts +367 -12
  81. package/dist/integrations/slack-file-upload-flow.d.ts +62 -0
  82. package/dist/integrations/slack-install.d.ts +20 -0
  83. package/dist/integrations/slack-interactions.d.ts +107 -9
  84. package/dist/integrations/slack-mrkdwn.d.ts +41 -0
  85. package/dist/integrations/slack-routing.d.ts +120 -0
  86. package/dist/integrations/slack-session-defaults.d.ts +58 -0
  87. package/dist/integrations/slack-task-file-upload.d.ts +36 -0
  88. package/dist/integrations/social-oauth.d.ts +7 -0
  89. package/dist/interaction-agent-access.d.ts +15 -0
  90. package/dist/interaction-frame-proxy.d.ts +68 -0
  91. package/dist/interaction-metrics.d.ts +2 -0
  92. package/dist/mcp/action-catalog-types.d.ts +9 -0
  93. package/dist/mcp/action-catalog.gen.d.ts +2 -0
  94. package/dist/mcp/capability-account-readiness.d.ts +7 -0
  95. package/dist/mcp/child-read-evidence.d.ts +9 -0
  96. package/dist/mcp/command-read.d.ts +24 -0
  97. package/dist/mcp/company-profile-agent-admin.d.ts +44 -0
  98. package/dist/mcp/contract-input.d.ts +11 -0
  99. package/dist/mcp/documents.d.ts +7 -5
  100. package/dist/mcp/files.d.ts +2 -2
  101. package/dist/mcp/first-party-tool-permissions.d.ts +650 -0
  102. package/dist/mcp/knowledge-entries.d.ts +5 -0
  103. package/dist/mcp/orchestration-failure-diagnostic.d.ts +43 -0
  104. package/dist/mcp/receipts.d.ts +9 -0
  105. package/dist/mcp/request-abort.d.ts +19 -0
  106. package/dist/mcp/scheduled-task-input.d.ts +1189 -0
  107. package/dist/mcp/scheduled-task-view.d.ts +22 -4
  108. package/dist/mcp/server.d.ts +255 -3
  109. package/dist/mcp/session-event-view.d.ts +94 -0
  110. package/dist/mcp/session-view.d.ts +66 -2
  111. package/dist/mcp/session-wait.d.ts +174 -0
  112. package/dist/mcp-oauth.d.ts +52 -0
  113. package/dist/model-catalog.d.ts +11 -31
  114. package/dist/observability.d.ts +3 -1
  115. package/dist/organization-mcp.d.ts +52 -0
  116. package/dist/organization-recovery-notifications.d.ts +41 -0
  117. package/dist/routes/analytics-consent.d.ts +26 -0
  118. package/dist/routes/api-integrations.d.ts +25 -0
  119. package/dist/routes/api-keys.d.ts +17 -0
  120. package/dist/routes/artifact-catalog.d.ts +6 -0
  121. package/dist/routes/automations.d.ts +19 -0
  122. package/dist/routes/billing.d.ts +49 -0
  123. package/dist/routes/browser-sessions.d.ts +59 -2
  124. package/dist/routes/claude-subscription-accounts.d.ts +3 -0
  125. package/dist/routes/claude-subscription-oauth.d.ts +3 -0
  126. package/dist/routes/client-errors.d.ts +146 -0
  127. package/dist/routes/codex.d.ts +76 -2
  128. package/dist/routes/company-brain.d.ts +3 -0
  129. package/dist/routes/company-profile.d.ts +2 -1
  130. package/dist/routes/computer-sessions.d.ts +14 -0
  131. package/dist/routes/connect.d.ts +5 -0
  132. package/dist/routes/editable-artifacts.d.ts +2 -0
  133. package/dist/routes/external-identity-links.d.ts +6 -0
  134. package/dist/routes/feedback.d.ts +3 -0
  135. package/dist/routes/github-browser-pages.d.ts +12 -0
  136. package/dist/routes/github.d.ts +2 -0
  137. package/dist/routes/insights-response-cache.d.ts +10 -0
  138. package/dist/routes/insights-usage.d.ts +12 -0
  139. package/dist/routes/insights.d.ts +30 -1
  140. package/dist/routes/knowledge.d.ts +3 -0
  141. package/dist/routes/managed-auth-session-sets.d.ts +26 -0
  142. package/dist/routes/managed-onboarding.d.ts +29 -0
  143. package/dist/routes/managed-sign-in-methods.d.ts +6 -0
  144. package/dist/routes/model-connection-access.d.ts +3 -0
  145. package/dist/routes/organization-integration-policy.d.ts +3 -0
  146. package/dist/routes/organization-integrations.d.ts +6 -0
  147. package/dist/routes/organization-mcp-connections.d.ts +3 -0
  148. package/dist/routes/organization-model-providers.d.ts +3 -0
  149. package/dist/routes/organization-recovery.d.ts +19 -0
  150. package/dist/routes/organization-service-accounts.d.ts +3 -0
  151. package/dist/routes/organization-sessions.d.ts +26 -0
  152. package/dist/routes/personal-github-git-broker.d.ts +29 -0
  153. package/dist/routes/personal-github.d.ts +3 -0
  154. package/dist/routes/pr-review-github.d.ts +3 -0
  155. package/dist/routes/pr-review.d.ts +3 -0
  156. package/dist/routes/session-artifact-associations.d.ts +4 -0
  157. package/dist/routes/session-history-imports.d.ts +9 -0
  158. package/dist/routes/sessions.d.ts +44 -6
  159. package/dist/routes/skill-content.d.ts +4 -0
  160. package/dist/routes/skill-install-authority.d.ts +6 -0
  161. package/dist/routes/subscription-account-pools.d.ts +34 -0
  162. package/dist/routes/subscription-pool-access.d.ts +16 -0
  163. package/dist/routes/supergrok.d.ts +6 -1
  164. package/dist/routes/usage-allowances.d.ts +12 -0
  165. package/dist/routes/user-resource-authorities.d.ts +3 -0
  166. package/dist/routes/workspace-artifacts.d.ts +2 -1
  167. package/dist/routes/workspace-capture.d.ts +10 -2
  168. package/dist/routes/workspace-integrations.d.ts +35 -0
  169. package/dist/routes/workspace-learning.d.ts +3 -0
  170. package/dist/routes/workspace-model-providers.d.ts +4 -0
  171. package/dist/routes/workspaces.d.ts +29 -0
  172. package/dist/sandbox/auth-callout.d.ts +8 -0
  173. package/dist/sandbox/channel-a.d.ts +19 -1
  174. package/dist/sandbox/connection-authority.d.ts +3 -0
  175. package/dist/sandbox/enrollment.d.ts +9 -1
  176. package/dist/sandbox/machines.d.ts +5 -2
  177. package/dist/sandbox/metrics-ingestion.d.ts +28 -20
  178. package/dist/sandbox/rematerialize.d.ts +2 -0
  179. package/dist/sandbox/session-attach-variable-sets.d.ts +30 -0
  180. package/dist/sandbox/viewer.d.ts +26 -1
  181. package/dist/sandbox-file-artifacts.d.ts +50 -0
  182. package/dist/scheduled-task-deletion.d.ts +13 -0
  183. package/dist/session-create-observability.d.ts +5 -0
  184. package/dist/session-event-view-MPS2OZD3.js +292 -0
  185. package/dist/session-event-view-MPS2OZD3.js.map +1 -0
  186. package/dist/site-session-origin.d.ts +13 -0
  187. package/dist/site-uploads.d.ts +41 -0
  188. package/dist/slack-reaction-files.d.ts +1 -1
  189. package/dist/temporal-schedule-cleanup.d.ts +1 -0
  190. package/dist/temporal-schedule-sync.d.ts +26 -0
  191. package/dist/transcription/providers/xai-subscription.d.ts +1 -0
  192. package/dist/transcription/service.d.ts +2 -1
  193. package/dist/work-discovery-observability.d.ts +33 -0
  194. package/dist/workspace-artifact-content.d.ts +28 -0
  195. package/dist/workspace-artifact-provenance.d.ts +7 -0
  196. package/dist/workspace-delete-observability.d.ts +10 -0
  197. package/dist/workspace-deletion.d.ts +6 -0
  198. package/dist/workspace-state-projection.d.ts +3 -5
  199. package/dist/workspace-tool-gateway-observability.d.ts +17 -0
  200. package/dist/workspace-tool-gateway.d.ts +123 -0
  201. package/dist/workspace-webhook-dispatch.d.ts +26 -0
  202. package/package.json +23 -19
  203. package/src/access-grant-rls.ts +75 -0
  204. package/src/admission-trace.ts +14 -0
  205. package/src/api-websocket.ts +23 -0
  206. package/src/app.ts +1967 -252
  207. package/src/artifact-catalog-cursor.ts +60 -0
  208. package/src/auth/managed-auth-attempt-context.ts +70 -0
  209. package/src/auth/managed-auth-rate-limits.ts +252 -0
  210. package/src/auth/managed-auth-session-adapter.ts +222 -0
  211. package/src/auth/managed-auth.ts +536 -60
  212. package/src/auth/managed-email.ts +174 -0
  213. package/src/auth/managed-sign-in-notifications.ts +81 -0
  214. package/src/auth/new-signups-gate.ts +49 -0
  215. package/src/auth/organization-user-setup.ts +307 -0
  216. package/src/auth/signup-funnel-metrics.ts +164 -0
  217. package/src/browser-controller-authority.ts +1 -186
  218. package/src/browser-ephemeral.ts +39 -0
  219. package/src/browser-state-authority.ts +1 -236
  220. package/src/claude-subscription-account-conflicts.ts +12 -0
  221. package/src/claude-subscription-account-usage.ts +48 -0
  222. package/src/claude-subscription-oauth.ts +362 -0
  223. package/src/claude-subscription-profile.ts +73 -0
  224. package/src/claude-subscription-usage.ts +97 -0
  225. package/src/claude-workspace-connection.ts +82 -0
  226. package/src/codemode.ts +194 -30
  227. package/src/codex-realtime.ts +8 -2
  228. package/src/company-brain-okf.ts +340 -0
  229. package/src/connected-machine-computer-access.ts +33 -0
  230. package/src/connection-ownership.ts +199 -0
  231. package/src/controller-data-plane.ts +81 -0
  232. package/src/editable-artifact-native-kernel.ts +26 -15
  233. package/src/editable-artifact-office-import.ts +28 -3
  234. package/src/editable-artifact-production.ts +23 -7
  235. package/src/editable-artifact-source-session.ts +123 -0
  236. package/src/editable-artifact-websocket.ts +27 -21
  237. package/src/editable-artifact-workspace-files.ts +31 -6
  238. package/src/fatal-process-boundary.ts +246 -0
  239. package/src/gateway-realtime.ts +1 -1
  240. package/src/github-access.ts +147 -5
  241. package/src/http/acting-person.ts +71 -0
  242. package/src/http/api-contract-compat.ts +49 -0
  243. package/src/http/api-error.ts +115 -1
  244. package/src/http/auth.ts +48 -0
  245. package/src/http/cors.ts +67 -0
  246. package/src/http/deprecation.ts +118 -0
  247. package/src/http/interaction-control-error.ts +164 -0
  248. package/src/http/keyed-admission.ts +29 -0
  249. package/src/http/local-browser-boundary.ts +343 -0
  250. package/src/http/metrics-listener.ts +57 -0
  251. package/src/http/path-identifier.ts +54 -0
  252. package/src/http/registered-route-label.ts +34 -0
  253. package/src/http/request-body.ts +127 -0
  254. package/src/http/request-source.ts +178 -0
  255. package/src/http/sse.ts +486 -132
  256. package/src/http/unmatched-route.ts +60 -0
  257. package/src/http/user-content.ts +158 -0
  258. package/src/http/websocket-upgrade-dispatch.ts +29 -0
  259. package/src/index.ts +157 -52
  260. package/src/integration-endpoint-test.ts +291 -0
  261. package/src/integrations/api-integrations.ts +98 -11
  262. package/src/integrations/atlassian.ts +474 -136
  263. package/src/integrations/connect-authority.ts +2 -0
  264. package/src/integrations/connect-callback-return.ts +86 -0
  265. package/src/integrations/fiken.ts +354 -64
  266. package/src/integrations/github-app-connect.ts +435 -0
  267. package/src/integrations/github-installation-proof.ts +60 -0
  268. package/src/integrations/github-lens-connect.ts +76 -0
  269. package/src/integrations/github-skill-source.ts +2 -142
  270. package/src/integrations/google-drive.ts +717 -225
  271. package/src/integrations/integration-commit-authority.ts +69 -0
  272. package/src/integrations/marketplace-plugin.ts +48 -0
  273. package/src/integrations/oauth-client.ts +1356 -459
  274. package/src/integrations/oauth-profiles.ts +537 -0
  275. package/src/integrations/oauth-return-path.ts +18 -0
  276. package/src/integrations/personal-github-repositories.ts +674 -0
  277. package/src/integrations/personal-github.ts +825 -0
  278. package/src/integrations/pr-review-provider.ts +246 -0
  279. package/src/integrations/provider-oauth.ts +250 -22
  280. package/src/integrations/slack-app-home.ts +300 -0
  281. package/src/integrations/slack-bot.ts +963 -239
  282. package/src/integrations/slack-file-upload-flow.ts +147 -0
  283. package/src/integrations/slack-install.ts +83 -0
  284. package/src/integrations/slack-interactions.ts +3167 -474
  285. package/src/integrations/slack-mrkdwn.ts +193 -0
  286. package/src/integrations/slack-routing.ts +337 -0
  287. package/src/integrations/slack-session-defaults.ts +224 -0
  288. package/src/integrations/slack-task-file-upload.ts +323 -0
  289. package/src/integrations/social-oauth.ts +213 -15
  290. package/src/interaction-agent-access.ts +48 -0
  291. package/src/interaction-frame-proxy.ts +409 -0
  292. package/src/interaction-metrics.ts +30 -0
  293. package/src/mcp/action-catalog-types.ts +9 -0
  294. package/src/mcp/action-catalog.gen.ts +6696 -0
  295. package/src/mcp/capability-account-readiness.ts +17 -0
  296. package/src/mcp/child-read-evidence.ts +19 -0
  297. package/src/mcp/command-read.ts +109 -0
  298. package/src/mcp/company-profile-agent-admin.ts +198 -0
  299. package/src/mcp/contract-input.ts +141 -0
  300. package/src/mcp/documents.ts +65 -377
  301. package/src/mcp/editable-artifacts.ts +12 -6
  302. package/src/mcp/files.ts +80 -43
  303. package/src/mcp/first-party-tool-permissions.ts +305 -0
  304. package/src/mcp/knowledge-entries.ts +322 -0
  305. package/src/mcp/orchestration-failure-diagnostic.ts +43 -0
  306. package/src/mcp/receipts.ts +34 -0
  307. package/src/mcp/request-abort.ts +44 -0
  308. package/src/mcp/scheduled-task-input.ts +76 -0
  309. package/src/mcp/scheduled-task-view.ts +44 -3
  310. package/src/mcp/server.ts +3030 -1267
  311. package/src/mcp/session-event-view.ts +383 -0
  312. package/src/mcp/session-view.ts +84 -3
  313. package/src/mcp/session-wait.ts +665 -0
  314. package/src/mcp-oauth.ts +1123 -0
  315. package/src/model-catalog.ts +91 -333
  316. package/src/observability.ts +15 -1
  317. package/src/organization-mcp.ts +397 -0
  318. package/src/organization-recovery-notifications.ts +103 -0
  319. package/src/routes/analytics-consent.ts +123 -0
  320. package/src/routes/api-integrations.ts +364 -74
  321. package/src/routes/api-keys.ts +336 -10
  322. package/src/routes/artifact-catalog.ts +279 -0
  323. package/src/routes/automations.ts +768 -0
  324. package/src/routes/billing.ts +461 -46
  325. package/src/routes/browser-sessions.ts +780 -112
  326. package/src/routes/canonical-human-identities.ts +90 -14
  327. package/src/routes/capabilities.ts +107 -6
  328. package/src/routes/channels.ts +20 -3
  329. package/src/routes/claude-subscription-accounts.ts +334 -0
  330. package/src/routes/claude-subscription-oauth.ts +142 -0
  331. package/src/routes/client-errors.ts +362 -0
  332. package/src/routes/codex.ts +833 -116
  333. package/src/routes/company-brain.ts +322 -0
  334. package/src/routes/company-profile.ts +65 -1
  335. package/src/routes/computer-sessions.ts +557 -106
  336. package/src/routes/connect.ts +1938 -0
  337. package/src/routes/connections.ts +1039 -349
  338. package/src/routes/documents.ts +488 -287
  339. package/src/routes/editable-artifacts.ts +79 -9
  340. package/src/routes/enrollments.ts +135 -39
  341. package/src/routes/environments.ts +154 -58
  342. package/src/routes/external-identity-links.ts +201 -0
  343. package/src/routes/feedback.ts +113 -0
  344. package/src/routes/files.ts +267 -33
  345. package/src/routes/github-browser-pages.ts +162 -0
  346. package/src/routes/github.ts +446 -144
  347. package/src/routes/insights-response-cache.ts +83 -0
  348. package/src/routes/insights-usage.ts +345 -0
  349. package/src/routes/insights.ts +153 -19
  350. package/src/routes/install.ts +133 -38
  351. package/src/routes/integration-facets.ts +107 -33
  352. package/src/routes/interaction-resources.ts +30 -3
  353. package/src/routes/knowledge.ts +488 -0
  354. package/src/routes/machines.ts +313 -15
  355. package/src/routes/managed-auth-session-sets.ts +1218 -0
  356. package/src/routes/managed-onboarding.ts +337 -0
  357. package/src/routes/managed-sign-in-methods.ts +433 -0
  358. package/src/routes/memory-slack-publications.ts +3 -2
  359. package/src/routes/model-connection-access.ts +208 -0
  360. package/src/routes/organization-integration-policy.ts +116 -0
  361. package/src/routes/organization-integrations.ts +326 -0
  362. package/src/routes/organization-mcp-connections.ts +178 -0
  363. package/src/routes/organization-memberships.ts +1019 -27
  364. package/src/routes/organization-model-providers.ts +293 -0
  365. package/src/routes/organization-recovery.ts +325 -0
  366. package/src/routes/organization-service-accounts.ts +128 -0
  367. package/src/routes/organization-sessions.ts +350 -0
  368. package/src/routes/personal-github-git-broker.ts +785 -0
  369. package/src/routes/personal-github.ts +370 -0
  370. package/src/routes/plugins.ts +251 -22
  371. package/src/routes/pr-review-github.ts +881 -0
  372. package/src/routes/pr-review.ts +622 -0
  373. package/src/routes/preference-registry.ts +12 -93
  374. package/src/routes/rigs.ts +167 -50
  375. package/src/routes/scheduled-tasks.ts +346 -41
  376. package/src/routes/session-artifact-associations.ts +87 -0
  377. package/src/routes/session-history-imports.ts +280 -0
  378. package/src/routes/sessions.ts +2306 -264
  379. package/src/routes/skill-content.ts +297 -0
  380. package/src/routes/skill-install-authority.ts +64 -0
  381. package/src/routes/skills.ts +62 -9
  382. package/src/routes/social.ts +46 -18
  383. package/src/routes/subscription-account-pools.ts +436 -0
  384. package/src/routes/subscription-pool-access.ts +126 -0
  385. package/src/routes/supergrok.ts +219 -303
  386. package/src/routes/transcription-recordings.ts +38 -3
  387. package/src/routes/transcriptions.ts +4 -0
  388. package/src/routes/usage-allowances.ts +378 -0
  389. package/src/routes/user-resource-authorities.ts +138 -0
  390. package/src/routes/video-generation.ts +14 -10
  391. package/src/routes/workspace-artifacts.ts +275 -69
  392. package/src/routes/workspace-capture.ts +21 -0
  393. package/src/routes/workspace-integrations.ts +576 -0
  394. package/src/routes/workspace-learning.ts +159 -0
  395. package/src/routes/workspace-model-providers.ts +148 -0
  396. package/src/routes/workspace-state.ts +38 -25
  397. package/src/routes/workspaces.ts +1004 -127
  398. package/src/sandbox/auth-callout.ts +96 -19
  399. package/src/sandbox/channel-a.ts +323 -24
  400. package/src/sandbox/connection-authority.ts +3 -0
  401. package/src/sandbox/enrollment.ts +81 -6
  402. package/src/sandbox/machines.ts +218 -76
  403. package/src/sandbox/metrics-ingestion.ts +411 -62
  404. package/src/sandbox/rematerialize.ts +121 -19
  405. package/src/sandbox/session-attach-variable-sets.ts +131 -0
  406. package/src/sandbox/viewer.ts +280 -25
  407. package/src/sandbox-file-artifacts.ts +413 -0
  408. package/src/scheduled-task-deletion.ts +138 -0
  409. package/src/session-create-observability.ts +46 -0
  410. package/src/session-realtime-context.ts +6 -3
  411. package/src/site-session-origin.ts +48 -0
  412. package/src/site-uploads.ts +224 -0
  413. package/src/slack-reaction-files.ts +16 -5
  414. package/src/temporal-schedule-cleanup.ts +13 -0
  415. package/src/temporal-schedule-sync.ts +74 -0
  416. package/src/transcription/providers/codex-subscription.ts +2 -0
  417. package/src/transcription/providers/openai.ts +1 -0
  418. package/src/transcription/providers/xai-subscription.ts +49 -3
  419. package/src/transcription/segmenter.ts +8 -2
  420. package/src/transcription/service.ts +43 -6
  421. package/src/work-discovery-observability.ts +121 -0
  422. package/src/workspace-artifact-content.ts +144 -0
  423. package/src/workspace-artifact-provenance.ts +104 -0
  424. package/src/workspace-delete-observability.ts +75 -0
  425. package/src/workspace-deletion.ts +73 -0
  426. package/src/workspace-state-projection.ts +18 -148
  427. package/src/workspace-tool-gateway-observability.ts +100 -0
  428. package/src/workspace-tool-gateway.ts +870 -0
  429. package/src/workspace-webhook-dispatch.ts +190 -0
  430. package/src/xai-subscription-auth.ts +9 -2
  431. package/dist/chunk-WCXHI3FF.js +0 -49920
  432. package/dist/chunk-WCXHI3FF.js.map +0 -1
  433. package/dist/routes/packs.d.ts +0 -3
  434. package/src/routes/packs.ts +0 -729
@@ -1,18 +1,35 @@
1
+ import { z } from "zod";
1
2
  import {
2
3
  CreateScheduledTaskRequest,
4
+ RefreshScheduledTaskAccessRequest,
5
+ ScheduledTaskSlackChannelId,
6
+ ScheduledTaskSlackChannelListResponse,
3
7
  TriggerScheduledTaskRequest,
4
8
  UpdateScheduledTaskRequest,
9
+ type AccessGrant,
5
10
  } from "@opengeni/contracts";
6
11
  import {
7
- deleteScheduledTask,
12
+ getScheduledTaskRevisionAuthoritySubject,
8
13
  listScheduledTaskRuns,
9
14
  listScheduledTasks,
10
- updateScheduledTask,
11
15
  } from "@opengeni/db";
12
16
  import type { Hono } from "hono";
17
+ import type { ScheduledTask } from "@opengeni/contracts";
13
18
  import { HTTPException } from "hono/http-exception";
14
- import { requireAccessGrant } from "@opengeni/core";
15
- import { recordWorkspaceUsage, requireLimit } from "@opengeni/core";
19
+ import {
20
+ isAuthenticatedPersonAuthorization,
21
+ requireAccessGrant,
22
+ requireAccessGrantAuthorization,
23
+ requirePermission,
24
+ resolveWorkspaceCatalogSettings,
25
+ validateOpenGeniSlackBotConnectionSelection,
26
+ type ScheduledTaskSlackChannelVerifier,
27
+ } from "@opengeni/core";
28
+ import {
29
+ recordWorkspaceUsage,
30
+ requireLimit,
31
+ resolveScheduledTaskPreflightModel,
32
+ } from "@opengeni/core";
16
33
  import type { ApiRouteDeps } from "@opengeni/core";
17
34
  import {
18
35
  captureScheduledTaskRestoreState,
@@ -26,20 +43,152 @@ import {
26
43
  requireScheduledTaskForApi,
27
44
  syncCreatedScheduledTask,
28
45
  syncUpdatedScheduledTask,
46
+ updateScheduledTaskForApi,
47
+ triggerScheduledTaskForGrant,
48
+ validateScheduledTaskMachineTarget,
29
49
  validateScheduledTaskTarget,
30
50
  validatedScheduledTaskUpdate,
51
+ listScheduledTaskAccessAttention,
52
+ refreshScheduledTaskAccess,
53
+ scheduledTaskAccessSource,
54
+ withScheduledTaskPolicyDrift,
55
+ withScheduledTaskRunAccessFailures,
31
56
  } from "@opengeni/core";
57
+ import type { AccessGrantAuthorization } from "@opengeni/core";
32
58
  import { boundedLimit } from "../http/common";
33
- import { revokeKnowledgeSourceScheduleAuthorization } from "../integrations/google-drive";
34
- import { revokeAtlassianScheduleAuthorization } from "../integrations/atlassian";
59
+ import { permissionsRequiredByFirstPartyTools } from "../mcp/first-party-tool-permissions";
60
+ import {
61
+ createOpenGeniSlackBotInteractionClient,
62
+ verifyScheduledTaskSlackChannel,
63
+ } from "../integrations/slack-bot";
64
+ import { deleteScheduledTaskWithDurableCleanup } from "../scheduled-task-deletion";
65
+ import { parseRequestBody, readRequestJson } from "../http/request-body";
35
66
 
36
67
  export function registerScheduledTaskRoutes(app: Hono, deps: ApiRouteDeps): void {
37
- const { settings, db, workflowClient, objectStorage } = deps;
68
+ const { db, workflowClient, objectStorage } = deps;
69
+ const slackChannelVerifier =
70
+ (grant: AccessGrant): ScheduledTaskSlackChannelVerifier =>
71
+ async ({ connectionId, channelId }) =>
72
+ await verifyScheduledTaskSlackChannel(deps, {
73
+ accountId: grant.accountId,
74
+ workspaceId: grant.workspaceId,
75
+ subjectId: grant.subjectId,
76
+ connectionId,
77
+ channelId,
78
+ });
79
+
80
+ // Channels a person may choose as a task's fixed Slack destination: active,
81
+ // non-shared channels the selected OpenGeni bot already belongs to.
82
+ app.get("/v1/workspaces/:workspaceId/scheduled-task-slack-channels", async (c) => {
83
+ const workspaceId = c.req.param("workspaceId");
84
+ const authorization = await requireAccessGrantAuthorization(
85
+ c,
86
+ deps,
87
+ workspaceId,
88
+ "scheduled_tasks:manage",
89
+ );
90
+ const grant = authorization.grant;
91
+ requirePermission(grant, "connections:write");
92
+ if (!isAuthenticatedPersonAuthorization(authorization)) {
93
+ throw new HTTPException(403, {
94
+ message: "Only a person can choose the Slack channel a scheduled task posts to",
95
+ });
96
+ }
97
+ const connectionId = c.req.query("connectionId");
98
+ if (!connectionId || !z.string().uuid().safeParse(connectionId).success) {
99
+ throw new HTTPException(400, { message: "connectionId is required" });
100
+ }
101
+ const cursor = c.req.query("cursor");
102
+ if (cursor !== undefined && cursor.length > 1_024) {
103
+ throw new HTTPException(400, { message: "invalid cursor" });
104
+ }
105
+ await validateOpenGeniSlackBotConnectionSelection(db, grant, workspaceId, connectionId);
106
+ const client = await createOpenGeniSlackBotInteractionClient(deps, {
107
+ accountId: grant.accountId,
108
+ workspaceId,
109
+ connectionId,
110
+ subjectId: grant.subjectId,
111
+ });
112
+ const result = await client.listChannels({ limit: 200, ...(cursor ? { cursor } : {}) });
113
+ c.header("cache-control", "private, no-store");
114
+ return c.json(
115
+ ScheduledTaskSlackChannelListResponse.parse({
116
+ channels: result.channels
117
+ .filter(
118
+ (channel) =>
119
+ channel.isMember &&
120
+ !channel.isArchived &&
121
+ !channel.isShared &&
122
+ !channel.isExternallyShared &&
123
+ !channel.isOrgShared &&
124
+ ScheduledTaskSlackChannelId.safeParse(channel.id).success,
125
+ )
126
+ .map((channel) => ({ id: channel.id, name: channel.name, isPrivate: channel.isPrivate })),
127
+ nextCursor: result.nextCursor || null,
128
+ }),
129
+ );
130
+ });
131
+
132
+ // Drift is advisory: it is attached for viewers who can act on a task and
133
+ // never fails the read it decorates.
134
+ async function withPolicyDrift(
135
+ authorization: AccessGrantAuthorization,
136
+ tasks: ScheduledTask[],
137
+ ): Promise<ScheduledTask[]> {
138
+ if (!tasks.some((task) => scheduledTaskAccessSource(task, authorization.grant))) {
139
+ return tasks;
140
+ }
141
+ const catalogSettings = (
142
+ await resolveWorkspaceCatalogSettings(db, deps.settings, {
143
+ accountId: authorization.grant.accountId,
144
+ workspaceId: authorization.grant.workspaceId,
145
+ })
146
+ ).settings;
147
+ return await withScheduledTaskPolicyDrift({
148
+ db,
149
+ settings: catalogSettings,
150
+ authorization,
151
+ tasks,
152
+ permissionsRequiredByTools: permissionsRequiredByFirstPartyTools,
153
+ onError: (error) => {
154
+ deps.observability?.warn("Scheduled task access drift could not be computed", {
155
+ errorClass: error instanceof Error ? error.name : "ScheduledTaskPolicyDriftError",
156
+ origin: "api",
157
+ });
158
+ },
159
+ });
160
+ }
161
+
162
+ // Registered before `/:taskId` so the literal segment is never read as an id.
163
+ app.get("/v1/workspaces/:workspaceId/scheduled-tasks/attention", async (c) => {
164
+ const workspaceId = c.req.param("workspaceId");
165
+ const grant = await requireAccessGrant(c, deps, workspaceId, "scheduled_tasks:run");
166
+ // The account plan reads only the MCP registry and tool defaults, which the
167
+ // model catalog does not change, so the deployment settings suffice here.
168
+ const tasks = await listScheduledTaskAccessAttention({
169
+ db,
170
+ settings: deps.settings,
171
+ grant,
172
+ onError: (error) => {
173
+ deps.observability?.warn("Scheduled task account availability could not be computed", {
174
+ errorClass: error instanceof Error ? error.name : "ScheduledTaskAccessAttentionError",
175
+ origin: "api",
176
+ });
177
+ },
178
+ });
179
+ return c.json({ tasks });
180
+ });
38
181
 
39
182
  app.post("/v1/workspaces/:workspaceId/scheduled-tasks", async (c) => {
40
183
  const workspaceId = c.req.param("workspaceId");
41
- const grant = await requireAccessGrant(c, deps, workspaceId, "scheduled_tasks:manage");
42
- const rawPayload = await c.req.json();
184
+ const authorization = await requireAccessGrantAuthorization(
185
+ c,
186
+ deps,
187
+ workspaceId,
188
+ "scheduled_tasks:manage",
189
+ );
190
+ const grant = authorization.grant;
191
+ const rawPayload = await readRequestJson(c);
43
192
  const parsedPayload = CreateScheduledTaskRequest.safeParse(rawPayload);
44
193
  if (!parsedPayload.success) {
45
194
  throw new HTTPException(400, {
@@ -47,6 +196,12 @@ export function registerScheduledTaskRoutes(app: Hono, deps: ApiRouteDeps): void
47
196
  });
48
197
  }
49
198
  const payload = parsedPayload.data;
199
+ const catalogSettings = (
200
+ await resolveWorkspaceCatalogSettings(db, deps.settings, {
201
+ accountId: grant.accountId,
202
+ workspaceId,
203
+ })
204
+ ).settings;
50
205
  await requireLimit(deps, {
51
206
  accountId: grant.accountId,
52
207
  workspaceId,
@@ -54,14 +209,16 @@ export function registerScheduledTaskRoutes(app: Hono, deps: ApiRouteDeps): void
54
209
  quantity: 1,
55
210
  });
56
211
  const task = await createValidatedScheduledTask({
57
- settings,
212
+ settings: catalogSettings,
58
213
  db,
59
214
  objectStorage,
60
215
  grant,
216
+ authorization,
61
217
  payload,
62
218
  toolsProvided: scheduledTaskToolsProvided(rawPayload),
63
219
  sessionAuthorization: deps.sessionAuthorization,
64
220
  authorizationSurface: "http",
221
+ verifySlackChannel: slackChannelVerifier(grant),
65
222
  });
66
223
  await syncCreatedScheduledTask({ db, workflowClient, task });
67
224
  return c.json(scheduledTaskForGrant(task, grant), 201);
@@ -69,25 +226,104 @@ export function registerScheduledTaskRoutes(app: Hono, deps: ApiRouteDeps): void
69
226
 
70
227
  app.get("/v1/workspaces/:workspaceId/scheduled-tasks", async (c) => {
71
228
  const workspaceId = c.req.param("workspaceId");
72
- const grant = await requireAccessGrant(c, deps, workspaceId, "scheduled_tasks:run");
73
- const tasks = await listScheduledTasks(db, workspaceId, boundedLimit(c.req.query("limit")));
74
- return c.json(tasks.map((task) => scheduledTaskForGrant(task, grant)));
229
+ const authorization = await requireAccessGrantAuthorization(
230
+ c,
231
+ deps,
232
+ workspaceId,
233
+ "scheduled_tasks:run",
234
+ );
235
+ const grant = authorization.grant;
236
+ const sessionId = c.req.query("sessionId");
237
+ const offset = Number(c.req.query("offset") ?? 0);
238
+ if (!Number.isSafeInteger(offset) || offset < 0) {
239
+ throw new HTTPException(400, { message: "invalid offset" });
240
+ }
241
+ if (sessionId !== undefined) {
242
+ if (!z.string().uuid().safeParse(sessionId).success) {
243
+ throw new HTTPException(400, { message: "invalid sessionId" });
244
+ }
245
+ await requireAccessGrant(c, deps, workspaceId, "sessions:control");
246
+ }
247
+ const tasks = await listScheduledTasks(
248
+ db,
249
+ workspaceId,
250
+ boundedLimit(c.req.query("limit")),
251
+ offset,
252
+ sessionId,
253
+ );
254
+ return c.json(
255
+ (await withPolicyDrift(authorization, tasks)).map((task) =>
256
+ scheduledTaskForGrant(task, grant),
257
+ ),
258
+ );
75
259
  });
76
260
 
77
261
  app.get("/v1/workspaces/:workspaceId/scheduled-tasks/:taskId", async (c) => {
78
262
  const workspaceId = c.req.param("workspaceId");
79
- const grant = await requireAccessGrant(c, deps, workspaceId, "scheduled_tasks:run");
263
+ const authorization = await requireAccessGrantAuthorization(
264
+ c,
265
+ deps,
266
+ workspaceId,
267
+ "scheduled_tasks:run",
268
+ );
269
+ const grant = authorization.grant;
80
270
  const task = await requireScheduledTaskForApi(db, workspaceId, c.req.param("taskId"));
81
- return c.json(scheduledTaskForGrant(task, grant));
271
+ const [withDrift] = await withPolicyDrift(authorization, [task]);
272
+ return c.json(scheduledTaskForGrant(withDrift ?? task, grant));
273
+ });
274
+
275
+ // The owner's explicit access refresh: re-freeze connectors, connector
276
+ // accounts and an agent-created task's OpenGeni tools with the calling
277
+ // person's current authority. It changes neither the schedule nor its
278
+ // status, so the Temporal schedule is untouched.
279
+ app.post("/v1/workspaces/:workspaceId/scheduled-tasks/:taskId/refresh-access", async (c) => {
280
+ const workspaceId = c.req.param("workspaceId");
281
+ const authorization = await requireAccessGrantAuthorization(
282
+ c,
283
+ deps,
284
+ workspaceId,
285
+ "scheduled_tasks:manage",
286
+ );
287
+ const parsed = RefreshScheduledTaskAccessRequest.safeParse(
288
+ await c.req.json().catch(() => null),
289
+ );
290
+ if (!parsed.success) {
291
+ throw new HTTPException(400, { message: "invalid scheduled task access refresh request" });
292
+ }
293
+ const catalogSettings = (
294
+ await resolveWorkspaceCatalogSettings(db, deps.settings, {
295
+ accountId: authorization.grant.accountId,
296
+ workspaceId,
297
+ })
298
+ ).settings;
299
+ const task = await refreshScheduledTaskAccess({
300
+ settings: catalogSettings,
301
+ db,
302
+ objectStorage,
303
+ authorization,
304
+ taskId: c.req.param("taskId"),
305
+ request: parsed.data,
306
+ permissionsRequiredByTools: permissionsRequiredByFirstPartyTools,
307
+ sessionAuthorization: deps.sessionAuthorization,
308
+ authorizationSurface: "http",
309
+ });
310
+ const [withDrift] = await withPolicyDrift(authorization, [task]);
311
+ return c.json(scheduledTaskForGrant(withDrift ?? task, authorization.grant));
82
312
  });
83
313
 
84
314
  app.patch("/v1/workspaces/:workspaceId/scheduled-tasks/:taskId", async (c) => {
85
315
  const workspaceId = c.req.param("workspaceId");
86
- const grant = await requireAccessGrant(c, deps, workspaceId, "scheduled_tasks:manage");
316
+ const authorization = await requireAccessGrantAuthorization(
317
+ c,
318
+ deps,
319
+ workspaceId,
320
+ "scheduled_tasks:manage",
321
+ );
322
+ const grant = authorization.grant;
87
323
  const taskId = c.req.param("taskId");
88
324
  const existing = await requireScheduledTaskForApi(db, workspaceId, taskId);
89
325
  const previous = await captureScheduledTaskRestoreState(db, existing);
90
- const rawPayload = await c.req.json();
326
+ const rawPayload = await readRequestJson(c);
91
327
  const parsedPayload = UpdateScheduledTaskRequest.safeParse(rawPayload);
92
328
  if (!parsedPayload.success) {
93
329
  throw new HTTPException(400, {
@@ -95,18 +331,34 @@ export function registerScheduledTaskRoutes(app: Hono, deps: ApiRouteDeps): void
95
331
  });
96
332
  }
97
333
  const payload = parsedPayload.data;
334
+ const catalogSettings = (
335
+ await resolveWorkspaceCatalogSettings(db, deps.settings, {
336
+ accountId: grant.accountId,
337
+ workspaceId,
338
+ })
339
+ ).settings;
98
340
  const update = await validatedScheduledTaskUpdate({
99
- settings,
341
+ settings: catalogSettings,
100
342
  db,
101
343
  objectStorage,
102
344
  grant,
103
345
  existing,
346
+ authorization,
104
347
  payload,
105
348
  toolsProvided: scheduledTaskToolsProvided(rawPayload),
106
349
  sessionAuthorization: deps.sessionAuthorization,
107
350
  authorizationSurface: "http",
351
+ verifySlackChannel: slackChannelVerifier(grant),
108
352
  });
109
- const task = await updateScheduledTask(db, workspaceId, taskId, update);
353
+ const task = await updateScheduledTaskForApi(
354
+ db,
355
+ grant,
356
+ taskId,
357
+ update,
358
+ payload.agentLearning
359
+ ? { authorization, request: payload.agentLearning, restoreState: previous }
360
+ : undefined,
361
+ );
110
362
  await syncUpdatedScheduledTask({ db, workflowClient, previous, task });
111
363
  return c.json(scheduledTaskForGrant(task, grant));
112
364
  });
@@ -116,7 +368,7 @@ export function registerScheduledTaskRoutes(app: Hono, deps: ApiRouteDeps): void
116
368
  const grant = await requireAccessGrant(c, deps, workspaceId, "scheduled_tasks:manage");
117
369
  const existing = await requireScheduledTaskForApi(db, workspaceId, c.req.param("taskId"));
118
370
  const previous = await captureScheduledTaskRestoreState(db, existing);
119
- const task = await updateScheduledTask(db, workspaceId, existing.id, {
371
+ const task = await updateScheduledTaskForApi(db, grant, existing.id, {
120
372
  status: "paused",
121
373
  });
122
374
  await syncUpdatedScheduledTask({ db, workflowClient, previous, task });
@@ -125,12 +377,33 @@ export function registerScheduledTaskRoutes(app: Hono, deps: ApiRouteDeps): void
125
377
 
126
378
  app.post("/v1/workspaces/:workspaceId/scheduled-tasks/:taskId/resume", async (c) => {
127
379
  const workspaceId = c.req.param("workspaceId");
128
- const grant = await requireAccessGrant(c, deps, workspaceId, "scheduled_tasks:manage");
380
+ const authorization = await requireAccessGrantAuthorization(
381
+ c,
382
+ deps,
383
+ workspaceId,
384
+ "scheduled_tasks:manage",
385
+ );
386
+ const grant = authorization.grant;
129
387
  const existing = await requireScheduledTaskForApi(db, workspaceId, c.req.param("taskId"));
130
388
  const previous = await captureScheduledTaskRestoreState(db, existing);
131
- const task = await updateScheduledTask(db, workspaceId, existing.id, {
132
- status: "active",
389
+ const catalogSettings = (
390
+ await resolveWorkspaceCatalogSettings(db, deps.settings, {
391
+ accountId: grant.accountId,
392
+ workspaceId,
393
+ })
394
+ ).settings;
395
+ const update = await validatedScheduledTaskUpdate({
396
+ settings: catalogSettings,
397
+ db,
398
+ objectStorage,
399
+ grant,
400
+ existing,
401
+ payload: { status: "active" },
402
+ authorization,
403
+ sessionAuthorization: deps.sessionAuthorization,
404
+ authorizationSurface: "http",
133
405
  });
406
+ const task = await updateScheduledTaskForApi(db, grant, existing.id, update);
134
407
  await syncUpdatedScheduledTask({ db, workflowClient, previous, task });
135
408
  return c.json(scheduledTaskForGrant(task, grant));
136
409
  });
@@ -142,6 +415,12 @@ export function registerScheduledTaskRoutes(app: Hono, deps: ApiRouteDeps): void
142
415
  // recognised as codex-billed and skip the credit/cost gates at the edge.
143
416
  const task = await requireScheduledTaskForApi(db, workspaceId, c.req.param("taskId"));
144
417
  if (task.action.kind === "agent_turn") {
418
+ const catalogSettings = (
419
+ await resolveWorkspaceCatalogSettings(db, deps.settings, {
420
+ accountId: grant.accountId,
421
+ workspaceId,
422
+ })
423
+ ).settings;
145
424
  await validateScheduledTaskTarget({
146
425
  db,
147
426
  sessionAuthorization: deps.sessionAuthorization,
@@ -154,25 +433,50 @@ export function registerScheduledTaskRoutes(app: Hono, deps: ApiRouteDeps): void
154
433
  agentConfig: task.agentConfig,
155
434
  missingTargetStatus: 404,
156
435
  });
157
- await requireLimit(deps, {
158
- accountId: grant.accountId,
159
- workspaceId,
160
- action: "agent_run:create",
161
- quantity: 1,
162
- model: task.agentConfig.model ?? deps.settings.openaiModel,
436
+ await validateScheduledTaskMachineTarget({
437
+ settings: catalogSettings,
438
+ db,
439
+ grant,
440
+ runMode: task.runMode,
441
+ agentConfig: task.agentConfig,
442
+ requireOnline: true,
443
+ });
444
+ const taskAuthoritySubjectId = await getScheduledTaskRevisionAuthoritySubject(db, {
445
+ accountId: task.accountId,
446
+ workspaceId: task.workspaceId,
447
+ taskId: task.id,
448
+ taskAuthorityRevision: task.authorityRevision,
163
449
  });
450
+ await requireLimit(
451
+ { ...deps, settings: catalogSettings },
452
+ {
453
+ accountId: grant.accountId,
454
+ workspaceId,
455
+ // A manual trigger does not transfer the task's frozen human to
456
+ // the triggering administrator. Unavailable authority is refused
457
+ // visibly by worker dispatch; this edge still checks the workspace.
458
+ initiatingHumanSubjectId:
459
+ taskAuthoritySubjectId === task.ownerSubjectId ? taskAuthoritySubjectId : null,
460
+ action: "agent_run:create",
461
+ quantity: 1,
462
+ // A model-less task is checked against the model its occurrence
463
+ // will run (a connected subscription, the credits default, or the
464
+ // deployment default), not always the deployment default.
465
+ model: await resolveScheduledTaskPreflightModel(db, catalogSettings, task),
466
+ },
467
+ );
164
468
  }
165
469
  // Body is optional (a bare POST is still a valid trigger); only a present,
166
470
  // non-empty body must parse against the contract.
167
471
  const body = await c.req.json().catch(() => ({}));
168
- const { triggerId } = TriggerScheduledTaskRequest.parse(body ?? {});
472
+ const { triggerId } = parseRequestBody(TriggerScheduledTaskRequest, body ?? {});
169
473
  const triggerToken = scheduledTaskTriggerToken(triggerId);
170
474
  const agentRunUsageIdempotencyKey =
171
475
  task.action.kind === "agent_turn"
172
476
  ? manualScheduledTaskTriggerUsageKey(workspaceId, task.id, triggerToken)
173
477
  : `knowledge-source-sync:manual:${workspaceId}:${task.id}:${triggerToken}`;
174
478
  const triggerWorkflowId = manualScheduledTaskTriggerWorkflowId(task.id, triggerToken);
175
- await workflowClient.triggerScheduledTask({
479
+ await triggerScheduledTaskForGrant(db, grant, workflowClient, {
176
480
  task,
177
481
  agentRunUsageIdempotencyKey,
178
482
  triggerWorkflowId,
@@ -197,16 +501,10 @@ export function registerScheduledTaskRoutes(app: Hono, deps: ApiRouteDeps): void
197
501
  app.delete("/v1/workspaces/:workspaceId/scheduled-tasks/:taskId", async (c) => {
198
502
  const workspaceId = c.req.param("workspaceId");
199
503
  const grant = await requireAccessGrant(c, deps, workspaceId, "scheduled_tasks:manage");
200
- const task = await requireScheduledTaskForApi(db, workspaceId, c.req.param("taskId"));
201
- if (task.metadata.connectorKind === "atlassian") {
202
- await revokeAtlassianScheduleAuthorization(deps, { task, subjectId: grant.subjectId });
203
- } else {
204
- await revokeKnowledgeSourceScheduleAuthorization(deps, { task, subjectId: grant.subjectId });
205
- }
206
- await workflowClient.deleteScheduledTaskSchedule({
207
- temporalScheduleId: task.temporalScheduleId,
504
+ await deleteScheduledTaskWithDurableCleanup(deps, {
505
+ grant,
506
+ taskId: c.req.param("taskId"),
208
507
  });
209
- await deleteScheduledTask(db, workspaceId, task.id);
210
508
  return c.json({ ok: true });
211
509
  });
212
510
 
@@ -220,6 +518,13 @@ export function registerScheduledTaskRoutes(app: Hono, deps: ApiRouteDeps): void
220
518
  task.id,
221
519
  boundedLimit(c.req.query("limit")),
222
520
  );
223
- return c.json(taskRuns.map((run) => scheduledTaskRunForGrant(run, grant)));
521
+ const runs = await withScheduledTaskRunAccessFailures({
522
+ db,
523
+ settings: deps.settings,
524
+ grant,
525
+ task,
526
+ runs: taskRuns,
527
+ });
528
+ return c.json(runs.map((run) => scheduledTaskRunForGrant(run, grant)));
224
529
  });
225
530
  }
@@ -0,0 +1,87 @@
1
+ import {
2
+ requireAccessGrant,
3
+ requirePermission,
4
+ requireSessionAuthorization,
5
+ SessionAuthorizationDeniedError,
6
+ SessionAuthorizationUnavailableError,
7
+ type ApiRouteDeps,
8
+ } from "@opengeni/core";
9
+ import {
10
+ hasEditableArtifactSessionLink,
11
+ hasWorkspaceArtifactSessionLink,
12
+ transactionallyAuthorizeEditableArtifactActor,
13
+ withRlsContext,
14
+ } from "@opengeni/db";
15
+ import type { Hono } from "hono";
16
+ import { HTTPException } from "hono/http-exception";
17
+ import { z } from "zod";
18
+ import { withAccessGrantSessionRlsContext } from "../access-grant-rls";
19
+ import { editableArtifactActorForGrant } from "./editable-artifacts";
20
+
21
+ const SessionId = z.string().uuid();
22
+ const EditableArtifactId = z.string().regex(/^(?!0{32}$)[0-9a-f]{32}$/u);
23
+
24
+ /** Exact authorized membership proof, not a paginated artifact discovery API. */
25
+ export function registerSessionArtifactAssociationRoutes(app: Hono, deps: ApiRouteDeps): void {
26
+ app.get(
27
+ "/v1/workspaces/:workspaceId/sessions/:sessionId/artifact-associations/:artifactId",
28
+ async (context) => {
29
+ const workspaceId = context.req.param("workspaceId");
30
+ const grant = await requireAccessGrant(context, deps, workspaceId, "artifacts:read");
31
+ requirePermission(grant, "sessions:read");
32
+ const sessionId = context.req.param("sessionId");
33
+ const artifactId = context.req.param("artifactId");
34
+ const kind = EditableArtifactId.safeParse(artifactId).success
35
+ ? "editable"
36
+ : SessionId.safeParse(artifactId).success
37
+ ? "site"
38
+ : null;
39
+ const requestedKind = context.req.query("kind");
40
+ if (
41
+ !SessionId.safeParse(sessionId).success ||
42
+ !kind ||
43
+ (requestedKind !== undefined && requestedKind !== kind)
44
+ ) {
45
+ throw new HTTPException(404, { message: "Artifact association not found" });
46
+ }
47
+ try {
48
+ return await withAccessGrantSessionRlsContext(deps, grant, async () => {
49
+ await requireSessionAuthorization(deps, grant, {
50
+ sessionId,
51
+ operation: "session.read",
52
+ surface: "http",
53
+ });
54
+ const scope = { accountId: grant.accountId, workspaceId };
55
+ const linked =
56
+ kind === "editable"
57
+ ? await hasEditableArtifactSessionLink(deps.db, scope, sessionId, artifactId)
58
+ : await hasWorkspaceArtifactSessionLink(deps.db, workspaceId, sessionId, artifactId);
59
+ if (!linked) throw new HTTPException(404, { message: "Artifact association not found" });
60
+ if (kind === "editable") {
61
+ const decision = await withRlsContext(deps.db, scope, (tx) =>
62
+ transactionallyAuthorizeEditableArtifactActor(tx, {
63
+ scope,
64
+ artifactId,
65
+ actor: editableArtifactActorForGrant(grant, "0000000000000001"),
66
+ permission: "read",
67
+ }),
68
+ );
69
+ if (!decision.allowed) {
70
+ throw new HTTPException(404, { message: "Artifact association not found" });
71
+ }
72
+ }
73
+ context.header("cache-control", "private, no-store");
74
+ return context.json({ sessionId, artifactId, kind });
75
+ });
76
+ } catch (error) {
77
+ if (error instanceof SessionAuthorizationDeniedError) {
78
+ throw new HTTPException(404, { message: "Artifact association not found" });
79
+ }
80
+ if (error instanceof SessionAuthorizationUnavailableError) {
81
+ throw new HTTPException(503, { message: "Session authorization is unavailable" });
82
+ }
83
+ throw error;
84
+ }
85
+ },
86
+ );
87
+ }