@opengeni/api-router 0.30.1 → 1.0.0

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 (436) hide show
  1. package/dist/access-grant-rls.d.ts +3 -0
  2. package/dist/admission-trace.d.ts +8 -0
  3. package/dist/api-websocket.d.ts +18 -0
  4. package/dist/app.d.ts +50 -2
  5. package/dist/app.js +12 -1
  6. package/dist/artifact-catalog-cursor.d.ts +27 -0
  7. package/dist/auth/managed-auth-attempt-context.d.ts +10 -0
  8. package/dist/auth/managed-auth-rate-limits.d.ts +167 -0
  9. package/dist/auth/managed-auth-session-adapter.d.ts +6 -0
  10. package/dist/auth/managed-auth.d.ts +102 -3
  11. package/dist/auth/managed-email.d.ts +29 -0
  12. package/dist/auth/managed-sign-in-notifications.d.ts +4 -0
  13. package/dist/auth/new-signups-gate.d.ts +23 -0
  14. package/dist/auth/organization-user-setup.d.ts +80 -0
  15. package/dist/auth/signup-funnel-metrics.d.ts +44 -0
  16. package/dist/browser-controller-authority.d.ts +1 -61
  17. package/dist/browser-ephemeral.d.ts +5 -0
  18. package/dist/browser-state-authority.d.ts +1 -27
  19. package/dist/chunk-6TZ5LG3O.js +123948 -0
  20. package/dist/chunk-6TZ5LG3O.js.map +1 -0
  21. package/dist/chunk-OGQDXVXY.js +18 -0
  22. package/dist/chunk-OGQDXVXY.js.map +1 -0
  23. package/dist/claude-subscription-account-conflicts.d.ts +1 -0
  24. package/dist/claude-subscription-account-usage.d.ts +39 -0
  25. package/dist/claude-subscription-oauth.d.ts +25 -0
  26. package/dist/claude-subscription-profile.d.ts +9 -0
  27. package/dist/claude-subscription-usage.d.ts +44 -0
  28. package/dist/claude-workspace-connection.d.ts +15 -0
  29. package/dist/codemode.d.ts +32 -1
  30. package/dist/company-brain-okf.d.ts +24 -0
  31. package/dist/connected-machine-computer-access.d.ts +11 -0
  32. package/dist/connection-ownership.d.ts +54 -0
  33. package/dist/controller-data-plane.d.ts +32 -0
  34. package/dist/editable-artifact-office-import.d.ts +7 -4
  35. package/dist/editable-artifact-source-session.d.ts +3 -0
  36. package/dist/editable-artifact-websocket.d.ts +10 -18
  37. package/dist/editable-artifact-workspace-files.d.ts +1 -1
  38. package/dist/fatal-process-boundary.d.ts +25 -0
  39. package/dist/github-access.d.ts +31 -2
  40. package/dist/http/acting-person.d.ts +24 -0
  41. package/dist/http/api-contract-compat.d.ts +19 -0
  42. package/dist/http/api-error.d.ts +27 -1
  43. package/dist/http/cors.d.ts +17 -0
  44. package/dist/http/deprecation.d.ts +42 -0
  45. package/dist/http/interaction-control-error.d.ts +13 -0
  46. package/dist/http/keyed-admission.d.ts +12 -0
  47. package/dist/http/local-browser-boundary.d.ts +72 -0
  48. package/dist/http/metrics-listener.d.ts +22 -0
  49. package/dist/http/path-identifier.d.ts +17 -0
  50. package/dist/http/registered-route-label.d.ts +16 -0
  51. package/dist/http/request-body.d.ts +27 -0
  52. package/dist/http/request-source.d.ts +52 -0
  53. package/dist/http/sse.d.ts +17 -6
  54. package/dist/http/unmatched-route.d.ts +18 -0
  55. package/dist/http/user-content.d.ts +36 -0
  56. package/dist/http/websocket-upgrade-dispatch.d.ts +18 -0
  57. package/dist/index.d.ts +10 -3
  58. package/dist/index.js +1129 -166
  59. package/dist/index.js.map +1 -1
  60. package/dist/integration-endpoint-test.d.ts +20 -0
  61. package/dist/integrations/api-integrations.d.ts +2 -2
  62. package/dist/integrations/atlassian.d.ts +29 -3
  63. package/dist/integrations/connect-authority.d.ts +1 -0
  64. package/dist/integrations/connect-callback-return.d.ts +6 -0
  65. package/dist/integrations/fiken.d.ts +16 -2
  66. package/dist/integrations/github-app-connect.d.ts +47 -0
  67. package/dist/integrations/github-installation-proof.d.ts +3 -0
  68. package/dist/integrations/github-lens-connect.d.ts +116 -0
  69. package/dist/integrations/github-skill-source.d.ts +1 -5
  70. package/dist/integrations/google-drive.d.ts +25 -0
  71. package/dist/integrations/integration-commit-authority.d.ts +13 -0
  72. package/dist/integrations/marketplace-plugin.d.ts +2691 -0
  73. package/dist/integrations/oauth-client.d.ts +178 -18
  74. package/dist/integrations/oauth-profiles.d.ts +222 -0
  75. package/dist/integrations/oauth-return-path.d.ts +1 -0
  76. package/dist/integrations/personal-github-repositories.d.ts +84 -0
  77. package/dist/integrations/personal-github.d.ts +42 -0
  78. package/dist/integrations/pr-review-provider.d.ts +22 -0
  79. package/dist/integrations/provider-oauth.d.ts +19 -1
  80. package/dist/integrations/slack-app-home.d.ts +24 -0
  81. package/dist/integrations/slack-bot.d.ts +367 -12
  82. package/dist/integrations/slack-file-upload-flow.d.ts +62 -0
  83. package/dist/integrations/slack-install.d.ts +20 -0
  84. package/dist/integrations/slack-interactions.d.ts +113 -10
  85. package/dist/integrations/slack-mrkdwn.d.ts +41 -0
  86. package/dist/integrations/slack-routing.d.ts +120 -0
  87. package/dist/integrations/slack-session-defaults.d.ts +58 -0
  88. package/dist/integrations/slack-task-file-upload.d.ts +36 -0
  89. package/dist/integrations/social-oauth.d.ts +7 -0
  90. package/dist/interaction-agent-access.d.ts +15 -0
  91. package/dist/interaction-frame-proxy.d.ts +68 -0
  92. package/dist/interaction-metrics.d.ts +2 -0
  93. package/dist/mcp/action-catalog-types.d.ts +9 -0
  94. package/dist/mcp/action-catalog.gen.d.ts +2 -0
  95. package/dist/mcp/capability-account-readiness.d.ts +7 -0
  96. package/dist/mcp/child-read-evidence.d.ts +9 -0
  97. package/dist/mcp/command-read.d.ts +24 -0
  98. package/dist/mcp/company-profile-agent-admin.d.ts +44 -0
  99. package/dist/mcp/contract-input.d.ts +11 -0
  100. package/dist/mcp/documents.d.ts +7 -5
  101. package/dist/mcp/files.d.ts +2 -2
  102. package/dist/mcp/first-party-tool-permissions.d.ts +650 -0
  103. package/dist/mcp/knowledge-entries.d.ts +5 -0
  104. package/dist/mcp/orchestration-failure-diagnostic.d.ts +43 -0
  105. package/dist/mcp/receipts.d.ts +9 -0
  106. package/dist/mcp/request-abort.d.ts +19 -0
  107. package/dist/mcp/scheduled-task-input.d.ts +1189 -0
  108. package/dist/mcp/scheduled-task-view.d.ts +22 -4
  109. package/dist/mcp/server.d.ts +255 -3
  110. package/dist/mcp/session-event-view.d.ts +94 -0
  111. package/dist/mcp/session-view.d.ts +66 -2
  112. package/dist/mcp/session-wait.d.ts +174 -0
  113. package/dist/mcp-oauth.d.ts +52 -0
  114. package/dist/model-catalog.d.ts +11 -31
  115. package/dist/observability.d.ts +3 -1
  116. package/dist/organization-mcp.d.ts +52 -0
  117. package/dist/organization-recovery-notifications.d.ts +41 -0
  118. package/dist/routes/analytics-consent.d.ts +26 -0
  119. package/dist/routes/api-integrations.d.ts +25 -0
  120. package/dist/routes/api-keys.d.ts +17 -0
  121. package/dist/routes/artifact-catalog.d.ts +6 -0
  122. package/dist/routes/automations.d.ts +19 -0
  123. package/dist/routes/billing.d.ts +49 -0
  124. package/dist/routes/browser-sessions.d.ts +71 -3
  125. package/dist/routes/claude-subscription-accounts.d.ts +3 -0
  126. package/dist/routes/claude-subscription-oauth.d.ts +3 -0
  127. package/dist/routes/client-errors.d.ts +146 -0
  128. package/dist/routes/codex.d.ts +76 -2
  129. package/dist/routes/company-brain.d.ts +3 -0
  130. package/dist/routes/company-profile.d.ts +2 -1
  131. package/dist/routes/computer-sessions.d.ts +14 -0
  132. package/dist/routes/connect.d.ts +5 -0
  133. package/dist/routes/editable-artifacts.d.ts +2 -0
  134. package/dist/routes/external-identity-links.d.ts +6 -0
  135. package/dist/routes/feedback.d.ts +3 -0
  136. package/dist/routes/files.d.ts +4 -0
  137. package/dist/routes/github-browser-pages.d.ts +12 -0
  138. package/dist/routes/github.d.ts +2 -0
  139. package/dist/routes/insights-response-cache.d.ts +10 -0
  140. package/dist/routes/insights-usage.d.ts +12 -0
  141. package/dist/routes/insights.d.ts +30 -1
  142. package/dist/routes/knowledge.d.ts +3 -0
  143. package/dist/routes/managed-auth-session-sets.d.ts +26 -0
  144. package/dist/routes/managed-onboarding.d.ts +29 -0
  145. package/dist/routes/managed-sign-in-methods.d.ts +6 -0
  146. package/dist/routes/model-connection-access.d.ts +3 -0
  147. package/dist/routes/organization-integration-policy.d.ts +3 -0
  148. package/dist/routes/organization-integrations.d.ts +6 -0
  149. package/dist/routes/organization-mcp-connections.d.ts +3 -0
  150. package/dist/routes/organization-model-providers.d.ts +3 -0
  151. package/dist/routes/organization-recovery.d.ts +19 -0
  152. package/dist/routes/organization-service-accounts.d.ts +3 -0
  153. package/dist/routes/organization-sessions.d.ts +26 -0
  154. package/dist/routes/personal-github-git-broker.d.ts +29 -0
  155. package/dist/routes/personal-github.d.ts +3 -0
  156. package/dist/routes/pr-review-github.d.ts +3 -0
  157. package/dist/routes/pr-review.d.ts +3 -0
  158. package/dist/routes/session-artifact-associations.d.ts +4 -0
  159. package/dist/routes/session-history-imports.d.ts +9 -0
  160. package/dist/routes/sessions.d.ts +44 -6
  161. package/dist/routes/skill-content.d.ts +4 -0
  162. package/dist/routes/skill-install-authority.d.ts +6 -0
  163. package/dist/routes/subscription-account-pools.d.ts +34 -0
  164. package/dist/routes/subscription-pool-access.d.ts +16 -0
  165. package/dist/routes/supergrok.d.ts +6 -1
  166. package/dist/routes/usage-allowances.d.ts +12 -0
  167. package/dist/routes/user-resource-authorities.d.ts +3 -0
  168. package/dist/routes/workspace-artifacts.d.ts +2 -1
  169. package/dist/routes/workspace-capture.d.ts +10 -2
  170. package/dist/routes/workspace-integrations.d.ts +35 -0
  171. package/dist/routes/workspace-learning.d.ts +3 -0
  172. package/dist/routes/workspace-model-providers.d.ts +4 -0
  173. package/dist/routes/workspaces.d.ts +29 -0
  174. package/dist/sandbox/auth-callout.d.ts +8 -0
  175. package/dist/sandbox/channel-a.d.ts +19 -1
  176. package/dist/sandbox/connection-authority.d.ts +3 -0
  177. package/dist/sandbox/enrollment.d.ts +9 -1
  178. package/dist/sandbox/machines.d.ts +5 -2
  179. package/dist/sandbox/metrics-ingestion.d.ts +28 -20
  180. package/dist/sandbox/rematerialize.d.ts +2 -0
  181. package/dist/sandbox/session-attach-variable-sets.d.ts +30 -0
  182. package/dist/sandbox/viewer.d.ts +26 -1
  183. package/dist/sandbox-file-artifacts.d.ts +50 -0
  184. package/dist/scheduled-task-deletion.d.ts +13 -0
  185. package/dist/session-create-observability.d.ts +5 -0
  186. package/dist/session-event-view-MPS2OZD3.js +292 -0
  187. package/dist/session-event-view-MPS2OZD3.js.map +1 -0
  188. package/dist/site-session-origin.d.ts +13 -0
  189. package/dist/site-uploads.d.ts +41 -0
  190. package/dist/slack-reaction-files.d.ts +1 -1
  191. package/dist/temporal-schedule-cleanup.d.ts +1 -0
  192. package/dist/temporal-schedule-sync.d.ts +26 -0
  193. package/dist/transcription/providers/xai-subscription.d.ts +1 -0
  194. package/dist/transcription/service.d.ts +2 -1
  195. package/dist/work-discovery-observability.d.ts +33 -0
  196. package/dist/workspace-artifact-content.d.ts +28 -0
  197. package/dist/workspace-artifact-provenance.d.ts +7 -0
  198. package/dist/workspace-delete-observability.d.ts +10 -0
  199. package/dist/workspace-deletion.d.ts +6 -0
  200. package/dist/workspace-state-projection.d.ts +3 -5
  201. package/dist/workspace-tool-gateway-observability.d.ts +17 -0
  202. package/dist/workspace-tool-gateway.d.ts +123 -0
  203. package/dist/workspace-webhook-dispatch.d.ts +26 -0
  204. package/package.json +23 -19
  205. package/src/access-grant-rls.ts +75 -0
  206. package/src/admission-trace.ts +14 -0
  207. package/src/api-websocket.ts +23 -0
  208. package/src/app.ts +1974 -256
  209. package/src/artifact-catalog-cursor.ts +60 -0
  210. package/src/auth/managed-auth-attempt-context.ts +70 -0
  211. package/src/auth/managed-auth-rate-limits.ts +252 -0
  212. package/src/auth/managed-auth-session-adapter.ts +222 -0
  213. package/src/auth/managed-auth.ts +536 -60
  214. package/src/auth/managed-email.ts +174 -0
  215. package/src/auth/managed-sign-in-notifications.ts +81 -0
  216. package/src/auth/new-signups-gate.ts +49 -0
  217. package/src/auth/organization-user-setup.ts +307 -0
  218. package/src/auth/signup-funnel-metrics.ts +164 -0
  219. package/src/browser-controller-authority.ts +1 -186
  220. package/src/browser-ephemeral.ts +39 -0
  221. package/src/browser-state-authority.ts +1 -236
  222. package/src/claude-subscription-account-conflicts.ts +12 -0
  223. package/src/claude-subscription-account-usage.ts +48 -0
  224. package/src/claude-subscription-oauth.ts +362 -0
  225. package/src/claude-subscription-profile.ts +73 -0
  226. package/src/claude-subscription-usage.ts +97 -0
  227. package/src/claude-workspace-connection.ts +82 -0
  228. package/src/codemode.ts +194 -30
  229. package/src/codex-realtime.ts +8 -2
  230. package/src/company-brain-okf.ts +340 -0
  231. package/src/connected-machine-computer-access.ts +33 -0
  232. package/src/connection-ownership.ts +199 -0
  233. package/src/controller-data-plane.ts +81 -0
  234. package/src/editable-artifact-native-kernel.ts +26 -15
  235. package/src/editable-artifact-office-import.ts +77 -9
  236. package/src/editable-artifact-production.ts +23 -7
  237. package/src/editable-artifact-source-session.ts +123 -0
  238. package/src/editable-artifact-websocket.ts +27 -21
  239. package/src/editable-artifact-workspace-files.ts +31 -6
  240. package/src/fatal-process-boundary.ts +246 -0
  241. package/src/gateway-realtime.ts +1 -1
  242. package/src/github-access.ts +147 -5
  243. package/src/http/acting-person.ts +71 -0
  244. package/src/http/api-contract-compat.ts +49 -0
  245. package/src/http/api-error.ts +115 -1
  246. package/src/http/auth.ts +48 -0
  247. package/src/http/cors.ts +67 -0
  248. package/src/http/deprecation.ts +118 -0
  249. package/src/http/interaction-control-error.ts +164 -0
  250. package/src/http/keyed-admission.ts +29 -0
  251. package/src/http/local-browser-boundary.ts +343 -0
  252. package/src/http/metrics-listener.ts +57 -0
  253. package/src/http/path-identifier.ts +54 -0
  254. package/src/http/registered-route-label.ts +34 -0
  255. package/src/http/request-body.ts +127 -0
  256. package/src/http/request-source.ts +178 -0
  257. package/src/http/sse.ts +486 -132
  258. package/src/http/unmatched-route.ts +60 -0
  259. package/src/http/user-content.ts +158 -0
  260. package/src/http/websocket-upgrade-dispatch.ts +29 -0
  261. package/src/index.ts +157 -52
  262. package/src/integration-endpoint-test.ts +291 -0
  263. package/src/integrations/api-integrations.ts +98 -11
  264. package/src/integrations/atlassian.ts +474 -136
  265. package/src/integrations/connect-authority.ts +2 -0
  266. package/src/integrations/connect-callback-return.ts +86 -0
  267. package/src/integrations/fiken.ts +354 -64
  268. package/src/integrations/github-app-connect.ts +435 -0
  269. package/src/integrations/github-installation-proof.ts +60 -0
  270. package/src/integrations/github-lens-connect.ts +76 -0
  271. package/src/integrations/github-skill-source.ts +2 -142
  272. package/src/integrations/google-drive.ts +820 -222
  273. package/src/integrations/integration-commit-authority.ts +69 -0
  274. package/src/integrations/marketplace-plugin.ts +48 -0
  275. package/src/integrations/oauth-client.ts +1356 -459
  276. package/src/integrations/oauth-profiles.ts +537 -0
  277. package/src/integrations/oauth-return-path.ts +18 -0
  278. package/src/integrations/personal-github-repositories.ts +674 -0
  279. package/src/integrations/personal-github.ts +825 -0
  280. package/src/integrations/pr-review-provider.ts +246 -0
  281. package/src/integrations/provider-oauth.ts +250 -22
  282. package/src/integrations/slack-app-home.ts +300 -0
  283. package/src/integrations/slack-bot.ts +963 -239
  284. package/src/integrations/slack-file-upload-flow.ts +147 -0
  285. package/src/integrations/slack-install.ts +83 -0
  286. package/src/integrations/slack-interactions.ts +3170 -474
  287. package/src/integrations/slack-mrkdwn.ts +193 -0
  288. package/src/integrations/slack-routing.ts +337 -0
  289. package/src/integrations/slack-session-defaults.ts +224 -0
  290. package/src/integrations/slack-task-file-upload.ts +323 -0
  291. package/src/integrations/social-oauth.ts +213 -15
  292. package/src/interaction-agent-access.ts +48 -0
  293. package/src/interaction-frame-proxy.ts +409 -0
  294. package/src/interaction-metrics.ts +30 -0
  295. package/src/mcp/action-catalog-types.ts +9 -0
  296. package/src/mcp/action-catalog.gen.ts +6696 -0
  297. package/src/mcp/capability-account-readiness.ts +17 -0
  298. package/src/mcp/child-read-evidence.ts +19 -0
  299. package/src/mcp/command-read.ts +109 -0
  300. package/src/mcp/company-profile-agent-admin.ts +198 -0
  301. package/src/mcp/contract-input.ts +141 -0
  302. package/src/mcp/documents.ts +65 -377
  303. package/src/mcp/editable-artifacts.ts +12 -6
  304. package/src/mcp/files.ts +80 -38
  305. package/src/mcp/first-party-tool-permissions.ts +305 -0
  306. package/src/mcp/knowledge-entries.ts +322 -0
  307. package/src/mcp/orchestration-failure-diagnostic.ts +43 -0
  308. package/src/mcp/receipts.ts +34 -0
  309. package/src/mcp/request-abort.ts +44 -0
  310. package/src/mcp/scheduled-task-input.ts +76 -0
  311. package/src/mcp/scheduled-task-view.ts +44 -3
  312. package/src/mcp/server.ts +3030 -1267
  313. package/src/mcp/session-event-view.ts +383 -0
  314. package/src/mcp/session-view.ts +84 -3
  315. package/src/mcp/session-wait.ts +665 -0
  316. package/src/mcp-oauth.ts +1123 -0
  317. package/src/model-catalog.ts +91 -333
  318. package/src/observability.ts +15 -1
  319. package/src/organization-mcp.ts +397 -0
  320. package/src/organization-recovery-notifications.ts +103 -0
  321. package/src/routes/analytics-consent.ts +123 -0
  322. package/src/routes/api-integrations.ts +364 -74
  323. package/src/routes/api-keys.ts +336 -10
  324. package/src/routes/artifact-catalog.ts +279 -0
  325. package/src/routes/automations.ts +768 -0
  326. package/src/routes/billing.ts +461 -46
  327. package/src/routes/browser-sessions.ts +839 -131
  328. package/src/routes/canonical-human-identities.ts +90 -14
  329. package/src/routes/capabilities.ts +107 -6
  330. package/src/routes/channels.ts +20 -3
  331. package/src/routes/claude-subscription-accounts.ts +334 -0
  332. package/src/routes/claude-subscription-oauth.ts +142 -0
  333. package/src/routes/client-errors.ts +362 -0
  334. package/src/routes/codex.ts +833 -116
  335. package/src/routes/company-brain.ts +322 -0
  336. package/src/routes/company-profile.ts +65 -1
  337. package/src/routes/computer-sessions.ts +557 -106
  338. package/src/routes/connect.ts +1938 -0
  339. package/src/routes/connections.ts +1040 -349
  340. package/src/routes/documents.ts +488 -287
  341. package/src/routes/editable-artifacts.ts +79 -9
  342. package/src/routes/enrollments.ts +135 -39
  343. package/src/routes/environments.ts +154 -58
  344. package/src/routes/external-identity-links.ts +201 -0
  345. package/src/routes/feedback.ts +113 -0
  346. package/src/routes/files.ts +337 -39
  347. package/src/routes/github-browser-pages.ts +162 -0
  348. package/src/routes/github.ts +446 -144
  349. package/src/routes/insights-response-cache.ts +83 -0
  350. package/src/routes/insights-usage.ts +345 -0
  351. package/src/routes/insights.ts +153 -19
  352. package/src/routes/install.ts +133 -38
  353. package/src/routes/integration-facets.ts +107 -33
  354. package/src/routes/interaction-resources.ts +30 -3
  355. package/src/routes/knowledge.ts +488 -0
  356. package/src/routes/machines.ts +313 -15
  357. package/src/routes/managed-auth-session-sets.ts +1218 -0
  358. package/src/routes/managed-onboarding.ts +337 -0
  359. package/src/routes/managed-sign-in-methods.ts +433 -0
  360. package/src/routes/memory-slack-publications.ts +3 -2
  361. package/src/routes/model-connection-access.ts +208 -0
  362. package/src/routes/organization-integration-policy.ts +116 -0
  363. package/src/routes/organization-integrations.ts +326 -0
  364. package/src/routes/organization-mcp-connections.ts +178 -0
  365. package/src/routes/organization-memberships.ts +1019 -27
  366. package/src/routes/organization-model-providers.ts +293 -0
  367. package/src/routes/organization-recovery.ts +325 -0
  368. package/src/routes/organization-service-accounts.ts +128 -0
  369. package/src/routes/organization-sessions.ts +350 -0
  370. package/src/routes/personal-github-git-broker.ts +785 -0
  371. package/src/routes/personal-github.ts +370 -0
  372. package/src/routes/plugins.ts +251 -22
  373. package/src/routes/pr-review-github.ts +881 -0
  374. package/src/routes/pr-review.ts +622 -0
  375. package/src/routes/preference-registry.ts +12 -93
  376. package/src/routes/rigs.ts +167 -50
  377. package/src/routes/scheduled-tasks.ts +346 -41
  378. package/src/routes/session-artifact-associations.ts +87 -0
  379. package/src/routes/session-history-imports.ts +280 -0
  380. package/src/routes/sessions.ts +2306 -264
  381. package/src/routes/skill-content.ts +297 -0
  382. package/src/routes/skill-install-authority.ts +64 -0
  383. package/src/routes/skills.ts +62 -9
  384. package/src/routes/social.ts +46 -18
  385. package/src/routes/subscription-account-pools.ts +436 -0
  386. package/src/routes/subscription-pool-access.ts +126 -0
  387. package/src/routes/supergrok.ts +219 -303
  388. package/src/routes/transcription-recordings.ts +38 -3
  389. package/src/routes/transcriptions.ts +4 -0
  390. package/src/routes/usage-allowances.ts +378 -0
  391. package/src/routes/user-resource-authorities.ts +138 -0
  392. package/src/routes/video-generation.ts +14 -10
  393. package/src/routes/workspace-artifacts.ts +275 -69
  394. package/src/routes/workspace-capture.ts +21 -0
  395. package/src/routes/workspace-integrations.ts +576 -0
  396. package/src/routes/workspace-learning.ts +159 -0
  397. package/src/routes/workspace-model-providers.ts +148 -0
  398. package/src/routes/workspace-state.ts +38 -25
  399. package/src/routes/workspaces.ts +1004 -127
  400. package/src/sandbox/auth-callout.ts +96 -19
  401. package/src/sandbox/channel-a.ts +323 -24
  402. package/src/sandbox/connection-authority.ts +3 -0
  403. package/src/sandbox/enrollment.ts +81 -6
  404. package/src/sandbox/machines.ts +218 -76
  405. package/src/sandbox/metrics-ingestion.ts +411 -62
  406. package/src/sandbox/rematerialize.ts +121 -19
  407. package/src/sandbox/session-attach-variable-sets.ts +131 -0
  408. package/src/sandbox/viewer.ts +280 -25
  409. package/src/sandbox-file-artifacts.ts +413 -0
  410. package/src/scheduled-task-deletion.ts +138 -0
  411. package/src/session-create-observability.ts +46 -0
  412. package/src/session-realtime-context.ts +6 -3
  413. package/src/site-session-origin.ts +48 -0
  414. package/src/site-uploads.ts +224 -0
  415. package/src/slack-reaction-files.ts +16 -5
  416. package/src/temporal-schedule-cleanup.ts +13 -0
  417. package/src/temporal-schedule-sync.ts +74 -0
  418. package/src/transcription/providers/codex-subscription.ts +2 -0
  419. package/src/transcription/providers/openai.ts +1 -0
  420. package/src/transcription/providers/xai-subscription.ts +49 -3
  421. package/src/transcription/segmenter.ts +8 -2
  422. package/src/transcription/service.ts +43 -6
  423. package/src/work-discovery-observability.ts +121 -0
  424. package/src/workspace-artifact-content.ts +144 -0
  425. package/src/workspace-artifact-provenance.ts +104 -0
  426. package/src/workspace-delete-observability.ts +75 -0
  427. package/src/workspace-deletion.ts +73 -0
  428. package/src/workspace-state-projection.ts +18 -148
  429. package/src/workspace-tool-gateway-observability.ts +100 -0
  430. package/src/workspace-tool-gateway.ts +870 -0
  431. package/src/workspace-webhook-dispatch.ts +190 -0
  432. package/src/xai-subscription-auth.ts +9 -2
  433. package/dist/chunk-2PQMSRCB.js +0 -49759
  434. package/dist/chunk-2PQMSRCB.js.map +0 -1
  435. package/dist/routes/packs.d.ts +0 -3
  436. package/src/routes/packs.ts +0 -729
