@opengeni/api-router 0.30.1 → 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 (436) 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-office-import.d.ts +7 -4
  35. package/dist/editable-artifact-source-session.d.ts +3 -0
  36. package/dist/editable-artifact-websocket.d.ts +10 -18
  37. package/dist/editable-artifact-workspace-files.d.ts +1 -1
  38. package/dist/fatal-process-boundary.d.ts +25 -0
  39. package/dist/github-access.d.ts +31 -2
  40. package/dist/http/acting-person.d.ts +24 -0
  41. package/dist/http/api-contract-compat.d.ts +19 -0
  42. package/dist/http/api-error.d.ts +27 -1
  43. package/dist/http/cors.d.ts +17 -0
  44. package/dist/http/deprecation.d.ts +42 -0
  45. package/dist/http/interaction-control-error.d.ts +13 -0
  46. package/dist/http/keyed-admission.d.ts +12 -0
  47. package/dist/http/local-browser-boundary.d.ts +72 -0
  48. package/dist/http/metrics-listener.d.ts +22 -0
  49. package/dist/http/path-identifier.d.ts +17 -0
  50. package/dist/http/registered-route-label.d.ts +16 -0
  51. package/dist/http/request-body.d.ts +27 -0
  52. package/dist/http/request-source.d.ts +52 -0
  53. package/dist/http/sse.d.ts +17 -6
  54. package/dist/http/unmatched-route.d.ts +18 -0
  55. package/dist/http/user-content.d.ts +36 -0
  56. package/dist/http/websocket-upgrade-dispatch.d.ts +18 -0
  57. package/dist/index.d.ts +10 -3
  58. package/dist/index.js +1129 -166
  59. package/dist/index.js.map +1 -1
  60. package/dist/integration-endpoint-test.d.ts +20 -0
  61. package/dist/integrations/api-integrations.d.ts +2 -2
  62. package/dist/integrations/atlassian.d.ts +29 -3
  63. package/dist/integrations/connect-authority.d.ts +1 -0
  64. package/dist/integrations/connect-callback-return.d.ts +6 -0
  65. package/dist/integrations/fiken.d.ts +16 -2
  66. package/dist/integrations/github-app-connect.d.ts +47 -0
  67. package/dist/integrations/github-installation-proof.d.ts +3 -0
  68. package/dist/integrations/github-lens-connect.d.ts +116 -0
  69. package/dist/integrations/github-skill-source.d.ts +1 -5
  70. package/dist/integrations/google-drive.d.ts +25 -0
  71. package/dist/integrations/integration-commit-authority.d.ts +13 -0
  72. package/dist/integrations/marketplace-plugin.d.ts +2691 -0
  73. package/dist/integrations/oauth-client.d.ts +178 -18
  74. package/dist/integrations/oauth-profiles.d.ts +222 -0
  75. package/dist/integrations/oauth-return-path.d.ts +1 -0
  76. package/dist/integrations/personal-github-repositories.d.ts +84 -0
  77. package/dist/integrations/personal-github.d.ts +42 -0
  78. package/dist/integrations/pr-review-provider.d.ts +22 -0
  79. package/dist/integrations/provider-oauth.d.ts +19 -1
  80. package/dist/integrations/slack-app-home.d.ts +24 -0
  81. package/dist/integrations/slack-bot.d.ts +367 -12
  82. package/dist/integrations/slack-file-upload-flow.d.ts +62 -0
  83. package/dist/integrations/slack-install.d.ts +20 -0
  84. package/dist/integrations/slack-interactions.d.ts +113 -10
  85. package/dist/integrations/slack-mrkdwn.d.ts +41 -0
  86. package/dist/integrations/slack-routing.d.ts +120 -0
  87. package/dist/integrations/slack-session-defaults.d.ts +58 -0
  88. package/dist/integrations/slack-task-file-upload.d.ts +36 -0
  89. package/dist/integrations/social-oauth.d.ts +7 -0
  90. package/dist/interaction-agent-access.d.ts +15 -0
  91. package/dist/interaction-frame-proxy.d.ts +68 -0
  92. package/dist/interaction-metrics.d.ts +2 -0
  93. package/dist/mcp/action-catalog-types.d.ts +9 -0
  94. package/dist/mcp/action-catalog.gen.d.ts +2 -0
  95. package/dist/mcp/capability-account-readiness.d.ts +7 -0
  96. package/dist/mcp/child-read-evidence.d.ts +9 -0
  97. package/dist/mcp/command-read.d.ts +24 -0
  98. package/dist/mcp/company-profile-agent-admin.d.ts +44 -0
  99. package/dist/mcp/contract-input.d.ts +11 -0
  100. package/dist/mcp/documents.d.ts +7 -5
  101. package/dist/mcp/files.d.ts +2 -2
  102. package/dist/mcp/first-party-tool-permissions.d.ts +650 -0
  103. package/dist/mcp/knowledge-entries.d.ts +5 -0
  104. package/dist/mcp/orchestration-failure-diagnostic.d.ts +43 -0
  105. package/dist/mcp/receipts.d.ts +9 -0
  106. package/dist/mcp/request-abort.d.ts +19 -0
  107. package/dist/mcp/scheduled-task-input.d.ts +1189 -0
  108. package/dist/mcp/scheduled-task-view.d.ts +22 -4
  109. package/dist/mcp/server.d.ts +255 -3
  110. package/dist/mcp/session-event-view.d.ts +94 -0
  111. package/dist/mcp/session-view.d.ts +66 -2
  112. package/dist/mcp/session-wait.d.ts +174 -0
  113. package/dist/mcp-oauth.d.ts +52 -0
  114. package/dist/model-catalog.d.ts +11 -31
  115. package/dist/observability.d.ts +3 -1
  116. package/dist/organization-mcp.d.ts +52 -0
  117. package/dist/organization-recovery-notifications.d.ts +41 -0
  118. package/dist/routes/analytics-consent.d.ts +26 -0
  119. package/dist/routes/api-integrations.d.ts +25 -0
  120. package/dist/routes/api-keys.d.ts +17 -0
  121. package/dist/routes/artifact-catalog.d.ts +6 -0
  122. package/dist/routes/automations.d.ts +19 -0
  123. package/dist/routes/billing.d.ts +49 -0
  124. package/dist/routes/browser-sessions.d.ts +71 -3
  125. package/dist/routes/claude-subscription-accounts.d.ts +3 -0
  126. package/dist/routes/claude-subscription-oauth.d.ts +3 -0
  127. package/dist/routes/client-errors.d.ts +146 -0
  128. package/dist/routes/codex.d.ts +76 -2
  129. package/dist/routes/company-brain.d.ts +3 -0
  130. package/dist/routes/company-profile.d.ts +2 -1
  131. package/dist/routes/computer-sessions.d.ts +14 -0
  132. package/dist/routes/connect.d.ts +5 -0
  133. package/dist/routes/editable-artifacts.d.ts +2 -0
  134. package/dist/routes/external-identity-links.d.ts +6 -0
  135. package/dist/routes/feedback.d.ts +3 -0
  136. package/dist/routes/files.d.ts +4 -0
  137. package/dist/routes/github-browser-pages.d.ts +12 -0
  138. package/dist/routes/github.d.ts +2 -0
  139. package/dist/routes/insights-response-cache.d.ts +10 -0
  140. package/dist/routes/insights-usage.d.ts +12 -0
  141. package/dist/routes/insights.d.ts +30 -1
  142. package/dist/routes/knowledge.d.ts +3 -0
  143. package/dist/routes/managed-auth-session-sets.d.ts +26 -0
  144. package/dist/routes/managed-onboarding.d.ts +29 -0
  145. package/dist/routes/managed-sign-in-methods.d.ts +6 -0
  146. package/dist/routes/model-connection-access.d.ts +3 -0
  147. package/dist/routes/organization-integration-policy.d.ts +3 -0
  148. package/dist/routes/organization-integrations.d.ts +6 -0
  149. package/dist/routes/organization-mcp-connections.d.ts +3 -0
  150. package/dist/routes/organization-model-providers.d.ts +3 -0
  151. package/dist/routes/organization-recovery.d.ts +19 -0
  152. package/dist/routes/organization-service-accounts.d.ts +3 -0
  153. package/dist/routes/organization-sessions.d.ts +26 -0
  154. package/dist/routes/personal-github-git-broker.d.ts +29 -0
  155. package/dist/routes/personal-github.d.ts +3 -0
  156. package/dist/routes/pr-review-github.d.ts +3 -0
  157. package/dist/routes/pr-review.d.ts +3 -0
  158. package/dist/routes/session-artifact-associations.d.ts +4 -0
  159. package/dist/routes/session-history-imports.d.ts +9 -0
  160. package/dist/routes/sessions.d.ts +44 -6
  161. package/dist/routes/skill-content.d.ts +4 -0
  162. package/dist/routes/skill-install-authority.d.ts +6 -0
  163. package/dist/routes/subscription-account-pools.d.ts +34 -0
  164. package/dist/routes/subscription-pool-access.d.ts +16 -0
  165. package/dist/routes/supergrok.d.ts +6 -1
  166. package/dist/routes/usage-allowances.d.ts +12 -0
  167. package/dist/routes/user-resource-authorities.d.ts +3 -0
  168. package/dist/routes/workspace-artifacts.d.ts +2 -1
  169. package/dist/routes/workspace-capture.d.ts +10 -2
  170. package/dist/routes/workspace-integrations.d.ts +35 -0
  171. package/dist/routes/workspace-learning.d.ts +3 -0
  172. package/dist/routes/workspace-model-providers.d.ts +4 -0
  173. package/dist/routes/workspaces.d.ts +29 -0
  174. package/dist/sandbox/auth-callout.d.ts +8 -0
  175. package/dist/sandbox/channel-a.d.ts +19 -1
  176. package/dist/sandbox/connection-authority.d.ts +3 -0
  177. package/dist/sandbox/enrollment.d.ts +9 -1
  178. package/dist/sandbox/machines.d.ts +5 -2
  179. package/dist/sandbox/metrics-ingestion.d.ts +28 -20
  180. package/dist/sandbox/rematerialize.d.ts +2 -0
  181. package/dist/sandbox/session-attach-variable-sets.d.ts +30 -0
  182. package/dist/sandbox/viewer.d.ts +26 -1
  183. package/dist/sandbox-file-artifacts.d.ts +50 -0
  184. package/dist/scheduled-task-deletion.d.ts +13 -0
  185. package/dist/session-create-observability.d.ts +5 -0
  186. package/dist/session-event-view-MPS2OZD3.js +292 -0
  187. package/dist/session-event-view-MPS2OZD3.js.map +1 -0
  188. package/dist/site-session-origin.d.ts +13 -0
  189. package/dist/site-uploads.d.ts +41 -0
  190. package/dist/slack-reaction-files.d.ts +1 -1
  191. package/dist/temporal-schedule-cleanup.d.ts +1 -0
  192. package/dist/temporal-schedule-sync.d.ts +26 -0
  193. package/dist/transcription/providers/xai-subscription.d.ts +1 -0
  194. package/dist/transcription/service.d.ts +2 -1
  195. package/dist/work-discovery-observability.d.ts +33 -0
  196. package/dist/workspace-artifact-content.d.ts +28 -0
  197. package/dist/workspace-artifact-provenance.d.ts +7 -0
  198. package/dist/workspace-delete-observability.d.ts +10 -0
  199. package/dist/workspace-deletion.d.ts +6 -0
  200. package/dist/workspace-state-projection.d.ts +3 -5
  201. package/dist/workspace-tool-gateway-observability.d.ts +17 -0
  202. package/dist/workspace-tool-gateway.d.ts +123 -0
  203. package/dist/workspace-webhook-dispatch.d.ts +26 -0
  204. package/package.json +23 -19
  205. package/src/access-grant-rls.ts +75 -0
  206. package/src/admission-trace.ts +14 -0
  207. package/src/api-websocket.ts +23 -0
  208. package/src/app.ts +1974 -256
  209. package/src/artifact-catalog-cursor.ts +60 -0
  210. package/src/auth/managed-auth-attempt-context.ts +70 -0
  211. package/src/auth/managed-auth-rate-limits.ts +252 -0
  212. package/src/auth/managed-auth-session-adapter.ts +222 -0
  213. package/src/auth/managed-auth.ts +536 -60
  214. package/src/auth/managed-email.ts +174 -0
  215. package/src/auth/managed-sign-in-notifications.ts +81 -0
  216. package/src/auth/new-signups-gate.ts +49 -0
  217. package/src/auth/organization-user-setup.ts +307 -0
  218. package/src/auth/signup-funnel-metrics.ts +164 -0
  219. package/src/browser-controller-authority.ts +1 -186
  220. package/src/browser-ephemeral.ts +39 -0
  221. package/src/browser-state-authority.ts +1 -236
  222. package/src/claude-subscription-account-conflicts.ts +12 -0
  223. package/src/claude-subscription-account-usage.ts +48 -0
  224. package/src/claude-subscription-oauth.ts +362 -0
  225. package/src/claude-subscription-profile.ts +73 -0
  226. package/src/claude-subscription-usage.ts +97 -0
  227. package/src/claude-workspace-connection.ts +82 -0
  228. package/src/codemode.ts +194 -30
  229. package/src/codex-realtime.ts +8 -2
  230. package/src/company-brain-okf.ts +340 -0
  231. package/src/connected-machine-computer-access.ts +33 -0
  232. package/src/connection-ownership.ts +199 -0
  233. package/src/controller-data-plane.ts +81 -0
  234. package/src/editable-artifact-native-kernel.ts +26 -15
  235. package/src/editable-artifact-office-import.ts +77 -9
  236. package/src/editable-artifact-production.ts +23 -7
  237. package/src/editable-artifact-source-session.ts +123 -0
  238. package/src/editable-artifact-websocket.ts +27 -21
  239. package/src/editable-artifact-workspace-files.ts +31 -6
  240. package/src/fatal-process-boundary.ts +246 -0
  241. package/src/gateway-realtime.ts +1 -1
  242. package/src/github-access.ts +147 -5
  243. package/src/http/acting-person.ts +71 -0
  244. package/src/http/api-contract-compat.ts +49 -0
  245. package/src/http/api-error.ts +115 -1
  246. package/src/http/auth.ts +48 -0
  247. package/src/http/cors.ts +67 -0
  248. package/src/http/deprecation.ts +118 -0
  249. package/src/http/interaction-control-error.ts +164 -0
  250. package/src/http/keyed-admission.ts +29 -0
  251. package/src/http/local-browser-boundary.ts +343 -0
  252. package/src/http/metrics-listener.ts +57 -0
  253. package/src/http/path-identifier.ts +54 -0
  254. package/src/http/registered-route-label.ts +34 -0
  255. package/src/http/request-body.ts +127 -0
  256. package/src/http/request-source.ts +178 -0
  257. package/src/http/sse.ts +486 -132
  258. package/src/http/unmatched-route.ts +60 -0
  259. package/src/http/user-content.ts +158 -0
  260. package/src/http/websocket-upgrade-dispatch.ts +29 -0
  261. package/src/index.ts +157 -52
  262. package/src/integration-endpoint-test.ts +291 -0
  263. package/src/integrations/api-integrations.ts +98 -11
  264. package/src/integrations/atlassian.ts +474 -136
  265. package/src/integrations/connect-authority.ts +2 -0
  266. package/src/integrations/connect-callback-return.ts +86 -0
  267. package/src/integrations/fiken.ts +354 -64
  268. package/src/integrations/github-app-connect.ts +435 -0
  269. package/src/integrations/github-installation-proof.ts +60 -0
  270. package/src/integrations/github-lens-connect.ts +76 -0
  271. package/src/integrations/github-skill-source.ts +2 -142
  272. package/src/integrations/google-drive.ts +820 -222
  273. package/src/integrations/integration-commit-authority.ts +69 -0
  274. package/src/integrations/marketplace-plugin.ts +48 -0
  275. package/src/integrations/oauth-client.ts +1356 -459
  276. package/src/integrations/oauth-profiles.ts +537 -0
  277. package/src/integrations/oauth-return-path.ts +18 -0
  278. package/src/integrations/personal-github-repositories.ts +674 -0
  279. package/src/integrations/personal-github.ts +825 -0
  280. package/src/integrations/pr-review-provider.ts +246 -0
  281. package/src/integrations/provider-oauth.ts +250 -22
  282. package/src/integrations/slack-app-home.ts +300 -0
  283. package/src/integrations/slack-bot.ts +963 -239
  284. package/src/integrations/slack-file-upload-flow.ts +147 -0
  285. package/src/integrations/slack-install.ts +83 -0
  286. package/src/integrations/slack-interactions.ts +3170 -474
  287. package/src/integrations/slack-mrkdwn.ts +193 -0
  288. package/src/integrations/slack-routing.ts +337 -0
  289. package/src/integrations/slack-session-defaults.ts +224 -0
  290. package/src/integrations/slack-task-file-upload.ts +323 -0
  291. package/src/integrations/social-oauth.ts +213 -15
  292. package/src/interaction-agent-access.ts +48 -0
  293. package/src/interaction-frame-proxy.ts +409 -0
  294. package/src/interaction-metrics.ts +30 -0
  295. package/src/mcp/action-catalog-types.ts +9 -0
  296. package/src/mcp/action-catalog.gen.ts +6696 -0
  297. package/src/mcp/capability-account-readiness.ts +17 -0
  298. package/src/mcp/child-read-evidence.ts +19 -0
  299. package/src/mcp/command-read.ts +109 -0
  300. package/src/mcp/company-profile-agent-admin.ts +198 -0
  301. package/src/mcp/contract-input.ts +141 -0
  302. package/src/mcp/documents.ts +65 -377
  303. package/src/mcp/editable-artifacts.ts +12 -6
  304. package/src/mcp/files.ts +80 -38
  305. package/src/mcp/first-party-tool-permissions.ts +305 -0
  306. package/src/mcp/knowledge-entries.ts +322 -0
  307. package/src/mcp/orchestration-failure-diagnostic.ts +43 -0
  308. package/src/mcp/receipts.ts +34 -0
  309. package/src/mcp/request-abort.ts +44 -0
  310. package/src/mcp/scheduled-task-input.ts +76 -0
  311. package/src/mcp/scheduled-task-view.ts +44 -3
  312. package/src/mcp/server.ts +3030 -1267
  313. package/src/mcp/session-event-view.ts +383 -0
  314. package/src/mcp/session-view.ts +84 -3
  315. package/src/mcp/session-wait.ts +665 -0
  316. package/src/mcp-oauth.ts +1123 -0
  317. package/src/model-catalog.ts +91 -333
  318. package/src/observability.ts +15 -1
  319. package/src/organization-mcp.ts +397 -0
  320. package/src/organization-recovery-notifications.ts +103 -0
  321. package/src/routes/analytics-consent.ts +123 -0
  322. package/src/routes/api-integrations.ts +364 -74
  323. package/src/routes/api-keys.ts +336 -10
  324. package/src/routes/artifact-catalog.ts +279 -0
  325. package/src/routes/automations.ts +768 -0
  326. package/src/routes/billing.ts +461 -46
  327. package/src/routes/browser-sessions.ts +839 -131
  328. package/src/routes/canonical-human-identities.ts +90 -14
  329. package/src/routes/capabilities.ts +107 -6
  330. package/src/routes/channels.ts +20 -3
  331. package/src/routes/claude-subscription-accounts.ts +334 -0
  332. package/src/routes/claude-subscription-oauth.ts +142 -0
  333. package/src/routes/client-errors.ts +362 -0
  334. package/src/routes/codex.ts +833 -116
  335. package/src/routes/company-brain.ts +322 -0
  336. package/src/routes/company-profile.ts +65 -1
  337. package/src/routes/computer-sessions.ts +557 -106
  338. package/src/routes/connect.ts +1938 -0
  339. package/src/routes/connections.ts +1040 -349
  340. package/src/routes/documents.ts +488 -287
  341. package/src/routes/editable-artifacts.ts +79 -9
  342. package/src/routes/enrollments.ts +135 -39
  343. package/src/routes/environments.ts +154 -58
  344. package/src/routes/external-identity-links.ts +201 -0
  345. package/src/routes/feedback.ts +113 -0
  346. package/src/routes/files.ts +337 -39
  347. package/src/routes/github-browser-pages.ts +162 -0
  348. package/src/routes/github.ts +446 -144
  349. package/src/routes/insights-response-cache.ts +83 -0
  350. package/src/routes/insights-usage.ts +345 -0
  351. package/src/routes/insights.ts +153 -19
  352. package/src/routes/install.ts +133 -38
  353. package/src/routes/integration-facets.ts +107 -33
  354. package/src/routes/interaction-resources.ts +30 -3
  355. package/src/routes/knowledge.ts +488 -0
  356. package/src/routes/machines.ts +313 -15
  357. package/src/routes/managed-auth-session-sets.ts +1218 -0
  358. package/src/routes/managed-onboarding.ts +337 -0
  359. package/src/routes/managed-sign-in-methods.ts +433 -0
  360. package/src/routes/memory-slack-publications.ts +3 -2
  361. package/src/routes/model-connection-access.ts +208 -0
  362. package/src/routes/organization-integration-policy.ts +116 -0
  363. package/src/routes/organization-integrations.ts +326 -0
  364. package/src/routes/organization-mcp-connections.ts +178 -0
  365. package/src/routes/organization-memberships.ts +1019 -27
  366. package/src/routes/organization-model-providers.ts +293 -0
  367. package/src/routes/organization-recovery.ts +325 -0
  368. package/src/routes/organization-service-accounts.ts +128 -0
  369. package/src/routes/organization-sessions.ts +350 -0
  370. package/src/routes/personal-github-git-broker.ts +785 -0
  371. package/src/routes/personal-github.ts +370 -0
  372. package/src/routes/plugins.ts +251 -22
  373. package/src/routes/pr-review-github.ts +881 -0
  374. package/src/routes/pr-review.ts +622 -0
  375. package/src/routes/preference-registry.ts +12 -93
  376. package/src/routes/rigs.ts +167 -50
  377. package/src/routes/scheduled-tasks.ts +346 -41
  378. package/src/routes/session-artifact-associations.ts +87 -0
  379. package/src/routes/session-history-imports.ts +280 -0
  380. package/src/routes/sessions.ts +2306 -264
  381. package/src/routes/skill-content.ts +297 -0
  382. package/src/routes/skill-install-authority.ts +64 -0
  383. package/src/routes/skills.ts +62 -9
  384. package/src/routes/social.ts +46 -18
  385. package/src/routes/subscription-account-pools.ts +436 -0
  386. package/src/routes/subscription-pool-access.ts +126 -0
  387. package/src/routes/supergrok.ts +219 -303
  388. package/src/routes/transcription-recordings.ts +38 -3
  389. package/src/routes/transcriptions.ts +4 -0
  390. package/src/routes/usage-allowances.ts +378 -0
  391. package/src/routes/user-resource-authorities.ts +138 -0
  392. package/src/routes/video-generation.ts +14 -10
  393. package/src/routes/workspace-artifacts.ts +275 -69
  394. package/src/routes/workspace-capture.ts +21 -0
  395. package/src/routes/workspace-integrations.ts +576 -0
  396. package/src/routes/workspace-learning.ts +159 -0
  397. package/src/routes/workspace-model-providers.ts +148 -0
  398. package/src/routes/workspace-state.ts +38 -25
  399. package/src/routes/workspaces.ts +1004 -127
  400. package/src/sandbox/auth-callout.ts +96 -19
  401. package/src/sandbox/channel-a.ts +323 -24
  402. package/src/sandbox/connection-authority.ts +3 -0
  403. package/src/sandbox/enrollment.ts +81 -6
  404. package/src/sandbox/machines.ts +218 -76
  405. package/src/sandbox/metrics-ingestion.ts +411 -62
  406. package/src/sandbox/rematerialize.ts +121 -19
  407. package/src/sandbox/session-attach-variable-sets.ts +131 -0
  408. package/src/sandbox/viewer.ts +280 -25
  409. package/src/sandbox-file-artifacts.ts +413 -0
  410. package/src/scheduled-task-deletion.ts +138 -0
  411. package/src/session-create-observability.ts +46 -0
  412. package/src/session-realtime-context.ts +6 -3
  413. package/src/site-session-origin.ts +48 -0
  414. package/src/site-uploads.ts +224 -0
  415. package/src/slack-reaction-files.ts +16 -5
  416. package/src/temporal-schedule-cleanup.ts +13 -0
  417. package/src/temporal-schedule-sync.ts +74 -0
  418. package/src/transcription/providers/codex-subscription.ts +2 -0
  419. package/src/transcription/providers/openai.ts +1 -0
  420. package/src/transcription/providers/xai-subscription.ts +49 -3
  421. package/src/transcription/segmenter.ts +8 -2
  422. package/src/transcription/service.ts +43 -6
  423. package/src/work-discovery-observability.ts +121 -0
  424. package/src/workspace-artifact-content.ts +144 -0
  425. package/src/workspace-artifact-provenance.ts +104 -0
  426. package/src/workspace-delete-observability.ts +75 -0
  427. package/src/workspace-deletion.ts +73 -0
  428. package/src/workspace-state-projection.ts +18 -148
  429. package/src/workspace-tool-gateway-observability.ts +100 -0
  430. package/src/workspace-tool-gateway.ts +870 -0
  431. package/src/workspace-webhook-dispatch.ts +190 -0
  432. package/src/xai-subscription-auth.ts +9 -2
  433. package/dist/chunk-2PQMSRCB.js +0 -49759
  434. package/dist/chunk-2PQMSRCB.js.map +0 -1
  435. package/dist/routes/packs.d.ts +0 -3
  436. package/src/routes/packs.ts +0 -729
