@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,193 @@
1
+ /**
2
+ * Markdown to Slack mrkdwn for model-authored text Opengeni posts to Slack.
3
+ *
4
+ * Agents write ordinary Markdown because the same reply renders as Markdown in
5
+ * the Opengeni console. Slack message text does not render Markdown headings,
6
+ * `**bold**`, or `[label](url)` links, so a reply that reads well in the
7
+ * console arrives in Slack full of literal syntax. This rewrites only that
8
+ * syntax, only for the bytes handed to Slack: stored session events, model
9
+ * history, and every other surface keep the model's exact text. It is
10
+ * formatting at a third-party sink, not content classification or redaction.
11
+ *
12
+ * Code is never rewritten: fenced code blocks keep every line between their
13
+ * fences, and inline code spans are copied as they are.
14
+ *
15
+ * The output is part of the Slack post and update ledgers' request digest, so a
16
+ * change to it changes the bytes an in-flight operation is bound to. Delivery
17
+ * (`deliverSlackModelText` in `slack-interactions.ts`) falls back only to the
18
+ * unformatted text; a later output change must keep the previous rendering
19
+ * reachable the same way, or operations started before the deploy conflict on
20
+ * every retry.
21
+ */
22
+
23
+ /**
24
+ * A private provider citation handle: U+E200 `cite`, one or more U+E202
25
+ * separated references, then U+E201. Codex web search can emit these without
26
+ * the annotation table that would make them resolvable, so they carry nothing a
27
+ * Slack reader can use. The Opengeni timeline hides the same handles
28
+ * (`stripOpaqueCitationTokens` in `packages/react/src/timeline/projection.ts`).
29
+ */
30
+ const PROVIDER_CITATION_TOKEN =
31
+ /[ \t]*\u{E200}(?:cite|filecite)(?:\u{E202}[^\u{E200}-\u{E202}]*)*\u{E201}/gu;
32
+ /** Stray citation delimiters, for example from a token cut short upstream. */
33
+ const PROVIDER_CITATION_DELIMITER = /[\u{E200}-\u{E202}]/gu;
34
+
35
+ /**
36
+ * A fence at any indentation. Agents nest code under list items (a `10.` item
37
+ * or a nested bullet puts the fence four or more spaces in), and Slack has no
38
+ * indented code block, so a fence line is a fence wherever it starts.
39
+ */
40
+ const FENCE_OPEN = /^[ \t]*(`{3,}|~{3,})(.*)$/u;
41
+ const ATX_HEADING = /^ {0,3}#{1,6}[ \t]+(.*?)(?:[ \t]+#+)?[ \t]*$/u;
42
+ const BULLET = /^([ \t]*)[-*+][ \t]+(?=\S)/u;
43
+ const THEMATIC_BREAK = /^ {0,3}([-*_])(?:[ \t]*\1){2,}[ \t]*$/u;
44
+
45
+ /**
46
+ * Spans that must reach Slack exactly as written and are set aside before any
47
+ * link is read: inline code, and Slack's own `<...>` tokens (mentions, channel
48
+ * links, and links already in Slack form).
49
+ */
50
+ const CODE_SPAN_OR_SLACK_TOKEN =
51
+ /(`+)(?!`)[^\n]*?(?<!`)\1(?!`)|<(?:[@#!]|https?:|mailto:)[^<>\n]*>/gu;
52
+
53
+ /**
54
+ * A Markdown link or image whose target is a web or mail address. Other
55
+ * targets, such as Opengeni's own `artifact:` and `sandbox:` links, mean
56
+ * nothing in Slack and are left as written rather than turned into dead links.
57
+ * One level of balanced parentheses is allowed in the URL (as in Wikipedia
58
+ * links), and an optional link title is dropped.
59
+ */
60
+ const MARKDOWN_LINK =
61
+ /!?\[((?:[^[\]\n]|\[[^[\]\n]*\])+)\]\(\s*((?:https?:\/\/|mailto:)(?:[^\s()<>|]|\([^\s()<>|]*\))+)(?:\s+(?:"[^"\n]*"|'[^'\n]*'|\([^()\n]*\)))?\s*\)/gu;
62
+
63
+ /** Bare URLs are set aside after links: they may legitimately contain `__` or `**`. */
64
+ const BARE_URL = /\bhttps?:\/\/[^\s<>]+/gu;
65
+
66
+ const BOLD_ITALIC_ASTERISK = /\*\*\*(?=[^\s*])((?:[^*\n]|\*(?!\*))+?)(?<=[^\s*])\*\*\*/gu;
67
+ const BOLD_ASTERISK = /\*\*(?=[^\s*])((?:[^*\n]|\*(?!\*))+?)(?<=[^\s*])\*\*/gu;
68
+ const BOLD_UNDERSCORE =
69
+ /(?<![\p{L}\p{N}_])__(?=[^\s_])((?:[^_\n]|_(?!_))+?)(?<=[^\s_])__(?![\p{L}\p{N}_])/gu;
70
+ const STRIKETHROUGH = /~~(?=[^\s~])((?:[^~\n]|~(?!~))+?)(?<=[^\s~])~~/gu;
71
+ const PLACEHOLDER = /\u0000(\d+)\u0000/gu;
72
+
73
+ /** Remove provider citation handles and any stray citation delimiters. */
74
+ export function stripProviderCitationMarkers(text: string): string {
75
+ return text.replace(PROVIDER_CITATION_TOKEN, "").replace(PROVIDER_CITATION_DELIMITER, "");
76
+ }
77
+
78
+ /**
79
+ * Rewrite common Markdown as Slack mrkdwn.
80
+ *
81
+ * - `# Heading` (any level) becomes a bold line.
82
+ * - `**bold**` and `__bold__` become `*bold*`, `***both***` becomes `*_both_*`,
83
+ * and `~~struck~~` becomes `~struck~`.
84
+ * - `[label](https://...)` becomes `<https://...|label>`.
85
+ * - `-`, `*`, and `+` bullets become Slack's `•` bullet, keeping indentation;
86
+ * numbered lists and block quotes are already Slack syntax and stay as they are.
87
+ * - Fenced code blocks, at any indentation, keep their contents byte for byte.
88
+ * The opening fence loses its language tag, which Slack would otherwise print
89
+ * as the first code line, and an unclosed block is closed so Slack still
90
+ * renders it as code.
91
+ * - Provider citation handles are removed.
92
+ *
93
+ * Text that uses none of this syntax comes back unchanged.
94
+ */
95
+ export function slackMrkdwnFromMarkdown(markdown: string): string {
96
+ const lines = stripProviderCitationMarkers(markdown).split("\n");
97
+ const output: string[] = [];
98
+ let fence: { character: string; length: number } | null = null;
99
+ for (const line of lines) {
100
+ if (fence) {
101
+ if (closesFence(line, fence)) {
102
+ output.push("```");
103
+ fence = null;
104
+ } else {
105
+ output.push(line);
106
+ }
107
+ continue;
108
+ }
109
+ const opening = FENCE_OPEN.exec(line);
110
+ // A backtick fence's info string cannot contain a backtick; such a line is
111
+ // inline code, not a fence.
112
+ if (opening && !(opening[1]!.startsWith("`") && opening[2]!.includes("`"))) {
113
+ fence = { character: opening[1]![0]!, length: opening[1]!.length };
114
+ output.push("```");
115
+ continue;
116
+ }
117
+ output.push(slackLine(line));
118
+ }
119
+ if (fence) output.push("```");
120
+ return output.join("\n");
121
+ }
122
+
123
+ function closesFence(line: string, fence: { character: string; length: number }): boolean {
124
+ const trimmed = line.trim();
125
+ return (
126
+ trimmed.length >= fence.length &&
127
+ [...trimmed].every((character) => character === fence.character)
128
+ );
129
+ }
130
+
131
+ function slackLine(line: string): string {
132
+ if (THEMATIC_BREAK.test(line)) return line;
133
+ const heading = ATX_HEADING.exec(line);
134
+ if (heading) {
135
+ const content = slackInline(heading[1]!, { heading: true }).trim();
136
+ return content ? `*${content}*` : line;
137
+ }
138
+ const bullet = BULLET.exec(line);
139
+ if (bullet) {
140
+ return `${bullet[1]}• ${slackInline(line.slice(bullet[0].length), { heading: false })}`;
141
+ }
142
+ return slackInline(line, { heading: false });
143
+ }
144
+
145
+ function slackInline(text: string, options: { heading: boolean }): string {
146
+ const kept: string[] = [];
147
+ const keep = (value: string) => {
148
+ kept.push(value);
149
+ return `\u0000${kept.length - 1}\u0000`;
150
+ };
151
+ // The placeholders are NUL-delimited, so a NUL in the model text itself
152
+ // could collide with one. Slack does not render NUL; drop it.
153
+ let working = text.replace(/\u0000/gu, "");
154
+ working = working.replace(CODE_SPAN_OR_SLACK_TOKEN, keep);
155
+ working = working.replace(MARKDOWN_LINK, (_match, label: string, url: string) =>
156
+ keep(slackLink(restore(label, kept), url)),
157
+ );
158
+ working = working.replace(BARE_URL, keep);
159
+ if (options.heading) {
160
+ // The whole heading becomes one bold span, so emphasis inside it would
161
+ // nest and break Slack's parser. Drop the emphasis markers instead.
162
+ working = working
163
+ .replace(BOLD_ASTERISK, "$1")
164
+ .replace(BOLD_UNDERSCORE, "$1")
165
+ .replace(/\*/gu, "");
166
+ } else {
167
+ working = working
168
+ .replace(BOLD_ITALIC_ASTERISK, "*_$1_*")
169
+ .replace(BOLD_ASTERISK, "*$1*")
170
+ .replace(BOLD_UNDERSCORE, "*$1*");
171
+ }
172
+ working = working.replace(STRIKETHROUGH, "~$1~");
173
+ return restore(working, kept);
174
+ }
175
+
176
+ function restore(text: string, kept: readonly string[]): string {
177
+ return text.replace(PLACEHOLDER, (_match, index: string) => kept[Number(index)] ?? "");
178
+ }
179
+
180
+ function slackLink(label: string, url: string): string {
181
+ const text = label
182
+ .replace(BOLD_ASTERISK, "$1")
183
+ .replace(BOLD_UNDERSCORE, "$1")
184
+ .replace(/`/gu, "")
185
+ .trim();
186
+ if (!text || text === url) return `<${url}>`;
187
+ return `<${url}|${escapeSlackLinkLabel(text)}>`;
188
+ }
189
+
190
+ /** Slack reads `&`, `<`, and `>` as control characters inside a link. */
191
+ function escapeSlackLinkLabel(label: string): string {
192
+ return label.replace(/&/gu, "&amp;").replace(/</gu, "&lt;").replace(/>/gu, "&gt;");
193
+ }
@@ -78,7 +78,7 @@ const AUTHORED_BY_INVOKER: ReadonlySet<string> = new Set([
78
78
  * Split a leading bot mention off the message text.
79
79
  *
80
80
  * Slack delivers an `app_mention` with the mention still in the text
81
- * (`<@U123> do the thing`), and OpenGeni stores it verbatim. The workspace
81
+ * (`<@U123> do the thing`), and Opengeni stores it verbatim. The workspace
82
82
  * prefix is only an override when it is the first thing the person typed, so it
83
83
  * is parsed after the mention rather than at byte 0 of the raw text. Everything
84
84
  * split off here is put back, so the message the model sees is unchanged apart
@@ -229,7 +229,7 @@ export function resolveSlackWorkspaceRoute(input: SlackRouteInputs): SlackRouteR
229
229
  //
230
230
  // Only text the invoking human actually typed can address anything. A
231
231
  // message shortcut and a reaction both carry SOMEONE ELSE'S message, so a
232
- // prefix found there was never an instruction to OpenGeni.
232
+ // prefix found there was never an instruction to Opengeni.
233
233
  const prefix = AUTHORED_BY_INVOKER.has(input.entry.triggerKind)
234
234
  ? parseSlackWorkspacePrefix(splitSlackLeadingMention(input.entry.text, input.botUserId).rest)
235
235
  : null;
@@ -0,0 +1,224 @@
1
+ import {
2
+ resourceMountPath,
3
+ resourceMountPathCollisionKey,
4
+ type AccessGrant,
5
+ type GitHubRepository,
6
+ type RepositoryResourceRef,
7
+ } from "@opengeni/contracts";
8
+ import { listRecentSessionRepositoryResources } from "@opengeni/db";
9
+ import { hasPermission, type ApiRouteDeps } from "@opengeni/core";
10
+ import { githubRepositoryResourceRef, listWorkspaceGitHubRepositories } from "../github-access";
11
+
12
+ /**
13
+ * A Slack task starts with at most this many repositories. Each one is a
14
+ * shallow, blob-filtered fetch before the first command, so the set stays
15
+ * small: the person's own most recently used repositories, not a catalog.
16
+ */
17
+ export const SLACK_SESSION_RECENT_REPOSITORY_LIMIT = 5;
18
+
19
+ /** How far back the person's own sessions count as recent use. */
20
+ export const SLACK_SESSION_RECENT_REPOSITORY_WINDOW_MS = 30 * 24 * 60 * 60 * 1000;
21
+
22
+ function githubUriKey(uri: string): string | null {
23
+ try {
24
+ const url = new URL(uri);
25
+ const path = url.pathname
26
+ .replace(/^\/+|\/+$/gu, "")
27
+ .replace(/\.git$/iu, "")
28
+ .toLowerCase();
29
+ return path ? `${url.host.toLowerCase()}/${path}` : null;
30
+ } catch {
31
+ return null;
32
+ }
33
+ }
34
+
35
+ function positiveRepositoryId(value: unknown): number | null {
36
+ if (typeof value === "number" && Number.isSafeInteger(value) && value > 0) return value;
37
+ if (typeof value === "string" && /^[1-9]\d{0,15}$/u.test(value)) {
38
+ const parsed = Number(value);
39
+ return Number.isSafeInteger(parsed) ? parsed : null;
40
+ }
41
+ return null;
42
+ }
43
+
44
+ /**
45
+ * Pick a Slack task's repositories: the person's recently used repositories,
46
+ * in recency order, that the workspace GitHub App catalog still offers them.
47
+ *
48
+ * `recent` is a usage signal only, and only repositories the person attached
49
+ * themselves count: an automatically attached (`optional`) one never does. A
50
+ * repository reaches the task only through its current catalog entry (the
51
+ * same catalog and `github:use` permission as the website picker), on its
52
+ * default branch, so a Slack task never reaches a repository the person could
53
+ * not attach on the website today. Archived and
54
+ * empty repositories are skipped when GitHub reported that, because a clone of
55
+ * an empty repository has nothing to check out. Every returned resource is
56
+ * best effort (`optional`): one failed clone warns instead of failing setup.
57
+ */
58
+ export function selectRecentRepositoryResources(
59
+ recent: readonly RepositoryResourceRef[],
60
+ catalog: readonly GitHubRepository[],
61
+ limit = SLACK_SESSION_RECENT_REPOSITORY_LIMIT,
62
+ ): RepositoryResourceRef[] {
63
+ const byId = new Map<number, GitHubRepository[]>();
64
+ const byUri = new Map<string, GitHubRepository>();
65
+ const ordered = [...catalog].sort(
66
+ (left, right) => left.installationId - right.installationId || left.id - right.id,
67
+ );
68
+ for (const repository of ordered) {
69
+ byId.set(repository.id, [...(byId.get(repository.id) ?? []), repository]);
70
+ const key = githubUriKey(repository.cloneUrl);
71
+ if (key && !byUri.has(key)) byUri.set(key, repository);
72
+ }
73
+ const chosen = new Set<string>();
74
+ const mountKeys = new Set<string>();
75
+ const resources: RepositoryResourceRef[] = [];
76
+ for (const used of recent) {
77
+ if (resources.length >= limit) break;
78
+ // A repository Opengeni attached automatically is not a choice the person
79
+ // made; counting it would keep re-attaching it to every later Slack task.
80
+ if (used.optional === true) continue;
81
+ const repositoryId = positiveRepositoryId(
82
+ used.githubRepositoryId ?? (used.provider === "github" ? used.repositoryId : undefined),
83
+ );
84
+ const installationId = positiveRepositoryId(
85
+ used.githubInstallationId ?? (used.provider === "github" ? used.installationId : undefined),
86
+ );
87
+ const candidates = repositoryId !== null ? (byId.get(repositoryId) ?? []) : [];
88
+ const uriKey = githubUriKey(used.uri);
89
+ const match =
90
+ candidates.find((candidate) => candidate.installationId === installationId) ??
91
+ candidates[0] ??
92
+ (uriKey ? byUri.get(uriKey) : undefined);
93
+ if (!match) continue;
94
+ const identity = `${match.installationId}:${match.id}`;
95
+ if (chosen.has(identity)) continue;
96
+ chosen.add(identity);
97
+ if (match.archived === true || match.sizeKb === 0) continue;
98
+ let resource: RepositoryResourceRef;
99
+ try {
100
+ resource = { ...githubRepositoryResourceRef(match), optional: true };
101
+ } catch {
102
+ // A malformed provider URL is one unusable repository, not a failed task.
103
+ continue;
104
+ }
105
+ const mountKey = resourceMountPathCollisionKey(resourceMountPath(resource));
106
+ if (mountKeys.has(mountKey)) continue;
107
+ mountKeys.add(mountKey);
108
+ resources.push(resource);
109
+ }
110
+ return resources;
111
+ }
112
+
113
+ /**
114
+ * The repositories a new Slack task starts with: the person's own recently
115
+ * used repositories in this workspace (their own top-level sessions active in
116
+ * the last 30 days, most recent first, at most five), limited to what the
117
+ * workspace GitHub App catalog offers them now. None when they have none; the
118
+ * agent can still find and clone repositories through its GitHub tools.
119
+ *
120
+ * GitHub is asked only when there is something to look up. A GitHub outage or
121
+ * an unconfigured App starts the task without repositories instead of failing
122
+ * it, with a log line for diagnosis.
123
+ */
124
+ export async function slackRecentRepositoryResources(
125
+ deps: ApiRouteDeps,
126
+ grant: Pick<AccessGrant, "permissions" | "subjectId">,
127
+ workspaceId: string,
128
+ now: Date = new Date(),
129
+ ): Promise<RepositoryResourceRef[]> {
130
+ if (!hasPermission(grant.permissions, "github:use")) return [];
131
+ const recent = await listRecentSessionRepositoryResources(deps.db, {
132
+ workspaceId,
133
+ subjectId: grant.subjectId,
134
+ since: new Date(now.getTime() - SLACK_SESSION_RECENT_REPOSITORY_WINDOW_MS),
135
+ });
136
+ if (!recent.some((resource) => resource.optional !== true)) return [];
137
+ let catalog: GitHubRepository[];
138
+ try {
139
+ catalog = await listWorkspaceGitHubRepositories(deps, workspaceId);
140
+ } catch (error) {
141
+ console.error("[slack-interactions] workspace repositories unavailable", {
142
+ workspaceId,
143
+ errorCode: (error instanceof Error ? error.name : "unknown")
144
+ .toLowerCase()
145
+ .replace(/[^a-z0-9_-]/gu, "_")
146
+ .slice(0, 128),
147
+ });
148
+ return [];
149
+ }
150
+ return selectRecentRepositoryResources(recent, catalog);
151
+ }
152
+
153
+ const OPEN_GENI_LINK_PATTERN =
154
+ /https?:\/\/([^\s/<>|?#]+)(\/workspaces\/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}(?:\/sessions\/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})?)/giu;
155
+
156
+ const MAX_OTHER_DEPLOYMENT_LINKS = 5;
157
+
158
+ export type OtherDeploymentLink = { url: string; host: string };
159
+
160
+ function siteOf(hostname: string): string | null {
161
+ if (/^[\d.]+$/u.test(hostname) || hostname.includes(":")) return null;
162
+ const labels = hostname.split(".").filter(Boolean);
163
+ return labels.length >= 2 ? labels.slice(-2).join(".") : null;
164
+ }
165
+
166
+ /**
167
+ * Opengeni workspace or session links in `text` that point at a sibling
168
+ * deployment of this one (for example staging versus production).
169
+ *
170
+ * A sibling is a different host under the same parent domain as this
171
+ * deployment's web origin, carrying Opengeni's own route shape. Anything else
172
+ * is left alone: an unrelated product's URL must never be described as
173
+ * another Opengeni.
174
+ */
175
+ export function otherDeploymentLinks(
176
+ text: string,
177
+ webBaseUrl: string | null | undefined,
178
+ ): OtherDeploymentLink[] {
179
+ if (!webBaseUrl) return [];
180
+ let own: URL;
181
+ try {
182
+ own = new URL(webBaseUrl);
183
+ } catch {
184
+ return [];
185
+ }
186
+ const ownSite = siteOf(own.hostname.toLowerCase());
187
+ if (!ownSite) return [];
188
+ const found = new Map<string, OtherDeploymentLink>();
189
+ for (const match of text.matchAll(OPEN_GENI_LINK_PATTERN)) {
190
+ let url: URL;
191
+ try {
192
+ url = new URL(`https://${match[1]}${match[2]}`);
193
+ } catch {
194
+ continue;
195
+ }
196
+ const host = url.host.toLowerCase();
197
+ if (host === own.host.toLowerCase()) continue;
198
+ if (siteOf(url.hostname.toLowerCase()) !== ownSite) continue;
199
+ const canonical = `${match[0].split("://", 1)[0]!.toLowerCase()}://${host}${match[2]!.toLowerCase()}`;
200
+ if (!found.has(canonical)) found.set(canonical, { url: canonical, host });
201
+ if (found.size >= MAX_OTHER_DEPLOYMENT_LINKS) break;
202
+ }
203
+ return [...found.values()];
204
+ }
205
+
206
+ /**
207
+ * Model context for links to another Opengeni deployment. A session id from
208
+ * one deployment does not exist in another, so without this the agent reports
209
+ * "Session not found or access denied" and asks for access that no grant in
210
+ * this deployment can give.
211
+ */
212
+ export function otherDeploymentLinkContext(
213
+ text: string,
214
+ webBaseUrl: string | null | undefined,
215
+ ): string | null {
216
+ const links = otherDeploymentLinks(text, webBaseUrl);
217
+ if (links.length === 0 || !webBaseUrl) return null;
218
+ const ownHost = new URL(webBaseUrl).host.toLowerCase();
219
+ return [
220
+ `Links to a different Opengeni deployment (this one is ${ownHost}):`,
221
+ ...links.map((link) => `- ${link.url} is on ${link.host}.`),
222
+ `Workspaces, sessions and files from another deployment do not exist here, so looking up their ids in this deployment always fails as not found. Tell the user the link is for ${[...new Set(links.map((link) => link.host))].join(" and ")}, not ${ownHost}, instead of reporting the session as missing or asking for access to it.`,
223
+ ].join("\n");
224
+ }