@opengeni/api-router 3.0.1 → 3.0.2-canary.38894290271001

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 (546) hide show
  1. package/dist/access-grant-rls.d.ts +8 -1
  2. package/dist/admission-trace.d.ts +8 -0
  3. package/dist/app.d.ts +50 -3
  4. package/dist/app.js +10 -1
  5. package/dist/artifact-catalog-cursor.d.ts +1 -0
  6. package/dist/attached-browser-viewer.d.ts +11 -0
  7. package/dist/auth/managed-auth-attempt-context.d.ts +2 -0
  8. package/dist/auth/managed-auth-rate-limits.d.ts +167 -0
  9. package/dist/auth/managed-auth-session-adapter.d.ts +9 -1
  10. package/dist/auth/managed-auth.d.ts +72 -5
  11. package/dist/auth/managed-sign-in-notifications.d.ts +4 -0
  12. package/dist/auth/new-signups-gate.d.ts +23 -0
  13. package/dist/auth/signup-funnel-metrics.d.ts +44 -0
  14. package/dist/azure-live.d.ts +28 -0
  15. package/dist/browser-action-fences.d.ts +13 -0
  16. package/dist/browser-controller-authority.d.ts +1 -61
  17. package/dist/browser-ephemeral.d.ts +5 -0
  18. package/dist/browser-lost-runtime-end.d.ts +24 -0
  19. package/dist/browser-state-authority.d.ts +1 -27
  20. package/dist/{chunk-AJ62T5QN.js → chunk-GBUJ2DYZ.js} +80507 -39878
  21. package/dist/chunk-GBUJ2DYZ.js.map +1 -0
  22. package/dist/chunk-OGQDXVXY.js +18 -0
  23. package/dist/chunk-OGQDXVXY.js.map +1 -0
  24. package/dist/claude-default-models.d.ts +19 -0
  25. package/dist/claude-subscription-core.d.ts +50 -0
  26. package/dist/claude-subscription-oauth.d.ts +36 -0
  27. package/dist/claude-subscription-profile.d.ts +9 -0
  28. package/dist/claude-subscription-usage.d.ts +6 -0
  29. package/dist/claude-workspace-connection.d.ts +15 -0
  30. package/dist/codemode.d.ts +40 -5
  31. package/dist/codex-realtime.d.ts +29 -3
  32. package/dist/codex-session-pointers.d.ts +19 -0
  33. package/dist/connection-ownership.d.ts +6 -3
  34. package/dist/controller-data-plane.d.ts +16 -0
  35. package/dist/credit-promotion-snapshot.d.ts +6 -0
  36. package/dist/editable-artifact-source-session.d.ts +3 -0
  37. package/dist/editable-artifact-websocket.d.ts +5 -3
  38. package/dist/fatal-process-boundary.d.ts +9 -1
  39. package/dist/github-access.d.ts +7 -1
  40. package/dist/github-browser-flow.d.ts +1 -1
  41. package/dist/http/acting-person.d.ts +36 -0
  42. package/dist/http/api-contract-compat.d.ts +19 -0
  43. package/dist/http/api-error.d.ts +50 -1
  44. package/dist/http/auth.d.ts +8 -1
  45. package/dist/http/cors.d.ts +12 -0
  46. package/dist/http/deprecation.d.ts +42 -0
  47. package/dist/http/keyed-admission.d.ts +12 -0
  48. package/dist/http/local-browser-boundary.d.ts +72 -0
  49. package/dist/http/metrics-listener.d.ts +22 -0
  50. package/dist/http/path-identifier.d.ts +17 -0
  51. package/dist/http/registered-route-label.d.ts +16 -0
  52. package/dist/http/rejection-telemetry.d.ts +34 -0
  53. package/dist/http/request-body.d.ts +27 -0
  54. package/dist/http/request-source.d.ts +41 -3
  55. package/dist/http/sse.d.ts +12 -1
  56. package/dist/http/unmatched-route.d.ts +18 -0
  57. package/dist/http/user-content.d.ts +36 -0
  58. package/dist/http/variable-sets-removed.d.ts +41 -0
  59. package/dist/http/websocket-upgrade-dispatch.d.ts +18 -0
  60. package/dist/index.js +1279 -108
  61. package/dist/index.js.map +1 -1
  62. package/dist/integration-connect-metrics.d.ts +35 -0
  63. package/dist/integration-endpoint-test.d.ts +20 -0
  64. package/dist/integrations/api-integrations.d.ts +2 -2
  65. package/dist/integrations/atlassian.d.ts +8 -3
  66. package/dist/integrations/fiken.d.ts +3 -1
  67. package/dist/integrations/github-lens-connect.d.ts +37 -66
  68. package/dist/integrations/google-drive.d.ts +2 -0
  69. package/dist/integrations/integration-commit-authority.d.ts +13 -0
  70. package/dist/integrations/marketplace-plugin.d.ts +43 -43
  71. package/dist/integrations/oauth-client.d.ts +171 -12
  72. package/dist/integrations/oauth-profiles.d.ts +42 -13
  73. package/dist/integrations/onepassword-vault-provider.d.ts +9 -0
  74. package/dist/integrations/slack-bot.d.ts +285 -7
  75. package/dist/integrations/slack-file-upload-flow.d.ts +62 -0
  76. package/dist/integrations/slack-interactions.d.ts +89 -10
  77. package/dist/integrations/slack-mrkdwn.d.ts +41 -0
  78. package/dist/integrations/slack-routing.d.ts +1 -1
  79. package/dist/integrations/slack-session-defaults.d.ts +58 -0
  80. package/dist/integrations/slack-task-file-upload.d.ts +36 -0
  81. package/dist/integrations/slack-tool-review.d.ts +5 -0
  82. package/dist/interaction-agent-access.d.ts +13 -8
  83. package/dist/interaction-agent-version.d.ts +21 -0
  84. package/dist/interaction-holder-heartbeat.d.ts +5 -0
  85. package/dist/interaction-metrics.d.ts +27 -2
  86. package/dist/interaction-route-stages.d.ts +25 -0
  87. package/dist/interaction-secrets-vault.d.ts +20 -0
  88. package/dist/interaction-secrets.d.ts +103 -0
  89. package/dist/mcp/action-catalog-types.d.ts +14 -0
  90. package/dist/mcp/action-catalog.gen.d.ts +2 -0
  91. package/dist/mcp/action-descriptions.d.ts +4 -0
  92. package/dist/mcp/action-schema-imports.gen.d.ts +1 -0
  93. package/dist/mcp/capability-account-readiness.d.ts +7 -0
  94. package/dist/mcp/child-read-evidence.d.ts +9 -0
  95. package/dist/mcp/company-profile-agent-admin.d.ts +12 -0
  96. package/dist/mcp/contract-input.d.ts +13 -0
  97. package/dist/mcp/documents.d.ts +2 -0
  98. package/dist/mcp/first-party-tool-permissions.d.ts +3 -606
  99. package/dist/mcp/notification-tools.d.ts +26 -0
  100. package/dist/mcp/orchestration-failure-diagnostic.d.ts +43 -0
  101. package/dist/mcp/scheduled-task-input.d.ts +1309 -0
  102. package/dist/mcp/scheduled-task-view.d.ts +217 -3
  103. package/dist/mcp/secret-tools.d.ts +14 -0
  104. package/dist/mcp/server.d.ts +108 -5
  105. package/dist/mcp/session-admin-access-tools.d.ts +33 -0
  106. package/dist/mcp/session-event-errors.d.ts +28 -0
  107. package/dist/mcp/session-event-view.d.ts +62 -0
  108. package/dist/mcp/session-view.d.ts +15 -0
  109. package/dist/mcp/session-wait.d.ts +18 -0
  110. package/dist/mcp/site-agent-clamp-tools.d.ts +38 -0
  111. package/dist/mcp/site-data-tools.d.ts +22 -0
  112. package/dist/mcp/site-publication-tools.d.ts +19 -0
  113. package/dist/mcp/site-sql-tools.d.ts +27 -0
  114. package/dist/mcp-oauth.d.ts +37 -4
  115. package/dist/model-calls/chat-completions.d.ts +87 -0
  116. package/dist/model-calls/pending-usage-settlements.d.ts +57 -0
  117. package/dist/model-calls/service.d.ts +36 -0
  118. package/dist/model-catalog.d.ts +9 -3
  119. package/dist/native-push-dispatch.d.ts +69 -0
  120. package/dist/observability.d.ts +3 -1
  121. package/dist/organization-mcp.d.ts +82 -0
  122. package/dist/prepared-mcp-actor.d.ts +77 -0
  123. package/dist/prepared-mcp-permissions.d.ts +8 -0
  124. package/dist/routes/analytics-consent.d.ts +26 -0
  125. package/dist/routes/api-integrations.d.ts +11 -0
  126. package/dist/routes/api-keys.d.ts +7 -7
  127. package/dist/routes/automations.d.ts +2 -0
  128. package/dist/routes/billing.d.ts +59 -0
  129. package/dist/routes/browser-sessions.d.ts +65 -2
  130. package/dist/routes/chat-completions.d.ts +11 -0
  131. package/dist/routes/claude-core-usage.d.ts +20 -0
  132. package/dist/routes/claude-subscription-accounts.d.ts +3 -0
  133. package/dist/routes/claude-subscription-oauth.d.ts +3 -0
  134. package/dist/routes/client-errors.d.ts +182 -0
  135. package/dist/routes/codex-core.d.ts +401 -0
  136. package/dist/routes/codex.d.ts +64 -2
  137. package/dist/routes/computer-sessions.d.ts +6 -1
  138. package/dist/routes/desktop-distribution.d.ts +32 -0
  139. package/dist/routes/github-browser-fonts.gen.d.ts +2 -0
  140. package/dist/routes/github-browser-pages.d.ts +27 -0
  141. package/dist/routes/inbox.d.ts +13 -0
  142. package/dist/routes/insights-response-cache.d.ts +10 -0
  143. package/dist/routes/insights-usage.d.ts +12 -0
  144. package/dist/routes/insights.d.ts +28 -0
  145. package/dist/routes/interaction-placement-message.d.ts +7 -0
  146. package/dist/routes/managed-sign-in-methods.d.ts +6 -0
  147. package/dist/routes/model-account-choice.d.ts +13 -0
  148. package/dist/routes/model-account-settings.d.ts +19 -0
  149. package/dist/routes/native-app-auth.d.ts +12 -0
  150. package/dist/routes/organization-integration-policy.d.ts +8 -0
  151. package/dist/routes/organization-integrations.d.ts +6 -0
  152. package/dist/routes/organization-mcp-connections.d.ts +3 -0
  153. package/dist/routes/organization-model-defaults.d.ts +9 -0
  154. package/dist/routes/organization-service-accounts.d.ts +3 -0
  155. package/dist/routes/personal-api-keys.d.ts +3 -0
  156. package/dist/routes/session-admin-access.d.ts +3 -0
  157. package/dist/routes/session-artifact-associations.d.ts +4 -0
  158. package/dist/routes/session-history-imports.d.ts +20 -0
  159. package/dist/routes/sessions.d.ts +38 -2
  160. package/dist/routes/site-data.d.ts +18 -0
  161. package/dist/routes/site-publishing.d.ts +5 -0
  162. package/dist/routes/site-runtime.d.ts +31 -0
  163. package/dist/routes/site-sql.d.ts +16 -0
  164. package/dist/routes/slack-bot-access.d.ts +3 -0
  165. package/dist/routes/subscription-account-pools.d.ts +21 -0
  166. package/dist/routes/subscription-core-http.d.ts +5 -0
  167. package/dist/routes/subscription-pool-access.d.ts +37 -0
  168. package/dist/routes/subscription-pool-core.d.ts +153 -0
  169. package/dist/routes/supergrok.d.ts +6 -6
  170. package/dist/routes/usage-allowances.d.ts +12 -0
  171. package/dist/routes/variable-sets-removed.d.ts +2 -0
  172. package/dist/routes/vault-providers.d.ts +34 -0
  173. package/dist/routes/vaults.d.ts +3 -0
  174. package/dist/routes/workspace-integrations.d.ts +35 -0
  175. package/dist/routes/workspace-model-providers.d.ts +4 -0
  176. package/dist/routes/workspaces.d.ts +11 -2
  177. package/dist/sandbox/agent-update.d.ts +64 -0
  178. package/dist/sandbox/auth-callout.d.ts +8 -0
  179. package/dist/sandbox/channel-a.d.ts +15 -1
  180. package/dist/sandbox/enrollment.d.ts +26 -4
  181. package/dist/sandbox/machine-audience.d.ts +29 -0
  182. package/dist/sandbox/machines.d.ts +15 -2
  183. package/dist/sandbox/metrics-ingestion.d.ts +6 -2
  184. package/dist/sandbox/screen-control.d.ts +85 -0
  185. package/dist/sandbox/viewer.d.ts +5 -1
  186. package/dist/sandbox-file-artifacts.d.ts +17 -1
  187. package/dist/scheduled-task-blockers.d.ts +39 -0
  188. package/dist/scheduled-task-deletion.d.ts +3 -4
  189. package/dist/scheduled-task-lifecycle.d.ts +14 -0
  190. package/dist/secret-answers.d.ts +40 -0
  191. package/dist/session-create-observability.d.ts +5 -0
  192. package/dist/session-event-view-36GO3IL7.js +528 -0
  193. package/dist/session-event-view-36GO3IL7.js.map +1 -0
  194. package/dist/signed-state-secret.d.ts +18 -0
  195. package/dist/site-agent-guard.d.ts +53 -0
  196. package/dist/site-data/operations.d.ts +103 -0
  197. package/dist/site-data/service.d.ts +203 -0
  198. package/dist/site-frame-guard.d.ts +32 -0
  199. package/dist/site-publishing/agent-data-tools.d.ts +84 -0
  200. package/dist/site-publishing/agent-model.d.ts +58 -0
  201. package/dist/site-publishing/agent-session.d.ts +16 -0
  202. package/dist/site-publishing/content-scanner.d.ts +31 -0
  203. package/dist/site-publishing/edge-sync.d.ts +48 -0
  204. package/dist/site-publishing/gateway-signature.d.ts +56 -0
  205. package/dist/site-publishing/limits.d.ts +63 -0
  206. package/dist/site-publishing/page-tool-authority.d.ts +30 -0
  207. package/dist/site-publishing/platform-usage.d.ts +113 -0
  208. package/dist/site-publishing/platform.d.ts +21 -0
  209. package/dist/site-publishing/readiness.d.ts +62 -0
  210. package/dist/site-publishing/runtime.d.ts +179 -0
  211. package/dist/site-publishing/service.d.ts +264 -0
  212. package/dist/site-publishing/session-events.d.ts +22 -0
  213. package/dist/site-publishing/session-views.d.ts +36 -0
  214. package/dist/site-publishing/viewer.d.ts +40 -0
  215. package/dist/site-session-origin.d.ts +31 -6
  216. package/dist/site-sql/format.d.ts +47 -0
  217. package/dist/site-sql/gateway.d.ts +50 -0
  218. package/dist/site-sql/service.d.ts +213 -0
  219. package/dist/temporal-schedule-sync.d.ts +26 -0
  220. package/dist/transcription/billing-refusal.d.ts +8 -0
  221. package/dist/transcription/normalize.d.ts +23 -0
  222. package/dist/transcription/providers/azure-mai.d.ts +12 -0
  223. package/dist/transcription/providers/azure-openai.d.ts +4 -0
  224. package/dist/transcription/providers/openai.d.ts +16 -0
  225. package/dist/transcription/providers/subscription-core.d.ts +39 -0
  226. package/dist/transcription/service.d.ts +10 -1
  227. package/dist/transcription/wav-duration.d.ts +8 -0
  228. package/dist/workspace-tool-gateway-attestations.d.ts +37 -0
  229. package/dist/workspace-tool-gateway-observability.d.ts +16 -0
  230. package/dist/workspace-tool-gateway-secrets.d.ts +27 -0
  231. package/dist/workspace-tool-gateway.d.ts +102 -6
  232. package/dist/workspace-tool-target-fence.d.ts +116 -0
  233. package/dist/workspace-tool-target.d.ts +225 -0
  234. package/dist/workspace-webhook-dispatch.d.ts +26 -0
  235. package/dist/xai-subscription-core.d.ts +60 -0
  236. package/package.json +25 -20
  237. package/src/access-grant-rls.ts +64 -14
  238. package/src/admission-trace.ts +14 -0
  239. package/src/app.ts +1684 -252
  240. package/src/artifact-catalog-cursor.ts +1 -0
  241. package/src/attached-browser-viewer.ts +26 -0
  242. package/src/auth/managed-auth-attempt-context.ts +9 -0
  243. package/src/auth/managed-auth-rate-limits.ts +252 -0
  244. package/src/auth/managed-auth-session-adapter.ts +64 -29
  245. package/src/auth/managed-auth.ts +303 -35
  246. package/src/auth/managed-email.ts +18 -1
  247. package/src/auth/managed-sign-in-notifications.ts +81 -0
  248. package/src/auth/new-signups-gate.ts +49 -0
  249. package/src/auth/organization-user-setup.ts +3 -3
  250. package/src/auth/signup-funnel-metrics.ts +164 -0
  251. package/src/azure-live.ts +103 -0
  252. package/src/browser-action-fences.ts +45 -0
  253. package/src/browser-controller-authority.ts +1 -186
  254. package/src/browser-ephemeral.ts +39 -0
  255. package/src/browser-lost-runtime-end.ts +71 -0
  256. package/src/browser-state-authority.ts +1 -236
  257. package/src/claude-default-models.ts +37 -0
  258. package/src/claude-subscription-core.ts +154 -0
  259. package/src/claude-subscription-oauth.ts +352 -0
  260. package/src/claude-subscription-profile.ts +73 -0
  261. package/src/claude-subscription-usage.ts +51 -0
  262. package/src/claude-workspace-connection.ts +82 -0
  263. package/src/codemode.ts +236 -39
  264. package/src/codex-realtime.ts +181 -53
  265. package/src/codex-session-pointers.ts +80 -0
  266. package/src/company-brain-okf.ts +1 -1
  267. package/src/connected-machine-computer-access.ts +2 -1
  268. package/src/connection-ownership.ts +19 -13
  269. package/src/controller-data-plane.ts +34 -0
  270. package/src/credit-promotion-snapshot.ts +36 -0
  271. package/src/editable-artifact-production.ts +10 -0
  272. package/src/editable-artifact-source-session.ts +123 -0
  273. package/src/editable-artifact-websocket.ts +16 -3
  274. package/src/fatal-process-boundary.ts +67 -3
  275. package/src/gateway-realtime.ts +12 -8
  276. package/src/github-access.ts +31 -5
  277. package/src/github-browser-flow.ts +1 -1
  278. package/src/http/acting-person.ts +105 -0
  279. package/src/http/api-contract-compat.ts +49 -0
  280. package/src/http/api-error.ts +210 -2
  281. package/src/http/auth.ts +68 -4
  282. package/src/http/cors.ts +37 -5
  283. package/src/http/deprecation.ts +118 -0
  284. package/src/http/keyed-admission.ts +29 -0
  285. package/src/http/local-browser-boundary.ts +343 -0
  286. package/src/http/metrics-listener.ts +57 -0
  287. package/src/http/path-identifier.ts +54 -0
  288. package/src/http/registered-route-label.ts +34 -0
  289. package/src/http/rejection-telemetry.ts +120 -0
  290. package/src/http/request-body.ts +127 -0
  291. package/src/http/request-source.ts +154 -13
  292. package/src/http/sse.ts +88 -28
  293. package/src/http/unmatched-route.ts +60 -0
  294. package/src/http/user-content.ts +158 -0
  295. package/src/http/variable-sets-removed.ts +122 -0
  296. package/src/http/websocket-upgrade-dispatch.ts +29 -0
  297. package/src/index.ts +107 -57
  298. package/src/integration-connect-metrics.ts +228 -0
  299. package/src/integration-endpoint-test.ts +291 -0
  300. package/src/integrations/api-integrations.ts +81 -7
  301. package/src/integrations/atlassian.ts +202 -83
  302. package/src/integrations/fiken.ts +66 -38
  303. package/src/integrations/github-app-connect.ts +64 -18
  304. package/src/integrations/github-lens-connect.ts +8 -29
  305. package/src/integrations/google-drive.ts +448 -152
  306. package/src/integrations/integration-commit-authority.ts +69 -0
  307. package/src/integrations/marketplace-plugin.ts +1 -1
  308. package/src/integrations/oauth-client.ts +733 -193
  309. package/src/integrations/oauth-profiles.ts +116 -45
  310. package/src/integrations/onepassword-vault-provider.ts +16 -0
  311. package/src/integrations/personal-github-repositories.ts +1 -1
  312. package/src/integrations/personal-github.ts +61 -35
  313. package/src/integrations/provider-oauth.ts +67 -85
  314. package/src/integrations/slack-app-home.ts +5 -5
  315. package/src/integrations/slack-bot.ts +893 -201
  316. package/src/integrations/slack-file-upload-flow.ts +147 -0
  317. package/src/integrations/slack-install.ts +7 -7
  318. package/src/integrations/slack-interactions.ts +1589 -299
  319. package/src/integrations/slack-mrkdwn.ts +193 -0
  320. package/src/integrations/slack-routing.ts +2 -2
  321. package/src/integrations/slack-session-defaults.ts +224 -0
  322. package/src/integrations/slack-task-file-upload.ts +323 -0
  323. package/src/integrations/slack-tool-review.ts +65 -0
  324. package/src/integrations/social-oauth.ts +90 -58
  325. package/src/interaction-agent-access.ts +40 -20
  326. package/src/interaction-agent-version.ts +85 -0
  327. package/src/interaction-holder-heartbeat.ts +24 -8
  328. package/src/interaction-metrics.ts +164 -2
  329. package/src/interaction-route-stages.ts +94 -0
  330. package/src/interaction-secrets-vault.ts +213 -0
  331. package/src/interaction-secrets.ts +426 -0
  332. package/src/mcp/action-catalog-types.ts +14 -0
  333. package/src/mcp/action-catalog.gen.ts +8014 -0
  334. package/src/mcp/action-descriptions.ts +299 -0
  335. package/src/mcp/action-schema-imports.gen.ts +304 -0
  336. package/src/mcp/capability-account-readiness.ts +17 -0
  337. package/src/mcp/child-read-evidence.ts +19 -0
  338. package/src/mcp/company-profile-agent-admin.ts +13 -0
  339. package/src/mcp/contract-input.ts +165 -0
  340. package/src/mcp/documents.ts +9 -2
  341. package/src/mcp/editable-artifacts.ts +29 -11
  342. package/src/mcp/files.ts +5 -1
  343. package/src/mcp/first-party-tool-permissions.ts +7 -285
  344. package/src/mcp/knowledge-entries.ts +108 -34
  345. package/src/mcp/notification-tools.ts +480 -0
  346. package/src/mcp/orchestration-failure-diagnostic.ts +43 -0
  347. package/src/mcp/scheduled-task-input.ts +89 -0
  348. package/src/mcp/scheduled-task-view.ts +63 -3
  349. package/src/mcp/secret-tools.ts +185 -0
  350. package/src/mcp/server.ts +2213 -1116
  351. package/src/mcp/session-admin-access-tools.ts +163 -0
  352. package/src/mcp/session-event-errors.ts +123 -0
  353. package/src/mcp/session-event-view.ts +395 -13
  354. package/src/mcp/session-view.ts +3 -0
  355. package/src/mcp/session-wait.ts +67 -7
  356. package/src/mcp/site-agent-clamp-tools.ts +140 -0
  357. package/src/mcp/site-data-tools.ts +339 -0
  358. package/src/mcp/site-publication-tools.ts +201 -0
  359. package/src/mcp/site-sql-tools.ts +427 -0
  360. package/src/mcp-oauth.ts +635 -45
  361. package/src/model-calls/chat-completions.ts +352 -0
  362. package/src/model-calls/pending-usage-settlements.ts +125 -0
  363. package/src/model-calls/service.ts +694 -0
  364. package/src/model-catalog.ts +68 -17
  365. package/src/native-push-dispatch.ts +457 -0
  366. package/src/observability.ts +15 -1
  367. package/src/organization-mcp.ts +485 -0
  368. package/src/prepared-mcp-actor.ts +154 -0
  369. package/src/prepared-mcp-permissions.ts +38 -0
  370. package/src/routes/analytics-consent.ts +123 -0
  371. package/src/routes/api-integrations.ts +268 -9
  372. package/src/routes/api-keys.ts +164 -25
  373. package/src/routes/artifact-catalog.ts +111 -0
  374. package/src/routes/automations.ts +163 -90
  375. package/src/routes/billing.ts +535 -59
  376. package/src/routes/browser-sessions.ts +966 -342
  377. package/src/routes/canonical-human-identities.ts +61 -0
  378. package/src/routes/capabilities.ts +112 -5
  379. package/src/routes/channels.ts +4 -3
  380. package/src/routes/chat-completions.ts +235 -0
  381. package/src/routes/claude-core-usage.ts +147 -0
  382. package/src/routes/claude-subscription-accounts.ts +233 -0
  383. package/src/routes/claude-subscription-oauth.ts +175 -0
  384. package/src/routes/client-errors.ts +394 -0
  385. package/src/routes/codex-core.ts +687 -0
  386. package/src/routes/codex.ts +1277 -1119
  387. package/src/routes/company-brain.ts +4 -0
  388. package/src/routes/computer-sessions.ts +319 -85
  389. package/src/routes/connect.ts +277 -175
  390. package/src/routes/connections.ts +690 -363
  391. package/src/routes/desktop-distribution.ts +217 -0
  392. package/src/routes/documents.ts +13 -7
  393. package/src/routes/editable-artifacts.ts +74 -4
  394. package/src/routes/enrollments.ts +110 -16
  395. package/src/routes/external-identity-links.ts +13 -12
  396. package/src/routes/files.ts +41 -16
  397. package/src/routes/github-browser-fonts.gen.ts +12 -0
  398. package/src/routes/github-browser-pages.ts +258 -0
  399. package/src/routes/github.ts +200 -75
  400. package/src/routes/inbox.ts +353 -0
  401. package/src/routes/insights-response-cache.ts +83 -0
  402. package/src/routes/insights-usage.ts +345 -0
  403. package/src/routes/insights.ts +103 -8
  404. package/src/routes/install.ts +51 -10
  405. package/src/routes/integration-facets.ts +70 -28
  406. package/src/routes/interaction-placement-message.ts +12 -0
  407. package/src/routes/knowledge.ts +136 -27
  408. package/src/routes/machines.ts +189 -135
  409. package/src/routes/managed-auth-session-sets.ts +43 -10
  410. package/src/routes/managed-onboarding.ts +39 -19
  411. package/src/routes/managed-sign-in-methods.ts +433 -0
  412. package/src/routes/memory-slack-publications.ts +3 -2
  413. package/src/routes/model-account-choice.ts +194 -0
  414. package/src/routes/model-account-settings.ts +235 -0
  415. package/src/routes/model-connection-access.ts +210 -48
  416. package/src/routes/native-app-auth.ts +296 -0
  417. package/src/routes/organization-integration-policy.ts +116 -0
  418. package/src/routes/organization-integrations.ts +326 -0
  419. package/src/routes/organization-mcp-connections.ts +183 -0
  420. package/src/routes/organization-memberships.ts +205 -19
  421. package/src/routes/organization-model-defaults.ts +110 -0
  422. package/src/routes/organization-model-providers.ts +74 -3
  423. package/src/routes/organization-service-accounts.ts +128 -0
  424. package/src/routes/organization-sessions.ts +21 -5
  425. package/src/routes/personal-api-keys.ts +184 -0
  426. package/src/routes/personal-github-git-broker.ts +2 -2
  427. package/src/routes/personal-github.ts +9 -4
  428. package/src/routes/plugins.ts +46 -7
  429. package/src/routes/pr-review-github.ts +105 -118
  430. package/src/routes/pr-review.ts +88 -82
  431. package/src/routes/preference-registry.ts +18 -0
  432. package/src/routes/rigs.ts +48 -13
  433. package/src/routes/scheduled-tasks.ts +347 -27
  434. package/src/routes/session-admin-access.ts +271 -0
  435. package/src/routes/session-artifact-associations.ts +164 -0
  436. package/src/routes/session-history-imports.ts +305 -0
  437. package/src/routes/sessions.ts +1682 -363
  438. package/src/routes/site-data.ts +340 -0
  439. package/src/routes/site-publishing.ts +584 -0
  440. package/src/routes/site-runtime.ts +1944 -0
  441. package/src/routes/site-sql.ts +263 -0
  442. package/src/routes/skill-content.ts +72 -7
  443. package/src/routes/skills.ts +5 -4
  444. package/src/routes/slack-bot-access.ts +108 -0
  445. package/src/routes/social.ts +27 -15
  446. package/src/routes/subscription-account-pools.ts +209 -0
  447. package/src/routes/subscription-core-http.ts +18 -0
  448. package/src/routes/subscription-pool-access.ts +180 -0
  449. package/src/routes/subscription-pool-core.ts +552 -0
  450. package/src/routes/supergrok.ts +174 -655
  451. package/src/routes/transcription-recordings.ts +71 -4
  452. package/src/routes/transcriptions.ts +26 -2
  453. package/src/routes/usage-allowances.ts +381 -0
  454. package/src/routes/variable-sets-removed.ts +19 -0
  455. package/src/routes/vault-providers.ts +782 -0
  456. package/src/routes/vaults.ts +421 -0
  457. package/src/routes/video-generation.ts +30 -12
  458. package/src/routes/workspace-artifacts.ts +165 -53
  459. package/src/routes/workspace-integrations.ts +576 -0
  460. package/src/routes/workspace-model-providers.ts +148 -0
  461. package/src/routes/workspace-state.ts +4 -0
  462. package/src/routes/workspaces.ts +625 -117
  463. package/src/sandbox/agent-update.ts +315 -0
  464. package/src/sandbox/auth-callout.ts +104 -21
  465. package/src/sandbox/channel-a.ts +150 -49
  466. package/src/sandbox/enrollment.ts +131 -22
  467. package/src/sandbox/machine-audience.ts +192 -0
  468. package/src/sandbox/machines.ts +75 -31
  469. package/src/sandbox/metrics-ingestion.ts +133 -2
  470. package/src/sandbox/rematerialize.ts +51 -21
  471. package/src/sandbox/screen-control.ts +289 -0
  472. package/src/sandbox/viewer.ts +33 -58
  473. package/src/sandbox-file-artifacts.ts +53 -27
  474. package/src/scheduled-task-blockers.ts +293 -0
  475. package/src/scheduled-task-deletion.ts +13 -3
  476. package/src/scheduled-task-lifecycle.ts +84 -0
  477. package/src/secret-answers.ts +119 -0
  478. package/src/session-create-observability.ts +46 -0
  479. package/src/session-realtime-context.ts +26 -4
  480. package/src/signed-state-secret.ts +58 -0
  481. package/src/site-agent-guard.ts +261 -0
  482. package/src/site-data/operations.ts +777 -0
  483. package/src/site-data/service.ts +1043 -0
  484. package/src/site-frame-guard.ts +107 -0
  485. package/src/site-publishing/agent-data-tools.ts +250 -0
  486. package/src/site-publishing/agent-model.ts +127 -0
  487. package/src/site-publishing/agent-session.ts +148 -0
  488. package/src/site-publishing/content-scanner.ts +93 -0
  489. package/src/site-publishing/edge-sync.ts +148 -0
  490. package/src/site-publishing/gateway-signature.ts +198 -0
  491. package/src/site-publishing/limits.ts +315 -0
  492. package/src/site-publishing/page-tool-authority.ts +111 -0
  493. package/src/site-publishing/platform-usage.ts +479 -0
  494. package/src/site-publishing/platform.ts +98 -0
  495. package/src/site-publishing/readiness.ts +330 -0
  496. package/src/site-publishing/runtime.ts +831 -0
  497. package/src/site-publishing/service.ts +1282 -0
  498. package/src/site-publishing/session-events.ts +262 -0
  499. package/src/site-publishing/session-views.ts +262 -0
  500. package/src/site-publishing/viewer.ts +75 -0
  501. package/src/site-session-origin.ts +91 -6
  502. package/src/site-sql/format.ts +134 -0
  503. package/src/site-sql/gateway.ts +168 -0
  504. package/src/site-sql/service.ts +1636 -0
  505. package/src/site-uploads.ts +27 -5
  506. package/src/temporal-schedule-sync.ts +74 -0
  507. package/src/transcription/billing-refusal.ts +14 -0
  508. package/src/transcription/normalize.ts +77 -0
  509. package/src/transcription/providers/azure-mai.ts +98 -0
  510. package/src/transcription/providers/azure-openai.ts +16 -7
  511. package/src/transcription/providers/codex-subscription.ts +190 -67
  512. package/src/transcription/providers/openai.ts +79 -5
  513. package/src/transcription/providers/subscription-core.ts +125 -0
  514. package/src/transcription/providers/xai-subscription.ts +81 -83
  515. package/src/transcription/segmenter.ts +7 -1
  516. package/src/transcription/service.ts +239 -10
  517. package/src/transcription/wav-duration.ts +39 -0
  518. package/src/workspace-deletion.ts +25 -1
  519. package/src/workspace-tool-gateway-attestations.ts +133 -0
  520. package/src/workspace-tool-gateway-observability.ts +64 -0
  521. package/src/workspace-tool-gateway-secrets.ts +104 -0
  522. package/src/workspace-tool-gateway.ts +921 -103
  523. package/src/workspace-tool-target-fence.ts +380 -0
  524. package/src/workspace-tool-target.ts +554 -0
  525. package/src/workspace-webhook-dispatch.ts +225 -0
  526. package/src/xai-realtime.ts +85 -81
  527. package/src/xai-subscription-core.ts +172 -0
  528. package/dist/browser-auth-broker.d.ts +0 -20
  529. package/dist/chunk-AJ62T5QN.js.map +0 -1
  530. package/dist/connection-authority-owner.d.ts +0 -59
  531. package/dist/routes/connection-authorities.d.ts +0 -3
  532. package/dist/routes/environments.d.ts +0 -5
  533. package/dist/routes/host-mcp-bindings.d.ts +0 -5
  534. package/dist/routes/host-mcp-resolvers.d.ts +0 -3
  535. package/dist/routes/packs.d.ts +0 -3
  536. package/dist/session-event-view-MU3HMNV3.js +0 -264
  537. package/dist/session-event-view-MU3HMNV3.js.map +0 -1
  538. package/dist/xai-subscription-auth.d.ts +0 -23
  539. package/src/browser-auth-broker.ts +0 -155
  540. package/src/connection-authority-owner.ts +0 -61
  541. package/src/routes/connection-authorities.ts +0 -139
  542. package/src/routes/environments.ts +0 -388
  543. package/src/routes/host-mcp-bindings.ts +0 -122
  544. package/src/routes/host-mcp-resolvers.ts +0 -41
  545. package/src/routes/packs.ts +0 -784
  546. package/src/xai-subscription-auth.ts +0 -139
