@opengeni/react 6.5.2-canary.41607687019001 → 6.7.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 (1154) hide show
  1. package/dist/app/app-state.d.ts +4 -0
  2. package/dist/app/app-state.js +19 -14
  3. package/dist/app/components/Composer.js +25 -23
  4. package/dist/app/components/agent/agent-capability-picker.js +10 -8
  5. package/dist/app/components/artifacts/artifact-browse-controls.js +4 -4
  6. package/dist/app/components/artifacts/artifact-library.js +21 -19
  7. package/dist/app/components/artifacts/artifact-page-chrome.js +3 -3
  8. package/dist/app/components/artifacts/artifact-viewer.js +23 -22
  9. package/dist/app/components/artifacts/artifact-viewer.js.map +1 -1
  10. package/dist/app/components/artifacts/chat-interactive-block.js +12 -12
  11. package/dist/app/components/artifacts/copy-artifact-link.js +7 -5
  12. package/dist/app/components/artifacts/file-reach-dialog.js +11 -9
  13. package/dist/app/components/artifacts/inline-chat-image.js +18 -18
  14. package/dist/app/components/artifacts/retained-file-preview.js +24 -23
  15. package/dist/app/components/artifacts/retained-text-preview.js +3 -3
  16. package/dist/app/components/artifacts/site-audience.js +6 -5
  17. package/dist/app/components/artifacts/site-conversations.js +16 -14
  18. package/dist/app/components/artifacts/site-data.js +18 -16
  19. package/dist/app/components/artifacts/site-public-link.js +3 -2
  20. package/dist/app/components/artifacts/site-publishing-page.js +39 -37
  21. package/dist/app/components/artifacts/site-publishing.js +34 -32
  22. package/dist/app/components/artifacts/site-settings.js +38 -36
  23. package/dist/app/components/artifacts/site-version-menu.js +8 -7
  24. package/dist/app/components/billing-class-mark.js +3 -3
  25. package/dist/app/components/bots/bot-launch-strip.js +17 -17
  26. package/dist/app/components/bots/bot-template-dialog.js +30 -28
  27. package/dist/app/components/bots/bot-template-shortcuts.js +19 -19
  28. package/dist/app/components/bots/bot-templates-page.js +38 -36
  29. package/dist/app/components/bots/bot-templates-page.js.map +1 -1
  30. package/dist/app/components/capabilities/capability-detail-sheet.js +13 -11
  31. package/dist/app/components/capabilities/capability-logo-source.js +13 -13
  32. package/dist/app/components/capabilities/capability-logo.js +4 -3
  33. package/dist/app/components/capabilities/connector-tool-permissions.js +8 -6
  34. package/dist/app/components/capabilities/native-connect-setup.js +14 -14
  35. package/dist/app/components/capabilities/own-logins-shared-heads-up.js +7 -6
  36. package/dist/app/components/capabilities/perform-capability-action.js +7 -6
  37. package/dist/app/components/capabilities/prepared-mcp-setup-card.js +17 -17
  38. package/dist/app/components/capabilities/session-capability-card.js +72 -70
  39. package/dist/app/components/capabilities/session-capability-card.js.map +1 -1
  40. package/dist/app/components/capabilities/session-chrome-card.js +28 -26
  41. package/dist/app/components/capabilities/session-connection-accounts.js +4 -3
  42. package/dist/app/components/capabilities/session-custom-mcp-card.js +20 -19
  43. package/dist/app/components/capabilities/session-github-card.js +22 -20
  44. package/dist/app/components/capabilities/session-machine-card.js +27 -25
  45. package/dist/app/components/capabilities/session-personal-github-card.js +16 -16
  46. package/dist/app/components/capabilities/session-plugin-card.js +10 -9
  47. package/dist/app/components/capabilities/use-capabilities-catalog.js +4 -3
  48. package/dist/app/components/capabilities/use-connection-accounts.js +5 -4
  49. package/dist/app/components/command-menu/chat-status.js +15 -13
  50. package/dist/app/components/command-menu/chat-switcher.js +35 -33
  51. package/dist/app/components/command-menu/chat-switcher.js.map +1 -1
  52. package/dist/app/components/command-menu/command-menu.js +53 -50
  53. package/dist/app/components/command-menu/command-menu.js.map +1 -1
  54. package/dist/app/components/command-menu/shortcut-sheet.js +18 -16
  55. package/dist/app/components/command-menu/shortcut-sheet.js.map +1 -1
  56. package/dist/app/components/common.js +4 -3
  57. package/dist/app/components/composer-capabilities-menu-body.js +4 -4
  58. package/dist/app/components/composer-mobile-plus-panel.js +8 -8
  59. package/dist/app/components/composer-mobile-plus.js +1 -1
  60. package/dist/app/components/credit-required-gate.js +3 -3
  61. package/dist/app/components/credit-required-prompt.js +10 -8
  62. package/dist/app/components/credit-required-prompt.js.map +1 -1
  63. package/dist/app/components/credits/checkout-credits-celebration.js +3 -2
  64. package/dist/app/components/credits/checkout-return.js +3 -2
  65. package/dist/app/components/credits/checkout-return.js.map +1 -1
  66. package/dist/app/components/credits/coupon-redeem.js +5 -4
  67. package/dist/app/components/credits/credit-refusal-notice.js +7 -5
  68. package/dist/app/components/cross-slot-deep-link-recovery.js +5 -4
  69. package/dist/app/components/desktop/app-shots.js +13 -11
  70. package/dist/app/components/desktop/computer-use.js +6 -4
  71. package/dist/app/components/desktop/this-computer.js +9 -7
  72. package/dist/app/components/feedback.js +5 -4
  73. package/dist/app/components/follow-up-repository-menu-body.js +8 -6
  74. package/dist/app/components/follow-up-repository-menu-body.js.map +1 -1
  75. package/dist/app/components/follow-up-repository-picker.js +1 -1
  76. package/dist/app/components/github-app-connect-launcher.js +5 -4
  77. package/dist/app/components/in-app-help-link.js +3 -3
  78. package/dist/app/components/knowledge/agent-learning-settings.js +3 -2
  79. package/dist/app/components/knowledge/agent-learning-settings.js.map +1 -1
  80. package/dist/app/components/machines/connect-machine-dialog.js +18 -16
  81. package/dist/app/components/manual-repository-editor.js +3 -2
  82. package/dist/app/components/markdown.js +6 -6
  83. package/dist/app/components/models/models-ui.js +12 -10
  84. package/dist/app/components/my-things.js +12 -10
  85. package/dist/app/components/my-things.js.map +1 -1
  86. package/dist/app/components/new-session-starters.js +3 -3
  87. package/dist/app/components/own-where-it-works.js +9 -7
  88. package/dist/app/components/personal-resource-attachment-surface.js +4 -4
  89. package/dist/app/components/pickers.js +5 -5
  90. package/dist/app/components/rail/channel-create-dialog.js +7 -5
  91. package/dist/app/components/rail/project-glyph.js +17 -17
  92. package/dist/app/components/rail/project-profile.js +31 -29
  93. package/dist/app/components/rail/rail-context.js +3 -3
  94. package/dist/app/components/rail/rail-sections.js +68 -66
  95. package/dist/app/components/rail/session-header.js +59 -57
  96. package/dist/app/components/rail/session-list.js +66 -64
  97. package/dist/app/components/rail/session-row-content.js +4 -4
  98. package/dist/app/components/rail/session-row-hover-details.js +14 -12
  99. package/dist/app/components/rail/session-shell.js +90 -88
  100. package/dist/app/components/rail/site-session-group-heading.js +8 -8
  101. package/dist/app/components/repository-picker.js +8 -6
  102. package/dist/app/components/secrets/session-secrets-panel.js +4 -3
  103. package/dist/app/components/secrets/vault-model.js +3 -2
  104. package/dist/app/components/session/agent-configuration-panel.js +25 -23
  105. package/dist/app/components/session/agent-configuration-panel.js.map +1 -1
  106. package/dist/app/components/session/artifact-link-boundary.js +3 -3
  107. package/dist/app/components/session/artifact-session-page.js +11 -9
  108. package/dist/app/components/session/banners.js +8 -8
  109. package/dist/app/components/session/codex-usage-notice.js +5 -3
  110. package/dist/app/components/session/console-new-conversation.js +42 -40
  111. package/dist/app/components/session/context-text-reader.js +3 -2
  112. package/dist/app/components/session/descendant-requests.js +39 -37
  113. package/dist/app/components/session/descendant-requests.js.map +1 -1
  114. package/dist/app/components/session/editable-artifacts-workspace.js +36 -34
  115. package/dist/app/components/session/editable-artifacts-workspace.js.map +1 -1
  116. package/dist/app/components/session/failed-session-banner.js +13 -11
  117. package/dist/app/components/session/failed-session-banner.js.map +1 -1
  118. package/dist/app/components/session/failure-recovery-boundary.js +3 -3
  119. package/dist/app/components/session/human-input-delegation-record.js +2 -2
  120. package/dist/app/components/session/human-input.js +33 -31
  121. package/dist/app/components/session/inspector.js +57 -55
  122. package/dist/app/components/session/inspector.js.map +1 -1
  123. package/dist/app/components/session/message-actions.js +5 -4
  124. package/dist/app/components/session/message-actions.js.map +1 -1
  125. package/dist/app/components/session/message-resource-attachments.js +12 -11
  126. package/dist/app/components/session/message-resource-attachments.js.map +1 -1
  127. package/dist/app/components/session/model-context-inspector.js +6 -4
  128. package/dist/app/components/session/model-recovery-notice.js +3 -3
  129. package/dist/app/components/session/new-session-settings-menu.js +11 -9
  130. package/dist/app/components/session/new-session-setup-strip.js +18 -18
  131. package/dist/app/components/session/sandbox-recovery-actions.js +3 -3
  132. package/dist/app/components/session/sandbox-switcher.js +10 -9
  133. package/dist/app/components/session/sandbox-workspace.js +47 -46
  134. package/dist/app/components/session/search-markdown-highlight.js +7 -7
  135. package/dist/app/components/session/search-results-view.js +8 -8
  136. package/dist/app/components/session/session-admin-access.js +13 -11
  137. package/dist/app/components/session/session-admission-notice.js +7 -5
  138. package/dist/app/components/session/session-avatar-picker.js +22 -20
  139. package/dist/app/components/session/session-avatar.js +16 -16
  140. package/dist/app/components/session/session-machine-access-notice.js +7 -5
  141. package/dist/app/components/session/session-profile-dialog.js +29 -27
  142. package/dist/app/components/session/session-profile-editor.js +30 -28
  143. package/dist/app/components/session/session-retention.js +10 -8
  144. package/dist/app/components/session/session-search-dialog.js +10 -10
  145. package/dist/app/components/session/session-skill-reviews.js +2 -1
  146. package/dist/app/components/session/session-skill-reviews.js.map +1 -1
  147. package/dist/app/components/session/session-tenancy-control.js +13 -11
  148. package/dist/app/components/session/session-tenancy-control.js.map +1 -1
  149. package/dist/app/components/session/session-unattended-setting.js +7 -5
  150. package/dist/app/components/session/session-usage-limit-section.js +11 -9
  151. package/dist/app/components/session/share-chat-dialog.js +9 -7
  152. package/dist/app/components/session/site-origin-link.js +3 -3
  153. package/dist/app/components/session/subagents.js +8 -8
  154. package/dist/app/components/session/subscription-account-indicator.js +6 -6
  155. package/dist/app/components/session-connectors-menu-body.js +4 -3
  156. package/dist/app/components/session-connectors-menu-body.js.map +1 -1
  157. package/dist/app/components/settings/row-select.js +7 -5
  158. package/dist/app/components/toaster.js +3 -2
  159. package/dist/app/components/transcription-settings.js +11 -9
  160. package/dist/app/components/ui/destructive-confirm.js +11 -9
  161. package/dist/app/components/usage/usage-entry.js +5 -5
  162. package/dist/app/components/window-bar.js +16 -14
  163. package/dist/app/components/workspace-composer-plus.js +22 -21
  164. package/dist/app/components/workspace-reach.js +6 -4
  165. package/dist/app/components/workspace-tenant-boundary.js +5 -4
  166. package/dist/app/embed/memory-navigation.js +3 -3
  167. package/dist/app/embed/session-app.js +211 -209
  168. package/dist/app/lib/actions/actions-provider.js +15 -13
  169. package/dist/app/lib/agent-capabilities.js +3 -3
  170. package/dist/app/lib/app-surfaces.js +7 -6
  171. package/dist/app/lib/archive-session.d.ts +9 -4
  172. package/dist/app/lib/archive-session.js +4 -2
  173. package/dist/app/lib/bot-templates.js +3 -2
  174. package/dist/app/lib/capabilities.js +3 -2
  175. package/dist/app/lib/codex-usage-query.js +2 -2
  176. package/dist/app/lib/composer-connectors.js +17 -16
  177. package/dist/app/lib/console-site.js +2 -2
  178. package/dist/app/lib/console-text.js +2 -2
  179. package/dist/app/lib/events.js +9 -9
  180. package/dist/app/lib/failed-session-copy.js +3 -3
  181. package/dist/app/lib/inbox.js +4 -2
  182. package/dist/app/lib/model-access-onboarding.js +3 -3
  183. package/dist/app/lib/move-chat-to-machine.js +3 -3
  184. package/dist/app/lib/navigation.js +2 -2
  185. package/dist/app/lib/session-branch-cache.js +6 -6
  186. package/dist/app/lib/session-create.js +4 -4
  187. package/dist/app/lib/session-group-pagination.js +6 -6
  188. package/dist/app/lib/session-hover-facts.js +13 -11
  189. package/dist/app/lib/session-model.js +2 -2
  190. package/dist/app/lib/session-rail.js +3 -3
  191. package/dist/app/lib/session-rename.js +3 -3
  192. package/dist/app/lib/session-restart-operation-controller.js +4 -3
  193. package/dist/app/lib/session-tenancy.js +3 -2
  194. package/dist/app/lib/session-usage-limit.js +3 -2
  195. package/dist/app/lib/sessions-group.js +5 -5
  196. package/dist/app/lib/site-publishing.js +3 -2
  197. package/dist/app/lib/site-tool-consent-dialog.js +9 -7
  198. package/dist/app/lib/site-tool-consent-dialog.js.map +1 -1
  199. package/dist/app/lib/site-tool-consent.js +1 -1
  200. package/dist/app/lib/subscription-plans.js +3 -2
  201. package/dist/app/lib/toast.js +2 -1
  202. package/dist/app/lib/turn-failure-analytics.js +4 -4
  203. package/dist/app/lib/use-duplicate-site.js +6 -5
  204. package/dist/app/lib/use-follow-up-repositories.js +6 -5
  205. package/dist/app/lib/use-workspace-integrations.js +4 -3
  206. package/dist/app/lib/use-workspace-machines.js +4 -4
  207. package/dist/app/lib/use-workspace-model-catalog.js +5 -4
  208. package/dist/app/lib/use-workspace-rigs.js +2 -2
  209. package/dist/app/lib/workspace-navigation-preference.js +4 -4
  210. package/dist/app/lib/workspace-scope-context.js +3 -3
  211. package/dist/app/routes/artifacts.js +67 -66
  212. package/dist/app/routes/artifacts.js.map +1 -1
  213. package/dist/app/routes/retained-artifact.js +42 -40
  214. package/dist/app/routes/retained-artifact.js.map +1 -1
  215. package/dist/app/routes/session-unavailable.js +8 -7
  216. package/dist/app/routes/session.js +119 -117
  217. package/dist/app/routes/sessions-index-hydration.js +5 -5
  218. package/dist/app/routes/sessions-index.js +104 -102
  219. package/dist/app/routes/site-view.js +67 -65
  220. package/dist/app/routes/site-view.js.map +1 -1
  221. package/dist/artifacts-document.js +4 -4
  222. package/dist/artifacts-presentation.js +4 -4
  223. package/dist/artifacts-spreadsheet.js +4 -4
  224. package/dist/artifacts.js +10 -10
  225. package/dist/automations.js +17 -15
  226. package/dist/automations.js.map +1 -1
  227. package/dist/browser-viewer-TC27OCIP.js +23 -0
  228. package/dist/chat-interactive-block-RWPQBHVS.js +18 -0
  229. package/dist/chunk-2BDT3UZQ.js +229 -0
  230. package/dist/chunk-2CLNIEK4.js +373 -0
  231. package/dist/chunk-2FSBSCZJ.js +451 -0
  232. package/dist/chunk-2I7HDP53.js +199 -0
  233. package/dist/chunk-2INLDVK3.js +15 -0
  234. package/dist/chunk-2KALVELR.js +126 -0
  235. package/dist/chunk-2M3J7ZWQ.js +418 -0
  236. package/dist/chunk-2OP6WLGV.js +708 -0
  237. package/dist/chunk-2RG7NIAS.js +2936 -0
  238. package/dist/chunk-2STUPWEL.js +135 -0
  239. package/dist/chunk-2YUOVM3G.js +271 -0
  240. package/dist/chunk-2Z3NQNTM.js +3670 -0
  241. package/dist/chunk-3CPWWGNK.js +920 -0
  242. package/dist/chunk-3ED2U6XE.js +37 -0
  243. package/dist/chunk-3GZA4BUW.js +216 -0
  244. package/dist/chunk-3IK6UYO6.js +1022 -0
  245. package/dist/chunk-3PZ7JZI2.js +431 -0
  246. package/dist/chunk-4DVJ6ONS.js +50 -0
  247. package/dist/chunk-4DVNUCRR.js +2386 -0
  248. package/dist/chunk-4DVNUCRR.js.map +1 -0
  249. package/dist/chunk-4E3ZJRTZ.js +41 -0
  250. package/dist/chunk-4SAWSRAA.js +141 -0
  251. package/dist/chunk-53AGXXZM.js +307 -0
  252. package/dist/chunk-54YW6SZZ.js +818 -0
  253. package/dist/chunk-57AZS3IE.js +2317 -0
  254. package/dist/chunk-5CPEEAFD.js +143 -0
  255. package/dist/chunk-5EWSRZ2Y.js +340 -0
  256. package/dist/chunk-5IE76VCY.js +387 -0
  257. package/dist/chunk-5NWEKLDZ.js +170 -0
  258. package/dist/chunk-5O2FCCHZ.js +198 -0
  259. package/dist/chunk-5QAY6K77.js +399 -0
  260. package/dist/chunk-5YKW2K6I.js +625 -0
  261. package/dist/chunk-5YKW2K6I.js.map +1 -0
  262. package/dist/chunk-6BCXNDEI.js +4116 -0
  263. package/dist/chunk-6BCXNDEI.js.map +1 -0
  264. package/dist/chunk-6DK6Z4UN.js +2599 -0
  265. package/dist/chunk-6DVCC7QS.js +702 -0
  266. package/dist/chunk-6JHU2UBS.js +2058 -0
  267. package/dist/chunk-6PZ7OBYU.js +490 -0
  268. package/dist/chunk-6WD2INST.js +539 -0
  269. package/dist/chunk-6WD2INST.js.map +1 -0
  270. package/dist/chunk-6WGRDRMA.js +163 -0
  271. package/dist/chunk-77WAKEAH.js +186 -0
  272. package/dist/chunk-7T2ZE3VT.js +5558 -0
  273. package/dist/chunk-7T2ZE3VT.js.map +1 -0
  274. package/dist/chunk-7TDO3CUM.js +393 -0
  275. package/dist/chunk-7TIX2UAR.js +247 -0
  276. package/dist/chunk-7V5REBCP.js +148 -0
  277. package/dist/chunk-7VMZGLYI.js +339 -0
  278. package/dist/chunk-7W37NS3I.js +236 -0
  279. package/dist/chunk-7X6SDK2C.js +111 -0
  280. package/dist/chunk-7ZNUHRP5.js +95 -0
  281. package/dist/chunk-A36PZALD.js +84 -0
  282. package/dist/chunk-AUI6VA63.js +107 -0
  283. package/dist/chunk-AW2MQB37.js +24 -0
  284. package/dist/chunk-AWKES45Y.js +198 -0
  285. package/dist/chunk-AXHZYXUV.js +132 -0
  286. package/dist/chunk-BHNSJVBC.js +129 -0
  287. package/dist/chunk-BJEJFISW.js +50 -0
  288. package/dist/chunk-BJFH6JI5.js +422 -0
  289. package/dist/chunk-BMICEQZQ.js +960 -0
  290. package/dist/chunk-BTLBYBLU.js +29 -0
  291. package/dist/chunk-BXBDYNRP.js +89 -0
  292. package/dist/chunk-C372BFOV.js +357 -0
  293. package/dist/chunk-C43KRXGA.js +234 -0
  294. package/dist/chunk-C43KRXGA.js.map +1 -0
  295. package/dist/chunk-CMKGILJK.js +4824 -0
  296. package/dist/chunk-CRAOSVHC.js +50 -0
  297. package/dist/chunk-CRU35QQH.js +281 -0
  298. package/dist/chunk-CUIWCGMA.js +172 -0
  299. package/dist/chunk-D5TWNFFE.js +38 -0
  300. package/dist/chunk-DF5EAHDN.js +4461 -0
  301. package/dist/chunk-DJAXC5OK.js +56 -0
  302. package/dist/chunk-DXBYWSL5.js +3550 -0
  303. package/dist/chunk-DXR5PDFP.js +84 -0
  304. package/dist/chunk-DZWARC4M.js +267 -0
  305. package/dist/chunk-DZXEDSQI.js +106 -0
  306. package/dist/chunk-E7XERZWC.js +48 -0
  307. package/dist/chunk-ECJBYNLJ.js +79 -0
  308. package/dist/chunk-EDI6SJ2N.js +43 -0
  309. package/dist/chunk-EWSOC6WF.js +114 -0
  310. package/dist/chunk-F2OPHAUN.js +103 -0
  311. package/dist/chunk-F4ISQGGM.js +81 -0
  312. package/dist/chunk-FO4LYKJL.js +197 -0
  313. package/dist/chunk-FPXASDG5.js +73 -0
  314. package/dist/chunk-FSOQDUCG.js +117 -0
  315. package/dist/chunk-FSOQDUCG.js.map +1 -0
  316. package/dist/chunk-FVXBNBHO.js +157 -0
  317. package/dist/chunk-FYWT2O76.js +34 -0
  318. package/dist/chunk-FYWT2O76.js.map +1 -0
  319. package/dist/chunk-FZC5N55X.js +981 -0
  320. package/dist/chunk-GAVYGBFI.js +99 -0
  321. package/dist/chunk-GFIMOUDT.js +846 -0
  322. package/dist/chunk-GFIMOUDT.js.map +1 -0
  323. package/dist/chunk-GKVJIDHF.js +33 -0
  324. package/dist/chunk-GVN5SZLX.js +212 -0
  325. package/dist/chunk-H3T7IWNA.js +134 -0
  326. package/dist/chunk-HAX4LCR5.js +261 -0
  327. package/dist/chunk-HC4JFZVU.js +121 -0
  328. package/dist/chunk-HEFPPMBQ.js +581 -0
  329. package/dist/chunk-HGKTHF2U.js +1356 -0
  330. package/dist/chunk-HGKTHF2U.js.map +1 -0
  331. package/dist/chunk-HNLR7Q4Z.js +83 -0
  332. package/dist/chunk-HSOXMJOT.js +12 -0
  333. package/dist/chunk-I4MRDSUF.js +281 -0
  334. package/dist/chunk-I4QEJ62Y.js +202 -0
  335. package/dist/chunk-I5B5L6Q4.js +56 -0
  336. package/dist/chunk-I5QZJODL.js +264 -0
  337. package/dist/chunk-I7ITSXSJ.js +603 -0
  338. package/dist/chunk-I7XIZRFD.js +390 -0
  339. package/dist/chunk-IDANQPRH.js +82 -0
  340. package/dist/chunk-IFB3WJ36.js +212 -0
  341. package/dist/chunk-IHTAKKTK.js +264 -0
  342. package/dist/chunk-IKXNLWAL.js +205 -0
  343. package/dist/chunk-IKXNLWAL.js.map +1 -0
  344. package/dist/chunk-ILDXWY37.js +173 -0
  345. package/dist/chunk-IMDQUHBJ.js +570 -0
  346. package/dist/chunk-IMZCQBOT.js +119 -0
  347. package/dist/chunk-IXPTECSC.js +403 -0
  348. package/dist/chunk-J255A3N5.js +71 -0
  349. package/dist/chunk-J5F5HPPW.js +141 -0
  350. package/dist/chunk-JDTGRRNU.js +5045 -0
  351. package/dist/chunk-JDTGRRNU.js.map +1 -0
  352. package/dist/chunk-JEA3QDX7.js +2469 -0
  353. package/dist/chunk-JEUPAVYY.js +156 -0
  354. package/dist/chunk-JKHKLL5W.js +194 -0
  355. package/dist/chunk-JQL7ZH6C.js +650 -0
  356. package/dist/chunk-JWB44UGJ.js +57 -0
  357. package/dist/chunk-JZ4NLCAP.js +333 -0
  358. package/dist/chunk-K2A5PXQ5.js +412 -0
  359. package/dist/chunk-K56XV3C3.js +623 -0
  360. package/dist/chunk-K6GAXXVA.js +23 -0
  361. package/dist/chunk-KCBMFSMS.js +199 -0
  362. package/dist/chunk-KF2FV3ZJ.js +268 -0
  363. package/dist/chunk-KJD65EJP.js +278 -0
  364. package/dist/chunk-KLEUWIMZ.js +386 -0
  365. package/dist/chunk-KODELWYT.js +309 -0
  366. package/dist/chunk-KRDR5RJD.js +83 -0
  367. package/dist/chunk-KUDGXAF7.js +914 -0
  368. package/dist/chunk-KY2R73CG.js +171 -0
  369. package/dist/chunk-KY2R73CG.js.map +1 -0
  370. package/dist/chunk-KYS77RPN.js +85 -0
  371. package/dist/chunk-L7YTNTIK.js +368 -0
  372. package/dist/chunk-LHPNABDH.js +686 -0
  373. package/dist/chunk-MFROMEKA.js +401 -0
  374. package/dist/chunk-MIHN76LX.js +2656 -0
  375. package/dist/chunk-MIYFS2XN.js +42 -0
  376. package/dist/chunk-MJUCFQMS.js +65 -0
  377. package/dist/chunk-MM4FNWI4.js +3064 -0
  378. package/dist/chunk-MNZG4OHU.js +790 -0
  379. package/dist/chunk-MVW6HNPI.js +250 -0
  380. package/dist/chunk-MVW6HNPI.js.map +1 -0
  381. package/dist/chunk-N6AACDUW.js +200 -0
  382. package/dist/chunk-NC55IFN3.js +781 -0
  383. package/dist/chunk-NC7PVOEK.js +98 -0
  384. package/dist/chunk-NCYMNCJO.js +70 -0
  385. package/dist/chunk-ND2BXV3P.js +259 -0
  386. package/dist/chunk-NDBTFUO6.js +272 -0
  387. package/dist/chunk-NDQJZ7HF.js +206 -0
  388. package/dist/chunk-NGJJJPZZ.js +162 -0
  389. package/dist/chunk-NJTSNNE7.js +251 -0
  390. package/dist/chunk-NPGISCU6.js +4159 -0
  391. package/dist/chunk-NPGISCU6.js.map +1 -0
  392. package/dist/chunk-NRTE7DNV.js +1270 -0
  393. package/dist/chunk-NULUNM7H.js +290 -0
  394. package/dist/chunk-NUNZS36W.js +227 -0
  395. package/dist/chunk-NW53H5RW.js +2424 -0
  396. package/dist/chunk-NXCMHIKI.js +263 -0
  397. package/dist/chunk-O3LKCBP5.js +159 -0
  398. package/dist/chunk-O4EA4F3W.js +103 -0
  399. package/dist/chunk-O4EA4F3W.js.map +1 -0
  400. package/dist/chunk-O4OOG3D6.js +116 -0
  401. package/dist/chunk-O4OOG3D6.js.map +1 -0
  402. package/dist/chunk-O6N4ABCA.js +376 -0
  403. package/dist/chunk-O732GAFC.js +112 -0
  404. package/dist/chunk-OF4TIKYC.js +690 -0
  405. package/dist/chunk-OMPVOMPP.js +70 -0
  406. package/dist/chunk-OPJJSKUK.js +118 -0
  407. package/dist/chunk-OPWCMA4D.js +196 -0
  408. package/dist/chunk-ORJPS5VN.js +1193 -0
  409. package/dist/chunk-OSY5K7L7.js +187 -0
  410. package/dist/chunk-OV6QJRT4.js +45 -0
  411. package/dist/chunk-OVKYVZMW.js +108 -0
  412. package/dist/chunk-OZCBM3UC.js +171 -0
  413. package/dist/chunk-P3A2EINJ.js +61 -0
  414. package/dist/chunk-PTAG4PDC.js +27 -0
  415. package/dist/chunk-PTF5B7TJ.js +298 -0
  416. package/dist/chunk-Q3DPEYX4.js +848 -0
  417. package/dist/chunk-Q6CGOPJD.js +215 -0
  418. package/dist/chunk-Q6CGOPJD.js.map +1 -0
  419. package/dist/chunk-QB2KMIDP.js +100 -0
  420. package/dist/chunk-QCSJ4CWE.js +1067 -0
  421. package/dist/chunk-QIOQ2NPQ.js +414 -0
  422. package/dist/chunk-QK5EFEUT.js +353 -0
  423. package/dist/chunk-QPQBLYQJ.js +41 -0
  424. package/dist/chunk-QPSGCC5D.js +184 -0
  425. package/dist/chunk-QZAAUQRN.js +474 -0
  426. package/dist/chunk-QZM6YDJW.js +489 -0
  427. package/dist/chunk-QZM6YDJW.js.map +1 -0
  428. package/dist/chunk-RGBI63KJ.js +188 -0
  429. package/dist/chunk-RLBKLAEY.js +138 -0
  430. package/dist/chunk-RMFKVOM7.js +304 -0
  431. package/dist/chunk-ROKQU7WG.js +258 -0
  432. package/dist/chunk-RPVREAU7.js +251 -0
  433. package/dist/chunk-RQKLF42C.js +723 -0
  434. package/dist/chunk-SC6RRD2D.js +38 -0
  435. package/dist/chunk-SC6RRD2D.js.map +1 -0
  436. package/dist/chunk-SEO7TICN.js +94 -0
  437. package/dist/chunk-SHHJCL7X.js +432 -0
  438. package/dist/chunk-SIRLACNZ.js +114 -0
  439. package/dist/chunk-SKPHMYAA.js +237 -0
  440. package/dist/chunk-SODC7T6L.js +1583 -0
  441. package/dist/chunk-SQJIKMN3.js +366 -0
  442. package/dist/chunk-SVINDKVW.js +26 -0
  443. package/dist/chunk-SYCDHPZF.js +335 -0
  444. package/dist/chunk-T2QX3FDP.js +133 -0
  445. package/dist/chunk-T3OWFVMS.js +1187 -0
  446. package/dist/chunk-T6XI5FLY.js +61 -0
  447. package/dist/chunk-T7OXJZCX.js +62 -0
  448. package/dist/chunk-TAT5USZN.js +353 -0
  449. package/dist/chunk-TPQTRNER.js +172 -0
  450. package/dist/chunk-TUIN4MB7.js +266 -0
  451. package/dist/chunk-TX3VECZU.js +71 -0
  452. package/dist/chunk-TXLIEOJX.js +9624 -0
  453. package/dist/chunk-U3DN4HEY.js +27 -0
  454. package/dist/chunk-U7XM7CB4.js +191 -0
  455. package/dist/chunk-UJK53QFL.js +140 -0
  456. package/dist/chunk-UMTXA2TH.js +319 -0
  457. package/dist/chunk-UPDSXFK5.js +199 -0
  458. package/dist/chunk-UTIAXH52.js +269 -0
  459. package/dist/chunk-UVN5TMHU.js +1184 -0
  460. package/dist/chunk-V4Z4B2E3.js +52 -0
  461. package/dist/chunk-V4Z4B2E3.js.map +1 -0
  462. package/dist/chunk-VGYXW3VG.js +246 -0
  463. package/dist/chunk-VS7AHPCZ.js +255 -0
  464. package/dist/chunk-VTTAJOQ7.js +121 -0
  465. package/dist/chunk-VWPOLUAO.js +99 -0
  466. package/dist/chunk-X3MWB2QU.js +3851 -0
  467. package/dist/chunk-X6KAJI3V.js +211 -0
  468. package/dist/chunk-XBLRHV5R.js +50 -0
  469. package/dist/chunk-XDFP2LMW.js +605 -0
  470. package/dist/chunk-XEQMZB3C.js +525 -0
  471. package/dist/chunk-XEYLT5VA.js +223 -0
  472. package/dist/chunk-XHIQ5I6N.js +918 -0
  473. package/dist/chunk-XLH7QY2R.js +378 -0
  474. package/dist/chunk-XWFAMUZQ.js +113 -0
  475. package/dist/chunk-Y4BB2KS2.js +294 -0
  476. package/dist/chunk-Y4BB2KS2.js.map +1 -0
  477. package/dist/chunk-Y4OBB2VN.js +84 -0
  478. package/dist/chunk-YCVD6CI3.js +234 -0
  479. package/dist/chunk-YENLNISG.js +270 -0
  480. package/dist/chunk-YIRVLKAX.js +351 -0
  481. package/dist/chunk-YL73CVNK.js +390 -0
  482. package/dist/chunk-YLS6QE5G.js +288 -0
  483. package/dist/chunk-YNF2OC54.js +366 -0
  484. package/dist/chunk-YNF2OC54.js.map +1 -0
  485. package/dist/chunk-YPWU5KPE.js +147 -0
  486. package/dist/chunk-YQXTDZSU.js +2984 -0
  487. package/dist/chunk-YSJEAAOL.js +178 -0
  488. package/dist/chunk-YWIFM7D7.js +499 -0
  489. package/dist/chunk-YWVI6ZMK.js +103 -0
  490. package/dist/chunk-Z4FMAFNH.js +847 -0
  491. package/dist/chunk-Z654FWNU.js +136 -0
  492. package/dist/chunk-Z7Y523PS.js +130 -0
  493. package/dist/chunk-ZD67RM6G.js +60 -0
  494. package/dist/chunk-ZEG4VPBL.js +187 -0
  495. package/dist/chunk-ZHDFQITM.js +283 -0
  496. package/dist/chunk-ZHDFQITM.js.map +1 -0
  497. package/dist/chunk-ZLYCOBHW.js +75 -0
  498. package/dist/chunk-ZNJ5MTXV.js +89 -0
  499. package/dist/chunk-ZSGY3H53.js +155 -0
  500. package/dist/chunk-ZTPXACWB.js +1788 -0
  501. package/dist/chunk-ZUA3JMI6.js +107 -0
  502. package/dist/chunk-ZYAZUPPV.js +559 -0
  503. package/dist/composer.js +8 -8
  504. package/dist/computer-viewer-TDDO25AV.js +21 -0
  505. package/dist/connect.js +12 -12
  506. package/dist/desktop-dictation.js +12 -10
  507. package/dist/desktop-dictation.js.map +1 -1
  508. package/dist/desktop.js +2 -2
  509. package/dist/editor.js +2 -2
  510. package/dist/embedded-new-voice-2G3VLPVQ.js +24 -0
  511. package/dist/embedded-voice-T5IWOWGD.js +24 -0
  512. package/dist/fleet-decision-row-WM64KXP3.js +361 -0
  513. package/dist/in-chat-connect-model.js +5 -5
  514. package/dist/index.js +51 -51
  515. package/dist/interaction.js +5 -5
  516. package/dist/machines.js +3 -3
  517. package/dist/meetings-recorder.js +1 -1
  518. package/dist/meetings.js +40 -32
  519. package/dist/meetings.js.map +1 -1
  520. package/dist/messages/en.d.ts +3 -0
  521. package/dist/messages.js +1 -1
  522. package/dist/model-policy-picker-menu-SMC6J6QN.js +22 -0
  523. package/dist/payment-page-card-G4U63KUV.js +223 -0
  524. package/dist/platform-activity-row-BUZGZAKZ.js +128 -0
  525. package/dist/queue-surface-implementation-4KUZ4PJV.js +908 -0
  526. package/dist/realtime.js +4 -4
  527. package/dist/recorder-host-WF2RRR56.js +69 -0
  528. package/dist/recorder-host-WF2RRR56.js.map +1 -0
  529. package/dist/recordings.js +3 -3
  530. package/dist/sandbox-files-ESDMOFSD.js +27 -0
  531. package/dist/session-app.js +211 -209
  532. package/dist/session-connect-cards-Q53KMMYY.js +25 -0
  533. package/dist/session-list-model.js +2 -2
  534. package/dist/session-realtime-CF3I35WJ.js +30 -0
  535. package/dist/session-realtime.js +2 -2
  536. package/dist/session-ui.js +33 -31
  537. package/dist/session.js +5 -5
  538. package/dist/sites.js +2 -2
  539. package/dist/terminal.js +2 -2
  540. package/dist/this-computer.js +3 -3
  541. package/dist/timeline-annotation-markers-CJK4RYZ4.js +157 -0
  542. package/dist/timeline-annotation-selection-67GF5H26.js +208 -0
  543. package/dist/timeline-annotations-dialog-ONJPQDJQ.js +283 -0
  544. package/dist/ui/access-list.js +11 -9
  545. package/dist/ui/access-list.js.map +1 -1
  546. package/dist/ui/api-error.d.ts +6 -3
  547. package/dist/ui/api-error.js +2 -1
  548. package/dist/ui/cadence-picker.js +6 -4
  549. package/dist/ui/choice-cards.js +5 -3
  550. package/dist/ui/confirm-dialog.js +2 -2
  551. package/dist/ui/copy-field.js +5 -3
  552. package/dist/ui/detail-page.js +2 -2
  553. package/dist/ui/detail-sheet.js +2 -2
  554. package/dist/ui/diff-view.js +4 -3
  555. package/dist/ui/disclosure.js +3 -3
  556. package/dist/ui/email-chips-input.js +5 -3
  557. package/dist/ui/error-message.js +2 -1
  558. package/dist/ui/error-reference.d.ts +15 -0
  559. package/dist/ui/error-text.d.ts +10 -0
  560. package/dist/ui/error-text.js +9 -0
  561. package/dist/ui/error-text.js.map +1 -0
  562. package/dist/ui/field.js +4 -2
  563. package/dist/ui/flush-form-page.js +8 -6
  564. package/dist/ui/form-dialog.js +7 -5
  565. package/dist/ui/list-row.js +3 -3
  566. package/dist/ui/load-failure.js +3 -2
  567. package/dist/ui/load-failure.js.map +1 -1
  568. package/dist/ui/notice.js +3 -1
  569. package/dist/ui/relative-time.js +2 -2
  570. package/dist/ui/revision-history.js +9 -7
  571. package/dist/ui/revision-history.js.map +1 -1
  572. package/dist/ui/role-select.js +10 -8
  573. package/dist/ui/segmented-control.js +4 -2
  574. package/dist/ui/select-menu.js +5 -3
  575. package/dist/ui/setting-row.js +3 -1
  576. package/dist/ui/switch.js +4 -2
  577. package/dist/ui/usage-meter.js +3 -3
  578. package/dist/ui/word-list-row.js +4 -2
  579. package/dist/usage.js +2 -2
  580. package/dist/workbench.js +4 -4
  581. package/package.json +5 -6
  582. package/src/app/app-state.tsx +126 -14
  583. package/src/app/components/artifacts/site-data.tsx +2 -2
  584. package/src/app/components/artifacts/site-settings.tsx +2 -2
  585. package/src/app/components/rail/session-list.tsx +7 -8
  586. package/src/app/components/rail/session-shell.tsx +3 -3
  587. package/src/app/components/repository-picker.tsx +8 -1
  588. package/src/app/components/session/model-context-inspector.tsx +2 -1
  589. package/src/app/components/session/session-admin-access.tsx +2 -2
  590. package/src/app/lib/actions/chat-operations.ts +4 -4
  591. package/src/app/lib/archive-session.test.tsx +265 -2
  592. package/src/app/lib/archive-session.tsx +175 -9
  593. package/src/app/lib/copy-link.ts +2 -2
  594. package/src/app/lib/inbox.tsx +2 -2
  595. package/src/app/lib/session-failure-toasts.ts +3 -2
  596. package/src/app/lib/toast.test.tsx +215 -0
  597. package/src/app/lib/toast.tsx +67 -2
  598. package/src/app/personal-github-reconnect.test.tsx +356 -0
  599. package/src/app/routes/artifacts.tsx +1 -2
  600. package/src/components/tool-action-review.tsx +14 -1
  601. package/src/meetings/delete-meeting-dialog.tsx +2 -1
  602. package/src/meetings/meeting-ask.tsx +2 -1
  603. package/src/meetings/meeting-detail-page.tsx +2 -1
  604. package/src/meetings/meeting-notes.tsx +2 -1
  605. package/src/meetings/meeting-settings.tsx +4 -1
  606. package/src/meetings/meeting-transcript.tsx +4 -1
  607. package/src/meetings/recorder-context.tsx +10 -0
  608. package/src/meetings/recorder-host.test.tsx +60 -2
  609. package/src/meetings/recorder-host.tsx +16 -3
  610. package/src/meetings/recorder-panel.tsx +2 -1
  611. package/src/meetings/recorder-workspace.test.tsx +26 -1
  612. package/src/messages/en.ts +6 -0
  613. package/src/ui/api-error.test.ts +29 -5
  614. package/src/ui/api-error.tsx +10 -4
  615. package/src/ui/error-message.tsx +8 -0
  616. package/src/ui/error-reference.test.ts +54 -0
  617. package/src/ui/error-reference.ts +51 -0
  618. package/src/ui/error-text.test.tsx +66 -0
  619. package/src/ui/error-text.tsx +49 -0
  620. package/src/ui/field.tsx +4 -1
  621. package/src/ui/notice.tsx +7 -2
  622. package/src/ui/setting-row.tsx +4 -1
  623. package/styles/app.css +12 -0
  624. package/styles/compiled.css +9 -0
  625. package/dist/browser-viewer-NOP5EAUO.js +0 -23
  626. package/dist/chat-interactive-block-G7O44JHR.js +0 -18
  627. package/dist/chunk-26RWVLRD.js +0 -135
  628. package/dist/chunk-2AHTY7OT.js +0 -247
  629. package/dist/chunk-2GDNWKSC.js +0 -3670
  630. package/dist/chunk-2JENKGCE.js +0 -339
  631. package/dist/chunk-2KYQC4T5.js +0 -155
  632. package/dist/chunk-2RREGDQH.js +0 -708
  633. package/dist/chunk-2T7DX6KR.js +0 -353
  634. package/dist/chunk-2VB2O4FQ.js +0 -920
  635. package/dist/chunk-2VTTKH23.js +0 -94
  636. package/dist/chunk-2XNG2KNT.js +0 -172
  637. package/dist/chunk-2YC6JQRO.js +0 -399
  638. package/dist/chunk-2ZVRJRXC.js +0 -27
  639. package/dist/chunk-35737UT4.js +0 -162
  640. package/dist/chunk-366XZ4PM.js +0 -41
  641. package/dist/chunk-36MIDGAH.js +0 -199
  642. package/dist/chunk-3FD76LXM.js +0 -212
  643. package/dist/chunk-3OVIXY4O.js +0 -213
  644. package/dist/chunk-3OVIXY4O.js.map +0 -1
  645. package/dist/chunk-3QNRBEYH.js +0 -432
  646. package/dist/chunk-3QX55WLC.js +0 -15
  647. package/dist/chunk-3USJPT2S.js +0 -1022
  648. package/dist/chunk-42CMQ5VR.js +0 -251
  649. package/dist/chunk-4LPOWQJY.js +0 -42
  650. package/dist/chunk-4NBTZRKT.js +0 -79
  651. package/dist/chunk-4OXI6HCV.js +0 -118
  652. package/dist/chunk-4SZZAFYQ.js +0 -2317
  653. package/dist/chunk-4TQL3WP2.js +0 -140
  654. package/dist/chunk-4Y6BK7IU.js +0 -196
  655. package/dist/chunk-4YD7YZC5.js +0 -373
  656. package/dist/chunk-5DTST3TP.js +0 -81
  657. package/dist/chunk-5FH5LQVS.js +0 -130
  658. package/dist/chunk-5KWMYPJV.js +0 -847
  659. package/dist/chunk-5MUJDC6C.js +0 -84
  660. package/dist/chunk-5QM2WPKV.js +0 -41
  661. package/dist/chunk-5WUN7XPD.js +0 -1184
  662. package/dist/chunk-64PO2WXU.js +0 -1067
  663. package/dist/chunk-6AHATAAY.js +0 -431
  664. package/dist/chunk-6ED2YWBT.js +0 -56
  665. package/dist/chunk-6GXVYAGR.js +0 -170
  666. package/dist/chunk-6H4SJBPE.js +0 -85
  667. package/dist/chunk-6MT3HHUB.js +0 -84
  668. package/dist/chunk-6UHCBH4G.js +0 -198
  669. package/dist/chunk-6WLX3NR3.js +0 -198
  670. package/dist/chunk-73NXYYWE.js +0 -112
  671. package/dist/chunk-76ERNKIZ.js +0 -603
  672. package/dist/chunk-776QZ573.js +0 -57
  673. package/dist/chunk-7BYWOFVH.js +0 -171
  674. package/dist/chunk-7O5CGGIQ.js +0 -108
  675. package/dist/chunk-7QOHRZ67.js +0 -251
  676. package/dist/chunk-7WIDB4PL.js +0 -2058
  677. package/dist/chunk-7WKP3DYJ.js +0 -37
  678. package/dist/chunk-7XOVTPDI.js +0 -227
  679. package/dist/chunk-AB5MBIXY.js +0 -281
  680. package/dist/chunk-ADNMXBCX.js +0 -1193
  681. package/dist/chunk-AFBJTUFK.js +0 -202
  682. package/dist/chunk-ALVRWCXE.js +0 -61
  683. package/dist/chunk-AOHU6O3M.js +0 -247
  684. package/dist/chunk-AOHU6O3M.js.map +0 -1
  685. package/dist/chunk-APW4T4SW.js +0 -270
  686. package/dist/chunk-AXBSYWKX.js +0 -2656
  687. package/dist/chunk-B2I5ZW35.js +0 -422
  688. package/dist/chunk-B3LMRTRF.js +0 -223
  689. package/dist/chunk-BE2XENG2.js +0 -292
  690. package/dist/chunk-BE2XENG2.js.map +0 -1
  691. package/dist/chunk-BF4SADKX.js +0 -29
  692. package/dist/chunk-BKP43KK4.js +0 -1788
  693. package/dist/chunk-BM3NEZ6X.js +0 -781
  694. package/dist/chunk-BT3BAGB5.js +0 -216
  695. package/dist/chunk-BTSYDIVJ.js +0 -357
  696. package/dist/chunk-BUBNGKWG.js +0 -70
  697. package/dist/chunk-BVUJV5WR.js +0 -126
  698. package/dist/chunk-BZO5ZMUP.js +0 -27
  699. package/dist/chunk-C3HUF3M2.js +0 -157
  700. package/dist/chunk-C5QCAOES.js +0 -264
  701. package/dist/chunk-CGK6ALQU.js +0 -159
  702. package/dist/chunk-CPYGO76Q.js +0 -335
  703. package/dist/chunk-CQH4FWYA.js +0 -490
  704. package/dist/chunk-CZP5QXNB.js +0 -234
  705. package/dist/chunk-D2TOWEYH.js +0 -266
  706. package/dist/chunk-D6L4GHRH.js +0 -340
  707. package/dist/chunk-DKT3N37I.js +0 -50
  708. package/dist/chunk-DMMJIFKA.js +0 -84
  709. package/dist/chunk-DO74DQC7.js +0 -26
  710. package/dist/chunk-DOFJZ2JU.js +0 -83
  711. package/dist/chunk-DSXVY5WZ.js +0 -119
  712. package/dist/chunk-E337C2VK.js +0 -82
  713. package/dist/chunk-E6NRSRBE.js +0 -114
  714. package/dist/chunk-E6SQKHAU.js +0 -114
  715. package/dist/chunk-E7UIVD7F.js +0 -236
  716. package/dist/chunk-EGBII4CP.js +0 -229
  717. package/dist/chunk-EILSAQVJ.js +0 -200
  718. package/dist/chunk-ELL6HSYR.js +0 -307
  719. package/dist/chunk-EUBGLFFR.js +0 -73
  720. package/dist/chunk-EW6RNWSH.js +0 -212
  721. package/dist/chunk-EYUT5Y6V.js +0 -2599
  722. package/dist/chunk-F7U3QPZ3.js +0 -304
  723. package/dist/chunk-FBTJKSTM.js +0 -1270
  724. package/dist/chunk-FC2FTSK3.js +0 -2424
  725. package/dist/chunk-FOGNA3BU.js +0 -148
  726. package/dist/chunk-FQFKHNC7.js +0 -650
  727. package/dist/chunk-FTCHM755.js +0 -50
  728. package/dist/chunk-FXSHP4JZ.js +0 -3550
  729. package/dist/chunk-G6ZZC543.js +0 -818
  730. package/dist/chunk-G7FU6PUA.js +0 -100
  731. package/dist/chunk-GA4YEAMX.js +0 -3851
  732. package/dist/chunk-GE33BGB7.js +0 -12
  733. package/dist/chunk-GQ67HSJY.js +0 -570
  734. package/dist/chunk-GXXZ3WAK.js +0 -106
  735. package/dist/chunk-H2TCRX3H.js +0 -237
  736. package/dist/chunk-HLL4PBO7.js +0 -60
  737. package/dist/chunk-HLOEPV5C.js +0 -259
  738. package/dist/chunk-HUAGBS4O.js +0 -56
  739. package/dist/chunk-I36GSRUJ.js +0 -211
  740. package/dist/chunk-I6VBHT7S.js +0 -261
  741. package/dist/chunk-ICNNNOXE.js +0 -333
  742. package/dist/chunk-ICX64J4U.js +0 -172
  743. package/dist/chunk-ID36Y46W.js +0 -5046
  744. package/dist/chunk-ID36Y46W.js.map +0 -1
  745. package/dist/chunk-IGVVXLKJ.js +0 -559
  746. package/dist/chunk-IKJLSBUI.js +0 -2984
  747. package/dist/chunk-IKMUFDVS.js +0 -50
  748. package/dist/chunk-IKUNOX7F.js +0 -255
  749. package/dist/chunk-ILKDYBON.js +0 -288
  750. package/dist/chunk-IVYJX3OY.js +0 -187
  751. package/dist/chunk-JCY4CMDH.js +0 -107
  752. package/dist/chunk-JJZPLGIP.js +0 -474
  753. package/dist/chunk-JW33RV4V.js +0 -143
  754. package/dist/chunk-JWPA6ZPZ.js +0 -351
  755. package/dist/chunk-JZ4QXS6D.js +0 -50
  756. package/dist/chunk-K42OUZQ3.js +0 -386
  757. package/dist/chunk-K5TOVX5A.js +0 -206
  758. package/dist/chunk-K63HGHZX.js +0 -99
  759. package/dist/chunk-K6R5T44I.js +0 -75
  760. package/dist/chunk-KHJ5PXFM.js +0 -914
  761. package/dist/chunk-KJZRQ55O.js +0 -2319
  762. package/dist/chunk-KJZRQ55O.js.map +0 -1
  763. package/dist/chunk-KKI55ZMW.js +0 -65
  764. package/dist/chunk-KRPLAAFP.js +0 -199
  765. package/dist/chunk-KVFEZDBO.js +0 -134
  766. package/dist/chunk-L4I665WK.js +0 -45
  767. package/dist/chunk-L4OF77LE.js +0 -110
  768. package/dist/chunk-L4OF77LE.js.map +0 -1
  769. package/dist/chunk-LA5T52RM.js +0 -70
  770. package/dist/chunk-LM2W5YAT.js +0 -401
  771. package/dist/chunk-LQ62ECE6.js +0 -390
  772. package/dist/chunk-LQDUHU3Y.js +0 -71
  773. package/dist/chunk-LRJIYTZW.js +0 -4157
  774. package/dist/chunk-LRJIYTZW.js.map +0 -1
  775. package/dist/chunk-LRN6GYAZ.js +0 -138
  776. package/dist/chunk-M4SDVTKJ.js +0 -790
  777. package/dist/chunk-MA6O7CM6.js +0 -99
  778. package/dist/chunk-MBIBB6GI.js +0 -197
  779. package/dist/chunk-MF3ZFB4H.js +0 -199
  780. package/dist/chunk-MJJGJMYJ.js +0 -98
  781. package/dist/chunk-MLJADQFI.js +0 -4824
  782. package/dist/chunk-MQG7RV3B.js +0 -62
  783. package/dist/chunk-MTTGSQA5.js +0 -186
  784. package/dist/chunk-MW7Y3T55.js +0 -525
  785. package/dist/chunk-MYUFMVCH.js +0 -121
  786. package/dist/chunk-N3OARGH2.js +0 -61
  787. package/dist/chunk-NB2HMRT2.js +0 -353
  788. package/dist/chunk-NFDFYWMV.js +0 -141
  789. package/dist/chunk-NWGNFN3N.js +0 -1187
  790. package/dist/chunk-NWJRPDIO.js +0 -840
  791. package/dist/chunk-NWJRPDIO.js.map +0 -1
  792. package/dist/chunk-NXWBBZJV.js +0 -267
  793. package/dist/chunk-NY2QWROL.js +0 -71
  794. package/dist/chunk-O2IOPP3R.js +0 -848
  795. package/dist/chunk-O2UWH5RG.js +0 -141
  796. package/dist/chunk-O5YWDLYF.js +0 -393
  797. package/dist/chunk-OBMCZO7E.js +0 -121
  798. package/dist/chunk-OD3DCCCB.js +0 -132
  799. package/dist/chunk-OMH7R6I3.js +0 -390
  800. package/dist/chunk-OSA5EQG5.js +0 -113
  801. package/dist/chunk-OSJ3MUTZ.js +0 -2936
  802. package/dist/chunk-OWAYJ2OV.js +0 -368
  803. package/dist/chunk-OYXBFSGK.js +0 -269
  804. package/dist/chunk-PC2EBA5G.js +0 -4116
  805. package/dist/chunk-PC2EBA5G.js.map +0 -1
  806. package/dist/chunk-PC2MVXIP.js +0 -363
  807. package/dist/chunk-PC2MVXIP.js.map +0 -1
  808. package/dist/chunk-PENGLDR5.js +0 -309
  809. package/dist/chunk-PSMAWRPL.js +0 -191
  810. package/dist/chunk-PW4IMTYR.js +0 -702
  811. package/dist/chunk-PW54V7T5.js +0 -387
  812. package/dist/chunk-Q2EXYSMO.js +0 -24
  813. package/dist/chunk-Q2XJK5I4.js +0 -51
  814. package/dist/chunk-Q2XJK5I4.js.map +0 -1
  815. package/dist/chunk-Q4EFRI6X.js +0 -258
  816. package/dist/chunk-Q52CXW6C.js +0 -48
  817. package/dist/chunk-Q6XQ2R37.js +0 -184
  818. package/dist/chunk-QAJ53XBW.js +0 -23
  819. package/dist/chunk-QDTKECT4.js +0 -129
  820. package/dist/chunk-QE3ZFGI3.js +0 -43
  821. package/dist/chunk-QHHSUR2Y.js +0 -298
  822. package/dist/chunk-QHNVNR7B.js +0 -173
  823. package/dist/chunk-QIK2Q6N5.js +0 -376
  824. package/dist/chunk-QWL4L366.js +0 -38
  825. package/dist/chunk-R3J2PTVQ.js +0 -690
  826. package/dist/chunk-RBRX5ZS3.js +0 -319
  827. package/dist/chunk-REX6JIC7.js +0 -33
  828. package/dist/chunk-RGZ7EEC3.js +0 -537
  829. package/dist/chunk-RGZ7EEC3.js.map +0 -1
  830. package/dist/chunk-RIPS7GFR.js +0 -960
  831. package/dist/chunk-RTBZNFNV.js +0 -1354
  832. package/dist/chunk-RTBZNFNV.js.map +0 -1
  833. package/dist/chunk-SKMNW4SW.js +0 -187
  834. package/dist/chunk-SRFARKXC.js +0 -623
  835. package/dist/chunk-SWIHWCTW.js +0 -4461
  836. package/dist/chunk-TA5CFTO4.js +0 -103
  837. package/dist/chunk-TF4ZVJLI.js +0 -156
  838. package/dist/chunk-TG7DADJR.js +0 -9624
  839. package/dist/chunk-TI4R2ZD5.js +0 -623
  840. package/dist/chunk-TI4R2ZD5.js.map +0 -1
  841. package/dist/chunk-TNKWOUWP.js +0 -412
  842. package/dist/chunk-TNUSPXPW.js +0 -5555
  843. package/dist/chunk-TNUSPXPW.js.map +0 -1
  844. package/dist/chunk-TNYFHKVV.js +0 -366
  845. package/dist/chunk-TPMZBOFH.js +0 -178
  846. package/dist/chunk-TW3LKRJF.js +0 -263
  847. package/dist/chunk-TZAO65I4.js +0 -83
  848. package/dist/chunk-U5EFEMYU.js +0 -89
  849. package/dist/chunk-U6M4LS3M.js +0 -378
  850. package/dist/chunk-UI4HI5QK.js +0 -918
  851. package/dist/chunk-UJDOWCQ3.js +0 -272
  852. package/dist/chunk-UJUQ2QOX.js +0 -581
  853. package/dist/chunk-UQ3IM6FY.js +0 -133
  854. package/dist/chunk-UYE47LO6.js +0 -246
  855. package/dist/chunk-VADHIT26.js +0 -89
  856. package/dist/chunk-VFQ3H6CO.js +0 -163
  857. package/dist/chunk-VGUN6VB2.js +0 -188
  858. package/dist/chunk-VGWWEVSD.js +0 -723
  859. package/dist/chunk-VIEFJ2DM.js +0 -2469
  860. package/dist/chunk-VLXM36VS.js +0 -268
  861. package/dist/chunk-W3BFRR2G.js +0 -499
  862. package/dist/chunk-W5MPXR3A.js +0 -981
  863. package/dist/chunk-W5OWKVZG.js +0 -136
  864. package/dist/chunk-W6FRORMX.js +0 -486
  865. package/dist/chunk-W6FRORMX.js.map +0 -1
  866. package/dist/chunk-W7XROSZO.js +0 -232
  867. package/dist/chunk-W7XROSZO.js.map +0 -1
  868. package/dist/chunk-WEZ5PXZP.js +0 -403
  869. package/dist/chunk-WHWUWN2X.js +0 -197
  870. package/dist/chunk-WHWUWN2X.js.map +0 -1
  871. package/dist/chunk-WLEDGIVS.js +0 -114
  872. package/dist/chunk-WLEDGIVS.js.map +0 -1
  873. package/dist/chunk-WNDAKLHG.js +0 -281
  874. package/dist/chunk-WTJ4PLMU.js +0 -103
  875. package/dist/chunk-WV2KPJUW.js +0 -107
  876. package/dist/chunk-X3VY5EGY.js +0 -277
  877. package/dist/chunk-X3VY5EGY.js.map +0 -1
  878. package/dist/chunk-XDBYWVCW.js +0 -418
  879. package/dist/chunk-XF7MA4U5.js +0 -36
  880. package/dist/chunk-XF7MA4U5.js.map +0 -1
  881. package/dist/chunk-XOSQP3YA.js +0 -605
  882. package/dist/chunk-XYBV4ZJQ.js +0 -271
  883. package/dist/chunk-YBKVGLQR.js +0 -147
  884. package/dist/chunk-YDCUBUWH.js +0 -1583
  885. package/dist/chunk-YG6NARQY.js +0 -51
  886. package/dist/chunk-YG6NARQY.js.map +0 -1
  887. package/dist/chunk-YSVD5HI4.js +0 -278
  888. package/dist/chunk-YT3WGNG6.js +0 -290
  889. package/dist/chunk-YYICQDK4.js +0 -414
  890. package/dist/chunk-YYLMZLI6.js +0 -686
  891. package/dist/chunk-ZAMTKG5U.js +0 -95
  892. package/dist/chunk-ZDLYSXKN.js +0 -111
  893. package/dist/chunk-ZG447FSS.js +0 -194
  894. package/dist/chunk-ZIT5KD4Q.js +0 -264
  895. package/dist/chunk-ZUDOVDKR.js +0 -3064
  896. package/dist/chunk-ZW2ECJ3A.js +0 -451
  897. package/dist/computer-viewer-LPZ763KF.js +0 -21
  898. package/dist/embedded-new-voice-YVMKSLKJ.js +0 -24
  899. package/dist/embedded-voice-BJPQFXSU.js +0 -24
  900. package/dist/fleet-decision-row-AA4H5CDT.js +0 -361
  901. package/dist/model-policy-picker-menu-HSMWVO4P.js +0 -22
  902. package/dist/payment-page-card-3LTSFJGN.js +0 -223
  903. package/dist/platform-activity-row-5VYV6TX4.js +0 -128
  904. package/dist/queue-surface-implementation-NXHZUKD2.js +0 -908
  905. package/dist/recorder-host-ZKRWTDBM.js +0 -57
  906. package/dist/recorder-host-ZKRWTDBM.js.map +0 -1
  907. package/dist/sandbox-files-YCMLQUFU.js +0 -27
  908. package/dist/session-connect-cards-KSQLMRM5.js +0 -25
  909. package/dist/session-realtime-ZR6JLG3Y.js +0 -30
  910. package/dist/timeline-annotation-markers-YAHDPWVG.js +0 -157
  911. package/dist/timeline-annotation-selection-KHXNCEJP.js +0 -208
  912. package/dist/timeline-annotations-dialog-Y4XD3N7B.js +0 -283
  913. /package/dist/{browser-viewer-NOP5EAUO.js.map → browser-viewer-TC27OCIP.js.map} +0 -0
  914. /package/dist/{chat-interactive-block-G7O44JHR.js.map → chat-interactive-block-RWPQBHVS.js.map} +0 -0
  915. /package/dist/{chunk-EGBII4CP.js.map → chunk-2BDT3UZQ.js.map} +0 -0
  916. /package/dist/{chunk-4YD7YZC5.js.map → chunk-2CLNIEK4.js.map} +0 -0
  917. /package/dist/{chunk-ZW2ECJ3A.js.map → chunk-2FSBSCZJ.js.map} +0 -0
  918. /package/dist/{chunk-KRPLAAFP.js.map → chunk-2I7HDP53.js.map} +0 -0
  919. /package/dist/{chunk-3QX55WLC.js.map → chunk-2INLDVK3.js.map} +0 -0
  920. /package/dist/{chunk-BVUJV5WR.js.map → chunk-2KALVELR.js.map} +0 -0
  921. /package/dist/{chunk-XDBYWVCW.js.map → chunk-2M3J7ZWQ.js.map} +0 -0
  922. /package/dist/{chunk-2RREGDQH.js.map → chunk-2OP6WLGV.js.map} +0 -0
  923. /package/dist/{chunk-OSJ3MUTZ.js.map → chunk-2RG7NIAS.js.map} +0 -0
  924. /package/dist/{chunk-26RWVLRD.js.map → chunk-2STUPWEL.js.map} +0 -0
  925. /package/dist/{chunk-XYBV4ZJQ.js.map → chunk-2YUOVM3G.js.map} +0 -0
  926. /package/dist/{chunk-2GDNWKSC.js.map → chunk-2Z3NQNTM.js.map} +0 -0
  927. /package/dist/{chunk-2VB2O4FQ.js.map → chunk-3CPWWGNK.js.map} +0 -0
  928. /package/dist/{chunk-7WKP3DYJ.js.map → chunk-3ED2U6XE.js.map} +0 -0
  929. /package/dist/{chunk-BT3BAGB5.js.map → chunk-3GZA4BUW.js.map} +0 -0
  930. /package/dist/{chunk-3USJPT2S.js.map → chunk-3IK6UYO6.js.map} +0 -0
  931. /package/dist/{chunk-6AHATAAY.js.map → chunk-3PZ7JZI2.js.map} +0 -0
  932. /package/dist/{chunk-JZ4QXS6D.js.map → chunk-4DVJ6ONS.js.map} +0 -0
  933. /package/dist/{chunk-5QM2WPKV.js.map → chunk-4E3ZJRTZ.js.map} +0 -0
  934. /package/dist/{chunk-NFDFYWMV.js.map → chunk-4SAWSRAA.js.map} +0 -0
  935. /package/dist/{chunk-ELL6HSYR.js.map → chunk-53AGXXZM.js.map} +0 -0
  936. /package/dist/{chunk-G6ZZC543.js.map → chunk-54YW6SZZ.js.map} +0 -0
  937. /package/dist/{chunk-4SZZAFYQ.js.map → chunk-57AZS3IE.js.map} +0 -0
  938. /package/dist/{chunk-JW33RV4V.js.map → chunk-5CPEEAFD.js.map} +0 -0
  939. /package/dist/{chunk-D6L4GHRH.js.map → chunk-5EWSRZ2Y.js.map} +0 -0
  940. /package/dist/{chunk-PW54V7T5.js.map → chunk-5IE76VCY.js.map} +0 -0
  941. /package/dist/{chunk-6GXVYAGR.js.map → chunk-5NWEKLDZ.js.map} +0 -0
  942. /package/dist/{chunk-6UHCBH4G.js.map → chunk-5O2FCCHZ.js.map} +0 -0
  943. /package/dist/{chunk-2YC6JQRO.js.map → chunk-5QAY6K77.js.map} +0 -0
  944. /package/dist/{chunk-EYUT5Y6V.js.map → chunk-6DK6Z4UN.js.map} +0 -0
  945. /package/dist/{chunk-PW4IMTYR.js.map → chunk-6DVCC7QS.js.map} +0 -0
  946. /package/dist/{chunk-7WIDB4PL.js.map → chunk-6JHU2UBS.js.map} +0 -0
  947. /package/dist/{chunk-CQH4FWYA.js.map → chunk-6PZ7OBYU.js.map} +0 -0
  948. /package/dist/{chunk-VFQ3H6CO.js.map → chunk-6WGRDRMA.js.map} +0 -0
  949. /package/dist/{chunk-MTTGSQA5.js.map → chunk-77WAKEAH.js.map} +0 -0
  950. /package/dist/{chunk-O5YWDLYF.js.map → chunk-7TDO3CUM.js.map} +0 -0
  951. /package/dist/{chunk-2AHTY7OT.js.map → chunk-7TIX2UAR.js.map} +0 -0
  952. /package/dist/{chunk-FOGNA3BU.js.map → chunk-7V5REBCP.js.map} +0 -0
  953. /package/dist/{chunk-2JENKGCE.js.map → chunk-7VMZGLYI.js.map} +0 -0
  954. /package/dist/{chunk-E7UIVD7F.js.map → chunk-7W37NS3I.js.map} +0 -0
  955. /package/dist/{chunk-ZDLYSXKN.js.map → chunk-7X6SDK2C.js.map} +0 -0
  956. /package/dist/{chunk-ZAMTKG5U.js.map → chunk-7ZNUHRP5.js.map} +0 -0
  957. /package/dist/{chunk-DMMJIFKA.js.map → chunk-A36PZALD.js.map} +0 -0
  958. /package/dist/{chunk-WV2KPJUW.js.map → chunk-AUI6VA63.js.map} +0 -0
  959. /package/dist/{chunk-Q2EXYSMO.js.map → chunk-AW2MQB37.js.map} +0 -0
  960. /package/dist/{chunk-6WLX3NR3.js.map → chunk-AWKES45Y.js.map} +0 -0
  961. /package/dist/{chunk-OD3DCCCB.js.map → chunk-AXHZYXUV.js.map} +0 -0
  962. /package/dist/{chunk-QDTKECT4.js.map → chunk-BHNSJVBC.js.map} +0 -0
  963. /package/dist/{chunk-FTCHM755.js.map → chunk-BJEJFISW.js.map} +0 -0
  964. /package/dist/{chunk-B2I5ZW35.js.map → chunk-BJFH6JI5.js.map} +0 -0
  965. /package/dist/{chunk-RIPS7GFR.js.map → chunk-BMICEQZQ.js.map} +0 -0
  966. /package/dist/{chunk-BF4SADKX.js.map → chunk-BTLBYBLU.js.map} +0 -0
  967. /package/dist/{chunk-U5EFEMYU.js.map → chunk-BXBDYNRP.js.map} +0 -0
  968. /package/dist/{chunk-BTSYDIVJ.js.map → chunk-C372BFOV.js.map} +0 -0
  969. /package/dist/{chunk-MLJADQFI.js.map → chunk-CMKGILJK.js.map} +0 -0
  970. /package/dist/{chunk-DKT3N37I.js.map → chunk-CRAOSVHC.js.map} +0 -0
  971. /package/dist/{chunk-WNDAKLHG.js.map → chunk-CRU35QQH.js.map} +0 -0
  972. /package/dist/{chunk-2XNG2KNT.js.map → chunk-CUIWCGMA.js.map} +0 -0
  973. /package/dist/{chunk-QWL4L366.js.map → chunk-D5TWNFFE.js.map} +0 -0
  974. /package/dist/{chunk-SWIHWCTW.js.map → chunk-DF5EAHDN.js.map} +0 -0
  975. /package/dist/{chunk-HUAGBS4O.js.map → chunk-DJAXC5OK.js.map} +0 -0
  976. /package/dist/{chunk-FXSHP4JZ.js.map → chunk-DXBYWSL5.js.map} +0 -0
  977. /package/dist/{chunk-5MUJDC6C.js.map → chunk-DXR5PDFP.js.map} +0 -0
  978. /package/dist/{chunk-NXWBBZJV.js.map → chunk-DZWARC4M.js.map} +0 -0
  979. /package/dist/{chunk-GXXZ3WAK.js.map → chunk-DZXEDSQI.js.map} +0 -0
  980. /package/dist/{chunk-Q52CXW6C.js.map → chunk-E7XERZWC.js.map} +0 -0
  981. /package/dist/{chunk-4NBTZRKT.js.map → chunk-ECJBYNLJ.js.map} +0 -0
  982. /package/dist/{chunk-QE3ZFGI3.js.map → chunk-EDI6SJ2N.js.map} +0 -0
  983. /package/dist/{chunk-E6NRSRBE.js.map → chunk-EWSOC6WF.js.map} +0 -0
  984. /package/dist/{chunk-TA5CFTO4.js.map → chunk-F2OPHAUN.js.map} +0 -0
  985. /package/dist/{chunk-5DTST3TP.js.map → chunk-F4ISQGGM.js.map} +0 -0
  986. /package/dist/{chunk-MBIBB6GI.js.map → chunk-FO4LYKJL.js.map} +0 -0
  987. /package/dist/{chunk-EUBGLFFR.js.map → chunk-FPXASDG5.js.map} +0 -0
  988. /package/dist/{chunk-C3HUF3M2.js.map → chunk-FVXBNBHO.js.map} +0 -0
  989. /package/dist/{chunk-W5MPXR3A.js.map → chunk-FZC5N55X.js.map} +0 -0
  990. /package/dist/{chunk-MA6O7CM6.js.map → chunk-GAVYGBFI.js.map} +0 -0
  991. /package/dist/{chunk-REX6JIC7.js.map → chunk-GKVJIDHF.js.map} +0 -0
  992. /package/dist/{chunk-EW6RNWSH.js.map → chunk-GVN5SZLX.js.map} +0 -0
  993. /package/dist/{chunk-KVFEZDBO.js.map → chunk-H3T7IWNA.js.map} +0 -0
  994. /package/dist/{chunk-I6VBHT7S.js.map → chunk-HAX4LCR5.js.map} +0 -0
  995. /package/dist/{chunk-OBMCZO7E.js.map → chunk-HC4JFZVU.js.map} +0 -0
  996. /package/dist/{chunk-UJUQ2QOX.js.map → chunk-HEFPPMBQ.js.map} +0 -0
  997. /package/dist/{chunk-DOFJZ2JU.js.map → chunk-HNLR7Q4Z.js.map} +0 -0
  998. /package/dist/{chunk-GE33BGB7.js.map → chunk-HSOXMJOT.js.map} +0 -0
  999. /package/dist/{chunk-AB5MBIXY.js.map → chunk-I4MRDSUF.js.map} +0 -0
  1000. /package/dist/{chunk-AFBJTUFK.js.map → chunk-I4QEJ62Y.js.map} +0 -0
  1001. /package/dist/{chunk-6ED2YWBT.js.map → chunk-I5B5L6Q4.js.map} +0 -0
  1002. /package/dist/{chunk-C5QCAOES.js.map → chunk-I5QZJODL.js.map} +0 -0
  1003. /package/dist/{chunk-76ERNKIZ.js.map → chunk-I7ITSXSJ.js.map} +0 -0
  1004. /package/dist/{chunk-OMH7R6I3.js.map → chunk-I7XIZRFD.js.map} +0 -0
  1005. /package/dist/{chunk-E337C2VK.js.map → chunk-IDANQPRH.js.map} +0 -0
  1006. /package/dist/{chunk-3FD76LXM.js.map → chunk-IFB3WJ36.js.map} +0 -0
  1007. /package/dist/{chunk-ZIT5KD4Q.js.map → chunk-IHTAKKTK.js.map} +0 -0
  1008. /package/dist/{chunk-QHNVNR7B.js.map → chunk-ILDXWY37.js.map} +0 -0
  1009. /package/dist/{chunk-GQ67HSJY.js.map → chunk-IMDQUHBJ.js.map} +0 -0
  1010. /package/dist/{chunk-DSXVY5WZ.js.map → chunk-IMZCQBOT.js.map} +0 -0
  1011. /package/dist/{chunk-WEZ5PXZP.js.map → chunk-IXPTECSC.js.map} +0 -0
  1012. /package/dist/{chunk-NY2QWROL.js.map → chunk-J255A3N5.js.map} +0 -0
  1013. /package/dist/{chunk-O2UWH5RG.js.map → chunk-J5F5HPPW.js.map} +0 -0
  1014. /package/dist/{chunk-VIEFJ2DM.js.map → chunk-JEA3QDX7.js.map} +0 -0
  1015. /package/dist/{chunk-TF4ZVJLI.js.map → chunk-JEUPAVYY.js.map} +0 -0
  1016. /package/dist/{chunk-ZG447FSS.js.map → chunk-JKHKLL5W.js.map} +0 -0
  1017. /package/dist/{chunk-FQFKHNC7.js.map → chunk-JQL7ZH6C.js.map} +0 -0
  1018. /package/dist/{chunk-776QZ573.js.map → chunk-JWB44UGJ.js.map} +0 -0
  1019. /package/dist/{chunk-ICNNNOXE.js.map → chunk-JZ4NLCAP.js.map} +0 -0
  1020. /package/dist/{chunk-TNKWOUWP.js.map → chunk-K2A5PXQ5.js.map} +0 -0
  1021. /package/dist/{chunk-SRFARKXC.js.map → chunk-K56XV3C3.js.map} +0 -0
  1022. /package/dist/{chunk-QAJ53XBW.js.map → chunk-K6GAXXVA.js.map} +0 -0
  1023. /package/dist/{chunk-MF3ZFB4H.js.map → chunk-KCBMFSMS.js.map} +0 -0
  1024. /package/dist/{chunk-VLXM36VS.js.map → chunk-KF2FV3ZJ.js.map} +0 -0
  1025. /package/dist/{chunk-YSVD5HI4.js.map → chunk-KJD65EJP.js.map} +0 -0
  1026. /package/dist/{chunk-K42OUZQ3.js.map → chunk-KLEUWIMZ.js.map} +0 -0
  1027. /package/dist/{chunk-PENGLDR5.js.map → chunk-KODELWYT.js.map} +0 -0
  1028. /package/dist/{chunk-TZAO65I4.js.map → chunk-KRDR5RJD.js.map} +0 -0
  1029. /package/dist/{chunk-KHJ5PXFM.js.map → chunk-KUDGXAF7.js.map} +0 -0
  1030. /package/dist/{chunk-6H4SJBPE.js.map → chunk-KYS77RPN.js.map} +0 -0
  1031. /package/dist/{chunk-OWAYJ2OV.js.map → chunk-L7YTNTIK.js.map} +0 -0
  1032. /package/dist/{chunk-YYLMZLI6.js.map → chunk-LHPNABDH.js.map} +0 -0
  1033. /package/dist/{chunk-LM2W5YAT.js.map → chunk-MFROMEKA.js.map} +0 -0
  1034. /package/dist/{chunk-AXBSYWKX.js.map → chunk-MIHN76LX.js.map} +0 -0
  1035. /package/dist/{chunk-4LPOWQJY.js.map → chunk-MIYFS2XN.js.map} +0 -0
  1036. /package/dist/{chunk-KKI55ZMW.js.map → chunk-MJUCFQMS.js.map} +0 -0
  1037. /package/dist/{chunk-ZUDOVDKR.js.map → chunk-MM4FNWI4.js.map} +0 -0
  1038. /package/dist/{chunk-M4SDVTKJ.js.map → chunk-MNZG4OHU.js.map} +0 -0
  1039. /package/dist/{chunk-EILSAQVJ.js.map → chunk-N6AACDUW.js.map} +0 -0
  1040. /package/dist/{chunk-BM3NEZ6X.js.map → chunk-NC55IFN3.js.map} +0 -0
  1041. /package/dist/{chunk-MJJGJMYJ.js.map → chunk-NC7PVOEK.js.map} +0 -0
  1042. /package/dist/{chunk-LA5T52RM.js.map → chunk-NCYMNCJO.js.map} +0 -0
  1043. /package/dist/{chunk-HLOEPV5C.js.map → chunk-ND2BXV3P.js.map} +0 -0
  1044. /package/dist/{chunk-UJDOWCQ3.js.map → chunk-NDBTFUO6.js.map} +0 -0
  1045. /package/dist/{chunk-K5TOVX5A.js.map → chunk-NDQJZ7HF.js.map} +0 -0
  1046. /package/dist/{chunk-35737UT4.js.map → chunk-NGJJJPZZ.js.map} +0 -0
  1047. /package/dist/{chunk-42CMQ5VR.js.map → chunk-NJTSNNE7.js.map} +0 -0
  1048. /package/dist/{chunk-FBTJKSTM.js.map → chunk-NRTE7DNV.js.map} +0 -0
  1049. /package/dist/{chunk-YT3WGNG6.js.map → chunk-NULUNM7H.js.map} +0 -0
  1050. /package/dist/{chunk-7XOVTPDI.js.map → chunk-NUNZS36W.js.map} +0 -0
  1051. /package/dist/{chunk-FC2FTSK3.js.map → chunk-NW53H5RW.js.map} +0 -0
  1052. /package/dist/{chunk-TW3LKRJF.js.map → chunk-NXCMHIKI.js.map} +0 -0
  1053. /package/dist/{chunk-CGK6ALQU.js.map → chunk-O3LKCBP5.js.map} +0 -0
  1054. /package/dist/{chunk-QIK2Q6N5.js.map → chunk-O6N4ABCA.js.map} +0 -0
  1055. /package/dist/{chunk-73NXYYWE.js.map → chunk-O732GAFC.js.map} +0 -0
  1056. /package/dist/{chunk-R3J2PTVQ.js.map → chunk-OF4TIKYC.js.map} +0 -0
  1057. /package/dist/{chunk-BUBNGKWG.js.map → chunk-OMPVOMPP.js.map} +0 -0
  1058. /package/dist/{chunk-4OXI6HCV.js.map → chunk-OPJJSKUK.js.map} +0 -0
  1059. /package/dist/{chunk-4Y6BK7IU.js.map → chunk-OPWCMA4D.js.map} +0 -0
  1060. /package/dist/{chunk-ADNMXBCX.js.map → chunk-ORJPS5VN.js.map} +0 -0
  1061. /package/dist/{chunk-SKMNW4SW.js.map → chunk-OSY5K7L7.js.map} +0 -0
  1062. /package/dist/{chunk-L4I665WK.js.map → chunk-OV6QJRT4.js.map} +0 -0
  1063. /package/dist/{chunk-7O5CGGIQ.js.map → chunk-OVKYVZMW.js.map} +0 -0
  1064. /package/dist/{chunk-7BYWOFVH.js.map → chunk-OZCBM3UC.js.map} +0 -0
  1065. /package/dist/{chunk-ALVRWCXE.js.map → chunk-P3A2EINJ.js.map} +0 -0
  1066. /package/dist/{chunk-BZO5ZMUP.js.map → chunk-PTAG4PDC.js.map} +0 -0
  1067. /package/dist/{chunk-QHHSUR2Y.js.map → chunk-PTF5B7TJ.js.map} +0 -0
  1068. /package/dist/{chunk-O2IOPP3R.js.map → chunk-Q3DPEYX4.js.map} +0 -0
  1069. /package/dist/{chunk-G7FU6PUA.js.map → chunk-QB2KMIDP.js.map} +0 -0
  1070. /package/dist/{chunk-64PO2WXU.js.map → chunk-QCSJ4CWE.js.map} +0 -0
  1071. /package/dist/{chunk-YYICQDK4.js.map → chunk-QIOQ2NPQ.js.map} +0 -0
  1072. /package/dist/{chunk-NB2HMRT2.js.map → chunk-QK5EFEUT.js.map} +0 -0
  1073. /package/dist/{chunk-366XZ4PM.js.map → chunk-QPQBLYQJ.js.map} +0 -0
  1074. /package/dist/{chunk-Q6XQ2R37.js.map → chunk-QPSGCC5D.js.map} +0 -0
  1075. /package/dist/{chunk-JJZPLGIP.js.map → chunk-QZAAUQRN.js.map} +0 -0
  1076. /package/dist/{chunk-VGUN6VB2.js.map → chunk-RGBI63KJ.js.map} +0 -0
  1077. /package/dist/{chunk-LRN6GYAZ.js.map → chunk-RLBKLAEY.js.map} +0 -0
  1078. /package/dist/{chunk-F7U3QPZ3.js.map → chunk-RMFKVOM7.js.map} +0 -0
  1079. /package/dist/{chunk-Q4EFRI6X.js.map → chunk-ROKQU7WG.js.map} +0 -0
  1080. /package/dist/{chunk-7QOHRZ67.js.map → chunk-RPVREAU7.js.map} +0 -0
  1081. /package/dist/{chunk-VGWWEVSD.js.map → chunk-RQKLF42C.js.map} +0 -0
  1082. /package/dist/{chunk-2VTTKH23.js.map → chunk-SEO7TICN.js.map} +0 -0
  1083. /package/dist/{chunk-3QNRBEYH.js.map → chunk-SHHJCL7X.js.map} +0 -0
  1084. /package/dist/{chunk-E6SQKHAU.js.map → chunk-SIRLACNZ.js.map} +0 -0
  1085. /package/dist/{chunk-H2TCRX3H.js.map → chunk-SKPHMYAA.js.map} +0 -0
  1086. /package/dist/{chunk-YDCUBUWH.js.map → chunk-SODC7T6L.js.map} +0 -0
  1087. /package/dist/{chunk-TNYFHKVV.js.map → chunk-SQJIKMN3.js.map} +0 -0
  1088. /package/dist/{chunk-DO74DQC7.js.map → chunk-SVINDKVW.js.map} +0 -0
  1089. /package/dist/{chunk-CPYGO76Q.js.map → chunk-SYCDHPZF.js.map} +0 -0
  1090. /package/dist/{chunk-UQ3IM6FY.js.map → chunk-T2QX3FDP.js.map} +0 -0
  1091. /package/dist/{chunk-NWGNFN3N.js.map → chunk-T3OWFVMS.js.map} +0 -0
  1092. /package/dist/{chunk-N3OARGH2.js.map → chunk-T6XI5FLY.js.map} +0 -0
  1093. /package/dist/{chunk-MQG7RV3B.js.map → chunk-T7OXJZCX.js.map} +0 -0
  1094. /package/dist/{chunk-2T7DX6KR.js.map → chunk-TAT5USZN.js.map} +0 -0
  1095. /package/dist/{chunk-ICX64J4U.js.map → chunk-TPQTRNER.js.map} +0 -0
  1096. /package/dist/{chunk-D2TOWEYH.js.map → chunk-TUIN4MB7.js.map} +0 -0
  1097. /package/dist/{chunk-LQDUHU3Y.js.map → chunk-TX3VECZU.js.map} +0 -0
  1098. /package/dist/{chunk-TG7DADJR.js.map → chunk-TXLIEOJX.js.map} +0 -0
  1099. /package/dist/{chunk-2ZVRJRXC.js.map → chunk-U3DN4HEY.js.map} +0 -0
  1100. /package/dist/{chunk-PSMAWRPL.js.map → chunk-U7XM7CB4.js.map} +0 -0
  1101. /package/dist/{chunk-4TQL3WP2.js.map → chunk-UJK53QFL.js.map} +0 -0
  1102. /package/dist/{chunk-RBRX5ZS3.js.map → chunk-UMTXA2TH.js.map} +0 -0
  1103. /package/dist/{chunk-36MIDGAH.js.map → chunk-UPDSXFK5.js.map} +0 -0
  1104. /package/dist/{chunk-OYXBFSGK.js.map → chunk-UTIAXH52.js.map} +0 -0
  1105. /package/dist/{chunk-5WUN7XPD.js.map → chunk-UVN5TMHU.js.map} +0 -0
  1106. /package/dist/{chunk-UYE47LO6.js.map → chunk-VGYXW3VG.js.map} +0 -0
  1107. /package/dist/{chunk-IKUNOX7F.js.map → chunk-VS7AHPCZ.js.map} +0 -0
  1108. /package/dist/{chunk-MYUFMVCH.js.map → chunk-VTTAJOQ7.js.map} +0 -0
  1109. /package/dist/{chunk-K63HGHZX.js.map → chunk-VWPOLUAO.js.map} +0 -0
  1110. /package/dist/{chunk-GA4YEAMX.js.map → chunk-X3MWB2QU.js.map} +0 -0
  1111. /package/dist/{chunk-I36GSRUJ.js.map → chunk-X6KAJI3V.js.map} +0 -0
  1112. /package/dist/{chunk-IKMUFDVS.js.map → chunk-XBLRHV5R.js.map} +0 -0
  1113. /package/dist/{chunk-XOSQP3YA.js.map → chunk-XDFP2LMW.js.map} +0 -0
  1114. /package/dist/{chunk-MW7Y3T55.js.map → chunk-XEQMZB3C.js.map} +0 -0
  1115. /package/dist/{chunk-B3LMRTRF.js.map → chunk-XEYLT5VA.js.map} +0 -0
  1116. /package/dist/{chunk-UI4HI5QK.js.map → chunk-XHIQ5I6N.js.map} +0 -0
  1117. /package/dist/{chunk-U6M4LS3M.js.map → chunk-XLH7QY2R.js.map} +0 -0
  1118. /package/dist/{chunk-OSA5EQG5.js.map → chunk-XWFAMUZQ.js.map} +0 -0
  1119. /package/dist/{chunk-6MT3HHUB.js.map → chunk-Y4OBB2VN.js.map} +0 -0
  1120. /package/dist/{chunk-CZP5QXNB.js.map → chunk-YCVD6CI3.js.map} +0 -0
  1121. /package/dist/{chunk-APW4T4SW.js.map → chunk-YENLNISG.js.map} +0 -0
  1122. /package/dist/{chunk-JWPA6ZPZ.js.map → chunk-YIRVLKAX.js.map} +0 -0
  1123. /package/dist/{chunk-LQ62ECE6.js.map → chunk-YL73CVNK.js.map} +0 -0
  1124. /package/dist/{chunk-ILKDYBON.js.map → chunk-YLS6QE5G.js.map} +0 -0
  1125. /package/dist/{chunk-YBKVGLQR.js.map → chunk-YPWU5KPE.js.map} +0 -0
  1126. /package/dist/{chunk-IKJLSBUI.js.map → chunk-YQXTDZSU.js.map} +0 -0
  1127. /package/dist/{chunk-TPMZBOFH.js.map → chunk-YSJEAAOL.js.map} +0 -0
  1128. /package/dist/{chunk-W3BFRR2G.js.map → chunk-YWIFM7D7.js.map} +0 -0
  1129. /package/dist/{chunk-WTJ4PLMU.js.map → chunk-YWVI6ZMK.js.map} +0 -0
  1130. /package/dist/{chunk-5KWMYPJV.js.map → chunk-Z4FMAFNH.js.map} +0 -0
  1131. /package/dist/{chunk-W5OWKVZG.js.map → chunk-Z654FWNU.js.map} +0 -0
  1132. /package/dist/{chunk-5FH5LQVS.js.map → chunk-Z7Y523PS.js.map} +0 -0
  1133. /package/dist/{chunk-HLL4PBO7.js.map → chunk-ZD67RM6G.js.map} +0 -0
  1134. /package/dist/{chunk-IVYJX3OY.js.map → chunk-ZEG4VPBL.js.map} +0 -0
  1135. /package/dist/{chunk-K6R5T44I.js.map → chunk-ZLYCOBHW.js.map} +0 -0
  1136. /package/dist/{chunk-VADHIT26.js.map → chunk-ZNJ5MTXV.js.map} +0 -0
  1137. /package/dist/{chunk-2KYQC4T5.js.map → chunk-ZSGY3H53.js.map} +0 -0
  1138. /package/dist/{chunk-BKP43KK4.js.map → chunk-ZTPXACWB.js.map} +0 -0
  1139. /package/dist/{chunk-JCY4CMDH.js.map → chunk-ZUA3JMI6.js.map} +0 -0
  1140. /package/dist/{chunk-IGVVXLKJ.js.map → chunk-ZYAZUPPV.js.map} +0 -0
  1141. /package/dist/{computer-viewer-LPZ763KF.js.map → computer-viewer-TDDO25AV.js.map} +0 -0
  1142. /package/dist/{embedded-new-voice-YVMKSLKJ.js.map → embedded-new-voice-2G3VLPVQ.js.map} +0 -0
  1143. /package/dist/{embedded-voice-BJPQFXSU.js.map → embedded-voice-T5IWOWGD.js.map} +0 -0
  1144. /package/dist/{fleet-decision-row-AA4H5CDT.js.map → fleet-decision-row-WM64KXP3.js.map} +0 -0
  1145. /package/dist/{model-policy-picker-menu-HSMWVO4P.js.map → model-policy-picker-menu-SMC6J6QN.js.map} +0 -0
  1146. /package/dist/{payment-page-card-3LTSFJGN.js.map → payment-page-card-G4U63KUV.js.map} +0 -0
  1147. /package/dist/{platform-activity-row-5VYV6TX4.js.map → platform-activity-row-BUZGZAKZ.js.map} +0 -0
  1148. /package/dist/{queue-surface-implementation-NXHZUKD2.js.map → queue-surface-implementation-4KUZ4PJV.js.map} +0 -0
  1149. /package/dist/{sandbox-files-YCMLQUFU.js.map → sandbox-files-ESDMOFSD.js.map} +0 -0
  1150. /package/dist/{session-connect-cards-KSQLMRM5.js.map → session-connect-cards-Q53KMMYY.js.map} +0 -0
  1151. /package/dist/{session-realtime-ZR6JLG3Y.js.map → session-realtime-CF3I35WJ.js.map} +0 -0
  1152. /package/dist/{timeline-annotation-markers-YAHDPWVG.js.map → timeline-annotation-markers-CJK4RYZ4.js.map} +0 -0
  1153. /package/dist/{timeline-annotation-selection-KHXNCEJP.js.map → timeline-annotation-selection-67GF5H26.js.map} +0 -0
  1154. /package/dist/{timeline-annotations-dialog-Y4XD3N7B.js.map → timeline-annotations-dialog-ONJPQDJQ.js.map} +0 -0
