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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (546) hide show
  1. package/dist/access-grant-rls.d.ts +8 -1
  2. package/dist/admission-trace.d.ts +8 -0
  3. package/dist/app.d.ts +50 -3
  4. package/dist/app.js +10 -1
  5. package/dist/artifact-catalog-cursor.d.ts +1 -0
  6. package/dist/attached-browser-viewer.d.ts +11 -0
  7. package/dist/auth/managed-auth-attempt-context.d.ts +2 -0
  8. package/dist/auth/managed-auth-rate-limits.d.ts +167 -0
  9. package/dist/auth/managed-auth-session-adapter.d.ts +9 -1
  10. package/dist/auth/managed-auth.d.ts +72 -5
  11. package/dist/auth/managed-sign-in-notifications.d.ts +4 -0
  12. package/dist/auth/new-signups-gate.d.ts +23 -0
  13. package/dist/auth/signup-funnel-metrics.d.ts +44 -0
  14. package/dist/azure-live.d.ts +28 -0
  15. package/dist/browser-action-fences.d.ts +13 -0
  16. package/dist/browser-controller-authority.d.ts +1 -61
  17. package/dist/browser-ephemeral.d.ts +5 -0
  18. package/dist/browser-lost-runtime-end.d.ts +24 -0
  19. package/dist/browser-state-authority.d.ts +1 -27
  20. package/dist/{chunk-AJ62T5QN.js → chunk-GBUJ2DYZ.js} +80507 -39878
  21. package/dist/chunk-GBUJ2DYZ.js.map +1 -0
  22. package/dist/chunk-OGQDXVXY.js +18 -0
  23. package/dist/chunk-OGQDXVXY.js.map +1 -0
  24. package/dist/claude-default-models.d.ts +19 -0
  25. package/dist/claude-subscription-core.d.ts +50 -0
  26. package/dist/claude-subscription-oauth.d.ts +36 -0
  27. package/dist/claude-subscription-profile.d.ts +9 -0
  28. package/dist/claude-subscription-usage.d.ts +6 -0
  29. package/dist/claude-workspace-connection.d.ts +15 -0
  30. package/dist/codemode.d.ts +40 -5
  31. package/dist/codex-realtime.d.ts +29 -3
  32. package/dist/codex-session-pointers.d.ts +19 -0
  33. package/dist/connection-ownership.d.ts +6 -3
  34. package/dist/controller-data-plane.d.ts +16 -0
  35. package/dist/credit-promotion-snapshot.d.ts +6 -0
  36. package/dist/editable-artifact-source-session.d.ts +3 -0
  37. package/dist/editable-artifact-websocket.d.ts +5 -3
  38. package/dist/fatal-process-boundary.d.ts +9 -1
  39. package/dist/github-access.d.ts +7 -1
  40. package/dist/github-browser-flow.d.ts +1 -1
  41. package/dist/http/acting-person.d.ts +36 -0
  42. package/dist/http/api-contract-compat.d.ts +19 -0
  43. package/dist/http/api-error.d.ts +50 -1
  44. package/dist/http/auth.d.ts +8 -1
  45. package/dist/http/cors.d.ts +12 -0
  46. package/dist/http/deprecation.d.ts +42 -0
  47. package/dist/http/keyed-admission.d.ts +12 -0
  48. package/dist/http/local-browser-boundary.d.ts +72 -0
  49. package/dist/http/metrics-listener.d.ts +22 -0
  50. package/dist/http/path-identifier.d.ts +17 -0
  51. package/dist/http/registered-route-label.d.ts +16 -0
  52. package/dist/http/rejection-telemetry.d.ts +34 -0
  53. package/dist/http/request-body.d.ts +27 -0
  54. package/dist/http/request-source.d.ts +41 -3
  55. package/dist/http/sse.d.ts +12 -1
  56. package/dist/http/unmatched-route.d.ts +18 -0
  57. package/dist/http/user-content.d.ts +36 -0
  58. package/dist/http/variable-sets-removed.d.ts +41 -0
  59. package/dist/http/websocket-upgrade-dispatch.d.ts +18 -0
  60. package/dist/index.js +1279 -108
  61. package/dist/index.js.map +1 -1
  62. package/dist/integration-connect-metrics.d.ts +35 -0
  63. package/dist/integration-endpoint-test.d.ts +20 -0
  64. package/dist/integrations/api-integrations.d.ts +2 -2
  65. package/dist/integrations/atlassian.d.ts +8 -3
  66. package/dist/integrations/fiken.d.ts +3 -1
  67. package/dist/integrations/github-lens-connect.d.ts +37 -66
  68. package/dist/integrations/google-drive.d.ts +2 -0
  69. package/dist/integrations/integration-commit-authority.d.ts +13 -0
  70. package/dist/integrations/marketplace-plugin.d.ts +43 -43
  71. package/dist/integrations/oauth-client.d.ts +171 -12
  72. package/dist/integrations/oauth-profiles.d.ts +42 -13
  73. package/dist/integrations/onepassword-vault-provider.d.ts +9 -0
  74. package/dist/integrations/slack-bot.d.ts +285 -7
  75. package/dist/integrations/slack-file-upload-flow.d.ts +62 -0
  76. package/dist/integrations/slack-interactions.d.ts +89 -10
  77. package/dist/integrations/slack-mrkdwn.d.ts +41 -0
  78. package/dist/integrations/slack-routing.d.ts +1 -1
  79. package/dist/integrations/slack-session-defaults.d.ts +58 -0
  80. package/dist/integrations/slack-task-file-upload.d.ts +36 -0
  81. package/dist/integrations/slack-tool-review.d.ts +5 -0
  82. package/dist/interaction-agent-access.d.ts +13 -8
  83. package/dist/interaction-agent-version.d.ts +21 -0
  84. package/dist/interaction-holder-heartbeat.d.ts +5 -0
  85. package/dist/interaction-metrics.d.ts +27 -2
  86. package/dist/interaction-route-stages.d.ts +25 -0
  87. package/dist/interaction-secrets-vault.d.ts +20 -0
  88. package/dist/interaction-secrets.d.ts +103 -0
  89. package/dist/mcp/action-catalog-types.d.ts +14 -0
  90. package/dist/mcp/action-catalog.gen.d.ts +2 -0
  91. package/dist/mcp/action-descriptions.d.ts +4 -0
  92. package/dist/mcp/action-schema-imports.gen.d.ts +1 -0
  93. package/dist/mcp/capability-account-readiness.d.ts +7 -0
  94. package/dist/mcp/child-read-evidence.d.ts +9 -0
  95. package/dist/mcp/company-profile-agent-admin.d.ts +12 -0
  96. package/dist/mcp/contract-input.d.ts +13 -0
  97. package/dist/mcp/documents.d.ts +2 -0
  98. package/dist/mcp/first-party-tool-permissions.d.ts +3 -606
  99. package/dist/mcp/notification-tools.d.ts +26 -0
  100. package/dist/mcp/orchestration-failure-diagnostic.d.ts +43 -0
  101. package/dist/mcp/scheduled-task-input.d.ts +1309 -0
  102. package/dist/mcp/scheduled-task-view.d.ts +217 -3
  103. package/dist/mcp/secret-tools.d.ts +14 -0
  104. package/dist/mcp/server.d.ts +108 -5
  105. package/dist/mcp/session-admin-access-tools.d.ts +33 -0
  106. package/dist/mcp/session-event-errors.d.ts +28 -0
  107. package/dist/mcp/session-event-view.d.ts +62 -0
  108. package/dist/mcp/session-view.d.ts +15 -0
  109. package/dist/mcp/session-wait.d.ts +18 -0
  110. package/dist/mcp/site-agent-clamp-tools.d.ts +38 -0
  111. package/dist/mcp/site-data-tools.d.ts +22 -0
  112. package/dist/mcp/site-publication-tools.d.ts +19 -0
  113. package/dist/mcp/site-sql-tools.d.ts +27 -0
  114. package/dist/mcp-oauth.d.ts +37 -4
  115. package/dist/model-calls/chat-completions.d.ts +87 -0
  116. package/dist/model-calls/pending-usage-settlements.d.ts +57 -0
  117. package/dist/model-calls/service.d.ts +36 -0
  118. package/dist/model-catalog.d.ts +9 -3
  119. package/dist/native-push-dispatch.d.ts +69 -0
  120. package/dist/observability.d.ts +3 -1
  121. package/dist/organization-mcp.d.ts +82 -0
  122. package/dist/prepared-mcp-actor.d.ts +77 -0
  123. package/dist/prepared-mcp-permissions.d.ts +8 -0
  124. package/dist/routes/analytics-consent.d.ts +26 -0
  125. package/dist/routes/api-integrations.d.ts +11 -0
  126. package/dist/routes/api-keys.d.ts +7 -7
  127. package/dist/routes/automations.d.ts +2 -0
  128. package/dist/routes/billing.d.ts +59 -0
  129. package/dist/routes/browser-sessions.d.ts +65 -2
  130. package/dist/routes/chat-completions.d.ts +11 -0
  131. package/dist/routes/claude-core-usage.d.ts +20 -0
  132. package/dist/routes/claude-subscription-accounts.d.ts +3 -0
  133. package/dist/routes/claude-subscription-oauth.d.ts +3 -0
  134. package/dist/routes/client-errors.d.ts +182 -0
  135. package/dist/routes/codex-core.d.ts +401 -0
  136. package/dist/routes/codex.d.ts +64 -2
  137. package/dist/routes/computer-sessions.d.ts +6 -1
  138. package/dist/routes/desktop-distribution.d.ts +32 -0
  139. package/dist/routes/github-browser-fonts.gen.d.ts +2 -0
  140. package/dist/routes/github-browser-pages.d.ts +27 -0
  141. package/dist/routes/inbox.d.ts +13 -0
  142. package/dist/routes/insights-response-cache.d.ts +10 -0
  143. package/dist/routes/insights-usage.d.ts +12 -0
  144. package/dist/routes/insights.d.ts +28 -0
  145. package/dist/routes/interaction-placement-message.d.ts +7 -0
  146. package/dist/routes/managed-sign-in-methods.d.ts +6 -0
  147. package/dist/routes/model-account-choice.d.ts +13 -0
  148. package/dist/routes/model-account-settings.d.ts +19 -0
  149. package/dist/routes/native-app-auth.d.ts +12 -0
  150. package/dist/routes/organization-integration-policy.d.ts +8 -0
  151. package/dist/routes/organization-integrations.d.ts +6 -0
  152. package/dist/routes/organization-mcp-connections.d.ts +3 -0
  153. package/dist/routes/organization-model-defaults.d.ts +9 -0
  154. package/dist/routes/organization-service-accounts.d.ts +3 -0
  155. package/dist/routes/personal-api-keys.d.ts +3 -0
  156. package/dist/routes/session-admin-access.d.ts +3 -0
  157. package/dist/routes/session-artifact-associations.d.ts +4 -0
  158. package/dist/routes/session-history-imports.d.ts +20 -0
  159. package/dist/routes/sessions.d.ts +38 -2
  160. package/dist/routes/site-data.d.ts +18 -0
  161. package/dist/routes/site-publishing.d.ts +5 -0
  162. package/dist/routes/site-runtime.d.ts +31 -0
  163. package/dist/routes/site-sql.d.ts +16 -0
  164. package/dist/routes/slack-bot-access.d.ts +3 -0
  165. package/dist/routes/subscription-account-pools.d.ts +21 -0
  166. package/dist/routes/subscription-core-http.d.ts +5 -0
  167. package/dist/routes/subscription-pool-access.d.ts +37 -0
  168. package/dist/routes/subscription-pool-core.d.ts +153 -0
  169. package/dist/routes/supergrok.d.ts +6 -6
  170. package/dist/routes/usage-allowances.d.ts +12 -0
  171. package/dist/routes/variable-sets-removed.d.ts +2 -0
  172. package/dist/routes/vault-providers.d.ts +34 -0
  173. package/dist/routes/vaults.d.ts +3 -0
  174. package/dist/routes/workspace-integrations.d.ts +35 -0
  175. package/dist/routes/workspace-model-providers.d.ts +4 -0
  176. package/dist/routes/workspaces.d.ts +11 -2
  177. package/dist/sandbox/agent-update.d.ts +64 -0
  178. package/dist/sandbox/auth-callout.d.ts +8 -0
  179. package/dist/sandbox/channel-a.d.ts +15 -1
  180. package/dist/sandbox/enrollment.d.ts +26 -4
  181. package/dist/sandbox/machine-audience.d.ts +29 -0
  182. package/dist/sandbox/machines.d.ts +15 -2
  183. package/dist/sandbox/metrics-ingestion.d.ts +6 -2
  184. package/dist/sandbox/screen-control.d.ts +85 -0
  185. package/dist/sandbox/viewer.d.ts +5 -1
  186. package/dist/sandbox-file-artifacts.d.ts +17 -1
  187. package/dist/scheduled-task-blockers.d.ts +39 -0
  188. package/dist/scheduled-task-deletion.d.ts +3 -4
  189. package/dist/scheduled-task-lifecycle.d.ts +14 -0
  190. package/dist/secret-answers.d.ts +40 -0
  191. package/dist/session-create-observability.d.ts +5 -0
  192. package/dist/session-event-view-36GO3IL7.js +528 -0
  193. package/dist/session-event-view-36GO3IL7.js.map +1 -0
  194. package/dist/signed-state-secret.d.ts +18 -0
  195. package/dist/site-agent-guard.d.ts +53 -0
  196. package/dist/site-data/operations.d.ts +103 -0
  197. package/dist/site-data/service.d.ts +203 -0
  198. package/dist/site-frame-guard.d.ts +32 -0
  199. package/dist/site-publishing/agent-data-tools.d.ts +84 -0
  200. package/dist/site-publishing/agent-model.d.ts +58 -0
  201. package/dist/site-publishing/agent-session.d.ts +16 -0
  202. package/dist/site-publishing/content-scanner.d.ts +31 -0
  203. package/dist/site-publishing/edge-sync.d.ts +48 -0
  204. package/dist/site-publishing/gateway-signature.d.ts +56 -0
  205. package/dist/site-publishing/limits.d.ts +63 -0
  206. package/dist/site-publishing/page-tool-authority.d.ts +30 -0
  207. package/dist/site-publishing/platform-usage.d.ts +113 -0
  208. package/dist/site-publishing/platform.d.ts +21 -0
  209. package/dist/site-publishing/readiness.d.ts +62 -0
  210. package/dist/site-publishing/runtime.d.ts +179 -0
  211. package/dist/site-publishing/service.d.ts +264 -0
  212. package/dist/site-publishing/session-events.d.ts +22 -0
  213. package/dist/site-publishing/session-views.d.ts +36 -0
  214. package/dist/site-publishing/viewer.d.ts +40 -0
  215. package/dist/site-session-origin.d.ts +31 -6
  216. package/dist/site-sql/format.d.ts +47 -0
  217. package/dist/site-sql/gateway.d.ts +50 -0
  218. package/dist/site-sql/service.d.ts +213 -0
  219. package/dist/temporal-schedule-sync.d.ts +26 -0
  220. package/dist/transcription/billing-refusal.d.ts +8 -0
  221. package/dist/transcription/normalize.d.ts +23 -0
  222. package/dist/transcription/providers/azure-mai.d.ts +12 -0
  223. package/dist/transcription/providers/azure-openai.d.ts +4 -0
  224. package/dist/transcription/providers/openai.d.ts +16 -0
  225. package/dist/transcription/providers/subscription-core.d.ts +39 -0
  226. package/dist/transcription/service.d.ts +10 -1
  227. package/dist/transcription/wav-duration.d.ts +8 -0
  228. package/dist/workspace-tool-gateway-attestations.d.ts +37 -0
  229. package/dist/workspace-tool-gateway-observability.d.ts +16 -0
  230. package/dist/workspace-tool-gateway-secrets.d.ts +27 -0
  231. package/dist/workspace-tool-gateway.d.ts +102 -6
  232. package/dist/workspace-tool-target-fence.d.ts +116 -0
  233. package/dist/workspace-tool-target.d.ts +225 -0
  234. package/dist/workspace-webhook-dispatch.d.ts +26 -0
  235. package/dist/xai-subscription-core.d.ts +60 -0
  236. package/package.json +25 -20
  237. package/src/access-grant-rls.ts +64 -14
  238. package/src/admission-trace.ts +14 -0
  239. package/src/app.ts +1684 -252
  240. package/src/artifact-catalog-cursor.ts +1 -0
  241. package/src/attached-browser-viewer.ts +26 -0
  242. package/src/auth/managed-auth-attempt-context.ts +9 -0
  243. package/src/auth/managed-auth-rate-limits.ts +252 -0
  244. package/src/auth/managed-auth-session-adapter.ts +64 -29
  245. package/src/auth/managed-auth.ts +303 -35
  246. package/src/auth/managed-email.ts +18 -1
  247. package/src/auth/managed-sign-in-notifications.ts +81 -0
  248. package/src/auth/new-signups-gate.ts +49 -0
  249. package/src/auth/organization-user-setup.ts +3 -3
  250. package/src/auth/signup-funnel-metrics.ts +164 -0
  251. package/src/azure-live.ts +103 -0
  252. package/src/browser-action-fences.ts +45 -0
  253. package/src/browser-controller-authority.ts +1 -186
  254. package/src/browser-ephemeral.ts +39 -0
  255. package/src/browser-lost-runtime-end.ts +71 -0
  256. package/src/browser-state-authority.ts +1 -236
  257. package/src/claude-default-models.ts +37 -0
  258. package/src/claude-subscription-core.ts +154 -0
  259. package/src/claude-subscription-oauth.ts +352 -0
  260. package/src/claude-subscription-profile.ts +73 -0
  261. package/src/claude-subscription-usage.ts +51 -0
  262. package/src/claude-workspace-connection.ts +82 -0
  263. package/src/codemode.ts +236 -39
  264. package/src/codex-realtime.ts +181 -53
  265. package/src/codex-session-pointers.ts +80 -0
  266. package/src/company-brain-okf.ts +1 -1
  267. package/src/connected-machine-computer-access.ts +2 -1
  268. package/src/connection-ownership.ts +19 -13
  269. package/src/controller-data-plane.ts +34 -0
  270. package/src/credit-promotion-snapshot.ts +36 -0
  271. package/src/editable-artifact-production.ts +10 -0
  272. package/src/editable-artifact-source-session.ts +123 -0
  273. package/src/editable-artifact-websocket.ts +16 -3
  274. package/src/fatal-process-boundary.ts +67 -3
  275. package/src/gateway-realtime.ts +12 -8
  276. package/src/github-access.ts +31 -5
  277. package/src/github-browser-flow.ts +1 -1
  278. package/src/http/acting-person.ts +105 -0
  279. package/src/http/api-contract-compat.ts +49 -0
  280. package/src/http/api-error.ts +210 -2
  281. package/src/http/auth.ts +68 -4
  282. package/src/http/cors.ts +37 -5
  283. package/src/http/deprecation.ts +118 -0
  284. package/src/http/keyed-admission.ts +29 -0
  285. package/src/http/local-browser-boundary.ts +343 -0
  286. package/src/http/metrics-listener.ts +57 -0
  287. package/src/http/path-identifier.ts +54 -0
  288. package/src/http/registered-route-label.ts +34 -0
  289. package/src/http/rejection-telemetry.ts +120 -0
  290. package/src/http/request-body.ts +127 -0
  291. package/src/http/request-source.ts +154 -13
  292. package/src/http/sse.ts +88 -28
  293. package/src/http/unmatched-route.ts +60 -0
  294. package/src/http/user-content.ts +158 -0
  295. package/src/http/variable-sets-removed.ts +122 -0
  296. package/src/http/websocket-upgrade-dispatch.ts +29 -0
  297. package/src/index.ts +107 -57
  298. package/src/integration-connect-metrics.ts +228 -0
  299. package/src/integration-endpoint-test.ts +291 -0
  300. package/src/integrations/api-integrations.ts +81 -7
  301. package/src/integrations/atlassian.ts +202 -83
  302. package/src/integrations/fiken.ts +66 -38
  303. package/src/integrations/github-app-connect.ts +64 -18
  304. package/src/integrations/github-lens-connect.ts +8 -29
  305. package/src/integrations/google-drive.ts +448 -152
  306. package/src/integrations/integration-commit-authority.ts +69 -0
  307. package/src/integrations/marketplace-plugin.ts +1 -1
  308. package/src/integrations/oauth-client.ts +733 -193
  309. package/src/integrations/oauth-profiles.ts +116 -45
  310. package/src/integrations/onepassword-vault-provider.ts +16 -0
  311. package/src/integrations/personal-github-repositories.ts +1 -1
  312. package/src/integrations/personal-github.ts +61 -35
  313. package/src/integrations/provider-oauth.ts +67 -85
  314. package/src/integrations/slack-app-home.ts +5 -5
  315. package/src/integrations/slack-bot.ts +893 -201
  316. package/src/integrations/slack-file-upload-flow.ts +147 -0
  317. package/src/integrations/slack-install.ts +7 -7
  318. package/src/integrations/slack-interactions.ts +1589 -299
  319. package/src/integrations/slack-mrkdwn.ts +193 -0
  320. package/src/integrations/slack-routing.ts +2 -2
  321. package/src/integrations/slack-session-defaults.ts +224 -0
  322. package/src/integrations/slack-task-file-upload.ts +323 -0
  323. package/src/integrations/slack-tool-review.ts +65 -0
  324. package/src/integrations/social-oauth.ts +90 -58
  325. package/src/interaction-agent-access.ts +40 -20
  326. package/src/interaction-agent-version.ts +85 -0
  327. package/src/interaction-holder-heartbeat.ts +24 -8
  328. package/src/interaction-metrics.ts +164 -2
  329. package/src/interaction-route-stages.ts +94 -0
  330. package/src/interaction-secrets-vault.ts +213 -0
  331. package/src/interaction-secrets.ts +426 -0
  332. package/src/mcp/action-catalog-types.ts +14 -0
  333. package/src/mcp/action-catalog.gen.ts +8014 -0
  334. package/src/mcp/action-descriptions.ts +299 -0
  335. package/src/mcp/action-schema-imports.gen.ts +304 -0
  336. package/src/mcp/capability-account-readiness.ts +17 -0
  337. package/src/mcp/child-read-evidence.ts +19 -0
  338. package/src/mcp/company-profile-agent-admin.ts +13 -0
  339. package/src/mcp/contract-input.ts +165 -0
  340. package/src/mcp/documents.ts +9 -2
  341. package/src/mcp/editable-artifacts.ts +29 -11
  342. package/src/mcp/files.ts +5 -1
  343. package/src/mcp/first-party-tool-permissions.ts +7 -285
  344. package/src/mcp/knowledge-entries.ts +108 -34
  345. package/src/mcp/notification-tools.ts +480 -0
  346. package/src/mcp/orchestration-failure-diagnostic.ts +43 -0
  347. package/src/mcp/scheduled-task-input.ts +89 -0
  348. package/src/mcp/scheduled-task-view.ts +63 -3
  349. package/src/mcp/secret-tools.ts +185 -0
  350. package/src/mcp/server.ts +2213 -1116
  351. package/src/mcp/session-admin-access-tools.ts +163 -0
  352. package/src/mcp/session-event-errors.ts +123 -0
  353. package/src/mcp/session-event-view.ts +395 -13
  354. package/src/mcp/session-view.ts +3 -0
  355. package/src/mcp/session-wait.ts +67 -7
  356. package/src/mcp/site-agent-clamp-tools.ts +140 -0
  357. package/src/mcp/site-data-tools.ts +339 -0
  358. package/src/mcp/site-publication-tools.ts +201 -0
  359. package/src/mcp/site-sql-tools.ts +427 -0
  360. package/src/mcp-oauth.ts +635 -45
  361. package/src/model-calls/chat-completions.ts +352 -0
  362. package/src/model-calls/pending-usage-settlements.ts +125 -0
  363. package/src/model-calls/service.ts +694 -0
  364. package/src/model-catalog.ts +68 -17
  365. package/src/native-push-dispatch.ts +457 -0
  366. package/src/observability.ts +15 -1
  367. package/src/organization-mcp.ts +485 -0
  368. package/src/prepared-mcp-actor.ts +154 -0
  369. package/src/prepared-mcp-permissions.ts +38 -0
  370. package/src/routes/analytics-consent.ts +123 -0
  371. package/src/routes/api-integrations.ts +268 -9
  372. package/src/routes/api-keys.ts +164 -25
  373. package/src/routes/artifact-catalog.ts +111 -0
  374. package/src/routes/automations.ts +163 -90
  375. package/src/routes/billing.ts +535 -59
  376. package/src/routes/browser-sessions.ts +966 -342
  377. package/src/routes/canonical-human-identities.ts +61 -0
  378. package/src/routes/capabilities.ts +112 -5
  379. package/src/routes/channels.ts +4 -3
  380. package/src/routes/chat-completions.ts +235 -0
  381. package/src/routes/claude-core-usage.ts +147 -0
  382. package/src/routes/claude-subscription-accounts.ts +233 -0
  383. package/src/routes/claude-subscription-oauth.ts +175 -0
  384. package/src/routes/client-errors.ts +394 -0
  385. package/src/routes/codex-core.ts +687 -0
  386. package/src/routes/codex.ts +1277 -1119
  387. package/src/routes/company-brain.ts +4 -0
  388. package/src/routes/computer-sessions.ts +319 -85
  389. package/src/routes/connect.ts +277 -175
  390. package/src/routes/connections.ts +690 -363
  391. package/src/routes/desktop-distribution.ts +217 -0
  392. package/src/routes/documents.ts +13 -7
  393. package/src/routes/editable-artifacts.ts +74 -4
  394. package/src/routes/enrollments.ts +110 -16
  395. package/src/routes/external-identity-links.ts +13 -12
  396. package/src/routes/files.ts +41 -16
  397. package/src/routes/github-browser-fonts.gen.ts +12 -0
  398. package/src/routes/github-browser-pages.ts +258 -0
  399. package/src/routes/github.ts +200 -75
  400. package/src/routes/inbox.ts +353 -0
  401. package/src/routes/insights-response-cache.ts +83 -0
  402. package/src/routes/insights-usage.ts +345 -0
  403. package/src/routes/insights.ts +103 -8
  404. package/src/routes/install.ts +51 -10
  405. package/src/routes/integration-facets.ts +70 -28
  406. package/src/routes/interaction-placement-message.ts +12 -0
  407. package/src/routes/knowledge.ts +136 -27
  408. package/src/routes/machines.ts +189 -135
  409. package/src/routes/managed-auth-session-sets.ts +43 -10
  410. package/src/routes/managed-onboarding.ts +39 -19
  411. package/src/routes/managed-sign-in-methods.ts +433 -0
  412. package/src/routes/memory-slack-publications.ts +3 -2
  413. package/src/routes/model-account-choice.ts +194 -0
  414. package/src/routes/model-account-settings.ts +235 -0
  415. package/src/routes/model-connection-access.ts +210 -48
  416. package/src/routes/native-app-auth.ts +296 -0
  417. package/src/routes/organization-integration-policy.ts +116 -0
  418. package/src/routes/organization-integrations.ts +326 -0
  419. package/src/routes/organization-mcp-connections.ts +183 -0
  420. package/src/routes/organization-memberships.ts +205 -19
  421. package/src/routes/organization-model-defaults.ts +110 -0
  422. package/src/routes/organization-model-providers.ts +74 -3
  423. package/src/routes/organization-service-accounts.ts +128 -0
  424. package/src/routes/organization-sessions.ts +21 -5
  425. package/src/routes/personal-api-keys.ts +184 -0
  426. package/src/routes/personal-github-git-broker.ts +2 -2
  427. package/src/routes/personal-github.ts +9 -4
  428. package/src/routes/plugins.ts +46 -7
  429. package/src/routes/pr-review-github.ts +105 -118
  430. package/src/routes/pr-review.ts +88 -82
  431. package/src/routes/preference-registry.ts +18 -0
  432. package/src/routes/rigs.ts +48 -13
  433. package/src/routes/scheduled-tasks.ts +347 -27
  434. package/src/routes/session-admin-access.ts +271 -0
  435. package/src/routes/session-artifact-associations.ts +164 -0
  436. package/src/routes/session-history-imports.ts +305 -0
  437. package/src/routes/sessions.ts +1682 -363
  438. package/src/routes/site-data.ts +340 -0
  439. package/src/routes/site-publishing.ts +584 -0
  440. package/src/routes/site-runtime.ts +1944 -0
  441. package/src/routes/site-sql.ts +263 -0
  442. package/src/routes/skill-content.ts +72 -7
  443. package/src/routes/skills.ts +5 -4
  444. package/src/routes/slack-bot-access.ts +108 -0
  445. package/src/routes/social.ts +27 -15
  446. package/src/routes/subscription-account-pools.ts +209 -0
  447. package/src/routes/subscription-core-http.ts +18 -0
  448. package/src/routes/subscription-pool-access.ts +180 -0
  449. package/src/routes/subscription-pool-core.ts +552 -0
  450. package/src/routes/supergrok.ts +174 -655
  451. package/src/routes/transcription-recordings.ts +71 -4
  452. package/src/routes/transcriptions.ts +26 -2
  453. package/src/routes/usage-allowances.ts +381 -0
  454. package/src/routes/variable-sets-removed.ts +19 -0
  455. package/src/routes/vault-providers.ts +782 -0
  456. package/src/routes/vaults.ts +421 -0
  457. package/src/routes/video-generation.ts +30 -12
  458. package/src/routes/workspace-artifacts.ts +165 -53
  459. package/src/routes/workspace-integrations.ts +576 -0
  460. package/src/routes/workspace-model-providers.ts +148 -0
  461. package/src/routes/workspace-state.ts +4 -0
  462. package/src/routes/workspaces.ts +625 -117
  463. package/src/sandbox/agent-update.ts +315 -0
  464. package/src/sandbox/auth-callout.ts +104 -21
  465. package/src/sandbox/channel-a.ts +150 -49
  466. package/src/sandbox/enrollment.ts +131 -22
  467. package/src/sandbox/machine-audience.ts +192 -0
  468. package/src/sandbox/machines.ts +75 -31
  469. package/src/sandbox/metrics-ingestion.ts +133 -2
  470. package/src/sandbox/rematerialize.ts +51 -21
  471. package/src/sandbox/screen-control.ts +289 -0
  472. package/src/sandbox/viewer.ts +33 -58
  473. package/src/sandbox-file-artifacts.ts +53 -27
  474. package/src/scheduled-task-blockers.ts +293 -0
  475. package/src/scheduled-task-deletion.ts +13 -3
  476. package/src/scheduled-task-lifecycle.ts +84 -0
  477. package/src/secret-answers.ts +119 -0
  478. package/src/session-create-observability.ts +46 -0
  479. package/src/session-realtime-context.ts +26 -4
  480. package/src/signed-state-secret.ts +58 -0
  481. package/src/site-agent-guard.ts +261 -0
  482. package/src/site-data/operations.ts +777 -0
  483. package/src/site-data/service.ts +1043 -0
  484. package/src/site-frame-guard.ts +107 -0
  485. package/src/site-publishing/agent-data-tools.ts +250 -0
  486. package/src/site-publishing/agent-model.ts +127 -0
  487. package/src/site-publishing/agent-session.ts +148 -0
  488. package/src/site-publishing/content-scanner.ts +93 -0
  489. package/src/site-publishing/edge-sync.ts +148 -0
  490. package/src/site-publishing/gateway-signature.ts +198 -0
  491. package/src/site-publishing/limits.ts +315 -0
  492. package/src/site-publishing/page-tool-authority.ts +111 -0
  493. package/src/site-publishing/platform-usage.ts +479 -0
  494. package/src/site-publishing/platform.ts +98 -0
  495. package/src/site-publishing/readiness.ts +330 -0
  496. package/src/site-publishing/runtime.ts +831 -0
  497. package/src/site-publishing/service.ts +1282 -0
  498. package/src/site-publishing/session-events.ts +262 -0
  499. package/src/site-publishing/session-views.ts +262 -0
  500. package/src/site-publishing/viewer.ts +75 -0
  501. package/src/site-session-origin.ts +91 -6
  502. package/src/site-sql/format.ts +134 -0
  503. package/src/site-sql/gateway.ts +168 -0
  504. package/src/site-sql/service.ts +1636 -0
  505. package/src/site-uploads.ts +27 -5
  506. package/src/temporal-schedule-sync.ts +74 -0
  507. package/src/transcription/billing-refusal.ts +14 -0
  508. package/src/transcription/normalize.ts +77 -0
  509. package/src/transcription/providers/azure-mai.ts +98 -0
  510. package/src/transcription/providers/azure-openai.ts +16 -7
  511. package/src/transcription/providers/codex-subscription.ts +190 -67
  512. package/src/transcription/providers/openai.ts +79 -5
  513. package/src/transcription/providers/subscription-core.ts +125 -0
  514. package/src/transcription/providers/xai-subscription.ts +81 -83
  515. package/src/transcription/segmenter.ts +7 -1
  516. package/src/transcription/service.ts +239 -10
  517. package/src/transcription/wav-duration.ts +39 -0
  518. package/src/workspace-deletion.ts +25 -1
  519. package/src/workspace-tool-gateway-attestations.ts +133 -0
  520. package/src/workspace-tool-gateway-observability.ts +64 -0
  521. package/src/workspace-tool-gateway-secrets.ts +104 -0
  522. package/src/workspace-tool-gateway.ts +921 -103
  523. package/src/workspace-tool-target-fence.ts +380 -0
  524. package/src/workspace-tool-target.ts +554 -0
  525. package/src/workspace-webhook-dispatch.ts +225 -0
  526. package/src/xai-realtime.ts +85 -81
  527. package/src/xai-subscription-core.ts +172 -0
  528. package/dist/browser-auth-broker.d.ts +0 -20
  529. package/dist/chunk-AJ62T5QN.js.map +0 -1
  530. package/dist/connection-authority-owner.d.ts +0 -59
  531. package/dist/routes/connection-authorities.d.ts +0 -3
  532. package/dist/routes/environments.d.ts +0 -5
  533. package/dist/routes/host-mcp-bindings.d.ts +0 -5
  534. package/dist/routes/host-mcp-resolvers.d.ts +0 -3
  535. package/dist/routes/packs.d.ts +0 -3
  536. package/dist/session-event-view-MU3HMNV3.js +0 -264
  537. package/dist/session-event-view-MU3HMNV3.js.map +0 -1
  538. package/dist/xai-subscription-auth.d.ts +0 -23
  539. package/src/browser-auth-broker.ts +0 -155
  540. package/src/connection-authority-owner.ts +0 -61
  541. package/src/routes/connection-authorities.ts +0 -139
  542. package/src/routes/environments.ts +0 -388
  543. package/src/routes/host-mcp-bindings.ts +0 -122
  544. package/src/routes/host-mcp-resolvers.ts +0 -41
  545. package/src/routes/packs.ts +0 -784
  546. package/src/xai-subscription-auth.ts +0 -139
