@opengeni/api-router 3.0.1 → 3.1.2

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-OGQDXVXY.js +18 -0
  21. package/dist/chunk-OGQDXVXY.js.map +1 -0
  22. package/dist/{chunk-AJ62T5QN.js → chunk-OT56OY4V.js} +80503 -39869
  23. package/dist/chunk-OT56OY4V.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 +165 -55
  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
@@ -1,31 +1,56 @@
1
1
  import type { AccessGrant } from "@opengeni/contracts";
2
+ import { HTTPException } from "hono/http-exception";
3
+ import { z } from "zod";
2
4
  import {
3
- grantHasAgentAttemptAuthority,
4
5
  requireSessionAuthorization,
5
6
  SessionAuthorizationDeniedError,
6
7
  type ApiRouteDeps,
7
8
  } from "@opengeni/core";
8
9
 
9
10
  type AssociatedInteractionSession = {
10
- associations: ReadonlyArray<{ sessionId: string }>;
11
+ associations: ReadonlyArray<{ sessionId: string; relationship: string }>;
11
12
  };
12
13
 
14
+ const InteractionSessionListQuery = z
15
+ .object({
16
+ associatedSessionId: z.string().uuid().optional(),
17
+ includeTerminal: z.enum(["true", "false"]).optional(),
18
+ })
19
+ .strict();
20
+
21
+ /**
22
+ * Optional narrowing filters for BrowserSession/ComputerSession inventories,
23
+ * applied in SQL before per-source authorization. They narrow, never grant:
24
+ * every returned row still passes filterInteractionSessionsForGrant.
25
+ */
26
+ export function parseInteractionSessionListQuery(query: Record<string, string>): {
27
+ associatedSessionId?: string;
28
+ includeTerminal?: boolean;
29
+ } {
30
+ const parsed = InteractionSessionListQuery.safeParse(query);
31
+ if (!parsed.success) {
32
+ throw new HTTPException(400, { message: "Invalid interaction session list query" });
33
+ }
34
+ return {
35
+ ...(parsed.data.associatedSessionId
36
+ ? { associatedSessionId: parsed.data.associatedSessionId.toLowerCase() }
37
+ : {}),
38
+ ...(parsed.data.includeTerminal
39
+ ? { includeTerminal: parsed.data.includeTerminal === "true" }
40
+ : {}),
41
+ };
42
+ }
43
+
13
44
  /**
14
- * Narrow a workspace-wide BrowserSession/ComputerSession inventory to the
15
- * entries a live agent attempt may reach. Every attach-by-id route already
16
- * authorizes the exact source session through the core seam; the list is the
17
- * discovery surface behind `interaction_discover scope=workspace`, so it must
18
- * apply the same seam (private sessions, Slack ownership, and the 0426
19
- * agent-access scope) to each associated session instead of exposing every
20
- * peer's identity. Humans, API keys, and service principals keep the complete
21
- * workspace inventory exactly as before.
45
+ * Apply the same source-chat authorization as get/control routes, for every
46
+ * caller. A later using/observing/related association never transfers ownership
47
+ * or makes a private interaction discoverable through another chat.
22
48
  */
