@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
@@ -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;