@@ -2,6 +2,10 @@ import {
2
2
  CreateApiKeyRequest,
3
3
  CreateApiKeyResponse,
4
4
  CreateOrganizationApiKeyRequest,
5
+ UpdateOrganizationApiKeyRequest,
6
+ normalizeOrganizationAccessPolicy,
7
+ type OrganizationAccessPolicy,
8
+ DEVELOPER_SETUP_API_KEY_PRESET,
5
9
  Permission,
6
10
  type AccessContext,
7
11
  type ApiKey,
@@ -12,7 +16,12 @@ import {
12
16
  createOrganizationApiKey as createOrganizationApiKeyRecord,
13
17
  listApiKeys,
14
18
  listOrganizationApiKeys,
19
+ getOrganizationApiKey,
20
+ updateOrganizationApiKey,
21
+ OrganizationApiKeyWorkspaceScopeError,
15
22
  OrganizationApiKeyLimitExceededError,
23
+ OrganizationServiceAccountNotFoundError,
24
+ OrganizationServiceAccountRoleError,
16
25
  revokeApiKey,
17
26
  revokeOrganizationApiKey,
18
27
  } from "@opengeni/db";
@@ -23,13 +32,19 @@ import { HTTPException } from "hono/http-exception";
23
32
  import type { ApiRouteDeps } from "@opengeni/core";
24
33
  import {
25
34
  accountScopedApiKeyWorkspaceAuthority,
35
+ organizationApiKeyAccess,
36
+ hasPermission,
37
+ organizationWorkspaceInScope,
26
38
  requireAccessContext,
27
- requireAccessGrant,
28
39
  requireAccessGrantAuthorization,
40
+ requireApiKeyManagementContext,
41
+ requireExplicitPermissionDelegation,
29
42
  type AccessGrantAuthorization,
30
43
  } from "@opengeni/core";
31
44
  import { requireLimit } from "@opengeni/core";
32
45
 
46
+ export { organizationApiKeyAccess } from "@opengeni/core";
47
+
33
48
  /** Permissions minted onto a `full` organization API key. */
34
49
  export const organizationApiKeyPermissions: Permission[] = [
35
50
  "account:read",
@@ -55,28 +70,43 @@ export const organizationReadApiKeyPermissions: Permission[] = [
55
70
  export function organizationApiKeyPermissionsForAccess(
56
71
  access: OrganizationApiKeyAccess,
57
72
  ): Permission[] {
58
- return access === "read"
59
- ? [...organizationReadApiKeyPermissions]
60
- : [...organizationApiKeyPermissions];
73
+ return access === "developer_setup"
74
+ ? [...DEVELOPER_SETUP_API_KEY_PRESET.permissions]
75
+ : access === "read"
76
+ ? [...organizationReadApiKeyPermissions]
77
+ : [...organizationApiKeyPermissions];
61
78
  }
62
79
 
63
- /**
64
- * The access tier is derived from stored permissions rather than a column: a
65
- * key that carries the `workspace:admin` wildcard administers the
66
- * organization, any other organization key is read-only.
67
- */
68
- export function organizationApiKeyAccess(permissions: Permission[]): OrganizationApiKeyAccess {
69
- return permissions.includes("workspace:admin") ? "full" : "read";
80
+ /** Existing callers retain their expiry; setup keys default to one day. */
81
+ export function organizationApiKeyExpiryDate(
82
+ request: Pick<CreateOrganizationApiKeyRequest, "preset" | "expiresAt"> &
83
+ Partial<Pick<CreateOrganizationApiKeyRequest, "access">>,
84
+ now: Date = new Date(),
85
+ ): Date | null {
86
+ if (request.expiresAt !== undefined) return new Date(request.expiresAt);
87
+ return request.preset === "developer_setup" || request.access === "developer_setup"
88
+ ? new Date(now.getTime() + DEVELOPER_SETUP_API_KEY_PRESET.defaultExpiryHours * 60 * 60 * 1000)
89
+ : null;
70
90
  }
71
91
 
72
92
  function withOrganizationApiKeyAccess(apiKey: ApiKey): ApiKey {
73
- return { ...apiKey, access: organizationApiKeyAccess(apiKey.permissions) };
93
+ const workspaceScope = apiKey.workspaceScope ?? { kind: "all" as const };
94
+ return {
95
+ ...apiKey,
96
+ access: organizationApiKeyAccess(apiKey.permissions),
97
+ workspaceScope,
98
+ policy: normalizeOrganizationAccessPolicy({
99
+ preset: "custom",
100
+ permissions: apiKey.permissions,
101
+ workspaceScope,
102
+ }),
103
+ };
74
104
  }
75
105
 
76
106
  export function registerApiKeyRoutes(app: Hono, deps: ApiRouteDeps): void {
77
107
  app.get("/v1/workspaces/:workspaceId/api-keys", async (c) => {
78
108
  const workspaceId = c.req.param("workspaceId");
79
- await requireAccessGrant(c, deps, workspaceId, "api_keys:manage");
109
+ await requireWorkspaceApiKeyControl(c, deps, workspaceId);
80
110
  return c.json({ apiKeys: await listApiKeys(deps.db, workspaceId) });
81
111
  });
82
112
 
@@ -85,12 +115,7 @@ export function registerApiKeyRoutes(app: Hono, deps: ApiRouteDeps): void {
85
115
  zValidator("json", CreateApiKeyRequest.omit({ workspaceId: true })),
86
116
  async (c) => {
87
117
  const workspaceId = c.req.param("workspaceId");
88
- const authorization = await requireAccessGrantAuthorization(
89
- c,
90
- deps,
91
- workspaceId,
92
- "api_keys:manage",
93
- );
118
+ const authorization = await requireWorkspaceApiKeyControl(c, deps, workspaceId);
94
119
  const grant = authorization.grant;
95
120
  const body = c.req.valid("json");
96
121
  const permissions: Permission[] =
@@ -120,7 +145,7 @@ export function registerApiKeyRoutes(app: Hono, deps: ApiRouteDeps): void {
120
145
 
121
146
  app.delete("/v1/workspaces/:workspaceId/api-keys/:apiKeyId", async (c) => {
122
147
  const workspaceId = c.req.param("workspaceId");
123
- await requireAccessGrant(c, deps, workspaceId, "api_keys:manage");
148
+ await requireWorkspaceApiKeyControl(c, deps, workspaceId);
124
149
  return c.json(await revokeApiKey(deps.db, workspaceId, c.req.param("apiKeyId")));
125
150
  });
126
151
 
@@ -143,7 +168,26 @@ export function registerApiKeyRoutes(app: Hono, deps: ApiRouteDeps): void {
143
168
  const context = await requireAccessContext(c, deps);
144
169
  requireOrganizationApiKeyControlPermission(context, organizationId);
145
170
  const body = c.req.valid("json");
171
+ const rawBody: Record<string, unknown> = await c.req.json();
172
+ if (body.policy && (rawBody.access !== undefined || rawBody.preset !== undefined))
173
+ throw new HTTPException(400, {
174
+ message: "Choose either a policy or a legacy access tier/preset",
175
+ });
146
176
  const token = generateApiKeyToken();
177
+ const permissions =
178
+ body.policy?.permissions ??
179
+ (body.preset === "developer_setup"
180
+ ? [...DEVELOPER_SETUP_API_KEY_PRESET.permissions]
181
+ : organizationApiKeyPermissionsForAccess(body.access));
182
+ ensureOrganizationPolicyDelegable(
183
+ context,
184
+ body.policy ?? {
185
+ preset: "custom",
186
+ permissions,
187
+ workspaceScope: { kind: "all" },
188
+ },
189
+ !body.policy,
190
+ );
147
191
  try {
148
192
  const apiKey = await createOrganizationApiKeyRecord(deps.db, {
149
193
  accountId: organizationId,
@@ -151,10 +195,13 @@ export function registerApiKeyRoutes(app: Hono, deps: ApiRouteDeps): void {
151
195
  description: body.description ?? null,
152
196
  prefix: token.slice(0, 14),
153
197
  keyHash: await sha256Hex(token),
154
- permissions: organizationApiKeyPermissionsForAccess(body.access),
155
- expiresAt: body.expiresAt ? new Date(body.expiresAt) : null,
198
+ permissions,
199
+ ...(body.policy ? { policy: body.policy } : {}),
200
+ expiresAt: organizationApiKeyExpiryDate(body),
156
201
  maxActiveKeys: organizationApiKeyLimit(deps),
157
202
  rotationSourceApiKeyId: authenticatedApiKeyId(context),
203
+ serviceAccountId: body.serviceAccountId ?? null,
204
+ createdBySubjectId: context.subjectId,
158
205
  });
159
206
  return c.json(
160
207
  CreateApiKeyResponse.parse({ apiKey: withOrganizationApiKeyAccess(apiKey), token }),
@@ -164,6 +211,44 @@ export function registerApiKeyRoutes(app: Hono, deps: ApiRouteDeps): void {
164
211
  if (error instanceof OrganizationApiKeyLimitExceededError) {
165
212
  throw new HTTPException(429, { message: error.message });
166
213
  }
214
+ if (error instanceof OrganizationApiKeyWorkspaceScopeError)
215
+ throw new HTTPException(400, { message: error.message });
216
+ throwServiceAccountError(error);
217
+ throw error;
218
+ }
219
+ },
220
+ );
221
+
222
+ app.get("/v1/organizations/:organizationId/api-keys/:apiKeyId", async (c) => {
223
+ const organizationId = c.req.param("organizationId");
224
+ requireOrganizationApiKeyControlPermission(await requireAccessContext(c, deps), organizationId);
225
+ const apiKey = await getOrganizationApiKey(deps.db, organizationId, c.req.param("apiKeyId"));
226
+ if (!apiKey) throw new HTTPException(404, { message: "API key not found" });
227
+ return c.json(withOrganizationApiKeyAccess(apiKey));
228
+ });
229
+
230
+ app.patch(
231
+ "/v1/organizations/:organizationId/api-keys/:apiKeyId",
232
+ zValidator("json", UpdateOrganizationApiKeyRequest),
233
+ async (c) => {
234
+ const organizationId = c.req.param("organizationId");
235
+ const context = await requireAccessContext(c, deps);
236
+ requireOrganizationApiKeyControlPermission(context, organizationId);
237
+ const body = c.req.valid("json");
238
+ if (body.policy) ensureOrganizationPolicyDelegable(context, body.policy);
239
+ try {
240
+ const apiKey = await updateOrganizationApiKey(
241
+ deps.db,
242
+ organizationId,
243
+ c.req.param("apiKeyId"),
244
+ body,
245
+ );
246
+ if (!apiKey) throw new HTTPException(404, { message: "API key not found" });
247
+ return c.json(withOrganizationApiKeyAccess(apiKey));
248
+ } catch (error) {
249
+ if (error instanceof OrganizationApiKeyWorkspaceScopeError)
250
+ throw new HTTPException(400, { message: error.message });
251
+ throwServiceAccountError(error);
167
252
  throw error;
168
253
  }
169
254
  },
@@ -181,6 +266,14 @@ export function registerApiKeyRoutes(app: Hono, deps: ApiRouteDeps): void {
181
266
  });
182
267
  }
183
268
 
269
+ /** Service account problems read as the person would expect. */
270
+ export function throwServiceAccountError(error: unknown): void {
271
+ if (error instanceof OrganizationServiceAccountNotFoundError)
272
+ throw new HTTPException(404, { message: error.message });
273
+ if (error instanceof OrganizationServiceAccountRoleError)
274
+ throw new HTTPException(400, { message: error.message });
275
+ }
276
+
184
277
  function requireAccountPermission(
185
278
  context: AccessContext,
186
279
  accountId: string,
@@ -199,8 +292,12 @@ function ensureDelegablePermissions(
199
292
  authorization: AccessGrantAuthorization,
200
293
  requested: Permission[],
201
294
  ): void {
295
+ requireExplicitPermissionDelegation(authorization.grant, requested);
202
296
  const grantPermissions = authorization.grant.permissions;
203
- if (grantPermissions.includes("workspace:admin")) {
297
+ if (
298
+ grantPermissions.includes("workspace:admin") &&
299
+ authorization.grant.permissionMode !== "explicit"
300
+ ) {
204
301
  const accountLiteralPermissions = new Set<Permission>([
205
302
  "account:read",
206
303
  "account:admin",
@@ -228,22 +325,64 @@ function ensureDelegablePermissions(
228
325
  }
229
326
  }
230
327
 
231
- function requireOrganizationApiKeyControlPermission(
328
+ /** Key management is not a way for a policy credential to amplify itself. */
329
+ function ensureOrganizationPolicyDelegable(
330
+ context: AccessContext,
331
+ policy: OrganizationAccessPolicy,
332
+ legacy = false,
333
+ ): void {
334
+ const authority = accountScopedApiKeyWorkspaceAuthority(context);
335
+ const source = context.credential?.policy;
336
+ if (!authority || authority.permissionMode !== "explicit" || !source) return;
337
+ const requested = legacy
338
+ ? Permission.options.filter((permission) => hasPermission(policy.permissions, permission))
339
+ : policy.permissions;
340
+ if (requested.some((permission) => !source.permissions.includes(permission)))
341
+ throw new HTTPException(403, {
342
+ message: "cannot delegate permissions beyond organization key policy",
343
+ });
344
+ if (
345
+ source.workspaceScope.kind === "selected" &&
346
+ (policy.workspaceScope.kind === "all" ||
347
+ policy.workspaceScope.workspaceIds.some(
348
+ (id) => !organizationWorkspaceInScope(source.workspaceScope, id),
349
+ ))
350
+ )
351
+ throw new HTTPException(403, {
352
+ message: "cannot delegate workspaces beyond organization key scope",
353
+ });
354
+ }
355
+
356
+ export function requireOrganizationApiKeyControlPermission(
232
357
  context: AccessContext,
233
358
  organizationId: string,
234
359
  ): void {
360
+ requireApiKeyManagementContext(context);
235
361
  requireAccountPermission(context, organizationId, "api_keys:manage");
236
362
  if (!context.subjectId.startsWith("api_key:")) return;
237
363
  const authority = accountScopedApiKeyWorkspaceAuthority(context);
238
364
  if (
239
365
  !authority ||
240
366
  authority.accountId !== organizationId ||
241
- !authority.permissions.includes("api_keys:manage")
367
+ (!authority.permissions.includes("api_keys:manage") &&
368
+ !context.accountGrants.some(
369
+ (grant) =>
370
+ grant.accountId === organizationId && grant.permissions.includes("account:admin"),
371
+ ))
242
372
  ) {
243
373
  throw new HTTPException(403, { message: "organization API key authority required" });
244
374
  }
245
375
  }
246
376
 
377
+ async function requireWorkspaceApiKeyControl(
378
+ c: Parameters<typeof requireAccessContext>[0],
379
+ deps: ApiRouteDeps,
380
+ workspaceId: string,
381
+ ): Promise<AccessGrantAuthorization> {
382
+ requireApiKeyManagementContext(await requireAccessContext(c, deps));
383
+ return await requireAccessGrantAuthorization(c, deps, workspaceId, "api_keys:manage");
384
+ }
385
+
247
386
  function authenticatedApiKeyId(context: AccessContext): string | null {
248
387
  return context.subjectId.startsWith("api_key:")
249
388
  ? context.subjectId.slice("api_key:".length)
@@ -4,6 +4,8 @@ import {
4
4
  ArtifactCatalogKind,
5
5
  ArtifactCatalogListQuery,
6
6
  ArtifactCatalogListResponse,
7
+ ArtifactPinResponse,
8
+ UpdateArtifactPinRequest,
7
9
  retainedArtifactReferenceFromFile,
8
10
  retainedGeneratedImageReferenceFromFile,
9
11
  type AccessGrant,
@@ -19,13 +21,17 @@ import {
19
21
  requireSessionAuthorization,
20
22
  SessionAuthorizationDeniedError,
21
23
  SessionAuthorizationUnavailableError,
24
+ siteViewerForGrant,
22
25
  type ApiRouteDeps,
23
26
  } from "@opengeni/core";
24
27
  import {
25
28
  getFilesForSubject,
26
29
  getGeneratedImageArtifact,
27
30
  getSessionAuthorityProjection,
31
+ isWorkspaceArtifactVisible,
28
32
  listArtifactCatalogCandidates,
33
+ nestedPostgresSqlState,
34
+ updateArtifactPin,
29
35
  withSessionRlsActorContext,
30
36
  type ArtifactCatalogCandidate,
31
37
  type ArtifactCatalogPosition,
@@ -33,6 +39,7 @@ import {
33
39
  } from "@opengeni/db";
34
40
  import type { Hono } from "hono";
35
41
  import { HTTPException } from "hono/http-exception";
42
+ import { z } from "zod";
36
43
  import { artifactCatalogCursorCodec } from "../artifact-catalog-cursor";
37
44
  import {
38
45
  editableArtifactActorForGrant,
@@ -51,9 +58,106 @@ const position = (row: ArtifactCatalogCandidate): ArtifactCatalogPosition => ({
51
58
  key: row.sort_key,
52
59
  kind: row.kind,
53
60
  id: row.id,
61
+ pinned: row.pinned ?? false,
54
62
  });
55
63
 
56
64
  export function registerArtifactCatalogRoutes(app: Hono, deps: Dependencies): void {
65
+ app.put("/v1/workspaces/:workspaceId/artifact-catalog/:kind/:artifactId/pin", async (context) => {
66
+ const workspaceId = context.req.param("workspaceId");
67
+ const authorization = await requireAccessGrantAuthorization(
68
+ context,
69
+ deps,
70
+ workspaceId,
71
+ "artifacts:publish",
72
+ );
73
+ const grant = authorization.grant;
74
+ if (!hasPermission(grant.permissions, "artifacts:publish"))
75
+ throw new HTTPException(403, { message: "Artifact publish access required" });
76
+ const kind = ArtifactCatalogKind.safeParse(context.req.param("kind"));
77
+ const body = UpdateArtifactPinRequest.safeParse(await context.req.json().catch(() => null));
78
+ const requestedId = context.req.param("artifactId");
79
+ if (
80
+ !kind.success ||
81
+ !body.success ||
82
+ !(editableKinds.has(kind.data)
83
+ ? /^[0-9a-f]{32}$/.test(requestedId)
84
+ : z.string().uuid().safeParse(requestedId).success)
85
+ )
86
+ throw new HTTPException(422, { message: "Invalid artifact pin request" });
87
+ const artifactId = editableKinds.has(kind.data) ? requestedId : requestedId.toLowerCase();
88
+ const fileKind = kind.data === "file" || kind.data === "image";
89
+ if (!hasPermission(grant.permissions, fileKind ? "files:read" : "artifacts:read"))
90
+ throw new HTTPException(403, { message: "Artifact read access required" });
91
+ const actor = fileKind
92
+ ? await fileOwnerContextForAccess(deps, authorization, "files:read")
93
+ : { subjectId: grant.subjectId, privateFileOwnerSubjectId: null };
94
+ context.header("cache-control", "private, no-store");
95
+ return withSessionRlsActorContext(actor, async () => {
96
+ if (editableKinds.has(kind.data)) {
97
+ if (!deps.editableArtifacts)
98
+ throw new HTTPException(503, { message: "Editable artifacts are unavailable" });
99
+ try {
100
+ const scope = editableArtifactScope({ accountId: grant.accountId, workspaceId });
101
+ const artifact = await deps.editableArtifacts.readArtifact({
102
+ scope,
103
+ actor: editableArtifactActorForGrant(grant, "0000000000000001"),
104
+ artifactId: editableArtifactId(artifactId),
105
+ });
106
+ if (
107
+ artifact.scope.accountId !== scope.accountId ||
108
+ artifact.scope.workspaceId !== scope.workspaceId ||
109
+ artifact.id !== artifactId ||
110
+ artifact.modality !== kind.data
111
+ )
112
+ throw new HTTPException(404, { message: "Artifact not found" });
113
+ } catch (error) {
114
+ if (isInvisibleListCandidate(error))
115
+ throw new HTTPException(404, { message: "Artifact not found" });
116
+ throw editableArtifactHttpError(error);
117
+ }
118
+ }
119
+ // An Only me Site someone else owns answers exactly like a missing one.
120
+ if (
121
+ kind.data === "site" &&
122
+ !(await isWorkspaceArtifactVisible(
123
+ deps.db,
124
+ workspaceId,
125
+ await siteViewerForGrant(deps.db, grant),
126
+ artifactId,
127
+ ))
128
+ )
129
+ throw new HTTPException(404, { message: "Artifact not found" });
130
+ if (fileKind) {
131
+ const subjectId = await fileAuthoritySubjectIdForGrant(deps, grant);
132
+ const [file] = await getFilesForSubject(deps.db, {
133
+ accountId: grant.accountId,
134
+ workspaceId,
135
+ subjectId,
136
+ fileIds: [artifactId],
137
+ });
138
+ if (!file || file.status !== "ready")
139
+ throw new HTTPException(404, { message: "Artifact not found" });
140
+ }
141
+ try {
142
+ await updateArtifactPin(
143
+ deps.db,
144
+ { accountId: grant.accountId, workspaceId },
145
+ {
146
+ kind: kind.data,
147
+ artifactId,
148
+ pinned: body.data.pinned,
149
+ },
150
+ );
151
+ } catch (error) {
152
+ if (nestedPostgresSqlState(error) === "42501")
153
+ throw new HTTPException(404, { message: "Artifact not found" });
154
+ throw error;
155
+ }
156
+ return context.json(
157
+ ArtifactPinResponse.parse({ kind: kind.data, artifactId, pinned: body.data.pinned }),
158
+ );
159
+ });
160
+ });
57
161
  app.get("/v1/workspaces/:workspaceId/artifact-catalog", async (context) => {
58
162
  const workspaceId = context.req.param("workspaceId");
59
163
  const authorization = await requireAccessGrantAuthorization(context, deps, workspaceId);
@@ -156,6 +260,9 @@ export function registerArtifactCatalogRoutes(app: Hono, deps: Dependencies): vo
156
260
  let lastReturned: ArtifactCatalogPosition | undefined;
157
261
  let nextCursor: string | null = null;
158
262
  const fileSubject = includesFiles ? await fileAuthoritySubjectIdForGrant(deps, grant) : null;
263
+ const siteViewer = kinds.includes("site")
264
+ ? await siteViewerForGrant(deps.db, grant)
265
+ : { subjectId: null };
159
266
  for (let batch = 0; batch < MAX_BATCHES; batch++) {
160
267
  const candidates = await listArtifactCatalogCandidates(
161
268
  deps.db,
@@ -163,6 +270,7 @@ export function registerArtifactCatalogRoutes(app: Hono, deps: Dependencies): vo
163
270
  {
164
271
  query,
165
272
  kinds,
273
+ siteViewer,
166
274
  snapshotAt,
167
275
  ...(after ? { after } : {}),
168
276
  limit: CANDIDATE_BATCH,
@@ -210,8 +318,11 @@ async function projectCandidate(
210
318
  status: row.status,
211
319
  createdAt: iso(row.created_at),
212
320
  updatedAt: iso(row.updated_at),
321
+ ...(row.pinned !== undefined ? { pinned: row.pinned } : {}),
213
322
  };
214
323
  if (row.version_id) item.versionId = row.version_id;
324
+ if (row.kind === "site")
325
+ item.visibility = row.site_visibility === "user_private" ? "private" : "workspace";
215
326
  if (editableKinds.has(row.kind)) {
216
327
  const scope = editableArtifactScope({
217
328
  accountId: grant.accountId,