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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (546) hide show
  1. package/dist/access-grant-rls.d.ts +8 -1
  2. package/dist/admission-trace.d.ts +8 -0
  3. package/dist/app.d.ts +50 -3
  4. package/dist/app.js +10 -1
  5. package/dist/artifact-catalog-cursor.d.ts +1 -0
  6. package/dist/attached-browser-viewer.d.ts +11 -0
  7. package/dist/auth/managed-auth-attempt-context.d.ts +2 -0
  8. package/dist/auth/managed-auth-rate-limits.d.ts +167 -0
  9. package/dist/auth/managed-auth-session-adapter.d.ts +9 -1
  10. package/dist/auth/managed-auth.d.ts +72 -5
  11. package/dist/auth/managed-sign-in-notifications.d.ts +4 -0
  12. package/dist/auth/new-signups-gate.d.ts +23 -0
  13. package/dist/auth/signup-funnel-metrics.d.ts +44 -0
  14. package/dist/azure-live.d.ts +28 -0
  15. package/dist/browser-action-fences.d.ts +13 -0
  16. package/dist/browser-controller-authority.d.ts +1 -61
  17. package/dist/browser-ephemeral.d.ts +5 -0
  18. package/dist/browser-lost-runtime-end.d.ts +24 -0
  19. package/dist/browser-state-authority.d.ts +1 -27
  20. package/dist/{chunk-AJ62T5QN.js → chunk-GBUJ2DYZ.js} +80507 -39878
  21. package/dist/chunk-GBUJ2DYZ.js.map +1 -0
  22. package/dist/chunk-OGQDXVXY.js +18 -0
  23. package/dist/chunk-OGQDXVXY.js.map +1 -0
  24. package/dist/claude-default-models.d.ts +19 -0
  25. package/dist/claude-subscription-core.d.ts +50 -0
  26. package/dist/claude-subscription-oauth.d.ts +36 -0
  27. package/dist/claude-subscription-profile.d.ts +9 -0
  28. package/dist/claude-subscription-usage.d.ts +6 -0
  29. package/dist/claude-workspace-connection.d.ts +15 -0
  30. package/dist/codemode.d.ts +40 -5
  31. package/dist/codex-realtime.d.ts +29 -3
  32. package/dist/codex-session-pointers.d.ts +19 -0
  33. package/dist/connection-ownership.d.ts +6 -3
  34. package/dist/controller-data-plane.d.ts +16 -0
  35. package/dist/credit-promotion-snapshot.d.ts +6 -0
  36. package/dist/editable-artifact-source-session.d.ts +3 -0
  37. package/dist/editable-artifact-websocket.d.ts +5 -3
  38. package/dist/fatal-process-boundary.d.ts +9 -1
  39. package/dist/github-access.d.ts +7 -1
  40. package/dist/github-browser-flow.d.ts +1 -1
  41. package/dist/http/acting-person.d.ts +36 -0
  42. package/dist/http/api-contract-compat.d.ts +19 -0
  43. package/dist/http/api-error.d.ts +50 -1
  44. package/dist/http/auth.d.ts +8 -1
  45. package/dist/http/cors.d.ts +12 -0
  46. package/dist/http/deprecation.d.ts +42 -0
  47. package/dist/http/keyed-admission.d.ts +12 -0
  48. package/dist/http/local-browser-boundary.d.ts +72 -0
  49. package/dist/http/metrics-listener.d.ts +22 -0
  50. package/dist/http/path-identifier.d.ts +17 -0
  51. package/dist/http/registered-route-label.d.ts +16 -0
  52. package/dist/http/rejection-telemetry.d.ts +34 -0
  53. package/dist/http/request-body.d.ts +27 -0
  54. package/dist/http/request-source.d.ts +41 -3
  55. package/dist/http/sse.d.ts +12 -1
  56. package/dist/http/unmatched-route.d.ts +18 -0
  57. package/dist/http/user-content.d.ts +36 -0
  58. package/dist/http/variable-sets-removed.d.ts +41 -0
  59. package/dist/http/websocket-upgrade-dispatch.d.ts +18 -0
  60. package/dist/index.js +1279 -108
  61. package/dist/index.js.map +1 -1
  62. package/dist/integration-connect-metrics.d.ts +35 -0
  63. package/dist/integration-endpoint-test.d.ts +20 -0
  64. package/dist/integrations/api-integrations.d.ts +2 -2
  65. package/dist/integrations/atlassian.d.ts +8 -3
  66. package/dist/integrations/fiken.d.ts +3 -1
  67. package/dist/integrations/github-lens-connect.d.ts +37 -66
  68. package/dist/integrations/google-drive.d.ts +2 -0
  69. package/dist/integrations/integration-commit-authority.d.ts +13 -0
  70. package/dist/integrations/marketplace-plugin.d.ts +43 -43
  71. package/dist/integrations/oauth-client.d.ts +171 -12
  72. package/dist/integrations/oauth-profiles.d.ts +42 -13
  73. package/dist/integrations/onepassword-vault-provider.d.ts +9 -0
  74. package/dist/integrations/slack-bot.d.ts +285 -7
  75. package/dist/integrations/slack-file-upload-flow.d.ts +62 -0
  76. package/dist/integrations/slack-interactions.d.ts +89 -10
  77. package/dist/integrations/slack-mrkdwn.d.ts +41 -0
  78. package/dist/integrations/slack-routing.d.ts +1 -1
  79. package/dist/integrations/slack-session-defaults.d.ts +58 -0
  80. package/dist/integrations/slack-task-file-upload.d.ts +36 -0
  81. package/dist/integrations/slack-tool-review.d.ts +5 -0
  82. package/dist/interaction-agent-access.d.ts +13 -8
  83. package/dist/interaction-agent-version.d.ts +21 -0
  84. package/dist/interaction-holder-heartbeat.d.ts +5 -0
  85. package/dist/interaction-metrics.d.ts +27 -2
  86. package/dist/interaction-route-stages.d.ts +25 -0
  87. package/dist/interaction-secrets-vault.d.ts +20 -0
  88. package/dist/interaction-secrets.d.ts +103 -0
  89. package/dist/mcp/action-catalog-types.d.ts +14 -0
  90. package/dist/mcp/action-catalog.gen.d.ts +2 -0
  91. package/dist/mcp/action-descriptions.d.ts +4 -0
  92. package/dist/mcp/action-schema-imports.gen.d.ts +1 -0
  93. package/dist/mcp/capability-account-readiness.d.ts +7 -0
  94. package/dist/mcp/child-read-evidence.d.ts +9 -0
  95. package/dist/mcp/company-profile-agent-admin.d.ts +12 -0
  96. package/dist/mcp/contract-input.d.ts +13 -0
  97. package/dist/mcp/documents.d.ts +2 -0
  98. package/dist/mcp/first-party-tool-permissions.d.ts +3 -606
  99. package/dist/mcp/notification-tools.d.ts +26 -0
  100. package/dist/mcp/orchestration-failure-diagnostic.d.ts +43 -0
  101. package/dist/mcp/scheduled-task-input.d.ts +1309 -0
  102. package/dist/mcp/scheduled-task-view.d.ts +217 -3
  103. package/dist/mcp/secret-tools.d.ts +14 -0
  104. package/dist/mcp/server.d.ts +108 -5
  105. package/dist/mcp/session-admin-access-tools.d.ts +33 -0
  106. package/dist/mcp/session-event-errors.d.ts +28 -0
  107. package/dist/mcp/session-event-view.d.ts +62 -0
  108. package/dist/mcp/session-view.d.ts +15 -0
  109. package/dist/mcp/session-wait.d.ts +18 -0
  110. package/dist/mcp/site-agent-clamp-tools.d.ts +38 -0
  111. package/dist/mcp/site-data-tools.d.ts +22 -0
  112. package/dist/mcp/site-publication-tools.d.ts +19 -0
  113. package/dist/mcp/site-sql-tools.d.ts +27 -0
  114. package/dist/mcp-oauth.d.ts +37 -4
  115. package/dist/model-calls/chat-completions.d.ts +87 -0
  116. package/dist/model-calls/pending-usage-settlements.d.ts +57 -0
  117. package/dist/model-calls/service.d.ts +36 -0
  118. package/dist/model-catalog.d.ts +9 -3
  119. package/dist/native-push-dispatch.d.ts +69 -0
  120. package/dist/observability.d.ts +3 -1
  121. package/dist/organization-mcp.d.ts +82 -0
  122. package/dist/prepared-mcp-actor.d.ts +77 -0
  123. package/dist/prepared-mcp-permissions.d.ts +8 -0
  124. package/dist/routes/analytics-consent.d.ts +26 -0
  125. package/dist/routes/api-integrations.d.ts +11 -0
  126. package/dist/routes/api-keys.d.ts +7 -7
  127. package/dist/routes/automations.d.ts +2 -0
  128. package/dist/routes/billing.d.ts +59 -0
  129. package/dist/routes/browser-sessions.d.ts +65 -2
  130. package/dist/routes/chat-completions.d.ts +11 -0
  131. package/dist/routes/claude-core-usage.d.ts +20 -0
  132. package/dist/routes/claude-subscription-accounts.d.ts +3 -0
  133. package/dist/routes/claude-subscription-oauth.d.ts +3 -0
  134. package/dist/routes/client-errors.d.ts +182 -0
  135. package/dist/routes/codex-core.d.ts +401 -0
  136. package/dist/routes/codex.d.ts +64 -2
  137. package/dist/routes/computer-sessions.d.ts +6 -1
  138. package/dist/routes/desktop-distribution.d.ts +32 -0
  139. package/dist/routes/github-browser-fonts.gen.d.ts +2 -0
  140. package/dist/routes/github-browser-pages.d.ts +27 -0
  141. package/dist/routes/inbox.d.ts +13 -0
  142. package/dist/routes/insights-response-cache.d.ts +10 -0
  143. package/dist/routes/insights-usage.d.ts +12 -0
  144. package/dist/routes/insights.d.ts +28 -0
  145. package/dist/routes/interaction-placement-message.d.ts +7 -0
  146. package/dist/routes/managed-sign-in-methods.d.ts +6 -0
  147. package/dist/routes/model-account-choice.d.ts +13 -0
  148. package/dist/routes/model-account-settings.d.ts +19 -0
  149. package/dist/routes/native-app-auth.d.ts +12 -0
  150. package/dist/routes/organization-integration-policy.d.ts +8 -0
  151. package/dist/routes/organization-integrations.d.ts +6 -0
  152. package/dist/routes/organization-mcp-connections.d.ts +3 -0
  153. package/dist/routes/organization-model-defaults.d.ts +9 -0
  154. package/dist/routes/organization-service-accounts.d.ts +3 -0
  155. package/dist/routes/personal-api-keys.d.ts +3 -0
  156. package/dist/routes/session-admin-access.d.ts +3 -0
  157. package/dist/routes/session-artifact-associations.d.ts +4 -0
  158. package/dist/routes/session-history-imports.d.ts +20 -0
  159. package/dist/routes/sessions.d.ts +38 -2
  160. package/dist/routes/site-data.d.ts +18 -0
  161. package/dist/routes/site-publishing.d.ts +5 -0
  162. package/dist/routes/site-runtime.d.ts +31 -0
  163. package/dist/routes/site-sql.d.ts +16 -0
  164. package/dist/routes/slack-bot-access.d.ts +3 -0
  165. package/dist/routes/subscription-account-pools.d.ts +21 -0
  166. package/dist/routes/subscription-core-http.d.ts +5 -0
  167. package/dist/routes/subscription-pool-access.d.ts +37 -0
  168. package/dist/routes/subscription-pool-core.d.ts +153 -0
  169. package/dist/routes/supergrok.d.ts +6 -6
  170. package/dist/routes/usage-allowances.d.ts +12 -0
  171. package/dist/routes/variable-sets-removed.d.ts +2 -0
  172. package/dist/routes/vault-providers.d.ts +34 -0
  173. package/dist/routes/vaults.d.ts +3 -0
  174. package/dist/routes/workspace-integrations.d.ts +35 -0
  175. package/dist/routes/workspace-model-providers.d.ts +4 -0
  176. package/dist/routes/workspaces.d.ts +11 -2
  177. package/dist/sandbox/agent-update.d.ts +64 -0
  178. package/dist/sandbox/auth-callout.d.ts +8 -0
  179. package/dist/sandbox/channel-a.d.ts +15 -1
  180. package/dist/sandbox/enrollment.d.ts +26 -4
  181. package/dist/sandbox/machine-audience.d.ts +29 -0
  182. package/dist/sandbox/machines.d.ts +15 -2
  183. package/dist/sandbox/metrics-ingestion.d.ts +6 -2
  184. package/dist/sandbox/screen-control.d.ts +85 -0
  185. package/dist/sandbox/viewer.d.ts +5 -1
  186. package/dist/sandbox-file-artifacts.d.ts +17 -1
  187. package/dist/scheduled-task-blockers.d.ts +39 -0
  188. package/dist/scheduled-task-deletion.d.ts +3 -4
  189. package/dist/scheduled-task-lifecycle.d.ts +14 -0
  190. package/dist/secret-answers.d.ts +40 -0
  191. package/dist/session-create-observability.d.ts +5 -0
  192. package/dist/session-event-view-36GO3IL7.js +528 -0
  193. package/dist/session-event-view-36GO3IL7.js.map +1 -0
  194. package/dist/signed-state-secret.d.ts +18 -0
  195. package/dist/site-agent-guard.d.ts +53 -0
  196. package/dist/site-data/operations.d.ts +103 -0
  197. package/dist/site-data/service.d.ts +203 -0
  198. package/dist/site-frame-guard.d.ts +32 -0
  199. package/dist/site-publishing/agent-data-tools.d.ts +84 -0
  200. package/dist/site-publishing/agent-model.d.ts +58 -0
  201. package/dist/site-publishing/agent-session.d.ts +16 -0
  202. package/dist/site-publishing/content-scanner.d.ts +31 -0
  203. package/dist/site-publishing/edge-sync.d.ts +48 -0
  204. package/dist/site-publishing/gateway-signature.d.ts +56 -0
  205. package/dist/site-publishing/limits.d.ts +63 -0
  206. package/dist/site-publishing/page-tool-authority.d.ts +30 -0
  207. package/dist/site-publishing/platform-usage.d.ts +113 -0
  208. package/dist/site-publishing/platform.d.ts +21 -0
  209. package/dist/site-publishing/readiness.d.ts +62 -0
  210. package/dist/site-publishing/runtime.d.ts +179 -0
  211. package/dist/site-publishing/service.d.ts +264 -0
  212. package/dist/site-publishing/session-events.d.ts +22 -0
  213. package/dist/site-publishing/session-views.d.ts +36 -0
  214. package/dist/site-publishing/viewer.d.ts +40 -0
  215. package/dist/site-session-origin.d.ts +31 -6
  216. package/dist/site-sql/format.d.ts +47 -0
  217. package/dist/site-sql/gateway.d.ts +50 -0
  218. package/dist/site-sql/service.d.ts +213 -0
  219. package/dist/temporal-schedule-sync.d.ts +26 -0
  220. package/dist/transcription/billing-refusal.d.ts +8 -0
  221. package/dist/transcription/normalize.d.ts +23 -0
  222. package/dist/transcription/providers/azure-mai.d.ts +12 -0
  223. package/dist/transcription/providers/azure-openai.d.ts +4 -0
  224. package/dist/transcription/providers/openai.d.ts +16 -0
  225. package/dist/transcription/providers/subscription-core.d.ts +39 -0
  226. package/dist/transcription/service.d.ts +10 -1
  227. package/dist/transcription/wav-duration.d.ts +8 -0
  228. package/dist/workspace-tool-gateway-attestations.d.ts +37 -0
  229. package/dist/workspace-tool-gateway-observability.d.ts +16 -0
  230. package/dist/workspace-tool-gateway-secrets.d.ts +27 -0
  231. package/dist/workspace-tool-gateway.d.ts +102 -6
  232. package/dist/workspace-tool-target-fence.d.ts +116 -0
  233. package/dist/workspace-tool-target.d.ts +225 -0
  234. package/dist/workspace-webhook-dispatch.d.ts +26 -0
  235. package/dist/xai-subscription-core.d.ts +60 -0
  236. package/package.json +25 -20
  237. package/src/access-grant-rls.ts +64 -14
  238. package/src/admission-trace.ts +14 -0
  239. package/src/app.ts +1684 -252
  240. package/src/artifact-catalog-cursor.ts +1 -0
  241. package/src/attached-browser-viewer.ts +26 -0
  242. package/src/auth/managed-auth-attempt-context.ts +9 -0
  243. package/src/auth/managed-auth-rate-limits.ts +252 -0
  244. package/src/auth/managed-auth-session-adapter.ts +64 -29
  245. package/src/auth/managed-auth.ts +303 -35
  246. package/src/auth/managed-email.ts +18 -1
  247. package/src/auth/managed-sign-in-notifications.ts +81 -0
  248. package/src/auth/new-signups-gate.ts +49 -0
  249. package/src/auth/organization-user-setup.ts +3 -3
  250. package/src/auth/signup-funnel-metrics.ts +164 -0
  251. package/src/azure-live.ts +103 -0
  252. package/src/browser-action-fences.ts +45 -0
  253. package/src/browser-controller-authority.ts +1 -186
  254. package/src/browser-ephemeral.ts +39 -0
  255. package/src/browser-lost-runtime-end.ts +71 -0
  256. package/src/browser-state-authority.ts +1 -236
  257. package/src/claude-default-models.ts +37 -0
  258. package/src/claude-subscription-core.ts +154 -0
  259. package/src/claude-subscription-oauth.ts +352 -0
  260. package/src/claude-subscription-profile.ts +73 -0
  261. package/src/claude-subscription-usage.ts +51 -0
  262. package/src/claude-workspace-connection.ts +82 -0
  263. package/src/codemode.ts +236 -39
  264. package/src/codex-realtime.ts +181 -53
  265. package/src/codex-session-pointers.ts +80 -0
  266. package/src/company-brain-okf.ts +1 -1
  267. package/src/connected-machine-computer-access.ts +2 -1
  268. package/src/connection-ownership.ts +19 -13
  269. package/src/controller-data-plane.ts +34 -0
  270. package/src/credit-promotion-snapshot.ts +36 -0
  271. package/src/editable-artifact-production.ts +10 -0
  272. package/src/editable-artifact-source-session.ts +123 -0
  273. package/src/editable-artifact-websocket.ts +16 -3
  274. package/src/fatal-process-boundary.ts +67 -3
  275. package/src/gateway-realtime.ts +12 -8
  276. package/src/github-access.ts +31 -5
  277. package/src/github-browser-flow.ts +1 -1
  278. package/src/http/acting-person.ts +105 -0
  279. package/src/http/api-contract-compat.ts +49 -0
  280. package/src/http/api-error.ts +210 -2
  281. package/src/http/auth.ts +68 -4
  282. package/src/http/cors.ts +37 -5
  283. package/src/http/deprecation.ts +118 -0
  284. package/src/http/keyed-admission.ts +29 -0
  285. package/src/http/local-browser-boundary.ts +343 -0
  286. package/src/http/metrics-listener.ts +57 -0
  287. package/src/http/path-identifier.ts +54 -0
  288. package/src/http/registered-route-label.ts +34 -0
  289. package/src/http/rejection-telemetry.ts +120 -0
  290. package/src/http/request-body.ts +127 -0
  291. package/src/http/request-source.ts +154 -13
  292. package/src/http/sse.ts +88 -28
  293. package/src/http/unmatched-route.ts +60 -0
  294. package/src/http/user-content.ts +158 -0
  295. package/src/http/variable-sets-removed.ts +122 -0
  296. package/src/http/websocket-upgrade-dispatch.ts +29 -0
  297. package/src/index.ts +107 -57
  298. package/src/integration-connect-metrics.ts +228 -0
  299. package/src/integration-endpoint-test.ts +291 -0
  300. package/src/integrations/api-integrations.ts +81 -7
  301. package/src/integrations/atlassian.ts +202 -83
  302. package/src/integrations/fiken.ts +66 -38
  303. package/src/integrations/github-app-connect.ts +64 -18
  304. package/src/integrations/github-lens-connect.ts +8 -29
  305. package/src/integrations/google-drive.ts +448 -152
  306. package/src/integrations/integration-commit-authority.ts +69 -0
  307. package/src/integrations/marketplace-plugin.ts +1 -1
  308. package/src/integrations/oauth-client.ts +733 -193
  309. package/src/integrations/oauth-profiles.ts +116 -45
  310. package/src/integrations/onepassword-vault-provider.ts +16 -0
  311. package/src/integrations/personal-github-repositories.ts +1 -1
  312. package/src/integrations/personal-github.ts +61 -35
  313. package/src/integrations/provider-oauth.ts +67 -85
  314. package/src/integrations/slack-app-home.ts +5 -5
  315. package/src/integrations/slack-bot.ts +893 -201
  316. package/src/integrations/slack-file-upload-flow.ts +147 -0
  317. package/src/integrations/slack-install.ts +7 -7
  318. package/src/integrations/slack-interactions.ts +1589 -299
  319. package/src/integrations/slack-mrkdwn.ts +193 -0
  320. package/src/integrations/slack-routing.ts +2 -2
  321. package/src/integrations/slack-session-defaults.ts +224 -0
  322. package/src/integrations/slack-task-file-upload.ts +323 -0
  323. package/src/integrations/slack-tool-review.ts +65 -0
  324. package/src/integrations/social-oauth.ts +90 -58
  325. package/src/interaction-agent-access.ts +40 -20
  326. package/src/interaction-agent-version.ts +85 -0
  327. package/src/interaction-holder-heartbeat.ts +24 -8
  328. package/src/interaction-metrics.ts +164 -2
  329. package/src/interaction-route-stages.ts +94 -0
  330. package/src/interaction-secrets-vault.ts +213 -0
  331. package/src/interaction-secrets.ts +426 -0
  332. package/src/mcp/action-catalog-types.ts +14 -0
  333. package/src/mcp/action-catalog.gen.ts +8014 -0
  334. package/src/mcp/action-descriptions.ts +299 -0
  335. package/src/mcp/action-schema-imports.gen.ts +304 -0
  336. package/src/mcp/capability-account-readiness.ts +17 -0
  337. package/src/mcp/child-read-evidence.ts +19 -0
  338. package/src/mcp/company-profile-agent-admin.ts +13 -0
  339. package/src/mcp/contract-input.ts +165 -0
  340. package/src/mcp/documents.ts +9 -2
  341. package/src/mcp/editable-artifacts.ts +29 -11
  342. package/src/mcp/files.ts +5 -1
  343. package/src/mcp/first-party-tool-permissions.ts +7 -285
  344. package/src/mcp/knowledge-entries.ts +108 -34
  345. package/src/mcp/notification-tools.ts +480 -0
  346. package/src/mcp/orchestration-failure-diagnostic.ts +43 -0
  347. package/src/mcp/scheduled-task-input.ts +89 -0
  348. package/src/mcp/scheduled-task-view.ts +63 -3
  349. package/src/mcp/secret-tools.ts +185 -0
  350. package/src/mcp/server.ts +2213 -1116
  351. package/src/mcp/session-admin-access-tools.ts +163 -0
  352. package/src/mcp/session-event-errors.ts +123 -0
  353. package/src/mcp/session-event-view.ts +395 -13
  354. package/src/mcp/session-view.ts +3 -0
  355. package/src/mcp/session-wait.ts +67 -7
  356. package/src/mcp/site-agent-clamp-tools.ts +140 -0
  357. package/src/mcp/site-data-tools.ts +339 -0
  358. package/src/mcp/site-publication-tools.ts +201 -0
  359. package/src/mcp/site-sql-tools.ts +427 -0
  360. package/src/mcp-oauth.ts +635 -45
  361. package/src/model-calls/chat-completions.ts +352 -0
  362. package/src/model-calls/pending-usage-settlements.ts +125 -0
  363. package/src/model-calls/service.ts +694 -0
  364. package/src/model-catalog.ts +68 -17
  365. package/src/native-push-dispatch.ts +457 -0
  366. package/src/observability.ts +15 -1
  367. package/src/organization-mcp.ts +485 -0
  368. package/src/prepared-mcp-actor.ts +154 -0
  369. package/src/prepared-mcp-permissions.ts +38 -0
  370. package/src/routes/analytics-consent.ts +123 -0
  371. package/src/routes/api-integrations.ts +268 -9
  372. package/src/routes/api-keys.ts +164 -25
  373. package/src/routes/artifact-catalog.ts +111 -0
  374. package/src/routes/automations.ts +163 -90
  375. package/src/routes/billing.ts +535 -59
  376. package/src/routes/browser-sessions.ts +966 -342
  377. package/src/routes/canonical-human-identities.ts +61 -0
  378. package/src/routes/capabilities.ts +112 -5
  379. package/src/routes/channels.ts +4 -3
  380. package/src/routes/chat-completions.ts +235 -0
  381. package/src/routes/claude-core-usage.ts +147 -0
  382. package/src/routes/claude-subscription-accounts.ts +233 -0
  383. package/src/routes/claude-subscription-oauth.ts +175 -0
  384. package/src/routes/client-errors.ts +394 -0
  385. package/src/routes/codex-core.ts +687 -0
  386. package/src/routes/codex.ts +1277 -1119
  387. package/src/routes/company-brain.ts +4 -0
  388. package/src/routes/computer-sessions.ts +319 -85
  389. package/src/routes/connect.ts +277 -175
  390. package/src/routes/connections.ts +690 -363
  391. package/src/routes/desktop-distribution.ts +217 -0
  392. package/src/routes/documents.ts +13 -7
  393. package/src/routes/editable-artifacts.ts +74 -4
  394. package/src/routes/enrollments.ts +110 -16
  395. package/src/routes/external-identity-links.ts +13 -12
  396. package/src/routes/files.ts +41 -16
  397. package/src/routes/github-browser-fonts.gen.ts +12 -0
  398. package/src/routes/github-browser-pages.ts +258 -0
  399. package/src/routes/github.ts +200 -75
  400. package/src/routes/inbox.ts +353 -0
  401. package/src/routes/insights-response-cache.ts +83 -0
  402. package/src/routes/insights-usage.ts +345 -0
  403. package/src/routes/insights.ts +103 -8
  404. package/src/routes/install.ts +51 -10
  405. package/src/routes/integration-facets.ts +70 -28
  406. package/src/routes/interaction-placement-message.ts +12 -0
  407. package/src/routes/knowledge.ts +136 -27
  408. package/src/routes/machines.ts +189 -135
  409. package/src/routes/managed-auth-session-sets.ts +43 -10
  410. package/src/routes/managed-onboarding.ts +39 -19
  411. package/src/routes/managed-sign-in-methods.ts +433 -0
  412. package/src/routes/memory-slack-publications.ts +3 -2
  413. package/src/routes/model-account-choice.ts +194 -0
  414. package/src/routes/model-account-settings.ts +235 -0
  415. package/src/routes/model-connection-access.ts +210 -48
  416. package/src/routes/native-app-auth.ts +296 -0
  417. package/src/routes/organization-integration-policy.ts +116 -0
  418. package/src/routes/organization-integrations.ts +326 -0
  419. package/src/routes/organization-mcp-connections.ts +183 -0
  420. package/src/routes/organization-memberships.ts +205 -19
  421. package/src/routes/organization-model-defaults.ts +110 -0
  422. package/src/routes/organization-model-providers.ts +74 -3
  423. package/src/routes/organization-service-accounts.ts +128 -0
  424. package/src/routes/organization-sessions.ts +21 -5
  425. package/src/routes/personal-api-keys.ts +184 -0
  426. package/src/routes/personal-github-git-broker.ts +2 -2
  427. package/src/routes/personal-github.ts +9 -4
  428. package/src/routes/plugins.ts +46 -7
  429. package/src/routes/pr-review-github.ts +105 -118
  430. package/src/routes/pr-review.ts +88 -82
  431. package/src/routes/preference-registry.ts +18 -0
  432. package/src/routes/rigs.ts +48 -13
  433. package/src/routes/scheduled-tasks.ts +347 -27
  434. package/src/routes/session-admin-access.ts +271 -0
  435. package/src/routes/session-artifact-associations.ts +164 -0
  436. package/src/routes/session-history-imports.ts +305 -0
  437. package/src/routes/sessions.ts +1682 -363
  438. package/src/routes/site-data.ts +340 -0
  439. package/src/routes/site-publishing.ts +584 -0
  440. package/src/routes/site-runtime.ts +1944 -0
  441. package/src/routes/site-sql.ts +263 -0
  442. package/src/routes/skill-content.ts +72 -7
  443. package/src/routes/skills.ts +5 -4
  444. package/src/routes/slack-bot-access.ts +108 -0
  445. package/src/routes/social.ts +27 -15
  446. package/src/routes/subscription-account-pools.ts +209 -0
  447. package/src/routes/subscription-core-http.ts +18 -0
  448. package/src/routes/subscription-pool-access.ts +180 -0
  449. package/src/routes/subscription-pool-core.ts +552 -0
  450. package/src/routes/supergrok.ts +174 -655
  451. package/src/routes/transcription-recordings.ts +71 -4
  452. package/src/routes/transcriptions.ts +26 -2
  453. package/src/routes/usage-allowances.ts +381 -0
  454. package/src/routes/variable-sets-removed.ts +19 -0
  455. package/src/routes/vault-providers.ts +782 -0
  456. package/src/routes/vaults.ts +421 -0
  457. package/src/routes/video-generation.ts +30 -12
  458. package/src/routes/workspace-artifacts.ts +165 -53
  459. package/src/routes/workspace-integrations.ts +576 -0
  460. package/src/routes/workspace-model-providers.ts +148 -0
  461. package/src/routes/workspace-state.ts +4 -0
  462. package/src/routes/workspaces.ts +625 -117
  463. package/src/sandbox/agent-update.ts +315 -0
  464. package/src/sandbox/auth-callout.ts +104 -21
  465. package/src/sandbox/channel-a.ts +150 -49
  466. package/src/sandbox/enrollment.ts +131 -22
  467. package/src/sandbox/machine-audience.ts +192 -0
  468. package/src/sandbox/machines.ts +75 -31
  469. package/src/sandbox/metrics-ingestion.ts +133 -2
  470. package/src/sandbox/rematerialize.ts +51 -21
  471. package/src/sandbox/screen-control.ts +289 -0
  472. package/src/sandbox/viewer.ts +33 -58
  473. package/src/sandbox-file-artifacts.ts +53 -27
  474. package/src/scheduled-task-blockers.ts +293 -0
  475. package/src/scheduled-task-deletion.ts +13 -3
  476. package/src/scheduled-task-lifecycle.ts +84 -0
  477. package/src/secret-answers.ts +119 -0
  478. package/src/session-create-observability.ts +46 -0
  479. package/src/session-realtime-context.ts +26 -4
  480. package/src/signed-state-secret.ts +58 -0
  481. package/src/site-agent-guard.ts +261 -0
  482. package/src/site-data/operations.ts +777 -0
  483. package/src/site-data/service.ts +1043 -0
  484. package/src/site-frame-guard.ts +107 -0
  485. package/src/site-publishing/agent-data-tools.ts +250 -0
  486. package/src/site-publishing/agent-model.ts +127 -0
  487. package/src/site-publishing/agent-session.ts +148 -0
  488. package/src/site-publishing/content-scanner.ts +93 -0
  489. package/src/site-publishing/edge-sync.ts +148 -0
  490. package/src/site-publishing/gateway-signature.ts +198 -0
  491. package/src/site-publishing/limits.ts +315 -0
  492. package/src/site-publishing/page-tool-authority.ts +111 -0
  493. package/src/site-publishing/platform-usage.ts +479 -0
  494. package/src/site-publishing/platform.ts +98 -0
  495. package/src/site-publishing/readiness.ts +330 -0
  496. package/src/site-publishing/runtime.ts +831 -0
  497. package/src/site-publishing/service.ts +1282 -0
  498. package/src/site-publishing/session-events.ts +262 -0
  499. package/src/site-publishing/session-views.ts +262 -0
  500. package/src/site-publishing/viewer.ts +75 -0
  501. package/src/site-session-origin.ts +91 -6
  502. package/src/site-sql/format.ts +134 -0
  503. package/src/site-sql/gateway.ts +168 -0
  504. package/src/site-sql/service.ts +1636 -0
  505. package/src/site-uploads.ts +27 -5
  506. package/src/temporal-schedule-sync.ts +74 -0
  507. package/src/transcription/billing-refusal.ts +14 -0
  508. package/src/transcription/normalize.ts +77 -0
  509. package/src/transcription/providers/azure-mai.ts +98 -0
  510. package/src/transcription/providers/azure-openai.ts +16 -7
  511. package/src/transcription/providers/codex-subscription.ts +190 -67
  512. package/src/transcription/providers/openai.ts +79 -5
  513. package/src/transcription/providers/subscription-core.ts +125 -0
  514. package/src/transcription/providers/xai-subscription.ts +81 -83
  515. package/src/transcription/segmenter.ts +7 -1
  516. package/src/transcription/service.ts +239 -10
  517. package/src/transcription/wav-duration.ts +39 -0
  518. package/src/workspace-deletion.ts +25 -1
  519. package/src/workspace-tool-gateway-attestations.ts +133 -0
  520. package/src/workspace-tool-gateway-observability.ts +64 -0
  521. package/src/workspace-tool-gateway-secrets.ts +104 -0
  522. package/src/workspace-tool-gateway.ts +921 -103
  523. package/src/workspace-tool-target-fence.ts +380 -0
  524. package/src/workspace-tool-target.ts +554 -0
  525. package/src/workspace-webhook-dispatch.ts +225 -0
  526. package/src/xai-realtime.ts +85 -81
  527. package/src/xai-subscription-core.ts +172 -0
  528. package/dist/browser-auth-broker.d.ts +0 -20
  529. package/dist/chunk-AJ62T5QN.js.map +0 -1
  530. package/dist/connection-authority-owner.d.ts +0 -59
  531. package/dist/routes/connection-authorities.d.ts +0 -3
  532. package/dist/routes/environments.d.ts +0 -5
  533. package/dist/routes/host-mcp-bindings.d.ts +0 -5
  534. package/dist/routes/host-mcp-resolvers.d.ts +0 -3
  535. package/dist/routes/packs.d.ts +0 -3
  536. package/dist/session-event-view-MU3HMNV3.js +0 -264
  537. package/dist/session-event-view-MU3HMNV3.js.map +0 -1
  538. package/dist/xai-subscription-auth.d.ts +0 -23
  539. package/src/browser-auth-broker.ts +0 -155
  540. package/src/connection-authority-owner.ts +0 -61
  541. package/src/routes/connection-authorities.ts +0 -139
  542. package/src/routes/environments.ts +0 -388
  543. package/src/routes/host-mcp-bindings.ts +0 -122
  544. package/src/routes/host-mcp-resolvers.ts +0 -41
  545. package/src/routes/packs.ts +0 -784
  546. package/src/xai-subscription-auth.ts +0 -139
