@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
@@ -0,0 +1,352 @@
1
+ import { createHash, createHmac, randomBytes, randomUUID, timingSafeEqual } from "node:crypto";
2
+ import {
3
+ CLAUDE_OAUTH_CLIENT_ID,
4
+ CLAUDE_OAUTH_REDIRECT_URL,
5
+ CLAUDE_OAUTH_TOKEN_URL,
6
+ CLAUDE_OAUTH_SCOPES,
7
+ ClaudeOAuthTokenResponse,
8
+ ClaudeSubscriptionCredential,
9
+ claudeAuthorizationUrl,
10
+ } from "@opengeni/config";
11
+ import {
12
+ ClaudeSubscriptionOAuthStartResponse,
13
+ ClaudeSubscriptionOAuthCompleteResponse,
14
+ ClaudeProviderAccountAuthoritySnapshotV1,
15
+ } from "@opengeni/contracts";
16
+ import { requireEnvironmentEncryption, type ApiRouteDeps } from "@opengeni/core";
17
+ import {
18
+ consumeIntegrationOAuthPendingState,
19
+ decryptEnvironmentValue,
20
+ encryptEnvironmentValue,
21
+ loadIntegrationOAuthPendingState,
22
+ storeIntegrationOAuthPendingState,
23
+ withRlsContext,
24
+ } from "@opengeni/db";
25
+ import { readResponseJsonBounded } from "@opengeni/network";
26
+ import { HTTPException } from "hono/http-exception";
27
+ import { z } from "zod";
28
+ import { offerClaudeDefaultModels } from "./claude-default-models";
29
+ import { prepareClaudeSubscriptionCredential } from "./claude-workspace-connection";
30
+ import {
31
+ fetchClaudeSubscriptionProfile,
32
+ parseClaudeSubscriptionProfile,
33
+ } from "./claude-subscription-profile";
34
+ import {
35
+ claudeCoreAccount,
36
+ connectClaudeCore,
37
+ deliverClaudeCoreWake,
38
+ } from "./claude-subscription-core";
39
+
40
+ export type ClaudeOAuthScope = {
41
+ accountId: string;
42
+ workspaceId: string | null;
43
+ actorSubjectId: string;
44
+ browserSessionHash: string;
45
+ };
46
+ const AttemptScope = z
47
+ .object({
48
+ purpose: z.literal("claude-subscription-oauth"),
49
+ accountId: z.string().uuid(),
50
+ workspaceId: z.string().uuid().nullable(),
51
+ actorSubjectId: z.string().min(1),
52
+ browserSessionHash: z.string().min(1),
53
+ poolScope: z.enum(["organization", "workspace", "user"]),
54
+ credentialId: z.string().uuid().nullable(),
55
+ credentialVersion: z.number().int().nonnegative(),
56
+ authoritySnapshot: ClaudeProviderAccountAuthoritySnapshotV1.nullable(),
57
+ /**
58
+ * Started on the shared core (C2b). An attempt completes only on the
59
+ * runtime it started on; an older pod's strict schema rejects the key
60
+ * (410, start again), which fails closed too.
61
+ */
62
+ runtime: z.literal("core").optional(),
63
+ })
64
+ .strict();
65
+ const Attempt = z.discriminatedUnion("stage", [
66
+ AttemptScope.extend({
67
+ stage: z.literal("pending"),
68
+ state: z.string().min(32).max(128),
69
+ verifier: z.string().min(32).max(128),
70
+ }),
71
+ AttemptScope.extend({ stage: z.literal("complete") }),
72
+ ]);
73
+ const Tokens = ClaudeOAuthTokenResponse.extend({
74
+ refresh_token: z.string().min(1).max(16384),
75
+ account: z.object({ uuid: z.string().uuid() }).passthrough().optional(),
76
+ }).passthrough();
77
+ function same(left: string, right: string) {
78
+ const a = Buffer.from(left),
79
+ b = Buffer.from(right);
80
+ return a.length === b.length && timingSafeEqual(a, b);
81
+ }
82
+ const changed = () =>
83
+ new HTTPException(409, { message: "Claude account changed during sign-in. Start again." });
84
+ /**
85
+ * Claude on the shared core for this attempt (the route read the `claude`
86
+ * provider route). A core attempt records `runtime: "core"`, names the
87
+ * canonical connection and its row version, and carries no v1 authority
88
+ * snapshot; an attempt completes only on the runtime it started on, so one
89
+ * started on the legacy path (adding or reconnecting) never writes a core
90
+ * connection, nor a core one a legacy row (409, start again).
91
+ */
92
+ export type ClaudeOAuthCore = { connectedBySubjectId: string | null };
93
+
94
+ async function coreTarget(deps: ApiRouteDeps, scope: ClaudeOAuthScope, credentialId: string) {
95
+ const account = await claudeCoreAccount(
96
+ deps,
97
+ { accountId: scope.accountId, workspaceId: scope.workspaceId, subjectId: scope.actorSubjectId },
98
+ credentialId,
99
+ );
100
+ return account ? { account, authoritySnapshot: null } : null;
101
+ }
102
+
103
+ export async function startClaudeSubscriptionOAuth(
104
+ deps: ApiRouteDeps,
105
+ scope: ClaudeOAuthScope,
106
+ input: { scope?: "workspace" | "user" | undefined; reconnectAccountId?: string | undefined } = {},
107
+ core: ClaudeOAuthCore | null = { connectedBySubjectId: null },
108
+ ) {
109
+ if (!core) throw changed();
110
+ const key = requireEnvironmentEncryption(deps.settings);
111
+ const poolScope = scope.workspaceId ? (input.scope ?? "workspace") : "organization";
112
+ const current = input.reconnectAccountId
113
+ ? await coreTarget(deps, scope, input.reconnectAccountId)
114
+ : null;
115
+ if (input.reconnectAccountId && (!current || current.account.scope !== poolScope))
116
+ throw changed();
117
+ const verifier = randomBytes(32).toString("base64url"),
118
+ state = randomBytes(32).toString("base64url");
119
+ const id = randomUUID(),
120
+ expiresAt = new Date(Date.now() + 10 * 60_000);
121
+ const attempt = Attempt.parse({
122
+ stage: "pending",
123
+ purpose: "claude-subscription-oauth",
124
+ ...scope,
125
+ poolScope,
126
+ state,
127
+ verifier,
128
+ credentialId: current?.account.id ?? null,
129
+ credentialVersion: current?.account.version ?? 0,
130
+ authoritySnapshot: current?.authoritySnapshot ?? null,
131
+ runtime: "core",
132
+ });
133
+ await storeIntegrationOAuthPendingState(deps.db, {
134
+ ...scope,
135
+ id,
136
+ expiresAt,
137
+ stateEncrypted: encryptEnvironmentValue(key, JSON.stringify(attempt)),
138
+ });
139
+ return ClaudeSubscriptionOAuthStartResponse.parse({
140
+ attemptId: id,
141
+ expiresAt: expiresAt.toISOString(),
142
+ authorizationUrl: claudeAuthorizationUrl({
143
+ state,
144
+ challenge: createHash("sha256").update(verifier).digest("base64url"),
145
+ }),
146
+ });
147
+ }
148
+
149
+ /** Each attempt adds one account or reconnects one exact, generation-fenced target. */
150
+ export async function completeClaudeSubscriptionOAuth(
151
+ deps: ApiRouteDeps,
152
+ scope: ClaudeOAuthScope,
153
+ input: { attemptId: string; code: string },
154
+ reauthorize: (poolScope?: "workspace" | "user" | "organization") => Promise<void>,
155
+ fetchImpl: typeof fetch = globalThis.fetch,
156
+ core: ClaudeOAuthCore | null = { connectedBySubjectId: null },
157
+ ) {
158
+ if (!core) throw changed();
159
+ const key = requireEnvironmentEncryption(deps.settings);
160
+ const encrypted = await loadIntegrationOAuthPendingState(deps.db, {
161
+ ...scope,
162
+ id: input.attemptId,
163
+ });
164
+ const parsed = (() => {
165
+ try {
166
+ return Attempt.safeParse(JSON.parse(decryptEnvironmentValue(key, encrypted!)));
167
+ } catch {
168
+ return { success: false as const };
169
+ }
170
+ })();
171
+ if (!parsed.success)
172
+ throw new HTTPException(410, {
173
+ message: "Claude sign-in expired or was already used. Start again.",
174
+ });
175
+ const attempt = parsed.data;
176
+ if (
177
+ attempt.accountId !== scope.accountId ||
178
+ attempt.workspaceId !== scope.workspaceId ||
179
+ attempt.actorSubjectId !== scope.actorSubjectId ||
180
+ !same(attempt.browserSessionHash, scope.browserSessionHash)
181
+ )
182
+ throw new HTTPException(403, {
183
+ message: "Complete Claude sign-in in the browser where you started it.",
184
+ });
185
+ if (attempt.runtime !== "core") throw changed();
186
+ await reauthorize(attempt.poolScope);
187
+ const current = attempt.credentialId ? await coreTarget(deps, scope, attempt.credentialId) : null;
188
+ if (
189
+ attempt.credentialId &&
190
+ (!current ||
191
+ current.account.version !== attempt.credentialVersion ||
192
+ current.account.scope !== attempt.poolScope ||
193
+ JSON.stringify(current.authoritySnapshot) !== JSON.stringify(attempt.authoritySnapshot))
194
+ )
195
+ throw changed();
196
+ if (attempt.stage === "complete")
197
+ return ClaudeSubscriptionOAuthCompleteResponse.parse({
198
+ connected: true,
199
+ accountId: attempt.credentialId,
200
+ scope: attempt.poolScope,
201
+ credentialVersion: attempt.credentialVersion,
202
+ });
203
+ const parts = input.code.trim().split("#");
204
+ if (parts.length !== 2 || !parts[0] || !same(parts[1]!, attempt.state))
205
+ throw new HTTPException(422, {
206
+ message: "Copy the full authorization code from the Claude page.",
207
+ });
208
+ if (
209
+ !(await consumeIntegrationOAuthPendingState(deps.db, {
210
+ ...scope,
211
+ id: input.attemptId,
212
+ stateEncrypted: encrypted!,
213
+ }))
214
+ )
215
+ throw new HTTPException(410, {
216
+ message: "Claude sign-in expired or was already used. Start again.",
217
+ });
218
+ let tokens: z.infer<typeof Tokens>;
219
+ try {
220
+ const signal = AbortSignal.timeout(30_000);
221
+ const response = await fetchImpl(CLAUDE_OAUTH_TOKEN_URL, {
222
+ method: "POST",
223
+ redirect: "error",
224
+ signal,
225
+ headers: { "content-type": "application/json" },
226
+ body: JSON.stringify({
227
+ grant_type: "authorization_code",
228
+ client_id: CLAUDE_OAUTH_CLIENT_ID,
229
+ redirect_uri: CLAUDE_OAUTH_REDIRECT_URL,
230
+ code: parts[0],
231
+ code_verifier: attempt.verifier,
232
+ state: attempt.state,
233
+ }),
234
+ });
235
+ if (!response.ok) {
236
+ await response.body?.cancel().catch(() => undefined);
237
+ throw new Error("Token exchange refused");
238
+ }
239
+ tokens = Tokens.parse(
240
+ await readResponseJsonBounded(response, 64 * 1024, "Claude sign-in", { signal }),
241
+ );
242
+ if (!CLAUDE_OAUTH_SCOPES.every((required) => tokens.scope.split(/\s+/).includes(required)))
243
+ throw new Error("Required scopes missing");
244
+ } catch {
245
+ throw new HTTPException(502, {
246
+ message: "Claude sign-in could not be completed. Start sign-in again.",
247
+ });
248
+ }
249
+ const scopes = tokens.scope.split(/\s+/).filter(Boolean);
250
+ const direct = parseClaudeSubscriptionProfile({
251
+ account: tokens.account,
252
+ organization: tokens.organization,
253
+ });
254
+ const profile = await fetchClaudeSubscriptionProfile(tokens.access_token, scopes, fetchImpl);
255
+ if (tokens.account && profile && tokens.account.uuid !== profile.accountUuid)
256
+ throw new HTTPException(502, {
257
+ message: "Claude returned inconsistent account details. Start sign-in again.",
258
+ });
259
+ const accountUuid = tokens.account?.uuid ?? profile?.accountUuid ?? "";
260
+ if (
261
+ current?.account.providerAccountId &&
262
+ !/^(setup|oauth):/.test(current.account.providerAccountId) &&
263
+ current.account.providerAccountId !== accountUuid
264
+ )
265
+ throw new HTTPException(409, {
266
+ message:
267
+ "Sign in to the same Claude account to reconnect. Use Add account for a different subscription.",
268
+ });
269
+ await reauthorize(attempt.poolScope);
270
+ const expiresAt = new Date(Date.now() + tokens.expires_in * 1000);
271
+ const bundle = ClaudeSubscriptionCredential.parse({
272
+ ...JSON.parse(
273
+ prepareClaudeSubscriptionCredential(
274
+ deps.settings,
275
+ scope.workspaceId ? "workspace:" + scope.workspaceId : "organization:" + scope.accountId,
276
+ tokens.access_token,
277
+ ),
278
+ ),
279
+ identity: {
280
+ accountUuid,
281
+ deviceId: createHmac("sha256", key)
282
+ .update("claude-device:" + (scope.workspaceId ?? scope.accountId))
283
+ .digest("hex"),
284
+ },
285
+ oauth: { refreshToken: tokens.refresh_token, expiresAt: expiresAt.toISOString(), scopes },
286
+ });
287
+ const providerAccountId =
288
+ accountUuid || "oauth:" + createHmac("sha256", key).update(tokens.access_token).digest("hex");
289
+
290
+ const personal = attempt.poolScope === "user";
291
+ const saved = await withRlsContext(deps.db, scope, async (tx) => {
292
+ const connected = await connectClaudeCore(
293
+ tx,
294
+ {
295
+ accountId: scope.accountId,
296
+ workspaceId: scope.workspaceId,
297
+ subjectId: scope.actorSubjectId,
298
+ ...(personal ? { personal: true } : {}),
299
+ encryptionKey: key,
300
+ credential: bundle,
301
+ providerAccountId,
302
+ accountEmail: profile?.email ?? direct?.email ?? null,
303
+ planType: profile?.plan ?? direct?.plan ?? null,
304
+ label: current?.account.label ?? null,
305
+ connectedBySubjectId: core.connectedBySubjectId,
306
+ ...(current
307
+ ? {
308
+ reconnectTarget: {
309
+ connectionId: current.account.id,
310
+ expectedVersion: current.account.version,
311
+ providerAccountId: current.account.providerAccountId,
312
+ },
313
+ }
314
+ : {}),
315
+ },
316
+ "Claude account changed during sign-in. Start again.",
317
+ );
318
+ await storeIntegrationOAuthPendingState(tx, {
319
+ ...scope,
320
+ id: input.attemptId,
321
+ expiresAt: new Date(Date.now() + 10 * 60_000),
322
+ stateEncrypted: encryptEnvironmentValue(
323
+ key,
324
+ JSON.stringify({
325
+ purpose: "claude-subscription-oauth",
326
+ ...scope,
327
+ stage: "complete",
328
+ poolScope: attempt.poolScope,
329
+ credentialId: connected.id,
330
+ credentialVersion: connected.version,
331
+ authoritySnapshot: null,
332
+ runtime: "core",
333
+ }),
334
+ ),
335
+ });
336
+ return connected;
337
+ });
338
+ await deliverClaudeCoreWake(deps, saved.wake);
339
+ await offerClaudeDefaultModels(deps, {
340
+ ...(scope.workspaceId
341
+ ? { accountId: scope.accountId, workspaceId: scope.workspaceId }
342
+ : { organizationId: scope.accountId }),
343
+ actorSubjectId: scope.actorSubjectId,
344
+ providerKind: "claude_subscription",
345
+ });
346
+ return ClaudeSubscriptionOAuthCompleteResponse.parse({
347
+ connected: true,
348
+ accountId: saved.id,
349
+ scope: attempt.poolScope,
350
+ credentialVersion: saved.version,
351
+ });
352
+ }
@@ -0,0 +1,73 @@
1
+ import { readResponseJsonBounded } from "@opengeni/network";
2
+ import { z } from "zod";
3
+
4
+ const Account = z
5
+ .object({
6
+ uuid: z.string().uuid(),
7
+ email: z.string().trim().email().max(320).optional(),
8
+ email_address: z.string().trim().email().max(320).optional(),
9
+ has_claude_max: z.boolean().optional(),
10
+ has_claude_pro: z.boolean().optional(),
11
+ })
12
+ .passthrough();
13
+ const Profile = z
14
+ .object({
15
+ account: Account,
16
+ organization: z
17
+ .object({
18
+ organization_type: z.string().trim().min(1).max(128).optional(),
19
+ })
20
+ .passthrough()
21
+ .optional(),
22
+ })
23
+ .passthrough();
24
+
25
+ export type ClaudeSubscriptionProfile = {
26
+ accountUuid: string;
27
+ email: string | null;
28
+ plan: string | null;
29
+ };
30
+
31
+ /** Only provider-reported identity; never derive email from a token or an organization name. */
32
+ export function parseClaudeSubscriptionProfile(value: unknown): ClaudeSubscriptionProfile | null {
33
+ const parsed = Profile.safeParse(value);
34
+ if (!parsed.success) return null;
35
+ const { account, organization } = parsed.data;
36
+ return {
37
+ accountUuid: account.uuid,
38
+ email: account.email ?? account.email_address ?? null,
39
+ plan:
40
+ organization?.organization_type ??
41
+ (account.has_claude_max === true
42
+ ? "claude_max"
43
+ : account.has_claude_pro === true
44
+ ? "claude_pro"
45
+ : null),
46
+ };
47
+ }
48
+
49
+ /** Optional profile read. A profile outage must not discard a valid sign-in. */
50
+ export async function fetchClaudeSubscriptionProfile(
51
+ token: string,
52
+ scopes: readonly string[],
53
+ fetchImpl: typeof fetch = globalThis.fetch,
54
+ ): Promise<ClaudeSubscriptionProfile | null> {
55
+ if (!scopes.includes("user:profile")) return null;
56
+ try {
57
+ const signal = AbortSignal.timeout(10_000);
58
+ const response = await fetchImpl("https://api.anthropic.com/api/oauth/profile", {
59
+ headers: { authorization: `Bearer ${token}`, accept: "application/json" },
60
+ redirect: "error",
61
+ signal,
62
+ });
63
+ if (!response.ok) {
64
+ await response.body?.cancel().catch(() => undefined);
65
+ return null;
66
+ }
67
+ return parseClaudeSubscriptionProfile(
68
+ await readResponseJsonBounded(response, 64 * 1024, "Claude profile", { signal }),
69
+ );
70
+ } catch {
71
+ return null;
72
+ }
73
+ }
@@ -0,0 +1,51 @@
1
+ import { parseClaudeUsageResponse } from "@opengeni/config";
2
+ import type { ClaudeSubscriptionUsage } from "@opengeni/contracts";
3
+ import { readResponseJsonBounded } from "@opengeni/network";
4
+
5
+ /** The Claude profile usage request (no inference); the caller records its reading. */
6
+ export async function requestClaudeUsage(
7
+ token: string,
8
+ fetchImpl: typeof fetch = globalThis.fetch,
9
+ ) {
10
+ const checkedAt = new Date().toISOString();
11
+ let status: ClaudeSubscriptionUsage["refreshStatus"] = "unavailable";
12
+ let observation: ReturnType<typeof parseClaudeUsageResponse> = null;
13
+ try {
14
+ const signal = AbortSignal.timeout(10_000);
15
+ const response = await fetchImpl("https://api.anthropic.com/api/oauth/usage", {
16
+ headers: {
17
+ authorization: `Bearer ${token}`,
18
+ "content-type": "application/json",
19
+ "cache-control": "no-cache",
20
+ },
21
+ redirect: "error",
22
+ signal,
23
+ });
24
+ if (response.ok || response.status === 403) {
25
+ const body = await readResponseJsonBounded<unknown>(response, 64 * 1024, "Claude usage", {
26
+ signal,
27
+ });
28
+ if (response.ok) {
29
+ observation = parseClaudeUsageResponse(body, new Date(checkedAt));
30
+ status = observation ? "available" : "unavailable";
31
+ } else {
32
+ const error = body && typeof body === "object" && "error" in body ? body.error : null;
33
+ const message =
34
+ error && typeof error === "object" && "message" in error ? error.message : null;
35
+ status =
36
+ typeof message === "string" &&
37
+ message.includes("scope requirement") &&
38
+ message.includes("user:profile")
39
+ ? "scope_required"
40
+ : "unavailable";
41
+ }
42
+ } else {
43
+ status = response.status === 401 ? "reconnect" : "unavailable";
44
+ await response.body?.cancel().catch(() => undefined);
45
+ }
46
+ } catch {
47
+ // Retain the last provider observation; never imply an unavailable quota is zero.
48
+ }
49
+
50
+ return { status, observation, checkedAt };
51
+ }
@@ -0,0 +1,82 @@
1
+ import { createHmac } from "node:crypto";
2
+ import { requireEnvironmentEncryption } from "@opengeni/core";
3
+ import { ClaudeSubscriptionCredential, type Settings } from "@opengeni/config";
4
+ import { HTTPException } from "hono/http-exception";
5
+
6
+ /** Validate the canonical model lane before it bypasses integration acquisition. */
7
+ export function assertClaudeWorkspaceCredential(
8
+ settings: Pick<Settings, "claudeSubscriptionEnabled">,
9
+ input: {
10
+ subjectId: string | null;
11
+ providerDomain: string;
12
+ kind: string;
13
+ metadata?: Record<string, unknown>;
14
+ credential: unknown;
15
+ },
16
+ ): void {
17
+ const role = input.metadata?.credentialRole;
18
+ if (role !== "anthropic" && role !== "claude_subscription") return;
19
+ if (role === "claude_subscription" && !settings.claudeSubscriptionEnabled)
20
+ throw new HTTPException(404, { message: "Claude subscriptions are not enabled" });
21
+ if (role === "claude_subscription")
22
+ throw new HTTPException(410, { message: "Use individual Claude subscription accounts." });
23
+ if (
24
+ input.subjectId !== null ||
25
+ input.providerDomain !== "api.anthropic.com" ||
26
+ input.kind !== "api_key"
27
+ )
28
+ throw new HTTPException(422, {
29
+ message: "Claude model connections must belong to this workspace",
30
+ });
31
+ const credential = input.credential;
32
+ const key =
33
+ credential && typeof credential === "object" && "apiKey" in credential
34
+ ? credential.apiKey
35
+ : null;
36
+ if (typeof key !== "string")
37
+ throw new HTTPException(422, { message: "Claude connection credential is required" });
38
+ if (role === "anthropic") {
39
+ if (!/^sk-ant-api[0-9]+-\S+$/.test(key))
40
+ throw new HTTPException(422, {
41
+ message: "Enter an Anthropic API key. Use Claude subscription for setup tokens.",
42
+ });
43
+ return;
44
+ }
45
+ }
46
+
47
+ /** Stable installation identity; setup tokens do not grant profile access. */
48
+ export function prepareClaudeSubscriptionCredential(
49
+ settings: Settings,
50
+ scope: string,
51
+ token: string,
52
+ identity?: { accountUuid: string; deviceId: string },
53
+ ): string {
54
+ if (!settings.claudeSubscriptionEnabled)
55
+ throw new HTTPException(404, { message: "Claude subscriptions are not enabled" });
56
+ if (!/^sk-ant-oat[0-9]+-\S+$/.test(token))
57
+ throw new HTTPException(422, { message: "Enter the setup token from claude setup-token." });
58
+ return JSON.stringify(
59
+ ClaudeSubscriptionCredential.parse({
60
+ version: 1,
61
+ token,
62
+ identity: identity ?? {
63
+ accountUuid: "",
64
+ deviceId: createHmac("sha256", requireEnvironmentEncryption(settings))
65
+ .update("claude-device:" + scope)
66
+ .digest("hex"),
67
+ },
68
+ }),
69
+ );
70
+ }
71
+
72
+ export function prepareClaudeWorkspaceCredential(
73
+ settings: Settings,
74
+ workspaceId: string,
75
+ metadata: Record<string, unknown> | undefined,
76
+ credential: Record<string, unknown>,
77
+ ): Record<string, unknown> {
78
+ if (metadata?.credentialRole !== "claude_subscription") return credential;
79
+ if (!settings.claudeSubscriptionEnabled)
80
+ throw new HTTPException(404, { message: "Claude subscriptions are not enabled" });
81
+ throw new HTTPException(410, { message: "Use individual Claude subscription accounts." });
82
+ }