@@ -1,4116 +0,0 @@
1
- "use client";
2
- import {
3
- ArtifactLinkBoundary
4
- } from "./chunk-366XZ4PM.js";
5
- import {
6
- descendantsRunning,
7
- hintTouchesTree,
8
- isSubSessionResponseOutput,
9
- lineageSessionIds,
10
- subSessionResponseCallIds,
11
- waitingDescendants
12
- } from "./chunk-U6552Q3T.js";
13
- import {
14
- HumanInputDelegationRecord
15
- } from "./chunk-E6NRSRBE.js";
16
- import {
17
- ModelRecoveryNotice
18
- } from "./chunk-3QX55WLC.js";
19
- import {
20
- SessionWorkspace
21
- } from "./chunk-MYUFMVCH.js";
22
- import {
23
- TerminalSessionArchive,
24
- TerminalSessionBanner,
25
- UserMessageBody
26
- } from "./chunk-5FH5LQVS.js";
27
- import {
28
- useMessageSenderRenderer
29
- } from "./chunk-DJIJHRX4.js";
30
- import {
31
- ReadOnlySessionNotice,
32
- sessionReadOnlyArchive
33
- } from "./chunk-JW33RV4V.js";
34
- import {
35
- UnavailableModelNotice
36
- } from "./chunk-RDBSUNNS.js";
37
- import {
38
- CodexUsageNotice,
39
- ModelSwitchHeadsUp
40
- } from "./chunk-BUBNGKWG.js";
41
- import {
42
- OwnLoginsSharedHeadsUp,
43
- ownLoginsInUse
44
- } from "./chunk-TW3LKRJF.js";
45
- import {
46
- SessionMachinePickerAction,
47
- SessionRunsOnMenuBody,
48
- useSessionRunsOn
49
- } from "./chunk-HLOEPV5C.js";
50
- import {
51
- useReadSessionInbox
52
- } from "./chunk-3OVIXY4O.js";
53
- import {
54
- useSessionOpening
55
- } from "./chunk-QZKM4S2G.js";
56
- import {
57
- useCodexUsageModelSwitch
58
- } from "./chunk-Z2C2LA2F.js";
59
- import {
60
- applySessionAttentionProjection,
61
- notifySessionAttentionChanged,
62
- sessionReadProjectionKey,
63
- shouldAcknowledgeActiveSession,
64
- shouldProjectActiveSessionRead,
65
- updateLocalSessionDeliveryAttention
66
- } from "./chunk-SDHGQUS4.js";
67
- import {
68
- isPersonalMachine,
69
- moveChatToMachine
70
- } from "./chunk-LA5T52RM.js";
71
- import {
72
- useStreamHealthTelemetry
73
- } from "./chunk-PRUVBCX6.js";
74
- import {
75
- getComposerSendBlocker
76
- } from "./chunk-AFRGP2VP.js";
77
- import {
78
- clearGitHubInstallRequest,
79
- recordGitHubInstallRequest
80
- } from "./chunk-PVNI2KHS.js";
81
- import {
82
- noteTurnFailureAction
83
- } from "./chunk-3QAINO5E.js";
84
- import {
85
- chatLearningScope
86
- } from "./chunk-SCN7CKBA.js";
87
- import {
88
- isCodexUsageLimitFailure,
89
- latestTurnFailedOnUsageLimit,
90
- sessionModelMissingFromCatalog,
91
- unavailableModelName,
92
- unavailableModelReplacement
93
- } from "./chunk-LT4GTDNO.js";
94
- import {
95
- connectableSubscriptions,
96
- isDeploymentFreeModel
97
- } from "./chunk-SNWZ45EM.js";
98
- import {
99
- timelineShowsFailure
100
- } from "./chunk-VVT4VXU6.js";
101
- import {
102
- isTerminalSessionStatus,
103
- projectSessionTimeline,
104
- summarizeSessionFailure
105
- } from "./chunk-F7U3QPZ3.js";
106
- import {
107
- sessionTimelineEmptyStateCopy
108
- } from "./chunk-42KJZNTB.js";
109
- import {
110
- useBackgroundAttentionTitle
111
- } from "./chunk-ZXVFQATC.js";
112
- import {
113
- needsSandboxRecoveryCheck
114
- } from "./chunk-IIFO2H3P.js";
115
- import {
116
- createFailedSessionRetry
117
- } from "./chunk-R2NCKRTE.js";
118
- import {
119
- useFixedRigScope,
120
- usePersonalResourceAttachment
121
- } from "./chunk-FP3Z4I5D.js";
122
- import {
123
- currentModelRecovery
124
- } from "./chunk-A7ZZ2VWS.js";
125
- import {
126
- readSessionDockNavigation,
127
- sessionDockLayoutStorageId,
128
- updateSessionDockNavigation
129
- } from "./chunk-ESYN5AUB.js";
130
- import {
131
- secretSaveTargets
132
- } from "./chunk-P46SRX7L.js";
133
- import {
134
- chatComposerPlaceholder,
135
- failedSessionCopy,
136
- failureFallbackReason
137
- } from "./chunk-EGBII4CP.js";
138
- import {
139
- ChatViewportFileDropTarget
140
- } from "./chunk-CMH22OQY.js";
141
- import {
142
- useConnectionAccounts
143
- } from "./chunk-7BYWOFVH.js";
144
- import {
145
- SessionSecretsMenuBody,
146
- sessionSecretsSummary
147
- } from "./chunk-YSVD5HI4.js";
148
- import {
149
- useWorkspaceMachines
150
- } from "./chunk-TZAO65I4.js";
151
- import {
152
- useFollowUpRepositories
153
- } from "./chunk-M4SDVTKJ.js";
154
- import {
155
- OPEN_SESSION_USAGE_LIMIT_EVENT,
156
- goalPausedAtUsageLimit,
157
- lineageHasRunningSession,
158
- sessionUsageLimitCapability,
159
- usageLimitRefusalFromState,
160
- useSessionUsageLimit
161
- } from "./chunk-RBRX5ZS3.js";
162
- import {
163
- EMPTY_COMPOSER_LAUNCH,
164
- composerLaunchSearchAfterPolicyApply,
165
- composerLaunchSearchKey
166
- } from "./chunk-L34IVLQC.js";
167
- import {
168
- personalMachineUseIntent
169
- } from "./chunk-ESSGVLV2.js";
170
- import {
171
- coveredModelChoice,
172
- creditRefusalGap,
173
- freeCreditGap
174
- } from "./chunk-XVU32APP.js";
175
- import {
176
- useArtifactCatalogMutationInvalidation
177
- } from "./chunk-JUJ6QCI2.js";
178
- import {
179
- expireArtifactCatalog
180
- } from "./chunk-7NLCCKNJ.js";
181
- import {
182
- isEditableArtifactKind
183
- } from "./chunk-DAD2474Q.js";
184
- import {
185
- useWorkspaceModelCatalog
186
- } from "./chunk-LQDUHU3Y.js";
187
- import {
188
- githubAppConnectRequest
189
- } from "./chunk-6D473WWV.js";
190
- import {
191
- ChatPaymentPages
192
- } from "./chunk-Y5ZNKYN3.js";
193
- import {
194
- MarkdownText
195
- } from "./chunk-Q52CXW6C.js";
196
- import {
197
- useWorkspaceAppLinkResolver
198
- } from "./chunk-VS5RLPQY.js";
199
- import {
200
- ConsoleComposer
201
- } from "./chunk-TA5CFTO4.js";
202
- import {
203
- useSessionRouteMemory
204
- } from "./chunk-2DVTNHTC.js";
205
- import {
206
- CONSOLE_TIMELINE_ALLOWANCE_LABELS
207
- } from "./chunk-OF22GYK5.js";
208
- import {
209
- isApiErrorStatus,
210
- useAppApi
211
- } from "./chunk-XIQPI2NM.js";
212
- import {
213
- FORK_CURRENT_CHAT_EVENT,
214
- useRail
215
- } from "./chunk-D6L4GHRH.js";
216
- import {
217
- OPEN_CONVERSATION_FIND_EVENT
218
- } from "./chunk-7ZEGSUR7.js";
219
- import {
220
- FOCUS_SESSION_COMPOSER_EVENT,
221
- consumeSessionComposerFocusIntent,
222
- focusSessionComposerWhenReady,
223
- sessionComposerFocusIntentIsEligible
224
- } from "./chunk-MMY23KS7.js";
225
- import {
226
- useSessionUiFeature
227
- } from "./chunk-FWXMQTVG.js";
228
- import {
229
- FollowUpRepositoryMenuBody
230
- } from "./chunk-BF4SADKX.js";
231
- import {
232
- useBrowserAccountBridgeBlocker
233
- } from "./chunk-7LP3W5H5.js";
234
- import {
235
- ModelPicker
236
- } from "./chunk-TPMZBOFH.js";
237
- import {
238
- LoadingPanel,
239
- ProblemPanel
240
- } from "./chunk-UYE47LO6.js";
241
- import {
242
- WorkspaceComposerPlus
243
- } from "./chunk-NXWBBZJV.js";
244
- import {
245
- startMcpOAuthWithTimeout
246
- } from "./chunk-HUKUDAIP.js";
247
- import {
248
- connectorSelectionUpdate,
249
- followWorkspaceConnectorPolicy,
250
- sessionConnectorPolicyIsCustomized
251
- } from "./chunk-MA6O7CM6.js";
252
- import {
253
- catalogConnectionAccountSelection,
254
- oauthConnectionOwnership,
255
- oauthConnectionRef
256
- } from "./chunk-XOSQP3YA.js";
257
- import {
258
- PersonalResourceAttachmentSurface
259
- } from "./chunk-QE3ZFGI3.js";
260
- import {
261
- FailureRecoveryBoundary
262
- } from "./chunk-BZO5ZMUP.js";
263
- import {
264
- observeSessionTurnEvents
265
- } from "./chunk-55S3W7RZ.js";
266
- import {
267
- SessionUsageLimitNotice
268
- } from "./chunk-NWGNFN3N.js";
269
- import {
270
- creationHandoffReconciled
271
- } from "./chunk-UKZ3SGNF.js";
272
- import {
273
- markIntegrationConnectRedirect
274
- } from "./chunk-OXD6ET34.js";
275
- import {
276
- mergeSessionContextProjection,
277
- mergeSessionDetailReadProjection
278
- } from "./chunk-JHZRAYI4.js";
279
- import {
280
- creditRefusalRecord
281
- } from "./chunk-INXGSG3J.js";
282
- import {
283
- t
284
- } from "./chunk-GE33BGB7.js";
285
- import {
286
- clientFirstPartyMcpToolPolicy,
287
- firstPartySessionToolOptionsFor,
288
- sessionPolicyPickerIds
289
- } from "./chunk-ZPW5NFYD.js";
290
- import {
291
- canConnectWorkspaceMcpFromChat,
292
- hasAccountPermission,
293
- hasWorkspacePermission
294
- } from "./chunk-H2ALCTWC.js";
295
- import {
296
- isPersonalWorkspace
297
- } from "./chunk-LBSXJVHD.js";
298
- import {
299
- useNavigate,
300
- usePage,
301
- useRouterState
302
- } from "./chunk-U5EFEMYU.js";
303
- import {
304
- useHostMessageContext,
305
- useReportSessionState
306
- } from "./chunk-ENFLCAR3.js";
307
- import {
308
- toast
309
- } from "./chunk-YG6NARQY.js";
310
- import {
311
- createSessionEventFeedStore,
312
- useAppContext
313
- } from "./chunk-JDFDPMKX.js";
314
- import {
315
- connectorLogo,
316
- connectorLogoIndex
317
- } from "./chunk-I5UOUBST.js";
318
- import {
319
- sessionAgentsSignal
320
- } from "./chunk-GXO7ECQZ.js";
321
- import {
322
- useUiEventTarget
323
- } from "./chunk-WGPLDFEC.js";
324
- import {
325
- cn
326
- } from "./chunk-A3MTTRCX.js";
327
- import {
328
- EmptyState
329
- } from "./chunk-QE4XESS7.js";
330
- import {
331
- apiErrorFacts,
332
- userErrorText
333
- } from "./chunk-L4OF77LE.js";
334
- import {
335
- isCodexProductModel,
336
- sessionDisplayTitle,
337
- sessionHasPendingWake,
338
- sessionInputWait,
339
- withLineageAutomationFacts
340
- } from "./chunk-6AHATAAY.js";
341
- import {
342
- SessionAdmissionNotice,
343
- SessionMachineAccessNotice
344
- } from "./chunk-JJZPLGIP.js";
345
- import {
346
- loadSessionFeedback,
347
- turnRatingsFromFeedback
348
- } from "./chunk-TMNMI67B.js";
349
- import {
350
- sessionAuthRecommendation
351
- } from "./chunk-2GDNWKSC.js";
352
- import {
353
- useSessionSecrets
354
- } from "./chunk-ZR6WALSK.js";
355
- import {
356
- useSessionLineage
357
- } from "./chunk-BU3TJN46.js";
358
- import {
359
- stopOwnLoginsHere,
360
- turnOnOwnLoginsHere
361
- } from "./chunk-IGDADFW4.js";
362
- import {
363
- attachSessionCapability,
364
- completeSessionCapabilityOAuth,
365
- continueAfterCapabilitySetup
366
- } from "./chunk-52Y2X66Q.js";
367
- import {
368
- ApprovalSurface,
369
- MessageTimeline,
370
- SessionChrome,
371
- useLiveSessionEvents
372
- } from "./chunk-TG7DADJR.js";
373
- import {
374
- KnowledgeActivityProvider,
375
- LearningRefusalActionsProvider,
376
- ToolActionReviewDetails,
377
- ToolReviewHistoryProvider,
378
- createSessionRetainedScreenshotLoader,
379
- createWorkspaceRetainedArtifactLoader,
380
- createWorkspaceRetainedVideoLoader
381
- } from "./chunk-LRJIYTZW.js";
382
- import {
383
- inertProps
384
- } from "./chunk-USG4XNMA.js";
385
- import {
386
- conversationTimeline,
387
- useGoal,
388
- useHumanInputRequests,
389
- useSession,
390
- useSessionEvents,
391
- useSessionStartupTimeline,
392
- useTurnQueue
393
- } from "./chunk-SWIHWCTW.js";
394
- import {
395
- SessionStartupProvider
396
- } from "./chunk-EMIVOS73.js";
397
- import {
398
- admissionControlNeedsRefresh,
399
- admissionRecheckControl,
400
- currentSessionMachineAccess,
401
- recheckSessionAdmission,
402
- sessionAdmissionNeedsDifferentMachine,
403
- sessionAdmissionReason
404
- } from "./chunk-JWKGPA6Q.js";
405
- import {
406
- approvalsDecidable,
407
- projectPendingApprovals
408
- } from "./chunk-VXORMNU4.js";
409
- import {
410
- creditExhaustedFromEvents,
411
- creditRefusalFromEvents
412
- } from "./chunk-4YCA2Y73.js";
413
- import {
414
- useFileAttachments
415
- } from "./chunk-I6FIXEL4.js";
416
- import {
417
- sessionAttentionReadThroughSequence
418
- } from "./chunk-C5ZCSVZ7.js";
419
- import {
420
- promptSendDestination,
421
- sessionAdmissionBlocked,
422
- sessionDisplayStatus,
423
- sessionTurnKeepsRunControl
424
- } from "./chunk-TSENLSW6.js";
425
- import {
426
- LazyPart,
427
- retainedImageId
428
- } from "./chunk-VIEFJ2DM.js";
429
- import {
430
- OpenGeniLinkProvider
431
- } from "./chunk-NPNX7LTL.js";
432
- import {
433
- sessionComputeLabel
434
- } from "./chunk-ZY2Z2IU3.js";
435
- import {
436
- MACHINES_SESSION_POLL_MS
437
- } from "./chunk-XDBYWVCW.js";
438
- import {
439
- useCalmServiceFailure,
440
- useComposerWithStreamState
441
- } from "./chunk-SVKPSCTH.js";
442
- import {
443
- useComposer,
444
- useQueuedPromptRecall
445
- } from "./chunk-AXBSYWKX.js";
446
- import {
447
- LightboxProvider
448
- } from "./chunk-UI4HI5QK.js";
449
- import {
450
- Button
451
- } from "./chunk-7QQN3KNP.js";
452
- import {
453
- usePortalContainer
454
- } from "./chunk-UD6AAZSC.js";
455
- import {
456
- useDebouncedCallback,
457
- useSessionEventTrigger
458
- } from "./chunk-RV3O5OCQ.js";
459
- import {
460
- isModelUnavailableSubmissionError,
461
- isSessionUsageLimitSubmissionError
462
- } from "./chunk-5MOJZORA.js";
463
- import {
464
- InteractiveAnswerProvider,
465
- browserInteractiveAnswerStore
466
- } from "./chunk-OONTDHBV.js";
467
- import {
468
- useOpenGeni
469
- } from "./chunk-TVQCDDSZ.js";
470
- import {
471
- effortOptionsForModel,
472
- findPickerRow,
473
- runnableLatencyModesForModel
474
- } from "./chunk-ZHC47M2B.js";
475
-
476
- // src/app/routes/session.tsx
477
- import { Fragment } from "react";
478
-
479
- // src/app/routes/session-capability-oauth-return.ts
480
- async function finishMcpCapabilityOAuthReturn(input) {
481
- const { client, workspaceId, sessionId, params } = input;
482
- const item = input.catalog.find((candidate) => candidate.id === input.capabilityId);
483
- const connectionId = params.get("connectionId");
484
- const providerDomain = params.get("providerDomain");
485
- const ownership = oauthConnectionOwnership(params.get("ownership"));
486
- if (!item || item.kind !== "mcp" || !connectionId || !providerDomain || !ownership) {
487
- throw new Error("The authorized capability could not be resolved from the live catalog.");
488
- }
489
- await client.enableCapability(workspaceId, item.id, {
490
- connectionRef: oauthConnectionRef(
491
- ownership,
492
- connectionId,
493
- providerDomain,
494
- catalogConnectionAccountSelection(item)
495
- )
496
- });
497
- await input.refreshCatalog(workspaceId);
498
- const connected = (await client.listCapabilities(workspaceId)).items.find(
499
- (candidate) => candidate.id === item.id
500
- );
501
- if (!connected?.enabled)
502
- throw new Error("The connection was authorized, but enabling its tools could not be verified.");
503
- if (connected.connectionRef?.subjectScope === "subject")
504
- return { name: item.name, needsPersonalReview: true };
505
- await attachSessionCapability(t, client, workspaceId, sessionId, connected);
506
- continueAfterCapabilitySetup(client, workspaceId, sessionId, connected.id);
507
- return { name: item.name, needsPersonalReview: false };
508
- }
509
-
510
- // src/app/lib/session-composer-readiness.ts
511
- import { useCallback, useLayoutEffect, useMemo, useState } from "react";
512
- function useSessionSendGate() {
513
- const [committedPolicyValid, commitPolicyValid] = useState(false);
514
- const blocker = useCallback(
515
- (state) => getComposerSendBlocker({
516
- uploadPending: state.uploadPending,
517
- repositoryError: state.repositoryError,
518
- policyValid: committedPolicyValid,
519
- personalDecision: state.personalDecision,
520
- machineAccessDenied: state.machineAccessDenied,
521
- personalLoading: state.loading || state.loadFailed
522
- }),
523
- [committedPolicyValid]
524
- );
525
- return { committedPolicyValid, commitPolicyValid, blocker };
526
- }
527
- function useSessionComposerDelivery(composer, gate, {
528
- policyValid,
529
- catalogLoading,
530
- replacingModel,
531
- send
532
- }) {
533
- const { commitPolicyValid, committedPolicyValid } = gate;
534
- useLayoutEffect(() => {
535
- commitPolicyValid(policyValid);
536
- }, [commitPolicyValid, policyValid]);
537
- const preparing = composer.preparing === true || policyValid !== committedPolicyValid || catalogLoading && !policyValid || replacingModel || send.loading;
538
- return useMemo(
539
- () => composer.preparing === true === preparing ? composer : { ...composer, preparing },
540
- [composer, preparing]
541
- );
542
- }
543
-
544
- // src/app/lib/use-descendant-requests-refresh.ts
545
- import { useCallback as useCallback2, useEffect, useMemo as useMemo2, useRef, useState as useState2 } from "react";
546
- var LINEAGE_POLL_MS = 3e4;
547
- var LINEAGE_POLL_ACTIVE_WITHOUT_HINTS_MS = 15e3;
548
- function treeNeedsWatching(nodes) {
549
- return descendantsRunning(nodes) || waitingDescendants(nodes).length > 0;
550
- }
551
- function useLineagePollInterval(workspaceId) {
552
- const { workspaceSessionListEvent } = useOpenGeni();
553
- const [active, setActive] = useState2(false);
554
- const observeTree = useCallback2(
555
- (nodes) => setActive(treeNeedsWatching(nodes)),
556
- []
557
- );
558
- const live = workspaceSessionListEvent?.workspaceId === workspaceId && workspaceSessionListEvent.available === true;
559
- return {
560
- pollIntervalMs: !live && active ? LINEAGE_POLL_ACTIVE_WITHOUT_HINTS_MS : LINEAGE_POLL_MS,
561
- observeTree
562
- };
563
- }
564
- function useDescendantRequestsRefresh(options) {
565
- const { client, workspaceId, sessionId, events, nodes, refreshLineage } = options;
566
- const { workspaceSessionListEvent } = useOpenGeni();
567
- const [signal, setSignal] = useState2(0);
568
- const refreshLineageRef = useRef(refreshLineage);
569
- useEffect(() => {
570
- refreshLineageRef.current = refreshLineage;
571
- }, [refreshLineage]);
572
- const refreshTreeSoon = useDebouncedCallback(() => {
573
- void refreshLineageRef.current();
574
- }, 150);
575
- const refreshAllSoon = useDebouncedCallback(() => {
576
- void refreshLineageRef.current();
577
- setSignal((value) => value + 1);
578
- }, 150);
579
- const tree = useMemo2(
580
- () => ({ ids: lineageSessionIds(nodes), running: descendantsRunning(nodes) }),
581
- [nodes]
582
- );
583
- const treeRef = useRef(tree);
584
- useEffect(() => {
585
- treeRef.current = tree;
586
- }, [tree]);
587
- useEffect(() => {
588
- const hint = workspaceSessionListEvent;
589
- if (!hint || hint.workspaceId !== workspaceId || !hint.available) return;
590
- if (document.visibilityState === "hidden") return;
591
- const current = treeRef.current;
592
- const unseen = current.running && (hint.sessionIds ?? []).some((id) => id !== sessionId && !current.ids.has(id));
593
- if (hintTouchesTree(hint, current.ids) || unseen) refreshTreeSoon();
594
- }, [refreshTreeSoon, sessionId, workspaceId, workspaceSessionListEvent]);
595
- const responseCallIds = useMemo2(() => subSessionResponseCallIds(events), [events]);
596
- const matchResponse = useCallback2(
597
- (event) => isSubSessionResponseOutput(event, responseCallIds),
598
- [responseCallIds]
599
- );
600
- const [history, setHistory] = useState2(null);
601
- const newest = events.at(-1);
602
- if (newest && newest.sessionId === sessionId && history?.sessionId !== sessionId) {
603
- setHistory({ sessionId, through: newest.sequence });
604
- }
605
- const readThrough = history?.sessionId === sessionId ? history.through : "reading";
606
- const onResponse = useCallback2(() => refreshAllSoon(), [refreshAllSoon]);
607
- useSessionEventTrigger(client, workspaceId, sessionId, matchResponse, onResponse, {
608
- events,
609
- readThrough
610
- });
611
- return signal;
612
- }
613
-
614
- // src/app/routes/session.tsx
615
- import { OpenGeniSessionUsageLimitReachedError } from "@opengeni/sdk/browser";
616
- import { SESSION_USAGE_LIMIT_GOAL_PAUSED_REASON } from "@opengeni/sdk/session-usage-limits";
617
- import {
618
- BotIcon,
619
- BugIcon,
620
- Loader2Icon,
621
- MenuIcon,
622
- MessagesSquareIcon,
623
- PanelsTopLeftIcon
624
- } from "lucide-react";
625
- import {
626
- createElement,
627
- lazy,
628
- Suspense,
629
- useCallback as useCallback3,
630
- useEffect as useEffect4,
631
- useLayoutEffect as useLayoutEffect2,
632
- useMemo as useMemo3,
633
- useRef as useRef2,
634
- useState as useState3
635
- } from "react";
636
-
637
- // src/app/lib/session-failure-toasts.ts
638
- import { useEffect as useEffect2 } from "react";
639
- function useSessionFailureToasts(loadError, streamError) {
640
- const streamCalm = useCalmServiceFailure(streamError);
641
- const loadCalm = useCalmServiceFailure(loadError);
642
- useEffect2(() => {
643
- if (streamError && !streamCalm && !isApiErrorStatus(streamError, 404)) {
644
- toast.error("Event stream disconnected", {
645
- description: streamError.message
646
- });
647
- }
648
- }, [streamCalm, streamError]);
649
- useEffect2(() => {
650
- if (loadError && !loadCalm && !isApiErrorStatus(loadError, 404)) {
651
- toast.error("Failed to load session", { description: String(loadError) });
652
- }
653
- }, [loadCalm, loadError]);
654
- }
655
-
656
- // src/app/lib/session-route-placement.ts
657
- function ignoreRoutedUpdate() {
658
- }
659
- function sessionRouteAppState(placement, context, panelEventFeed) {
660
- if (placement === "page") {
661
- return {
662
- routed: true,
663
- setSession: context.setSession,
664
- setConnectionState: context.setConnectionState,
665
- sessionEventFeedStore: context.sessionEventFeedStore
666
- };
667
- }
668
- return {
669
- routed: false,
670
- setSession: ignoreRoutedUpdate,
671
- setConnectionState: ignoreRoutedUpdate,
672
- sessionEventFeedStore: panelEventFeed
673
- };
674
- }
675
- function sessionRouteCreationHandoff(input) {
676
- const { sessionId, given, app, appSession, routed } = input;
677
- if (given?.session.id === sessionId) return given;
678
- if (routed && app?.session.id === sessionId && appSession?.id === sessionId) return app;
679
- return null;
680
- }
681
-
682
- // src/app/lib/find-shortcut.ts
683
- import { useEffect as useEffect3 } from "react";
684
- function useFindShortcut(input, open) {
685
- const { scope } = input;
686
- useEffect3(() => {
687
- if (!scope) return;
688
- const onKeyDown = (event) => {
689
- if (!(event.ctrlKey || event.metaKey) || event.altKey || event.shiftKey || event.key.toLowerCase() !== "f")
690
- return;
691
- const target = event.target;
692
- if (target instanceof Element && target.closest('[role="dialog"], .cm-editor, .xterm, [data-native-find]'))
693
- return;
694
- event.preventDefault();
695
- open();
696
- };
697
- scope.addEventListener("keydown", onKeyDown);
698
- return () => scope.removeEventListener("keydown", onKeyDown);
699
- }, [open, scope]);
700
- }
701
-
702
- // src/app/lib/codex-model-switch.ts
703
- var CONTEXT_CHECKPOINT_EVENT_TYPES = [
704
- "session.context.compacted",
705
- "session.context.cleared"
706
- ];
707
- function latestCheckpointIsCompaction(events) {
708
- let latest = null;
709
- for (const event of events) {
710
- if (event.type !== "session.context.compacted" && event.type !== "session.context.cleared")
711
- continue;
712
- if (!latest || event.sequence > latest.sequence) latest = event;
713
- }
714
- return latest ? latest.type === "session.context.compacted" : null;
715
- }
716
- function needsModelSwitchHeadsUp(input) {
717
- return input.codexCompactionMode === "remote_v2" && input.codexCompacted && typeof input.model === "string" && input.model.length > 0 && !isCodexProductModel(input.model);
718
- }
719
- function modelSwitchHeadsUpText(modelLabel) {
720
- return `Earlier messages will be re-summarized for ${modelLabel}, so it may remember less detail.`;
721
- }
722
- function codexUsageResetsAt(events) {
723
- let latest = null;
724
- for (const event of events) {
725
- const usageEvent = event.type === "codex.capacity.waiting" || event.type === "turn.capacity_waiting" || event.type === "turn.failed" && payloadField(event, "code") === "codex_usage_limit_reached";
726
- if (usageEvent && (!latest || event.sequence > latest.sequence)) latest = event;
727
- }
728
- const resetsAt = latest ? payloadField(latest, "resetsAt") ?? payloadField(latest, "earliestResetAt") : null;
729
- return typeof resetsAt === "string" && !Number.isNaN(Date.parse(resetsAt)) ? resetsAt : null;
730
- }
731
- var USAGE_WAIT_REASONS = /* @__PURE__ */ new Set([
732
- "no_eligible_capacity",
733
- "compaction_provider_locked",
734
- // The chat's pinned account is out of usage until its reset.
735
- "pinned_account_unavailable"
736
- ]);
737
- function codexWaitIsUsageLimit(events) {
738
- let latest = null;
739
- for (const event of events) {
740
- const wait = event.type === "codex.capacity.waiting" || event.type === "turn.capacity_waiting";
741
- if (wait && (!latest || event.sequence > latest.sequence)) latest = event;
742
- }
743
- if (!latest || payloadField(latest, "actionRequired") === true) return false;
744
- const reason = payloadField(latest, "waitReason");
745
- return reason === void 0 || reason === null || USAGE_WAIT_REASONS.has(String(reason));
746
- }
747
- function payloadField(event, key) {
748
- const payload = event.payload;
749
- return payload && typeof payload === "object" ? payload[key] : void 0;
750
- }
751
- function codexUsageContinuesAtReset(input) {
752
- return input.status === "waiting_capacity" && !input.paused;
753
- }
754
- function codexUsageNoticeApplies(input) {
755
- return input.status !== "waiting_capacity" || input.usageWait && input.resetsAt !== null;
756
- }
757
- function codexUsageContinueAtResetAction(input) {
758
- if (input.next === codexUsageContinuesAtReset(input)) return null;
759
- if (input.status === "waiting_capacity") return input.next ? "resume" : "pause";
760
- if (!input.next) return null;
761
- return input.paused ? "resume_and_run_on_codex" : "run_on_codex";
762
- }
763
- function codexUsageResetText(resetsAt, options = {}) {
764
- const reset = resetsAt === null ? Number.NaN : Date.parse(resetsAt);
765
- if (Number.isNaN(reset)) return "Reset time unknown.";
766
- const now = options.now ?? /* @__PURE__ */ new Date();
767
- if (reset <= now.getTime()) return "Resets soon.";
768
- const zone = options.timeZone ? { timeZone: options.timeZone } : {};
769
- const day = (date2) => new Intl.DateTimeFormat("en-CA", { dateStyle: "short", ...zone }).format(date2);
770
- const at = new Date(reset);
771
- const time = new Intl.DateTimeFormat(options.locale, { timeStyle: "short", ...zone }).format(at);
772
- if (day(at) === day(now)) return `Resets at ${time}.`;
773
- const withinWeek = reset - now.getTime() < 6 * 24 * 60 * 60 * 1e3;
774
- const date = new Intl.DateTimeFormat(
775
- options.locale,
776
- withinWeek ? { weekday: "short", ...zone } : { month: "short", day: "numeric", ...zone }
777
- ).format(at);
778
- return `Resets ${date} ${time}.`;
779
- }
780
-
781
- // src/app/routes/session.tsx
782
- import { resolveWorkspaceBusySend, stableJson } from "@opengeni/contracts";
783
- import { connectProviderAcceptsRequestedScopes } from "@opengeni/contracts/connect";
784
- import { Fragment as Fragment2, jsx, jsxs } from "react/jsx-runtime";
785
- var InlineChatArtifact = lazy(
786
- () => import("./app/components/artifacts/retained-file-preview.js").then((module) => ({
787
- default: module.InlineChatArtifact
788
- }))
789
- );
790
- var ChatInteractiveBlock = lazy(
791
- () => import("./app/components/artifacts/chat-interactive-block.js").then((module) => ({
792
- default: module.ChatInteractiveBlock
793
- }))
794
- );
795
- var HumanInputSurface = lazy(() => import("./app/components/session/human-input.js"));
796
- var DescendantRequests = lazy(() => import("./app/components/session/descendant-requests.js"));
797
- var SessionSkillReviews = lazy(
798
- () => import("./app/components/session/session-skill-reviews.js").then((module) => ({
799
- default: module.SessionSkillReviews
800
- }))
801
- );
802
- var SessionCommands = lazy(
803
- () => import("./session-ui.js").then((module) => ({ default: module.SessionCommands }))
804
- );
805
- var SessionCapabilityCard = lazy(async () => ({
806
- default: (await import("./app/components/capabilities/session-capability-card.js")).SessionCapabilityCard
807
- }));
808
- var NativeConnectSetup = lazy(
809
- () => import("./app/components/capabilities/native-connect-setup.js").then((module) => ({
810
- default: module.NativeConnectSetup
811
- }))
812
- );
813
- var MessageForkDialog = lazy(
814
- () => import("./app/components/session/session-tenancy-control.js").then((module) => ({
815
- default: module.SessionTenancyRouteControl
816
- }))
817
- );
818
- var MessageActions = lazy(() => import("./app/components/session/message-actions.js"));
819
- var ConversationFind = lazy(() => import("./app/components/session/conversation-find.js"));
820
- var EMPTY_SEARCH_TARGET = {};
821
- var SubagentTree = lazy(
822
- () => import("./app/components/session/subagents.js").then((module) => ({ default: module.SubagentTree }))
823
- );
824
- var LazyFailedSessionBanner = lazy(
825
- () => import("./app/components/session/failed-session-banner.js").then((module) => ({
826
- default: module.FailedSessionBanner
827
- }))
828
- );
829
- var LazyCreditRefusalNotice = lazy(
830
- () => import("./app/components/credits/credit-refusal-notice.js").then((module) => ({
831
- default: module.CreditRefusalNotice
832
- }))
833
- );
834
- var LazyCreditTopupPrompt = lazy(
835
- () => import("./app/components/credit-required-prompt.js").then((module) => ({
836
- default: module.CreditRequiredPrompt
837
- }))
838
- );
839
- var LazyAgentConfigurationPanel = lazy(
840
- () => import("./app/components/session/agent-configuration-panel.js").then(({ AgentConfigurationPanel }) => ({
841
- default: AgentConfigurationPanel
842
- }))
843
- );
844
- var LazySessionInspector = lazy(
845
- () => import("./app/components/session/inspector.js").then(({ SessionInspector }) => ({
846
- default: SessionInspector
847
- }))
848
- );
849
- var LazySessionEditableArtifactsWorkspace = lazy(
850
- () => import("./app/components/session/editable-artifacts-workspace.js").then(
851
- ({ SessionEditableArtifactsWorkspace }) => ({
852
- default: SessionEditableArtifactsWorkspace
853
- })
854
- )
855
- );
856
- var LazyCodexRealtimeControl = lazy(
857
- () => import("./realtime.js").then(({ SessionRealtimeControl }) => ({
858
- default: SessionRealtimeControl
859
- }))
860
- );
861
- var LazySessionRouteAuxiliary = lazy(
862
- () => import("./app/components/session/session-tenancy-control.js")
863
- );
864
- function SessionRoute({
865
- workspaceId,
866
- sessionId,
867
- launch = EMPTY_COMPOSER_LAUNCH,
868
- realtimeAutostartModel,
869
- searchTarget = EMPTY_SEARCH_TARGET,
870
- placement = "page",
871
- onEvent,
872
- messageContext,
873
- creationHandoff: givenCreationHandoff,
874
- initialDraft,
875
- onNewSession,
876
- onRealtimeAutostartConsumed
877
- }) {
878
- const uiEvents = useUiEventTarget("document");
879
- const dockEnabled = useSessionUiFeature("dock");
880
- useReadSessionInbox(sessionId);
881
- const context = useAppContext();
882
- const routed = placement === "page";
883
- const rail = useRail();
884
- const navigate = useNavigate();
885
- const page = usePage();
886
- const consumeRealtimeAutostart = useCallback3(() => {
887
- if (onRealtimeAutostartConsumed) {
888
- onRealtimeAutostartConsumed();
889
- return;
890
- }
891
- void navigate({
892
- to: "/workspaces/$workspaceId/sessions/$sessionId",
893
- params: { workspaceId, sessionId },
894
- search: {},
895
- replace: true
896
- });
897
- }, [navigate, onRealtimeAutostartConsumed, sessionId, workspaceId]);
898
- const hasSearchOrigin = searchTarget.searchOrigin === "session-search";
899
- const consumeSearchOrigin = useCallback3(() => {
900
- if (!hasSearchOrigin) return;
901
- void navigate({
902
- to: "/workspaces/$workspaceId/sessions/$sessionId",
903
- params: { workspaceId, sessionId },
904
- search: ({ searchOrigin: _searchOrigin, ...rest }) => rest,
905
- replace: true
906
- });
907
- }, [hasSearchOrigin, navigate, sessionId, workspaceId]);
908
- const {
909
- events,
910
- timeline: eventTimeline,
911
- sessionStatus,
912
- sessionStatusSequence,
913
- connectionState,
914
- initialLoading,
915
- initialHistoryReady,
916
- hasOlder,
917
- loadingOlder,
918
- loadOlder,
919
- hasNewer,
920
- loadingNewer,
921
- loadNewer,
922
- loadingOldest,
923
- loadOldest,
924
- jumpToLatest,
925
- jumpToSequence,
926
- error: streamError
927
- } = useSessionEvents(sessionId);
928
- useEffect4(() => observeSessionTurnEvents(sessionId, events), [events, sessionId]);
929
- useLiveSessionEvents(sessionId, events, initialHistoryReady, onEvent);
930
- useReportSessionState({ sessionId, status: sessionStatus, events, initialLoading }, routed);
931
- const sessionDetailReadOwner = useRef2({});
932
- const beginSessionDetailRead = useCallback3(
933
- () => context.sessionChannelProjectionAuthority.beginDetailRead(sessionDetailReadOwner.current, {
934
- id: sessionId,
935
- workspaceId
936
- }),
937
- [context.sessionChannelProjectionAuthority, sessionId, workspaceId]
938
- );
939
- const {
940
- session: fetchedSession,
941
- error: loadError,
942
- readRevision: sessionReadRevision,
943
- readGeneration: sessionReadGeneration,
944
- refresh: refreshSession
945
- } = useSession(sessionId, {
946
- events,
947
- beginRead: beginSessionDetailRead
948
- });
949
- const restoredSessionId = useRouterState({
950
- select: (state) => state.location.state.restoredSessionId
951
- });
952
- const leaveRestoredSession = useCallback3(() => {
953
- void navigate({
954
- to: "/workspaces/$workspaceId/sessions",
955
- params: { workspaceId },
956
- replace: true
957
- });
958
- }, [navigate, workspaceId]);
959
- const leavingRestoredSession = useSessionRouteMemory({
960
- subjectId: context.accessContext.subjectId,
961
- workspaceId,
962
- sessionId,
963
- openedSessionId: fetchedSession?.id ?? null,
964
- loadError,
965
- restoredSessionId,
966
- leave: leaveRestoredSession,
967
- enabled: routed
968
- });
969
- useEffect4(
970
- () => () => context.sessionChannelProjectionAuthority.finishDetailReads(sessionDetailReadOwner.current),
971
- [context.sessionChannelProjectionAuthority, sessionId, workspaceId]
972
- );
973
- useEffect4(() => {
974
- if (loadError) {
975
- context.sessionChannelProjectionAuthority.finishDetailReads(sessionDetailReadOwner.current);
976
- }
977
- }, [context.sessionChannelProjectionAuthority, loadError]);
978
- const creationHandoff = sessionRouteCreationHandoff({
979
- sessionId,
980
- given: givenCreationHandoff,
981
- app: context.sessionCreationHandoff,
982
- appSession: context.session,
983
- routed
984
- });
985
- const pendingCreationHandoff = creationHandoffReconciled(creationHandoff, events) ? null : creationHandoff;
986
- const queue = useTurnQueue(sessionId, { events });
987
- const goal = useGoal(sessionId, { events });
988
- const humanInput = useHumanInputRequests(sessionId, { events });
989
- const sessionSeed = fetchedSession ?? creationHandoff?.session ?? null;
990
- const session = useMemo3(
991
- () => sessionSeed ? {
992
- ...sessionSeed,
993
- // Old idle events must not overwrite a fresh queued/claimed detail read.
994
- status: (sessionStatusSequence ?? 0) > sessionSeed.lastSequence ? sessionStatus ?? sessionSeed.status : sessionSeed.status,
995
- effectiveControl: queue.effectiveControl ?? sessionSeed.effectiveControl
996
- } : null,
997
- [queue.effectiveControl, sessionSeed, sessionStatus, sessionStatusSequence]
998
- );
999
- useBackgroundAttentionTitle(sessionId, session?.status ?? null);
1000
- const waitingForDispatch = session?.status === "queued" && session.activeTurnId === null && session.effectiveControl.state === "active";
1001
- useEffect4(() => {
1002
- if (!waitingForDispatch) return;
1003
- let stopped = false;
1004
- let timer;
1005
- const refresh = async () => {
1006
- try {
1007
- if (document.visibilityState === "visible") await refreshSession();
1008
- } finally {
1009
- if (!stopped) timer = setTimeout(() => void refresh(), 15e3);
1010
- }
1011
- };
1012
- timer = setTimeout(() => void refresh(), 15e3);
1013
- return () => {
1014
- stopped = true;
1015
- clearTimeout(timer);
1016
- };
1017
- }, [waitingForDispatch, sessionId, refreshSession]);
1018
- const [viewClearedAfter, setViewClearedAfter] = useState3(null);
1019
- useEffect4(() => {
1020
- setViewClearedAfter(null);
1021
- }, [sessionId]);
1022
- const clearView = useCallback3(() => {
1023
- const latestSequence = events.reduce((max, event) => Math.max(max, event.sequence), 0);
1024
- setViewClearedAfter(latestSequence);
1025
- }, [events]);
1026
- const visibleEvents = useMemo3(
1027
- () => viewClearedAfter !== null ? events.filter((event) => event.sequence > viewClearedAfter) : events,
1028
- [events, viewClearedAfter]
1029
- );
1030
- const { opened, hasObservedHistory } = useSessionOpening(
1031
- `${workspaceId}:${sessionId}`,
1032
- Boolean(session && (initialHistoryReady || pendingCreationHandoff)),
1033
- events.length > 0
1034
- );
1035
- const timeline = useMemo3(() => {
1036
- if (!session) {
1037
- return [];
1038
- }
1039
- if ((!opened || initialLoading || hasObservedHistory) && visibleEvents.length === 0 && !pendingCreationHandoff) {
1040
- return [];
1041
- }
1042
- const projected = projectSessionTimeline(
1043
- session,
1044
- visibleEvents,
1045
- pendingCreationHandoff?.clientEventId,
1046
- viewClearedAfter === null ? eventTimeline : void 0
1047
- );
1048
- return viewClearedAfter !== null && visibleEvents.length === 0 ? [] : projected;
1049
- }, [
1050
- pendingCreationHandoff,
1051
- session,
1052
- visibleEvents,
1053
- viewClearedAfter,
1054
- opened,
1055
- initialLoading,
1056
- hasObservedHistory,
1057
- eventTimeline
1058
- ]);
1059
- const approvals = useMemo3(() => projectPendingApprovals(events), [events]);
1060
- const creditExhausted = useMemo3(() => creditExhaustedFromEvents(events), [events]);
1061
- const creditRefusal = useMemo3(() => creditRefusalFromEvents(events), [events]);
1062
- const failure = useMemo3(
1063
- () => session && (session.status === "failed" || creditExhausted) ? summarizeSessionFailure(
1064
- events,
1065
- session.status,
1066
- session.failureDiagnostics,
1067
- session.lastSequence
1068
- ) : null,
1069
- [events, session, creditExhausted]
1070
- );
1071
- const [panelEventFeed] = useState3(createSessionEventFeedStore);
1072
- const { client, captureWorkspaceInvocation, ownsWorkspaceInvocation } = context;
1073
- const {
1074
- setSession: setContextSession,
1075
- setConnectionState: setContextConnectionState,
1076
- sessionEventFeedStore
1077
- } = sessionRouteAppState(placement, context, panelEventFeed);
1078
- const acknowledgedProjectionRef = useRef2(null);
1079
- const confirmedProjectionRef = useRef2(null);
1080
- const retriedProjectionRef = useRef2(null);
1081
- const [foreground, setForeground] = useState3(() => ({
1082
- documentVisible: document.visibilityState === "visible",
1083
- windowFocused: document.hasFocus()
1084
- }));
1085
- const [attentionRetryRevision, setAttentionRetryRevision] = useState3(0);
1086
- const reconciledSessionRead = useRef2(null);
1087
- useEffect4(() => {
1088
- if (!fetchedSession || sessionReadRevision === 0) return;
1089
- if (reconciledSessionRead.current?.sessionId === sessionId && reconciledSessionRead.current.revision === sessionReadRevision) {
1090
- return;
1091
- }
1092
- reconciledSessionRead.current = {
1093
- sessionId,
1094
- revision: sessionReadRevision
1095
- };
1096
- const accepted = context.sessionChannelProjectionAuthority.recordRead(
1097
- fetchedSession,
1098
- sessionReadGeneration
1099
- );
1100
- setContextSession(
1101
- (current) => mergeSessionDetailReadProjection(
1102
- current,
1103
- fetchedSession,
1104
- context.sessionChannelProjectionAuthority,
1105
- sessionReadGeneration,
1106
- accepted
1107
- )
1108
- );
1109
- }, [
1110
- context.sessionChannelProjectionAuthority,
1111
- fetchedSession,
1112
- sessionId,
1113
- sessionReadGeneration,
1114
- sessionReadRevision,
1115
- setContextSession
1116
- ]);
1117
- useEffect4(() => {
1118
- setContextSession(
1119
- (current) => mergeSessionContextProjection(
1120
- current,
1121
- session,
1122
- context.sessionChannelProjectionAuthority,
1123
- "live"
1124
- )
1125
- );
1126
- }, [context.sessionChannelProjectionAuthority, session, setContextSession]);
1127
- useEffect4(() => {
1128
- const reconcileForeground = () => {
1129
- setForeground({
1130
- documentVisible: document.visibilityState === "visible",
1131
- windowFocused: document.hasFocus()
1132
- });
1133
- };
1134
- window.addEventListener("focus", reconcileForeground);
1135
- window.addEventListener("blur", reconcileForeground);
1136
- document.addEventListener("visibilitychange", reconcileForeground);
1137
- return () => {
1138
- window.removeEventListener("focus", reconcileForeground);
1139
- window.removeEventListener("blur", reconcileForeground);
1140
- document.removeEventListener("visibilitychange", reconcileForeground);
1141
- };
1142
- }, []);
1143
- const projectSessionAttention = useCallback3(
1144
- (projection) => {
1145
- notifySessionAttentionChanged(projection);
1146
- setContextSession(
1147
- (current) => current?.id === projection.id ? applySessionAttentionProjection(current, projection) : current
1148
- );
1149
- },
1150
- [setContextSession]
1151
- );
1152
- const attentionThroughSequence = useMemo3(
1153
- () => sessionAttentionReadThroughSequence(events),
1154
- [events]
1155
- );
1156
- const readThroughSequence = Math.max(session?.lastSequence ?? 0, attentionThroughSequence);
1157
- const activeReadProjectionKey = session ? sessionReadProjectionKey(session.id, readThroughSequence) : null;
1158
- const routeUnreadProjection = useMemo3(
1159
- () => session ? {
1160
- ...session,
1161
- unread: session.unread || readThroughSequence > session.lastSequence
1162
- } : null,
1163
- [readThroughSequence, session]
1164
- );
1165
- useLayoutEffect2(() => {
1166
- if (!session || !activeReadProjectionKey) return;
1167
- if (confirmedProjectionRef.current === activeReadProjectionKey || !shouldProjectActiveSessionRead({
1168
- activeSessionId: sessionId,
1169
- workspaceId,
1170
- session: routeUnreadProjection,
1171
- ...foreground
1172
- })) {
1173
- return;
1174
- }
1175
- const optimisticProjection = {
1176
- id: session.id,
1177
- workspaceId: session.workspaceId,
1178
- unread: false,
1179
- ...session.attentionVersion !== void 0 ? { attentionVersion: session.attentionVersion } : {},
1180
- lastSequence: readThroughSequence
1181
- };
1182
- projectSessionAttention(optimisticProjection);
1183
- }, [
1184
- activeReadProjectionKey,
1185
- foreground,
1186
- projectSessionAttention,
1187
- readThroughSequence,
1188
- routeUnreadProjection,
1189
- session,
1190
- sessionId,
1191
- workspaceId
1192
- ]);
1193
- const acknowledgementSessionId = session?.id ?? null;
1194
- const acknowledgementEligible = shouldAcknowledgeActiveSession({
1195
- activeSessionId: sessionId,
1196
- workspaceId,
1197
- session: routeUnreadProjection,
1198
- ...foreground
1199
- });
1200
- useEffect4(() => {
1201
- const projectionKey = activeReadProjectionKey;
1202
- if (!acknowledgementSessionId || !projectionKey || acknowledgedProjectionRef.current === projectionKey || !acknowledgementEligible) {
1203
- return;
1204
- }
1205
- let active = true;
1206
- const acceptedTransition = captureWorkspaceInvocation(workspaceId);
1207
- if (!acceptedTransition) return;
1208
- acknowledgedProjectionRef.current = projectionKey;
1209
- void client.updateSessionAttention(workspaceId, acknowledgementSessionId, {
1210
- unread: false,
1211
- acknowledgedThroughSequence: readThroughSequence
1212
- }).then((updated) => {
1213
- if (!ownsWorkspaceInvocation(workspaceId, acceptedTransition)) return;
1214
- confirmedProjectionRef.current = projectionKey;
1215
- projectSessionAttention(updated);
1216
- }).catch(() => {
1217
- if (active && ownsWorkspaceInvocation(workspaceId, acceptedTransition) && acknowledgedProjectionRef.current === projectionKey && retriedProjectionRef.current !== projectionKey) {
1218
- retriedProjectionRef.current = projectionKey;
1219
- acknowledgedProjectionRef.current = null;
1220
- setAttentionRetryRevision((revision) => revision + 1);
1221
- return;
1222
- }
1223
- if (acknowledgedProjectionRef.current === projectionKey) {
1224
- acknowledgedProjectionRef.current = null;
1225
- }
1226
- });
1227
- return () => {
1228
- active = false;
1229
- };
1230
- }, [
1231
- acknowledgementEligible,
1232
- acknowledgementSessionId,
1233
- attentionRetryRevision,
1234
- activeReadProjectionKey,
1235
- captureWorkspaceInvocation,
1236
- client,
1237
- ownsWorkspaceInvocation,
1238
- projectSessionAttention,
1239
- readThroughSequence,
1240
- workspaceId
1241
- ]);
1242
- useEffect4(() => {
1243
- setContextConnectionState(connectionState);
1244
- }, [connectionState, setContextConnectionState]);
1245
- useStreamHealthTelemetry("session", connectionState);
1246
- useEffect4(() => {
1247
- sessionEventFeedStore.set({ sessionId, events });
1248
- }, [events, sessionId, sessionEventFeedStore]);
1249
- useEffect4(
1250
- () => () => {
1251
- setContextSession(null);
1252
- setContextConnectionState("idle");
1253
- if (sessionEventFeedStore.getSnapshot()?.sessionId === sessionId) {
1254
- sessionEventFeedStore.set(null);
1255
- }
1256
- },
1257
- [sessionId, sessionEventFeedStore, setContextConnectionState, setContextSession]
1258
- );
1259
- useSessionFailureToasts(loadError, streamError);
1260
- const oauthReturnHandled = useRef2(false);
1261
- const capabilityClient = context.client;
1262
- const capabilityCatalog = context.workspaceCapabilityCatalog;
1263
- const capabilityCatalogReady = context.workspaceMcpCatalogReady;
1264
- const refreshCapabilityCatalog = context.refreshWorkspaceMcpServers;
1265
- useEffect4(() => {
1266
- if (oauthReturnHandled.current || !capabilityCatalogReady) {
1267
- return;
1268
- }
1269
- const params = page.readQuery();
1270
- const outcome = params.get("integration_oauth");
1271
- if (!outcome) {
1272
- return;
1273
- }
1274
- oauthReturnHandled.current = true;
1275
- page.replaceQuery(new URLSearchParams());
1276
- const capabilityId = params.get("capability_auth");
1277
- if (outcome !== "success") {
1278
- void import("./app/lib/oauth-callback-messages.js").then(
1279
- ({ mcpOAuthCallbackFailureMessage }) => toast.error("Reconnect failed", {
1280
- description: mcpOAuthCallbackFailureMessage(params.get("stage"), params.get("reason"))
1281
- })
1282
- );
1283
- return;
1284
- }
1285
- if (!capabilityId) {
1286
- toast.success("Connection restored", {
1287
- description: "The earlier tool call wasn't replayed. Send a new message to try again."
1288
- });
1289
- return;
1290
- }
1291
- void (async () => {
1292
- const finished = await finishMcpCapabilityOAuthReturn({
1293
- client: capabilityClient,
1294
- workspaceId,
1295
- sessionId,
1296
- capabilityId,
1297
- params,
1298
- catalog: capabilityCatalog,
1299
- refreshCatalog: refreshCapabilityCatalog
1300
- });
1301
- toast.success(`${finished.name} connected`, {
1302
- description: finished.needsPersonalReview ? "Review its connection card to allow your personal account in this conversation." : "It is available to new tool calls in this session."
1303
- });
1304
- })().catch((error) => {
1305
- toast.error("Connection succeeded, but setup needs attention", {
1306
- description: userErrorText(error)
1307
- });
1308
- });
1309
- }, [
1310
- page,
1311
- capabilityCatalog,
1312
- capabilityCatalogReady,
1313
- capabilityClient,
1314
- refreshCapabilityCatalog,
1315
- workspaceId,
1316
- sessionId
1317
- ]);
1318
- const nativeReturnHandled = useRef2(false);
1319
- useEffect4(() => {
1320
- if (nativeReturnHandled.current || !capabilityCatalogReady) return;
1321
- const params = page.readQuery();
1322
- const social = params.get("social_oauth");
1323
- const fiken = params.get("fiken");
1324
- if (!social && !fiken) return;
1325
- nativeReturnHandled.current = true;
1326
- page.replaceQuery(new URLSearchParams());
1327
- if (social === "success" || fiken === "connected") {
1328
- const capabilityId = params.get("capability_auth");
1329
- void (async () => {
1330
- await refreshCapabilityCatalog(workspaceId);
1331
- await completeSessionCapabilityOAuth(
1332
- t,
1333
- capabilityClient,
1334
- workspaceId,
1335
- sessionId,
1336
- capabilityId
1337
- );
1338
- toast.success("Connection setup completed", {
1339
- description: "It is available to new tool calls in this session."
1340
- });
1341
- })().catch(
1342
- (error) => toast.error("Connection authorized, but setup needs attention", {
1343
- description: userErrorText(error)
1344
- })
1345
- );
1346
- } else {
1347
- toast.error("Connection wasn't completed", {
1348
- description: "You can retry from the connection card."
1349
- });
1350
- }
1351
- }, [
1352
- page,
1353
- capabilityCatalogReady,
1354
- capabilityClient,
1355
- refreshCapabilityCatalog,
1356
- workspaceId,
1357
- sessionId
1358
- ]);
1359
- const githubReturnHandled = useRef2(false);
1360
- useEffect4(() => {
1361
- if (githubReturnHandled.current) return;
1362
- const params = page.readQuery();
1363
- const outcome = params.get("github");
1364
- if (outcome !== "connected" && outcome !== "requested") return;
1365
- githubReturnHandled.current = true;
1366
- page.replaceQuery(new URLSearchParams());
1367
- if (outcome === "requested") {
1368
- recordGitHubInstallRequest(workspaceId);
1369
- toast.success("Request sent to your GitHub organization owners", {
1370
- description: "After an owner approves, an owner of the organization connects it here. Your GitHub card updates on its own."
1371
- });
1372
- return;
1373
- }
1374
- clearGitHubInstallRequest(workspaceId);
1375
- toast.success("GitHub connected", {
1376
- description: "Repository access is now available to new tool calls in this session."
1377
- });
1378
- }, [page, workspaceId]);
1379
- const reconnectTransport = useMemo3(() => context.client.connectTransport(), [context.client]);
1380
- const [reconnectRequest, setReconnectRequest] = useState3(null);
1381
- const reconnectCardConnections = useRef2(/* @__PURE__ */ new WeakMap());
1382
- const connectGitHubApp = useCallback3(() => {
1383
- setReconnectRequest(githubAppConnectRequest(workspaceId, reconnectTransport, page.href()));
1384
- }, [page, reconnectTransport, workspaceId]);
1385
- const connectPersonalGitHub = context.connectPersonalGitHub;
1386
- const reconnectPersonalGitHub = context.reconnectPersonalGitHub;
1387
- const personalGitHubConnection = context.personalGitHubStatus?.connection ?? null;
1388
- const personalGitHubNeedsReconnect = personalGitHubConnection !== null && personalGitHubConnection.status !== "active" && personalGitHubConnection.status !== "revoked";
1389
- const onReconnect = useCallback3(
1390
- async (item) => {
1391
- if (item.authoritySource === "host") {
1392
- if (!item.authorizationUrl) {
1393
- throw new Error(
1394
- "This connection is managed by the embedding host and has no recovery link."
1395
- );
1396
- }
1397
- page.assign(item.authorizationUrl);
1398
- return;
1399
- }
1400
- if (item.connectionId) {
1401
- const { findConnectRecoveryAccount } = await import("@opengeni/connect");
1402
- const account = findConnectRecoveryAccount(
1403
- await reconnectTransport.accounts(workspaceId),
1404
- item.connectionId
1405
- );
1406
- if (account) {
1407
- const request = {
1408
- scope: { workspaceId, transport: reconnectTransport },
1409
- providerId: account.providerId,
1410
- ownership: account.ownership,
1411
- reconnectAccountId: account.id,
1412
- // A tool needed more access than the account was connected with:
1413
- // the reconnect asks the provider for exactly that (incremental consent).
1414
- // Other providers keep their fixed permission set.
1415
- ...item.reason === "insufficient_scope" && item.scopes.length > 0 && connectProviderAcceptsRequestedScopes(account.providerId) ? { requestedScopes: [...item.scopes] } : {},
1416
- displayName: account.label,
1417
- returnUrl: page.href(),
1418
- idempotencyKey: crypto.randomUUID()
1419
- };
1420
- reconnectCardConnections.current.set(request, item.connectionId);
1421
- setReconnectRequest(request);
1422
- return;
1423
- }
1424
- }
1425
- if (item.capability) {
1426
- const returnPath2 = `${new URL(page.href()).pathname}?capability_auth=${encodeURIComponent(item.capability.id)}`;
1427
- if (item.capability.id === "api:github-app") {
1428
- const status = await context.client.getGitHubApp(workspaceId, {
1429
- returnPath: returnPath2
1430
- });
1431
- if (status.status === "bound") {
1432
- toast.success("GitHub is already connected");
1433
- return;
1434
- }
1435
- if (!status.linkUrl) {
1436
- throw new Error(
1437
- status.configured ? "Your account cannot manage this workspace's GitHub connection." : "GitHub is not configured on this deployment."
1438
- );
1439
- }
1440
- await markIntegrationConnectRedirect("github", "app_install");
1441
- page.assign(status.linkUrl);
1442
- return;
1443
- }
1444
- if (item.capability.id === "api:github-personal") {
1445
- await (personalGitHubNeedsReconnect ? reconnectPersonalGitHub : connectPersonalGitHub)(
1446
- workspaceId
1447
- );
1448
- return;
1449
- }
1450
- if (item.capability.id === "mcp:codex_apps") {
1451
- page.assign(`/workspaces/${encodeURIComponent(workspaceId)}/settings`);
1452
- return;
1453
- }
1454
- const catalogItem = context.workspaceCapabilityCatalog.find(
1455
- (candidate) => candidate.id === item.capability?.id
1456
- );
1457
- const canInstall = canConnectWorkspaceMcpFromChat(
1458
- context.accessContext,
1459
- workspaceId,
1460
- catalogItem,
1461
- context.workspaceMemberIntegrationSetup
1462
- );
1463
- const mcpUrl = catalogItem?.mcpUrl ?? catalogItem?.endpointUrl ?? null;
1464
- if (canInstall && catalogItem?.kind === "mcp" && catalogItem.authKind === "oauth2" && mcpUrl) {
1465
- const response2 = await startMcpOAuthWithTimeout(context.client, workspaceId, {
1466
- mcpUrl,
1467
- ...catalogItem.providerDomain ? { providerDomain: catalogItem.providerDomain } : {},
1468
- ownership: "workspace",
1469
- returnPath: returnPath2
1470
- });
1471
- if (!response2.authorizationUrl) {
1472
- throw new Error("The provider did not return an authorization link.");
1473
- }
1474
- await markIntegrationConnectRedirect({ domain: mcpUrl }, "oauth");
1475
- page.assign(response2.authorizationUrl);
1476
- return;
1477
- }
1478
- page.assign(
1479
- `/workspaces/${encodeURIComponent(workspaceId)}/capabilities?suggested_capability=${encodeURIComponent(item.capability.id)}`
1480
- );
1481
- return;
1482
- }
1483
- if (item.serverId === "codex_apps") {
1484
- page.assign(`/workspaces/${encodeURIComponent(workspaceId)}/settings`);
1485
- return;
1486
- }
1487
- const connections = await context.client.listConnections(workspaceId).catch(() => []);
1488
- const connection = item.connectionId ? connections.find((candidate) => candidate.id === item.connectionId) ?? null : null;
1489
- if (connection?.kind === "api_key") {
1490
- page.assign(
1491
- `/workspaces/${encodeURIComponent(workspaceId)}/capabilities?reconnect_domain=${encodeURIComponent(item.providerDomain)}`
1492
- );
1493
- return;
1494
- }
1495
- const pageUrl = new URL(page.href());
1496
- const returnPath = `${pageUrl.pathname}${pageUrl.search}`;
1497
- const response = await context.client.startConnectionOAuth(workspaceId, {
1498
- providerDomain: item.providerDomain,
1499
- ...item.connectionId ? { connectionId: item.connectionId } : {},
1500
- ...item.resource ? { resource: item.resource } : {},
1501
- returnPath
1502
- });
1503
- if (!response.authorizationUrl) {
1504
- throw new Error("The provider did not return an authorization link.");
1505
- }
1506
- await markIntegrationConnectRedirect({ domain: item.providerDomain }, "oauth");
1507
- page.assign(response.authorizationUrl);
1508
- },
1509
- [
1510
- page,
1511
- context.accessContext,
1512
- context.client,
1513
- connectPersonalGitHub,
1514
- reconnectPersonalGitHub,
1515
- personalGitHubNeedsReconnect,
1516
- context.workspaceCapabilityCatalog,
1517
- context.workspaceMemberIntegrationSetup,
1518
- workspaceId,
1519
- reconnectTransport
1520
- ]
1521
- );
1522
- const providerLogos = useMemo3(
1523
- () => connectorLogoIndex(
1524
- context.workspaceCapabilityCatalog,
1525
- (path) => context.client.catalogAssetUrl(path ?? null)
1526
- ),
1527
- [context.client, context.workspaceCapabilityCatalog]
1528
- );
1529
- const resolveProviderLogo = useCallback3(
1530
- (domain) => connectorLogo(providerLogos, domain),
1531
- [providerLogos]
1532
- );
1533
- const lineagePoll = useLineagePollInterval(workspaceId);
1534
- const lineage = useSessionLineage(sessionId, {
1535
- events,
1536
- pollIntervalMs: lineagePoll.pollIntervalMs
1537
- });
1538
- const agentNodes = useMemo3(() => lineage.lineage?.children ?? [], [lineage.lineage]);
1539
- const observeLineageTree = lineagePoll.observeTree;
1540
- useEffect4(() => observeLineageTree(agentNodes), [agentNodes, observeLineageTree]);
1541
- const descendantRefreshSignal = useDescendantRequestsRefresh({
1542
- client: context.client,
1543
- workspaceId,
1544
- sessionId,
1545
- events,
1546
- nodes: agentNodes,
1547
- refreshLineage: lineage.refresh
1548
- });
1549
- const lineageTitles = useMemo3(() => {
1550
- const titles = /* @__PURE__ */ new Map();
1551
- for (const ancestor of lineage.lineage?.ancestors ?? []) {
1552
- titles.set(ancestor.id, sessionDisplayTitle(ancestor));
1553
- }
1554
- const visit = (nodes) => {
1555
- for (const node of nodes) {
1556
- titles.set(node.session.id, sessionDisplayTitle(node.session));
1557
- visit(node.children);
1558
- }
1559
- };
1560
- visit(lineage.lineage?.children ?? []);
1561
- return titles;
1562
- }, [lineage.lineage]);
1563
- const resolveSessionTitle = useCallback3(
1564
- (agentSessionId) => lineageTitles.get(agentSessionId) ?? null,
1565
- [lineageTitles]
1566
- );
1567
- const sandboxFileRequestSeq = useRef2(0);
1568
- const [sandboxFileRequest, setSandboxFileRequest] = useState3(null);
1569
- useEffect4(() => {
1570
- setSandboxFileRequest(null);
1571
- }, [sessionId]);
1572
- const setInspectorOpen = context.setInspectorOpen;
1573
- const agentSettingsRequestSeq = useRef2(0);
1574
- const [agentSettingsRequest, setAgentSettingsRequest] = useState3(null);
1575
- const openAgentSettings = useCallback3(() => {
1576
- setAgentSettingsRequest({
1577
- sessionId,
1578
- requestId: ++agentSettingsRequestSeq.current,
1579
- target: "learning"
1580
- });
1581
- setInspectorOpen(true);
1582
- }, [sessionId, setInspectorOpen]);
1583
- const openUsageLimit = useCallback3(() => {
1584
- setAgentSettingsRequest({
1585
- sessionId,
1586
- requestId: ++agentSettingsRequestSeq.current,
1587
- target: "usage-limit"
1588
- });
1589
- setInspectorOpen(true);
1590
- }, [sessionId, setInspectorOpen]);
1591
- useEffect4(() => {
1592
- uiEvents.addEventListener(OPEN_SESSION_USAGE_LIMIT_EVENT, openUsageLimit);
1593
- return () => uiEvents.removeEventListener(OPEN_SESSION_USAGE_LIMIT_EVENT, openUsageLimit);
1594
- }, [openUsageLimit, uiEvents]);
1595
- const openSandboxFile = useCallback3(
1596
- (path, line) => {
1597
- setSandboxFileRequest({
1598
- path,
1599
- line,
1600
- requestId: ++sandboxFileRequestSeq.current
1601
- });
1602
- setInspectorOpen(true);
1603
- },
1604
- [setInspectorOpen]
1605
- );
1606
- if (!session || !opened) {
1607
- if (leavingRestoredSession) return /* @__PURE__ */ jsx(LoadingPanel, {});
1608
- if (!session && loadError) {
1609
- return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(LoadingPanel, {}), children: /* @__PURE__ */ jsx(
1610
- LazySessionRouteAuxiliary,
1611
- {
1612
- workspaceId,
1613
- sessionId,
1614
- loadError,
1615
- onRetry: () => void refreshSession()
1616
- }
1617
- ) });
1618
- }
1619
- return /* @__PURE__ */ jsx("div", { className: "flex min-h-0 w-full min-w-0 flex-1 overflow-hidden", children: /* @__PURE__ */ jsx(
1620
- SessionDock,
1621
- {
1622
- workspaceId,
1623
- sessionId,
1624
- session: null,
1625
- events,
1626
- connectionState,
1627
- primary: session && streamError && !initialLoading ? /* @__PURE__ */ jsx(
1628
- ProblemPanel,
1629
- {
1630
- title: "Conversation couldn't be loaded",
1631
- description: "Your saved messages are unchanged. Try loading them again.",
1632
- action: /* @__PURE__ */ jsx(Button, { variant: "outline", onClick: () => void jumpToLatest(), children: "Retry conversation" })
1633
- }
1634
- ) : /* @__PURE__ */ jsx(LoadingPanel, {}),
1635
- onReloadSession: refreshSession,
1636
- dockCollapsed: !context.inspectorOpen,
1637
- onDockCollapsedChange: (collapsed) => context.setInspectorOpen(!collapsed),
1638
- openFileRequest: sandboxFileRequest,
1639
- onOpenNavigation: () => {
1640
- context.setInspectorOpen(false);
1641
- rail.setDrawerOpen(true);
1642
- }
1643
- }
1644
- ) });
1645
- }
1646
- const chatPane = /* @__PURE__ */ jsx(
1647
- SessionChatPane,
1648
- {
1649
- session,
1650
- admissionSessionControl: sessionSeed?.effectiveControl ?? session.effectiveControl,
1651
- events,
1652
- timeline,
1653
- searchTarget,
1654
- onJumpToSequence: jumpToSequence,
1655
- initialLoading,
1656
- historyReloadFailed: hasObservedHistory && events.length === 0 && !!streamError,
1657
- launch,
1658
- realtimeAutostartModel,
1659
- onRealtimeAutostartConsumed: consumeRealtimeAutostart,
1660
- onSearchOriginConsumed: consumeSearchOrigin,
1661
- placement,
1662
- messageContext,
1663
- initialDraft,
1664
- approvals,
1665
- humanInput,
1666
- failure,
1667
- creditExhausted,
1668
- creditRefusal,
1669
- goal,
1670
- queue,
1671
- agentNodes,
1672
- pendingWake: sessionHasPendingWake(withLineageAutomationFacts(session, lineage.lineage)),
1673
- descendantRefreshSignal,
1674
- onDescendantResolved: () => void lineage.refresh(),
1675
- hasOlder,
1676
- loadingOlder,
1677
- onLoadOlder: loadOlder,
1678
- hasNewer,
1679
- loadingNewer,
1680
- onLoadNewer: loadNewer,
1681
- loadingOldest,
1682
- onJumpToStart: loadOldest,
1683
- onJumpToLatest: jumpToLatest,
1684
- onClearView: clearView,
1685
- resolveSessionTitle,
1686
- onOpenSession: (nextSessionId) => void navigate({
1687
- to: "/workspaces/$workspaceId/sessions/$sessionId",
1688
- params: { workspaceId, sessionId: nextSessionId }
1689
- }),
1690
- onMemoryClick: (memoryId) => void navigate({
1691
- to: "/workspaces/$workspaceId/memory",
1692
- params: { workspaceId },
1693
- search: { memory: memoryId }
1694
- }),
1695
- onLearningRefusalOpen: (place) => {
1696
- switch (place.kind) {
1697
- case "skill":
1698
- void navigate({
1699
- href: `/workspaces/${encodeURIComponent(workspaceId)}/plugins?section=skills&open=${encodeURIComponent(`skill:${place.skillId}`)}`
1700
- });
1701
- return;
1702
- case "skills":
1703
- void navigate({
1704
- to: "/workspaces/$workspaceId/plugins",
1705
- params: { workspaceId },
1706
- search: { section: "skills" }
1707
- });
1708
- return;
1709
- case "instructions":
1710
- void navigate({
1711
- to: "/workspaces/$workspaceId/state",
1712
- params: { workspaceId },
1713
- search: { view: "instructions" }
1714
- });
1715
- return;
1716
- case "knowledge":
1717
- void navigate({ to: "/workspaces/$workspaceId/state", params: { workspaceId } });
1718
- return;
1719
- case "learning-settings":
1720
- void navigate({
1721
- to: "/workspaces/$workspaceId/settings",
1722
- params: { workspaceId },
1723
- search: { section: "learning" }
1724
- });
1725
- }
1726
- },
1727
- onNewSession: onNewSession ?? (() => void navigate({
1728
- to: "/workspaces/$workspaceId/sessions",
1729
- params: { workspaceId }
1730
- })),
1731
- onContinueInNewSession: () => void navigate({
1732
- to: "/workspaces/$workspaceId/sessions",
1733
- params: { workspaceId },
1734
- search: { continueSessionId: sessionId }
1735
- }),
1736
- onApprove: (approvalId, answer) => approve(approvalId, "approve", answer),
1737
- onReject: (approvalId) => approve(approvalId, "reject"),
1738
- onReconnect,
1739
- onConnectGitHubApp: connectGitHubApp,
1740
- resolveProviderLogo,
1741
- onReloadSession: refreshSession,
1742
- onOpenSandboxFile: dockEnabled ? openSandboxFile : void 0,
1743
- onOpenAgentSettings: dockEnabled ? openAgentSettings : void 0,
1744
- onOpenUsageLimit: dockEnabled ? openUsageLimit : void 0,
1745
- connectionState
1746
- },
1747
- session.id
1748
- );
1749
- const routeView = /* @__PURE__ */ jsxs("div", { className: "flex min-h-0 w-full min-w-0 flex-1 overflow-hidden", children: [
1750
- reconnectRequest && /* @__PURE__ */ jsx(LazyPart, { fallback: /* @__PURE__ */ jsx(LoadingPanel, { label: "Opening connection setup" }), children: /* @__PURE__ */ jsx(
1751
- NativeConnectSetup,
1752
- {
1753
- transport: reconnectTransport,
1754
- workspaceId,
1755
- request: reconnectRequest,
1756
- onClose: () => setReconnectRequest(null),
1757
- onComplete: () => {
1758
- setReconnectRequest((current) => current === reconnectRequest ? null : current);
1759
- if (reconnectRequest.providerId === "github-app") {
1760
- toast.success("GitHub connected");
1761
- void context.refreshGitHub(workspaceId, void 0, {
1762
- sync: true,
1763
- userInitiated: true
1764
- });
1765
- return;
1766
- }
1767
- const connectionId = reconnectCardConnections.current.get(reconnectRequest);
1768
- if (connectionId)
1769
- void Promise.resolve().then(
1770
- () => context.client.continueAfterCapabilitySetup(workspaceId, sessionId, {
1771
- connectionId
1772
- })
1773
- ).catch(() => void 0);
1774
- toast.success("Connection updated", {
1775
- description: "New tool calls can use the updated connection."
1776
- });
1777
- }
1778
- }
1779
- ) }),
1780
- /* @__PURE__ */ jsx(
1781
- SessionDock,
1782
- {
1783
- workspaceId,
1784
- sessionId,
1785
- session,
1786
- events,
1787
- connectionState,
1788
- primary: /* @__PURE__ */ jsx(
1789
- ChatPaymentPages,
1790
- {
1791
- accountId: session?.accountId ?? context.workspaces.find((candidate) => candidate.id === workspaceId)?.accountId,
1792
- children: chatPane
1793
- }
1794
- ),
1795
- onReloadSession: refreshSession,
1796
- dockCollapsed: !context.inspectorOpen,
1797
- onDockCollapsedChange: (collapsed) => context.setInspectorOpen(!collapsed),
1798
- openFileRequest: sandboxFileRequest,
1799
- openAgentSettingsRequest: agentSettingsRequest?.sessionId === sessionId ? agentSettingsRequest : null,
1800
- onOpenNavigation: () => {
1801
- context.setInspectorOpen(false);
1802
- rail.setDrawerOpen(true);
1803
- }
1804
- }
1805
- )
1806
- ] });
1807
- return routed ? routeView : /* @__PURE__ */ jsx(SessionStartupProvider, { session, children: routeView });
1808
- async function approve(approvalId, decision, answer) {
1809
- try {
1810
- await context.client.sendApprovalDecision(workspaceId, sessionId, {
1811
- approvalId,
1812
- decision,
1813
- ...answer
1814
- });
1815
- } catch (error) {
1816
- toast.error("Couldn't submit the decision", {
1817
- description: userErrorText(error)
1818
- });
1819
- throw error instanceof Error ? error : new Error(String(error));
1820
- }
1821
- }
1822
- }
1823
- function withHostMessageContext(...sources) {
1824
- const value = sources.map((source) => source?.()).filter((part) => Boolean(part)).join("\n\n");
1825
- return value ? { modelContext: value } : {};
1826
- }
1827
- function lastAgentChange(events) {
1828
- for (let index = events.length - 1; index >= 0; index -= 1) {
1829
- const event = events[index];
1830
- if (event.type !== "session.agent.updated") continue;
1831
- const pending = !events.slice(index + 1).some((later) => later.type === "turn.started");
1832
- return { at: event.occurredAt, pending };
1833
- }
1834
- return null;
1835
- }
1836
- function SessionDock(props) {
1837
- if (!useSessionUiFeature("dock")) {
1838
- return /* @__PURE__ */ jsx("div", { className: "flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden", children: props.primary });
1839
- }
1840
- return /* @__PURE__ */ jsx(SessionDockPanel, { ...props });
1841
- }
1842
- function SessionDockPanel(props) {
1843
- const context = useAppContext();
1844
- const tabRequestSeq = useRef2(0);
1845
- const [tabRequest, setTabRequest] = useState3(null);
1846
- const agentSettingsRequestId = props.openAgentSettingsRequest?.requestId ?? null;
1847
- const agentSettingsTarget = props.openAgentSettingsRequest?.target ?? "learning";
1848
- const [agentLearningFocus, setAgentLearningFocus] = useState3(0);
1849
- const [usageLimitFocus, setUsageLimitFocus] = useState3(0);
1850
- useEffect4(() => {
1851
- if (agentSettingsRequestId === null) return;
1852
- setTabRequest({
1853
- sessionId: props.sessionId,
1854
- tab: "agent",
1855
- requestId: ++tabRequestSeq.current
1856
- });
1857
- if (agentSettingsTarget === "usage-limit") setUsageLimitFocus((value) => value + 1);
1858
- else setAgentLearningFocus((value) => value + 1);
1859
- }, [agentSettingsRequestId, props.sessionId]);
1860
- const goalPausedAtLimit = useMemo3(() => goalPausedAtUsageLimit(props.events), [props.events]);
1861
- const currentTabRequest = tabRequest?.sessionId === props.sessionId ? tabRequest : null;
1862
- const dockLayoutStorageId = sessionDockLayoutStorageId(
1863
- context.accessContext.subjectId,
1864
- props.sessionId
1865
- );
1866
- const dockNavigation = useMemo3(
1867
- () => readSessionDockNavigation(dockLayoutStorageId),
1868
- [dockLayoutStorageId]
1869
- );
1870
- const rememberArtifact = useCallback3(
1871
- (artifactId) => updateSessionDockNavigation(dockLayoutStorageId, { artifactId }),
1872
- [dockLayoutStorageId]
1873
- );
1874
- const artifactRefreshSequence = useMemo3(() => {
1875
- for (let index = props.events.length - 1; index >= 0; index -= 1) {
1876
- const event = props.events[index];
1877
- if (event && (event.type === "agent.toolCall.output" || event.type === "turn.completed" || event.type === "turn.failed" || event.type === "turn.cancelled")) {
1878
- return event.sequence;
1879
- }
1880
- }
1881
- return 0;
1882
- }, [props.events]);
1883
- useEffect4(() => {
1884
- if (artifactRefreshSequence) expireArtifactCatalog(context.client, props.workspaceId);
1885
- }, [artifactRefreshSequence, context.client, props.workspaceId]);
1886
- const artifactState = useSessionEditableArtifactSummaries({
1887
- workspaceId: props.workspaceId,
1888
- sessionId: props.sessionId,
1889
- refreshSequence: artifactRefreshSequence
1890
- });
1891
- const expireAfterArtifactMutation = useArtifactCatalogMutationInvalidation(
1892
- context.client,
1893
- props.workspaceId,
1894
- expireArtifactCatalog
1895
- );
1896
- const [artifactRequest, setArtifactRequest] = useState3(null);
1897
- const currentArtifactRequest = artifactRequest?.sessionId === props.sessionId ? artifactRequest : null;
1898
- const artifactTabRequestId = currentArtifactRequest?.requestId ?? null;
1899
- useEffect4(() => {
1900
- if (artifactTabRequestId === null) return;
1901
- setTabRequest({
1902
- sessionId: props.sessionId,
1903
- tab: "artifacts",
1904
- requestId: ++tabRequestSeq.current
1905
- });
1906
- }, [artifactTabRequestId, props.sessionId]);
1907
- const artifactSummaries = [...artifactState.artifacts];
1908
- if (currentArtifactRequest && !artifactSummaries.some(
1909
- (item) => item.id === currentArtifactRequest.artifactId && (!currentArtifactRequest.artifactKind || item.modality === currentArtifactRequest.artifactKind || currentArtifactRequest.artifactKind === "file" && item.modality === "image")
1910
- )) {
1911
- artifactSummaries.push({
1912
- id: currentArtifactRequest.artifactId,
1913
- modality: currentArtifactRequest.artifactKind ?? "site",
1914
- title: currentArtifactRequest.artifactKind === "image" ? "Image" : currentArtifactRequest.artifactKind === "file" ? "File" : "Site"
1915
- });
1916
- }
1917
- const trailingTabs = [
1918
- {
1919
- id: "artifacts",
1920
- label: "Artifacts",
1921
- icon: /* @__PURE__ */ jsx(PanelsTopLeftIcon, {}),
1922
- ...artifactSummaries.length > 0 ? {
1923
- badge: /* @__PURE__ */ jsx("span", { className: "rounded-og-xs bg-og-accent-soft px-1 text-og-xs text-og-fg-muted", children: artifactSummaries.length })
1924
- } : {},
1925
- content: /* @__PURE__ */ jsx(LazyPart, { fallback: /* @__PURE__ */ jsx(LoadingPanel, { label: "Opening artifact" }), children: /* @__PURE__ */ jsx(
1926
- LazySessionEditableArtifactsWorkspace,
1927
- {
1928
- workspaceId: props.workspaceId,
1929
- sessionId: props.sessionId,
1930
- artifacts: artifactSummaries,
1931
- status: artifactState.status,
1932
- onRetry: artifactState.retry,
1933
- initialSelectedArtifactId: dockNavigation.artifactId,
1934
- openArtifactRequest: currentArtifactRequest,
1935
- onSelectedArtifactIdChange: rememberArtifact,
1936
- onPin: hasWorkspacePermission(context.accessContext, props.workspaceId, "artifacts:publish") ? async (item, pinned) => {
1937
- await context.client.updateArtifactPin(
1938
- props.workspaceId,
1939
- item.kind,
1940
- item.id,
1941
- pinned
1942
- );
1943
- artifactState.applyPin(item.kind, item.id, pinned);
1944
- expireAfterArtifactMutation();
1945
- artifactState.retry();
1946
- } : void 0
1947
- },
1948
- props.sessionId
1949
- ) })
1950
- }
1951
- ];
1952
- if (props.session) {
1953
- trailingTabs.push({
1954
- id: "agent",
1955
- label: "Agent",
1956
- icon: /* @__PURE__ */ jsx(BotIcon, {}),
1957
- content: /* @__PURE__ */ jsx(LazyPart, { fallback: /* @__PURE__ */ jsx(LoadingPanel, { label: "Opening agent settings" }), children: /* @__PURE__ */ jsx(
1958
- LazyAgentConfigurationPanel,
1959
- {
1960
- session: props.session,
1961
- lastChange: lastAgentChange(props.events),
1962
- onReloadSession: props.onReloadSession,
1963
- learningFocusRequest: agentLearningFocus,
1964
- usageLimitFocusRequest: usageLimitFocus,
1965
- goalPausedAtUsageLimit: goalPausedAtLimit
1966
- },
1967
- props.session.id
1968
- ) })
1969
- });
1970
- }
1971
- if (props.session) {
1972
- trailingTabs.push({
1973
- id: "debug",
1974
- label: "Debug",
1975
- icon: /* @__PURE__ */ jsx(BugIcon, {}),
1976
- content: /* @__PURE__ */ jsx(LazyPart, { fallback: /* @__PURE__ */ jsx(LoadingPanel, { label: "Opening debug inspector" }), children: /* @__PURE__ */ jsx(
1977
- LazySessionInspector,
1978
- {
1979
- session: props.session,
1980
- events: props.events,
1981
- connectionState: props.connectionState,
1982
- onReloadSession: props.onReloadSession
1983
- }
1984
- ) })
1985
- });
1986
- }
1987
- return /* @__PURE__ */ jsx(
1988
- SessionWorkspace,
1989
- {
1990
- workspaceId: props.workspaceId,
1991
- sessionId: props.sessionId,
1992
- preferenceOwnerId: context.accessContext.subjectId,
1993
- events: props.events,
1994
- primary: /* @__PURE__ */ jsx(
1995
- ArtifactLinkBoundary,
1996
- {
1997
- workspaceId: props.workspaceId,
1998
- onOpen: (target) => {
1999
- if (target.editable && !artifactSummaries.some(
2000
- (item) => item.id === target.id && isEditableArtifactKind(item.modality)
2001
- ))
2002
- return false;
2003
- setArtifactRequest((previous) => ({
2004
- sessionId: props.sessionId,
2005
- artifactId: target.id,
2006
- artifactKind: target.kind === "file" ? artifactSummaries.find(
2007
- (item) => item.id === target.id && (item.modality === "file" || item.modality === "image")
2008
- )?.modality ?? "file" : target.editable ? artifactSummaries.find(
2009
- (item) => item.id === target.id && isEditableArtifactKind(item.modality)
2010
- )?.modality : "site",
2011
- requestId: (previous?.requestId ?? 0) + 1,
2012
- tab: "artifacts"
2013
- }));
2014
- return true;
2015
- },
2016
- children: props.primary
2017
- }
2018
- ),
2019
- openTabRequest: currentTabRequest,
2020
- trailingTabs,
2021
- collapsed: props.dockCollapsed,
2022
- onCollapsedChange: props.onDockCollapsedChange,
2023
- ...props.openFileRequest ? { openFileRequest: props.openFileRequest } : {},
2024
- mobileLeadingControl: /* @__PURE__ */ jsx(
2025
- Button,
2026
- {
2027
- type: "button",
2028
- variant: "ghost",
2029
- size: "icon-sm",
2030
- "aria-label": "Open navigation",
2031
- onClick: props.onOpenNavigation,
2032
- className: "size-11",
2033
- children: /* @__PURE__ */ jsx(MenuIcon, { className: "size-4" })
2034
- }
2035
- )
2036
- }
2037
- );
2038
- }
2039
- function useSessionEditableArtifactSummaries(input) {
2040
- const context = useAppContext();
2041
- const authorityKey = `${input.workspaceId}:${input.sessionId}:${context.accessKeyVersion}`;
2042
- const [retrySequence, setRetrySequence] = useState3(0);
2043
- const discovery = useRef2(null);
2044
- const [loaded, setLoaded] = useState3(null);
2045
- useEffect4(
2046
- () => () => {
2047
- discovery.current = null;
2048
- },
2049
- []
2050
- );
2051
- useEffect4(() => {
2052
- if (discovery.current?.key !== authorityKey || discovery.current.client !== context.client || discovery.current.retrySequence !== retrySequence)
2053
- discovery.current = {
2054
- key: authorityKey,
2055
- client: context.client,
2056
- retrySequence,
2057
- running: false,
2058
- again: false
2059
- };
2060
- const run = discovery.current;
2061
- setLoaded(
2062
- (previous) => previous?.key === authorityKey && previous.client === context.client && previous.status === "ready" ? previous : {
2063
- key: authorityKey,
2064
- client: context.client,
2065
- status: "loading",
2066
- artifacts: previous?.key === authorityKey && previous.client === context.client ? previous.artifacts : []
2067
- }
2068
- );
2069
- if (run.running) {
2070
- run.again = true;
2071
- return;
2072
- }
2073
- const workspaceId = input.workspaceId;
2074
- const sessionId = input.sessionId;
2075
- const client = context.client;
2076
- const live = () => discovery.current === run;
2077
- const previousArtifacts = (previous) => previous?.key === authorityKey && previous.client === client ? previous.artifacts : [];
2078
- const start = () => {
2079
- run.running = true;
2080
- run.again = false;
2081
- void import("./app/lib/session-artifact-discovery.js").then(async ({ discoverSessionArtifacts }) => {
2082
- const reconcile = await discoverSessionArtifacts(workspaceId, sessionId, live, client);
2083
- if (live())
2084
- setLoaded((previous) => ({
2085
- key: authorityKey,
2086
- client,
2087
- ...reconcile(previousArtifacts(previous))
2088
- }));
2089
- }).catch(() => {
2090
- if (!live()) return;
2091
- setLoaded((previous) => ({
2092
- key: authorityKey,
2093
- client,
2094
- status: "error",
2095
- artifacts: previousArtifacts(previous)
2096
- }));
2097
- }).finally(() => {
2098
- run.running = false;
2099
- if (run.again && live()) start();
2100
- });
2101
- };
2102
- start();
2103
- }, [
2104
- authorityKey,
2105
- context.client,
2106
- input.refreshSequence,
2107
- input.sessionId,
2108
- input.workspaceId,
2109
- retrySequence
2110
- ]);
2111
- const retry = useCallback3(() => setRetrySequence((value) => value + 1), []);
2112
- const applyPin = useCallback3(
2113
- (kind, id, pinned) => {
2114
- setLoaded((previous) => {
2115
- if (previous?.key !== authorityKey || previous.client !== context.client) return previous;
2116
- return {
2117
- ...previous,
2118
- artifacts: previous.artifacts.map(
2119
- (artifact) => artifact.modality === kind && artifact.id === id && artifact.catalogItem ? { ...artifact, catalogItem: { ...artifact.catalogItem, pinned } } : artifact
2120
- )
2121
- };
2122
- });
2123
- },
2124
- [authorityKey, context.client]
2125
- );
2126
- return loaded?.key === authorityKey && loaded.client === context.client ? { artifacts: loaded.artifacts, status: loaded.status, retry, applyPin } : { artifacts: [], status: "loading", retry, applyPin };
2127
- }
2128
- function approvalDecisionKey(approval) {
2129
- return `${approval.id}\0${approval.elicitation?.round ?? ""}`;
2130
- }
2131
- function SessionChatPane(props) {
2132
- const findEvents = useUiEventTarget("document");
2133
- const portalContainer = usePortalContainer();
2134
- const [panelRoot, setPanelRoot] = useState3(null);
2135
- const context = useAppContext();
2136
- const api = useAppApi();
2137
- const page = usePage();
2138
- const navigate = useNavigate();
2139
- const openSession = useCallback3(
2140
- (workspaceId, sessionId) => void navigate({
2141
- to: "/workspaces/$workspaceId/sessions/$sessionId",
2142
- params: { workspaceId, sessionId }
2143
- }),
2144
- [navigate]
2145
- );
2146
- const resolveLink = useWorkspaceAppLinkResolver(props.session.workspaceId, openSession);
2147
- const hostMessageContext = useHostMessageContext();
2148
- const gutter = props.placement === "panel" ? "px-3" : "px-4 sm:px-6";
2149
- const realtimeClient = useMemo3(
2150
- () => api.voiceRealtimeClient(context.client, () => page.href()),
2151
- [api, context.client, page]
2152
- );
2153
- const momentSequence = props.searchTarget.find ? void 0 : props.searchTarget.at;
2154
- const loadedMoment = useRef2(null);
2155
- const { onJumpToSequence, initialLoading: historyLoading } = props;
2156
- const firstLoadedSequence = props.events[0]?.sequence;
2157
- useEffect4(() => {
2158
- if (!momentSequence || historyLoading || loadedMoment.current === momentSequence) return;
2159
- loadedMoment.current = momentSequence;
2160
- if (firstLoadedSequence !== void 0 && firstLoadedSequence > momentSequence) {
2161
- void onJumpToSequence(momentSequence);
2162
- }
2163
- }, [momentSequence, historyLoading, firstLoadedSequence, onJumpToSequence]);
2164
- const [findOpen, setFindOpen] = useState3(!!props.searchTarget.find);
2165
- const [findMounted, setFindMounted] = useState3(!!props.searchTarget.find);
2166
- const [findFocusRevision, setFindFocusRevision] = useState3(0);
2167
- const [activeSearchTarget, setActiveSearchTarget] = useState3(null);
2168
- const findReturnFocus = useRef2(null);
2169
- const openFind = useCallback3(() => {
2170
- const active = document.activeElement;
2171
- if (active instanceof HTMLElement && active !== document.body) findReturnFocus.current = active;
2172
- setFindMounted(true);
2173
- setFindOpen(true);
2174
- setFindFocusRevision((value) => value + 1);
2175
- }, []);
2176
- const { onSearchOriginConsumed } = props;
2177
- const closeFind = useCallback3(() => {
2178
- setFindOpen(false);
2179
- setActiveSearchTarget(null);
2180
- onSearchOriginConsumed();
2181
- requestAnimationFrame(() => {
2182
- const opener = findReturnFocus.current;
2183
- findReturnFocus.current = null;
2184
- const trigger = document.querySelector("[data-conversation-find-trigger]");
2185
- const target = opener?.isConnected ? opener : trigger && trigger.getClientRects().length > 0 ? trigger : null;
2186
- target?.focus({ preventScroll: true });
2187
- });
2188
- }, [onSearchOriginConsumed]);
2189
- useEffect4(() => {
2190
- findEvents.addEventListener(OPEN_CONVERSATION_FIND_EVENT, openFind);
2191
- return () => findEvents.removeEventListener(OPEN_CONVERSATION_FIND_EVENT, openFind);
2192
- }, [findEvents, openFind]);
2193
- useEffect4(() => {
2194
- if (props.searchTarget.find) openFind();
2195
- }, [
2196
- props.searchTarget.find,
2197
- props.searchTarget.matchSequence,
2198
- props.searchTarget.matchOffset,
2199
- openFind
2200
- ]);
2201
- useFindShortcut(
2202
- props.placement === "panel" ? { scope: panelRoot } : { scope: portalContainer ?? window },
2203
- openFind
2204
- );
2205
- const fundingRevision = useMemo3(() => {
2206
- for (let index = props.events.length - 1; index >= 0; index -= 1) {
2207
- const event = props.events[index];
2208
- if (event.type === "agent.model.usage") return event.sequence;
2209
- }
2210
- return 0;
2211
- }, [props.events]);
2212
- const modelCatalog = useWorkspaceModelCatalog(
2213
- props.session.workspaceId,
2214
- `${props.session.id}:${props.session.status}:${fundingRevision}`
2215
- );
2216
- const fleet = useWorkspaceMachines({
2217
- sessionId: props.session.id,
2218
- pollIntervalMs: MACHINES_SESSION_POLL_MS
2219
- });
2220
- const computeLabel = sessionComputeLabel(t, fleet.machines);
2221
- const loadRetainedScreenshot = useMemo3(
2222
- () => createSessionRetainedScreenshotLoader(
2223
- context.client,
2224
- props.session.workspaceId,
2225
- props.session.id
2226
- ),
2227
- [context.client, props.session.id, props.session.workspaceId]
2228
- );
2229
- const loadRetainedArtifact = useMemo3(
2230
- () => createWorkspaceRetainedArtifactLoader(context.client, props.session.workspaceId),
2231
- [context.client, props.session.workspaceId]
2232
- );
2233
- const loadVideoArtifactPlayback = useMemo3(
2234
- () => createWorkspaceRetainedVideoLoader(context.client, props.session.workspaceId),
2235
- [context.client, props.session.workspaceId]
2236
- );
2237
- const cancelled = isTerminalSessionStatus(props.session.status);
2238
- const readOnlyArchive = sessionReadOnlyArchive(props.session);
2239
- const terminal = cancelled || readOnlyArchive !== null;
2240
- const answerStore = useMemo3(() => browserInteractiveAnswerStore(), []);
2241
- const composerRegionRef = useRef2(null);
2242
- const [composerFocusSignal, setComposerFocusSignal] = useState3(0);
2243
- const focusEvents = useUiEventTarget("window");
2244
- const [modelPickerSession, setModelPickerSession] = useState3(null);
2245
- const [refusedModel, setRefusedModel] = useState3(
2246
- null
2247
- );
2248
- const [creditRefusal, setCreditRefusal] = useState3(null);
2249
- useEffect4(() => {
2250
- const onFocusRequest = (event) => {
2251
- const detail = event.detail;
2252
- if (detail?.workspaceId === props.session.workspaceId && detail.sessionId === props.session.id) {
2253
- setComposerFocusSignal(detail.nonce);
2254
- }
2255
- };
2256
- focusEvents.addEventListener(FOCUS_SESSION_COMPOSER_EVENT, onFocusRequest);
2257
- return () => focusEvents.removeEventListener(FOCUS_SESSION_COMPOSER_EVENT, onFocusRequest);
2258
- }, [focusEvents, props.session.id, props.session.workspaceId]);
2259
- const loadFocusSessionRef = useRef2(null);
2260
- const composerFocusWaitRef = useRef2(null);
2261
- useEffect4(
2262
- () => () => {
2263
- composerFocusWaitRef.current?.cancel();
2264
- composerFocusWaitRef.current = null;
2265
- },
2266
- []
2267
- );
2268
- useEffect4(() => {
2269
- if (composerFocusWaitRef.current && composerFocusWaitRef.current.sessionId !== props.session.id) {
2270
- composerFocusWaitRef.current.cancel();
2271
- composerFocusWaitRef.current = null;
2272
- }
2273
- const intent = consumeSessionComposerFocusIntent(
2274
- focusEvents,
2275
- props.session.workspaceId,
2276
- props.session.id
2277
- );
2278
- const firstRunForChat = loadFocusSessionRef.current !== props.session.id;
2279
- loadFocusSessionRef.current = props.session.id;
2280
- const source = intent?.source ?? (firstRunForChat ? "load" : null);
2281
- if (!source) return;
2282
- if (!sessionComposerFocusIntentIsEligible({
2283
- viewportWidth: globalThis.innerWidth,
2284
- coarsePointer: globalThis.matchMedia?.("(pointer: coarse)").matches ?? false,
2285
- terminal,
2286
- requiresAction: props.session.status === "requires_action",
2287
- pendingHumanInput: props.humanInput.requests.length > 0,
2288
- pendingApproval: props.approvals.length > 0
2289
- })) {
2290
- return;
2291
- }
2292
- composerFocusWaitRef.current?.cancel();
2293
- composerFocusWaitRef.current = {
2294
- sessionId: props.session.id,
2295
- cancel: focusSessionComposerWhenReady({
2296
- textarea: () => composerRegionRef.current?.querySelector("textarea"),
2297
- sessionId: props.session.id,
2298
- source
2299
- })
2300
- };
2301
- }, [
2302
- composerFocusSignal,
2303
- focusEvents,
2304
- props.approvals.length,
2305
- props.humanInput.requests.length,
2306
- props.session.id,
2307
- props.session.status,
2308
- props.session.workspaceId,
2309
- terminal
2310
- ]);
2311
- const agentsSignal = useMemo3(() => sessionAgentsSignal(t, props.agentNodes), [props.agentNodes]);
2312
- const [resumingSubSessions, setResumingSubSessions] = useState3(
2313
- () => /* @__PURE__ */ new Set()
2314
- );
2315
- const onSubSessionResumingChange = useCallback3((sessionId, resuming) => {
2316
- setResumingSubSessions((current) => {
2317
- if (current.has(sessionId) === resuming) return current;
2318
- const next = new Set(current);
2319
- if (resuming) next.add(sessionId);
2320
- else next.delete(sessionId);
2321
- return next;
2322
- });
2323
- }, []);
2324
- const waitingSubSessions = useMemo3(
2325
- () => waitingDescendants(props.agentNodes, resumingSubSessions),
2326
- [props.agentNodes, resumingSubSessions]
2327
- );
2328
- useEffect4(() => {
2329
- if (resumingSubSessions.size === 0) return;
2330
- const live = new Set(waitingSubSessions.map((session) => session.id));
2331
- for (const id of resumingSubSessions) {
2332
- if (!live.has(id)) onSubSessionResumingChange(id, false);
2333
- }
2334
- }, [onSubSessionResumingChange, resumingSubSessions, waitingSubSessions]);
2335
- const codexConnected = modelCatalog.models.some(
2336
- (candidate) => candidate.provider === "codex-subscription" && candidate.credentialReadiness.status === "ready"
2337
- );
2338
- const [voiceActive, setVoiceActive] = useState3(false);
2339
- const onVoiceActiveChange = useCallback3((active) => {
2340
- setVoiceActive(active);
2341
- }, []);
2342
- const [selectedApprovalId, setSelectedApprovalId] = useState3(null);
2343
- const [reviewDetails, setReviewDetails] = useState3(null);
2344
- const loadToolReview = useCallback3(
2345
- (approval) => context.client.getToolActionReview(props.session.workspaceId, props.session.id, approval.id),
2346
- [context.client, props.session.workspaceId, props.session.id]
2347
- );
2348
- const loadRecordedToolReview = useCallback3(
2349
- (id) => context.client.getToolActionReview(props.session.workspaceId, props.session.id, id),
2350
- [context.client, props.session.workspaceId, props.session.id]
2351
- );
2352
- const viewToolReviewDetails = useCallback3(
2353
- (review, path) => setReviewDetails({
2354
- review,
2355
- path,
2356
- origin: document.activeElement?.closest("[data-review-origin]")?.getAttribute("data-review-origin") ?? void 0
2357
- }),
2358
- []
2359
- );
2360
- const loadToolReviewDetails = useCallback3(
2361
- (review, path, offset) => context.client.getToolReviewDetails(props.session.workspaceId, props.session.id, review.id, {
2362
- actionDigest: review.actionDigest,
2363
- path,
2364
- offset
2365
- }),
2366
- [context.client, props.session.workspaceId, props.session.id]
2367
- );
2368
- const [approvalPending, setApprovalPending] = useState3({});
2369
- const [approvalSettled, setApprovalSettled] = useState3({});
2370
- useEffect4(() => {
2371
- if (!approvalsDecidable(props.session.status)) {
2372
- setApprovalPending((current) => Object.keys(current).length ? {} : current);
2373
- setApprovalSettled((current) => Object.keys(current).length ? {} : current);
2374
- }
2375
- }, [props.session.status]);
2376
- useEffect4(() => {
2377
- const waiting = new Set(props.approvals.map(approvalDecisionKey));
2378
- setApprovalSettled((current) => {
2379
- const kept = Object.entries(current).filter(([key]) => waiting.has(key));
2380
- return kept.length === Object.keys(current).length ? current : Object.fromEntries(kept);
2381
- });
2382
- }, [props.approvals]);
2383
- const approvalInFlightRef = useRef2(/* @__PURE__ */ new Set());
2384
- const decideApproval = useCallback3(
2385
- async (approvalId, decision, answer) => {
2386
- const approval = props.approvals.find((candidate) => candidate.id === approvalId);
2387
- const key = approval ? approvalDecisionKey(approval) : approvalId;
2388
- if (approvalInFlightRef.current.has(key) || approvalPending[key] || approvalSettled[key]) {
2389
- return;
2390
- }
2391
- approvalInFlightRef.current.add(key);
2392
- setApprovalPending((current) => ({ ...current, [key]: decision }));
2393
- try {
2394
- await (decision === "approve" ? props.onApprove(approvalId, answer) : props.onReject(approvalId));
2395
- setApprovalSettled((current) => ({
2396
- ...current,
2397
- [key]: decision
2398
- }));
2399
- } finally {
2400
- approvalInFlightRef.current.delete(key);
2401
- setApprovalPending((current) => {
2402
- const next = { ...current };
2403
- delete next[key];
2404
- return next;
2405
- });
2406
- }
2407
- },
2408
- [approvalPending, approvalSettled, props]
2409
- );
2410
- const attachments = useFileAttachments({
2411
- scope: props.session.tenancy?.visibility === "private" || props.session.memoryScope === "user" ? "personal" : "workspace"
2412
- });
2413
- const repositories = useFollowUpRepositories(props.session, props.onConnectGitHubApp);
2414
- const firstPartyToolOptions = firstPartySessionToolOptionsFor(
2415
- clientFirstPartyMcpToolPolicy(context.clientConfig).allowed
2416
- );
2417
- const selectableSessionMcpServers = context.toolMcpServers;
2418
- const selectableToolIds = useMemo3(
2419
- () => selectableSessionMcpServers.map((server) => server.id),
2420
- [selectableSessionMcpServers]
2421
- );
2422
- const policyToolIds = useMemo3(
2423
- () => sessionPolicyPickerIds(props.session, selectableToolIds, context.workspaceDefaultToolIds),
2424
- [context.workspaceDefaultToolIds, props.session, selectableToolIds]
2425
- );
2426
- const [durableToolSelection, setDurableToolSelection] = useState3(() => ({
2427
- mcpServerIds: new Set(policyToolIds),
2428
- firstPartyToolIds: new Set(props.session.firstPartyMcpTools)
2429
- }));
2430
- const [durableToolsSnapshot, setDurableToolsSnapshot] = useState3(props.session);
2431
- const durableToolsSaveInFlight = useRef2(false);
2432
- const [durableToolsHydrated, setDurableToolsHydrated] = useState3(false);
2433
- const durableToolsSessionId = useRef2(props.session.id);
2434
- const [durableToolsSaving, setDurableToolsSaving] = useState3(false);
2435
- const [durableToolsError, setDurableToolsError] = useState3(null);
2436
- const [connectorCustomizingOverride, setConnectorCustomizingOverride] = useState3(
2437
- null
2438
- );
2439
- const runsOn = useSessionRunsOn(props.session.id, props.session.sandboxBackend);
2440
- const machineAccess = currentSessionMachineAccess(
2441
- runsOn.fleet.sessionMachineAccess,
2442
- props.session.activeSandboxId
2443
- );
2444
- const sharedChat = props.session.tenancy?.visibility === "workspace" && !isPersonalWorkspace(
2445
- context.workspaces.find((candidate) => candidate.id === props.session.workspaceId) ?? null,
2446
- context.managedSelfContext
2447
- );
2448
- const showMachineAccess = machineAccess !== null && (!machineAccess.isOwner || sharedChat);
2449
- const connectionAccounts = useConnectionAccounts(
2450
- context.client,
2451
- {
2452
- id: props.session.id,
2453
- workspaceId: props.session.workspaceId,
2454
- selectedIds: [...durableToolSelection.mcpServerIds]
2455
- },
2456
- context.workspaceCapabilityCatalog,
2457
- context.accessContext === null ? null : hasWorkspacePermission(
2458
- context.accessContext,
2459
- props.session.workspaceId,
2460
- "connections:read"
2461
- )
2462
- );
2463
- const chatSendContext = useRef2({
2464
- blocked: null,
2465
- awaitingHuman: false,
2466
- extras: {}
2467
- });
2468
- const readChatSendContext = useCallback3(() => chatSendContext.current, []);
2469
- const runsOnAttach = runsOn.fleet.attach;
2470
- const runsOnPreviousSandboxId = runsOn.fleet.activeSandboxId;
2471
- const runsOnActiveMachineConsent = runsOn.activeMachine && isPersonalMachine(runsOn.activeMachine) && runsOn.activeMachine.sandboxId === props.session.activeSandboxId ? personalMachineUseIntent(props.session.tenancy) : void 0;
2472
- const runsOnCanMessage = context.accessContext === null || context.accessContext === void 0 || hasWorkspacePermission(context.accessContext, props.session.workspaceId, "sessions:control");
2473
- const reloadSessionAfterMachineChange = props.onReloadSession;
2474
- const moveSavedMessage = runsOnAttach;
2475
- const moveRunsOn = useCallback3(
2476
- async (machine) => {
2477
- if (!isPersonalMachine(machine)) {
2478
- if (!await runsOnAttach(machine.sandboxId))
2479
- return "The machine change could not be confirmed. Try refreshing the machine list.";
2480
- await reloadSessionAfterMachineChange();
2481
- return null;
2482
- }
2483
- const result = await moveChatToMachine({
2484
- machine,
2485
- chat: readChatSendContext(),
2486
- canMessage: runsOnCanMessage,
2487
- previousSandboxId: runsOnPreviousSandboxId,
2488
- attach: runsOnAttach,
2489
- sendMessage: (message) => context.client.sendMessage(props.session.workspaceId, props.session.id, message)
2490
- });
2491
- if (result.moved) await reloadSessionAfterMachineChange();
2492
- return result.moved ? null : result.reason ?? "The machine change could not be confirmed. Refresh the machine list and try again.";
2493
- },
2494
- [
2495
- context.client,
2496
- props.session.id,
2497
- props.session.workspaceId,
2498
- reloadSessionAfterMachineChange,
2499
- readChatSendContext,
2500
- runsOnAttach,
2501
- runsOnCanMessage,
2502
- runsOnPreviousSandboxId
2503
- ]
2504
- );
2505
- const sessionResourcesKey = stableJson(props.session.resources);
2506
- const stableSessionResources = useMemo3(() => props.session.resources, [sessionResourcesKey]);
2507
- const reloadSessionAfterSetup = props.onReloadSession;
2508
- const refreshConnectionAccounts = connectionAccounts.refresh;
2509
- const afterConnectionSetup = useCallback3(async () => {
2510
- await reloadSessionAfterSetup();
2511
- await refreshConnectionAccounts();
2512
- }, [reloadSessionAfterSetup, refreshConnectionAccounts]);
2513
- const renderAuthNeeded = useCallback3(
2514
- (item) => {
2515
- const recommendation = item.setupRequest ? item : sessionAuthRecommendation(t, item, context.workspaceCapabilityCatalog);
2516
- return recommendation ? /* @__PURE__ */ jsx(
2517
- Suspense,
2518
- {
2519
- fallback: /* @__PURE__ */ jsx("p", { role: "status", className: "text-sm text-fg-muted", children: "Loading connection card\u2026" }),
2520
- children: /* @__PURE__ */ jsx(
2521
- SessionCapabilityCard,
2522
- {
2523
- item: recommendation,
2524
- workspaceId: props.session.workspaceId,
2525
- sessionId: props.session.id,
2526
- visibility: props.session.tenancy?.visibility ?? "workspace",
2527
- resources: stableSessionResources,
2528
- sendContext: readChatSendContext,
2529
- onConfigured: afterConnectionSetup
2530
- },
2531
- `${props.session.id}:${props.session.tenancy?.authorityEpoch}:${item.id}`
2532
- )
2533
- }
2534
- ) : void 0;
2535
- },
2536
- [
2537
- context.workspaceCapabilityCatalog,
2538
- props.session.id,
2539
- props.session.workspaceId,
2540
- props.session.tenancy?.visibility,
2541
- props.session.tenancy?.authorityEpoch,
2542
- stableSessionResources,
2543
- readChatSendContext,
2544
- afterConnectionSetup
2545
- ]
2546
- );
2547
- const launch = props.launch ?? EMPTY_COMPOSER_LAUNCH;
2548
- const launchModel = launch.model;
2549
- const launchEffort = launch.effort;
2550
- const launchLatency = launch.latency;
2551
- const launchRealtime = launch.realtime;
2552
- const launchKey = composerLaunchSearchKey(launch);
2553
- const appliedLaunchKeyRef = useRef2(null);
2554
- useEffect4(() => {
2555
- if (durableToolsSessionId.current !== props.session.id) {
2556
- durableToolsSessionId.current = props.session.id;
2557
- setDurableToolsSnapshot(props.session);
2558
- setDurableToolsHydrated(false);
2559
- setConnectorCustomizingOverride(null);
2560
- return;
2561
- }
2562
- if (!context.workspaceMcpCatalogReady) {
2563
- setDurableToolsHydrated(false);
2564
- return;
2565
- }
2566
- if (durableToolsSaving) return;
2567
- const snapshot = props.session.toolPolicyVersion > durableToolsSnapshot.toolPolicyVersion ? props.session : durableToolsSnapshot;
2568
- if (snapshot !== durableToolsSnapshot) setDurableToolsSnapshot(snapshot);
2569
- const nextMcpIds = sessionPolicyPickerIds(
2570
- snapshot,
2571
- selectableToolIds,
2572
- context.workspaceDefaultToolIds
2573
- );
2574
- const nextFirstPartyIds = new Set(snapshot.firstPartyMcpTools);
2575
- setDurableToolSelection(
2576
- (current) => current.mcpServerIds.size === nextMcpIds.size && [...nextMcpIds].every((id) => current.mcpServerIds.has(id)) && current.firstPartyToolIds.size === nextFirstPartyIds.size && [...nextFirstPartyIds].every((id) => current.firstPartyToolIds.has(id)) ? current : { mcpServerIds: nextMcpIds, firstPartyToolIds: nextFirstPartyIds }
2577
- );
2578
- setDurableToolsHydrated(true);
2579
- }, [
2580
- context.workspaceMcpCatalogReady,
2581
- context.workspaceDefaultToolIds,
2582
- selectableToolIds,
2583
- durableToolsSaving,
2584
- durableToolsSnapshot,
2585
- props.session
2586
- ]);
2587
- const connectorCustomizing = connectorCustomizingOverride ?? sessionConnectorPolicyIsCustomized(durableToolsSnapshot);
2588
- const applyDurableToolPolicy = useCallback3(
2589
- async (request, optimistic) => {
2590
- if (durableToolsSaveInFlight.current) return;
2591
- durableToolsSaveInFlight.current = true;
2592
- const targetSessionId = props.session.id;
2593
- if (optimistic) setDurableToolSelection(optimistic);
2594
- setDurableToolsSaving(true);
2595
- setDurableToolsError(null);
2596
- try {
2597
- const updated = await context.client.updateSessionToolPolicy(
2598
- props.session.workspaceId,
2599
- targetSessionId,
2600
- request
2601
- );
2602
- if (durableToolsSessionId.current !== targetSessionId) return;
2603
- setDurableToolSelection({
2604
- mcpServerIds: sessionPolicyPickerIds(
2605
- updated,
2606
- selectableToolIds,
2607
- context.workspaceDefaultToolIds
2608
- ),
2609
- firstPartyToolIds: new Set(updated.firstPartyMcpTools)
2610
- });
2611
- setDurableToolsSnapshot(updated);
2612
- setConnectorCustomizingOverride((current) => current === true ? true : null);
2613
- } catch (error) {
2614
- const message = userErrorText(error);
2615
- setDurableToolsError(message);
2616
- toast.error("Couldn't save session tools", { description: message });
2617
- try {
2618
- const refreshed = await context.client.getSession(
2619
- props.session.workspaceId,
2620
- props.session.id
2621
- );
2622
- if (durableToolsSessionId.current !== targetSessionId) return;
2623
- setDurableToolSelection({
2624
- mcpServerIds: sessionPolicyPickerIds(
2625
- refreshed,
2626
- selectableToolIds,
2627
- context.workspaceDefaultToolIds
2628
- ),
2629
- firstPartyToolIds: new Set(refreshed.firstPartyMcpTools)
2630
- });
2631
- setDurableToolsSnapshot(refreshed);
2632
- setConnectorCustomizingOverride((current) => current === true ? true : null);
2633
- } catch {
2634
- if (durableToolsSessionId.current === targetSessionId) {
2635
- setDurableToolSelection({
2636
- mcpServerIds: sessionPolicyPickerIds(
2637
- durableToolsSnapshot,
2638
- selectableToolIds,
2639
- context.workspaceDefaultToolIds
2640
- ),
2641
- firstPartyToolIds: new Set(durableToolsSnapshot.firstPartyMcpTools)
2642
- });
2643
- }
2644
- }
2645
- } finally {
2646
- durableToolsSaveInFlight.current = false;
2647
- setDurableToolsSaving(false);
2648
- }
2649
- },
2650
- [
2651
- context.client,
2652
- context.workspaceDefaultToolIds,
2653
- durableToolsSnapshot,
2654
- props.session.id,
2655
- props.session.workspaceId,
2656
- selectableToolIds
2657
- ]
2658
- );
2659
- const saveDurableToolPolicy = useCallback3(
2660
- async (next) => {
2661
- await applyDurableToolPolicy(
2662
- connectorSelectionUpdate(
2663
- durableToolsSnapshot,
2664
- durableToolSelection.mcpServerIds,
2665
- next.mcpServerIds,
2666
- context.workspaceDefaultToolIds
2667
- ),
2668
- {
2669
- mcpServerIds: new Set(next.mcpServerIds),
2670
- firstPartyToolIds: new Set(next.firstPartyToolIds)
2671
- }
2672
- );
2673
- },
2674
- [
2675
- applyDurableToolPolicy,
2676
- context.workspaceDefaultToolIds,
2677
- durableToolsSnapshot,
2678
- durableToolSelection
2679
- ]
2680
- );
2681
- const sendGate = useSessionSendGate();
2682
- const workspace = context.workspaces.find((candidate) => candidate.id === props.session.workspaceId) ?? null;
2683
- const loadSkillReview = useCallback3(
2684
- (reference) => context.client.readWorkspaceSkill(
2685
- props.session.workspaceId,
2686
- reference.skillId,
2687
- reference.revisionId
2688
- ),
2689
- // A browser-account switch must discard the previous actor's loaded preview
2690
- // even when the SDK client instance and workspace remain unchanged.
2691
- // eslint-disable-next-line react-hooks/exhaustive-deps
2692
- [context.client, props.session.workspaceId, context.accessContext.subjectId]
2693
- );
2694
- const fixedResourceCatalogEnabled = props.session.sandboxBackend !== "selfhosted";
2695
- const fixedRigScope = useFixedRigScope(
2696
- context.client,
2697
- workspace?.id ?? null,
2698
- props.session.rigId,
2699
- fixedResourceCatalogEnabled && hasWorkspacePermission(context.accessContext, props.session.workspaceId, "rigs:use")
2700
- );
2701
- const personalAttachment = usePersonalResourceAttachment({
2702
- client: context.client,
2703
- authMode: context.clientConfig.auth.mode,
2704
- authSession: context.authSession,
2705
- accessSubjectId: context.accessContext.subjectId,
2706
- accessContext: context.accessContext,
2707
- managedSelfContext: context.managedSelfContext,
2708
- workspace,
2709
- session: props.session,
2710
- enabled: props.session.sandboxBackend !== "selfhosted",
2711
- fixed: {
2712
- rigId: props.session.rigId,
2713
- rigScope: fixedRigScope,
2714
- connectedMachine: null
2715
- },
2716
- personalWorkspaceTarget: isPersonalWorkspace(workspace, context.managedSelfContext),
2717
- onReloadSession: props.onReloadSession
2718
- });
2719
- const sendState = {
2720
- uploadPending: attachments.hasUnresolved,
2721
- repositoryError: repositories.error,
2722
- personalDecision: personalAttachment.requiresDecision || connectionAccounts.requiresAccountChoice,
2723
- machineAccessDenied: machineAccess !== null && !machineAccess.isOwner,
2724
- loading: durableToolsSaving || durableToolsSaveInFlight.current || !durableToolsHydrated || personalAttachment.loading || personalAttachment.refreshing || connectionAccounts.loading,
2725
- loadFailed: connectionAccounts.error !== null
2726
- };
2727
- const composerSendBlocker = () => sendGate.blocker(sendState);
2728
- const workspaceAccountId = context.workspaces.find(
2729
- (candidate) => candidate.id === props.session.workspaceId
2730
- )?.accountId;
2731
- const canBuyCredits = context.clientConfig.billingMode === "stripe" && Boolean(workspaceAccountId) && hasAccountPermission(context.accessContext, workspaceAccountId ?? "", "billing:manage");
2732
- const composer = useComposer(props.session.id, {
2733
- canBuyCredits,
2734
- events: props.events,
2735
- sendExtras: () => ({
2736
- ...withHostMessageContext(hostMessageContext, props.messageContext),
2737
- resources: [...attachments.readyResources, ...repositories.pendingResources],
2738
- connectionAccounts: [
2739
- ...connectionAccounts.selections,
2740
- ...repositories.pendingResources.some(
2741
- (resource) => resource.kind === "repository" && resource.connectionType === "github_personal"
2742
- ) && context.personalGitHubAuthority ? [context.personalGitHubAuthority] : []
2743
- ],
2744
- ...personalAttachment.intent ? { personalResourceAttachment: personalAttachment.intent } : runsOnActiveMachineConsent ? { personalResourceAttachment: runsOnActiveMachineConsent } : {}
2745
- }),
2746
- sendBlocked: () => composerSendBlocker() !== null,
2747
- effectiveControl: props.queue.effectiveControl ?? props.session.effectiveControl,
2748
- sendDestination: () => promptSendDestination({
2749
- status: props.session.status,
2750
- activeTurnId: props.session.activeTurnId,
2751
- queuedPrompts: props.queue.queue.length,
2752
- admissionBlock: props.session.admissionBlock
2753
- }),
2754
- busySend: resolveWorkspaceBusySend(workspace?.settings),
2755
- ...props.initialDraft ? { initialDraft: props.initialDraft } : {},
2756
- // The console always offers the other choice beside Send.
2757
- offerQueue: true,
2758
- // Ordinary Send is acknowledged locally. Clear only resources captured in
2759
- // that immutable optimistic operation; later additions belong to the next
2760
- // draft, while retry keeps the original resource refs in the failed bubble.
2761
- onSubmitted: (_text, input) => {
2762
- noteTurnFailureAction("send_message");
2763
- attachments.removeReadyFiles(
2764
- (input.resources ?? []).flatMap(
2765
- (resource) => resource.kind === "file" ? [resource.fileId] : []
2766
- )
2767
- );
2768
- repositories.commitSent(input.resources ?? []);
2769
- },
2770
- // Steer and recovered sends do not pass through onSubmitted. Keep the
2771
- // host-owned upload/repository queue in sync once those inputs are
2772
- // accepted too; the immutable input snapshot preserves later additions.
2773
- onSent: (_text, input) => {
2774
- setCreditRefusal(null);
2775
- attachments.removeReadyFiles(
2776
- (input.resources ?? []).flatMap(
2777
- (resource) => resource.kind === "file" ? [resource.fileId] : []
2778
- )
2779
- );
2780
- repositories.commitSent(input.resources ?? []);
2781
- personalAttachment.onAccepted(input);
2782
- },
2783
- onDeliveryError: (error, input, delivery) => {
2784
- personalAttachment.onDeliveryError(error, input, delivery);
2785
- connectionAccounts.onSelectionError(error);
2786
- if (isModelUnavailableSubmissionError(error)) {
2787
- const refused = refusedModelId(error, input);
2788
- if (refused) setRefusedModel({ sessionId: props.session.id, model: refused });
2789
- void modelCatalog.refresh();
2790
- setModelPickerSession(props.session.id);
2791
- }
2792
- const refusal = creditRefusalRecord(
2793
- error,
2794
- { sessionId: props.session.id },
2795
- refusedModelId(error, input) ?? props.session.model
2796
- );
2797
- if (refusal) {
2798
- setCreditRefusal(refusal);
2799
- void modelCatalog.refresh();
2800
- }
2801
- }
2802
- });
2803
- const composerView = useComposerWithStreamState(
2804
- composer,
2805
- props.connectionState,
2806
- props.initialLoading
2807
- );
2808
- const queuedRecall = useQueuedPromptRecall({
2809
- queue: props.queue,
2810
- composer,
2811
- subjectId: context.accessContext.subjectId,
2812
- enabled: !terminal
2813
- });
2814
- useBrowserAccountBridgeBlocker(`session-composer:${props.session.id}`, () => {
2815
- if (attachments.hasUnresolved) {
2816
- return {
2817
- id: "ignored",
2818
- label: "A file upload is not settled",
2819
- detail: "Wait for the upload or remove it before changing accounts."
2820
- };
2821
- }
2822
- if (composer.sending || composer.draftSaving || durableToolsSaving) {
2823
- return {
2824
- id: "ignored",
2825
- label: "A session mutation is still running",
2826
- detail: "Wait for the current save or send to finish."
2827
- };
2828
- }
2829
- return composer.hasDraftContent() ? {
2830
- id: "ignored",
2831
- label: "This session has an unsent draft",
2832
- detail: "Continuing clears the account-bound composer state."
2833
- } : null;
2834
- });
2835
- chatSendContext.current = {
2836
- blocked: isTerminalSessionStatus(props.session.status) ? "This chat has ended. Start a new chat to use a repository." : sessionReadOnlyArchive(props.session) ? "This chat is archived. Continue in a new chat to use a repository." : connectionAccounts.requiresAccountChoice ? "Choose an account for this chat's connected tools in the composer first." : personalAttachment.requiresDecision ? "Finish the personal access choice in the composer first." : null,
2837
- awaitingHuman: props.session.status === "requires_action" && !sessionAdmissionBlocked(props.session),
2838
- // Moving the chat onto the person's own machine turns it on in this workspace.
2839
- personalMachineIntent: personalMachineUseIntent(props.session.tenancy, "always"),
2840
- extras: {
2841
- ...composer.sendPolicy ?? {},
2842
- ...(props.queue.effectiveControl ?? props.session.effectiveControl)?.controlEtag ? {
2843
- controlEtag: (props.queue.effectiveControl ?? props.session.effectiveControl).controlEtag
2844
- } : {},
2845
- ...connectionAccounts.selections.length > 0 ? { connectionAccounts: connectionAccounts.selections } : {}
2846
- }
2847
- };
2848
- const composerPolicy = composer.policy;
2849
- const [retryOperation, setRetryOperation] = useState3(null);
2850
- const pendingRetryInput = retryOperation?.failureEventId === props.failure?.failureEventId ? retryOperation : null;
2851
- const failureTurnId = props.session.failureDiagnostics?.eventId === props.failure?.failureEventId ? props.session.failureDiagnostics?.turnId : props.events.find((event) => event.id === props.failure?.failureEventId)?.turnId;
2852
- const retryHasRetainedTurn = Boolean(failureTurnId);
2853
- const retryFailedSession = useMemo3(
2854
- () => createFailedSessionRetry(
2855
- (input) => context.client.retrySession(props.session.workspaceId, props.session.id, input),
2856
- setRetryOperation
2857
- ),
2858
- [context.client, props.session.workspaceId, props.session.id]
2859
- );
2860
- const composerDraftLoading = composer.draftLoading;
2861
- const setComposerModel = composer.setModel;
2862
- const setComposerReasoningEffort = composer.setReasoningEffort;
2863
- const setComposerLatencyMode = composer.setLatencyMode;
2864
- const hasComposerPolicy = composerPolicy !== null;
2865
- const modelPickerDisabled = composer.sending || composer.draftLoading || !hasComposerPolicy || Boolean(pendingRetryInput);
2866
- const canChooseRecoveryModel = !modelPickerDisabled;
2867
- const stopRefusal = props.creditExhausted ? props.creditRefusal : null;
2868
- const creditGap = props.creditExhausted && !stopRefusal ? freeCreditGap(modelCatalog.rows, props.session.model, {
2869
- selectedModel: composerPolicy?.model,
2870
- preferredModel: modelCatalog.defaultSelection?.model
2871
- }) : null;
2872
- const failureFallback = props.failure ? /* @__PURE__ */ jsx("div", { role: "alert", className: cn("mx-auto my-2 w-full max-w-3xl text-sm text-fg-muted", gutter), children: failureFallbackReason(
2873
- failedSessionCopy(
2874
- props.failure,
2875
- props.creditExhausted && !props.failure.structuralSandboxFailure,
2876
- Boolean(composerPolicy && composerPolicy.model !== props.session.model),
2877
- canChooseRecoveryModel && !props.failure.structuralSandboxFailure,
2878
- creditGap,
2879
- stopRefusal
2880
- ),
2881
- canBuyCredits
2882
- ) }) : null;
2883
- const model = composerPolicy?.model ?? props.session.model;
2884
- const reasoningEffort = composerPolicy?.reasoningEffort ?? props.session.reasoningEffort;
2885
- const latencyMode = composerPolicy?.latencyMode ?? props.session.latencyMode;
2886
- const selectedPolicyRow = findPickerRow(modelCatalog.rows, model);
2887
- const chooseCoveredModel = (id) => {
2888
- const row = findPickerRow(modelCatalog.rows, id);
2889
- const choice = row && !modelPickerDisabled ? coveredModelChoice(row, reasoningEffort, latencyMode) : null;
2890
- if (!choice) return;
2891
- setComposerModel(choice.model);
2892
- setComposerReasoningEffort(choice.effort);
2893
- if (choice.latencyMode !== null) setComposerLatencyMode(choice.latencyMode);
2894
- };
2895
- const matchesFrozenSessionPolicy = Boolean(
2896
- composerPolicy && composerPolicy.model === props.session.model && composerPolicy.reasoningEffort === props.session.reasoningEffort && composerPolicy.latencyMode === props.session.latencyMode
2897
- );
2898
- const catalogComboValid = Boolean(
2899
- selectedPolicyRow?.selectable && effortOptionsForModel(selectedPolicyRow.catalog).includes(reasoningEffort) && (latencyMode === "standard" || runnableLatencyModesForModel(selectedPolicyRow.catalog).includes(latencyMode))
2900
- );
2901
- const refusedSessionModel = refusedModel?.sessionId === props.session.id ? refusedModel.model : null;
2902
- const composerModelUnavailable = model === refusedSessionModel || sessionModelMissingFromCatalog({
2903
- model,
2904
- models: modelCatalog.models,
2905
- error: modelCatalog.error
2906
- });
2907
- const sessionModelUnavailable = props.session.model === refusedSessionModel || sessionModelMissingFromCatalog({
2908
- model: props.session.model,
2909
- models: modelCatalog.models,
2910
- error: modelCatalog.error
2911
- });
2912
- const canControlSession = Boolean(
2913
- context.accessContext.workspaceGrants.find((grant) => grant.workspaceId === props.session.workspaceId)?.permissions.includes("sessions:control")
2914
- );
2915
- const composerPolicyValid = Boolean(
2916
- composerPolicy && (catalogComboValid || matchesFrozenSessionPolicy && !composerModelUnavailable)
2917
- );
2918
- const noRunnableModel = !modelCatalog.loading && modelCatalog.rows.length > 0 && !modelCatalog.rows.some((row) => row.selectable);
2919
- const composerPolicyError = composerPolicy && !modelCatalog.loading && !composerPolicyValid && !noRunnableModel ? composerModelUnavailable ? "This model is no longer available. Select a different model to continue." : "Choose a model, reasoning level, and speed supported by this session." : null;
2920
- const unavailableReplacement = useMemo3(
2921
- () => composerModelUnavailable || sessionModelUnavailable ? unavailableModelReplacement({
2922
- rows: modelCatalog.rows,
2923
- defaultSelection: modelCatalog.defaultSelection,
2924
- latencyMode
2925
- }) : null,
2926
- [
2927
- composerModelUnavailable,
2928
- sessionModelUnavailable,
2929
- modelCatalog.rows,
2930
- modelCatalog.defaultSelection,
2931
- latencyMode
2932
- ]
2933
- );
2934
- const replacesUnavailableModel = Boolean(
2935
- composerModelUnavailable && unavailableReplacement && !composerDraftLoading && hasComposerPolicy && !modelPickerDisabled && !terminal && // A failed session keeps its model until the person chooses: the
2936
- // failure banner's Retry re-runs that turn with the composer's model.
2937
- canControlSession && !props.failure
2938
- );
2939
- useEffect4(() => {
2940
- if (!replacesUnavailableModel || !unavailableReplacement) return;
2941
- setComposerModel(unavailableReplacement.model);
2942
- setComposerReasoningEffort(unavailableReplacement.reasoningEffort);
2943
- if (unavailableReplacement.latencyMode) {
2944
- setComposerLatencyMode(unavailableReplacement.latencyMode);
2945
- }
2946
- }, [
2947
- replacesUnavailableModel,
2948
- setComposerLatencyMode,
2949
- setComposerModel,
2950
- setComposerReasoningEffort,
2951
- unavailableReplacement
2952
- ]);
2953
- const composerDelivery = useSessionComposerDelivery(composerView, sendGate, {
2954
- policyValid: composerPolicyValid,
2955
- catalogLoading: modelCatalog.loading,
2956
- replacingModel: replacesUnavailableModel,
2957
- send: sendState
2958
- });
2959
- const unavailableModelNotice = (sessionModelUnavailable || composerModelUnavailable) && !terminal ? /* @__PURE__ */ jsx(
2960
- UnavailableModelNotice,
2961
- {
2962
- modelName: unavailableModelName(sessionModelUnavailable ? props.session.model : model),
2963
- replacementLabel: composerModelUnavailable ? null : selectedPolicyRow?.label ?? null
2964
- }
2965
- ) : null;
2966
- useEffect4(() => {
2967
- if (!launchKey || appliedLaunchKeyRef.current === launchKey || composerDraftLoading || !hasComposerPolicy) {
2968
- return;
2969
- }
2970
- const hasPolicy = Boolean(launchModel || launchEffort || launchLatency);
2971
- appliedLaunchKeyRef.current = launchKey;
2972
- if (!hasPolicy) return;
2973
- if (launchModel) setComposerModel(launchModel);
2974
- if (launchEffort) setComposerReasoningEffort(launchEffort);
2975
- if (launchLatency) setComposerLatencyMode(launchLatency);
2976
- void navigate({
2977
- to: "/workspaces/$workspaceId/sessions/$sessionId",
2978
- params: {
2979
- workspaceId: props.session.workspaceId,
2980
- sessionId: props.session.id
2981
- },
2982
- search: composerLaunchSearchAfterPolicyApply({
2983
- model: launchModel,
2984
- effort: launchEffort,
2985
- latency: launchLatency,
2986
- realtime: launchRealtime
2987
- }),
2988
- replace: true
2989
- });
2990
- }, [
2991
- composerDraftLoading,
2992
- hasComposerPolicy,
2993
- launchEffort,
2994
- launchKey,
2995
- launchLatency,
2996
- launchModel,
2997
- launchRealtime,
2998
- navigate,
2999
- props.session.id,
3000
- props.session.workspaceId,
3001
- setComposerLatencyMode,
3002
- setComposerModel,
3003
- setComposerReasoningEffort
3004
- ]);
3005
- const acceptedClientEventIds = useMemo3(
3006
- () => new Set(
3007
- props.events.filter((event) => event.type === "user.message" && event.clientEventId).map((event) => event.clientEventId)
3008
- ),
3009
- [props.events]
3010
- );
3011
- const {
3012
- optimisticMessages,
3013
- retryOptimisticMessage,
3014
- restoreOptimisticMessage,
3015
- removeOptimisticMessage
3016
- } = composer;
3017
- const failedOptimisticMessageCount = (optimisticMessages ?? []).filter(
3018
- (message) => message.state === "failed" && !acceptedClientEventIds.has(message.clientEventId)
3019
- ).length;
3020
- useEffect4(() => {
3021
- updateLocalSessionDeliveryAttention({
3022
- workspaceId: props.session.workspaceId,
3023
- sessionId: props.session.id,
3024
- failedMessageCount: failedOptimisticMessageCount
3025
- });
3026
- }, [failedOptimisticMessageCount, props.session.id, props.session.workspaceId]);
3027
- const usageLimitCapability = sessionUsageLimitCapability(context.clientConfig);
3028
- const usageLimitTreeActive = props.session.status === "running" || lineageHasRunningSession(props.agentNodes);
3029
- const usageLimit = useSessionUsageLimit({
3030
- client: context.client,
3031
- workspaceId: props.session.workspaceId,
3032
- sessionId: props.session.id,
3033
- initial: props.session.usageLimit,
3034
- enabled: usageLimitCapability !== "absent",
3035
- live: {
3036
- events: props.events,
3037
- active: usageLimitTreeActive,
3038
- watch: props.agentNodes.length > 0,
3039
- connectionState: props.connectionState
3040
- }
3041
- });
3042
- const refusedUsageLimitSendIds = (optimisticMessages ?? []).filter(
3043
- (message) => message.state === "failed" && message.error !== void 0 && !acceptedClientEventIds.has(message.clientEventId) && isSessionUsageLimitSubmissionError(new Error(message.error))
3044
- ).map((message) => message.clientEventId).join(",");
3045
- const composerUsageLimitError = composer.error instanceof OpenGeniSessionUsageLimitReachedError ? composer.error : null;
3046
- const [usageLimitRefusalPending, setUsageLimitRefusalPending] = useState3(false);
3047
- const refreshUsageLimit = usageLimit.refresh;
3048
- useEffect4(() => {
3049
- if (!refusedUsageLimitSendIds && !composerUsageLimitError) return;
3050
- setUsageLimitRefusalPending(true);
3051
- void refreshUsageLimit().finally(() => setUsageLimitRefusalPending(false));
3052
- }, [composerUsageLimitError, refreshUsageLimit, refusedUsageLimitSendIds]);
3053
- const usageLimitRefusal = usageLimitRefusalFromState({
3054
- pending: usageLimitRefusalPending,
3055
- error: composerUsageLimitError,
3056
- usage: usageLimit.usage
3057
- });
3058
- const usageLimitChild = Boolean(props.session.parentSessionId) || usageLimit.usage?.inherited === true;
3059
- const usageLimitRootId = usageLimit.usage?.rootSessionId ?? null;
3060
- const usageLimitNotice = usageLimitCapability !== "absent" && !terminal ? /* @__PURE__ */ jsx(
3061
- SessionUsageLimitNotice,
3062
- {
3063
- usage: usageLimit.usage,
3064
- stale: usageLimit.error !== null && usageLimit.usage !== null,
3065
- refusal: usageLimitRefusal,
3066
- onChangeLimit: !usageLimitChild && canControlSession ? props.onOpenUsageLimit : void 0,
3067
- mainTaskHref: usageLimitChild && usageLimitRootId ? `/workspaces/${props.session.workspaceId}/sessions/${usageLimitRootId}` : void 0,
3068
- goalPaused: props.goal.goal?.pausedReason === SESSION_USAGE_LIMIT_GOAL_PAUSED_REASON,
3069
- dismissStorageKey: `opengeni:${props.session.workspaceId}`
3070
- }
3071
- ) : null;
3072
- const timelineWithOptimisticSends = useMemo3(() => {
3073
- return conversationTimeline(
3074
- props.timeline,
3075
- {
3076
- queue: props.queue.queue,
3077
- snapshot: props.queue.snapshot,
3078
- acceptedSteers: props.queue.acceptedSteers
3079
- },
3080
- {
3081
- optimisticMessages,
3082
- retryOptimisticMessage,
3083
- restoreOptimisticMessage,
3084
- removeOptimisticMessage
3085
- }
3086
- );
3087
- }, [
3088
- optimisticMessages,
3089
- removeOptimisticMessage,
3090
- props.queue.acceptedSteers,
3091
- props.queue.queue,
3092
- props.queue.snapshot,
3093
- props.timeline,
3094
- retryOptimisticMessage,
3095
- restoreOptimisticMessage
3096
- ]);
3097
- const repositoryPickerProps = repositories.pickerProps(terminal || composer.sending);
3098
- const admissionControl = admissionRecheckControl(
3099
- props.admissionSessionControl,
3100
- props.queue.effectiveControl,
3101
- composer.effectiveControl
3102
- );
3103
- const admissionRefreshRequired = admissionControlNeedsRefresh(
3104
- admissionControl,
3105
- props.admissionSessionControl,
3106
- props.queue.effectiveControl,
3107
- composer.effectiveControl
3108
- );
3109
- const timelineWithStartup = useSessionStartupTimeline(timelineWithOptimisticSends, {
3110
- session: { ...props.session, effectiveControl: admissionControl },
3111
- events: props.events,
3112
- optimisticMessages,
3113
- hasNewer: props.hasNewer,
3114
- queue: props.queue.snapshot
3115
- });
3116
- const timelineEmptyStateCopy = sessionTimelineEmptyStateCopy(
3117
- sessionDisplayStatus(props.session),
3118
- (props.queue.effectiveControl ?? props.session.effectiveControl).state === "paused"
3119
- );
3120
- const workspacePermissions = useMemo3(
3121
- () => context.accessContext.workspaceGrants.find(
3122
- (grant) => grant.workspaceId === props.session.workspaceId
3123
- )?.permissions ?? [],
3124
- [context.accessContext.workspaceGrants, props.session.workspaceId]
3125
- );
3126
- const codexUsageBlocked = isCodexProductModel(props.session.model) && (props.session.status === "waiting_capacity" || (props.session.status === "failed" ? isCodexUsageLimitFailure(props.failure?.failureCode) : props.session.status === "idle" && latestTurnFailedOnUsageLimit(props.events)));
3127
- const codexUsageChoices = codexUsageBlocked && workspacePermissions.includes("sessions:control");
3128
- const codexUsageResetsAtValue = useMemo3(
3129
- () => codexUsageChoices ? codexUsageResetsAt(props.events) : null,
3130
- [codexUsageChoices, props.events]
3131
- );
3132
- const [usageContinuationState, setUsageContinuation] = useState3(null);
3133
- const usageContinuationInFlight = useRef2(false);
3134
- const usageContinuation = usageContinuationState?.sessionId === props.session.id ? usageContinuationState : null;
3135
- const remoteV2Chat = props.session.codexCompactionMode === "remote_v2";
3136
- const loadedCheckpointIsCompaction = useMemo3(
3137
- () => remoteV2Chat ? latestCheckpointIsCompaction(props.events) : null,
3138
- [remoteV2Chat, props.events]
3139
- );
3140
- const [fetchedCodexCompaction, setFetchedCodexCompaction] = useState3(null);
3141
- useEffect4(() => {
3142
- if (!remoteV2Chat || loadedCheckpointIsCompaction !== null) return;
3143
- let stale = false;
3144
- const sessionId = props.session.id;
3145
- context.client.listEvents(props.session.workspaceId, sessionId, {
3146
- includeTypes: CONTEXT_CHECKPOINT_EVENT_TYPES,
3147
- // Newest first: only the latest checkpoint matters.
3148
- direction: "before",
3149
- limit: 20,
3150
- payloadMode: "none"
3151
- }).then((events) => {
3152
- if (!stale)
3153
- setFetchedCodexCompaction({
3154
- sessionId,
3155
- compacted: latestCheckpointIsCompaction(events) === true
3156
- });
3157
- }).catch(() => void 0);
3158
- return () => {
3159
- stale = true;
3160
- };
3161
- }, [
3162
- context.client,
3163
- loadedCheckpointIsCompaction,
3164
- props.session.id,
3165
- props.session.workspaceId,
3166
- remoteV2Chat
3167
- ]);
3168
- const codexCompacted = loadedCheckpointIsCompaction ?? (fetchedCodexCompaction?.sessionId === props.session.id && fetchedCodexCompaction.compacted);
3169
- const switchHeadsUp = (target, label) => needsModelSwitchHeadsUp({
3170
- codexCompactionMode: props.session.codexCompactionMode,
3171
- codexCompacted,
3172
- model: target
3173
- }) ? modelSwitchHeadsUpText(label) : null;
3174
- const continueAfterUsageLimit = async (policy, options = {}) => {
3175
- if (usageContinuationInFlight.current) return;
3176
- usageContinuationInFlight.current = true;
3177
- const sessionId = props.session.id;
3178
- setUsageContinuation({ sessionId, pending: true, error: null });
3179
- let error = null;
3180
- try {
3181
- if (options.resumeFirst)
3182
- await context.client.resumeSession(props.session.workspaceId, sessionId, {
3183
- clientEventId: crypto.randomUUID(),
3184
- // Never undo a pause made after this page last read the control.
3185
- expectedControlEtag: admissionControl.controlEtag
3186
- });
3187
- if (props.session.status === "failed" && props.failure?.failureEventId && retryHasRetainedTurn) {
3188
- await retryFailedSession(props.failure.failureEventId, policy);
3189
- } else {
3190
- const chat = readChatSendContext();
3191
- if (chat.blocked) error = chat.blocked;
3192
- else {
3193
- const message = {
3194
- text: "Continue",
3195
- ...chat.extras,
3196
- ...policy,
3197
- clientEventId: crypto.randomUUID()
3198
- };
3199
- if (props.session.status === "waiting_capacity")
3200
- await context.client.steerMessage(props.session.workspaceId, sessionId, message);
3201
- else await context.client.sendMessage(props.session.workspaceId, sessionId, message);
3202
- }
3203
- }
3204
- } catch (failure) {
3205
- error = userErrorText(failure, "Try again.");
3206
- } finally {
3207
- usageContinuationInFlight.current = false;
3208
- setUsageContinuation({ sessionId, pending: false, error });
3209
- await Promise.allSettled([props.onReloadSession(), props.queue.refresh()]);
3210
- }
3211
- };
3212
- const usagePaused = admissionControl.state === "paused";
3213
- const continueAtReset = codexUsageContinuesAtReset({
3214
- status: props.session.status,
3215
- paused: usagePaused
3216
- });
3217
- const setContinueAtReset = (next) => {
3218
- const action = codexUsageContinueAtResetAction({
3219
- status: props.session.status,
3220
- paused: usagePaused,
3221
- next
3222
- });
3223
- if (action === "pause") void composer.pause();
3224
- else if (action === "resume") void composer.resume();
3225
- else if (action === "run_on_codex" || action === "resume_and_run_on_codex")
3226
- void continueAfterUsageLimit(
3227
- {
3228
- model: props.session.model,
3229
- reasoningEffort: props.session.reasoningEffort,
3230
- latencyMode: props.session.latencyMode
3231
- },
3232
- { resumeFirst: action === "resume_and_run_on_codex" }
3233
- );
3234
- };
3235
- const usageModelSwitch = useCodexUsageModelSwitch({
3236
- sessionId: props.session.id,
3237
- sessionModel: props.session.model,
3238
- composerModel: model,
3239
- enabled: codexUsageChoices,
3240
- closePicker: () => setModelPickerSession(null),
3241
- onContinue: (picked) => void continueAfterUsageLimit(
3242
- { model: picked, reasoningEffort, latencyMode },
3243
- // A Steer resumes a paused waiting chat itself; resuming first would
3244
- // wake its Codex wait for nothing.
3245
- { resumeFirst: usagePaused && props.session.status !== "waiting_capacity" }
3246
- )
3247
- });
3248
- const codexUsageChoice = codexUsageChoices && codexUsageNoticeApplies({
3249
- status: props.session.status,
3250
- resetsAt: codexUsageResetsAtValue,
3251
- usageWait: codexWaitIsUsageLimit(props.events)
3252
- }) ? {
3253
- resetText: codexUsageResetText(codexUsageResetsAtValue),
3254
- continueAtReset,
3255
- pending: usageContinuation?.pending || composer.pausing || composer.resuming,
3256
- error: usageContinuation?.error,
3257
- onContinueAtResetChange: setContinueAtReset
3258
- } : void 0;
3259
- const codexUsageNotice = codexUsageChoice && props.session.status !== "failed" && !terminal ? /* @__PURE__ */ jsx(CodexUsageNotice, { choice: codexUsageChoice }) : null;
3260
- const chosenModelHeadsUp = !terminal ? switchHeadsUp(model, selectedPolicyRow?.label ?? unavailableModelName(model)) : null;
3261
- const modelSwitchHeadsUp = chosenModelHeadsUp ? /* @__PURE__ */ jsx(ModelSwitchHeadsUp, { text: chosenModelHeadsUp, className: "px-3.5 pt-2.5 md:px-4" }) : null;
3262
- const ownLoginsApply = !terminal && props.session.tenancy?.visibility === "workspace" && !isPersonalWorkspace(workspace, context.managedSelfContext);
3263
- const ownLoginsHeadsUp = ownLoginsApply ? /* @__PURE__ */ jsx(
3264
- OwnLoginsSharedHeadsUp,
3265
- {
3266
- logins: connectionAccounts.loading || connectionAccounts.error ? null : ownLoginsInUse(
3267
- // Only the connectors this chat uses.
3268
- connectionAccounts.accountGroups,
3269
- connectionAccounts.accountChoices,
3270
- context.accessContext.subjectId
3271
- ),
3272
- className: "px-3.5 pt-2.5 md:px-4",
3273
- logoFor: (login) => props.resolveProviderLogo(login.accounts[0].providerDomain),
3274
- onChange: async (login, on) => {
3275
- try {
3276
- if (on)
3277
- await turnOnOwnLoginsHere(context.client, props.session.workspaceId, login.accounts);
3278
- else await stopOwnLoginsHere(context.client, props.session.workspaceId, login.accounts);
3279
- } finally {
3280
- await connectionAccounts.refresh();
3281
- }
3282
- }
3283
- },
3284
- props.session.id
3285
- ) : null;
3286
- const sessionSecrets = useSessionSecrets(props.session.id, {
3287
- enabled: workspacePermissions.includes("secrets:list")
3288
- });
3289
- const secretsView = sessionSecrets.secrets;
3290
- const renderMessageSender = useMessageSenderRenderer(
3291
- context.client,
3292
- props.session.workspaceId,
3293
- context.accessContext.subjectId
3294
- );
3295
- const commandContext = useMemo3(
3296
- () => ({
3297
- client: context.client,
3298
- workspaceId: props.session.workspaceId,
3299
- sessionId: props.session.id,
3300
- status: props.session.status,
3301
- permissions: workspacePermissions
3302
- }),
3303
- [
3304
- context.client,
3305
- props.session.workspaceId,
3306
- props.session.id,
3307
- props.session.status,
3308
- workspacePermissions
3309
- ]
3310
- );
3311
- const [forkEventId, setForkEventId] = useState3(null);
3312
- const [turnRatings, setTurnRatings] = useState3({});
3313
- const mayRate = hasWorkspacePermission(
3314
- context.accessContext,
3315
- props.session.workspaceId,
3316
- "sessions:create"
3317
- );
3318
- useEffect4(() => {
3319
- setTurnRatings({});
3320
- setForkEventId(null);
3321
- if (!mayRate) return;
3322
- return loadSessionFeedback(
3323
- context.client,
3324
- props.session.workspaceId,
3325
- props.session.id,
3326
- ({ feedback }) => {
3327
- const ratings = turnRatingsFromFeedback(feedback);
3328
- setTurnRatings((saved) => ({ ...ratings, ...saved }));
3329
- }
3330
- );
3331
- }, [
3332
- context.client,
3333
- props.session.workspaceId,
3334
- props.session.id,
3335
- mayRate,
3336
- context.accessContext.subjectId
3337
- ]);
3338
- const mayForkMessage = context.clientConfig.auth.mode === "managedSession" && context.authSession !== null && Boolean(props.session.tenancy) && mayRate;
3339
- const forkRequests = useUiEventTarget("document");
3340
- const eventsRef = useRef2(props.events);
3341
- eventsRef.current = props.events;
3342
- useEffect4(() => {
3343
- if (!mayForkMessage) return;
3344
- const fork = () => {
3345
- const events = eventsRef.current;
3346
- for (let index = events.length - 1; index >= 0; index -= 1) {
3347
- const event = events[index];
3348
- if (event.type === "agent.message.completed" || event.type === "user.message") {
3349
- setForkEventId(event.id);
3350
- return;
3351
- }
3352
- }
3353
- };
3354
- forkRequests.addEventListener(FORK_CURRENT_CHAT_EVENT, fork);
3355
- return () => forkRequests.removeEventListener(FORK_CURRENT_CHAT_EVENT, fork);
3356
- }, [forkRequests, mayForkMessage]);
3357
- const onMessageRated = useCallback3((turnId, sentiment) => {
3358
- setTurnRatings((saved) => ({ ...saved, [turnId]: sentiment }));
3359
- }, []);
3360
- const renderMessageActions = useCallback3(
3361
- (item) => /* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(
3362
- MessageActions,
3363
- {
3364
- item,
3365
- client: context.client,
3366
- workspaceId: props.session.workspaceId,
3367
- sessionId: props.session.id,
3368
- mayRate,
3369
- mayFork: mayForkMessage,
3370
- savedSentiment: item.kind === "agent-message" && item.turnId ? turnRatings[item.turnId] ?? null : null,
3371
- onRated: onMessageRated,
3372
- onFork: setForkEventId
3373
- }
3374
- ) }),
3375
- [
3376
- context.client,
3377
- props.session.workspaceId,
3378
- props.session.id,
3379
- mayRate,
3380
- mayForkMessage,
3381
- turnRatings,
3382
- onMessageRated
3383
- ]
3384
- );
3385
- const renderImage = useCallback3(
3386
- (image) => {
3387
- const artifactId = retainedImageId(image.src);
3388
- return artifactId ? /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx("span", { role: "status", children: "Loading image\u2026" }), children: /* @__PURE__ */ jsx(
3389
- InlineChatArtifact,
3390
- {
3391
- workspaceId: props.session.workspaceId,
3392
- artifactId,
3393
- alt: image.alt
3394
- },
3395
- props.session.workspaceId + ":" + artifactId
3396
- ) }) : null;
3397
- },
3398
- [props.session.workspaceId]
3399
- );
3400
- const renderInteractiveBlock = useCallback3(
3401
- (block) => /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx("span", { role: "status", children: "Loading preview\u2026" }), children: /* @__PURE__ */ jsx(ChatInteractiveBlock, { workspaceId: props.session.workspaceId, ...block }) }),
3402
- [props.session.workspaceId]
3403
- );
3404
- const renderMessageText = useCallback3(
3405
- (text, item, renderContext) => {
3406
- if (item.kind === "user-message") {
3407
- if (item.humanInputDelegation) {
3408
- return /* @__PURE__ */ jsx(
3409
- HumanInputDelegationRecord,
3410
- {
3411
- client: context.client,
3412
- workspaceId: props.session.workspaceId,
3413
- item: { ...item, humanInputDelegation: item.humanInputDelegation },
3414
- viewerSubjectId: context.accessContext.subjectId
3415
- }
3416
- );
3417
- }
3418
- return /* @__PURE__ */ jsx(
3419
- UserMessageBody,
3420
- {
3421
- sessionId: props.session.id,
3422
- workspaceId: props.session.workspaceId,
3423
- item,
3424
- searchTarget: renderContext.searchTarget
3425
- }
3426
- );
3427
- }
3428
- return /* @__PURE__ */ jsx("div", { "data-testid": "assistant-markdown", children: /* @__PURE__ */ jsx(
3429
- MarkdownText,
3430
- {
3431
- artifactHref: (id) => `/workspaces/${props.session.workspaceId}/artifacts/files/${id}`,
3432
- text,
3433
- searchTarget: renderContext.searchTarget,
3434
- softLineBreaks: true,
3435
- streaming: item.kind === "agent-message" && item.streaming,
3436
- onSandboxFile: props.onOpenSandboxFile,
3437
- renderInteractiveBlock,
3438
- renderImage
3439
- }
3440
- ) });
3441
- },
3442
- [
3443
- context.accessContext.subjectId,
3444
- context.client,
3445
- props.onOpenSandboxFile,
3446
- props.session.id,
3447
- props.session.workspaceId,
3448
- renderInteractiveBlock,
3449
- renderImage
3450
- ]
3451
- );
3452
- const [creditTopupOpen, setCreditTopupOpen] = useState3(false);
3453
- const openCreditTopup = canBuyCredits ? () => setCreditTopupOpen(true) : void 0;
3454
- const topupRefusal = ((creditRefusal?.sessionId === props.session.id ? creditRefusal.code : null) ?? stopRefusal) === "byok_paid_credit_required" ? "byok_paid_credit_required" : null;
3455
- const creditTopupPrompt = canBuyCredits && workspaceAccountId ? /* @__PURE__ */ jsx(Suspense, { fallback: null, children: creditTopupOpen ? /* @__PURE__ */ jsx(
3456
- LazyCreditTopupPrompt,
3457
- {
3458
- purpose: "topup",
3459
- refusalCode: topupRefusal,
3460
- open: true,
3461
- workspaceId: props.session.workspaceId,
3462
- accountId: workspaceAccountId,
3463
- canBuyCredits: true,
3464
- onOpenChange: setCreditTopupOpen,
3465
- beforeLeave: composer.flushDraft
3466
- }
3467
- ) : null }) : null;
3468
- const canConnectModel = hasWorkspacePermission(
3469
- context.accessContext,
3470
- props.session.workspaceId,
3471
- "connections:write"
3472
- );
3473
- const failureRecovery = !props.hasNewer && !readOnlyArchive && props.failure && (props.session.status === "failed" || props.creditExhausted && props.session.status === "idle") ? /* @__PURE__ */ jsx(FailureRecoveryBoundary, { fallback: failureFallback, children: /* @__PURE__ */ jsx(Suspense, { fallback: failureFallback, children: /* @__PURE__ */ jsx(
3474
- LazyFailedSessionBanner,
3475
- {
3476
- failure: props.failure,
3477
- shownInTimeline: timelineShowsFailure(timelineWithStartup, {
3478
- failureEventId: props.failure.failureEventId,
3479
- turnId: failureTurnId
3480
- }),
3481
- analyticsKey: props.failure.failureEventId ?? `${props.session.id}:${props.failure.failedAt ?? "unknown"}`,
3482
- canChooseModel: canChooseRecoveryModel,
3483
- codexUsage: codexUsageChoice,
3484
- hasModelPicker: hasComposerPolicy,
3485
- freeModel: isDeploymentFreeModel(modelCatalog.rows, props.session.model),
3486
- subscriptions: connectableSubscriptions(context.clientConfig.models),
3487
- modelChanged: Boolean(composerPolicy && composerPolicy.model !== props.session.model),
3488
- creditExhausted: props.creditExhausted,
3489
- creditRefusal: stopRefusal,
3490
- freeCreditGap: creditGap,
3491
- onChooseModel: chooseCoveredModel,
3492
- workspaceId: props.session.workspaceId,
3493
- canBuyCredits,
3494
- onAddCredits: openCreditTopup,
3495
- canConnectModel,
3496
- sandboxRecovery: needsSandboxRecoveryCheck(props.session, props.failure.structuralSandboxFailure) ? {
3497
- client: context.client,
3498
- workspaceId: props.session.workspaceId,
3499
- sessionId: props.session.id,
3500
- canControl: workspacePermissions.includes("sessions:control")
3501
- } : void 0,
3502
- actions: {
3503
- failureId: props.failure.failureEventId,
3504
- retryInput: pendingRetryInput,
3505
- composerBlocker: composerSendBlocker(),
3506
- onRetry: async () => {
3507
- if (composer.hasDraftContent() || composerSendBlocker() || !props.failure?.failureEventId || !retryHasRetainedTurn || !composerPolicy || !workspacePermissions.includes("sessions:control") || admissionControl.state === "paused")
3508
- return false;
3509
- try {
3510
- return await retryFailedSession(props.failure.failureEventId, composerPolicy);
3511
- } finally {
3512
- await Promise.allSettled([props.onReloadSession(), props.queue.refresh()]);
3513
- }
3514
- },
3515
- retryBlocker: !workspacePermissions.includes("sessions:control") ? "permission" : admissionControl.state === "paused" ? "paused" : composer.hasDraftContent() ? "draft" : failedOptimisticMessageCount > 0 ? "unsent" : (optimisticMessages ?? []).some(
3516
- (message) => !acceptedClientEventIds.has(message.clientEventId)
3517
- ) ? "delivery" : props.session.activeTurnId !== null || props.queue.queue.length > 0 ? "queued" : composer.sending || composer.draftLoading || !hasComposerPolicy || !retryHasRetainedTurn || !props.failure.failureEventId ? "loading" : null
3518
- }
3519
- },
3520
- props.session.id
3521
- ) }) }, props.session.id) : null;
3522
- const sessionCreditRefusal = creditRefusal?.sessionId === props.session.id && !terminal && !(failureRecovery && props.creditExhausted) ? creditRefusal : null;
3523
- const creditRefusalFallback = sessionCreditRefusal ? /* @__PURE__ */ jsx("p", { role: "alert", className: "px-1.5 text-sm text-fg-muted", children: apiErrorFacts(sessionCreditRefusal.message).serverMessage ?? sessionCreditRefusal.message }) : null;
3524
- const creditRefusalNotice = sessionCreditRefusal ? /* @__PURE__ */ jsx(FailureRecoveryBoundary, { fallback: creditRefusalFallback, children: /* @__PURE__ */ jsx(Suspense, { fallback: creditRefusalFallback, children: /* @__PURE__ */ jsx(
3525
- LazyCreditRefusalNotice,
3526
- {
3527
- gap: creditRefusalGap(modelCatalog.rows, sessionCreditRefusal.model, {
3528
- selectedModel: composerPolicy?.model,
3529
- preferredModel: modelCatalog.defaultSelection?.model
3530
- }),
3531
- message: sessionCreditRefusal.message,
3532
- refusalCode: sessionCreditRefusal.code,
3533
- workspaceId: props.session.workspaceId,
3534
- accountId: workspaceAccountId,
3535
- canReadBilling: Boolean(workspaceAccountId) && hasAccountPermission(context.accessContext, workspaceAccountId ?? "", "billing:read"),
3536
- canBuyCredits,
3537
- canConnectModel,
3538
- continuing: true,
3539
- onChooseModel: modelPickerDisabled ? void 0 : chooseCoveredModel,
3540
- onAddCredits: openCreditTopup,
3541
- onDismiss: () => setCreditRefusal(null)
3542
- }
3543
- ) }) }, props.session.id) : null;
3544
- const modelRecovery = props.hasNewer ? null : currentModelRecovery({ ...props.session, effectiveControl: admissionControl }, props.events);
3545
- const reviewDetailPane = reviewDetails ? /* @__PURE__ */ jsx("div", { className: "min-h-0 flex-1 overflow-y-auto", "data-workspace-scroll-owner": "self-managed", children: /* @__PURE__ */ jsx(
3546
- ToolActionReviewDetails,
3547
- {
3548
- review: reviewDetails.review,
3549
- path: reviewDetails.path,
3550
- load: loadToolReviewDetails,
3551
- onBack: () => {
3552
- const { review, path, origin } = reviewDetails;
3553
- setReviewDetails(null);
3554
- requestAnimationFrame(() => {
3555
- const selector = `[data-approval-id="${CSS.escape(review.id)}"]${origin ? `[data-review-origin="${CSS.escape(origin)}"]` : ""} button[data-review-path="${CSS.escape(path)}"]`;
3556
- document.querySelector(selector)?.focus();
3557
- });
3558
- }
3559
- },
3560
- reviewDetails.review.id + reviewDetails.path
3561
- ) }) : null;
3562
- return createElement(
3563
- Fragment,
3564
- null,
3565
- reviewDetailPane,
3566
- creditTopupPrompt,
3567
- createElement(
3568
- "div",
3569
- {
3570
- className: reviewDetails ? "hidden" : "contents",
3571
- ...inertProps(Boolean(reviewDetails)),
3572
- ...props.placement === "panel" ? { ref: setPanelRoot } : {}
3573
- },
3574
- createElement(
3575
- LightboxProvider,
3576
- null,
3577
- /* @__PURE__ */ jsxs(
3578
- ChatViewportFileDropTarget,
3579
- {
3580
- "data-workspace-scroll-owner": "self-managed",
3581
- enabled: !terminal && context.clientConfig.fileUploads.enabled === true,
3582
- onFiles: attachments.addFiles,
3583
- children: [
3584
- findMounted ? /* @__PURE__ */ jsx(LazyPart, { fallback: null, children: /* @__PURE__ */ jsx(
3585
- ConversationFind,
3586
- {
3587
- workspaceId: props.session.workspaceId,
3588
- sessionId: props.session.id,
3589
- open: findOpen,
3590
- focusRevision: findFocusRevision,
3591
- initial: props.searchTarget,
3592
- showBackToSessionSearch: props.searchTarget.searchOrigin === "session-search",
3593
- onClose: closeFind,
3594
- onTarget: setActiveSearchTarget,
3595
- onJump: props.onJumpToSequence
3596
- }
3597
- ) }) : null,
3598
- cancelled ? /* @__PURE__ */ jsxs("div", { className: cn("mx-auto w-full max-w-3xl pt-6", gutter), children: [
3599
- /* @__PURE__ */ jsx(TerminalSessionBanner, { session: props.session, onNewSession: props.onNewSession }),
3600
- /* @__PURE__ */ jsx(TerminalSessionArchive, { session: props.session, eventCount: props.timeline.length })
3601
- ] }) : readOnlyArchive ? /* @__PURE__ */ jsx("div", { className: cn("mx-auto w-full max-w-3xl pt-6", gutter), children: /* @__PURE__ */ jsx(
3602
- ReadOnlySessionNotice,
3603
- {
3604
- session: props.session,
3605
- onContinue: props.onContinueInNewSession
3606
- }
3607
- ) }) : null,
3608
- /* @__PURE__ */ jsx(Fragment2, { children: /* @__PURE__ */ jsx("div", { "data-testid": "session-timeline", className: "min-h-0 min-w-0 flex-1", children: /* @__PURE__ */ jsx(LearningRefusalActionsProvider, { onOpen: props.onLearningRefusalOpen, children: /* @__PURE__ */ jsx(
3609
- KnowledgeActivityProvider,
3610
- {
3611
- onInspect: props.onMemoryClick,
3612
- onRetryFile: (fileId) => composer.send(
3613
- `Retry searchable source preparation for attached file ${fileId}. Use knowledge_retain_file and report its result.`
3614
- ),
3615
- retryDisabled: composer.hasDraftContent() || composer.sending || composer.draftLoading || !hasComposerPolicy,
3616
- children: /* @__PURE__ */ jsx(
3617
- ToolReviewHistoryProvider,
3618
- {
3619
- events: props.events,
3620
- load: loadRecordedToolReview,
3621
- onViewDetails: viewToolReviewDetails,
3622
- children: /* @__PURE__ */ jsx(
3623
- InteractiveAnswerProvider,
3624
- {
3625
- send: composer.send,
3626
- scope: props.session.id,
3627
- store: answerStore,
3628
- readOnly: terminal,
3629
- children: /* @__PURE__ */ jsx(
3630
- MessageTimeline,
3631
- {
3632
- resolveLink,
3633
- renderMessageSender,
3634
- allowanceExhaustedLabels: CONSOLE_TIMELINE_ALLOWANCE_LABELS,
3635
- trailingState: /* @__PURE__ */ jsxs(Fragment2, { children: [
3636
- failureRecovery,
3637
- props.approvals.length > 0 && approvalsDecidable(props.session.status) && /* @__PURE__ */ jsx(
3638
- ApprovalSurface,
3639
- {
3640
- approvals: props.approvals,
3641
- selectedApprovalId,
3642
- onSelectedApprovalChange: setSelectedApprovalId,
3643
- loadReview: loadToolReview,
3644
- onViewDetails: viewToolReviewDetails,
3645
- onApprove: (approval, answer) => decideApproval(approval.id, "approve", answer),
3646
- onReject: (approval) => decideApproval(approval.id, "reject")
3647
- }
3648
- ),
3649
- /* @__PURE__ */ jsx(LazyPart, { fallback: null, children: /* @__PURE__ */ jsx(
3650
- SessionSkillReviews,
3651
- {
3652
- context,
3653
- workspaceId: props.session.workspaceId,
3654
- sessionId: props.session.id,
3655
- events: props.events
3656
- },
3657
- `${context.accessContext.subjectId}:${props.session.workspaceId}:${props.session.id}`
3658
- ) }),
3659
- props.humanInput.requests.length > 0 && props.session.status === "requires_action" ? /* @__PURE__ */ jsx("div", { className: "pb-1", "data-human-input-timeline-surface": "", children: /* @__PURE__ */ jsx(LazyPart, { fallback: /* @__PURE__ */ jsx(LoadingPanel, { label: "Loading questions\u2026" }), children: /* @__PURE__ */ jsx(
3660
- HumanInputSurface,
3661
- {
3662
- loadSkillReview,
3663
- allowedSaveTo: secretSaveTargets(
3664
- context.accessContext,
3665
- props.session.workspaceId
3666
- ),
3667
- requests: props.humanInput.requests,
3668
- respondingRequestId: props.humanInput.respondingRequestId,
3669
- error: props.humanInput.mutationError?.message,
3670
- onSubmit: async (requestId, response) => {
3671
- if (!await props.humanInput.respond(requestId, response)) {
3672
- throw new Error("Your answer wasn't sent. Try again.");
3673
- }
3674
- }
3675
- }
3676
- ) }) }) : null
3677
- ] }),
3678
- turnSummary: { rolling: true },
3679
- className: "h-full",
3680
- items: timelineWithStartup,
3681
- searchTarget: activeSearchTarget,
3682
- focusSequence: momentSequence,
3683
- events: props.events,
3684
- status: props.session.status,
3685
- computeLabel,
3686
- renderMessageText,
3687
- renderMessageActions,
3688
- onAnnotate: composer.addAnnotation,
3689
- draftAnnotations: composer.annotations,
3690
- onDraftAnnotationSelect: composer.requestAnnotationReview,
3691
- onOpenSession: props.onOpenSession,
3692
- resolveSessionTitle: props.resolveSessionTitle,
3693
- onMemoryClick: props.onMemoryClick,
3694
- onReconnect: props.onReconnect,
3695
- renderAuthNeeded,
3696
- resolveProviderLogo: props.resolveProviderLogo,
3697
- loadRetainedScreenshot,
3698
- loadRetainedArtifact,
3699
- loadVideoArtifactPlayback,
3700
- hasOlder: props.hasOlder,
3701
- loadingOlder: props.loadingOlder,
3702
- onLoadOlder: props.onLoadOlder,
3703
- hasNewer: props.hasNewer,
3704
- loadingNewer: props.loadingNewer,
3705
- onLoadNewer: props.onLoadNewer,
3706
- loadingOldest: props.loadingOldest,
3707
- onJumpToStart: async () => {
3708
- await props.onJumpToStart();
3709
- },
3710
- onJumpToLatest: props.onJumpToLatest,
3711
- emptyState: (
3712
- // Clear view hides history, not the retained failure or retry operation.
3713
- failureRecovery ?? (props.queue.stoppingPreviousAttempt ? /* @__PURE__ */ jsx(
3714
- EmptyState,
3715
- {
3716
- className: "min-h-[24rem]",
3717
- icon: /* @__PURE__ */ jsx(Loader2Icon, { className: "size-4 animate-spin motion-reduce:animate-none" }),
3718
- title: props.queue.effectiveControl?.state === "paused" ? "Stopping current work" : "Stopping previous work",
3719
- description: props.queue.effectiveControl?.state === "paused" ? "Waiting for the current command to stop safely. Queued work stays saved." : "Your direction is saved. It starts after the previous command stops safely."
3720
- }
3721
- ) : props.initialLoading ? /* @__PURE__ */ jsx("div", { className: "flex min-h-[24rem]", children: /* @__PURE__ */ jsx(LoadingPanel, {}) }) : props.historyReloadFailed ? /* @__PURE__ */ jsx(
3722
- ProblemPanel,
3723
- {
3724
- title: "Conversation couldn't be loaded",
3725
- description: "Your saved messages are unchanged. Try loading them again.",
3726
- action: /* @__PURE__ */ jsx(
3727
- Button,
3728
- {
3729
- variant: "outline",
3730
- onClick: () => void props.onJumpToLatest(),
3731
- children: "Retry conversation"
3732
- }
3733
- )
3734
- }
3735
- ) : /* @__PURE__ */ jsx(
3736
- EmptyState,
3737
- {
3738
- className: "min-h-[24rem]",
3739
- icon: props.session.status === "running" || props.session.status === "recovering" ? /* @__PURE__ */ jsx(Loader2Icon, { className: "size-4 animate-spin motion-reduce:animate-none" }) : /* @__PURE__ */ jsx(MessagesSquareIcon, { className: "size-4" }),
3740
- title: timelineEmptyStateCopy.title,
3741
- description: timelineEmptyStateCopy.description
3742
- }
3743
- ))
3744
- )
3745
- },
3746
- props.session.id
3747
- )
3748
- }
3749
- )
3750
- }
3751
- )
3752
- }
3753
- ) }) }) }),
3754
- forkEventId ? /* @__PURE__ */ jsx(LazyPart, { fallback: null, children: /* @__PURE__ */ jsx(
3755
- MessageForkDialog,
3756
- {
3757
- session: props.session,
3758
- events: props.events,
3759
- sourceEventId: forkEventId,
3760
- onForkClose: () => setForkEventId(null)
3761
- },
3762
- forkEventId
3763
- ) }) : null,
3764
- repositories.removalDialog,
3765
- modelRecovery ? /* @__PURE__ */ jsx(ModelRecoveryNotice, { recovery: modelRecovery }) : null,
3766
- /* @__PURE__ */ jsx("div", { className: cn("mb-1 w-full shrink-0 has-[>div:empty]:hidden", gutter), children: /* @__PURE__ */ jsxs("div", { className: "mx-auto w-full max-w-3xl", children: [
3767
- /* @__PURE__ */ jsx(
3768
- SessionAdmissionNotice,
3769
- {
3770
- session: props.session,
3771
- machineAccess,
3772
- machineAction: /* @__PURE__ */ jsx(
3773
- SessionMachinePickerAction,
3774
- {
3775
- queuedWork: true,
3776
- runsOn,
3777
- workspaceId: props.session.workspaceId,
3778
- rigId: props.session.rigId,
3779
- move: moveRunsOn
3780
- }
3781
- ),
3782
- machines: runsOn.fleet.machines,
3783
- onMoveToMachine: runsOn.fleet.canAttach ? moveSavedMessage : void 0,
3784
- canControl: workspacePermissions.includes("sessions:control"),
3785
- paused: admissionControl.state === "paused",
3786
- refreshRequired: admissionRefreshRequired,
3787
- busy: composer.resuming || composer.pausing || composer.sending || props.queue.mutating,
3788
- onRecheck: () => recheckSessionAdmission({
3789
- control: admissionControl,
3790
- refreshOnly: admissionRefreshRequired,
3791
- resume: (control) => context.client.resumeSession(props.session.workspaceId, props.session.id, {
3792
- clientEventId: crypto.randomUUID(),
3793
- expectedControlEtag: control.controlEtag
3794
- }),
3795
- refresh: [props.onReloadSession, props.queue.refresh]
3796
- }),
3797
- onContinueWaitingWork: async () => {
3798
- await context.client.continueSessionWaitingWork(
3799
- props.session.workspaceId,
3800
- props.session.id
3801
- );
3802
- if (sessionAdmissionReason(props.session) !== null && admissionControl.state !== "paused")
3803
- await recheckSessionAdmission({
3804
- control: admissionControl,
3805
- refreshOnly: admissionRefreshRequired,
3806
- resume: (control) => context.client.resumeSession(props.session.workspaceId, props.session.id, {
3807
- clientEventId: crypto.randomUUID(),
3808
- expectedControlEtag: control.controlEtag
3809
- }),
3810
- refresh: [props.onReloadSession, props.queue.refresh]
3811
- });
3812
- else await props.onReloadSession();
3813
- await runsOn.fleet.refresh();
3814
- }
3815
- },
3816
- `${props.session.workspaceId}:${props.session.id}`
3817
- ),
3818
- waitingSubSessions.length > 0 ? /* @__PURE__ */ jsx(LazyPart, { fallback: null, children: /* @__PURE__ */ jsx(OpenGeniLinkProvider, { resolveLink, children: /* @__PURE__ */ jsx(
3819
- DescendantRequests,
3820
- {
3821
- client: context.client,
3822
- workspaceId: props.session.workspaceId,
3823
- parentSessionId: props.session.id,
3824
- events: props.events,
3825
- waiting: waitingSubSessions,
3826
- onResolved: props.onDescendantResolved,
3827
- onResumingChange: onSubSessionResumingChange,
3828
- refreshSignal: props.descendantRefreshSignal,
3829
- loadSkillReview,
3830
- allowedSaveTo: secretSaveTargets(
3831
- context.accessContext,
3832
- props.session.workspaceId
3833
- )
3834
- }
3835
- ) }) }) : null,
3836
- /* @__PURE__ */ jsx(
3837
- SessionChrome,
3838
- {
3839
- sessionStatus: props.session.status,
3840
- wait: admissionControl.state === "active" ? sessionInputWait(props.session) : null,
3841
- onOpenSession: props.onOpenSession,
3842
- queue: props.queue,
3843
- composer: terminal ? void 0 : composer,
3844
- queuedRecall,
3845
- goal: props.goal,
3846
- readOnly: terminal,
3847
- commandsCount: props.session.backgroundCommandActivity?.count ?? 0,
3848
- commandsPanel: /* @__PURE__ */ jsx(LazyPart, { fallback: /* @__PURE__ */ jsx(LoadingPanel, { label: "Loading commands\u2026" }), children: /* @__PURE__ */ jsx(
3849
- SessionCommands,
3850
- {
3851
- sessionId: props.session.id,
3852
- readOnly: terminal
3853
- },
3854
- props.session.id
3855
- ) }),
3856
- agentsSignal,
3857
- agentsPanel: props.agentNodes.length > 0 ? /* @__PURE__ */ jsx(LazyPart, { fallback: /* @__PURE__ */ jsx(LoadingPanel, { label: "Loading agents\u2026" }), children: /* @__PURE__ */ jsx(
3858
- SubagentTree,
3859
- {
3860
- workspaceId: props.session.workspaceId,
3861
- nodes: props.agentNodes
3862
- }
3863
- ) }) : null
3864
- }
3865
- )
3866
- ] }) }),
3867
- /* @__PURE__ */ jsx(
3868
- "div",
3869
- {
3870
- ref: composerRegionRef,
3871
- "data-read-only-composer": readOnlyArchive ? "hidden" : void 0,
3872
- className: cn(
3873
- "shrink-0",
3874
- props.placement === "panel" ? "pb-3" : "pb-4",
3875
- gutter,
3876
- readOnlyArchive && "hidden"
3877
- ),
3878
- children: /* @__PURE__ */ jsxs("div", { className: "mx-auto w-full max-w-3xl", children: [
3879
- /* @__PURE__ */ jsx(
3880
- PersonalResourceAttachmentSurface,
3881
- {
3882
- controller: personalAttachment,
3883
- disabled: terminal || composer.sending,
3884
- compact: true
3885
- }
3886
- ),
3887
- /* @__PURE__ */ jsx(
3888
- ConsoleComposer,
3889
- {
3890
- workspaceId: props.session.workspaceId,
3891
- usageRefreshKey: props.session.status,
3892
- composer: composerDelivery,
3893
- attachments,
3894
- effectiveControl: composer.effectiveControl,
3895
- queuedAheadCount: props.queue.queue.length,
3896
- queuedRecall,
3897
- running: usageLimitTreeActive || sessionTurnKeepsRunControl(props.session.status) || props.pendingWake,
3898
- canControlWorkspace: workspacePermissions.includes("workspace:admin"),
3899
- controlLinks: {
3900
- workspaceHref: `/workspaces/${props.session.workspaceId}`,
3901
- sessionHref: (sessionId) => `/workspaces/${props.session.workspaceId}/sessions/${sessionId}`
3902
- },
3903
- disabled: terminal,
3904
- header: ownLoginsHeadsUp || unavailableModelNotice || codexUsageNotice || modelSwitchHeadsUp || usageLimitNotice || creditRefusalNotice || showMachineAccess ? /* @__PURE__ */ jsxs(Fragment2, { children: [
3905
- !sessionAdmissionNeedsDifferentMachine(
3906
- sessionAdmissionReason(props.session),
3907
- machineAccess
3908
- ) ? /* @__PURE__ */ jsx(
3909
- SessionMachineAccessNotice,
3910
- {
3911
- access: machineAccess,
3912
- shared: sharedChat,
3913
- className: "px-3.5 pt-2.5 md:px-4",
3914
- action: /* @__PURE__ */ jsx(
3915
- SessionMachinePickerAction,
3916
- {
3917
- runsOn,
3918
- workspaceId: props.session.workspaceId,
3919
- rigId: props.session.rigId,
3920
- move: moveRunsOn,
3921
- compact: machineAccess?.isOwner === true
3922
- }
3923
- )
3924
- }
3925
- ) : null,
3926
- unavailableModelNotice,
3927
- codexUsageNotice,
3928
- modelSwitchHeadsUp,
3929
- usageLimitNotice,
3930
- creditRefusalNotice ? /* @__PURE__ */ jsx("div", { className: "px-2 pt-2", children: creditRefusalNotice }) : null,
3931
- ownLoginsHeadsUp
3932
- ] }) : null,
3933
- commandContext,
3934
- onClearView: props.onClearView,
3935
- fileUploadsEnabled: context.clientConfig.fileUploads.enabled === true,
3936
- transcriptionSuppressed: voiceActive,
3937
- controlsLeading: /* @__PURE__ */ jsx(Fragment2, { children: /* @__PURE__ */ jsx(
3938
- WorkspaceComposerPlus,
3939
- {
3940
- connectorActions: {
3941
- accountControls: {
3942
- groups: connectionAccounts.availableAccountGroups,
3943
- choices: connectionAccounts.accountChoices,
3944
- onChoose: connectionAccounts.selectAccount,
3945
- loading: connectionAccounts.loading,
3946
- error: connectionAccounts.error,
3947
- accessDenied: connectionAccounts.accessDenied,
3948
- onRefresh: () => void connectionAccounts.refresh(),
3949
- disabled: terminal || composer.sending || durableToolsSaving || !durableToolsHydrated
3950
- }
3951
- },
3952
- chatSettings: props.onOpenAgentSettings ? {
3953
- workspaceId: props.session.workspaceId,
3954
- sessionId: props.session.id,
3955
- scope: chatLearningScope(props.session),
3956
- canEdit: workspacePermissions.includes("sessions:control"),
3957
- onOpen: props.onOpenAgentSettings
3958
- } : void 0,
3959
- workspaceId: props.session.workspaceId,
3960
- disabled: terminal || composer.sending,
3961
- fileUploadsEnabled: context.clientConfig.fileUploads.enabled === true,
3962
- servers: selectableSessionMcpServers,
3963
- firstPartyTools: firstPartyToolOptions,
3964
- selection: durableToolSelection,
3965
- toolsSaving: durableToolsSaving,
3966
- toolsDisabled: composer.sending || terminal || durableToolsSaving || !durableToolsHydrated,
3967
- connectorCustomizing,
3968
- onConnectorCustomizingChange: (next) => {
3969
- setConnectorCustomizingOverride(next);
3970
- if (next) return;
3971
- connectionAccounts.resetEmptyChoices();
3972
- void applyDurableToolPolicy(
3973
- followWorkspaceConnectorPolicy(durableToolsSnapshot)
3974
- );
3975
- },
3976
- onToolSelectionChange: (next) => void saveDurableToolPolicy(next),
3977
- ...secretsView?.capabilityEnabled ? {
3978
- secrets: {
3979
- summary: sessionSecretsSummary(
3980
- secretsView.policy,
3981
- secretsView.reachableVaults
3982
- ),
3983
- panel: /* @__PURE__ */ jsx(
3984
- SessionSecretsMenuBody,
3985
- {
3986
- vaults: secretsView.reachableVaults,
3987
- policy: secretsView.policy,
3988
- narrowedByParent: secretsView.narrowedBySessionId !== null,
3989
- taskItems: secretsView.taskItems,
3990
- canEdit: workspacePermissions.includes("sessions:control"),
3991
- disabled: terminal,
3992
- loading: sessionSecrets.loading,
3993
- error: sessionSecrets.error,
3994
- onRetry: () => void sessionSecrets.refresh(),
3995
- onPolicyChange: async (policy) => {
3996
- await sessionSecrets.api.setSessionVaultPolicy(
3997
- props.session.id,
3998
- policy
3999
- );
4000
- await sessionSecrets.refresh();
4001
- },
4002
- onSaveTo: async (item, target) => {
4003
- await sessionSecrets.api.moveItem(item.vaultId, item.id, {
4004
- targetVaultId: target.id,
4005
- mode: "copy"
4006
- });
4007
- toast.success(`Saved ${item.name} to ${target.name}`);
4008
- },
4009
- onManage: () => void navigate({
4010
- to: "/workspaces/$workspaceId/secrets",
4011
- params: { workspaceId: props.session.workspaceId }
4012
- })
4013
- }
4014
- )
4015
- }
4016
- } : {},
4017
- repositories: {
4018
- selectedCount: repositories.selectionCount,
4019
- disabled: terminal || composer.sending,
4020
- panel: /* @__PURE__ */ jsx(FollowUpRepositoryMenuBody, { ...repositoryPickerProps })
4021
- },
4022
- ...runsOn.hasChoices || props.session.rigId || runsOn.activeMachine && !runsOn.activeMachine.isSessionGroup ? {
4023
- runsOn: {
4024
- summary: runsOn.activeName,
4025
- panel: /* @__PURE__ */ jsx(
4026
- SessionRunsOnMenuBody,
4027
- {
4028
- runsOn,
4029
- workspaceId: props.session.workspaceId,
4030
- rigId: props.session.rigId ?? null,
4031
- move: moveRunsOn
4032
- }
4033
- )
4034
- }
4035
- } : {}
4036
- }
4037
- ) }),
4038
- actions: !terminal ? /* @__PURE__ */ jsx(LazyPart, { onLoadFailure: "hide", fallback: null, children: /* @__PURE__ */ jsx(
4039
- LazyCodexRealtimeControl,
4040
- {
4041
- client: realtimeClient,
4042
- workspaceId: props.session.workspaceId,
4043
- sessionId: props.session.id,
4044
- sessionStatus: props.session.status,
4045
- effectiveControl: props.queue.effectiveControl ?? props.session.effectiveControl,
4046
- events: props.events,
4047
- eventsReady: !props.initialLoading,
4048
- codexConnected,
4049
- realtimeAutostartModel: props.realtimeAutostartModel,
4050
- onRealtimeAutostartConsumed: props.onRealtimeAutostartConsumed,
4051
- onVoiceActiveChange
4052
- }
4053
- ) }) : null,
4054
- placeholder: chatComposerPlaceholder({
4055
- cancelled: props.session.status === "cancelled",
4056
- creditStopped: Boolean(props.creditExhausted) && (props.session.status === "failed" || props.session.status === "idle"),
4057
- stopRefusal,
4058
- creditGap,
4059
- canBuyCredits
4060
- }),
4061
- controls: /* @__PURE__ */ jsxs("div", { className: "@container/model-controls flex min-w-0 flex-1 items-center gap-1.5", children: [
4062
- /* @__PURE__ */ jsx(
4063
- ModelPicker,
4064
- {
4065
- hasImageAttachments: attachments.attachments.some(
4066
- (file) => file.status !== "failed" && file.contentType.startsWith("image/")
4067
- ),
4068
- open: modelPickerSession === props.session.id && !pendingRetryInput,
4069
- onOpenChange: (open) => {
4070
- setModelPickerSession(open ? props.session.id : null);
4071
- if (open) void modelCatalog.refresh();
4072
- },
4073
- rows: modelCatalog.rows,
4074
- model,
4075
- effort: reasoningEffort,
4076
- latencyMode,
4077
- disabled: modelPickerDisabled,
4078
- loading: modelCatalog.loading || composer.draftLoading,
4079
- error: modelCatalog.error ?? composerPolicyError,
4080
- sessionKey: props.session.id,
4081
- menuSide: "top",
4082
- connectModelsHref: `/workspaces/${encodeURIComponent(props.session.workspaceId)}/settings?section=models`,
4083
- claudeSubscriptionAvailable: context.clientConfig.claudeSubscriptionEnabled === true,
4084
- onModelChange: (modelId) => {
4085
- composer.setModel(modelId);
4086
- usageModelSwitch.modelPicked(modelId);
4087
- },
4088
- onEffortChange: composer.setReasoningEffort,
4089
- onLatencyModeChange: composer.setLatencyMode
4090
- }
4091
- ),
4092
- durableToolsError ? /* @__PURE__ */ jsx("span", { className: "sr-only", role: "alert", children: durableToolsError }) : null
4093
- ] })
4094
- }
4095
- )
4096
- ] })
4097
- }
4098
- )
4099
- ]
4100
- }
4101
- )
4102
- )
4103
- )
4104
- );
4105
- }
4106
- function refusedModelId(error, input) {
4107
- const details = error.details;
4108
- if (typeof details?.modelId === "string" && details.modelId) return details.modelId;
4109
- const attempted = input?.model;
4110
- return typeof attempted === "string" && attempted ? attempted : null;
4111
- }
4112
-
4113
- export {
4114
- SessionRoute
4115
- };
4116
- //# sourceMappingURL=chunk-PC2EBA5G.js.map