@@ -0,0 +1,383 @@
1
+ import { z } from "zod";
2
+ import {
3
+ assistantMessagePhase,
4
+ type SessionEvent,
5
+ type SessionEventType,
6
+ } from "@opengeni/contracts";
7
+ import type {
8
+ SessionEventSliceOptions,
9
+ SessionEventSlicePage,
10
+ } from "@opengeni/db/session-event-slices";
11
+
12
+ export const SESSION_EVENT_VIEW_MAX_BYTES = 16 * 1024;
13
+ const selectionSchema = z.object({
14
+ sessionId: z.string().uuid(),
15
+ view: z.enum(["conversation", "results", "tools"]),
16
+ includeArguments: z.boolean(),
17
+ includeOutput: z.boolean(),
18
+ callId: z
19
+ .string()
20
+ .max(512)
21
+ .refine(
22
+ (value) => Buffer.byteLength(JSON.stringify(value), "utf8") <= 2048,
23
+ "callId exceeds the encoded cursor budget",
24
+ )
25
+ .nullable(),
26
+ toolName: z
27
+ .string()
28
+ .min(1)
29
+ .max(256)
30
+ .refine(
31
+ (value) => Buffer.byteLength(JSON.stringify(value), "utf8") <= 512,
32
+ "toolName exceeds the encoded cursor budget",
33
+ )
34
+ .nullable()
35
+ .default(null),
36
+ limit: z.number().int().min(1).max(50).optional(),
37
+ direction: z.enum(["before", "after"]),
38
+ after: z.number().int().nonnegative(),
39
+ before: z.number().int().positive().nullable(),
40
+ });
41
+ const cursorSchema = z.object({
42
+ v: z.union([z.literal(1), z.literal(2)]),
43
+ selection: selectionSchema,
44
+ sequence: z.number().int().positive().nullable(),
45
+ offset: z.number().int().nonnegative().max(2_147_483_647),
46
+ });
47
+ type Selection = z.infer<typeof selectionSchema>;
48
+ export type SessionEventViewInput = {
49
+ sessionId: string;
50
+ view?: Selection["view"] | undefined;
51
+ after?: number | undefined;
52
+ before?: number | undefined;
53
+ direction?: Selection["direction"] | undefined;
54
+ limit?: number | undefined;
55
+ cursor?: string | undefined;
56
+ callId?: string | undefined;
57
+ toolName?: string | undefined;
58
+ includeArguments?: boolean | undefined;
59
+ includeOutput?: boolean | undefined;
60
+ };
61
+ type Item = { sequence: number; turnId?: string; role?: string; text?: string } & Record<
62
+ string,
63
+ unknown
64
+ >;
65
+ type ReadPage = (options: SessionEventSliceOptions) => Promise<SessionEventSlicePage>;
66
+ const types: Record<Selection["view"], SessionEventType[]> = {
67
+ conversation: ["user.message", "agent.message.completed"],
68
+ // Final turn output is authoritative: do not repeat message.completed text.
69
+ results: ["turn.completed", "turn.failed", "goal.completed", "goal.paused", "tool.auth_needed"],
70
+ tools: ["agent.toolCall.created", "agent.toolCall.output"],
71
+ };
72
+ const record = (value: unknown): Record<string, unknown> =>
73
+ value !== null && typeof value === "object" && !Array.isArray(value)
74
+ ? (value as Record<string, unknown>)
75
+ : {};
76
+ const bytes = (value: unknown) => Buffer.byteLength(JSON.stringify(value, null, 2), "utf8");
77
+ const encode = (selection: Selection, sequence: number | null = null, offset = 0, v = 2) =>
78
+ Buffer.from(JSON.stringify({ v, selection, sequence, offset })).toString("base64url");
79
+
80
+ /** A cursor is a bounded selector, never authority. The caller reauthorizes every read. */
81
+ export function resolveSessionEventView(input: SessionEventViewInput) {
82
+ let continuation: z.infer<typeof cursorSchema> | null = null;
83
+ if (input.cursor !== undefined) {
84
+ if (input.cursor.length > 4096)
85
+ throw new Error("session_events cursor exceeds 4096 characters");
86
+ try {
87
+ continuation = cursorSchema.parse(
88
+ JSON.parse(Buffer.from(input.cursor, "base64url").toString()),
89
+ );
90
+ } catch {
91
+ throw new Error("Invalid session_events cursor");
92
+ }
93
+ const previous = continuation.selection;
94
+ for (const key of [
95
+ "sessionId",
96
+ "view",
97
+ "includeArguments",
98
+ "includeOutput",
99
+ "callId",
100
+ "toolName",
101
+ "direction",
102
+ "after",
103
+ "before",
104
+ ] as const) {
105
+ if (input[key] !== undefined && input[key] !== previous[key]) {
106
+ throw new Error(`session_events cursor cannot change ${key}`);
107
+ }
108
+ }
109
+ }
110
+ const selection =
111
+ continuation?.selection ??
112
+ selectionSchema.parse({
113
+ sessionId: input.sessionId,
114
+ view: input.view ?? "conversation",
115
+ includeArguments: input.includeArguments ?? false,
116
+ includeOutput: input.includeOutput ?? false,
117
+ callId: input.callId ?? null,
118
+ toolName: input.toolName ?? null,
119
+ direction:
120
+ input.direction ??
121
+ (input.before !== undefined || input.after === undefined ? "before" : "after"),
122
+ after: input.after ?? 0,
123
+ before: input.before ?? null,
124
+ });
125
+ selection.limit = z
126
+ .number()
127
+ .int()
128
+ .min(1)
129
+ .max(50)
130
+ .parse(input.limit ?? selection.limit ?? 10);
131
+ if (selection.toolName && selection.includeOutput)
132
+ throw new Error(
133
+ "toolName selects named calls. Read a result with its callId and includeOutput=true.",
134
+ );
135
+ if (
136
+ selection.view !== "tools" &&
137
+ (selection.callId ||
138
+ selection.toolName ||
139
+ selection.includeArguments ||
140
+ selection.includeOutput)
141
+ ) {
142
+ throw new Error("callId/toolName/includeArguments/includeOutput require view=tools");
143
+ }
144
+ if (
145
+ continuation &&
146
+ ((continuation.sequence === null && continuation.offset !== 0) ||
147
+ (continuation.sequence !== null &&
148
+ (continuation.sequence <= selection.after ||
149
+ (selection.before !== null && continuation.sequence >= selection.before))))
150
+ )
151
+ throw new Error("Invalid session_events cursor position");
152
+ return { selection, continuation };
153
+ }
154
+
155
+ function project(event: SessionEvent, selection: Selection): Item | null {
156
+ if (event.duplicateOfEventId || (event.turnAssociation && event.turnAssociation !== "current"))
157
+ return null;
158
+ const p = record(event.payload);
159
+ const base = { sequence: event.sequence, ...(event.turnId ? { turnId: event.turnId } : {}) };
160
+ if (selection.view === "conversation") {
161
+ // Commentary stays in the conversation, labelled so a reader can tell a
162
+ // progress note from an answer.
163
+ const phase = event.type === "agent.message.completed" ? assistantMessagePhase(p) : null;
164
+ return typeof p.text === "string" && p.text.length > 0
165
+ ? {
166
+ ...base,
167
+ role: event.type === "user.message" ? "user" : "assistant",
168
+ ...(phase ? { phase } : {}),
169
+ text: p.text,
170
+ }
171
+ : null;
172
+ }
173
+ if (selection.view === "results") {
174
+ if (event.type === "turn.completed" && ("maintenance" in p || "segmentLimit" in p)) return null;
175
+ const value = event.type === "turn.completed" ? (p.output ?? p.result) : p;
176
+ if (value === undefined || value === "") return null;
177
+ return {
178
+ ...base,
179
+ type: event.type,
180
+ text: typeof value === "string" ? value : JSON.stringify(value),
181
+ };
182
+ }
183
+ if (
184
+ selection.toolName &&
185
+ (event.type !== "agent.toolCall.created" || p.name !== selection.toolName)
186
+ )
187
+ return null;
188
+ const callId = p.callId ?? p.call_id ?? p.id;
189
+ if (selection.callId !== null && selection.callId !== callId) return null;
190
+ const output = event.type === "agent.toolCall.output";
191
+ // Choose one canonical slot. Never ship the raw receipt beside its parsed copy.
192
+ const value = output ? p.output : (p.arguments ?? p.args);
193
+ return {
194
+ ...base,
195
+ callId,
196
+ kind: output ? "result" : "call",
197
+ ...(typeof p.name === "string" ? { name: p.name } : {}),
198
+ ...(p.identityOmitted === true ? { identityOmitted: true } : {}),
199
+ ...(p.isError === true || record(value).isError === true ? { isError: true } : {}),
200
+ ...((output ? selection.includeOutput : selection.includeArguments) && value !== undefined
201
+ ? {
202
+ text: typeof value === "string" ? value : JSON.stringify(value),
203
+ encoding: typeof value === "string" ? "text" : "json",
204
+ }
205
+ : {}),
206
+ };
207
+ }
208
+
209
+ /** Read-only projection over the existing RLS/audit query. No command observations. */
210
+ export async function readSessionEventView(input: SessionEventViewInput, read: ReadPage) {
211
+ const { selection, continuation } = resolveSessionEventView(input);
212
+ const limit = selection.limit!;
213
+ let after =
214
+ continuation?.sequence && selection.direction === "after"
215
+ ? continuation.sequence - 1
216
+ : selection.after;
217
+ let before =
218
+ continuation?.sequence && selection.direction === "before"
219
+ ? continuation.sequence + 1
220
+ : selection.before;
221
+ const events: Item[] = [];
222
+ let hasMore = false;
223
+ let nextCursor: string | null = null;
224
+ let sourceExact = true;
225
+ let edge: number | null = null;
226
+ let legacyActive = continuation?.v === 1 && continuation.sequence !== null;
227
+ const page = () => ({
228
+ view: selection.view,
229
+ effectiveLimit: limit,
230
+ direction: selection.direction,
231
+ events,
232
+ nextAfter: selection.direction === "after" ? (edge ?? selection.after) : null,
233
+ nextBefore: selection.direction === "before" ? (edge ?? selection.before) : null,
234
+ hasMore,
235
+ nextCursor,
236
+ sourceExact,
237
+ ...(!sourceExact
238
+ ? {
239
+ sourceLoss: {
240
+ reason: "structured_value_exceeds_budget" as const,
241
+ completeTextAvailable: false as const,
242
+ message:
243
+ "An oversized structured value was omitted. Scalar text remains retrievable through continuation; omitted structured values are not complete JSON results.",
244
+ },
245
+ }
246
+ : {}),
247
+ maxBytes: SESSION_EVENT_VIEW_MAX_BYTES,
248
+ });
249
+ const resume = (sequence: number, offset = 0) => {
250
+ hasMore = true;
251
+ nextCursor = encode(
252
+ { ...selection, after, before },
253
+ sequence,
254
+ offset,
255
+ legacyActive && sequence === continuation?.sequence ? 1 : 2,
256
+ );
257
+ };
258
+ // Bound work even when a sparse exact callId lookup matches nothing. The
259
+ // returned cursor advances the scan without claiming the lookup is exhausted.
260
+ for (let scan = 0; scan < 64; scan += 1) {
261
+ const source = await read({
262
+ after,
263
+ ...(before === null ? {} : { before }),
264
+ direction: selection.direction,
265
+ limit: 8,
266
+ includeTypes: selection.toolName ? ["agent.toolCall.created"] : types[selection.view],
267
+ ...(selection.toolName ? { toolName: selection.toolName } : {}),
268
+ ...(selection.callId ? { callId: selection.callId } : {}),
269
+ payloadMode: "full",
270
+ excludeUnclaimedHumanPrompts: true,
271
+ maxBytes: 1024 * 1024,
272
+ legacyUtf16: legacyActive,
273
+ view: selection.view,
274
+ includeArguments: selection.includeArguments,
275
+ includeOutput: selection.includeOutput,
276
+ ...(continuation?.sequence
277
+ ? { sourceSequence: continuation.sequence, sourceOffset: continuation.offset }
278
+ : {}),
279
+ });
280
+ sourceExact &&= source.fullPayloadsExact;
281
+ const ordered = selection.direction === "before" ? [...source.events].reverse() : source.events;
282
+ for (const event of ordered) {
283
+ const slice = source.slices?.[event.sequence];
284
+ const item = project(event, selection);
285
+ if (item) {
286
+ const offset = continuation?.sequence === event.sequence ? continuation.offset : 0;
287
+ if (slice?.omitted) {
288
+ delete item.text;
289
+ item.sourceOmitted = { reason: "structured_value_exceeds_budget", complete: false };
290
+ }
291
+ const advance = (text: string) =>
292
+ slice?.unit === "codepoint" ? Array.from(text).length : text.length;
293
+ if (!slice && offset > (item.text?.length ?? 0))
294
+ throw new Error("Invalid message continuation offset");
295
+ if (
296
+ !slice &&
297
+ offset > 0 &&
298
+ item.text &&
299
+ /[\uD800-\uDBFF]/.test(item.text[offset - 1]!) &&
300
+ /[\uDC00-\uDFFF]/.test(item.text[offset] ?? "")
301
+ ) {
302
+ throw new Error("Invalid message continuation offset: splits a surrogate pair");
303
+ }
304
+ if (!slice && offset > 0 && item.text) item.text = item.text.slice(offset);
305
+ events.push(item);
306
+ // Reserve enough for the bounded cursor and fragment facts.
307
+ if (bytes(page()) > SESSION_EVENT_VIEW_MAX_BYTES - 4096) {
308
+ events.pop();
309
+ if (events.length > 0) {
310
+ resume(event.sequence, offset);
311
+ if (selection.direction === "before") events.reverse();
312
+ return page();
313
+ }
314
+ if (!item.text) throw new Error("Session event identity exceeds page budget");
315
+ const text = item.text;
316
+ let low = 0;
317
+ let high = text.length;
318
+ while (low < high) {
319
+ const mid = Math.ceil((low + high) / 2);
320
+ if (bytes({ ...item, text: text.slice(0, mid) }) <= SESSION_EVENT_VIEW_MAX_BYTES - 6000)
321
+ low = mid;
322
+ else high = mid - 1;
323
+ }
324
+ // Do not split a UTF-16 surrogate pair (UTF-8 remains lossless).
325
+ if (low > 0 && /[\uD800-\uDBFF]/.test(text[low - 1]!)) low -= 1;
326
+ if (low === 0) throw new Error("Session event identity exceeds page budget");
327
+ events.push({
328
+ ...item,
329
+ text: text.slice(0, low),
330
+ fragment: {
331
+ offset,
332
+ nextOffset: offset + advance(text.slice(0, low)),
333
+ complete: false,
334
+ unit: slice?.unit ?? "utf16",
335
+ },
336
+ });
337
+ resume(event.sequence, offset + advance(text.slice(0, low)));
338
+ return page();
339
+ }
340
+ const nextOffset = offset + advance(item.text ?? "");
341
+ if (slice && !slice.omitted && nextOffset < slice.total) {
342
+ item.fragment = { offset, nextOffset, complete: false, unit: slice.unit };
343
+ resume(event.sequence, nextOffset);
344
+ if (selection.direction === "before") events.reverse();
345
+ return page();
346
+ }
347
+ if (offset > 0)
348
+ item.fragment = {
349
+ offset,
350
+ nextOffset,
351
+ complete: true,
352
+ unit: slice?.unit ?? "utf16",
353
+ };
354
+ }
355
+ edge = event.sequence;
356
+ legacyActive = false;
357
+ if (selection.direction === "after") after = event.sequence;
358
+ else before = event.sequence;
359
+ if (events.length >= limit) {
360
+ hasMore = source.hasMore || event !== ordered.at(-1);
361
+ nextCursor = hasMore ? encode({ ...selection, after, before }) : null;
362
+ if (selection.direction === "before") events.reverse();
363
+ return page();
364
+ }
365
+ }
366
+ // Metadata selection can advance over stale/duplicate rows without a
367
+ // projected payload. Use its covered edge rather than repeating the page.
368
+ if (source.coveredSequence) {
369
+ if (selection.direction === "after") after = Math.max(after, source.coveredSequence.last);
370
+ else before = Math.min(before ?? Infinity, source.coveredSequence.first);
371
+ }
372
+ if (!source.hasMore) {
373
+ hasMore = false;
374
+ nextCursor = null;
375
+ if (selection.direction === "before") events.reverse();
376
+ return page();
377
+ }
378
+ hasMore = true;
379
+ nextCursor = encode({ ...selection, after, before });
380
+ }
381
+ if (selection.direction === "before") events.reverse();
382
+ return page();
383
+ }
@@ -17,11 +17,14 @@ import type {
17
17
  SessionEventPayloadMode,
18
18
  SessionEventReadDirection,
19
19
  SessionEventReadMode,
20
+ SessionMcpMonitoringSource,
21
+ SessionQueueSnapshot,
20
22
  } from "@opengeni/contracts";
