@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
package/src/index.ts CHANGED
@@ -16,6 +16,7 @@ import type {
16
16
  } from "@opengeni/contracts";
17
17
  import {
18
18
  assertRuntimeDatabasePosture,
19
+ isRetryableRuntimeDatabaseStartupError,
19
20
  createDb,
20
21
  markSessionWorkflowWakeDelivered,
21
22
  runtimeDatabaseReadyCheck,
@@ -28,11 +29,12 @@ import {
28
29
  type Observability,
29
30
  } from "@opengeni/observability";
30
31
  import { createObjectStorage } from "@opengeni/storage";
31
- import { createNativeRemoteMcpCredentialsPort } from "@opengeni/core/remote-mcp-credentials";
32
32
  import { isArtifactRuntimeConfigured } from "@opengeni/artifact-tool/runtime/development";
33
33
  import {
34
34
  resolveCatalogSettings,
35
- SESSION_WORKFLOW_WAKE_DISPATCHER_SCHEDULE_ID,
35
+ SESSION_WORKFLOW_WAKE_DISPATCH_REQUESTED_SIGNAL,
36
+ SESSION_WORKFLOW_WAKE_DISPATCHER_WORKFLOW_ID,
37
+ SESSION_WORKFLOW_WAKE_DISPATCHER_WORKFLOW_TYPE,
36
38
  } from "@opengeni/core";
37
39
  import {
38
40
  Connection,
@@ -43,20 +45,29 @@ import {
43
45
  } from "@temporalio/client";
44
46
  import type { ScheduleOptions, ScheduleSpec, ScheduleUpdateOptions } from "@temporalio/client";
45
47
  import { createAppComposition, type DocumentIndexClient, type SessionWorkflowClient } from "./app";
46
- import { observabilityEventLogger } from "./observability";
48
+ import { observabilityEventBusOptions } from "./observability";
47
49
  import { startAuthCalloutResponder } from "./sandbox/auth-callout";
48
50
  import { startHelloIngestion, startMetricsIngestion } from "./sandbox/metrics-ingestion";
51
+ import { createAutomaticAgentUpdater } from "./sandbox/agent-update";
49
52
  import { startSlackInteractionPump } from "./integrations/slack-interactions";
50
53
  import { startMemorySlackPublicationPump } from "./memory-slack-delivery";
51
54
  import { startTemporalScheduleCleanupPump } from "./temporal-schedule-cleanup";
55
+ import { startScheduledTaskLifecyclePump } from "./scheduled-task-lifecycle";
56
+ import { createTemporalScheduleSynchronizer } from "./temporal-schedule-sync";
57
+ import { startNativePushDispatchPump } from "./native-push-dispatch";
58
+ import { startWorkspaceWebhookDispatchPump } from "./workspace-webhook-dispatch";
52
59
  import { cleanupScheduledTaskConnectorAuthorization } from "./scheduled-task-deletion";
53
60
  import {
54
61
  EDITABLE_ARTIFACT_LIVE_WEBSOCKET_MAX_MESSAGE_BYTES,
55
62
  EditableArtifactWebSocketTransport,
56
63
  } from "./editable-artifact-websocket";
64
+ import { editableArtifactSourceSessionAuthorizer } from "./editable-artifact-source-session";
57
65
  import type { ApiWebSocketConnection } from "./api-websocket";
58
66
  import { InteractionFrameProxyTransport } from "./interaction-frame-proxy";
59
67
  import { apiRequestBindingsForTransportPeer } from "./http/request-source";
68
+ import { startApiMetricsListener } from "./http/metrics-listener";
69
+ import { createLocalBrowserBoundary } from "./http/local-browser-boundary";
70
+ import { dispatchApiWebSocketUpgrade } from "./http/websocket-upgrade-dispatch";
60
71
  import {
61
72
  createStandaloneEditableArtifactApplication,
62
73
  type StandaloneEditableArtifactApplication,
@@ -101,6 +112,28 @@ export async function createTemporalWorkflowClient(
101
112
  connection,
102
113
  namespace: settings.temporalNamespace,
103
114
  });
115
+ const scheduledTasks = createTemporalScheduleSynchronizer({
116
+ db,
117
+ withDeadline: (deadline, work) => temporal.withDeadline(deadline, work),
118
+ upsert: async (task) => {
119
+ const options = temporalScheduleOptions(task, settings.temporalTaskQueue);
120
+ try {
121
+ await temporal.schedule
122
+ .getHandle(task.temporalScheduleId)
123
+ .update(() => temporalScheduleUpdateOptions(options));
124
+ } catch (error) {
125
+ if (!shouldCreateScheduleAfterUpdateError(error)) throw error;
126
+ await temporal.schedule.create(options);
127
+ }
128
+ },
129
+ remove: async (temporalScheduleId) => {
130
+ try {
131
+ await temporal.schedule.getHandle(temporalScheduleId).delete();
132
+ } catch (error) {
133
+ if (!(error instanceof ScheduleNotFoundError)) throw error;
134
+ }
135
+ },
136
+ });
104
137
  const client: SessionWorkflowClient = {
105
138
  triggerAutomationRun: async ({ accountId, workspaceId, runId }) => {
106
139
  try {
@@ -144,9 +177,13 @@ export async function createTemporalWorkflowClient(
144
177
  });
145
178
  },
146
179
  requestSessionWorkflowWakeDispatch: async () => {
147
- await temporal.schedule
148
- .getHandle(SESSION_WORKFLOW_WAKE_DISPATCHER_SCHEDULE_ID)
149
- .trigger(ScheduleOverlapPolicy.BUFFER_ONE);
180
+ await temporal.workflow.signalWithStart(SESSION_WORKFLOW_WAKE_DISPATCHER_WORKFLOW_TYPE, {
181
+ taskQueue: settings.temporalTaskQueue,
182
+ workflowId: SESSION_WORKFLOW_WAKE_DISPATCHER_WORKFLOW_ID,
183
+ workflowIdReusePolicy: "ALLOW_DUPLICATE",
184
+ args: [],
185
+ signal: SESSION_WORKFLOW_WAKE_DISPATCH_REQUESTED_SIGNAL,
186
+ });
150
187
  },
151
188
  signalCodexCapacity: async ({
152
189
  accountId,
@@ -196,41 +233,15 @@ export async function createTemporalWorkflowClient(
196
233
  wakeRevision: workflowWakeRevision,
197
234
  });
198
235
  },
199
- syncScheduledTask: async ({ task }) => {
200
- const schedule = temporal.schedule.getHandle(task.temporalScheduleId);
201
- if (task.schedule.type === "manual") {
202
- try {
203
- await schedule.delete();
204
- } catch (error) {
205
- if (!(error instanceof ScheduleNotFoundError)) throw error;
206
- }
207
- return;
208
- }
209
- const options = temporalScheduleOptions(task, settings.temporalTaskQueue);
210
- try {
211
- await schedule.update(() => temporalScheduleUpdateOptions(options));
212
- } catch (error) {
213
- if (!shouldCreateScheduleAfterUpdateError(error)) {
214
- throw error;
215
- }
216
- await temporal.schedule.create(options);
217
- }
218
- },
219
- deleteScheduledTaskSchedule: async ({ temporalScheduleId }) => {
220
- try {
221
- await temporal.withDeadline(Date.now() + 5_000, async () => {
222
- await temporal.schedule.getHandle(temporalScheduleId).delete();
223
- });
224
- } catch (error) {
225
- if (error instanceof ScheduleNotFoundError) return;
226
- throw error;
227
- }
228
- },
236
+ syncScheduledTask: async ({ task, onFailure }) => scheduledTasks.sync(task, onFailure),
237
+ deleteScheduledTaskSchedule: async ({ temporalScheduleId }) =>
238
+ scheduledTasks.remove(temporalScheduleId),
229
239
  triggerScheduledTask: async ({
230
240
  task,
231
241
  agentRunUsageIdempotencyKey,
232
242
  triggerWorkflowId,
233
243
  initiator,
244
+ credentialRestriction,
234
245
  triggerType = "manual",
235
246
  }) => {
236
247
  // Deterministic workflowId (derived from the trigger token by the
@@ -251,6 +262,7 @@ export async function createTemporalWorkflowClient(
251
262
  triggerType,
252
263
  agentRunUsageIdempotencyKey,
253
264
  initiator,
265
+ ...(credentialRestriction ? { credentialRestriction } : {}),
254
266
  },
255
267
  ],
256
268
  });
@@ -266,7 +278,7 @@ export async function createTemporalWorkflowClient(
266
278
  startRigVerification: async ({ workspaceId, changeId, versionId, workflowId }) => {
267
279
  const targetId = changeId ?? versionId;
268
280
  if (!targetId) {
269
- throw new Error("rig verification requires changeId or versionId");
281
+ throw new Error("sandbox environment verification requires changeId or versionId");
270
282
  }
271
283
  try {
272
284
  await temporal.workflow.start("rigVerificationWorkflow", {
@@ -326,7 +338,7 @@ export async function startApi(
326
338
  // strategy.
327
339
  const searchPath = dbSearchPath(settings);
328
340
  const dbClient = createDb(settings.databaseUrl, {
329
- max: 32,
341
+ max: settings.apiDatabasePoolMax,
330
342
  ...(searchPath ? { searchPath } : {}),
331
343
  rlsStrategy: settings.rlsStrategy,
332
344
  });
@@ -339,8 +351,6 @@ export async function startApi(
339
351
  rlsStrategy: settings.rlsStrategy,
340
352
  expectedRole: settings.runtimeDatabaseRole,
341
353
  targetSchema: settings.dbSchema.trim() || "public",
342
- organizationTenancyCanonicalActivationEnabled:
343
- settings.organizationTenancyCanonicalActivationEnabled,
344
354
  } as const;
345
355
  // The PRIVILEGED control-plane NATS login (M-AUTH): when the server runs with
346
356
  // auth_callout, api/worker authenticate as a static account user permitted to
@@ -363,14 +373,14 @@ export async function startApi(
363
373
  await retryStartupDependency(
364
374
  "PostgreSQL runtime posture",
365
375
  () => assertRuntimeDatabasePosture(dbClient.db, databasePosture),
366
- { ...retryOptions, onRetry },
376
+ { ...retryOptions, onRetry, shouldRetry: isRetryableRuntimeDatabaseStartupError },
367
377
  );
368
378
  const resolvedCatalog = await retryStartupDependency(
369
379
  "model catalog",
370
380
  () => resolveCatalogSettings(dbClient.db, settings),
371
381
  { ...retryOptions, onRetry },
372
382
  );
373
- observability.info("OpenGeni model catalog resolved", {
383
+ observability.info("Opengeni model catalog resolved", {
374
384
  catalogSource: resolvedCatalog.source,
375
385
  catalogVersion: resolvedCatalog.version,
376
386
  });
@@ -382,7 +392,7 @@ export async function startApi(
382
392
  controlPlaneAuth
383
393
  ? { user: controlPlaneAuth.user, pass: controlPlaneAuth.password }
384
394
  : undefined,
385
- { logger: observabilityEventLogger(observability) },
395
+ observabilityEventBusOptions(observability),
386
396
  ),
387
397
  {
388
398
  ...retryOptions,
@@ -403,7 +413,7 @@ export async function startApi(
403
413
  }
404
414
  if (!bus || !workflowClient) {
405
415
  await dbClient.close();
406
- throw new Error("OpenGeni API startup dependencies were not initialized");
416
+ throw new Error("Opengeni API startup dependencies were not initialized");
407
417
  }
408
418
  const objectStorage = createObjectStorage(settings);
409
419
  let editableArtifactComposition: StandaloneEditableArtifactApplication | undefined;
@@ -421,7 +431,6 @@ export async function startApi(
421
431
  }
422
432
  const { app, routeDeps } = createAppComposition({
423
433
  settings,
424
- connectionCredentials: createNativeRemoteMcpCredentialsPort(settings, dbClient.db),
425
434
  db: dbClient.db,
426
435
  bus,
427
436
  workflowClient: workflowClient.client,
@@ -446,21 +455,32 @@ export async function startApi(
446
455
  behavior: "http_and_websocket_fail_closed",
447
456
  });
448
457
  }
449
- const artifactWebSockets = new EditableArtifactWebSocketTransport(routeDeps.editableArtifacts);
458
+ const artifactWebSockets = new EditableArtifactWebSocketTransport(
459
+ routeDeps.editableArtifacts,
460
+ editableArtifactSourceSessionAuthorizer(routeDeps),
461
+ );
450
462
  const interactionFrameProxies = new InteractionFrameProxyTransport(
451
463
  resolveFirstPartyDelegationSecret(settings),
452
464
  );
465
+ // WebSocket upgrades bypass the Hono app, so the local-mode browser boundary
466
+ // (http/local-browser-boundary.ts) is applied to them in the dispatcher;
467
+ // every other request meets it in the Hono middleware.
468
+ const localBrowserBoundary = createLocalBrowserBoundary(settings, {
469
+ warn: (message, attributes) => observability.warn(message, attributes),
470
+ });
471
+ const webSocketUpgrades = [interactionFrameProxies, artifactWebSockets];
453
472
  const server = Bun.serve<ApiWebSocketConnection>({
454
473
  hostname: settings.apiHost,
455
474
  port: settings.apiPort,
456
475
  idleTimeout: 255,
457
476
  fetch: (request, bunServer) => {
458
- if (interactionFrameProxies.handles(request)) {
459
- return interactionFrameProxies.upgrade(request, bunServer);
460
- }
461
- if (artifactWebSockets.handles(request)) {
462
- return artifactWebSockets.upgrade(request, bunServer);
463
- }
477
+ const upgrade = dispatchApiWebSocketUpgrade(
478
+ request,
479
+ bunServer,
480
+ webSocketUpgrades,
481
+ localBrowserBoundary,
482
+ );
483
+ if (upgrade.handled) return upgrade.response;
464
484
  return app.fetch(
465
485
  request,
466
486
  apiRequestBindingsForTransportPeer(bunServer.requestIP(request)?.address),
@@ -475,10 +495,21 @@ export async function startApi(
475
495
  close: (socket) => socket.data.transportClosed(),
476
496
  },
477
497
  });
498
+ const metricsServer = startApiMetricsListener(settings, observability);
478
499
  const stopSlackInteractionPump = settings.slackSigningSecret
479
500
  ? startSlackInteractionPump(routeDeps)
480
501
  : undefined;
481
502
  const stopMemorySlackPublicationPump = startMemorySlackPublicationPump(routeDeps);
503
+ const stopWorkspaceWebhookDispatchPump = startWorkspaceWebhookDispatchPump({
504
+ db: dbClient.db,
505
+ settings,
506
+ observability,
507
+ });
508
+ const stopNativePushDispatchPump = startNativePushDispatchPump({
509
+ db: dbClient.db,
510
+ settings,
511
+ observability,
512
+ });
482
513
  const stopTemporalScheduleCleanupPump = startTemporalScheduleCleanupPump({
483
514
  db: dbClient.db,
484
515
  cleanupConnectorAuthorization: async (claim) =>
@@ -488,6 +519,12 @@ export async function startApi(
488
519
  },
489
520
  observability,
490
521
  });
522
+ const stopScheduledTaskLifecyclePump = startScheduledTaskLifecyclePump({
523
+ db: dbClient.db,
524
+ sync: (task) => workflowClient.client.syncScheduledTask({ task }),
525
+ bus,
526
+ observability,
527
+ });
491
528
  // M10 — start the metrics-ingestion consumer (agent heartbeats → DB last-sample
492
529
  // + downsampled series), gated on the selfhosted flag. A no-op when disabled.
493
530
  let stopMetricsIngestion: (() => void) | undefined;
@@ -507,13 +544,19 @@ export async function startApi(
507
544
  db: dbClient.db,
508
545
  bus,
509
546
  observability,
547
+ agentUpdates: createAutomaticAgentUpdater({
548
+ db: dbClient.db,
549
+ bus,
550
+ settings,
551
+ observability,
552
+ }),
510
553
  });
511
554
  stopHelloIngestion = startHelloIngestion({
512
555
  db: dbClient.db,
513
556
  bus,
514
557
  observability,
515
558
  });
516
- observability.info("OpenGeni machine-metrics + hello ingestion consumers started", {});
559
+ observability.info("Opengeni machine-metrics + hello ingestion consumers started", {});
517
560
 
518
561
  const callout = resolveNatsCalloutConfig(settings);
519
562
  if (callout) {
@@ -525,7 +568,7 @@ export async function startApi(
525
568
  } catch {
526
569
  // A responder start failure must not crash the API (other planes work); log
527
570
  // loudly — selfhosted agents will fail to connect until it is up.
528
- observability.error("OpenGeni NATS auth-callout responder failed to start", {
571
+ observability.error("Opengeni NATS auth-callout responder failed to start", {
529
572
  errorClass: "NatsAuthCalloutOperationError",
530
573
  errorCode: "nats_auth_callout_start_failed",
531
574
  origin: "api",
@@ -533,24 +576,31 @@ export async function startApi(
533
576
  }
534
577
  } else {
535
578
  observability.warn(
536
- "OpenGeni selfhosted enabled but the NATS auth-callout plane is not configured; selfhosted agents cannot connect",
579
+ "Opengeni selfhosted enabled but the NATS auth-callout plane is not configured; selfhosted agents cannot connect",
537
580
  {},
538
581
  );
539
582
  }
540
583
  }
541
- observability.info("OpenGeni API listening", {
584
+ observability.info("Opengeni API listening", {
542
585
  host: settings.apiHost,
543
586
  port: settings.apiPort,
587
+ ...(metricsServer ? { metricsPort: settings.apiMetricsPort } : {}),
544
588
  });
545
589
  return {
546
590
  server,
547
591
  close: async () => {
548
592
  server.stop(true);
593
+ metricsServer?.stop(true);
549
594
  stopSlackInteractionPump?.();
550
595
  await stopMemorySlackPublicationPump();
551
596
  stopMetricsIngestion?.();
552
597
  stopHelloIngestion?.();
553
598
  await stopTemporalScheduleCleanupPump();
599
+ await stopScheduledTaskLifecyclePump();
600
+ await stopWorkspaceWebhookDispatchPump();
601
+ await stopNativePushDispatchPump();
602
+ // Write queued presence before the database pool closes.
603
+ await routeDeps.userPresence?.close().catch(() => undefined);
554
604
  await Promise.allSettled([
555
605
  Promise.resolve(editableArtifactComposition?.close()),
556
606
  authCalloutResponder?.close(),
@@ -640,7 +690,7 @@ function temporalIntervalSpec(
640
690
  // Temporal interval schedules match Epoch + (n * every) + offset. Its
641
691
  // top-level startAt only filters matching times before that boundary, so it
642
692
  // does not itself anchor the cadence. Derive the phase from startAt to make
643
- // the stored OpenGeni timestamp the first interval boundary rather than the
693
+ // the stored Opengeni timestamp the first interval boundary rather than the
644
694
  // next epoch-aligned match.
645
695
  const everyMilliseconds = BigInt(schedule.everySeconds) * 1_000n;
646
696
  const startMilliseconds = BigInt(new Date(schedule.startAt).getTime());
@@ -0,0 +1,228 @@
1
+ import { CORE_INTEGRATION_DEFINITIONS } from "@opengeni/capabilities";
2
+ import type { ConnectAttemptTransition } from "@opengeni/db";
3
+ import type { Observability } from "@opengeni/observability";
4
+
5
+ /**
6
+ * Low-cardinality product telemetry for connecting capabilities, integrations,
7
+ * and MCP servers. Labels are closed sets: a caller-chosen provider id, MCP
8
+ * URL, provider domain, workspace, or user never becomes a label value.
9
+ *
10
+ * Three signals cover the whole connect surface:
11
+ * - `opengeni_connect_attempts_total` — every unified Connect attempt (the
12
+ * popup flow behind every provider card), counted on each committed state
13
+ * transition, so `started` minus terminal states is abandonment.
14
+ * - `opengeni_integration_oauth_callbacks_total` — every provider redirect back
15
+ * to Opengeni, including the legacy settings-page flows whose failure is only
16
+ * visible in a `?<flow>=error&reason=` redirect, never in an HTTP status.
17
+ * - `opengeni_integration_oauth_starts_total` — MCP OAuth discovery/registration
18
+ * at the start of a connection, where remote servers most often fail.
19
+ */
20
+
21
+ const FIXED_CONNECT_PROVIDERS = [
22
+ "x",
23
+ "reddit",
24
+ "mcp-install",
25
+ "openapi",
26
+ "graphql",
27
+ "slack-bot",
28
+ "gmail",
29
+ "slack-personal",
30
+ "github-personal",
31
+ "github-app",
32
+ "github-lens",
33
+ "google-drive-knowledge",
34
+ "google-drive-publish",
35
+ "fiken-token",
36
+ "fiken-oauth",
37
+ "mcp-oauth",
38
+ "mcp-headers",
39
+ "mcp-bearer",
40
+ ] as const;
41
+
42
+ const CONNECT_PROVIDERS: ReadonlySet<string> = new Set([
43
+ ...FIXED_CONNECT_PROVIDERS,
44
+ ...CORE_INTEGRATION_DEFINITIONS.map((definition) => definition.id),
45
+ ]);
46
+
47
+ const CONNECT_STATES: ReadonlySet<string> = new Set([
48
+ "requires_user_action",
49
+ "credential_input",
50
+ "provider_wait",
51
+ "account_selection",
52
+ "resource_selection",
53
+ "preview",
54
+ "installing",
55
+ "connected_but_incomplete",
56
+ "complete",
57
+ "cancelled",
58
+ "expired",
59
+ "failed",
60
+ "uncertain",
61
+ ]);
62
+
63
+ const BOUNDED_CODE = /^[a-z][a-z0-9_]{0,47}$/;
64
+
65
+ export function connectMetricProvider(providerId: string): string {
66
+ return CONNECT_PROVIDERS.has(providerId) ? providerId : "other";
67
+ }
68
+
69
+ /** `http_404`/`upstream_http_502` collapse to a status class; other codes keep a closed grammar. */
70
+ export function boundedConnectReason(value: string | null | undefined): string {
71
+ if (!value) return "none";
72
+ const http = /^(upstream_)?http_([1-5])\d\d$/.exec(value);
73
+ if (http) return `${http[1] ?? ""}http_${http[2]}xx`;
74
+ return BOUNDED_CODE.test(value) ? value : "other";
75
+ }
76
+
77
+ export function observeConnectAttemptTransition(
78
+ observability: Observability | null | undefined,
79
+ transition: ConnectAttemptTransition,
80
+ ): void {
81
+ if (!observability) return;
82
+ try {
83
+ observability.incrementCounter({
84
+ name: "opengeni_connect_attempts_total",
85
+ help: "Connect (capability/integration/MCP setup) attempt transitions by bounded provider, resulting state, and error code. state=started counts new attempts.",
86
+ labels: {
87
+ provider: connectMetricProvider(transition.providerId),
88
+ state:
89
+ transition.previousState === null
90
+ ? "started"
91
+ : CONNECT_STATES.has(transition.state)
92
+ ? transition.state
93
+ : "other",
94
+ error: boundedConnectReason(transition.errorCode),
95
+ },
96
+ });
97
+ } catch {
98
+ // Telemetry never changes a committed setup outcome.
99
+ }
100
+ }
101
+
102
+ /** Provider redirect routes, keyed by route label, with the flow they complete. */
103
+ const OAUTH_CALLBACK_FLOWS = new Map<string, string>([
104
+ ["/v1/integrations/oauth/callback", "mcp_oauth"],
105
+ ["/v1/integrations/provider-oauth/callback", "provider_oauth"],
106
+ ["/v1/integrations/slack/callback", "slack_bot"],
107
+ ["/v1/integrations/fiken/callback", "fiken"],
108
+ ["/v1/integrations/atlassian/callback", "atlassian"],
109
+ ["/v1/integrations/google-drive/callback", "google_drive"],
110
+ ["/v1/integrations/github-personal/oauth/callback", "github_personal"],
111
+ ["/v1/social/oauth/callback", "social"],
112
+ ["/v1/github/setup", "github_app"],
113
+ ["/v1/github/install/callback", "github_app"],
114
+ ["/v1/github/oauth/callback", "github_app"],
115
+ ["/v1/github/app-manifest/callback", "github_app"],
116
+ ["/v1/pr-review/github/install/callback", "github_lens"],
117
+ ["/v1/pr-review/github/oauth/callback", "github_lens"],
118
+ ]);
119
+
120
+ /** Redirect query markers written by each flow's `callbackReturnPath`. */
121
+ const OAUTH_RESULT_MARKERS = [
122
+ "integration_oauth",
123
+ "slack",
124
+ "google_drive",
125
+ "fiken",
126
+ "atlassian",
127
+ "github_personal_oauth",
128
+ "social_oauth",
129
+ "github",
130
+ ] as const;
131
+ const SUCCESS_MARKER_VALUES = new Set(["success", "connected", "complete"]);
132
+
133
+ export function isOAuthCallbackRoute(route: string): boolean {
134
+ return OAUTH_CALLBACK_FLOWS.has(route);
135
+ }
136
+
137
+ /**
138
+ * Classify one provider callback response from its status and redirect only.
139
+ * A popup (Connect attempt) callback returns to its exact opener URL without
140
+ * a result marker; its outcome is counted by `opengeni_connect_attempts_total`
141
+ * and here as `handoff`.
142
+ */
143
+ export function classifyOAuthCallback(input: {
144
+ route: string;
145
+ status: number;
146
+ location: string | null;
147
+ }): { flow: string; provider: string; outcome: string; stage: string; reason: string } | null {
148
+ const flow = OAUTH_CALLBACK_FLOWS.get(input.route);
149
+ if (!flow) return null;
150
+ if (input.status >= 400) {
151
+ return {
152
+ flow,
153
+ provider: flow,
154
+ outcome: "failure",
155
+ stage: "none",
156
+ reason: `http_${String(input.status)[0]}xx`,
157
+ };
158
+ }
159
+ let params: URLSearchParams | null = null;
160
+ if (input.location) {
161
+ try {
162
+ params = new URL(input.location, "https://opengeni.invalid").searchParams;
163
+ } catch {
164
+ params = null;
165
+ }
166
+ }
167
+ const marker = params
168
+ ? OAUTH_RESULT_MARKERS.map((name) => params!.get(name)).find((value) => value !== null)
169
+ : undefined;
170
+ const definitionId = params?.get("definitionId") ?? null;
171
+ const provider =
172
+ flow === "provider_oauth" && definitionId && CONNECT_PROVIDERS.has(definitionId)
173
+ ? definitionId
174
+ : flow;
175
+ if (marker === undefined || marker === null) {
176
+ return { flow, provider, outcome: "handoff", stage: "none", reason: "none" };
177
+ }
178
+ if (SUCCESS_MARKER_VALUES.has(marker)) {
179
+ return { flow, provider, outcome: "success", stage: "none", reason: "none" };
180
+ }
181
+ const reason = boundedConnectReason(params?.get("reason"));
182
+ return {
183
+ flow,
184
+ provider,
185
+ outcome: reason === "access_denied" || reason === "cancelled" ? "cancelled" : "failure",
186
+ stage: boundedConnectReason(params?.get("stage")),
187
+ reason,
188
+ };
189
+ }
190
+
191
+ export function observeOAuthCallback(
192
+ observability: Observability | null | undefined,
193
+ input: { route: string; status: number; location: string | null },
194
+ ): void {
195
+ if (!observability) return;
196
+ const classified = classifyOAuthCallback(input);
197
+ if (!classified) return;
198
+ try {
199
+ observability.incrementCounter({
200
+ name: "opengeni_integration_oauth_callbacks_total",
201
+ help: "Provider OAuth/install callbacks by bounded flow, provider, outcome, stage, and reason.",
202
+ labels: classified,
203
+ });
204
+ } catch {
205
+ // Telemetry never changes the callback redirect.
206
+ }
207
+ }
208
+
209
+ export function observeOAuthStart(
210
+ observability: Observability | null | undefined,
211
+ input: { flow: string; outcome: "success" | "failure"; stage?: string; reason?: string },
212
+ ): void {
213
+ if (!observability) return;
214
+ try {
215
+ observability.incrementCounter({
216
+ name: "opengeni_integration_oauth_starts_total",
217
+ help: "Integration OAuth starts (discovery, registration, state) by bounded flow, outcome, stage, and reason.",
218
+ labels: {
219
+ flow: BOUNDED_CODE.test(input.flow) ? input.flow : "other",
220
+ outcome: input.outcome,
221
+ stage: boundedConnectReason(input.stage),
222
+ reason: boundedConnectReason(input.reason),
223
+ },
224
+ });
225
+ } catch {
226
+ // Telemetry never changes the start response.
227
+ }
228
+ }