@@ -0,0 +1,42 @@
1
+ import type { MiddlewareHandler } from "hono";
2
+ /**
3
+ * A public `/v1` route whose current behaviour is scheduled for removal.
4
+ *
5
+ * See docs/design/api-compatibility-policy.md: a breaking change to the public
6
+ * surface is announced, advertised on every affected response with the
7
+ * standard `Deprecation` (RFC 9745) and `Sunset` (RFC 8594) headers plus a
8
+ * `Link: rel="deprecation"` to the migration notes, and the old behaviour is
9
+ * kept for at least 90 days on the managed service or until the next major,
10
+ * whichever is later. Published SDKs surface these headers to the integrator.
11
+ */
12
+ export type RouteDeprecation = {
13
+ /** Upper-case HTTP method. */
14
+ method: string;
15
+ /** The exact registered Hono template, e.g. `/v1/workspaces/:workspaceId/packs`. */
16
+ path: string;
17
+ /** When the deprecation was announced (ISO 8601). */
18
+ deprecatedAt: string;
19
+ /** Earliest removal on the managed service (ISO 8601). */
20
+ sunset: string;
21
+ /** Public migration notes (changelog/docs URL). */
22
+ link: string;
23
+ /** Optional successor route or document. */
24
+ successor?: string;
25
+ };
26
+ /**
27
+ * Every currently deprecated public route. Adding an entry here is the
28
+ * server-side half of a deprecation; the breaking change itself still needs an
29
+ * entry in scripts/public-api-breaking-changes.json and a new major.
30
+ */
31
+ export declare const DEPRECATED_ROUTES: readonly RouteDeprecation[];
32
+ /** Validate one registry entry; the policy's 90-day minimum is enforced here. */
33
+ export declare function assertValidRouteDeprecation(deprecation: RouteDeprecation): void;
34
+ /** The response headers that advertise one deprecation. */
35
+ export declare function deprecationHeaders(deprecation: RouteDeprecation): Record<string, string>;
36
+ /**
37
+ * Stamp deprecation headers on every response from a registered deprecated
38
+ * route, including error responses, so an integrator sees the notice whatever
39
+ * the call's outcome. Matching uses the registered route template, never
40
+ * request data.
41
+ */
42
+ export declare function deprecationHeadersMiddleware(registry?: readonly RouteDeprecation[]): MiddlewareHandler;
@@ -0,0 +1,13 @@
1
+ import { ErrorCode as AgentErrorCode } from "@opengeni/agent-proto";
2
+ import { type InteractionControlFailureCode } from "@opengeni/contracts";
3
+ import { ApiHttpError } from "./api-error.js";
4
+ export type InteractionControlSurface = "browser" | "computer";
5
+ /**
6
+ * Projects an internal connected-machine control fault into the public API
7
+ * vocabulary. This is deliberately an allowlist: the agent's free-form message
8
+ * and detail map may contain paths, process output, or provider diagnostics and
9
+ * never cross this boundary. The exact inner request id is safe opaque
10
+ * correlation and links API logs back to the machine operation.
11
+ */
12
+ export declare function interactionControlApiError(error: unknown, surface: InteractionControlSurface): ApiHttpError | null;
13
+ export declare function publicControlFailureCode(code: AgentErrorCode): InteractionControlFailureCode;
@@ -0,0 +1,12 @@
1
+ /**
2
+ * One token bucket per closed key, for anonymous beacon routes. It bounds
3
+ * counter inflation and log volume from any caller without per-client state.
4
+ */
5
+ export type KeyedAdmission<Key extends string> = {
6
+ admit(key: Key): boolean;
7
+ };
8
+ export declare function createKeyedAdmission<Key extends string>(options?: {
9
+ capacity?: number;
10
+ refillPerSecond?: number;
11
+ now?: () => number;
12
+ }): KeyedAdmission<Key>;
@@ -0,0 +1,72 @@
1
+ import { type Settings } from "@opengeni/config";
2
+ /**
3
+ * Browser boundary for the unauthenticated local product mode.
4
+ *
5
+ * In `local` access mode every request without credentials acts as the local
6
+ * `dev` user, and the default local sandbox runs agent commands on the host.
7
+ * Binding the API to loopback keeps other devices out, but a web page open in
8
+ * the developer's browser can still reach `http://127.0.0.1:<port>`:
9
+ *
10
+ * - any site can send cross-origin requests to it (CORS only hides the
11
+ * response; a simple POST still runs), and
12
+ * - a DNS-rebinding site can make its own hostname resolve to 127.0.0.1 and
13
+ * read responses as a same-origin page.
14
+ *
15
+ * The boundary therefore sorts the `Host` a request is addressed to into two
16
+ * classes:
17
+ *
18
+ * - Browser hosts: loopback, the hosts of the configured web, public, and
19
+ * extra origins, the GitHub App callback tunnel, and a specific API bind
20
+ * address. A present `Origin` must be this stack's web app, an explicitly
21
+ * configured origin, or the API's own address on one of these hosts.
22
+ * - Sandbox hosts: names only sandboxes and the worker use to reach the API
23
+ * (`host.docker.internal` with the Docker sandbox, and the hosts of
24
+ * `OPENGENI_MCP_URL` and `OPENGENI_MCP_INTERNAL_URL`). They serve only the
25
+ * sandbox routes (Codemode, first-party MCP, and the Git broker) and refuse
26
+ * any request that carries browser metadata. A browser cannot tell a
27
+ * sandbox name from an attacker's, so a rebinding page on one of these
28
+ * names can neither send an accepted `Origin` nor reach the rest of the API.
29
+ *
30
+ * Every other `Host` is refused. Non-browser clients (the SDK, curl, sandbox
31
+ * callbacks, host-app servers) send no `Origin` and are unaffected. The `Host`
32
+ * port is not compared: a rebinding page controls only the hostname, while
33
+ * local proxies and forwarders legitimately present their own port.
34
+ *
35
+ * It applies only to `local` access mode in the `local` environment (the
36
+ * `bun run dev` stack and manual local runs). Managed and configured access
37
+ * modes, and deployments that set another `OPENGENI_ENVIRONMENT`, keep their
38
+ * existing CORS policy.
39
+ */
40
+ export type LocalBrowserBoundarySettings = Pick<Settings, "productAccessMode" | "environment" | "apiHost" | "webBaseUrl" | "publicBaseUrl" | "opengeniMcpUrl" | "opengeniMcpInternalUrl" | "githubAppManifestBaseUrl" | "localAllowedOrigins" | "sandboxBackend">;
41
+ export type LocalBrowserBoundaryRejectionCode = "LOCAL_HOST_NOT_ALLOWED" | "LOCAL_ORIGIN_NOT_ALLOWED" | "LOCAL_SANDBOX_ROUTE_ONLY";
42
+ export type LocalBrowserBoundaryRejection = {
43
+ status: 403;
44
+ code: LocalBrowserBoundaryRejectionCode;
45
+ message: string;
46
+ /** The refused `Host` or `Origin`, for the API log only; never sent back. */
47
+ refused: string;
48
+ };
49
+ /** Called once per distinct refused value, so an operator can see why. */
50
+ export type LocalBrowserBoundaryWarn = (message: string, attributes: Record<string, string>) => void;
51
+ export type LocalBrowserBoundary = {
52
+ readonly allowedOrigins: ReadonlySet<string>;
53
+ /** Hostnames a browser may address. */
54
+ readonly browserHostnames: ReadonlySet<string>;
55
+ /** Hostnames only sandboxes and the worker use; sandbox routes only, no browsers. */
56
+ readonly sandboxHostnames: ReadonlySet<string>;
57
+ /** Whether a present `Origin` may call the API for a request with this `Host`. */
58
+ originAllowed(origin: string, host: string | null): boolean;
59
+ /** The rejection for this request, or null when the boundary admits it. */
60
+ rejection(request: Request): LocalBrowserBoundaryRejection | null;
61
+ };
62
+ /** Mark a request the API dispatches to itself so the boundary admits it. */
63
+ export declare function markLocalInternalDispatch(request: Request): Request;
64
+ export declare function localBrowserBoundaryApplies(settings: Pick<Settings, "productAccessMode" | "environment">): boolean;
65
+ /** Build the boundary, or null when the deployment is not the local dev product. */
66
+ export declare function createLocalBrowserBoundary(settings: LocalBrowserBoundarySettings, options?: {
67
+ warn?: LocalBrowserBoundaryWarn;
68
+ }): LocalBrowserBoundary | null;
69
+ /** The standard API error envelope for a boundary rejection outside Hono. */
70
+ export declare function localBrowserBoundaryResponse(rejection: LocalBrowserBoundaryRejection): Response;
71
+ /** The `Host` the boundary checks: the header, else the request URL's authority. */
72
+ export declare function localBrowserRequestHost(request: Request): string | null;
@@ -0,0 +1,22 @@
1
+ import type { Settings } from "@opengeni/config";
2
+ import { Hono } from "hono";
3
+ type PrometheusSource = {
4
+ prometheusMetrics(): Promise<string>;
5
+ };
6
+ /** Register the Prometheus exposition route on one Hono app. */
7
+ export declare function registerPrometheusMetricsRoute(app: Hono, observability: PrometheusSource): void;
8
+ /**
9
+ * Whether the public API listener serves `GET /metrics`. A deployment that sets
10
+ * `OPENGENI_API_METRICS_PORT` moves the exposition to a dedicated internal
11
+ * listener, so an ingress that forwards every path to the API cannot publish it.
12
+ */
13
+ export declare function publicListenerServesMetrics(settings: Pick<Settings, "apiMetricsPort">): boolean;
14
+ /**
15
+ * The dedicated metrics listener: only `GET /metrics`, behind the same
16
+ * deployment-key perimeter rules as the public listener. Nothing else is
17
+ * routed here, so exposing this port to a scraper exposes nothing else.
18
+ */
19
+ export declare function createMetricsListenerApp(settings: Settings, observability: PrometheusSource): Hono;
20
+ /** Start the dedicated listener when configured; returns undefined otherwise. */
21
+ export declare function startApiMetricsListener(settings: Settings, observability: PrometheusSource): ReturnType<typeof Bun.serve> | undefined;
22
+ export {};
@@ -0,0 +1,17 @@
1
+ import { ApiHttpError } from "./api-error.js";
2
+ /**
3
+ * A resource id taken verbatim from the URL path that is not a UUID cannot
4
+ * name any row. Routes pass such ids straight to PostgreSQL, which rejects the
5
+ * cast (SQLSTATE 22P02); that is a client addressing error, so answer 404
6
+ * instead of an unhandled 500.
7
+ *
8
+ * Deliberately narrow: only a uuid-syntax failure whose rejected text is
9
+ * exactly one of this request's own path segments qualifies. A malformed UUID
10
+ * produced by server code (a stored value, a derived subject, a body field)
11
+ * does not appear as a path segment and stays a genuine 500.
12
+ *
13
+ * Typical cause: a client built against a newer API calls a literal route
14
+ * (for example `.../scheduled-tasks/attention`) that an older server does not
15
+ * have, so the literal falls through to `.../scheduled-tasks/:taskId`.
16
+ */
17
+ export declare function invalidPathIdentifierHttpError(error: unknown, pathname: string): ApiHttpError | null;
@@ -0,0 +1,16 @@
1
+ import type { Context } from "hono";
2
+ /**
3
+ * The registered Hono path template of the handler that answers this request.
4
+ *
5
+ * Hono resolves every route matching a request before the first middleware
6
+ * runs, so the metrics middleware can read the exact code-owned template (for
7
+ * example `/v1/workspaces/:workspaceId/rigs/:rigId`) without re-implementing
8
+ * routing. Templates come only from route registrations, never from request
9
+ * data, so they are a closed and bounded metric/log label set.
10
+ *
11
+ * Middleware (arity two: `(context, next)`) and global catch-alls never name a
12
+ * route; the first matched terminal handler is the one Hono dispatches to.
13
+ */
14
+ export declare function registeredHandlerRoutePath(context: Context): string | null;
15
+ /** Normalize a registered template; drop catch-alls that would name nothing. */
16
+ export declare function boundedRegisteredRouteLabel(path: string | null | undefined): string | null;
@@ -0,0 +1,27 @@
1
+ import type { Context } from "hono";
2
+ import type { z } from "zod";
3
+ import { ZodError } from "zod";
4
+ import { ApiHttpError } from "./api-error.js";
5
+ /** Parse an already-read request body against its public request schema. */
6
+ export declare function parseRequestBody<Schema extends z.ZodType>(schema: Schema, body: unknown): z.output<Schema>;
7
+ /**
8
+ * Read the request body as JSON. Malformed JSON is a client error (400), never
9
+ * an unhandled `SyntaxError` 500. Other failures (body limit, aborted stream)
10
+ * keep their own mapping.
11
+ */
12
+ export declare function readRequestJson(c: Context): Promise<unknown>;
13
+ /** Read and validate a JSON request body in one step. */
14
+ export declare function parseRequestJson<Schema extends z.ZodType>(c: Context, schema: Schema): Promise<z.output<Schema>>;
15
+ /**
16
+ * Tag malformed-JSON failures of `c.req.json()` for this request. The same
17
+ * `SyntaxError` instance is rethrown so routes that already catch it keep
18
+ * their own mapping; an uncaught one becomes a 400 in `app.onError` instead of
19
+ * a 500. A `SyntaxError` from parsing stored or upstream data is never tagged.
20
+ */
21
+ export declare function tagRequestJsonParseErrors(c: Context): void;
22
+ export declare function isRequestBodyValidationError(error: unknown): error is ZodError | SyntaxError;
23
+ /**
24
+ * Public 400 for a registered request-body validation failure, naming every
25
+ * offending field (bounded) so API callers can correct the request.
26
+ */
27
+ export declare function requestBodyValidationHttpError(error: unknown): ApiHttpError | null;
@@ -0,0 +1,52 @@
1
+ import { type Settings } from "@opengeni/config";
2
+ import type { Context } from "hono";
3
+ declare const TRANSPORT_PEER_ADDRESS_BINDING = "opengeniTransportPeerAddress";
4
+ /** Returned when the runtime supplied no transport peer (for example an
5
+ * in-process test request). Callers treat it as one shared bucket. */
6
+ export declare const UNKNOWN_REQUEST_SOURCE_ADDRESS = "unknown";
7
+ /**
8
+ * App-owned request header carrying the server-resolved client address into
9
+ * Better Auth, which reads client addresses only from request headers. It is
10
+ * removed from every inbound request and re-stamped on managed-auth routes, so
11
+ * a caller-supplied value never reaches the auth rate limiter or session IP.
12
+ */
13
+ export declare const TRUSTED_CLIENT_ADDRESS_HEADER = "x-opengeni-trusted-client-address";
14
+ type ApiRequestBindings = {
15
+ [TRANSPORT_PEER_ADDRESS_BINDING]?: string | null;
16
+ };
17
+ /** The deployment's declared proxy chain (`OPENGENI_API_TRUSTED_PROXY_*`). */
18
+ export type RequestSourceTrust = Pick<Settings, "apiTrustedProxyHops" | "apiTrustedProxyCidrs">;
19
+ export declare function apiRequestBindingsForTransportPeer(address: string | null | undefined): ApiRequestBindings;
20
+ /**
21
+ * Resolve a quota/audit source from the server-owned transport peer. Forwarded
22
+ * values are considered only when the operator declares an exact trusted proxy
23
+ * hop count (`OPENGENI_API_TRUSTED_PROXY_HOPS`) and, when
24
+ * `OPENGENI_API_TRUSTED_PROXY_CIDRS` is set, only for a transport peer inside
25
+ * those ranges. Each trusted proxy must append the address of the peer that
26
+ * connected to it, or overwrite the header with the original client address;
27
+ * the chain is then walked from the server side so caller-prepended values
28
+ * cannot replace the address observed by the trusted edge. A missing, short,
29
+ * or malformed chain falls back to the transport peer.
30
+ */
31
+ export declare function trustedRequestSourceAddress(c: Context, trust: RequestSourceTrust): string;
32
+ /**
33
+ * Rate-limit key for a trusted source address. An IPv6 address keys on its
34
+ * /64, the block one subscriber normally holds and the granularity Better
35
+ * Auth applies to the same stamped address, so rotating addresses inside one
36
+ * /64 cannot mint fresh buckets. An IPv4-mapped IPv6 address (how a
37
+ * dual-stack listener reports an IPv4 peer) keys on the embedded IPv4 address
38
+ * instead of collapsing every IPv4 client into one /64. Anything else,
39
+ * including {@link UNKNOWN_REQUEST_SOURCE_ADDRESS}, is returned unchanged.
40
+ */
41
+ export declare function requestSourceRateLimitKey(address: string): string;
42
+ /** {@link trustedRequestSourceAddress} as an application rate-limit key. */
43
+ export declare function trustedRequestSourceRateLimitKey(c: Context, trust: RequestSourceTrust): string;
44
+ /**
45
+ * Replace any caller-supplied {@link TRUSTED_CLIENT_ADDRESS_HEADER}. When
46
+ * `stamp` is true the header is set to the trusted source address, so every
47
+ * Better Auth request derived from this request (direct handler calls,
48
+ * isolated provider requests, and `auth.api.*` calls built from its headers)
49
+ * keys rate limits and session records on the real client.
50
+ */
51
+ export declare function replaceTrustedClientAddressHeader(c: Context, trust: RequestSourceTrust, stamp: boolean): void;
52
+ export {};
@@ -5,6 +5,8 @@ import type { Observability } from "@opengeni/observability";
5
5
  export declare const SSE_QUEUED_FRAME_MAX_COUNT = 1;