23
49
  export async function filterInteractionSessionsForGrant<T extends AssociatedInteractionSession>(
24
50
  deps: Pick<ApiRouteDeps, "db" | "sessionAuthorization">,
25
51
  grant: AccessGrant,
26
52
  sessions: readonly T[],
27
53
  ): Promise<T[]> {
28
- if (!grantHasAgentAttemptAuthority(grant)) return [...sessions];
29
54
  const decisions = new Map<string, Promise<boolean>>();
30
55
  const authorized = (sessionId: string): Promise<boolean> => {
31
56
  let decision = decisions.get(sessionId);
@@ -46,15 +71,10 @@ export async function filterInteractionSessionsForGrant<T extends AssociatedInte
46
71
  };
47
72
  const kept: T[] = [];
48
73
  for (const session of sessions) {
49
- const associated = [...new Set(session.associations.map((entry) => entry.sessionId))];
50
- let visible = false;
51
- for (const sessionId of associated) {
52
- if (await authorized(sessionId)) {
53
- visible = true;
54
- break;
55
- }
56
- }
57
- if (visible) kept.push(session);
74
+ const sources = session.associations.filter((entry) => entry.relationship === "created");
75
+ // Control-record resolution also requires exactly one creation association.
76
+ // Incomplete or ambiguous records cannot establish a discoverable owner.
77
+ if (sources.length === 1 && (await authorized(sources[0]!.sessionId))) kept.push(session);
58
78
  }
59
79
  return kept;
60
80
  }
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Saved-secret typing needs a controller that understands the private
3
+ * `secretValues` side map. Server-managed controllers always do; a Connected
4
+ * Machine or attached browser runs whatever agent its owner installed, and an
5
+ * agent built before the field existed rejects the whole command as malformed.
6
+ * Refuse before anything is resolved or dispatched, and say how to fix it.
7
+ */
8
+ import type { AccessGrant, InteractionPlacement } from "@opengeni/contracts";
9
+ import {
10
+ type Database,
11
+ getAttachedBrowserDevice,
12
+ getLiveEnrollmentConnection,
13
+ getSandbox,
14
+ } from "@opengeni/db";
15
+ import { attachedBrowserViewer } from "./attached-browser-viewer";
16
+ import { ApiHttpError } from "./http/api-error";
17
+ import { compareAgentVersions } from "./sandbox/machines";
18
+
19
+ /** The first agent release whose controller accepts `secretValues`. */
20
+ export const MINIMUM_AGENT_VERSION_FOR_SECRET_VALUES = "0.1.56";
21
+
22
+ /** True only when the installed version is known and predates secret values.
23
+ * An unknown or unparsable version is not refused on a guess. */
24
+ export function agentVersionRejectsSecretValues(agentVersion: string | null): boolean {
25
+ if (!agentVersion) return false;
26
+ const order = compareAgentVersions(agentVersion, MINIMUM_AGENT_VERSION_FOR_SECRET_VALUES);
27
+ return order !== null && order < 0;
28
+ }
29
+
30
+ export function agentUpdateRequiredForSecretsError(agentVersion: string): ApiHttpError {
31
+ return new ApiHttpError(422, {
32
+ code: "validation_failed",
33
+ message:
34
+ `This machine runs Opengeni agent ${agentVersion}, which cannot type saved secrets. ` +
35
+ `Update the machine's agent to ${MINIMUM_AGENT_VERSION_FOR_SECRET_VALUES} or newer ` +
36
+ `(Machines, Update now), then retry. Nothing was typed.`,
37
+ retryable: false,
38
+ outcomeUnknown: false,
39
+ details: {
40
+ reason: "agent_update_required",
41
+ agentVersion,
42
+ minimumAgentVersion: MINIMUM_AGENT_VERSION_FOR_SECRET_VALUES,
43
+ },
44
+ });
45
+ }
46
+
47
+ /** The installed agent version behind a device placement; null for
48
+ * server-managed placements or when the machine is not live. */
49
+ export async function placementAgentVersion(
50
+ db: Database,
51
+ grant: AccessGrant,
52
+ workspaceId: string,
53
+ placement: InteractionPlacement | null,
54
+ ): Promise<string | null> {
55
+ if (placement?.kind === "connected_machine") {
56
+ const sandbox = await getSandbox(db, grant, placement.sandboxId);
57
+ if (sandbox?.kind !== "selfhosted" || !sandbox.enrollmentId) return null;
58
+ const enrollment = await getLiveEnrollmentConnection(db, grant, sandbox.enrollmentId);
59
+ return enrollment?.agentVersion ?? null;
60
+ }
61
+ if (placement?.kind === "attached_device") {
62
+ const device = await getAttachedBrowserDevice(db, {
63
+ ...(await attachedBrowserViewer({ db }, grant, workspaceId)),
64
+ deviceId: placement.deviceId,
65
+ });
66
+ const enrollment = await getLiveEnrollmentConnection(db, workspaceId, device.enrollmentId);
67
+ return enrollment?.agentVersion ?? null;
68
+ }
69
+ return null;
70
+ }
71
+
72
+ /** A `beforeResolve` hook for `resolveInteractionSecretValues`. */
73
+ export function requirePlacementAcceptsSecretValues(
74
+ db: Database,
75
+ grant: AccessGrant,
76
+ workspaceId: string,
77
+ placement: InteractionPlacement | null,
78
+ ): () => Promise<void> {
79
+ return async () => {
80
+ const agentVersion = await placementAgentVersion(db, grant, workspaceId, placement);
81
+ if (agentVersion !== null && agentVersionRejectsSecretValues(agentVersion)) {
82
+ throw agentUpdateRequiredForSecretsError(agentVersion);
83
+ }
84
+ };
85
+ }
@@ -1,5 +1,9 @@
1
1
  import type { AccessGrant } from "@opengeni/contracts";