@@ -0,0 +1,353 @@
1
+ // The person's inbox: what waits on them across their workspaces. Session
2
+ // events open and close items (migration 0655); these routes read them and
3
+ // record the person's own attention. Answering a question or deciding an
4
+ // approval happens through the session's ordinary events, which close the item.
5
+ import {
6
+ InboxSettings,
7
+ ListInboxResponse,
8
+ MemberNotificationsSetting,
9
+ SessionInboxMute,
10
+ UpdateInboxItemRequest,
11
+ type AccessGrant,
12
+ type AccessContext,
13
+ type InboxItem,
14
+ } from "@opengeni/contracts";
15
+ import {
16
+ inboxSubjectForContext,
17
+ requireAccessContext,
18
+ requireAccessGrant,
19
+ requireSessionAuthorization,
20
+ SessionAuthorizationDeniedError,
21
+ SessionAuthorizationUnavailableError,
22
+ withResolvedSessionAuthorization,
23
+ type ApiRouteDeps,
24
+ } from "@opengeni/core";
25
+ import {
26
+ getInboxItem,
27
+ getInboxSettings,
28
+ getMemberNotificationsAllowed,
29
+ getSessionRepliesMuted,
30
+ getSessionTitles,
31
+ listInboxItems,
32
+ listWorkspacesForSubject,
33
+ setInboxSettings,
34
+ setMemberNotificationsAllowed,
35
+ setSessionRepliesMuted,
36
+ updateInboxItemAttention,
37
+ type InboxItemRow,
38
+ } from "@opengeni/db";
39
+ import type { Context, Hono } from "hono";
40
+ import { HTTPException } from "hono/http-exception";
41
+
42
+ /**
43
+ * Only a person has an inbox: a signed-in person, or the one human of a local
44
+ * install. Keys, services and agents act through sessions.
45
+ */
46
+ function requirePerson(context: AccessContext): string {
47
+ const subjectId = inboxSubjectForContext(context);
48
+ if (!subjectId) {
49
+ throw new HTTPException(403, { message: "Only a signed-in person has an inbox" });
50
+ }
51
+ return subjectId;
52
+ }
53
+
54
+ async function personAccounts(deps: ApiRouteDeps, context: AccessContext): Promise<string[]> {
55
+ const accounts = new Set<string>([
56
+ ...context.accountGrants.map((grant) => grant.accountId),
57
+ ...context.workspaceGrants.map((grant) => grant.accountId),
58
+ ]);
59
+ if (accounts.size === 0) {
60
+ for (const workspace of await listWorkspacesForSubject(deps.db, context.subjectId)) {
61
+ accounts.add(workspace.accountId);
62
+ }
63
+ }
64
+ return [...accounts];
65
+ }
66
+
67
+ /** Workspaces the person can still read sessions in; access can change after an item opened. */
68
+ async function readableWorkspaces(
69
+ c: Context,
70
+ deps: ApiRouteDeps,
71
+ workspaceIds: Iterable<string>,
72
+ ): Promise<Map<string, AccessGrant>> {
73
+ const readable = new Map<string, AccessGrant>();
74
+ await Promise.all(
75
+ [...new Set(workspaceIds)].map(async (workspaceId) => {
76
+ try {
77
+ readable.set(workspaceId, await requireAccessGrant(c, deps, workspaceId, "sessions:read"));
78
+ } catch {
79
+ // No longer reachable: its items stay hidden until access returns.
80
+ }
81
+ }),
82
+ );
83
+ return readable;
84
+ }
85
+
86
+ /** Whether the person may open this session; any refusal or failure counts as no. */
87
+ async function sessionReadable(
88
+ deps: ApiRouteDeps,
89
+ grant: AccessGrant,
90
+ sessionId: string,
91
+ ): Promise<boolean> {
92
+ try {
93
+ await requireSessionAuthorization(deps, grant, {
94
+ sessionId,
95
+ operation: "session.read",
96
+ surface: "http",
97
+ });
98
+ return true;
99
+ } catch {
100
+ return false;
101
+ }
102
+ }
103
+
104
+ /**
105
+ * The items another member's agent sent from a session the person cannot
106
+ * open (such as that member's private session). Those show no session: no
107
+ * title and no link. The person's own items are never checked here.
108
+ */
109
+ export async function itemsWithUnavailableSession(
110
+ rows: readonly InboxItemRow[],
111
+ canRead: (row: InboxItemRow) => Promise<boolean>,
112
+ ): Promise<Set<string>> {
113
+ const unavailable = new Set<string>();
114
+ // One at a time: each check opens nested RLS reads (few items have a sender).
115
+ for (const row of rows) {
116
+ if (row.sender && !(await canRead(row))) unavailable.add(row.id);
117
+ }
118
+ return unavailable;
119
+ }
120
+
121
+ /** An inbox row as the person sees it. */
122
+ export function presentInboxItem(
123
+ row: InboxItemRow,
124
+ sessionTitle: string | null,
125
+ sessionAvailable: boolean,
126
+ ): InboxItem {
127
+ return sessionAvailable
128
+ ? { ...row, sessionTitle, sessionAvailable: true }
129
+ : { ...row, sessionTitle: null, eventSequence: null, sessionAvailable: false };
130
+ }
131
+
132
+ function isNeedsYou(kind: InboxItem["kind"]): boolean {
133
+ return kind === "question" || kind === "approval" || kind === "goal_paused";
134
+ }
135
+
136
+ // The mute routes name a target session outside the session module, so they
137
+ // call the session seam themselves; a session the caller cannot see is absent.
138
+ function muteSessionError(error: unknown): never {
139
+ if (error instanceof SessionAuthorizationDeniedError)
140
+ throw new HTTPException(404, { message: "Session not found" });
141
+ if (error instanceof SessionAuthorizationUnavailableError)
142
+ throw new HTTPException(503, { message: "Session authorization unavailable" });
143
+ throw error;
144
+ }
145
+
146
+ export function registerInboxRoutes(app: Hono, deps: ApiRouteDeps): void {
147
+ app.get("/v1/inbox", async (c) => {
148
+ const context = await requireAccessContext(c, deps);
149
+ const subjectId = requirePerson(context);
150
+ const workspaceFilter = c.req.query("workspaceId") ?? null;
151
+ const rows = (
152
+ await Promise.all(
153
+ (
154
+ await personAccounts(deps, context)
155
+ ).map((accountId) => listInboxItems(deps.db, { accountId, subjectId })),
156
+ )
157
+ )
158
+ .flat()
159
+ .filter((row) => workspaceFilter === null || row.workspaceId === workspaceFilter);
160
+ const readable = await readableWorkspaces(
161
+ c,
162
+ deps,
163
+ rows.map((row) => row.workspaceId),
164
+ );
165
+ const visible = rows.filter((row) => readable.has(row.workspaceId));
166
+ const unavailable = await itemsWithUnavailableSession(visible, (row) =>
167
+ sessionReadable(deps, readable.get(row.workspaceId)!, row.sessionId),
168
+ );
169
+ const titles = new Map<string, string | null>();
170
+ await Promise.all(
171
+ [...readable.keys()].map(async (workspaceId) => {
172
+ const ids = visible.filter(
173
+ (row) => row.workspaceId === workspaceId && !unavailable.has(row.id),
174
+ );
175
+ const found = await getSessionTitles(
176
+ deps.db,
177
+ workspaceId,
178
+ ids.map((row) => row.sessionId),
179
+ );
180
+ for (const [id, title] of found) titles.set(id, title);
181
+ }),
182
+ );
183
+ const now = Date.now();
184
+ const items: InboxItem[] = visible
185
+ .map((row) =>
186
+ presentInboxItem(row, titles.get(row.sessionId) ?? null, !unavailable.has(row.id)),
187
+ )
188
+ .sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));
189
+ const awake = items.filter(
190
+ (item) => item.snoozedUntil === null || Date.parse(item.snoozedUntil) <= now,
191
+ );
192
+ c.header("cache-control", "private, no-store");
193
+ return c.json(
194
+ ListInboxResponse.parse({
195
+ items,
196
+ needsYouCount: awake.filter((item) => isNeedsYou(item.kind)).length,
197
+ unreadCount: awake.filter((item) => item.unread).length,
198
+ }),
199
+ );
200
+ });
201
+
202
+ app.patch("/v1/inbox/items/:itemId", async (c) => {
203
+ const context = await requireAccessContext(c, deps);
204
+ const subjectId = requirePerson(context);
205
+ const parsed = UpdateInboxItemRequest.safeParse(await c.req.json().catch(() => null));
206
+ if (!parsed.success) {
207
+ throw new HTTPException(400, {
208
+ message: parsed.error.issues[0]?.message ?? "Invalid inbox update",
209
+ });
210
+ }
211
+ const itemId = c.req.param("itemId");
212
+ for (const accountId of await personAccounts(deps, context)) {
213
+ const item = await getInboxItem(deps.db, { itemId, accountId, subjectId });
214
+ if (!item) continue;
215
+ await requireAccessGrant(c, deps, item.workspaceId, "sessions:read");
216
+ await updateInboxItemAttention(deps.db, {
217
+ itemId,
218
+ accountId,
219
+ subjectId,
220
+ ...(parsed.data.seen ? { seen: true } : {}),
221
+ ...(parsed.data.snoozedUntil !== undefined
222
+ ? { snoozedUntil: parsed.data.snoozedUntil }
223
+ : {}),
224
+ ...(parsed.data.dismissed ? { dismissed: true } : {}),
225
+ });
226
+ return c.json({ ok: true });
227
+ }
228
+ throw new HTTPException(404, { message: "Inbox item not found" });
229
+ });
230
+
231
+ app.get("/v1/inbox/settings", async (c) => {
232
+ const context = await requireAccessContext(c, deps);
233
+ const subjectId = requirePerson(context);
234
+ const accountId = context.defaultAccountId ?? (await personAccounts(deps, context))[0];
235
+ if (!accountId) {
236
+ return c.json(
237
+ InboxSettings.parse({
238
+ tidyPolicy: "own_sessions",
239
+ pausedGoals: false,
240
+ replies: false,
241
+ timeSensitiveNeedsYou: false,
242
+ }),
243
+ );
244
+ }
245
+ return c.json(InboxSettings.parse(await getInboxSettings(deps.db, { accountId, subjectId })));
246
+ });
247
+
248
+ app.put("/v1/inbox/settings", async (c) => {
249
+ const context = await requireAccessContext(c, deps);
250
+ const subjectId = requirePerson(context);
251
+ const parsed = InboxSettings.safeParse(await c.req.json().catch(() => null));
252
+ if (!parsed.success) throw new HTTPException(400, { message: "Invalid inbox settings" });
253
+ // The setting is the person's own; apply it in every organization they belong to.
254
+ let settings: InboxSettings = {
255
+ tidyPolicy: "own_sessions",
256
+ pausedGoals: false,
257
+ replies: false,
258
+ timeSensitiveNeedsYou: false,
259
+ };
260
+ for (const accountId of await personAccounts(deps, context)) {
261
+ settings = await setInboxSettings(deps.db, {
262
+ accountId,
263
+ subjectId,
264
+ tidyPolicy: parsed.data.tidyPolicy,
265
+ pausedGoals: parsed.data.pausedGoals,
266
+ replies: parsed.data.replies,
267
+ timeSensitiveNeedsYou: parsed.data.timeSensitiveNeedsYou,
268
+ });
269
+ }
270
+ return c.json(InboxSettings.parse(settings));
271
+ });
272
+
273
+ // Whether other members' agents may notify this person in one workspace.
274
+ // Each person decides for themselves; off by default.
275
+ app.get("/v1/workspaces/:workspaceId/inbox/member-notifications", async (c) => {
276
+ const context = await requireAccessContext(c, deps);
277
+ const subjectId = requirePerson(context);
278
+ const workspaceId = c.req.param("workspaceId");
279
+ await requireAccessGrant(c, deps, workspaceId, "sessions:read");
280
+ c.header("cache-control", "private, no-store");
281
+ return c.json(
282
+ MemberNotificationsSetting.parse({
283
+ allowOthers: await getMemberNotificationsAllowed(deps.db, { workspaceId, subjectId }),
284
+ }),
285
+ );
286
+ });
287
+
288
+ app.put("/v1/workspaces/:workspaceId/inbox/member-notifications", async (c) => {
289
+ const context = await requireAccessContext(c, deps);
290
+ const subjectId = requirePerson(context);
291
+ const workspaceId = c.req.param("workspaceId");
292
+ const grant = await requireAccessGrant(c, deps, workspaceId, "sessions:read");
293
+ const parsed = MemberNotificationsSetting.safeParse(await c.req.json().catch(() => null));
294
+ if (!parsed.success) {
295
+ throw new HTTPException(400, { message: "Invalid member notification setting" });
296
+ }
297
+ return c.json(
298
+ MemberNotificationsSetting.parse({
299
+ allowOthers: await setMemberNotificationsAllowed(deps.db, {
300
+ accountId: grant.accountId,
301
+ workspaceId,
302
+ subjectId,
303
+ allowed: parsed.data.allowOthers,
304
+ }),
305
+ }),
306
+ );
307
+ });
308
+
309
+ // The person's own mute on one session: its replies stop reaching their
310
+ // inbox and phone; its notifications, questions and approvals still arrive.
311
+ app.get("/v1/workspaces/:workspaceId/sessions/:sessionId/inbox-mute", async (c) => {
312
+ const context = await requireAccessContext(c, deps);
313
+ const subjectId = requirePerson(context);
314
+ const workspaceId = c.req.param("workspaceId");
315
+ const sessionId = c.req.param("sessionId");
316
+ const grant = await requireAccessGrant(c, deps, workspaceId, "sessions:read");
317
+ const authorization = await requireSessionAuthorization(deps, grant, {
318
+ sessionId,
319
+ operation: "session.read",
320
+ surface: "http",
321
+ }).catch(muteSessionError);
322
+ const read = () => getSessionRepliesMuted(deps.db, { workspaceId, sessionId, subjectId });
323
+ const muted = authorization
324
+ ? await withResolvedSessionAuthorization(authorization, read)
325
+ : await read();
326
+ if (muted === null) throw new HTTPException(404, { message: "Session not found" });
327
+ c.header("cache-control", "private, no-store");
328
+ return c.json(SessionInboxMute.parse({ repliesMuted: muted }));
329
+ });
330
+
331
+ app.put("/v1/workspaces/:workspaceId/sessions/:sessionId/inbox-mute", async (c) => {
332
+ const context = await requireAccessContext(c, deps);
333
+ const subjectId = requirePerson(context);
334
+ const workspaceId = c.req.param("workspaceId");
335
+ const sessionId = c.req.param("sessionId");
336
+ const grant = await requireAccessGrant(c, deps, workspaceId, "sessions:read");
337
+ const parsed = SessionInboxMute.safeParse(await c.req.json().catch(() => null));
338
+ if (!parsed.success) throw new HTTPException(400, { message: "Invalid session mute" });
339
+ const repliesMuted = parsed.data.repliesMuted;
340
+ const authorization = await requireSessionAuthorization(deps, grant, {
341
+ sessionId,
342
+ operation: "session.attention.write",
343
+ surface: "http",
344
+ }).catch(muteSessionError);
345
+ const write = () =>
346
+ setSessionRepliesMuted(deps.db, { workspaceId, sessionId, subjectId, muted: repliesMuted });
347
+ const muted = authorization
348
+ ? await withResolvedSessionAuthorization(authorization, write)
349
+ : await write();
350
+ if (muted === null) throw new HTTPException(404, { message: "Session not found" });
351
+ return c.json(SessionInboxMute.parse({ repliesMuted: muted }));
352
+ });
353
+ }
@@ -0,0 +1,83 @@
1
+ import { createHmac, randomBytes } from "node:crypto";
2
+ import { HTTPException } from "hono/http-exception";
3
+
4
+ export const INSIGHTS_RESPONSE_TTL_MS = 60_000;
5
+ const MAX_ENTRIES = 128,
6
+ MAX_BYTES = 8 * 1024 * 1024,
7
+ MAX_ENTRY_BYTES = 1024 * 1024;
8
+
9
+ /** Ephemeral keyed digest: raw credentials never become retained map keys or logs. */
10
+ export function createInsightsCredentialPartition() {
11
+ const secret = randomBytes(32);
12
+ return (authorization: string | undefined, cookie: string | undefined) =>
13
+ createHmac("sha256", secret)
14
+ .update(JSON.stringify([authorization ?? null, cookie ?? null]))
15
+ .digest("hex");
16
+ }
17
+
18
+ export function createInsightsResponseCache(clock: () => number = () => Date.now()) {
19
+ const entries = new Map<
20
+ string,
21
+ { json: string; fence: string; expiresAt: number; bytes: number }
22
+ >();
23
+ let bytes = 0;
24
+ const remove = (key: string) => {
25
+ const entry = entries.get(key);
26
+ if (entry) {
27
+ bytes -= entry.bytes;
28
+ entries.delete(key);
29
+ }
30
+ };
31
+ return {
32
+ get<T>(key: string, fence: string): T | null {
33
+ const entry = entries.get(key);
34
+ if (!entry) return null;
35
+ if (entry.expiresAt <= clock() || entry.fence !== fence) {
36
+ remove(key);
37
+ return null;
38
+ }
39
+ // The TTL is never extended by a hit, and callers receive isolated objects.
40
+ return JSON.parse(entry.json) as T;
41
+ },
42
+ put(key: string, fence: string, value: unknown): void {
43
+ const json = JSON.stringify(value),
44
+ size = Buffer.byteLength(json);
45
+ if (size > MAX_ENTRY_BYTES) return;
46
+ for (const [existingKey, entry] of entries)
47
+ if (entry.expiresAt <= clock()) remove(existingKey);
48
+ remove(key);
49
+ for (const existingKey of entries.keys()) {
50
+ if (entries.size < MAX_ENTRIES && bytes + size <= MAX_BYTES) break;
51
+ remove(existingKey);
52
+ }
53
+ entries.set(key, { json, fence, expiresAt: clock() + INSIGHTS_RESPONSE_TTL_MS, bytes: size });
54
+ bytes += size;
55
+ },
56
+ get size() {
57
+ return entries.size;
58
+ },
59
+ };
60
+ }
61
+
62
+ /** Match existing bounded cause-chain PostgreSQL timeout handling; never expose SQL. */
63
+ export async function insightsWithFriendlyTimeout<T>(read: () => Promise<T>): Promise<T> {
64
+ try {
65
+ return await read();
66
+ } catch (error) {
67
+ let current = error;
68
+ for (let depth = 0; depth < 4 && current && typeof current === "object"; depth++) {
69
+ const candidate = current as { code?: unknown; message?: unknown; cause?: unknown };
70
+ if (
71
+ candidate.code === "57014" ||
72
+ (typeof candidate.message === "string" &&
73
+ candidate.message.toLowerCase().includes("statement timeout"))
74
+ ) {
75
+ throw new HTTPException(408, {
76
+ message: "This range has too much data right now. Try a shorter range.",
77
+ });
78
+ }
79
+ current = candidate.cause;
80
+ }
81
+ throw error;
82
+ }
83
+ }