21
23
  import {
22
24
  boundSessionEventPayload,
23
25
  measureSessionEventJson,
24
26
  sessionEventJsonBytes,
27
+ compactSessionMcpDetail,
25
28
  } from "@opengeni/contracts";
26
29
 
27
30
  export const SESSION_EVENT_MCP_MAX_BYTES = 64 * 1024;
@@ -479,12 +482,82 @@ function projectMonitoringContainer(
479
482
  };
480
483
  }
481
484
 
482
- /** Purpose-built, flat, model-facing detail projection for `session_get`. */
485
+ const SESSION_DETAIL_EFFECTIVE_TOOL_POLICY_ID_LIMIT = 12;
486
+
487
+ function projectEffectiveToolPolicy(value: Session["effectiveToolPolicy"]): {
488
+ value: unknown;
489
+ fact: SessionDetailFieldFact;
490
+ details: string[];
491
+ } {
492
+ if (!value) return projectMonitoringContainer(null, 16_000);
493
+ const sample = (ids: string[]) => ids.slice(0, SESSION_DETAIL_EFFECTIVE_TOOL_POLICY_ID_LIMIT);
494
+ const sampled =
495
+ value.selectedIds.length > SESSION_DETAIL_EFFECTIVE_TOOL_POLICY_ID_LIMIT ||
496
+ value.effectiveIds.length > SESSION_DETAIL_EFFECTIVE_TOOL_POLICY_ID_LIMIT ||
497
+ value.mandatoryIds.length > SESSION_DETAIL_EFFECTIVE_TOOL_POLICY_ID_LIMIT ||
498
+ value.lazyRouter.deferredIds.length > SESSION_DETAIL_EFFECTIVE_TOOL_POLICY_ID_LIMIT ||
499
+ value.configuredIds.length > SESSION_DETAIL_EFFECTIVE_TOOL_POLICY_ID_LIMIT ||
500
+ value.droppedIds.length > SESSION_DETAIL_EFFECTIVE_TOOL_POLICY_ID_LIMIT;
501
+ const bounded = {
502
+ ...value,
503
+ selectedIds: sample(value.selectedIds),
504
+ effectiveIds: sample(value.effectiveIds),
505
+ mandatoryIds: sample(value.mandatoryIds),
506
+ lazyRouter: { ...value.lazyRouter, deferredIds: sample(value.lazyRouter.deferredIds) },
507
+ configuredIds: sample(value.configuredIds),
508
+ droppedIds: sample(value.droppedIds),
509
+ idsTruncated: value.idsTruncated || sampled,
510
+ };
511
+ const projected = projectMonitoringContainer(bounded, 16_000);
512
+ const sourceMeasurement = measureSessionEventJson(value);
513
+ return {
514
+ ...projected,
515
+ fact: {
516
+ ...projected.fact,
517
+ truncated:
518
+ sampled ||
519
+ projected.fact.truncated ||
520
+ sourceMeasurement.bytes === null ||
521
+ sourceMeasurement.bytes !== projected.fact.deliveredBytes,
522
+ originalBytes: sourceMeasurement.bytes,
523
+ ...(sourceMeasurement.bytes === null ? { measurementBounded: true } : {}),
524
+ },
525
+ details: sampled
526
+ ? [
527
+ `effectiveToolPolicy: ids sampled at ${SESSION_DETAIL_EFFECTIVE_TOOL_POLICY_ID_LIMIT} per set; counts remain exact`,
528
+ ...projected.details,
529
+ ]
530
+ : projected.details,
531
+ };
532
+ }
533
+
534
+ /** Compact management state; configuration is deliberately excluded, not truncated. */
535
+ export function boundSessionCompactDetailMcp(
536
+ session: Session,
537
+ monitoring: SessionMcpMonitoringSource,
538
+ queue: SessionQueueSnapshot | null,
539
+ maxBytes = SESSION_DETAIL_MCP_MAX_BYTES,
540
+ ) {
541
+ const result = compactSessionMcpDetail(session, monitoring, queue);
542
+ // Never drop a goal outcome or blocker to fit. The ordinary closed shape fits;
543
+ // an unsupported envelope must fail explicitly rather than erase management truth.
544
+ if (prettyJsonBytes(result) > maxBytes) {
545
+ throw new RangeError(`session_get compact projection exceeds its ${maxBytes}-byte envelope`);
546
+ }
547
+ return result;
548
+ }
549
+
550
+ /** Legacy bounded configuration projection for explicit `session_get detail=full`. */
483
551
  export function boundSessionDetailMcp(
484
552
  session: Session,
485
553
  effectiveControl: unknown = session.effectiveControl,
486
554
  maxBytes = SESSION_DETAIL_MCP_MAX_BYTES,
487
555
  ) {
556
+ const variableSetIds = session.variableSetIds;
557
+ // The plural selection is authoritative. Keep the singular/environment
558
+ // fields only as final-entry compatibility aliases so they cannot be read as
559
+ // complete attachment membership by newer consumers.
560
+ const variableSetId = variableSetIds.at(-1) ?? null;
488
561
  const title = session.title === null ? null : modelStringProjection(session.title, 512);
489
562
  const initialMessage = modelStringProjection(session.initialMessage, 4_000);
490
563
  const instructions =
@@ -494,6 +567,7 @@ export function boundSessionDetailMcp(
494
567
  const tools = projectMonitoringContainer(session.tools, 4_000);
495
568
  const mcpServers = projectMonitoringContainer(session.mcpServers, 3_000);
496
569
  const permissions = projectMonitoringContainer(session.firstPartyMcpPermissions, 1_500);
570
+ const effectiveToolPolicy = projectEffectiveToolPolicy(session.effectiveToolPolicy);
497
571
  const control = projectMonitoringContainer(effectiveControl, 2_000);
498
572
  const fieldFacts: Record<string, SessionDetailFieldFact> = {
499
573
  title: title?.fact ?? {
@@ -512,6 +586,7 @@ export function boundSessionDetailMcp(
512
586
  tools: tools.fact,
513
587
  mcpServers: mcpServers.fact,
514
588
  firstPartyMcpPermissions: permissions.fact,
589
+ effectiveToolPolicy: effectiveToolPolicy.fact,
515
590
  effectiveControl: control.fact,
516
591
  };
517
592
  const details = [
@@ -520,6 +595,7 @@ export function boundSessionDetailMcp(
520
595
  ...tools.details,
521
596
  ...mcpServers.details,
522
597
  ...permissions.details,
598
+ ...effectiveToolPolicy.details,
523
599
  ...control.details,
524
600
  ].slice(0, 32);
525
601
  const result = {
@@ -535,16 +611,20 @@ export function boundSessionDetailMcp(
535
611
  tools: tools.value,
536
612
  metadata: metadata.value,
537
613
  model: modelStringProjection(session.model, 512).value,
614
+ reasoningEffort: session.reasoningEffort,
615
+ latencyMode: session.latencyMode,
538
616
  sandboxBackend: modelStringProjection(session.sandboxBackend, 128).value,
539
617
  sandboxOs: session.sandboxOs,
540
618
  sandboxGroupId: session.sandboxGroupId,
541
619
  activeSandboxId: session.activeSandboxId,
542
620
  activeEpoch: session.activeEpoch,
543
- variableSetId: session.variableSetId,
544
- environmentId: session.environmentId,
621
+ variableSetIds,
622
+ variableSetId,
623
+ environmentId: variableSetId,
545
624
  rigId: session.rigId,
546
625
  rigVersionId: session.rigVersionId,
547
626
  firstPartyMcpPermissions: permissions.value,
627
+ effectiveToolPolicy: effectiveToolPolicy.value,
548
628
  mcpServers: mcpServers.value,
549
629
  parentSessionId: session.parentSessionId,
550
630
  createIdempotencyKey:
@@ -594,6 +674,7 @@ export function boundSessionDetailMcp(
594
674
  ["mcpServers", fieldFacts.mcpServers!],
595
675
  ["effectiveControl", fieldFacts.effectiveControl!],
596
676
  ["firstPartyMcpPermissions", fieldFacts.firstPartyMcpPermissions!],
677
+ ["effectiveToolPolicy", fieldFacts.effectiveToolPolicy!],
597
678
  ];
598
679
  for (const [field, fact] of fallbackContainers) {
599
680
  if (result.projection.bytes <= maxBytes) break;