6
6
  export declare const SSE_WRITE_STALL_TIMEOUT_MS = 30000;
7
7
  export declare const SSE_HEARTBEAT_INTERVAL_MS = 15000;
8
+ export declare const HTTP1_BROWSER_SSE_BATCH_MAX_BYTES: number;
9
+ export declare const HTTP1_BROWSER_SSE_BATCH_CONTENT_TYPE = "application/vnd.opengeni.sse-batch";
8
10
  export type SseDeliveryBoundObservation = {
9
11
  reason: "desired_size_non_positive" | "stall_timeout" | "frame_too_large";
10
12
  desiredSize: number | null;
@@ -12,6 +14,7 @@ export type SseDeliveryBoundObservation = {
12
14
  queuedBytes: number;
13
15
  };
14
16
  export type ByteBoundedSseStreamOptions = {
17
+ connectionLifetimeMs?: number | undefined;
15
18
  maxQueuedBytes?: number;
16
19
  stallTimeoutMs?: number;
17
20
  onStop?: () => void;
@@ -30,11 +33,12 @@ export type ByteBoundedSseStream = {
30
33
  * checking `desiredSize` can still accumulate an unbounded server-side queue.
31
34
  *
32
35
  * One writer is expected per stream. The Web Streams queue holds at most one
33
- * complete frame, and that frame must fit inside the byte cap. A second write
36
+ * complete frame. One oversized frame is delivered intact rather than lost;
37
+ * the byte budget is a batching target, not a content limit. A second write
34
38
  * waits for consumer pull only for a bounded interval; cancellation or a stalled
35
39
  * reader wakes it and terminates upstream delivery before another durable page is
36
- * read. One frame is deliberate: it makes both queued-frame count and queued
37
- * bytes independently bounded instead of relying on byte accounting alone.
40
+ * read. One frame is deliberate: queued memory is bounded by one event, not
41
+ * by the size of the session, without imposing a lossy per-message limit.
38
42
  */
39
43
  export declare function createByteBoundedSseStream(options?: ByteBoundedSseStreamOptions): ByteBoundedSseStream;
40
44
  export type LatestWinsDelivery<T extends {
@@ -76,14 +80,21 @@ export declare function sseWorkspaceLiveStream(db: Database, bus: EventBus, acco
76
80
  */
77
81
  export declare function sseWorkspaceInteractionRevisionStream(db: Database, accountId: string, workspaceId: string, after: number, signal: AbortSignal, options?: WorkspaceInteractionSseOptions): Promise<Response>;
78
82
  export type SseDeliveryOptions = {
83
+ connectionLifetimeMs?: number | undefined;
84
+ /** Return a known-length batch instead of a chunked response. HTTP/1 only. */
85
+ finiteResponseMaxBytes?: number | undefined;
86
+ /** Browser transport classification for a finite response. */
87
+ finiteResponseMediaType?: "event-stream" | "http1-browser-batch" | undefined;
79
88
  maxQueuedBytes?: number;
80
89
  stallTimeoutMs?: number;
81
90
  heartbeatIntervalMs?: number;
82
91
  observability?: Observability | undefined;
83
92
  onObservation?: ((observation: SseDeliveryBoundObservation) => void) | undefined;
84
- };
85
- export type SessionSseDeliveryOptions = SseDeliveryOptions & {
86
- /** Host ACL re-check, run even while the event stream is otherwise idle. */
93
+ /** Current ACL re-check, run even while the event stream is idle. */
87
94
  reauthorize?: (() => Promise<void>) | undefined;
88
95
  reauthorizeAfterMs?: number | undefined;
96
+ /** Exact selected actor emitted on the stream response for cross-tab fencing. */
97
+ actorEpoch?: string | undefined;
89
98
  };
99
+ export declare function browserSseDeliveryOptions(transport: string | undefined): Pick<SseDeliveryOptions, "connectionLifetimeMs" | "finiteResponseMaxBytes" | "finiteResponseMediaType">;
100
+ export type SessionSseDeliveryOptions = SseDeliveryOptions;
@@ -0,0 +1,18 @@
1
+ import type { Context, Hono } from "hono";
2
+ export type UnmatchedRoute = {
3
+ status: 404;
4
+ } | {
5
+ status: 405;
6
+ allow: string[];
7
+ };
8
+ /**
9
+ * Classify a request no registered handler can answer, BEFORE authentication
10
+ * or authorization middleware runs. Those layers otherwise turn a request for a
11
+ * route that does not exist into an authorization-shaped failure (for example
12
+ * the fail-closed session operation classifier answering a retryable 503), so
13
+ * a client probing an unknown method or path would be told to retry forever.
14
+ *
15
+ * Returns null when the request has a handler, or when classification itself
16
+ * fails (fail open: the request keeps its previous routing behavior).
17
+ */
18
+ export declare function unmatchedRoute(app: Hono, c: Context): UnmatchedRoute | null;
@@ -0,0 +1,36 @@
1
+ export declare const USER_CONTENT_SECURITY_POLICY = "default-src 'none'; img-src 'self' data: blob:; media-src 'self' data: blob:; style-src 'unsafe-inline'; sandbox";
2
+ /** Media players only; scripts stay disabled (see the module comment). */
3
+ export declare const USER_MEDIA_CONTENT_SECURITY_POLICY = "default-src 'none'; img-src 'self' data: blob:; media-src 'self' data: blob:; style-src 'unsafe-inline'; sandbox allow-same-origin";
4
+ export declare const USER_CONTENT_SECURITY_HEADERS: Readonly<{
5
+ readonly "Content-Security-Policy": "default-src 'none'; img-src 'self' data: blob:; media-src 'self' data: blob:; style-src 'unsafe-inline'; sandbox";
6
+ readonly "Cross-Origin-Resource-Policy": "same-origin";
7
+ readonly "X-Content-Type-Options": "nosniff";
8
+ }>;
9
+ /**
10
+ * True when a browser would render this type as an active document (HTML,
11
+ * XHTML, SVG, any XML dialect, or multipart replacement streams). Anything that
12
+ * is not a clean `type/subtype` token is treated as active too.
13
+ */
14
+ export declare function isActiveUserContentType(contentType: string): boolean;
15
+ /** `Content-Disposition: attachment` for active markup; inline types are unchanged. */
16
+ export declare function userContentDispositionHeaders(contentType: string, filename?: string | null): {
17
+ "Content-Disposition": string;
18
+ } | Record<string, never>;
19
+ /**
20
+ * Signed object-storage GET options for one stored object: active markup gets
21
+ * a signed `attachment` response override, so a browser that opens the URL
22
+ * downloads the bytes instead of rendering them with their stored type. The
23
+ * storage endpoint is not always a separate site (local development serves it
24
+ * from loopback, and a preview may route the bucket path on the app origin),
25
+ * so a signed URL follows the same rule as the API routes. Spread into
26
+ * `createGetUrl`; inline types add nothing.
27
+ */
28
+ export declare function userContentSignedGetUrlOptions(contentType: string, filename?: string | null): {
29
+ responseContentDisposition: string;
30
+ } | Record<string, never>;
31
+ /** True for audio and video types the browser plays in a synthesized media document. */
32
+ export declare function isPlayableMediaUserContentType(contentType: string): boolean;
33
+ /** Sandbox policy for one response; only playable media keeps its origin. */
34
+ export declare function userContentSecurityPolicy(contentType: string): string;
35
+ /** Full header set for one user-content response with the given content type. */
36
+ export declare function userContentResponseHeaders(contentType: string, filename?: string | null): Record<string, string>;
@@ -0,0 +1,18 @@
1
+ import { type LocalBrowserBoundary } from "./local-browser-boundary.js";
2
+ export type ApiWebSocketUpgradeRoute<Server> = {
3
+ handles(request: Request): boolean;
4
+ upgrade(request: Request, server: Server): Response | undefined;
5
+ };
6
+ export type ApiWebSocketUpgradeDispatch = {
7
+ handled: false;
8
+ } | {
9
+ handled: true;
10
+ response: Response | undefined;
11
+ };
12
+ /**
13
+ * WebSocket upgrades bypass the Hono app, so the local-mode browser boundary
14
+ * (./local-browser-boundary.ts) is applied here before a transport upgrades.
15
+ * Returns `{ handled: false }` when no transport claims the request, so the
16
+ * caller dispatches it to the app, where the boundary runs as middleware.
17
+ */
18
+ export declare function dispatchApiWebSocketUpgrade<Server>(request: Request, server: Server, routes: ReadonlyArray<ApiWebSocketUpgradeRoute<Server>>, localBrowserBoundary: LocalBrowserBoundary | null): ApiWebSocketUpgradeDispatch;
package/dist/index.d.ts CHANGED
@@ -1,17 +1,24 @@
1
1
  import { getSettings } from "@opengeni/config";
2
2
  import type { ScheduledTaskOverlapPolicy, ScheduledTaskScheduleSpec } from "@opengeni/contracts";
3
3
  import { type Database } from "@opengeni/db";
4
+ import { type Observability } from "@opengeni/observability";
4
5
  import { ScheduleOverlapPolicy } from "@temporalio/client";
5
6
  import type { ScheduleSpec } from "@temporalio/client";
6
7
  import { type DocumentIndexClient, type SessionWorkflowClient } from "./app.js";
7
- import { type EditableArtifactWebSocketConnection } from "./editable-artifact-websocket.js";
8
8
  export declare function createTemporalWorkflowClient(settings: ReturnType<typeof getSettings>, db: Database): Promise<{
9
9
  client: SessionWorkflowClient;
10
10
  documentIndexer: DocumentIndexClient;
11
11
  close: () => Promise<void>;
12
12
  }>;
13
- export declare function startApi(): Promise<{
14
- server: Bun.Server<EditableArtifactWebSocketConnection>;
13
+ export declare function startApi(options?: {
14
+ settings?: ReturnType<typeof getSettings>;
15
+ observability?: Observability;
16
+ }): Promise<{
17
+ server: Bun.Server<Readonly<{
18
+ attach(socket: import("./api-websocket.js").ApiWebSocketLike): void;
19
+ receive(message: string | Uint8Array | ArrayBuffer): void;
20
+ transportClosed(): void;
21
+ }>>;
15
22
  close: () => Promise<void>;
16
23
  }>;
17
24
  export declare function temporalOverlapPolicy(policy: ScheduledTaskOverlapPolicy): ScheduleOverlapPolicy;