2
- import { touchInteractionOperation, touchLeaseHolder } from "@opengeni/db";
2
+ import {
3
+ touchExpiredBrowserSessionResume,
4
+ touchInteractionOperation,
5
+ touchLeaseHolder,
6
+ } from "@opengeni/db";
3
7
  import type { ApiRouteDeps } from "@opengeni/core";
4
8
 
5
9
  const MAX_HEARTBEAT_INTERVAL_MS = 10_000;
@@ -20,6 +24,11 @@ export async function withInteractionHolderHeartbeat<T>(
20
24
  operationId: string;
21
25
  resourceId: string;
22
26
  controllerGeneration: string;
27
+ /** Continuing an expired browser resume on its retained generation: its
28
+ * operation is recorded only once the controller adopts the working copy,
29
+ * so the expired resume itself (still lost, still bound to this
30
+ * generation) is the authority until then. */
31
+ continuesExpiredBrowserResume?: true;
23
32
  },
24
33
  run: () => Promise<T>,
25
34
  ): Promise<T> {
@@ -38,13 +47,20 @@ export async function withInteractionHolderHeartbeat<T>(
38
47
  const pulse = async (): Promise<void> => {
39
48
  try {
40
49
  const [operationAlive, holderAlive] = await Promise.all([
41
- touchInteractionOperation(deps.db, {
42
- accountId: input.grant.accountId,
43
- workspaceId: input.workspaceId,
44
- operationId: input.operationId,
45
- resourceId: input.resourceId,
46
- controllerGeneration: input.controllerGeneration,
47
- }),
50
+ input.continuesExpiredBrowserResume
51
+ ? touchExpiredBrowserSessionResume(deps.db, {
52
+ accountId: input.grant.accountId,
53
+ workspaceId: input.workspaceId,
54
+ browserSessionId: input.resourceId,
55
+ controllerGeneration: input.controllerGeneration,
56
+ })
57
+ : touchInteractionOperation(deps.db, {
58
+ accountId: input.grant.accountId,
59
+ workspaceId: input.workspaceId,
60
+ operationId: input.operationId,
61
+ resourceId: input.resourceId,
62
+ controllerGeneration: input.controllerGeneration,
63
+ }),
48
64
  input.sandboxGroupId
49
65
  ? touchLeaseHolder(deps.db, {
50
66
  accountId: input.grant.accountId,
@@ -8,7 +8,6 @@ import type {
8
8
  ComputerActionRequest,
9
9
  ComputerSessionMutationResponse,
10
10
  InteractionInterventionMutationResponse,
11
- ProtectedAuthFillResponse,
12
11
  } from "@opengeni/contracts";
13
12
  import {
14
13
  interactionAuthMetricObserver,
@@ -22,7 +21,7 @@ type InteractionActionReceipt = BrowserActionReceipt | ComputerActionReceipt;
22
21
  type InteractionLifecycleMutation =
23
22
  | BrowserSessionMutationResponse
24
23
  | ComputerSessionMutationResponse;
25
- type AuthMutation = AuthRunMutationResponse | ProtectedAuthFillResponse;
24
+ type AuthMutation = AuthRunMutationResponse;
26
25
 
27
26
  const STALE_INTERACTION_ERROR_CODES = new Set([
28
27
  "controller_stale",
@@ -52,6 +51,7 @@ export function observeBrowserActionResult(
52
51
  operation: "act",
53
52
  mode: browserActionMode(request.action),
54
53
  outcome: actionReceiptOutcome(receipt),
54
+ reason: actionReceiptReason(receipt),
55
55
  durationMs: elapsedMs(startedAtMs),
56
56
  });
57
57
  }
@@ -67,6 +67,7 @@ export function observeComputerActionResult(
67
67
  operation: "act",
68
68
  mode: computerActionMode(request.action.type),
69
69
  outcome: actionReceiptOutcome(receipt),
70
+ reason: actionReceiptReason(receipt),
70
71
  durationMs: elapsedMs(startedAtMs),
71
72
  });
72
73
  }
@@ -102,6 +103,7 @@ export function observeLifecycleResult(
102
103
  operation: response.operation.kind,
103
104
  mode: "lifecycle",
104
105
  outcome: actionReceiptOutcome(response.operation),
106
+ reason: actionReceiptReason(response.operation),
105
107
  durationMs: elapsedMs(startedAtMs),
106
108
  replayed: response.operation.replayed,
107
109
  });
@@ -184,6 +186,166 @@ function actionReceiptOutcome(receipt: Pick<InteractionActionReceipt, "state" |
184
186
  return receipt.state;
185
187
  }
186
188
 
189
+ function actionReceiptReason(receipt: Pick<InteractionActionReceipt, "state" | "error">): string {
190
+ if (receipt.state !== "failed") return "none";
191
+ const code = receipt.error?.code;
192
+ return code && INTERACTION_ERROR_REASONS.has(code) ? code : "action_failed";
193
+ }
194
+
187
195
  function elapsedMs(startedAtMs: number): number {
188
196
  return Math.max(0, performance.now() - startedAtMs);
189
197
  }
198
+
199
+ type InteractionRouteOperation = {
200
+ resource: "browser" | "computer";
201
+ operation: string;
202
+ mode: string;
203
+ /** The handler already records its successful outcome from the receipt. */
204
+ successObservedByHandler: boolean;
205
+ };
206
+
207
+ const BROWSER = "/v1/workspaces/:workspaceId/browser-sessions";
208
+ const COMPUTER = "/v1/workspaces/:workspaceId/computer-sessions";
209
+ const B = `${BROWSER}/:browserSessionId`;
210
+ const C = `${COMPUTER}/:computerSessionId`;
211
+
212
+ /**
213
+ * Every Browser/Computer control route the product depends on, keyed by
214
+ * `METHOD route-label`. Read-only listing/detail routes are deliberately
215
+ * absent: they are not user-visible operations and stay in the generic HTTP
216
+ * metrics.
217
+ */
218
+ const INTERACTION_ROUTE_OPERATIONS = new Map<string, InteractionRouteOperation>(
219
+ (
220
+ [
221
+ ["POST", BROWSER, "browser", "create", "lifecycle", true],
222
+ ["GET", `${B}/targets`, "browser", "observe", "semantic", false],
223
+ ["POST", `${B}/targets`, "browser", "open_target", "lifecycle", false],
224
+ ["POST", `${B}/targets/:targetId/select`, "browser", "select_target", "lifecycle", false],
225
+ ["DELETE", `${B}/targets/:targetId`, "browser", "close_target", "lifecycle", false],
226
+ ["GET", `${B}/targets/:targetId/observation`, "browser", "observe", "semantic", false],
227
+ ["GET", `${B}/targets/:targetId/state`, "browser", "observe", "semantic", false],
228
+ ["POST", `${B}/targets/:targetId/dom-read`, "browser", "observe", "semantic", false],
229
+ ["GET", `${B}/targets/:targetId/screenshot`, "browser", "observe", "media", false],
230
+ ["POST", `${B}/actions`, "browser", "act", "semantic", true],
231
+ ["POST", `${B}/auth-runs`, "browser", "auth_start", "auth", true],
232
+ ["POST", `${B}/auth-runs/:authRunId/report`, "browser", "auth_report", "auth", true],
233
+ ["POST", `${B}/auth-runs/:authRunId/external-auth`, "browser", "auth_start", "auth", true],
234
+ [
235
+ "POST",
236
+ `${B}/auth-runs/:authRunId/external-auth/interactive`,
237
+ "browser",
238
+ "auth_start",
239
+ "auth",
240
+ true,
241
+ ],
242
+ ["POST", `${B}/auth-runs/:authRunId/verify`, "browser", "auth_verify", "auth", true],
243
+ ["POST", `${B}/attachments`, "browser", "attach", "human", false],
244
+ ["POST", `${B}/revisions`, "browser", "publish", "lifecycle", true],
245
+ ["POST", `${B}/suspend`, "browser", "suspend", "lifecycle", true],
246
+ ["POST", `${B}/resume`, "browser", "resume", "lifecycle", true],
247
+ ["POST", `${B}/end`, "browser", "end", "lifecycle", true],
248
+ ["POST", COMPUTER, "computer", "create", "lifecycle", true],
249
+ ["GET", `${C}/targets`, "computer", "observe", "semantic", false],
250
+ ["GET", `${C}/targets/:targetId/observation`, "computer", "observe", "semantic", false],
251
+ ["GET", `${C}/targets/:targetId/screenshot`, "computer", "observe", "media", false],
252
+ ["POST", `${C}/actions`, "computer", "act", "semantic", true],
253
+ ["POST", `${C}/attachments`, "computer", "attach", "human", false],
254
+ ["POST", `${C}/end`, "computer", "end", "lifecycle", true],
255
+ ] as const
256
+ ).map(([method, route, resource, operation, mode, successObservedByHandler]) => [
257
+ `${method} ${route}`,
258
+ { resource, operation, mode, successObservedByHandler },
259
+ ]),
260
+ );
261
+
262
+ export function interactionRouteOperation(
263
+ method: string,
264
+ route: string,
265
+ ): InteractionRouteOperation | null {
266
+ return INTERACTION_ROUTE_OPERATIONS.get(`${method} ${route}`) ?? null;
267
+ }
268
+
269
+ const INTERACTION_ERROR_REASONS = new Set([
270
+ "resource_not_found",
271
+ "resource_unavailable",
272
+ "controller_stale",
273
+ "target_not_found",
274
+ "target_stale",
275
+ "observation_stale",
276
+ "document_stale",
277
+ "frame_stale",
278
+ "locator_not_found",
279
+ "locator_ambiguous",
280
+ "unsupported",
281
+ "permission_denied",
282
+ "machine_locked",
283
+ "attempt_stale",
284
+ "operation_conflict",
285
+ "outcome_unknown",
286
+ "invalid_action",
287
+ "timeout",
288
+ "controller_lost",
289
+ "driver_failed",
290
+ ]);
291
+
292
+ /**
293
+ * Bounded failure reason for a refused or failed interaction route, derived
294
+ * only from the HTTP status and the content-free rejection classification.
295
+ */
296
+ export function interactionRouteFailureReason(
297
+ status: number,
298
+ rejectionReason: string | undefined,
299
+ ): string {
300
+ if (rejectionReason?.startsWith("permission:")) return "permission_denied";
301
+ if (rejectionReason?.startsWith("control:")) return rejectionReason.replace(":", "_");
302
+ if (rejectionReason && INTERACTION_ERROR_REASONS.has(rejectionReason)) return rejectionReason;
303
+ if (rejectionReason && STALE_INTERACTION_ERROR_CODES.has(rejectionReason)) return "stale";
304
+ if (status === 401) return "unauthenticated";
305
+ if (status === 403) return "access_denied";
306
+ if (status === 404) return "not_found";
307
+ if (status === 409) return "conflict";
308
+ if (status === 400 || status === 422) return "invalid_request";
309
+ if (status === 429) return "rate_limited";
310
+ if (status === 504) return "timeout";
311
+ if (status === 502 || status === 503) return "unavailable";
312
+ return status >= 500 ? "internal" : "rejected";
313
+ }
314
+
315
+ /**
316
+ * Observe the HTTP-level outcome of an interaction route. Routes whose handler
317
+ * already records success from its receipt are counted here only on failure,
318
+ * so every attempt is counted exactly once.
319
+ */
320
+ export function observeInteractionRouteOutcome(
321
+ observability: Observability | null | undefined,
322
+ input: {
323
+ method: string;
324
+ route: string;
325
+ status: number;
326
+ durationMs: number;
327
+ rejectionReason?: string | undefined;
328
+ },
329
+ ): void {
330
+ const operation = interactionRouteOperation(input.method, input.route);
331
+ if (!operation) return;
332
+ const failed = input.status >= 400;
333
+ if (!failed && operation.successObservedByHandler) return;
334
+ const reason = failed
335
+ ? interactionRouteFailureReason(input.status, input.rejectionReason)
336
+ : "none";
337
+ interactionOperationMetricObserver(observability)({
338
+ resource: operation.resource,
339
+ operation: operation.operation,
340
+ mode: operation.mode,
341
+ outcome: !failed
342
+ ? "completed"
343
+ : reason === "stale" || STALE_INTERACTION_ERROR_CODES.has(reason)
344
+ ? "stale"
345
+ : input.status === 401 || input.status === 403
346
+ ? "denied"
347
+ : "failed",
348
+ reason,
349
+ durationMs: input.durationMs,
350
+ });
351
+ }
@@ -0,0 +1,94 @@
1
+ import type { Observability } from "@opengeni/observability";
2
+ import type { Context } from "hono";
3
+
4
+ /** Fixed stage names, so the histogram label stays bounded. */
5
+ export type InteractionRouteStage =
6
+ | "auth"
7
+ | "record"
8
+ | "authorize"
9
+ | "source_session"
10
+ | "control"
11
+ | "placement_cache"
12
+ | "placement_resolve"
13
+ | "placement_cache_write"
14
+ | "placement"
15
+ | "fences"
16
+ | "passkey_pre"
17
+ | "secrets"
18
+ | "dispatch"
19
+ | "passkey_post"
20
+ // Browser creation (open) stages.
21
+ | "replay_check"
22
+ | "prepare"
23
+ | "restore"
24
+ | "network_route"
25
+ | "holder"
26
+ | "generation"
27
+ | "provision"
28
+ | "display"
29
+ | "launch"
30
+ | "activate";
31
+
32
+ export type InteractionRouteStageOperation = "act" | "observe" | "target_state" | "create";
33
+
34
+ /**
35
+ * Wall-clock split of one browser control request into its sequential stages.
36
+ * `mark(stage)` closes the stage that ran since the previous mark. Stages that
37
+ * run more than once (a recovery retry) accumulate. The split is reported as a
38
+ * content-free `Server-Timing` header and a per-stage histogram, so harness
39
+ * overhead around the controller's own work stays visible.
40
+ */
41
+ export class InteractionRouteStages {
42
+ private last: number;
43
+ private readonly durations = new Map<InteractionRouteStage, number>();
44
+
45
+ constructor(
46
+ readonly operation: InteractionRouteStageOperation,
47
+ private readonly now: () => number = () => performance.now(),
48
+ ) {
49
+ this.last = now();
50
+ }
51
+
52
+ mark(stage: InteractionRouteStage): void {
53
+ const at = this.now();
54
+ this.durations.set(stage, (this.durations.get(stage) ?? 0) + Math.max(0, at - this.last));
55
+ this.last = at;
56
+ }
57
+
58
+ entries(): Array<[InteractionRouteStage, number]> {
59
+ return [...this.durations.entries()];
60
+ }
61
+
62
+ serverTiming(): string {
63
+ return this.entries()
64
+ .map(([stage, ms]) => `browser-${stage.replaceAll("_", "-")};dur=${ms.toFixed(1)}`)
65
+ .join(", ");
66
+ }
67
+
68
+ observe(observability: Observability | null | undefined): void {
69
+ if (!observability) return;
70
+ try {
71
+ for (const [stage, ms] of this.entries()) {
72
+ observability.observeHistogram({
73
+ name: "opengeni_interaction_route_stage_seconds",
74
+ help: "Browser control request wall time by sequential stage, around the controller's own work.",
75
+ labels: { resource: "browser", operation: this.operation, stage },
76
+ value: ms / 1_000,
77
+ });
78
+ }
79
+ } catch {
80
+ // Timing never changes a control request's outcome.
81
+ }
82
+ }
83
+ }
84
+
85
+ /** Attach the stage split to the response and the stage histogram. */
86
+ export function reportInteractionRouteStages(
87
+ context: Context,
88
+ observability: Observability | null | undefined,
89
+ stages: InteractionRouteStages,
90
+ ): void {
91
+ const timing = stages.serverTiming();
92
+ if (timing) context.header("server-timing", timing, { append: true });
93
+ stages.observe(observability);
94
+ }