@@ -0,0 +1,528 @@
1
+ import "./chunk-OGQDXVXY.js";
2
+
3
+ // src/mcp/session-event-view.ts
4
+ import { z } from "zod";
5
+ import {
6
+ assistantMessagePhase
7
+ } from "@opengeni/contracts";
8
+ var SESSION_EVENT_VIEW_MAX_BYTES = 16 * 1024;
9
+ var SESSION_EVENT_NAMED_OUTPUT_MAX_CALLS = 3;
10
+ var directionSchema = z.enum(["before", "after"]);
11
+ var namedResumeSchema = z.object({
12
+ toolName: z.string().min(1).max(256),
13
+ includeArguments: z.boolean(),
14
+ limit: z.number().int().min(1).max(SESSION_EVENT_NAMED_OUTPUT_MAX_CALLS),
15
+ direction: directionSchema,
16
+ after: z.number().int().nonnegative(),
17
+ before: z.number().int().positive().nullable(),
18
+ more: z.boolean()
19
+ });
20
+ var selectionSchema = z.object({
21
+ sessionId: z.string().uuid(),
22
+ view: z.enum(["conversation", "results", "tools"]),
23
+ includeArguments: z.boolean(),
24
+ includeOutput: z.boolean(),
25
+ callId: z.string().max(512).refine(
26
+ (value) => Buffer.byteLength(JSON.stringify(value), "utf8") <= 2048,
27
+ "callId exceeds the encoded cursor budget"
28
+ ).nullable(),
29
+ toolName: z.string().min(1).max(256).refine(
30
+ (value) => Buffer.byteLength(JSON.stringify(value), "utf8") <= 512,
31
+ "toolName exceeds the encoded cursor budget"
32
+ ).nullable().default(null),
33
+ limit: z.number().int().min(1).max(50).optional(),
34
+ direction: directionSchema,
35
+ after: z.number().int().nonnegative(),
36
+ before: z.number().int().positive().nullable(),
37
+ named: namedResumeSchema.optional()
38
+ });
39
+ var cursorSchema = z.object({
40
+ v: z.union([z.literal(1), z.literal(2)]),
41
+ selection: selectionSchema,
42
+ sequence: z.number().int().positive().nullable(),
43
+ offset: z.number().int().nonnegative().max(2147483647)
44
+ });
45
+ var types = {
46
+ conversation: ["user.message", "agent.message.completed"],
47
+ // Final turn output is authoritative: do not repeat message.completed text.
48
+ results: ["turn.completed", "turn.failed", "goal.completed", "goal.paused", "tool.auth_needed"],
49
+ tools: ["agent.toolCall.created", "agent.toolCall.output"]
50
+ };
51
+ var record = (value) => value !== null && typeof value === "object" && !Array.isArray(value) ? value : {};
52
+ var bytes = (value) => Buffer.byteLength(JSON.stringify(value, null, 2), "utf8");
53
+ var encode = (selection, sequence = null, offset = 0, v = 2) => Buffer.from(JSON.stringify({ v, selection, sequence, offset })).toString("base64url");
54
+ var MAX_CURSOR_LENGTH = 4096;
55
+ var NAMED_OUTPUT_MIN_BUDGET = 2048;
56
+ var exampleCall = (args) => JSON.stringify(Object.fromEntries(Object.entries(args).filter(([, value]) => value != null)));
57
+ function recoverCursorPosition(cursor) {
58
+ const text = cursor.trimStart().startsWith("{") ? cursor : Buffer.from(cursor, "base64url").toString("utf8");
59
+ const pick = (pattern) => pattern.exec(text)?.[1];
60
+ const number = (pattern) => {
61
+ const value = pick(pattern);
62
+ return value === void 0 || value.length > 15 ? void 0 : Number(value);
63
+ };
64
+ const string = (key) => {
65
+ const value = pick(new RegExp(`"${key}"\\s*:\\s*"((?:[^"\\\\]|\\\\.){1,256})"`));
66
+ if (value === void 0) return void 0;
67
+ try {
68
+ return JSON.parse(`"${value}"`);
69
+ } catch {
70
+ return void 0;
71
+ }
72
+ };
73
+ const view = pick(/"view"\s*:\s*"(conversation|results|tools)"/);
74
+ const direction = pick(/"direction"\s*:\s*"(before|after)"/);
75
+ const sequence = number(/"seq[a-z]*"\s*:\s*(\d+)/i);
76
+ const after = number(/"after"\s*:\s*(\d+)/);
77
+ const before = number(/"before"\s*:\s*(\d+)/);
78
+ const limit = number(/"limit"\s*:\s*(\d+)/);
79
+ const resolvedDirection = direction ?? (before !== void 0 ? "before" : void 0);
80
+ const position = resolvedDirection === "after" ? sequence !== void 0 ? { after: Math.max(0, sequence - 1) } : after !== void 0 ? { after } : null : resolvedDirection === "before" ? sequence !== void 0 ? { before: sequence + 1 } : before !== void 0 ? { before } : null : null;
81
+ if (!position) return null;
82
+ return {
83
+ ...view ? { view } : {},
84
+ ...string("toolName") ? { toolName: string("toolName") } : {},
85
+ ...string("callId") ? { callId: string("callId") } : {},
86
+ .../"includeArguments"\s*:\s*true/.test(text) ? { includeArguments: true } : {},
87
+ .../"includeOutput"\s*:\s*true/.test(text) ? { includeOutput: true } : {},
88
+ direction: resolvedDirection,
89
+ ...position,
90
+ ...limit !== void 0 && limit >= 1 && limit <= 50 ? { limit } : {}
91
+ };
92
+ }
93
+ function invalidCursorError(input) {
94
+ const recovered = recoverCursorPosition(input.cursor ?? "");
95
+ const prefix = "Invalid session_events cursor: it was not issued by session_events or was altered when copied. Pass nextCursor byte-for-byte or not at all; never retype or build one.";
96
+ if (recovered) {
97
+ return new Error(
98
+ `${prefix} Its readable part names a position, so continue without a cursor: ${exampleCall({
99
+ sessionId: input.sessionId,
100
+ ...recovered
101
+ })} (check the position against the previous page's nextBefore/nextAfter).`
102
+ );
103
+ }
104
+ return new Error(
105
+ `${prefix} Continue without a cursor: repeat the previous call with the same view and selectors plus the last page's position, e.g. ${exampleCall(
106
+ {
107
+ sessionId: input.sessionId,
108
+ view: input.view,
109
+ direction: "before",
110
+ before: "<nextBefore>"
111
+ }
112
+ )} or ${exampleCall({ sessionId: input.sessionId, view: input.view, direction: "after", after: "<nextAfter>" })}.`
113
+ );
114
+ }
115
+ function resolveSessionEventView(input) {
116
+ let continuation = null;
117
+ if (input.cursor !== void 0) {
118
+ if (input.cursor.length > MAX_CURSOR_LENGTH)
119
+ throw new Error("session_events cursor exceeds 4096 characters");
120
+ try {
121
+ continuation = cursorSchema.parse(
122
+ JSON.parse(Buffer.from(input.cursor, "base64url").toString())
123
+ );
124
+ } catch {
125
+ throw invalidCursorError(input);
126
+ }
127
+ const previous = continuation.selection;
128
+ for (const key of [
129
+ "sessionId",
130
+ "view",
131
+ "includeArguments",
132
+ "includeOutput",
133
+ "callId",
134
+ "toolName",
135
+ "direction",
136
+ "after",
137
+ "before"
138
+ ]) {
139
+ if (input[key] !== void 0 && input[key] !== previous[key]) {
140
+ throw new Error(`session_events cursor cannot change ${key}`);
141
+ }
142
+ }
143
+ }
144
+ const selection = continuation?.selection ?? selectionSchema.parse({
145
+ sessionId: input.sessionId,
146
+ view: input.view ?? "conversation",
147
+ includeArguments: input.includeArguments ?? false,
148
+ includeOutput: input.includeOutput ?? false,
149
+ callId: input.callId ?? null,
150
+ toolName: input.toolName ?? null,
151
+ direction: input.direction ?? (input.before !== void 0 || input.after === void 0 ? "before" : "after"),
152
+ after: input.after ?? 0,
153
+ before: input.before ?? null
154
+ });
155
+ let notice;
156
+ if (selection.view !== "tools" && (selection.callId || selection.toolName || selection.includeArguments || selection.includeOutput)) {
157
+ if (!continuation && (selection.callId || selection.toolName)) {
158
+ notice = `view=${selection.view} does not return tool calls; this page is view=tools because callId/toolName select tool calls.`;
159
+ selection.view = "tools";
160
+ } else {
161
+ throw new Error(
162
+ `includeArguments/includeOutput only apply to view=tools. For a tool's result call ${exampleCall(
163
+ {
164
+ sessionId: selection.sessionId,
165
+ view: "tools",
166
+ toolName: "<exact tool name>",
167
+ includeOutput: true,
168
+ limit: 1
169
+ }
170
+ )}; view=${selection.view} already returns complete text, so drop them: ${exampleCall({
171
+ sessionId: selection.sessionId,
172
+ view: selection.view
173
+ })}.`
174
+ );
175
+ }
176
+ }
177
+ const namedOutputs = selection.toolName !== null && selection.includeOutput;
178
+ selection.limit = z.number().int().min(1).max(50).transform(
179
+ (value) => namedOutputs ? Math.min(value, SESSION_EVENT_NAMED_OUTPUT_MAX_CALLS) : value
180
+ ).parse(input.limit ?? selection.limit ?? (namedOutputs ? 1 : 10));
181
+ if (namedOutputs && continuation && continuation.sequence !== null)
182
+ throw new Error("Invalid session_events cursor position");
183
+ if (continuation && (continuation.sequence === null && continuation.offset !== 0 || continuation.sequence !== null && (continuation.sequence <= selection.after || selection.before !== null && continuation.sequence >= selection.before)))
184
+ throw new Error("Invalid session_events cursor position");
185
+ return { selection, continuation, notice };
186
+ }
187
+ function project(event, selection) {
188
+ if (event.duplicateOfEventId || event.turnAssociation && event.turnAssociation !== "current")
189
+ return null;
190
+ const p = record(event.payload);
191
+ const base = { sequence: event.sequence, ...event.turnId ? { turnId: event.turnId } : {} };
192
+ if (selection.view === "conversation") {
193
+ const phase = event.type === "agent.message.completed" ? assistantMessagePhase(p) : null;
194
+ return typeof p.text === "string" && p.text.length > 0 ? {
195
+ ...base,
196
+ role: event.type === "user.message" ? "user" : "assistant",
197
+ ...phase ? { phase } : {},
198
+ text: p.text
199
+ } : null;
200
+ }
201
+ if (selection.view === "results") {
202
+ if (event.type === "turn.completed" && ("maintenance" in p || "segmentLimit" in p)) return null;
203
+ const value2 = event.type === "turn.completed" ? p.output ?? p.result : p;
204
+ if (value2 === void 0 || value2 === "") return null;
205
+ return {
206
+ ...base,
207
+ type: event.type,
208
+ text: typeof value2 === "string" ? value2 : JSON.stringify(value2)
209
+ };
210
+ }
211
+ if (selection.toolName && (event.type !== "agent.toolCall.created" || p.name !== selection.toolName))
212
+ return null;
213
+ const callId = p.callId ?? p.call_id ?? p.id;
214
+ if (selection.callId !== null && selection.callId !== callId) return null;
215
+ const output = event.type === "agent.toolCall.output";
216
+ const value = output ? p.output : p.arguments ?? p.args;
217
+ return {
218
+ ...base,
219
+ callId,
220
+ kind: output ? "result" : "call",
221
+ ...typeof p.name === "string" ? { name: p.name } : {},
222
+ ...p.identityOmitted === true ? { identityOmitted: true } : {},
223
+ ...p.isError === true || record(value).isError === true ? { isError: true } : {},
224
+ ...(output ? selection.includeOutput : selection.includeArguments) && value !== void 0 ? {
225
+ text: typeof value === "string" ? value : JSON.stringify(value),
226
+ encoding: typeof value === "string" ? "text" : "json"
227
+ } : {}
228
+ };
229
+ }
230
+ async function readSessionEventView(input, read) {
231
+ const { selection, continuation, notice } = resolveSessionEventView(input);
232
+ const scanned = selection.toolName !== null && selection.includeOutput ? await readNamedCallOutputs(selection, read) : await scanSessionEventView(selection, continuation, read);
233
+ const page = selection.named ? returnToNamedStream(scanned, selection) : scanned;
234
+ return notice === void 0 ? page : { ...page, notice };
235
+ }
236
+ var incompleteFragment = (item) => record(item.fragment).complete === false;
237
+ var namedSelection = (selection, named) => ({
238
+ sessionId: selection.sessionId,
239
+ view: "tools",
240
+ includeArguments: named.includeArguments,
241
+ includeOutput: true,
242
+ callId: null,
243
+ toolName: named.toolName,
244
+ limit: named.limit,
245
+ direction: named.direction,
246
+ after: named.after,
247
+ before: named.before
248
+ });
249
+ function returnToNamedStream(page, selection) {
250
+ const named = selection.named;
251
+ const position = {
252
+ view: "tools",
253
+ effectiveLimit: named.limit,
254
+ direction: named.direction,
255
+ nextAfter: named.direction === "after" ? named.after : null,
256
+ nextBefore: named.direction === "before" ? named.before : null
257
+ };
258
+ if (page.events.some(incompleteFragment)) return { ...page, ...position };
259
+ return {
260
+ ...page,
261
+ ...position,
262
+ hasMore: named.more,
263
+ nextCursor: named.more ? encode(namedSelection(selection, named)) : null
264
+ };
265
+ }
266
+ function withNamedResume(cursor, named, limit) {
267
+ const decoded = cursorSchema.parse(JSON.parse(Buffer.from(cursor, "base64url").toString()));
268
+ const encoded = encode(
269
+ { ...decoded.selection, ...limit === void 0 ? {} : { limit }, named },
270
+ decoded.sequence,
271
+ decoded.offset,
272
+ decoded.v
273
+ );
274
+ return encoded.length <= MAX_CURSOR_LENGTH ? encoded : null;
275
+ }
276
+ async function readNamedCallOutputs(selection, read) {
277
+ const calls = await scanSessionEventView({ ...selection, includeOutput: false }, null, read);
278
+ const ordered = selection.direction === "before" ? [...calls.events].reverse() : calls.events;
279
+ const events = [];
280
+ let sourceLoss = calls.sourceLoss;
281
+ let stop = null;
282
+ const envelope = (items) => bytes({ ...calls, events: items, nextCursor: null });
283
+ const empty = envelope([]);
284
+ const resumePast = (sequence, more) => ({
285
+ toolName: selection.toolName,
286
+ includeArguments: selection.includeArguments,
287
+ limit: selection.limit,
288
+ direction: selection.direction,
289
+ after: selection.direction === "after" ? sequence : selection.after,
290
+ before: selection.direction === "before" ? sequence : selection.before,
291
+ more
292
+ });
293
+ const pastCall = (call) => selection.direction === "before" ? call.sequence - 1 : call.sequence + 1;
294
+ for (const [index, call] of ordered.entries()) {
295
+ const later = index + 1 < ordered.length || calls.hasMore;
296
+ const lookup = selectionSchema.safeParse({
297
+ sessionId: selection.sessionId,
298
+ view: "tools",
299
+ includeArguments: false,
300
+ includeOutput: true,
301
+ callId: typeof call.callId === "string" ? call.callId : null,
302
+ toolName: null,
303
+ limit: 1,
304
+ direction: "after",
305
+ after: call.sequence,
306
+ before: null
307
+ });
308
+ const readOutput = lookup.success && lookup.data.callId !== null ? { readOutput: { view: "tools", callId: lookup.data.callId, includeOutput: true } } : {};
309
+ if (incompleteFragment(call)) {
310
+ if (index > 0) {
311
+ stop = { position: call.sequence, cursor: null };
312
+ break;
313
+ }
314
+ events.push({ ...call, ...readOutput });
315
+ stop = {
316
+ position: pastCall(call),
317
+ cursor: withNamedResume(calls.nextCursor, resumePast(call.sequence, true), 1) ?? calls.nextCursor
318
+ };
319
+ break;
320
+ }
321
+ if (!lookup.success || lookup.data.callId === null) {
322
+ events.push({
323
+ ...call,
324
+ outputUnavailable: call.identityOmitted === true || typeof call.callId !== "string" ? "call_identity_omitted" : "call_id_exceeds_lookup_budget"
325
+ });
326
+ continue;
327
+ }
328
+ const used = envelope([...events, call]) - empty;
329
+ const { text: _arguments, ...identity } = call;
330
+ if (SESSION_EVENT_VIEW_MAX_BYTES - 6e3 - used < NAMED_OUTPUT_MIN_BUDGET + bytes(identity)) {
331
+ if (index > 0) {
332
+ stop = { position: call.sequence, cursor: null };
333
+ break;
334
+ }
335
+ events.push({ ...call, ...readOutput });
336
+ stop = { position: pastCall(call), cursor: null };
337
+ break;
338
+ }
339
+ const output = await scanSessionEventView(lookup.data, null, read, used);
340
+ sourceLoss ??= output.sourceLoss;
341
+ const result = output.events.find((item) => item.kind === "result");
342
+ if (!result) {
343
+ events.push({ ...call, outputFound: false, ...output.hasMore ? readOutput : {} });
344
+ continue;
345
+ }
346
+ if (incompleteFragment(result)) {
347
+ if (index > 0) {
348
+ stop = { position: call.sequence, cursor: null };
349
+ break;
350
+ }
351
+ const cursor = withNamedResume(output.nextCursor, resumePast(call.sequence, later));
352
+ events.push(...cursor ? [call, result] : [{ ...call, ...readOutput }]);
353
+ stop = { position: pastCall(call), cursor };
354
+ break;
355
+ }
356
+ events.push(call, result);
357
+ }
358
+ events.sort((a, b) => a.sequence - b.sequence);
359
+ const position = stop ? selection.direction === "before" ? { after: selection.after, before: stop.position + 1 } : { after: Math.max(0, stop.position - 1), before: selection.before } : selection.direction === "before" ? { after: selection.after, before: calls.nextBefore } : { after: calls.nextAfter ?? selection.after, before: selection.before };
360
+ const hasMore = stop !== null || calls.hasMore;
361
+ const { sourceLoss: _callsLoss, ...base } = calls;
362
+ return {
363
+ ...base,
364
+ events,
365
+ nextAfter: selection.direction === "after" ? position.after : null,
366
+ nextBefore: selection.direction === "before" ? position.before : null,
367
+ hasMore,
368
+ nextCursor: stop?.cursor ?? (hasMore ? encode({ ...selection, ...position }) : null),
369
+ sourceExact: sourceLoss === void 0,
370
+ ...sourceLoss ? { sourceLoss } : {}
371
+ };
372
+ }
373
+ async function scanSessionEventView(selection, continuation, read, reservedBytes = 0) {
374
+ const limit = selection.limit;
375
+ let after = continuation?.sequence && selection.direction === "after" ? continuation.sequence - 1 : selection.after;
376
+ let before = continuation?.sequence && selection.direction === "before" ? continuation.sequence + 1 : selection.before;
377
+ const events = [];
378
+ let hasMore = false;
379
+ let nextCursor = null;
380
+ let sourceExact = true;
381
+ let edge = null;
382
+ let legacyActive = continuation?.v === 1 && continuation.sequence !== null;
383
+ const page = () => ({
384
+ view: selection.view,
385
+ effectiveLimit: limit,
386
+ direction: selection.direction,
387
+ events,
388
+ nextAfter: selection.direction === "after" ? edge ?? selection.after : null,
389
+ nextBefore: selection.direction === "before" ? edge ?? selection.before : null,
390
+ hasMore,
391
+ nextCursor,
392
+ sourceExact,
393
+ ...!sourceExact ? {
394
+ sourceLoss: {
395
+ reason: "structured_value_exceeds_budget",
396
+ completeTextAvailable: false,
397
+ message: "An oversized structured value was omitted. Scalar text remains retrievable through continuation; omitted structured values are not complete JSON results."
398
+ }
399
+ } : {},
400
+ maxBytes: SESSION_EVENT_VIEW_MAX_BYTES
401
+ });
402
+ const resume = (sequence, offset = 0) => {
403
+ hasMore = true;
404
+ nextCursor = encode(
405
+ { ...selection, after, before },
406
+ sequence,
407
+ offset,
408
+ legacyActive && sequence === continuation?.sequence ? 1 : 2
409
+ );
410
+ };
411
+ for (let scan = 0; scan < 64; scan += 1) {
412
+ const source = await read({
413
+ after,
414
+ ...before === null ? {} : { before },
415
+ direction: selection.direction,
416
+ limit: 8,
417
+ includeTypes: selection.toolName ? ["agent.toolCall.created"] : types[selection.view],
418
+ ...selection.toolName ? { toolName: selection.toolName } : {},
419
+ ...selection.callId ? { callId: selection.callId } : {},
420
+ payloadMode: "full",
421
+ excludeUnclaimedHumanPrompts: true,
422
+ maxBytes: 1024 * 1024,
423
+ legacyUtf16: legacyActive,
424
+ view: selection.view,
425
+ includeArguments: selection.includeArguments,
426
+ includeOutput: selection.includeOutput,
427
+ ...continuation?.sequence ? { sourceSequence: continuation.sequence, sourceOffset: continuation.offset } : {}
428
+ });
429
+ sourceExact &&= source.fullPayloadsExact;
430
+ const ordered = selection.direction === "before" ? [...source.events].reverse() : source.events;
431
+ for (const event of ordered) {
432
+ const slice = source.slices?.[event.sequence];
433
+ const item = project(event, selection);
434
+ if (item) {
435
+ const offset = continuation?.sequence === event.sequence ? continuation.offset : 0;
436
+ if (slice?.omitted) {
437
+ delete item.text;
438
+ item.sourceOmitted = { reason: "structured_value_exceeds_budget", complete: false };
439
+ }
440
+ const advance = (text) => slice?.unit === "codepoint" ? Array.from(text).length : text.length;
441
+ if (!slice && offset > (item.text?.length ?? 0))
442
+ throw new Error("Invalid message continuation offset");
443
+ if (!slice && offset > 0 && item.text && /[\uD800-\uDBFF]/.test(item.text[offset - 1]) && /[\uDC00-\uDFFF]/.test(item.text[offset] ?? "")) {
444
+ throw new Error("Invalid message continuation offset: splits a surrogate pair");
445
+ }
446
+ if (!slice && offset > 0 && item.text) item.text = item.text.slice(offset);
447
+ events.push(item);
448
+ if (bytes(page()) > SESSION_EVENT_VIEW_MAX_BYTES - 4096 - reservedBytes) {
449
+ events.pop();
450
+ if (events.length > 0) {
451
+ resume(event.sequence, offset);
452
+ if (selection.direction === "before") events.reverse();
453
+ return page();
454
+ }
455
+ if (!item.text) throw new Error("Session event identity exceeds page budget");
456
+ const text = item.text;
457
+ let low = 0;
458
+ let high = text.length;
459
+ while (low < high) {
460
+ const mid = Math.ceil((low + high) / 2);
461
+ if (bytes({ ...item, text: text.slice(0, mid) }) <= SESSION_EVENT_VIEW_MAX_BYTES - 6e3 - reservedBytes)
462
+ low = mid;
463
+ else high = mid - 1;
464
+ }
465
+ if (low > 0 && /[\uD800-\uDBFF]/.test(text[low - 1])) low -= 1;
466
+ if (low === 0) throw new Error("Session event identity exceeds page budget");
467
+ events.push({
468
+ ...item,
469
+ text: text.slice(0, low),
470
+ fragment: {
471
+ offset,
472
+ nextOffset: offset + advance(text.slice(0, low)),
473
+ complete: false,
474
+ unit: slice?.unit ?? "utf16"
475
+ }
476
+ });
477
+ resume(event.sequence, offset + advance(text.slice(0, low)));
478
+ return page();
479
+ }
480
+ const nextOffset = offset + advance(item.text ?? "");
481
+ if (slice && !slice.omitted && nextOffset < slice.total) {
482
+ item.fragment = { offset, nextOffset, complete: false, unit: slice.unit };
483
+ resume(event.sequence, nextOffset);
484
+ if (selection.direction === "before") events.reverse();
485
+ return page();
486
+ }
487
+ if (offset > 0)
488
+ item.fragment = {
489
+ offset,
490
+ nextOffset,
491
+ complete: true,
492
+ unit: slice?.unit ?? "utf16"
493
+ };
494
+ }
495
+ edge = event.sequence;
496
+ legacyActive = false;
497
+ if (selection.direction === "after") after = event.sequence;
498
+ else before = event.sequence;
499
+ if (events.length >= limit) {
500
+ hasMore = source.hasMore || event !== ordered.at(-1);
501
+ nextCursor = hasMore ? encode({ ...selection, after, before }) : null;
502
+ if (selection.direction === "before") events.reverse();
503
+ return page();
504
+ }
505
+ }
506
+ if (source.coveredSequence) {
507
+ if (selection.direction === "after") after = Math.max(after, source.coveredSequence.last);
508
+ else before = Math.min(before ?? Infinity, source.coveredSequence.first);
509
+ }
510
+ if (!source.hasMore) {
511
+ hasMore = false;
512
+ nextCursor = null;
513
+ if (selection.direction === "before") events.reverse();
514
+ return page();
515
+ }
516
+ hasMore = true;
517
+ nextCursor = encode({ ...selection, after, before });
518
+ }
519
+ if (selection.direction === "before") events.reverse();
520
+ return page();
521
+ }
522
+ export {
523
+ SESSION_EVENT_NAMED_OUTPUT_MAX_CALLS,
524
+ SESSION_EVENT_VIEW_MAX_BYTES,
525
+ readSessionEventView,
526
+ resolveSessionEventView
527
+ };
528
+ //# sourceMappingURL=session-event-view-36GO3IL7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/mcp/session-event-view.ts"],"sourcesContent":["import { z } from \"zod\";\nimport {\n assistantMessagePhase,\n type SessionEvent,\n type SessionEventType,\n} from \"@opengeni/contracts\";\nimport type {\n SessionEventSliceOptions,\n SessionEventSlicePage,\n} from \"@opengeni/db/session-event-slices\";\n\nexport const SESSION_EVENT_VIEW_MAX_BYTES = 16 * 1024;\n/**\n * toolName with includeOutput reads each named call's result through the exact\n * callId path, so one page carries at most this many call/result pairs inside\n * the same 16 KiB envelope. An omitted limit means the newest (or oldest) one.\n */\nexport const SESSION_EVENT_NAMED_OUTPUT_MAX_CALLS = 3;\nconst directionSchema = z.enum([\"before\", \"after\"]);\n// A fragment continuation issued by a named-output page carries the named\n// stream's next position, so finishing the fragment returns to that stream.\nconst namedResumeSchema = z.object({\n toolName: z.string().min(1).max(256),\n includeArguments: z.boolean(),\n limit: z.number().int().min(1).max(SESSION_EVENT_NAMED_OUTPUT_MAX_CALLS),\n direction: directionSchema,\n after: z.number().int().nonnegative(),\n before: z.number().int().positive().nullable(),\n more: z.boolean(),\n});\nconst selectionSchema = z.object({\n sessionId: z.string().uuid(),\n view: z.enum([\"conversation\", \"results\", \"tools\"]),\n includeArguments: z.boolean(),\n includeOutput: z.boolean(),\n callId: z\n .string()\n .max(512)\n .refine(\n (value) => Buffer.byteLength(JSON.stringify(value), \"utf8\") <= 2048,\n \"callId exceeds the encoded cursor budget\",\n )\n .nullable(),\n toolName: z\n .string()\n .min(1)\n .max(256)\n .refine(\n (value) => Buffer.byteLength(JSON.stringify(value), \"utf8\") <= 512,\n \"toolName exceeds the encoded cursor budget\",\n )\n .nullable()\n .default(null),\n limit: z.number().int().min(1).max(50).optional(),\n direction: directionSchema,\n after: z.number().int().nonnegative(),\n before: z.number().int().positive().nullable(),\n named: namedResumeSchema.optional(),\n});\nconst cursorSchema = z.object({\n v: z.union([z.literal(1), z.literal(2)]),\n selection: selectionSchema,\n sequence: z.number().int().positive().nullable(),\n offset: z.number().int().nonnegative().max(2_147_483_647),\n});\ntype Selection = z.infer<typeof selectionSchema>;\nexport type SessionEventViewInput = {\n sessionId: string;\n view?: Selection[\"view\"] | undefined;\n after?: number | undefined;\n before?: number | undefined;\n direction?: Selection[\"direction\"] | undefined;\n limit?: number | undefined;\n cursor?: string | undefined;\n callId?: string | undefined;\n toolName?: string | undefined;\n includeArguments?: boolean | undefined;\n includeOutput?: boolean | undefined;\n};\ntype Item = { sequence: number; turnId?: string; role?: string; text?: string } & Record<\n string,\n unknown\n>;\ntype ReadPage = (options: SessionEventSliceOptions) => Promise<SessionEventSlicePage>;\nconst types: Record<Selection[\"view\"], SessionEventType[]> = {\n conversation: [\"user.message\", \"agent.message.completed\"],\n // Final turn output is authoritative: do not repeat message.completed text.\n results: [\"turn.completed\", \"turn.failed\", \"goal.completed\", \"goal.paused\", \"tool.auth_needed\"],\n tools: [\"agent.toolCall.created\", \"agent.toolCall.output\"],\n};\nconst record = (value: unknown): Record<string, unknown> =>\n value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\nconst bytes = (value: unknown) => Buffer.byteLength(JSON.stringify(value, null, 2), \"utf8\");\nconst encode = (selection: Selection, sequence: number | null = null, offset = 0, v = 2) =>\n Buffer.from(JSON.stringify({ v, selection, sequence, offset })).toString(\"base64url\");\n\nconst MAX_CURSOR_LENGTH = 4096;\n// Below this many bytes an output read could not return a useful fragment.\nconst NAMED_OUTPUT_MIN_BUDGET = 2048;\n\nconst exampleCall = (args: Record<string, unknown>) =>\n JSON.stringify(Object.fromEntries(Object.entries(args).filter(([, value]) => value != null)));\n\n/**\n * Agents sometimes retype the opaque cursor and corrupt it. Read whatever\n * position survives in the readable part so the refusal can name the exact\n * cursor-free call. Recovered values are advice, never a continuation.\n */\nfunction recoverCursorPosition(cursor: string): Record<string, unknown> | null {\n const text = cursor.trimStart().startsWith(\"{\")\n ? cursor\n : Buffer.from(cursor, \"base64url\").toString(\"utf8\");\n const pick = (pattern: RegExp) => pattern.exec(text)?.[1];\n const number = (pattern: RegExp) => {\n const value = pick(pattern);\n return value === undefined || value.length > 15 ? undefined : Number(value);\n };\n const string = (key: string) => {\n const value = pick(new RegExp(`\"${key}\"\\\\s*:\\\\s*\"((?:[^\"\\\\\\\\]|\\\\\\\\.){1,256})\"`));\n if (value === undefined) return undefined;\n try {\n return JSON.parse(`\"${value}\"`) as string;\n } catch {\n return undefined;\n }\n };\n const view = pick(/\"view\"\\s*:\\s*\"(conversation|results|tools)\"/);\n const direction = pick(/\"direction\"\\s*:\\s*\"(before|after)\"/) as\n | Selection[\"direction\"]\n | undefined;\n const sequence = number(/\"seq[a-z]*\"\\s*:\\s*(\\d+)/i);\n const after = number(/\"after\"\\s*:\\s*(\\d+)/);\n const before = number(/\"before\"\\s*:\\s*(\\d+)/);\n const limit = number(/\"limit\"\\s*:\\s*(\\d+)/);\n const resolvedDirection = direction ?? (before !== undefined ? \"before\" : undefined);\n const position =\n resolvedDirection === \"after\"\n ? sequence !== undefined\n ? { after: Math.max(0, sequence - 1) }\n : after !== undefined\n ? { after }\n : null\n : resolvedDirection === \"before\"\n ? sequence !== undefined\n ? { before: sequence + 1 }\n : before !== undefined\n ? { before }\n : null\n : null;\n if (!position) return null;\n return {\n ...(view ? { view } : {}),\n ...(string(\"toolName\") ? { toolName: string(\"toolName\") } : {}),\n ...(string(\"callId\") ? { callId: string(\"callId\") } : {}),\n ...(/\"includeArguments\"\\s*:\\s*true/.test(text) ? { includeArguments: true } : {}),\n ...(/\"includeOutput\"\\s*:\\s*true/.test(text) ? { includeOutput: true } : {}),\n direction: resolvedDirection,\n ...position,\n ...(limit !== undefined && limit >= 1 && limit <= 50 ? { limit } : {}),\n };\n}\n\nfunction invalidCursorError(input: SessionEventViewInput): Error {\n const recovered = recoverCursorPosition(input.cursor ?? \"\");\n const prefix =\n \"Invalid session_events cursor: it was not issued by session_events or was altered when copied. Pass nextCursor byte-for-byte or not at all; never retype or build one.\";\n if (recovered) {\n return new Error(\n `${prefix} Its readable part names a position, so continue without a cursor: ${exampleCall({\n sessionId: input.sessionId,\n ...recovered,\n })} (check the position against the previous page's nextBefore/nextAfter).`,\n );\n }\n return new Error(\n `${prefix} Continue without a cursor: repeat the previous call with the same view and selectors plus the last page's position, e.g. ${exampleCall(\n {\n sessionId: input.sessionId,\n view: input.view,\n direction: \"before\",\n before: \"<nextBefore>\",\n },\n )} or ${exampleCall({ sessionId: input.sessionId, view: input.view, direction: \"after\", after: \"<nextAfter>\" })}.`,\n );\n}\n\n/** A cursor is a bounded selector, never authority. The caller reauthorizes every read. */\nexport function resolveSessionEventView(input: SessionEventViewInput) {\n let continuation: z.infer<typeof cursorSchema> | null = null;\n if (input.cursor !== undefined) {\n if (input.cursor.length > MAX_CURSOR_LENGTH)\n throw new Error(\"session_events cursor exceeds 4096 characters\");\n try {\n continuation = cursorSchema.parse(\n JSON.parse(Buffer.from(input.cursor, \"base64url\").toString()),\n );\n } catch {\n throw invalidCursorError(input);\n }\n const previous = continuation.selection;\n for (const key of [\n \"sessionId\",\n \"view\",\n \"includeArguments\",\n \"includeOutput\",\n \"callId\",\n \"toolName\",\n \"direction\",\n \"after\",\n \"before\",\n ] as const) {\n if (input[key] !== undefined && input[key] !== previous[key]) {\n throw new Error(`session_events cursor cannot change ${key}`);\n }\n }\n }\n const selection =\n continuation?.selection ??\n selectionSchema.parse({\n sessionId: input.sessionId,\n view: input.view ?? \"conversation\",\n includeArguments: input.includeArguments ?? false,\n includeOutput: input.includeOutput ?? false,\n callId: input.callId ?? null,\n toolName: input.toolName ?? null,\n direction:\n input.direction ??\n (input.before !== undefined || input.after === undefined ? \"before\" : \"after\"),\n after: input.after ?? 0,\n before: input.before ?? null,\n });\n let notice: string | undefined;\n if (\n selection.view !== \"tools\" &&\n (selection.callId ||\n selection.toolName ||\n selection.includeArguments ||\n selection.includeOutput)\n ) {\n // callId and toolName name tool calls, which only view=tools returns, so\n // the intent is unambiguous: read them there and say so.\n if (!continuation && (selection.callId || selection.toolName)) {\n notice = `view=${selection.view} does not return tool calls; this page is view=tools because callId/toolName select tool calls.`;\n selection.view = \"tools\";\n } else {\n throw new Error(\n `includeArguments/includeOutput only apply to view=tools. For a tool's result call ${exampleCall(\n {\n sessionId: selection.sessionId,\n view: \"tools\",\n toolName: \"<exact tool name>\",\n includeOutput: true,\n limit: 1,\n },\n )}; view=${selection.view} already returns complete text, so drop them: ${exampleCall({\n sessionId: selection.sessionId,\n view: selection.view,\n })}.`,\n );\n }\n }\n const namedOutputs = selection.toolName !== null && selection.includeOutput;\n // Named outputs read one exact result per call, so the page size is the\n // number of calls and is clamped rather than refused; effectiveLimit and\n // nextCursor report the clamp.\n selection.limit = z\n .number()\n .int()\n .min(1)\n .max(50)\n .transform((value) =>\n namedOutputs ? Math.min(value, SESSION_EVENT_NAMED_OUTPUT_MAX_CALLS) : value,\n )\n .parse(input.limit ?? selection.limit ?? (namedOutputs ? 1 : 10));\n if (namedOutputs && continuation && continuation.sequence !== null)\n throw new Error(\"Invalid session_events cursor position\");\n if (\n continuation &&\n ((continuation.sequence === null && continuation.offset !== 0) ||\n (continuation.sequence !== null &&\n (continuation.sequence <= selection.after ||\n (selection.before !== null && continuation.sequence >= selection.before))))\n )\n throw new Error(\"Invalid session_events cursor position\");\n return { selection, continuation, notice };\n}\n\nfunction project(event: SessionEvent, selection: Selection): Item | null {\n if (event.duplicateOfEventId || (event.turnAssociation && event.turnAssociation !== \"current\"))\n return null;\n const p = record(event.payload);\n const base = { sequence: event.sequence, ...(event.turnId ? { turnId: event.turnId } : {}) };\n if (selection.view === \"conversation\") {\n // Commentary stays in the conversation, labelled so a reader can tell a\n // progress note from an answer.\n const phase = event.type === \"agent.message.completed\" ? assistantMessagePhase(p) : null;\n return typeof p.text === \"string\" && p.text.length > 0\n ? {\n ...base,\n role: event.type === \"user.message\" ? \"user\" : \"assistant\",\n ...(phase ? { phase } : {}),\n text: p.text,\n }\n : null;\n }\n if (selection.view === \"results\") {\n if (event.type === \"turn.completed\" && (\"maintenance\" in p || \"segmentLimit\" in p)) return null;\n const value = event.type === \"turn.completed\" ? (p.output ?? p.result) : p;\n if (value === undefined || value === \"\") return null;\n return {\n ...base,\n type: event.type,\n text: typeof value === \"string\" ? value : JSON.stringify(value),\n };\n }\n if (\n selection.toolName &&\n (event.type !== \"agent.toolCall.created\" || p.name !== selection.toolName)\n )\n return null;\n const callId = p.callId ?? p.call_id ?? p.id;\n if (selection.callId !== null && selection.callId !== callId) return null;\n const output = event.type === \"agent.toolCall.output\";\n // Choose one canonical slot. Never ship the raw receipt beside its parsed copy.\n const value = output ? p.output : (p.arguments ?? p.args);\n return {\n ...base,\n callId,\n kind: output ? \"result\" : \"call\",\n ...(typeof p.name === \"string\" ? { name: p.name } : {}),\n ...(p.identityOmitted === true ? { identityOmitted: true } : {}),\n ...(p.isError === true || record(value).isError === true ? { isError: true } : {}),\n ...((output ? selection.includeOutput : selection.includeArguments) && value !== undefined\n ? {\n text: typeof value === \"string\" ? value : JSON.stringify(value),\n encoding: typeof value === \"string\" ? \"text\" : \"json\",\n }\n : {}),\n };\n}\n\n/** Read-only projection over the existing RLS/audit query. No command observations. */\nexport async function readSessionEventView(input: SessionEventViewInput, read: ReadPage) {\n const { selection, continuation, notice } = resolveSessionEventView(input);\n const scanned =\n selection.toolName !== null && selection.includeOutput\n ? await readNamedCallOutputs(selection, read)\n : await scanSessionEventView(selection, continuation, read);\n const page = selection.named ? returnToNamedStream(scanned, selection) : scanned;\n return notice === undefined ? page : { ...page, notice };\n}\n\ntype Continuation = ReturnType<typeof resolveSessionEventView>[\"continuation\"];\ntype ViewPage = Awaited<ReturnType<typeof scanSessionEventView>>;\ntype NamedResume = z.infer<typeof namedResumeSchema>;\n// An omitted structured value is final; only a text fragment continues.\nconst incompleteFragment = (item: Item) => record(item.fragment).complete === false;\n\nconst namedSelection = (selection: Selection, named: NamedResume): Selection => ({\n sessionId: selection.sessionId,\n view: \"tools\",\n includeArguments: named.includeArguments,\n includeOutput: true,\n callId: null,\n toolName: named.toolName,\n limit: named.limit,\n direction: named.direction,\n after: named.after,\n before: named.before,\n});\n\n/**\n * A fragment continuation issued by a named-output page reports the named\n * stream's position, and once the fragment is complete its nextCursor returns\n * to that stream instead of ending the read.\n */\nfunction returnToNamedStream(page: ViewPage, selection: Selection): ViewPage {\n const named = selection.named!;\n const position = {\n view: \"tools\" as const,\n effectiveLimit: named.limit,\n direction: named.direction,\n nextAfter: named.direction === \"after\" ? named.after : null,\n nextBefore: named.direction === \"before\" ? named.before : null,\n };\n if (page.events.some(incompleteFragment)) return { ...page, ...position };\n return {\n ...page,\n ...position,\n hasMore: named.more,\n nextCursor: named.more ? encode(namedSelection(selection, named)) : null,\n };\n}\n\n/** Re-issue a fragment cursor so it carries the named stream it came from. */\nfunction withNamedResume(cursor: string, named: NamedResume, limit?: number): string | null {\n const decoded = cursorSchema.parse(JSON.parse(Buffer.from(cursor, \"base64url\").toString()));\n const encoded = encode(\n { ...decoded.selection, ...(limit === undefined ? {} : { limit }), named },\n decoded.sequence,\n decoded.offset,\n decoded.v,\n );\n return encoded.length <= MAX_CURSOR_LENGTH ? encoded : null;\n}\n\n/**\n * toolName plus includeOutput: list the named calls, then read each call's\n * result through the exact callId path. One call whose arguments or result do\n * not fit keeps that path's lossless fragment continuation, which returns to\n * the named stream when complete; later calls resume from a positional cursor\n * instead of being dropped.\n */\nasync function readNamedCallOutputs(selection: Selection, read: ReadPage): Promise<ViewPage> {\n const calls = await scanSessionEventView({ ...selection, includeOutput: false }, null, read);\n const ordered = selection.direction === \"before\" ? [...calls.events].reverse() : calls.events;\n const events: Item[] = [];\n let sourceLoss = calls.sourceLoss;\n let stop: { position: number; cursor: string | null } | null = null;\n const envelope = (items: Item[]) => bytes({ ...calls, events: items, nextCursor: null });\n const empty = envelope([]);\n // The named stream continues past `sequence`, the call just returned.\n const resumePast = (sequence: number, more: boolean): NamedResume => ({\n toolName: selection.toolName!,\n includeArguments: selection.includeArguments,\n limit: selection.limit!,\n direction: selection.direction,\n after: selection.direction === \"after\" ? sequence : selection.after,\n before: selection.direction === \"before\" ? sequence : selection.before,\n more,\n });\n // stop.position is the first named call not yet returned (inclusive).\n const pastCall = (call: Item) =>\n selection.direction === \"before\" ? call.sequence - 1 : call.sequence + 1;\n for (const [index, call] of ordered.entries()) {\n const later = index + 1 < ordered.length || calls.hasMore;\n const lookup = selectionSchema.safeParse({\n sessionId: selection.sessionId,\n view: \"tools\",\n includeArguments: false,\n includeOutput: true,\n callId: typeof call.callId === \"string\" ? call.callId : null,\n toolName: null,\n limit: 1,\n direction: \"after\",\n after: call.sequence,\n before: null,\n });\n const readOutput =\n lookup.success && lookup.data.callId !== null\n ? { readOutput: { view: \"tools\", callId: lookup.data.callId, includeOutput: true } }\n : {};\n if (incompleteFragment(call)) {\n if (index > 0) {\n stop = { position: call.sequence, cursor: null };\n break;\n }\n // Arguments larger than a page continue losslessly one call at a time\n // and then return to the named stream; the result is one exact read.\n events.push({ ...call, ...readOutput });\n stop = {\n position: pastCall(call),\n cursor:\n withNamedResume(calls.nextCursor!, resumePast(call.sequence, true), 1) ??\n calls.nextCursor,\n };\n break;\n }\n if (!lookup.success || lookup.data.callId === null) {\n events.push({\n ...call,\n outputUnavailable:\n call.identityOmitted === true || typeof call.callId !== \"string\"\n ? \"call_identity_omitted\"\n : \"call_id_exceeds_lookup_budget\",\n });\n continue;\n }\n const used = envelope([...events, call]) - empty;\n // The result repeats the call's identity, so budget for it plus some text.\n const { text: _arguments, ...identity } = call;\n if (SESSION_EVENT_VIEW_MAX_BYTES - 6000 - used < NAMED_OUTPUT_MIN_BUDGET + bytes(identity)) {\n if (index > 0) {\n stop = { position: call.sequence, cursor: null };\n break;\n }\n // Huge arguments leave no room: return the call and name the exact read.\n events.push({ ...call, ...readOutput });\n stop = { position: pastCall(call), cursor: null };\n break;\n }\n const output = await scanSessionEventView(lookup.data, null, read, used);\n sourceLoss ??= output.sourceLoss;\n const result = output.events.find((item) => item.kind === \"result\");\n if (!result) {\n events.push({ ...call, outputFound: false, ...(output.hasMore ? readOutput : {}) });\n continue;\n }\n if (incompleteFragment(result)) {\n if (index > 0) {\n stop = { position: call.sequence, cursor: null };\n break;\n }\n // The rest of this result continues through its exact callId cursor,\n // which returns to the named stream when the result is complete.\n const cursor = withNamedResume(output.nextCursor!, resumePast(call.sequence, later));\n events.push(...(cursor ? [call, result] : [{ ...call, ...readOutput }]));\n stop = { position: pastCall(call), cursor };\n break;\n }\n events.push(call, result);\n }\n events.sort((a, b) => a.sequence - b.sequence);\n const position = stop\n ? selection.direction === \"before\"\n ? { after: selection.after, before: stop.position + 1 }\n : { after: Math.max(0, stop.position - 1), before: selection.before }\n : selection.direction === \"before\"\n ? { after: selection.after, before: calls.nextBefore }\n : { after: calls.nextAfter ?? selection.after, before: selection.before };\n const hasMore = stop !== null || calls.hasMore;\n const { sourceLoss: _callsLoss, ...base } = calls;\n return {\n ...base,\n events,\n nextAfter: selection.direction === \"after\" ? position.after : null,\n nextBefore: selection.direction === \"before\" ? position.before : null,\n hasMore,\n nextCursor: stop?.cursor ?? (hasMore ? encode({ ...selection, ...position }) : null),\n sourceExact: sourceLoss === undefined,\n ...(sourceLoss ? { sourceLoss } : {}),\n };\n}\n\nasync function scanSessionEventView(\n selection: Selection,\n continuation: Continuation,\n read: ReadPage,\n // Bytes a caller already holds for the same envelope (named outputs).\n reservedBytes = 0,\n) {\n const limit = selection.limit!;\n let after =\n continuation?.sequence && selection.direction === \"after\"\n ? continuation.sequence - 1\n : selection.after;\n let before =\n continuation?.sequence && selection.direction === \"before\"\n ? continuation.sequence + 1\n : selection.before;\n const events: Item[] = [];\n let hasMore = false;\n let nextCursor: string | null = null;\n let sourceExact = true;\n let edge: number | null = null;\n let legacyActive = continuation?.v === 1 && continuation.sequence !== null;\n const page = () => ({\n view: selection.view,\n effectiveLimit: limit,\n direction: selection.direction,\n events,\n nextAfter: selection.direction === \"after\" ? (edge ?? selection.after) : null,\n nextBefore: selection.direction === \"before\" ? (edge ?? selection.before) : null,\n hasMore,\n nextCursor,\n sourceExact,\n ...(!sourceExact\n ? {\n sourceLoss: {\n reason: \"structured_value_exceeds_budget\" as const,\n completeTextAvailable: false as const,\n message:\n \"An oversized structured value was omitted. Scalar text remains retrievable through continuation; omitted structured values are not complete JSON results.\",\n },\n }\n : {}),\n maxBytes: SESSION_EVENT_VIEW_MAX_BYTES,\n });\n const resume = (sequence: number, offset = 0) => {\n hasMore = true;\n nextCursor = encode(\n { ...selection, after, before },\n sequence,\n offset,\n legacyActive && sequence === continuation?.sequence ? 1 : 2,\n );\n };\n // Bound work even when a sparse exact callId lookup matches nothing. The\n // returned cursor advances the scan without claiming the lookup is exhausted.\n for (let scan = 0; scan < 64; scan += 1) {\n const source = await read({\n after,\n ...(before === null ? {} : { before }),\n direction: selection.direction,\n limit: 8,\n includeTypes: selection.toolName ? [\"agent.toolCall.created\"] : types[selection.view],\n ...(selection.toolName ? { toolName: selection.toolName } : {}),\n ...(selection.callId ? { callId: selection.callId } : {}),\n payloadMode: \"full\",\n excludeUnclaimedHumanPrompts: true,\n maxBytes: 1024 * 1024,\n legacyUtf16: legacyActive,\n view: selection.view,\n includeArguments: selection.includeArguments,\n includeOutput: selection.includeOutput,\n ...(continuation?.sequence\n ? { sourceSequence: continuation.sequence, sourceOffset: continuation.offset }\n : {}),\n });\n sourceExact &&= source.fullPayloadsExact;\n const ordered = selection.direction === \"before\" ? [...source.events].reverse() : source.events;\n for (const event of ordered) {\n const slice = source.slices?.[event.sequence];\n const item = project(event, selection);\n if (item) {\n const offset = continuation?.sequence === event.sequence ? continuation.offset : 0;\n if (slice?.omitted) {\n delete item.text;\n item.sourceOmitted = { reason: \"structured_value_exceeds_budget\", complete: false };\n }\n const advance = (text: string) =>\n slice?.unit === \"codepoint\" ? Array.from(text).length : text.length;\n if (!slice && offset > (item.text?.length ?? 0))\n throw new Error(\"Invalid message continuation offset\");\n if (\n !slice &&\n offset > 0 &&\n item.text &&\n /[\\uD800-\\uDBFF]/.test(item.text[offset - 1]!) &&\n /[\\uDC00-\\uDFFF]/.test(item.text[offset] ?? \"\")\n ) {\n throw new Error(\"Invalid message continuation offset: splits a surrogate pair\");\n }\n if (!slice && offset > 0 && item.text) item.text = item.text.slice(offset);\n events.push(item);\n // Reserve enough for the bounded cursor and fragment facts.\n if (bytes(page()) > SESSION_EVENT_VIEW_MAX_BYTES - 4096 - reservedBytes) {\n events.pop();\n if (events.length > 0) {\n resume(event.sequence, offset);\n if (selection.direction === \"before\") events.reverse();\n return page();\n }\n if (!item.text) throw new Error(\"Session event identity exceeds page budget\");\n const text = item.text;\n let low = 0;\n let high = text.length;\n while (low < high) {\n const mid = Math.ceil((low + high) / 2);\n if (\n bytes({ ...item, text: text.slice(0, mid) }) <=\n SESSION_EVENT_VIEW_MAX_BYTES - 6000 - reservedBytes\n )\n low = mid;\n else high = mid - 1;\n }\n // Do not split a UTF-16 surrogate pair (UTF-8 remains lossless).\n if (low > 0 && /[\\uD800-\\uDBFF]/.test(text[low - 1]!)) low -= 1;\n if (low === 0) throw new Error(\"Session event identity exceeds page budget\");\n events.push({\n ...item,\n text: text.slice(0, low),\n fragment: {\n offset,\n nextOffset: offset + advance(text.slice(0, low)),\n complete: false,\n unit: slice?.unit ?? \"utf16\",\n },\n });\n resume(event.sequence, offset + advance(text.slice(0, low)));\n return page();\n }\n const nextOffset = offset + advance(item.text ?? \"\");\n if (slice && !slice.omitted && nextOffset < slice.total) {\n item.fragment = { offset, nextOffset, complete: false, unit: slice.unit };\n resume(event.sequence, nextOffset);\n if (selection.direction === \"before\") events.reverse();\n return page();\n }\n if (offset > 0)\n item.fragment = {\n offset,\n nextOffset,\n complete: true,\n unit: slice?.unit ?? \"utf16\",\n };\n }\n edge = event.sequence;\n legacyActive = false;\n if (selection.direction === \"after\") after = event.sequence;\n else before = event.sequence;\n if (events.length >= limit) {\n hasMore = source.hasMore || event !== ordered.at(-1);\n nextCursor = hasMore ? encode({ ...selection, after, before }) : null;\n if (selection.direction === \"before\") events.reverse();\n return page();\n }\n }\n // Metadata selection can advance over stale/duplicate rows without a\n // projected payload. Use its covered edge rather than repeating the page.\n if (source.coveredSequence) {\n if (selection.direction === \"after\") after = Math.max(after, source.coveredSequence.last);\n else before = Math.min(before ?? Infinity, source.coveredSequence.first);\n }\n if (!source.hasMore) {\n hasMore = false;\n nextCursor = null;\n if (selection.direction === \"before\") events.reverse();\n return page();\n }\n hasMore = true;\n nextCursor = encode({ ...selection, after, before });\n }\n if (selection.direction === \"before\") events.reverse();\n return page();\n}\n"],"mappings":"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","names":["value"]}
@@ -0,0 +1,18 @@
1
+ import type { Settings } from "@opengeni/config";
2
+ export type SignedStateSecretSource = "explicit" | "integrations_state_secret" | "better_auth_secret" | "environments_encryption_key" | "process_random";
3
+ /**
4
+ * Resolves the key that signs short-lived browser state (GitHub App setup,
5
+ * Codex device sign-in, PR review install and similar round trips).
6
+ *
7
+ * Every API replica must resolve the same key, or a state minted by one
8
+ * replica is refused by the next. An explicit
9
+ * `OPENGENI_GITHUB_APP_MANIFEST_STATE_SECRET` is used as-is. Otherwise the key
10
+ * is derived (HMAC with a fixed label) from the first stable deployment secret
11
+ * that exists, so multi-replica deployments work without an extra variable.
12
+ * Only a deployment with no stable secret at all falls back to a per-process
13
+ * random key, which is correct for a single process only.
14
+ */
15
+ export declare function resolveSignedStateSecret(settings: Pick<Settings, "githubAppManifestStateSecret" | "integrationsStateSecret" | "betterAuthSecret" | "environmentsEncryptionKey">): {
16
+ secret: string;
17
+ source: SignedStateSecretSource;
18
+ };