@opengeni/react 4.4.1 → 4.5.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.
- package/dist/app/app-state.js +25 -25
- package/dist/app/components/Composer.js +27 -27
- package/dist/app/components/agent/agent-capability-picker.js +4 -4
- package/dist/app/components/artifacts/artifact-browse-controls.js +3 -3
- package/dist/app/components/artifacts/artifact-library.js +19 -19
- package/dist/app/components/artifacts/artifact-page-chrome.js +2 -2
- package/dist/app/components/artifacts/chat-interactive-block.js +15 -15
- package/dist/app/components/artifacts/inline-chat-image.js +30 -29
- package/dist/app/components/artifacts/retained-file-preview.js +34 -33
- package/dist/app/components/artifacts/retained-text-preview.js +5 -5
- package/dist/app/components/artifacts/site-audience.js +4 -4
- package/dist/app/components/artifacts/site-conversations.js +20 -19
- package/dist/app/components/artifacts/site-data.js +18 -18
- package/dist/app/components/artifacts/site-publishing.js +39 -39
- package/dist/app/components/artifacts/site-settings.js +46 -46
- package/dist/app/components/billing-class-mark.js +5 -5
- package/dist/app/components/capabilities/capability-detail-sheet.js +8 -8
- package/dist/app/components/capabilities/capability-logo-source.js +11 -11
- package/dist/app/components/capabilities/connector-tool-permissions.js +4 -4
- package/dist/app/components/capabilities/native-connect-setup.js +14 -14
- package/dist/app/components/capabilities/perform-capability-action.js +1 -1
- package/dist/app/components/capabilities/prepared-mcp-setup-card.js +15 -15
- package/dist/app/components/capabilities/session-capability-card.js +77 -75
- package/dist/app/components/capabilities/session-capability-card.js.map +1 -1
- package/dist/app/components/capabilities/session-chrome-card.js +35 -33
- package/dist/app/components/capabilities/session-custom-mcp-card.js +19 -19
- package/dist/app/components/capabilities/session-github-card.js +22 -22
- package/dist/app/components/capabilities/session-machine-card.js +34 -32
- package/dist/app/components/capabilities/use-capabilities-catalog.js +3 -3
- package/dist/app/components/capabilities/use-connection-accounts.js +1 -1
- package/dist/app/components/command-menu/chat-status.js +15 -14
- package/dist/app/components/command-menu/chat-switcher.js +16 -15
- package/dist/app/components/command-menu/chat-switcher.js.map +1 -1
- package/dist/app/components/command-menu/command-menu.js +32 -110
- package/dist/app/components/command-menu/command-menu.js.map +1 -1
- package/dist/app/components/command-menu/shortcut-sheet.js +15 -15
- package/dist/app/components/composer-capabilities-menu-body.js +3 -3
- package/dist/app/components/composer-mobile-plus-panel.js +17 -17
- package/dist/app/components/composer-mobile-plus.js +1 -1
- package/dist/app/components/credit-required-gate.js +1 -1
- package/dist/app/components/credit-required-prompt.js +9 -9
- package/dist/app/components/credits/coupon-redeem.js +2 -2
- package/dist/app/components/credits/credit-refusal-notice.js +2 -2
- package/dist/app/components/desktop/app-shots.js +6 -6
- package/dist/app/components/desktop/this-computer.js +4 -4
- package/dist/app/components/feedback.js +4 -4
- package/dist/app/components/follow-up-repository-menu-body.js +4 -4
- package/dist/app/components/follow-up-repository-picker.js +1 -1
- package/dist/app/components/github-app-connect-launcher.js +2 -2
- package/dist/app/components/in-app-help-link.js +2 -2
- package/dist/app/components/knowledge/agent-learning-settings.js +3 -3
- package/dist/app/components/machines/connect-machine-dialog.js +18 -18
- package/dist/app/components/markdown.js +8 -8
- package/dist/app/components/message-context-pills.js +2 -2
- package/dist/app/components/models/models-ui.js +8 -8
- package/dist/app/components/new-session-starters.js +2 -2
- package/dist/app/components/pickers.js +8 -8
- package/dist/app/components/rail/rail-context.js +3 -3
- package/dist/app/components/rail/rail-sections.js +65 -62
- package/dist/app/components/rail/session-header.js +48 -47
- package/dist/app/components/rail/session-list.js +64 -61
- package/dist/app/components/rail/session-row-content.d.ts +6 -2
- package/dist/app/components/rail/session-row-content.js +1 -1
- package/dist/app/components/rail/session-row-hover-details.js +20 -19
- package/dist/app/components/rail/session-shell.js +104 -101
- package/dist/app/components/rail/site-session-group-heading.d.ts +7 -1
- package/dist/app/components/rail/site-session-group-heading.js +20 -3
- package/dist/app/components/repository-picker.js +4 -4
- package/dist/app/components/secrets/session-secrets-panel.js +3 -3
- package/dist/app/components/session/agent-configuration-panel.js +33 -33
- package/dist/app/components/session/artifact-link-boundary.js +2 -2
- package/dist/app/components/session/artifact-session-page.js +5 -5
- package/dist/app/components/session/banners.js +10 -10
- package/dist/app/components/session/codex-account-indicator.js +11 -11
- package/dist/app/components/session/editable-artifacts-workspace.js +44 -44
- package/dist/app/components/session/failed-session-banner.js +10 -10
- package/dist/app/components/session/human-input.js +57 -53
- package/dist/app/components/session/inspector.js +94 -90
- package/dist/app/components/session/inspector.js.map +1 -1
- package/dist/app/components/session/message-actions.js +4 -4
- package/dist/app/components/session/message-resource-attachments.js +20 -19
- package/dist/app/components/session/message-resource-attachments.js.map +1 -1
- package/dist/app/components/session/model-account-indicator.js +11 -11
- package/dist/app/components/session/model-context-inspector.js +2 -2
- package/dist/app/components/session/model-recovery-notice.js +3 -3
- package/dist/app/components/session/new-session-settings-menu.js +9 -9
- package/dist/app/components/session/sandbox-switcher.js +16 -16
- package/dist/app/components/session/sandbox-workspace.js +81 -77
- package/dist/app/components/session/search-markdown-highlight.js +9 -9
- package/dist/app/components/session/search-results-view.js +10 -10
- package/dist/app/components/session/session-admin-access.js +8 -8
- package/dist/app/components/session/session-admission-notice.js +6 -6
- package/dist/app/components/session/session-machine-access-notice.js +6 -6
- package/dist/app/components/session/session-retention.js +4 -4
- package/dist/app/components/session/session-search-dialog.js +11 -11
- package/dist/app/components/session/session-skill-reviews.js +1 -1
- package/dist/app/components/session/session-tenancy-control.d.ts +2 -0
- package/dist/app/components/session/session-tenancy-control.js +40 -25
- package/dist/app/components/session/session-tenancy-control.js.map +1 -1
- package/dist/app/components/session/session-usage-limit-section.js +11 -11
- package/dist/app/components/session/session-wait-status.js +9 -8
- package/dist/app/components/session/session-wait-status.js.map +1 -1
- package/dist/app/components/session/site-origin-link.d.ts +1 -0
- package/dist/app/components/session/site-origin-link.js +2 -2
- package/dist/app/components/session/subagents.js +16 -15
- package/dist/app/components/session-connectors-menu-body.js +5 -5
- package/dist/app/components/settings/row-select.js +3 -3
- package/dist/app/components/transcription-settings.js +4 -4
- package/dist/app/components/ui/destructive-confirm.js +6 -6
- package/dist/app/components/usage/usage-entry.js +8 -8
- package/dist/app/components/workspace-composer-plus.js +21 -21
- package/dist/app/embed/memory-navigation.js +2 -2
- package/dist/app/embed/session-app.js +256 -250
- package/dist/app/lib/actions/actions-provider.js +15 -15
- package/dist/app/lib/actions/held-modifier.d.ts +11 -0
- package/dist/app/lib/app-surfaces.js +2 -2
- package/dist/app/lib/codex-usage-query.js +6 -6
- package/dist/app/lib/composer-connectors.js +12 -12
- package/dist/app/lib/console-site.d.ts +6 -0
- package/dist/app/lib/console-site.js +14 -0
- package/dist/app/lib/console-text.js +2 -2
- package/dist/app/lib/events.js +17 -16
- package/dist/app/lib/failed-session-copy.js +3 -3
- package/dist/app/lib/model-access-onboarding.js +3 -3
- package/dist/app/lib/move-chat-to-machine.js +3 -3
- package/dist/app/lib/navigation.d.ts +5 -0
- package/dist/app/lib/navigation.js +1 -1
- package/dist/app/lib/routes.d.ts +17 -0
- package/dist/app/lib/routes.js +9 -3
- package/dist/app/lib/session-branch-cache.js +13 -12
- package/dist/app/lib/session-deep-link.js +2 -2
- package/dist/app/lib/session-failure-toasts.d.ts +8 -0
- package/dist/app/lib/session-group-pagination.js +13 -12
- package/dist/app/lib/session-hover-facts.js +14 -13
- package/dist/app/lib/session-model.js +3 -3
- package/dist/app/lib/session-rail.js +9 -8
- package/dist/app/lib/session-rename.js +3 -3
- package/dist/app/lib/session-ui-features.d.ts +6 -1
- package/dist/app/lib/session-ui-features.js +1 -1
- package/dist/app/lib/sessions-group.d.ts +43 -3
- package/dist/app/lib/sessions-group.js +21 -14
- package/dist/app/lib/shared-query.js +3 -3
- package/dist/app/lib/site-opened.d.ts +6 -0
- package/dist/app/lib/site-opened.js +10 -0
- package/dist/app/lib/turn-failure-analytics.js +4 -4
- package/dist/app/lib/use-duplicate-site.js +3 -3
- package/dist/app/lib/use-follow-up-repositories.js +4 -4
- package/dist/app/lib/use-session-list-hint-refresh.d.ts +20 -2
- package/dist/app/lib/use-session-list-hint-refresh.js +5 -1
- package/dist/app/lib/use-workspace-machines.js +6 -6
- package/dist/app/lib/use-workspace-model-catalog.js +7 -7
- package/dist/app/lib/use-workspace-rigs.js +8 -8
- package/dist/app/lib/workspace-navigation-preference.js +5 -5
- package/dist/app/lib/workspace-scope-context.js +4 -4
- package/dist/app/routes/artifacts.js +132 -149
- package/dist/app/routes/artifacts.js.map +1 -1
- package/dist/app/routes/retained-artifact.js +63 -62
- package/dist/app/routes/retained-artifact.js.map +1 -1
- package/dist/app/routes/session-unavailable.js +7 -5
- package/dist/app/routes/session.js +170 -166
- package/dist/app/routes/sessions-index.js +110 -108
- package/dist/app/routes/site-view.d.ts +11 -0
- package/dist/app/routes/site-view.js +597 -0
- package/dist/app/routes/site-view.js.map +1 -0
- package/dist/artifacts-document.js +4 -4
- package/dist/artifacts-presentation.js +4 -4
- package/dist/artifacts-spreadsheet.js +4 -4
- package/dist/artifacts.js +39 -39
- package/dist/{browser-viewer-RYYQSRTC.js → browser-viewer-QMCNV4RI.js} +9 -7
- package/dist/{chat-interactive-block-ABCRKXJ4.js → chat-interactive-block-PMIAUXSO.js} +6 -6
- package/dist/{chunk-TGVVEGZG.js → chunk-22FFOHPT.js} +9 -9
- package/dist/chunk-22GTC4MZ.js +15 -0
- package/dist/chunk-22GTC4MZ.js.map +1 -0
- package/dist/{chunk-Z5WMLJKI.js → chunk-22JFMNMF.js} +92 -4
- package/dist/chunk-22JFMNMF.js.map +1 -0
- package/dist/{chunk-UHFWF6ZU.js → chunk-2FPS5H2D.js} +2 -2
- package/dist/{chunk-NAWXARTY.js → chunk-2KO2G3RI.js} +72 -6
- package/dist/chunk-2KO2G3RI.js.map +1 -0
- package/dist/{chunk-5POTDNQT.js → chunk-2NC7NZCE.js} +6 -6
- package/dist/{chunk-ZKYYZH6L.js → chunk-2QBYDGWO.js} +9 -9
- package/dist/{chunk-TWXIFWBD.js → chunk-34EU25RL.js} +2 -2
- package/dist/{chunk-R63QEVPK.js → chunk-35BC2FU2.js} +16 -16
- package/dist/{chunk-PTGRFAMH.js → chunk-3ABPIUCK.js} +2 -2
- package/dist/{chunk-S4SC5SSV.js → chunk-3GU7AWG7.js} +18 -18
- package/dist/{chunk-722UO6YQ.js → chunk-3PEXVG4D.js} +2 -2
- package/dist/{chunk-63VGE4OH.js → chunk-3RMKPHBL.js} +3 -3
- package/dist/{chunk-6JKZILLF.js → chunk-3RQUWFZT.js} +67 -67
- package/dist/{chunk-6JKZILLF.js.map → chunk-3RQUWFZT.js.map} +1 -1
- package/dist/{chunk-RQDFYQHA.js → chunk-3STBLX4O.js} +9 -9
- package/dist/{chunk-S4EZ3JUB.js → chunk-3X5FKDYQ.js} +23 -23
- package/dist/{chunk-KTRKZRID.js → chunk-4GLLWX33.js} +11 -11
- package/dist/{chunk-ROQOVH4N.js → chunk-4HEXNAFI.js} +20 -20
- package/dist/chunk-4HEXNAFI.js.map +1 -0
- package/dist/{chunk-SD2K5ZN5.js → chunk-4LPA25NQ.js} +4 -4
- package/dist/{chunk-KWKGBGAF.js → chunk-4RMN4E2Y.js} +9 -9
- package/dist/{chunk-X7ASQHR6.js → chunk-4SAGYEVB.js} +2 -2
- package/dist/{chunk-HTT3FB7T.js → chunk-4VK2R5QC.js} +3 -3
- package/dist/{chunk-DDK4WFJ3.js → chunk-4XQC7VLT.js} +9 -9
- package/dist/{chunk-IVOA3DXA.js → chunk-4YXAQMTD.js} +12 -12
- package/dist/{chunk-HOJGAJAB.js → chunk-52WK2GGK.js} +8 -8
- package/dist/{chunk-NYZQ7LO7.js → chunk-552UYIQ7.js} +20 -20
- package/dist/{chunk-LEXPBQ56.js → chunk-5DSKMG2I.js} +4 -4
- package/dist/{chunk-WNG757ID.js → chunk-5FA455GR.js} +4 -4
- package/dist/{chunk-HWDGJFM4.js → chunk-5FEN3KYH.js} +11 -11
- package/dist/{chunk-OSVHU2WU.js → chunk-5JHRMUAZ.js} +12 -12
- package/dist/{chunk-PM3OSANE.js → chunk-5MJHH72T.js} +14 -3
- package/dist/chunk-5MJHH72T.js.map +1 -0
- package/dist/{chunk-RKB2Z457.js → chunk-5VGJXWQ2.js} +2 -2
- package/dist/{chunk-GFUUFM2O.js → chunk-5W6ZDKRR.js} +6 -6
- package/dist/{chunk-6PQNLL4E.js → chunk-5W7KJ5NQ.js} +37 -37
- package/dist/{chunk-Q35YZVDZ.js → chunk-5Y2FPLZE.js} +9 -9
- package/dist/{chunk-6W3LF3DB.js → chunk-5YFY4SFC.js} +2 -12
- package/dist/chunk-5YFY4SFC.js.map +1 -0
- package/dist/{chunk-F3NERYBQ.js → chunk-62VER7O4.js} +6 -6
- package/dist/{chunk-FBMU3VK5.js → chunk-6DCEDIF6.js} +2 -2
- package/dist/{chunk-LE2EDBXU.js → chunk-73WI7FL2.js} +18 -18
- package/dist/chunk-756MKA2J.js +45 -0
- package/dist/chunk-756MKA2J.js.map +1 -0
- package/dist/{chunk-ZRJCGBVV.js → chunk-7FJMRJDG.js} +2 -2
- package/dist/{chunk-7KGKDWWR.js → chunk-7HFLYNWN.js} +2 -2
- package/dist/{chunk-72J6C2AJ.js → chunk-7KIENXRE.js} +2 -2
- package/dist/{chunk-CBY5CXBD.js → chunk-7NPCEBZE.js} +5 -5
- package/dist/{chunk-46VBQG2D.js → chunk-7P4AQMGA.js} +13 -13
- package/dist/{chunk-X7L4H4VG.js → chunk-7TCT7KPQ.js} +742 -644
- package/dist/chunk-7TCT7KPQ.js.map +1 -0
- package/dist/{chunk-CVG4FILQ.js → chunk-7XO7YKPC.js} +280 -1035
- package/dist/chunk-7XO7YKPC.js.map +1 -0
- package/dist/{chunk-S7PVL7XH.js → chunk-A4BD4ZVB.js} +4 -4
- package/dist/{chunk-EF5SYXAY.js → chunk-ACL2V2KE.js} +30 -22
- package/dist/chunk-ACL2V2KE.js.map +1 -0
- package/dist/{chunk-73SOCVLS.js → chunk-AIEXYO2X.js} +3 -3
- package/dist/{chunk-U7TC2XJQ.js → chunk-AJPW3SV4.js} +3 -3
- package/dist/{chunk-HRJQAFKR.js → chunk-AX6YJA5U.js} +2 -2
- package/dist/{chunk-P5WABK2H.js → chunk-BCM7C3MJ.js} +9 -9
- package/dist/{chunk-DT7BORXG.js → chunk-BMJTNPWK.js} +2 -2
- package/dist/{chunk-HIHO2QE7.js → chunk-BT2MVGHT.js} +2 -2
- package/dist/{chunk-3XOISKZC.js → chunk-BXQYAAVE.js} +4 -4
- package/dist/{chunk-IBTXYLBW.js → chunk-CCFWY4GF.js} +2 -2
- package/dist/{chunk-ZOC3OP6F.js → chunk-CCR33J7L.js} +2 -2
- package/dist/{chunk-GTQ3SNEI.js → chunk-CD3MO3IC.js} +2 -2
- package/dist/{chunk-WSMYOLHG.js → chunk-CDEXRJB6.js} +5 -5
- package/dist/{chunk-3GLAPCVI.js → chunk-CFFNT2OY.js} +8 -8
- package/dist/{chunk-HO5Y2OOX.js → chunk-CMLJSF2F.js} +10 -10
- package/dist/{chunk-RA3FNMWF.js → chunk-CP7ZQHBW.js} +10 -10
- package/dist/{chunk-IOKSNX74.js → chunk-D5OWJZQR.js} +2 -2
- package/dist/{chunk-SQGXMHJO.js → chunk-DGLRZMXL.js} +3 -3
- package/dist/{chunk-GNEHAPKV.js → chunk-DJFTH2DI.js} +3 -3
- package/dist/{chunk-HQG4SLTE.js → chunk-DYJGYGPB.js} +2 -2
- package/dist/{chunk-4EAF3HSD.js → chunk-EJ7WARW7.js} +2 -2
- package/dist/{chunk-3AA6RNGE.js → chunk-ENS6E4RZ.js} +2 -2
- package/dist/{chunk-OOEO4MKY.js → chunk-EPWD4KRA.js} +2 -2
- package/dist/{chunk-PN66T6JA.js → chunk-EQE3MNQN.js} +5 -5
- package/dist/{chunk-TSBE4KOQ.js → chunk-EWL6NDOO.js} +3 -3
- package/dist/{chunk-OO2T63BY.js → chunk-EYS4ZOF5.js} +2 -2
- package/dist/{chunk-7CZTKBTI.js → chunk-FDAV72IX.js} +5 -5
- package/dist/{chunk-AG7VGUIW.js → chunk-FFNPUSVO.js} +7 -7
- package/dist/{chunk-P5T36BA3.js → chunk-FRP64DEK.js} +2 -2
- package/dist/{chunk-KBF3SE7G.js → chunk-FSP334UU.js} +2 -2
- package/dist/{chunk-BSX2R4CW.js → chunk-FTX5CNHA.js} +4 -4
- package/dist/{chunk-O756O2I7.js → chunk-FWOBNL2A.js} +1 -1
- package/dist/{chunk-6NIB2KGJ.js → chunk-FWYEZ3LE.js} +33 -33
- package/dist/{chunk-DLOYMWUQ.js → chunk-G4HQUBO4.js} +7 -7
- package/dist/{chunk-CSHBR2IZ.js → chunk-GDLDBR6B.js} +2 -2
- package/dist/chunk-GGV4NSG3.js +792 -0
- package/dist/chunk-GGV4NSG3.js.map +1 -0
- package/dist/{chunk-U36PO27Q.js → chunk-GHHM6WN4.js} +3 -3
- package/dist/{chunk-OANSIX34.js → chunk-GRSODLVO.js} +4 -4
- package/dist/{chunk-4R3JCVID.js → chunk-GT7JFQ4E.js} +410 -153
- package/dist/chunk-GT7JFQ4E.js.map +1 -0
- package/dist/{chunk-EU6XSQFM.js → chunk-GXW2I2M2.js} +2 -2
- package/dist/{chunk-5JEIDFPD.js → chunk-GZS37O3G.js} +1 -1
- package/dist/{chunk-XFNLU7EW.js → chunk-H5M33DAL.js} +15 -6
- package/dist/chunk-H5M33DAL.js.map +1 -0
- package/dist/{chunk-HNYJEAES.js → chunk-HQWVDQXW.js} +7 -7
- package/dist/{chunk-YXOKAG66.js → chunk-HU6JTNWF.js} +2 -2
- package/dist/{chunk-QRVNI5V6.js → chunk-I6KIQKU6.js} +3 -3
- package/dist/{chunk-APU42QDI.js → chunk-IBA5FMRE.js} +115 -111
- package/dist/chunk-IBA5FMRE.js.map +1 -0
- package/dist/{chunk-BNUPYHHZ.js → chunk-IDXTASGN.js} +4 -4
- package/dist/{chunk-KF3MF6FP.js → chunk-IECRGM6K.js} +3 -2
- package/dist/chunk-IECRGM6K.js.map +1 -0
- package/dist/chunk-IJYL5BZM.js +38 -0
- package/dist/chunk-IJYL5BZM.js.map +1 -0
- package/dist/{chunk-L6RXRRN3.js → chunk-ILDOW2IQ.js} +3 -3
- package/dist/{chunk-VUHPA3XQ.js → chunk-ITX2TB4K.js} +6 -6
- package/dist/{chunk-BXRIQZAH.js → chunk-J22HD2PB.js} +5 -5
- package/dist/{chunk-U47YDYLQ.js → chunk-J5MEDX7C.js} +8 -8
- package/dist/{chunk-F6LBGYS6.js → chunk-J7FBBLHF.js} +35 -35
- package/dist/{chunk-5JZYPZ72.js → chunk-JFK7NTEA.js} +4 -4
- package/dist/chunk-JFK7NTEA.js.map +1 -0
- package/dist/{chunk-QZRDCFHI.js → chunk-JM4HQPAI.js} +5 -5
- package/dist/{chunk-PIVGX42P.js → chunk-JNY5MT3I.js} +2 -2
- package/dist/{chunk-XWWXIZFP.js → chunk-JO6R5EXF.js} +7 -7
- package/dist/{chunk-NWZW2WHN.js → chunk-JQCGPTZ6.js} +9 -9
- package/dist/chunk-JRSNCSZN.js +37 -0
- package/dist/chunk-JRSNCSZN.js.map +1 -0
- package/dist/{chunk-OR37STQZ.js → chunk-KEXYBG7Q.js} +3 -3
- package/dist/{chunk-AZVANYMB.js → chunk-KUNFUSZ7.js} +2 -2
- package/dist/{chunk-DXZNDKQD.js → chunk-LEEJBZ5B.js} +2 -2
- package/dist/{chunk-STUCI6QA.js → chunk-LEKBNKLD.js} +1 -1
- package/dist/{chunk-STUCI6QA.js.map → chunk-LEKBNKLD.js.map} +1 -1
- package/dist/{chunk-AOLE4IRZ.js → chunk-LF5CBAOS.js} +5 -5
- package/dist/{chunk-BJIZ7PL7.js → chunk-LHLK7FUA.js} +145 -29
- package/dist/chunk-LHLK7FUA.js.map +1 -0
- package/dist/{chunk-RIMKJBCD.js → chunk-LMPTC4CX.js} +2 -2
- package/dist/{chunk-3KVWXKD6.js → chunk-LQ47YL6E.js} +2 -2
- package/dist/{chunk-RSNYGEVZ.js → chunk-LT4J7RHI.js} +13 -13
- package/dist/{chunk-U3HSFCON.js → chunk-MCTTONOW.js} +28 -28
- package/dist/{chunk-7DU35P5J.js → chunk-MIECLOQC.js} +9 -9
- package/dist/{chunk-FM4OUCC2.js → chunk-MOKYT3X3.js} +3 -3
- package/dist/{chunk-GZ64CASI.js → chunk-MVZYNZXE.js} +5 -4
- package/dist/chunk-MVZYNZXE.js.map +1 -0
- package/dist/{chunk-L7YURQI2.js → chunk-MXLKI7BI.js} +3 -3
- package/dist/{chunk-XRRSFQEV.js → chunk-NAZZLAWX.js} +2 -2
- package/dist/{chunk-UWJ5P5CU.js → chunk-NEK4WB5P.js} +3 -3
- package/dist/{chunk-6L7U46Y2.js → chunk-NKNVIO66.js} +2 -2
- package/dist/{chunk-JKUICTLM.js → chunk-NLAFNMPK.js} +2 -2
- package/dist/{chunk-4LKNIGHB.js → chunk-O2SBHS2N.js} +2 -2
- package/dist/{chunk-DWPOQ3S5.js → chunk-OTMWHZBY.js} +2 -2
- package/dist/{chunk-JTN3T4QN.js → chunk-PCFK7HKD.js} +14 -14
- package/dist/{chunk-VVCDB2T7.js → chunk-PCJLH45G.js} +3 -3
- package/dist/{chunk-PZ24CYDO.js → chunk-PFAUGEV5.js} +2 -2
- package/dist/{chunk-HGMWMK5K.js → chunk-PO3BH3KQ.js} +2 -2
- package/dist/{chunk-B74GSYR6.js → chunk-PUTS4DYW.js} +2 -2
- package/dist/{chunk-JSIDLTTG.js → chunk-PZ2V2XIK.js} +2 -2
- package/dist/{chunk-TMEQPODK.js → chunk-PZ37VDB5.js} +2 -2
- package/dist/{chunk-Q35DT6I6.js → chunk-QFMLAT7L.js} +234 -225
- package/dist/chunk-QFMLAT7L.js.map +1 -0
- package/dist/{chunk-LVONK3YQ.js → chunk-QRKTESVE.js} +2 -2
- package/dist/{chunk-HT5WSUC7.js → chunk-QXEDIDBZ.js} +3 -3
- package/dist/{chunk-WURSS6MP.js → chunk-R66YMYJU.js} +2 -2
- package/dist/{chunk-HDHK3SXK.js → chunk-RFLYID6H.js} +5 -5
- package/dist/{chunk-ADJJQSYC.js → chunk-RIYZFKIM.js} +39 -37
- package/dist/chunk-RIYZFKIM.js.map +1 -0
- package/dist/{chunk-JK7C5A4I.js → chunk-RQNZDTKT.js} +19 -19
- package/dist/{chunk-EHCUFCXM.js → chunk-RYSRFAHN.js} +32 -22
- package/dist/chunk-RYSRFAHN.js.map +1 -0
- package/dist/{chunk-I6VUUEXH.js → chunk-S2U4CDAC.js} +150 -150
- package/dist/chunk-S2U4CDAC.js.map +1 -0
- package/dist/{chunk-ST22GONV.js → chunk-S37GP7LX.js} +19 -19
- package/dist/{chunk-A2EWJQXX.js → chunk-SM5QX6UK.js} +4 -4
- package/dist/{chunk-FBE6AIIW.js → chunk-SOKNCW5U.js} +2 -2
- package/dist/{chunk-4W7VISE7.js → chunk-SSOO4GWN.js} +193 -194
- package/dist/chunk-SSOO4GWN.js.map +1 -0
- package/dist/{chunk-UP4BE32Y.js → chunk-SY2AAZNB.js} +5 -5
- package/dist/{chunk-33TPANCR.js → chunk-TFK4KFKA.js} +4 -4
- package/dist/{chunk-4432A3HQ.js → chunk-TIQPKOFW.js} +4 -4
- package/dist/{chunk-HPPKLBTJ.js → chunk-TJQDL3JH.js} +2 -2
- package/dist/chunk-TL7BOFFL.js +89 -0
- package/dist/chunk-TL7BOFFL.js.map +1 -0
- package/dist/{chunk-FD4Q5KFL.js → chunk-TLL22FFO.js} +2 -2
- package/dist/{chunk-QM5H4FPT.js → chunk-TV6BWONY.js} +3 -3
- package/dist/{chunk-4VKA5O7T.js → chunk-U6MPB3K6.js} +4 -4
- package/dist/{chunk-XOFUXMPP.js → chunk-ULJAOMJA.js} +2 -2
- package/dist/chunk-ULYQEFNH.js +529 -0
- package/dist/chunk-ULYQEFNH.js.map +1 -0
- package/dist/{chunk-H5EVWF6L.js → chunk-UNNJUJVD.js} +2 -2
- package/dist/{chunk-RGW24ZZM.js → chunk-UP7I3W6O.js} +51 -49
- package/dist/chunk-UP7I3W6O.js.map +1 -0
- package/dist/{chunk-5MZTJMZ3.js → chunk-UUGR3X5I.js} +17 -11
- package/dist/chunk-UUGR3X5I.js.map +1 -0
- package/dist/{chunk-Z6DKXQG7.js → chunk-UXXFMF4X.js} +2 -2
- package/dist/{chunk-OBQVTCTW.js → chunk-UYNCMZX5.js} +4 -4
- package/dist/{chunk-RGPYMHKI.js → chunk-V3K4RQO7.js} +9 -3
- package/dist/chunk-V3K4RQO7.js.map +1 -0
- package/dist/{chunk-KZHW27BV.js → chunk-V4QZ7UBK.js} +2 -2
- package/dist/{chunk-SUVEDKE2.js → chunk-VH5EGTH2.js} +3 -3
- package/dist/{chunk-MYNUBDU7.js → chunk-VYKW6TB2.js} +1 -1
- package/dist/chunk-VYKW6TB2.js.map +1 -0
- package/dist/{chunk-QEJTQTF5.js → chunk-W6T5HR3Z.js} +3 -3
- package/dist/{chunk-VP62LPLW.js → chunk-WCMG4HYI.js} +10 -10
- package/dist/{chunk-GZLLDA6P.js → chunk-WEFN327U.js} +2 -2
- package/dist/{chunk-7BST7BA6.js → chunk-WKHUZIOW.js} +1 -1
- package/dist/{chunk-ANHUMDJX.js → chunk-WNDTLK44.js} +2 -2
- package/dist/{chunk-2DS4UOYQ.js → chunk-WSZQNTVN.js} +2 -2
- package/dist/{chunk-GALB2G3W.js → chunk-X2AH4DRF.js} +2 -2
- package/dist/{chunk-Z2DAWUO3.js → chunk-XMNUZUUA.js} +6 -6
- package/dist/{chunk-GAIM5RNE.js → chunk-XN7NSPE6.js} +3 -3
- package/dist/chunk-XV6ZYRHK.js +59 -0
- package/dist/chunk-XV6ZYRHK.js.map +1 -0
- package/dist/{chunk-FLGUVRR7.js → chunk-Y5BSA3I7.js} +5 -5
- package/dist/{chunk-WRLWLGEF.js → chunk-Y5E3XQ2S.js} +25 -2
- package/dist/{chunk-WRLWLGEF.js.map → chunk-Y5E3XQ2S.js.map} +1 -1
- package/dist/{chunk-QCD5Y7K5.js → chunk-YEROLKOA.js} +16 -16
- package/dist/{chunk-NDF3SH3X.js → chunk-YJPKDRI2.js} +15 -15
- package/dist/{chunk-TQGJN5UZ.js → chunk-YV56F4UP.js} +318 -700
- package/dist/chunk-YV56F4UP.js.map +1 -0
- package/dist/{chunk-VAIESMPY.js → chunk-YVBHGMKC.js} +4 -4
- package/dist/{chunk-AD22P5X3.js → chunk-YXA2EKV3.js} +3 -3
- package/dist/{chunk-FDNJVZRE.js → chunk-YYCOSTUU.js} +17 -17
- package/dist/{chunk-NLMTNEWW.js → chunk-Z6E6TUAE.js} +2 -2
- package/dist/{chunk-BJW7G6EF.js → chunk-Z7IGO5EA.js} +3 -3
- package/dist/{chunk-NCX5SAQY.js → chunk-ZEIFJ6PX.js} +5 -5
- package/dist/{chunk-JRXHSVD5.js → chunk-ZS2UQ3DV.js} +65 -8
- package/dist/chunk-ZS2UQ3DV.js.map +1 -0
- package/dist/{chunk-4EONHNJU.js → chunk-ZVVT72MT.js} +2 -2
- package/dist/components/browser-viewer.d.ts +1 -1
- package/dist/composer.js +13 -13
- package/dist/{computer-viewer-KEDVLD42.js → computer-viewer-25AJIDYA.js} +9 -9
- package/dist/connect.js +10 -10
- package/dist/desktop.js +2 -2
- package/dist/editor.js +2 -2
- package/dist/{embedded-new-voice-LFHWWYD2.js → embedded-new-voice-RZZEJT6M.js} +7 -7
- package/dist/{embedded-voice-6QS4ANNX.js → embedded-voice-6OKSSPLW.js} +7 -7
- package/dist/{fleet-decision-row-QNSTP3VX.js → fleet-decision-row-NN2HXDX3.js} +2 -2
- package/dist/hooks/internal.d.ts +38 -0
- package/dist/hooks/use-client-config-flags.d.ts +12 -0
- package/dist/hooks/use-workspace-sessions.d.ts +10 -1
- package/dist/index.js +233 -227
- package/dist/interaction.js +11 -9
- package/dist/interaction.js.map +1 -1
- package/dist/{latest-question-AW3PPDUM.js → latest-question-2PFWQSSG.js} +4 -3
- package/dist/{latest-question-AW3PPDUM.js.map → latest-question-2PFWQSSG.js.map} +1 -1
- package/dist/machines.js +5 -5
- package/dist/messages/en.d.ts +3 -3
- package/dist/messages.js +1 -1
- package/dist/{model-policy-picker-menu-CURJ247L.js → model-policy-picker-menu-VVFGGAI6.js} +6 -6
- package/dist/native-previews.js +3 -3
- package/dist/{platform-activity-row-BMXXNZKX.js → platform-activity-row-ENQVIFTL.js} +2 -2
- package/dist/{queue-surface-implementation-2X5AXB6I.js → queue-surface-implementation-4SHOQPQQ.js} +10 -8
- package/dist/{queue-surface-implementation-2X5AXB6I.js.map → queue-surface-implementation-4SHOQPQQ.js.map} +1 -1
- package/dist/realtime.js +6 -6
- package/dist/{sandbox-files-4FBG3GS2.js → sandbox-files-CCOTGXXA.js} +11 -11
- package/dist/sandbox-files-CCOTGXXA.js.map +1 -0
- package/dist/session-app.js +258 -252
- package/dist/session-list-model.d.ts +1 -0
- package/dist/session-list-model.js +8 -2
- package/dist/{session-realtime-2XIB254N.js → session-realtime-JNKDSGH7.js} +3 -3
- package/dist/session-realtime-JNKDSGH7.js.map +1 -0
- package/dist/session-realtime.js +2 -2
- package/dist/session-ui.js +76 -71
- package/dist/session.js +24 -22
- package/dist/sites.js +2 -2
- package/dist/terminal.js +2 -2
- package/dist/this-computer.js +3 -3
- package/dist/timeline/invoked-tool.d.ts +5 -0
- package/dist/timeline/tool-display-name.d.ts +2 -2
- package/dist/timeline/tool-icon.d.ts +14 -0
- package/dist/timeline/tool-presentation.d.ts +8 -3
- package/dist/{timeline-annotation-markers-X4K2IEOO.js → timeline-annotation-markers-KHNYNY2J.js} +5 -5
- package/dist/{timeline-annotation-selection-MEHBW676.js → timeline-annotation-selection-AXEDJHBP.js} +7 -7
- package/dist/{timeline-annotations-dialog-U2FPQ3UY.js → timeline-annotations-dialog-AV4ZBXRC.js} +9 -9
- package/dist/timeline-model.js +25 -23
- package/dist/ui/access-list.js +18 -18
- package/dist/ui/cadence-picker.js +2 -2
- package/dist/ui/choice-cards.js +2 -2
- package/dist/ui/detail-page.js +2 -2
- package/dist/ui/detail-sheet.js +2 -2
- package/dist/ui/diff-view.js +2 -2
- package/dist/ui/disclosure.js +4 -4
- package/dist/ui/flush-form-page.js +3 -3
- package/dist/ui/form-dialog.js +2 -2
- package/dist/ui/list-row.js +4 -4
- package/dist/ui/revision-history.js +11 -11
- package/dist/ui/role-select.js +7 -7
- package/dist/ui/select-menu.js +2 -2
- package/dist/ui/settings-nav.js +3 -3
- package/dist/usage.js +3 -3
- package/dist/workbench.js +11 -11
- package/package.json +4 -4
- package/src/app/app-state.tsx +3 -1
- package/src/app/components/capabilities/session-machine-card.tsx +9 -2
- package/src/app/components/rail/session-list.tsx +254 -44
- package/src/app/components/rail/session-row-content.tsx +24 -2
- package/src/app/components/rail/session-shell.tsx +14 -9
- package/src/app/components/rail/site-session-group-heading.tsx +59 -20
- package/src/app/components/session/session-tenancy-control.tsx +18 -0
- package/src/app/components/session/site-origin-link.test.tsx +73 -0
- package/src/app/components/session/site-origin-link.tsx +4 -2
- package/src/app/embed/memory-navigation.tsx +1 -0
- package/src/app/lib/actions/held-modifier.test.ts +101 -0
- package/src/app/lib/actions/held-modifier.ts +108 -0
- package/src/app/lib/console-site.tsx +38 -0
- package/src/app/lib/navigation.tsx +4 -0
- package/src/app/lib/routes.tsx +42 -0
- package/src/app/lib/session-failure-toasts.ts +26 -0
- package/src/app/lib/session-ui-features.tsx +18 -4
- package/src/app/lib/sessions-group.tsx +219 -30
- package/src/app/lib/site-opened.tsx +48 -0
- package/src/app/lib/site-session-groups.test.ts +173 -6
- package/src/app/lib/site-view-routes.test.ts +55 -0
- package/src/app/lib/use-session-list-hint-refresh.tsx +44 -4
- package/src/app/routes/artifacts.tsx +2 -29
- package/src/app/routes/session-transient-failures.test.tsx +343 -0
- package/src/app/routes/session-unavailable.tsx +74 -3
- package/src/app/routes/session.tsx +4 -13
- package/src/app/routes/sessions-index.tsx +13 -9
- package/src/app/routes/site-view.test.tsx +476 -0
- package/src/app/routes/site-view.tsx +583 -0
- package/src/components/browser-viewer.tsx +16 -2
- package/src/hooks/internal.ts +129 -6
- package/src/hooks/use-client-config-flags.ts +8 -0
- package/src/hooks/use-session-events.ts +83 -9
- package/src/hooks/use-workspace-sessions.ts +21 -1
- package/src/messages/en.ts +3 -3
- package/src/session-list-model.ts +4 -0
- package/src/timeline/activity-rail.tsx +3 -2
- package/src/timeline/invoked-tool.ts +14 -4
- package/src/timeline/projection.ts +11 -6
- package/src/timeline/rolling-activity.tsx +6 -2
- package/src/timeline/tool-display-name.ts +2 -2
- package/src/timeline/tool-icon.tsx +165 -0
- package/src/timeline/tool-presentation.ts +207 -48
- package/src/timeline/tool-renderers.tsx +1 -70
- package/styles/compiled.css +38 -0
- package/dist/chunk-22ZBT6CN.js +0 -50
- package/dist/chunk-22ZBT6CN.js.map +0 -1
- package/dist/chunk-4R3JCVID.js.map +0 -1
- package/dist/chunk-4W7VISE7.js.map +0 -1
- package/dist/chunk-5JZYPZ72.js.map +0 -1
- package/dist/chunk-5MZTJMZ3.js.map +0 -1
- package/dist/chunk-6W3LF3DB.js.map +0 -1
- package/dist/chunk-ADJJQSYC.js.map +0 -1
- package/dist/chunk-APU42QDI.js.map +0 -1
- package/dist/chunk-BJIZ7PL7.js.map +0 -1
- package/dist/chunk-CVG4FILQ.js.map +0 -1
- package/dist/chunk-EF5SYXAY.js.map +0 -1
- package/dist/chunk-EHCUFCXM.js.map +0 -1
- package/dist/chunk-GZ64CASI.js.map +0 -1
- package/dist/chunk-I6VUUEXH.js.map +0 -1
- package/dist/chunk-JRXHSVD5.js.map +0 -1
- package/dist/chunk-KF3MF6FP.js.map +0 -1
- package/dist/chunk-MYNUBDU7.js.map +0 -1
- package/dist/chunk-NAWXARTY.js.map +0 -1
- package/dist/chunk-PM3OSANE.js.map +0 -1
- package/dist/chunk-Q35DT6I6.js.map +0 -1
- package/dist/chunk-R25ZKOZR.js +0 -24
- package/dist/chunk-R25ZKOZR.js.map +0 -1
- package/dist/chunk-RGPYMHKI.js.map +0 -1
- package/dist/chunk-RGW24ZZM.js.map +0 -1
- package/dist/chunk-ROQOVH4N.js.map +0 -1
- package/dist/chunk-TQGJN5UZ.js.map +0 -1
- package/dist/chunk-X7L4H4VG.js.map +0 -1
- package/dist/chunk-XFNLU7EW.js.map +0 -1
- package/dist/chunk-Z5WMLJKI.js.map +0 -1
- /package/dist/{browser-viewer-RYYQSRTC.js.map → app/lib/console-site.js.map} +0 -0
- /package/dist/{chat-interactive-block-ABCRKXJ4.js.map → app/lib/site-opened.js.map} +0 -0
- /package/dist/{computer-viewer-KEDVLD42.js.map → browser-viewer-QMCNV4RI.js.map} +0 -0
- /package/dist/{embedded-new-voice-LFHWWYD2.js.map → chat-interactive-block-PMIAUXSO.js.map} +0 -0
- /package/dist/{chunk-TGVVEGZG.js.map → chunk-22FFOHPT.js.map} +0 -0
- /package/dist/{chunk-UHFWF6ZU.js.map → chunk-2FPS5H2D.js.map} +0 -0
- /package/dist/{chunk-5POTDNQT.js.map → chunk-2NC7NZCE.js.map} +0 -0
- /package/dist/{chunk-ZKYYZH6L.js.map → chunk-2QBYDGWO.js.map} +0 -0
- /package/dist/{chunk-TWXIFWBD.js.map → chunk-34EU25RL.js.map} +0 -0
- /package/dist/{chunk-R63QEVPK.js.map → chunk-35BC2FU2.js.map} +0 -0
- /package/dist/{chunk-PTGRFAMH.js.map → chunk-3ABPIUCK.js.map} +0 -0
- /package/dist/{chunk-S4SC5SSV.js.map → chunk-3GU7AWG7.js.map} +0 -0
- /package/dist/{chunk-722UO6YQ.js.map → chunk-3PEXVG4D.js.map} +0 -0
- /package/dist/{chunk-63VGE4OH.js.map → chunk-3RMKPHBL.js.map} +0 -0
- /package/dist/{chunk-RQDFYQHA.js.map → chunk-3STBLX4O.js.map} +0 -0
- /package/dist/{chunk-S4EZ3JUB.js.map → chunk-3X5FKDYQ.js.map} +0 -0
- /package/dist/{chunk-KTRKZRID.js.map → chunk-4GLLWX33.js.map} +0 -0
- /package/dist/{chunk-SD2K5ZN5.js.map → chunk-4LPA25NQ.js.map} +0 -0
- /package/dist/{chunk-KWKGBGAF.js.map → chunk-4RMN4E2Y.js.map} +0 -0
- /package/dist/{chunk-X7ASQHR6.js.map → chunk-4SAGYEVB.js.map} +0 -0
- /package/dist/{chunk-HTT3FB7T.js.map → chunk-4VK2R5QC.js.map} +0 -0
- /package/dist/{chunk-DDK4WFJ3.js.map → chunk-4XQC7VLT.js.map} +0 -0
- /package/dist/{chunk-IVOA3DXA.js.map → chunk-4YXAQMTD.js.map} +0 -0
- /package/dist/{chunk-HOJGAJAB.js.map → chunk-52WK2GGK.js.map} +0 -0
- /package/dist/{chunk-NYZQ7LO7.js.map → chunk-552UYIQ7.js.map} +0 -0
- /package/dist/{chunk-LEXPBQ56.js.map → chunk-5DSKMG2I.js.map} +0 -0
- /package/dist/{chunk-WNG757ID.js.map → chunk-5FA455GR.js.map} +0 -0
- /package/dist/{chunk-HWDGJFM4.js.map → chunk-5FEN3KYH.js.map} +0 -0
- /package/dist/{chunk-OSVHU2WU.js.map → chunk-5JHRMUAZ.js.map} +0 -0
- /package/dist/{chunk-RKB2Z457.js.map → chunk-5VGJXWQ2.js.map} +0 -0
- /package/dist/{chunk-GFUUFM2O.js.map → chunk-5W6ZDKRR.js.map} +0 -0
- /package/dist/{chunk-6PQNLL4E.js.map → chunk-5W7KJ5NQ.js.map} +0 -0
- /package/dist/{chunk-Q35YZVDZ.js.map → chunk-5Y2FPLZE.js.map} +0 -0
- /package/dist/{chunk-F3NERYBQ.js.map → chunk-62VER7O4.js.map} +0 -0
- /package/dist/{chunk-FBMU3VK5.js.map → chunk-6DCEDIF6.js.map} +0 -0
- /package/dist/{chunk-LE2EDBXU.js.map → chunk-73WI7FL2.js.map} +0 -0
- /package/dist/{chunk-ZRJCGBVV.js.map → chunk-7FJMRJDG.js.map} +0 -0
- /package/dist/{chunk-7KGKDWWR.js.map → chunk-7HFLYNWN.js.map} +0 -0
- /package/dist/{chunk-72J6C2AJ.js.map → chunk-7KIENXRE.js.map} +0 -0
- /package/dist/{chunk-CBY5CXBD.js.map → chunk-7NPCEBZE.js.map} +0 -0
- /package/dist/{chunk-46VBQG2D.js.map → chunk-7P4AQMGA.js.map} +0 -0
- /package/dist/{chunk-S7PVL7XH.js.map → chunk-A4BD4ZVB.js.map} +0 -0
- /package/dist/{chunk-73SOCVLS.js.map → chunk-AIEXYO2X.js.map} +0 -0
- /package/dist/{chunk-U7TC2XJQ.js.map → chunk-AJPW3SV4.js.map} +0 -0
- /package/dist/{chunk-HRJQAFKR.js.map → chunk-AX6YJA5U.js.map} +0 -0
- /package/dist/{chunk-P5WABK2H.js.map → chunk-BCM7C3MJ.js.map} +0 -0
- /package/dist/{chunk-DT7BORXG.js.map → chunk-BMJTNPWK.js.map} +0 -0
- /package/dist/{chunk-HIHO2QE7.js.map → chunk-BT2MVGHT.js.map} +0 -0
- /package/dist/{chunk-3XOISKZC.js.map → chunk-BXQYAAVE.js.map} +0 -0
- /package/dist/{chunk-IBTXYLBW.js.map → chunk-CCFWY4GF.js.map} +0 -0
- /package/dist/{chunk-ZOC3OP6F.js.map → chunk-CCR33J7L.js.map} +0 -0
- /package/dist/{chunk-GTQ3SNEI.js.map → chunk-CD3MO3IC.js.map} +0 -0
- /package/dist/{chunk-WSMYOLHG.js.map → chunk-CDEXRJB6.js.map} +0 -0
- /package/dist/{chunk-3GLAPCVI.js.map → chunk-CFFNT2OY.js.map} +0 -0
- /package/dist/{chunk-HO5Y2OOX.js.map → chunk-CMLJSF2F.js.map} +0 -0
- /package/dist/{chunk-RA3FNMWF.js.map → chunk-CP7ZQHBW.js.map} +0 -0
- /package/dist/{chunk-IOKSNX74.js.map → chunk-D5OWJZQR.js.map} +0 -0
- /package/dist/{chunk-SQGXMHJO.js.map → chunk-DGLRZMXL.js.map} +0 -0
- /package/dist/{chunk-GNEHAPKV.js.map → chunk-DJFTH2DI.js.map} +0 -0
- /package/dist/{chunk-HQG4SLTE.js.map → chunk-DYJGYGPB.js.map} +0 -0
- /package/dist/{chunk-4EAF3HSD.js.map → chunk-EJ7WARW7.js.map} +0 -0
- /package/dist/{chunk-3AA6RNGE.js.map → chunk-ENS6E4RZ.js.map} +0 -0
- /package/dist/{chunk-OOEO4MKY.js.map → chunk-EPWD4KRA.js.map} +0 -0
- /package/dist/{chunk-PN66T6JA.js.map → chunk-EQE3MNQN.js.map} +0 -0
- /package/dist/{chunk-TSBE4KOQ.js.map → chunk-EWL6NDOO.js.map} +0 -0
- /package/dist/{chunk-OO2T63BY.js.map → chunk-EYS4ZOF5.js.map} +0 -0
- /package/dist/{chunk-7CZTKBTI.js.map → chunk-FDAV72IX.js.map} +0 -0
- /package/dist/{chunk-AG7VGUIW.js.map → chunk-FFNPUSVO.js.map} +0 -0
- /package/dist/{chunk-P5T36BA3.js.map → chunk-FRP64DEK.js.map} +0 -0
- /package/dist/{chunk-KBF3SE7G.js.map → chunk-FSP334UU.js.map} +0 -0
- /package/dist/{chunk-BSX2R4CW.js.map → chunk-FTX5CNHA.js.map} +0 -0
- /package/dist/{chunk-O756O2I7.js.map → chunk-FWOBNL2A.js.map} +0 -0
- /package/dist/{chunk-6NIB2KGJ.js.map → chunk-FWYEZ3LE.js.map} +0 -0
- /package/dist/{chunk-DLOYMWUQ.js.map → chunk-G4HQUBO4.js.map} +0 -0
- /package/dist/{chunk-CSHBR2IZ.js.map → chunk-GDLDBR6B.js.map} +0 -0
- /package/dist/{chunk-U36PO27Q.js.map → chunk-GHHM6WN4.js.map} +0 -0
- /package/dist/{chunk-OANSIX34.js.map → chunk-GRSODLVO.js.map} +0 -0
- /package/dist/{chunk-EU6XSQFM.js.map → chunk-GXW2I2M2.js.map} +0 -0
- /package/dist/{chunk-5JEIDFPD.js.map → chunk-GZS37O3G.js.map} +0 -0
- /package/dist/{chunk-HNYJEAES.js.map → chunk-HQWVDQXW.js.map} +0 -0
- /package/dist/{chunk-YXOKAG66.js.map → chunk-HU6JTNWF.js.map} +0 -0
- /package/dist/{chunk-QRVNI5V6.js.map → chunk-I6KIQKU6.js.map} +0 -0
- /package/dist/{chunk-BNUPYHHZ.js.map → chunk-IDXTASGN.js.map} +0 -0
- /package/dist/{chunk-L6RXRRN3.js.map → chunk-ILDOW2IQ.js.map} +0 -0
- /package/dist/{chunk-VUHPA3XQ.js.map → chunk-ITX2TB4K.js.map} +0 -0
- /package/dist/{chunk-BXRIQZAH.js.map → chunk-J22HD2PB.js.map} +0 -0
- /package/dist/{chunk-U47YDYLQ.js.map → chunk-J5MEDX7C.js.map} +0 -0
- /package/dist/{chunk-F6LBGYS6.js.map → chunk-J7FBBLHF.js.map} +0 -0
- /package/dist/{chunk-QZRDCFHI.js.map → chunk-JM4HQPAI.js.map} +0 -0
- /package/dist/{chunk-PIVGX42P.js.map → chunk-JNY5MT3I.js.map} +0 -0
- /package/dist/{chunk-XWWXIZFP.js.map → chunk-JO6R5EXF.js.map} +0 -0
- /package/dist/{chunk-NWZW2WHN.js.map → chunk-JQCGPTZ6.js.map} +0 -0
- /package/dist/{chunk-OR37STQZ.js.map → chunk-KEXYBG7Q.js.map} +0 -0
- /package/dist/{chunk-AZVANYMB.js.map → chunk-KUNFUSZ7.js.map} +0 -0
- /package/dist/{chunk-DXZNDKQD.js.map → chunk-LEEJBZ5B.js.map} +0 -0
- /package/dist/{chunk-AOLE4IRZ.js.map → chunk-LF5CBAOS.js.map} +0 -0
- /package/dist/{chunk-RIMKJBCD.js.map → chunk-LMPTC4CX.js.map} +0 -0
- /package/dist/{chunk-3KVWXKD6.js.map → chunk-LQ47YL6E.js.map} +0 -0
- /package/dist/{chunk-RSNYGEVZ.js.map → chunk-LT4J7RHI.js.map} +0 -0
- /package/dist/{chunk-U3HSFCON.js.map → chunk-MCTTONOW.js.map} +0 -0
- /package/dist/{chunk-7DU35P5J.js.map → chunk-MIECLOQC.js.map} +0 -0
- /package/dist/{chunk-FM4OUCC2.js.map → chunk-MOKYT3X3.js.map} +0 -0
- /package/dist/{chunk-L7YURQI2.js.map → chunk-MXLKI7BI.js.map} +0 -0
- /package/dist/{chunk-XRRSFQEV.js.map → chunk-NAZZLAWX.js.map} +0 -0
- /package/dist/{chunk-UWJ5P5CU.js.map → chunk-NEK4WB5P.js.map} +0 -0
- /package/dist/{chunk-6L7U46Y2.js.map → chunk-NKNVIO66.js.map} +0 -0
- /package/dist/{chunk-JKUICTLM.js.map → chunk-NLAFNMPK.js.map} +0 -0
- /package/dist/{chunk-4LKNIGHB.js.map → chunk-O2SBHS2N.js.map} +0 -0
- /package/dist/{chunk-DWPOQ3S5.js.map → chunk-OTMWHZBY.js.map} +0 -0
- /package/dist/{chunk-JTN3T4QN.js.map → chunk-PCFK7HKD.js.map} +0 -0
- /package/dist/{chunk-VVCDB2T7.js.map → chunk-PCJLH45G.js.map} +0 -0
- /package/dist/{chunk-PZ24CYDO.js.map → chunk-PFAUGEV5.js.map} +0 -0
- /package/dist/{chunk-HGMWMK5K.js.map → chunk-PO3BH3KQ.js.map} +0 -0
- /package/dist/{chunk-B74GSYR6.js.map → chunk-PUTS4DYW.js.map} +0 -0
- /package/dist/{chunk-JSIDLTTG.js.map → chunk-PZ2V2XIK.js.map} +0 -0
- /package/dist/{chunk-TMEQPODK.js.map → chunk-PZ37VDB5.js.map} +0 -0
- /package/dist/{chunk-LVONK3YQ.js.map → chunk-QRKTESVE.js.map} +0 -0
- /package/dist/{chunk-HT5WSUC7.js.map → chunk-QXEDIDBZ.js.map} +0 -0
- /package/dist/{chunk-WURSS6MP.js.map → chunk-R66YMYJU.js.map} +0 -0
- /package/dist/{chunk-HDHK3SXK.js.map → chunk-RFLYID6H.js.map} +0 -0
- /package/dist/{chunk-JK7C5A4I.js.map → chunk-RQNZDTKT.js.map} +0 -0
- /package/dist/{chunk-ST22GONV.js.map → chunk-S37GP7LX.js.map} +0 -0
- /package/dist/{chunk-A2EWJQXX.js.map → chunk-SM5QX6UK.js.map} +0 -0
- /package/dist/{chunk-FBE6AIIW.js.map → chunk-SOKNCW5U.js.map} +0 -0
- /package/dist/{chunk-UP4BE32Y.js.map → chunk-SY2AAZNB.js.map} +0 -0
- /package/dist/{chunk-33TPANCR.js.map → chunk-TFK4KFKA.js.map} +0 -0
- /package/dist/{chunk-4432A3HQ.js.map → chunk-TIQPKOFW.js.map} +0 -0
- /package/dist/{chunk-HPPKLBTJ.js.map → chunk-TJQDL3JH.js.map} +0 -0
- /package/dist/{chunk-FD4Q5KFL.js.map → chunk-TLL22FFO.js.map} +0 -0
- /package/dist/{chunk-QM5H4FPT.js.map → chunk-TV6BWONY.js.map} +0 -0
- /package/dist/{chunk-4VKA5O7T.js.map → chunk-U6MPB3K6.js.map} +0 -0
- /package/dist/{chunk-XOFUXMPP.js.map → chunk-ULJAOMJA.js.map} +0 -0
- /package/dist/{chunk-H5EVWF6L.js.map → chunk-UNNJUJVD.js.map} +0 -0
- /package/dist/{chunk-Z6DKXQG7.js.map → chunk-UXXFMF4X.js.map} +0 -0
- /package/dist/{chunk-OBQVTCTW.js.map → chunk-UYNCMZX5.js.map} +0 -0
- /package/dist/{chunk-KZHW27BV.js.map → chunk-V4QZ7UBK.js.map} +0 -0
- /package/dist/{chunk-SUVEDKE2.js.map → chunk-VH5EGTH2.js.map} +0 -0
- /package/dist/{chunk-QEJTQTF5.js.map → chunk-W6T5HR3Z.js.map} +0 -0
- /package/dist/{chunk-VP62LPLW.js.map → chunk-WCMG4HYI.js.map} +0 -0
- /package/dist/{chunk-GZLLDA6P.js.map → chunk-WEFN327U.js.map} +0 -0
- /package/dist/{chunk-7BST7BA6.js.map → chunk-WKHUZIOW.js.map} +0 -0
- /package/dist/{chunk-ANHUMDJX.js.map → chunk-WNDTLK44.js.map} +0 -0
- /package/dist/{chunk-2DS4UOYQ.js.map → chunk-WSZQNTVN.js.map} +0 -0
- /package/dist/{chunk-GALB2G3W.js.map → chunk-X2AH4DRF.js.map} +0 -0
- /package/dist/{chunk-Z2DAWUO3.js.map → chunk-XMNUZUUA.js.map} +0 -0
- /package/dist/{chunk-GAIM5RNE.js.map → chunk-XN7NSPE6.js.map} +0 -0
- /package/dist/{chunk-FLGUVRR7.js.map → chunk-Y5BSA3I7.js.map} +0 -0
- /package/dist/{chunk-QCD5Y7K5.js.map → chunk-YEROLKOA.js.map} +0 -0
- /package/dist/{chunk-NDF3SH3X.js.map → chunk-YJPKDRI2.js.map} +0 -0
- /package/dist/{chunk-VAIESMPY.js.map → chunk-YVBHGMKC.js.map} +0 -0
- /package/dist/{chunk-AD22P5X3.js.map → chunk-YXA2EKV3.js.map} +0 -0
- /package/dist/{chunk-FDNJVZRE.js.map → chunk-YYCOSTUU.js.map} +0 -0
- /package/dist/{chunk-NLMTNEWW.js.map → chunk-Z6E6TUAE.js.map} +0 -0
- /package/dist/{chunk-BJW7G6EF.js.map → chunk-Z7IGO5EA.js.map} +0 -0
- /package/dist/{chunk-NCX5SAQY.js.map → chunk-ZEIFJ6PX.js.map} +0 -0
- /package/dist/{chunk-4EONHNJU.js.map → chunk-ZVVT72MT.js.map} +0 -0
- /package/dist/{embedded-voice-6QS4ANNX.js.map → computer-viewer-25AJIDYA.js.map} +0 -0
- /package/dist/{model-policy-picker-menu-CURJ247L.js.map → embedded-new-voice-RZZEJT6M.js.map} +0 -0
- /package/dist/{sandbox-files-4FBG3GS2.js.map → embedded-voice-6OKSSPLW.js.map} +0 -0
- /package/dist/{fleet-decision-row-QNSTP3VX.js.map → fleet-decision-row-NN2HXDX3.js.map} +0 -0
- /package/dist/{session-realtime-2XIB254N.js.map → model-policy-picker-menu-VVFGGAI6.js.map} +0 -0
- /package/dist/{platform-activity-row-BMXXNZKX.js.map → platform-activity-row-ENQVIFTL.js.map} +0 -0
- /package/dist/{timeline-annotation-markers-X4K2IEOO.js.map → timeline-annotation-markers-KHNYNY2J.js.map} +0 -0
- /package/dist/{timeline-annotation-selection-MEHBW676.js.map → timeline-annotation-selection-AXEDJHBP.js.map} +0 -0
- /package/dist/{timeline-annotations-dialog-U2FPQ3UY.js.map → timeline-annotations-dialog-AV4ZBXRC.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/queue-draft-policy.ts","../src/components/queue-surface-state.tsx"],"sourcesContent":["import type { ComposerState } from \"../hooks/use-composer\";\n\n/**\n * Decide whether checking out a queued prompt would replace current composer\n * content. `hasDraftContent` reads the synchronous draft refs, so this stays\n * correct even when a controlled input update has not rendered yet.\n */\nexport function requestQueueDraftEdit(\n composer: Pick<ComposerState, \"hasDraftContent\">,\n confirmReplacement: () => void,\n editImmediately: () => void,\n): void {\n if (composer.hasDraftContent()) {\n confirmReplacement();\n } else {\n editImmediately();\n }\n}\n","import { Loader2Icon, RotateCwIcon } from \"lucide-react\";\n\nimport type { UseTurnQueueResult } from \"../hooks/use-turn-queue\";\nimport { useErrorMessage } from \"../lib/error-message\";\nimport { useOpenGeniText } from \"../messages/runtime\";\n\ntype QueueStateProps = {\n queue: UseTurnQueueResult;\n};\n\nexport function EmptyQueueStateSurface({ queue }: QueueStateProps) {\n const hasError = Boolean(queue.error || queue.mutationError);\n return (\n <div\n className=\"og-root mx-auto mb-2 w-full max-w-3xl shrink-0 px-4 sm:px-6\"\n data-testid=\"queue-surface\"\n >\n <div className=\"overflow-hidden rounded-lg border border-border bg-surface/80 shadow-sm\">\n {queue.stoppingPreviousAttempt ? (\n <QueueStoppingStatus queue={queue} dividerAfter={hasError} />\n ) : null}\n {hasError ? <QueueErrorAlert queue={queue} /> : null}\n </div>\n </div>\n );\n}\n\nexport function QueueStoppingStatus({\n queue,\n dividerAfter = false,\n}: QueueStateProps & { dividerAfter?: boolean }) {\n const t = useOpenGeniText();\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className={`flex min-h-11 items-center gap-2.5 bg-status-waiting/[0.07] px-3 py-2 text-og-control text-fg ${\n dividerAfter ? \"border-b border-status-waiting/20\" : \"\"\n }`}\n data-testid=\"stopping-previous-attempt\"\n >\n <Loader2Icon\n aria-hidden=\"true\"\n className=\"size-3.5 shrink-0 animate-spin text-status-waiting motion-reduce:animate-none\"\n />\n <span className=\"min-w-0\">\n <span className=\"font-medium\">\n {queue.effectiveControl?.state === \"paused\"\n ? t(\"queueSurfaceState.stoppingCurrentAttempt\")\n : t(\"queueSurfaceState.stoppingPreviousAttempt\")}\n </span>{\" \"}\n <span className=\"text-fg-muted\">\n {queue.effectiveControl?.state === \"paused\"\n ? t(\"queueSurfaceState.queuedWorkStaysSavedUntil\")\n : t(\"queueSurfaceState.queuedWorkIsSavedAnd\")}\n </span>\n </span>\n </div>\n );\n}\n\nexport function QueueErrorAlert({\n queue,\n dividerBefore = false,\n}: QueueStateProps & { dividerBefore?: boolean }) {\n const t = useOpenGeniText();\n const formatError = useErrorMessage();\n return (\n <div className={`${dividerBefore ? \"border-t border-border\" : \"\"} p-2`}>\n <div\n role=\"alert\"\n className=\"flex min-w-0 max-w-full flex-wrap items-start gap-2 rounded-md bg-status-failed/10 px-2 py-1.5 text-og-control text-status-failed\"\n >\n <span\n role=\"region\"\n aria-label={t(\"queueSurfaceState.queueErrorDetails\")}\n tabIndex={0}\n className=\"max-h-[min(5rem,20dvh)] min-w-0 max-w-full flex-[1_1_5rem] overflow-auto overscroll-contain whitespace-pre-wrap rounded-sm outline-hidden [overflow-wrap:anywhere] [unicode-bidi:plaintext] focus-visible:ring-2 focus-visible:ring-ring/40\"\n data-testid=\"queue-error-message\"\n dir=\"auto\"\n >\n {formatError(queue.mutationError ?? queue.error)}\n </span>\n <button\n type=\"button\"\n onClick={() => {\n queue.clearMutationError();\n void queue.refresh();\n }}\n aria-label={t(\"queueSurfaceState.dismissQueueErrorAndRetry\")}\n title={t(\"queueSurfaceState.retryLoadingTheQueue\")}\n className=\"ms-auto inline-flex size-7 shrink-0 items-center justify-center self-start rounded-md outline-hidden transition-colors hover:bg-surface-3 focus-visible:ring-2 focus-visible:ring-ring/40 motion-reduce:transition-none pointer-coarse:size-[44px]\"\n >\n <RotateCwIcon className=\"size-3.5\" />\n </button>\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;AAOO,SAAS,sBACd,UACA,oBACA,iBACM;AACN,MAAI,SAAS,gBAAgB,GAAG;AAC9B,uBAAmB;AAAA,EACrB,OAAO;AACL,oBAAgB;AAAA,EAClB;AACF;;;ACjBA,SAAS,aAAa,oBAAoB;AAiBpC,SAEI,KAFJ;AAPC,SAAS,uBAAuB,EAAE,MAAM,GAAoB;AACjE,QAAM,WAAW,QAAQ,MAAM,SAAS,MAAM,aAAa;AAC3D,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAY;AAAA,MAEZ,+BAAC,SAAI,WAAU,2EACZ;AAAA,cAAM,0BACL,oBAAC,uBAAoB,OAAc,cAAc,UAAU,IACzD;AAAA,QACH,WAAW,oBAAC,mBAAgB,OAAc,IAAK;AAAA,SAClD;AAAA;AAAA,EACF;AAEJ;AAEO,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA,eAAe;AACjB,GAAiD;AAC/C,QAAM,IAAI,gBAAgB;AAC1B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,aAAU;AAAA,MACV,WAAW,iGACT,eAAe,sCAAsC,EACvD;AAAA,MACA,eAAY;AAAA,MAEZ;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,eAAY;AAAA,YACZ,WAAU;AAAA;AAAA,QACZ;AAAA,QACA,qBAAC,UAAK,WAAU,WACd;AAAA,8BAAC,UAAK,WAAU,eACb,gBAAM,kBAAkB,UAAU,WAC/B,EAAE,0CAA0C,IAC5C,EAAE,2CAA2C,GACnD;AAAA,UAAQ;AAAA,UACR,oBAAC,UAAK,WAAU,iBACb,gBAAM,kBAAkB,UAAU,WAC/B,EAAE,6CAA6C,IAC/C,EAAE,wCAAwC,GAChD;AAAA,WACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAEO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA,gBAAgB;AAClB,GAAkD;AAChD,QAAM,IAAI,gBAAgB;AAC1B,QAAM,cAAc,gBAAgB;AACpC,SACE,oBAAC,SAAI,WAAW,GAAG,gBAAgB,2BAA2B,EAAE,QAC9D;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAU;AAAA,MAEV;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAY,EAAE,qCAAqC;AAAA,YACnD,UAAU;AAAA,YACV,WAAU;AAAA,YACV,eAAY;AAAA,YACZ,KAAI;AAAA,YAEH,sBAAY,MAAM,iBAAiB,MAAM,KAAK;AAAA;AAAA,QACjD;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS,MAAM;AACb,oBAAM,mBAAmB;AACzB,mBAAK,MAAM,QAAQ;AAAA,YACrB;AAAA,YACA,cAAY,EAAE,6CAA6C;AAAA,YAC3D,OAAO,EAAE,wCAAwC;AAAA,YACjD,WAAU;AAAA,YAEV,8BAAC,gBAAa,WAAU,YAAW;AAAA;AAAA,QACrC;AAAA;AAAA;AAAA,EACF,GACF;AAEJ;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/app/components/rail/session-shell.tsx"],"sourcesContent":["// The session shell every session surface renders: the left rail (fixed and\n// resizable on desktop, an overlay drawer on phones), the canvas top strip with\n// the session header on session routes, and the canvas itself. Surface-owned\n// sections (workspace switcher, navigation extras, footer, banners) come in as\n// slots, so the web app and embeds share one shell and differ only in what they\n// put in it.\nimport type { SessionSummary } from \"@opengeni/sdk\";\nimport { MenuIcon, MessagesSquareIcon, Settings2Icon } from \"lucide-react\";\nimport {\n useCallback,\n useContext,\n useEffect,\n lazy,\n useId,\n useRef,\n useState,\n useSyncExternalStore,\n Suspense,\n type PointerEvent as ReactPointerEvent,\n type ReactNode,\n type RefObject,\n} from \"react\";\nimport { toast } from \"../../lib/toast\";\n\nimport { findPickerRow } from \"../../../model-policy\";\nimport { useLastStartedTurnPolicy } from \"../../../hooks/use-last-started-turn-policy\";\nimport { useSessionLineage } from \"../../../hooks/use-session-lineage\";\nimport { BrandMark, Wordmark } from \"../brand-mark\";\nimport { SessionHeader } from \"./session-header\";\nimport { SessionStartupProvider } from \"../../../lib/session-startup\";\nimport {\n requestSessionUsageLimitEditor,\n sessionUsageLimitCapability,\n} from \"../../lib/session-usage-limit\";\nimport { RAIL_DEFAULT_WIDTH, RAIL_MAX_WIDTH, RAIL_MIN_WIDTH, useRail } from \"./rail-context\";\nimport { CollapsedSessionsButton, SessionList } from \"./session-list\";\nimport {\n PrimaryNav,\n RailHeader,\n SessionShellSlotsContext,\n type SessionShellSlots,\n} from \"./rail-sections\";\n\nexport {\n PrimaryNav,\n RailHeader,\n SessionShellSlotsProvider,\n type SessionShellSlots,\n} from \"./rail-sections\";\nimport {\n SessionComputeIndicator,\n sessionSupportsFleetSwitching,\n} from \"../session/sandbox-switcher\";\nimport { CodexAccountIndicator } from \"../session/codex-account-indicator\";\nimport { ModelAccountIndicator } from \"../session/model-account-indicator\";\nimport { PrivateSessionIndicator } from \"../session/private-session-indicator\";\nimport { Button } from \"../../../ui/button\";\nimport { Sheet, SheetContent, SheetDescription, SheetTitle } from \"../../../ui/sheet\";\nimport { TooltipProvider } from \"../../../ui/tooltip\";\nimport { Link, useNavigate, useRouterState } from \"../../lib/navigation\";\nimport { useWorkspaceModelCatalog } from \"../../lib/use-workspace-model-catalog\";\nimport { useAppContext } from \"../../app-context\";\nimport { isPersonalWorkspace } from \"../../lib/managed-self-context\";\nimport { isCodexProductModel } from \"../../lib/session-model\";\nimport { isIntelligenceEffort } from \"../../lib/session-tools\";\nimport { useSessionRepliesMute } from \"../../lib/inbox\";\nimport { useSessionAdminAccess } from \"../session/session-admin-access\";\nimport { applySessionArchiveProjection } from \"../../lib/session-pagination\";\nimport { notifySessionListChanged } from \"../../lib/session-list-invalidation\";\nimport type { Session } from \"../../types\";\nimport { cn } from \"../../lib/utils\";\nimport { windowControlsInPage } from \"../../lib/desktop\";\nimport { useSessionUiFeature } from \"../../lib/session-ui-features\";\nimport { useUiEventTarget } from \"../../lib/ui-events\";\n\nconst LazySessionTenancyRouteControl = lazy(() =>\n import(\"../session/session-tenancy-control\").then(({ SessionTenancyRouteControl }) => ({\n default: SessionTenancyRouteControl,\n })),\n);\n\n/** The rail body — shared between the fixed desktop column and the mobile drawer. */\nexport function RailBody() {\n const rail = useRail();\n const { switcher, mobileWorkspacePanel, railFooter } = useContext(SessionShellSlotsContext);\n const [mobileSection, setMobileSection] = useState<\"sessions\" | \"workspace\">(\"sessions\");\n const sessionsTabRef = useRef<HTMLButtonElement>(null);\n const workspaceTabRef = useRef<HTMLButtonElement>(null);\n // Unique per app, so two apps on one page never share these ids.\n const mobileNavId = `mobile-nav-${useId().replaceAll(\":\", \"\")}`;\n useEffect(() => {\n if (rail.drawerOpen) setMobileSection(\"sessions\");\n }, [rail.drawerOpen]);\n const moveMobileTab = (section: \"sessions\" | \"workspace\") => {\n setMobileSection(section);\n window.requestAnimationFrame(() =>\n (section === \"sessions\" ? sessionsTabRef : workspaceTabRef).current?.focus(),\n );\n };\n return (\n <div\n data-rail\n className=\"og-rail-glow isolate flex h-full min-h-0 flex-col overflow-hidden pt-[env(safe-area-inset-top)]\"\n >\n {/* Native macOS controls sit over this row. Keep it outside the clipped\n viewport so navigation cannot scroll underneath them. */}\n {windowControlsInPage ? (\n <div data-rail-window-controls className=\"relative z-10 shrink-0 pb-3\">\n <RailHeader showSwitcher={false} />\n </div>\n ) : null}\n <div\n data-rail-scroll-viewport\n className=\"relative z-0 min-h-0 flex-1 overflow-x-hidden overflow-y-auto overscroll-y-contain\"\n >\n <div className=\"flex min-h-full flex-col\">\n {!windowControlsInPage ? <RailHeader /> : null}\n\n {rail.collapsed || windowControlsInPage ? switcher : null}\n\n {rail.isMobile && mobileWorkspacePanel ? (\n <>\n <div\n role=\"tablist\"\n aria-label=\"Navigation section\"\n onKeyDown={(event) => {\n if (event.key === \"ArrowLeft\" || event.key === \"Home\") {\n event.preventDefault();\n moveMobileTab(\"sessions\");\n } else if (event.key === \"ArrowRight\" || event.key === \"End\") {\n event.preventDefault();\n moveMobileTab(\"workspace\");\n }\n }}\n className=\"mx-3 mt-3 grid shrink-0 grid-cols-2 rounded-lg bg-surface-2/70 p-1\"\n >\n <button\n ref={sessionsTabRef}\n id={`${mobileNavId}-tab-sessions`}\n type=\"button\"\n role=\"tab\"\n aria-selected={mobileSection === \"sessions\"}\n aria-controls={`${mobileNavId}-panel-sessions`}\n tabIndex={mobileSection === \"sessions\" ? 0 : -1}\n onClick={() => setMobileSection(\"sessions\")}\n className={cn(\n \"flex h-10 items-center justify-center gap-2 rounded-md text-sm font-normal transition-colors\",\n mobileSection === \"sessions\"\n ? \"bg-surface-3 text-fg shadow-sm\"\n : \"text-fg-label hover:text-fg\",\n )}\n >\n <MessagesSquareIcon className=\"size-4\" />\n Sessions\n </button>\n <button\n ref={workspaceTabRef}\n id={`${mobileNavId}-tab-workspace`}\n type=\"button\"\n role=\"tab\"\n aria-selected={mobileSection === \"workspace\"}\n aria-controls={`${mobileNavId}-panel-workspace`}\n tabIndex={mobileSection === \"workspace\" ? 0 : -1}\n onClick={() => setMobileSection(\"workspace\")}\n className={cn(\n \"flex h-10 items-center justify-center gap-2 rounded-md text-sm font-normal transition-colors\",\n mobileSection === \"workspace\"\n ? \"bg-surface-3 text-fg shadow-sm\"\n : \"text-fg-label hover:text-fg\",\n )}\n >\n <Settings2Icon className=\"size-4\" />\n Workspace\n </button>\n </div>\n {mobileSection === \"sessions\" ? (\n <div\n id={`${mobileNavId}-panel-sessions`}\n role=\"tabpanel\"\n aria-labelledby={`${mobileNavId}-tab-sessions`}\n className=\"mt-2 flex shrink-0 flex-col\"\n >\n <PrimaryNav />\n <SessionList />\n </div>\n ) : (\n <div\n id={`${mobileNavId}-panel-workspace`}\n role=\"tabpanel\"\n aria-labelledby={`${mobileNavId}-tab-workspace`}\n className=\"mt-2 flex shrink-0 flex-col border-t border-border pt-2\"\n >\n {mobileWorkspacePanel}\n </div>\n )}\n </>\n ) : (\n <>\n {/* Sessions are the primary object. Workspace administration remains\n secondary on desktop and becomes its own screen on phones. */}\n <PrimaryNav />\n <div className=\"mt-2 flex shrink-0 flex-col\">\n {rail.collapsed ? <CollapsedSessionsButton /> : <SessionList />}\n </div>\n </>\n )}\n </div>\n </div>\n {/* Keep the persistent controls above the scroll viewport, including\n session-row actions with their own stacking levels. The footer is a\n sibling of the clipped viewport, so it can stay transparent and let\n the rail glow run to the bottom edge. */}\n {railFooter ? (\n <div data-rail-footer className=\"relative z-10 shrink-0 border-t border-border\">\n {railFooter}\n </div>\n ) : null}\n </div>\n );\n}\n\n/**\n * The drag handle on the expanded rail's right edge. A quiet, wide-ish hit area\n * straddling the border: at rest it's invisible (the border is the only line);\n * on hover it thickens into a stronger line, and while dragging it wears the\n * brand tint. Double-click snaps back to the default width. Keyboard users get\n * the collapse toggle elsewhere; this is a pointer affordance (hidden from the\n * a11y tree beyond its separator role + label).\n */\nfunction RailResizeHandle({\n onStart,\n active,\n}: {\n onStart: (event: ReactPointerEvent) => void;\n active: boolean;\n}) {\n const rail = useRail();\n return (\n <div\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label=\"Resize sidebar\"\n onPointerDown={onStart}\n onDoubleClick={() => rail.setWidth(RAIL_DEFAULT_WIDTH)}\n className=\"group absolute inset-y-0 -right-1 z-20 w-2 cursor-col-resize touch-none select-none\"\n >\n <span\n className={cn(\n \"absolute inset-y-0 right-1 w-px transition-[width,background-color] duration-150\",\n active\n ? \"w-0.5 bg-brand/70\"\n : \"bg-transparent group-hover:w-0.5 group-hover:bg-border-strong\",\n )}\n />\n </div>\n );\n}\n\nconst NO_SLOTS: SessionShellSlots = {};\n\nexport function SessionShell({\n children,\n slots = NO_SLOTS,\n}: {\n children: ReactNode;\n slots?: SessionShellSlots | undefined;\n}) {\n return (\n <SessionShellSlotsContext.Provider value={slots}>\n <SessionShellFrame>{children}</SessionShellFrame>\n </SessionShellSlotsContext.Provider>\n );\n}\n\nfunction SessionShellFrame({ children }: { children: ReactNode }) {\n const rail = useRail();\n const chatList = useSessionUiFeature(\"chatList\");\n const context = useAppContext();\n const { canvasBanners } = useContext(SessionShellSlotsContext);\n const pathname = useRouterState({\n select: (state) => state.location.pathname,\n });\n // Focus returns here when the mobile drawer closes (D9.1): the drawer is a\n // controlled Sheet with no in-tree trigger, so radix can't restore focus on\n // its own — we point it back at the hamburger that opened it.\n const hamburgerRef = rail.drawerTriggerRef;\n\n // Live width while the reader drags the resize handle. Held locally (not in\n // context) so we don't write localStorage on every pointer move — the chosen\n // width is committed once on pointer-up. `null` means \"not resizing\".\n const [liveWidth, setLiveWidth] = useState<number | null>(null);\n const resizing = liveWidth !== null;\n // Teardown for an in-progress drag (remove window listeners + reset body\n // styles). Held in a ref so an unmount / route change MID-DRAG can run it —\n // otherwise the listeners and the col-resize cursor / no-select body styles\n // linger until an unrelated pointer release elsewhere.\n const endResizeRef = useRef<(() => void) | null>(null);\n const startResize = useCallback(\n (event: ReactPointerEvent) => {\n // Ignore anything but a primary-button / touch drag.\n if (event.button !== 0) {\n return;\n }\n event.preventDefault();\n const startX = event.clientX;\n const startWidth = rail.width;\n const clamp = (w: number) =>\n Math.min(RAIL_MAX_WIDTH, Math.max(RAIL_MIN_WIDTH, Math.round(w)));\n setLiveWidth(startWidth);\n document.body.style.userSelect = \"none\";\n document.body.style.cursor = \"col-resize\";\n const onMove = (moveEvent: PointerEvent) =>\n setLiveWidth(clamp(startWidth + (moveEvent.clientX - startX)));\n const teardown = () => {\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onUp);\n document.body.style.userSelect = \"\";\n document.body.style.cursor = \"\";\n endResizeRef.current = null;\n };\n const onUp = (upEvent: PointerEvent) => {\n rail.setWidth(clamp(startWidth + (upEvent.clientX - startX)));\n setLiveWidth(null);\n teardown();\n };\n endResizeRef.current = teardown;\n window.addEventListener(\"pointermove\", onMove);\n window.addEventListener(\"pointerup\", onUp);\n },\n [rail],\n );\n // Unmount / route-change mid-drag: run the drag teardown so listeners and\n // body styles never leak.\n useEffect(() => () => endResizeRef.current?.(), []);\n\n // Close the mobile drawer on route change.\n useEffect(() => {\n if (rail.drawerOpen) {\n rail.setDrawerOpen(false);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pathname]);\n\n return (\n <TooltipProvider delayDuration={300}>\n <div\n className=\"flex h-full min-h-0 w-full flex-1 overflow-hidden\"\n // Lets page chrome (the desktop title bar) follow the rail without a\n // document-wide `:has()` selector.\n data-rail-collapsed={chatList && !rail.isMobile && rail.collapsed ? \"true\" : undefined}\n >\n {/* Fixed desktop rail — user-resizable when expanded. */}\n {chatList && !rail.isMobile ? (\n <nav\n aria-label=\"Primary\"\n data-collapsed={rail.collapsed}\n style={rail.collapsed ? undefined : { width: resizing ? liveWidth! : rail.width }}\n className={cn(\n \"relative shrink-0 border-r border-border\",\n // Animate the collapse/expand toggle, but never while dragging — a\n // transition there would lag the handle behind the pointer.\n !resizing && \"motion-safe:transition-[width] motion-safe:duration-150\",\n rail.collapsed && \"w-[56px]\",\n )}\n >\n <RailBody />\n {/* The drag handle only exists on the expanded desktop rail; the\n collapsed strip and the mobile drawer are fixed-width. */}\n {!rail.collapsed ? <RailResizeHandle onStart={startResize} active={resizing} /> : null}\n </nav>\n ) : null}\n\n {/* Mobile overlay drawer. */}\n {chatList && rail.isMobile ? (\n <Sheet open={rail.drawerOpen} onOpenChange={rail.setDrawerOpen}>\n <SheetContent\n side=\"left\"\n showCloseButton={false}\n aria-label=\"Session navigation\"\n className=\"w-screen max-w-none gap-0 p-0 sm:w-[380px] sm:max-w-[90vw]\"\n onCloseAutoFocus={(event) => {\n event.preventDefault();\n rail.restoreDrawerFocus();\n }}\n >\n <SheetTitle className=\"sr-only\">Session navigation</SheetTitle>\n <SheetDescription className=\"sr-only\">\n Browse workspace sessions or open Workspace.\n </SheetDescription>\n <nav aria-label=\"Primary\" className=\"h-full\">\n <RailBody />\n </nav>\n </SheetContent>\n </Sheet>\n ) : null}\n\n {/* Main canvas. */}\n <div data-canvas className=\"flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden\">\n <SessionStartupProvider session={context.session}>\n <CanvasTopStrip hamburgerRef={hamburgerRef} />\n {canvasBanners}\n <div className=\"flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden\">{children}</div>\n </SessionStartupProvider>\n </div>\n </div>\n </TooltipProvider>\n );\n}\n\n/**\n * The slim canvas top strip. On mobile it always shows (hamburger + brand). On\n * session routes it also carries the session title/status, the connection and\n * lock pills, and the inspector toggle — moved here from the old top header.\n */\nfunction CanvasTopStrip({ hamburgerRef }: { hamburgerRef: RefObject<HTMLButtonElement | null> }) {\n const rail = useRail();\n const chatList = useSessionUiFeature(\"chatList\");\n const context = useAppContext();\n const pathname = useRouterState({\n select: (state) => state.location.pathname,\n });\n const isSessionRoute = /\\/sessions\\/[^/]+/.test(pathname);\n const showSessionActions = Boolean(context.session) && isSessionRoute;\n const sharedFeed = useSyncExternalStore(\n context.sessionEventFeedStore.subscribe,\n context.sessionEventFeedStore.getSnapshot,\n context.sessionEventFeedStore.getSnapshot,\n );\n const sessionEvents =\n sharedFeed && sharedFeed.sessionId === context.session?.id ? sharedFeed.events : [];\n // The route owns the only session stream. An empty shared feed is still an\n // authoritative shared feed, so this header can never fall back to self-streaming.\n const lineage = useSessionLineage(context.session?.id ?? null, {\n events: sessionEvents,\n pollIntervalMs: 30_000,\n });\n const ancestors = lineage.lineage?.ancestors ?? [];\n\n // On desktop, the strip only renders when there is something to show.\n if (!rail.isMobile && !showSessionActions) {\n return null;\n }\n\n const hamburger =\n chatList && rail.isMobile ? (\n <Button\n ref={hamburgerRef}\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label=\"Open navigation\"\n onClick={() => {\n // On phones the workspace inspector is also a full-screen surface.\n // Make the two overlays mutually exclusive instead of stacking one\n // modal beneath another and trapping the navigation out of sight.\n context.setInspectorOpen(false);\n rail.setDrawerOpen(true);\n }}\n className=\"size-11\"\n >\n <MenuIcon className=\"size-4\" />\n </Button>\n ) : null;\n\n // Session route: the full identity + status header (its own bar). The live\n // sandbox switcher and codex indicator flow in as slots so the header stays a\n // pure, screenshot-testable component.\n if (showSessionActions && context.session) {\n // Both schedule facts come from one read, so a newer lineage never pairs\n // with an older session read (an older server sends no upcoming flag).\n const lineageSchedules = lineage.lineage?.sessionHasSchedules;\n return (\n <SessionRouteHeader\n session={{\n ...context.session,\n ...(lineageSchedules === undefined\n ? {}\n : {\n hasSchedules: lineageSchedules,\n hasUpcomingSchedules:\n lineage.lineage?.sessionHasUpcomingSchedules ?? lineageSchedules,\n }),\n }}\n ancestors={ancestors}\n lineageLoading={lineage.loading}\n lineageError={lineage.error}\n events={sessionEvents}\n hamburger={hamburger}\n />\n );\n }\n\n // Mobile, off a session route: the slim brand strip.\n return (\n <header className=\"flex h-12 shrink-0 items-center gap-3 border-b border-border bg-canvas/75 px-3 backdrop-blur sm:px-4\">\n {hamburger}\n <Link\n to=\"/workspaces/$workspaceId/sessions\"\n params={{ workspaceId: rail.workspaceId }}\n className=\"flex items-center gap-2 text-fg\"\n >\n <BrandMark className=\"w-5\" />\n <Wordmark className=\"text-[17px]\" />\n </Link>\n </header>\n );\n}\n\n/** Session-route header: last-admitted model·effort, not the composer next pick. */\nfunction SessionRouteHeader({\n session,\n ancestors,\n lineageLoading,\n lineageError,\n events,\n hamburger,\n}: {\n session: Session;\n ancestors: SessionSummary[];\n lineageLoading: boolean;\n lineageError: Error | null;\n events: import(\"@opengeni/sdk\").SessionEvent[];\n hamburger: ReactNode;\n}) {\n const uiEvents = useUiEventTarget(\"document\");\n const rail = useRail();\n const context = useAppContext();\n const lastStarted = useLastStartedTurnPolicy(session.id, {\n events,\n pollIntervalMs: 15_000,\n includeServingModel: true,\n });\n const lastStartedModel = lastStarted.policy?.model;\n const lastStartedReasoningEffort = isIntelligenceEffort(lastStarted.policy?.reasoningEffort)\n ? lastStarted.policy.reasoningEffort\n : undefined;\n const lastStartedLatencyMode = lastStarted.policy?.latencyMode;\n // Wait for last-started fetch before trusting session.model — creation default\n // can be a different rail than the newest admitted turn.\n const policyReady = !lastStarted.loading;\n const displayModelId = policyReady ? lastStartedModel || session.model : session.model;\n const navigate = useNavigate();\n const catalog = useWorkspaceModelCatalog(session.workspaceId);\n const selectedRow = findPickerRow(catalog.rows, displayModelId);\n const policyLoading = lastStarted.loading || catalog.loading;\n const credentialSource = selectedRow?.catalog.credentialSource;\n const subscriptionProvider =\n credentialSource?.kind === \"connected_subscription\" ? credentialSource.provider : null;\n const repliesMute = useSessionRepliesMute(session);\n const sessionAdminAccess = useSessionAdminAccess(session);\n const adminAccess = useSessionUiFeature(\"adminAccess\") ? sessionAdminAccess : null;\n const dock = useSessionUiFeature(\"dock\");\n const archiveInFlight = useRef(false);\n const onArchive = useCallback(\n async (target: Session, archived: boolean) => {\n if (archiveInFlight.current) return;\n const accepted = context.captureWorkspaceInvocation(target.workspaceId);\n if (!accepted) return;\n archiveInFlight.current = true;\n try {\n const updated = await context.client.updateSessionArchive(target.workspaceId, target.id, {\n archived,\n expectedVersion: target.archiveVersion ?? 0,\n });\n if (!context.ownsWorkspaceInvocation(target.workspaceId, accepted)) return;\n context.setSession((current) =>\n current?.id === updated.id && current.workspaceId === updated.workspaceId\n ? applySessionArchiveProjection(current, updated)\n : current,\n );\n notifySessionListChanged({\n workspaceId: target.workspaceId,\n sessionId: target.id,\n archived: updated.archived,\n });\n toast.success(updated.archived ? \"Chat archived.\" : \"Chat restored.\");\n } catch (error) {\n if (!context.ownsWorkspaceInvocation(target.workspaceId, accepted)) return;\n toast.error(archived ? \"Couldn't archive the chat.\" : \"Couldn't restore the chat.\", {\n description: error instanceof Error ? error.message : String(error),\n });\n } finally {\n archiveInFlight.current = false;\n }\n },\n [context],\n );\n\n return (\n <SessionHeader\n session={session}\n ancestors={ancestors}\n onOpenSchedule={\n session.hasSchedules\n ? () =>\n void navigate({\n to: \"/workspaces/$workspaceId/schedules\",\n params: { workspaceId: session.workspaceId },\n search: { targetSessionId: session.id },\n })\n : null\n }\n lineageLoading={lineageLoading}\n lineageError={lineageError}\n connectionState={context.connectionState}\n status={session.status}\n keyAuthRequired={context.keyAuthRequired}\n onForgetAccessKey={context.forgetAccessKey}\n inspectorOpen={context.inspectorOpen}\n onToggleInspector={\n dock\n ? () => {\n if (!context.inspectorOpen && rail.isMobile) rail.setDrawerOpen(false);\n context.setInspectorOpen((open) => !open);\n }\n : undefined\n }\n onRename={context.updateSessionTitle}\n onPin={(target, pinned) =>\n context.updateSessionPin(target.workspaceId, target.id, pinned, target.pinVersion ?? 0)\n }\n onArchive={onArchive}\n repliesMute={repliesMute}\n adminAccess={adminAccess}\n onOpenUsageLimit={\n // The editor lives in the session panel's Agent tab.\n sessionUsageLimitCapability(context.clientConfig) === \"absent\" || !dock\n ? null\n : () => requestSessionUsageLimitEditor(uiEvents)\n }\n leading={hamburger}\n lastStartedModel={lastStartedModel}\n lastStartedReasoningEffort={lastStartedReasoningEffort}\n lastStartedLatencyMode={lastStartedLatencyMode}\n billingClass={selectedRow?.billingClass}\n modelLabel={selectedRow?.label}\n modelLogoUrl={selectedRow?.catalog.logoUrl}\n policyLoading={policyLoading}\n accessSlot={\n session.tenancy ? (\n <Suspense fallback={null}>\n <LazySessionTenancyRouteControl session={session} events={events} />\n </Suspense>\n ) : isPersonalWorkspace(\n context.workspaces.find((candidate) => candidate.id === session.workspaceId) ?? null,\n context.managedSelfContext,\n ) ? (\n // Without a tenancy record there is no access control to show, but a\n // Personal workspace chat is still private: say so, read-only.\n <PrivateSessionIndicator />\n ) : null\n }\n sandboxSlot={\n sessionSupportsFleetSwitching(session.sandboxBackend) ? (\n <SessionComputeIndicator sessionId={session.id} sandboxBackend={session.sandboxBackend} />\n ) : null\n }\n codexSlot={\n policyReady && isCodexProductModel(displayModelId) ? (\n <CodexAccountIndicator\n workspaceId={session.workspaceId}\n sessionId={session.id}\n model={displayModelId}\n modelReady={policyReady}\n events={events}\n />\n ) : policyReady && subscriptionProvider ? (\n <ModelAccountIndicator\n workspaceId={session.workspaceId}\n sessionId={session.id}\n organizationId={\n context.workspaces.find((candidate) => candidate.id === session.workspaceId)\n ?.accountId ?? null\n }\n provider={subscriptionProvider}\n servingTurnId={lastStarted.policy?.turnId}\n events={events}\n />\n ) : null\n }\n />\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/app/routes/sessions-index.tsx"],"sourcesContent":["import { useAppApi } from \"../lib/app-api\";\nimport { initialWorkspaceMachineCompute } from \"../lib/workspace-default-machine\";\nimport { t } from \"../lib/console-text\";\nimport { ANALYTICS_COLLECTION_ENABLED_EVENT } from \"../lib/analytics-consent\";\nimport { useWorkspaceRigs } from \"../lib/use-workspace-rigs\";\nimport { useRepositoryCatalogRefresh } from \"../lib/use-follow-up-repositories\";\nimport { useGitHubAppConnectLauncher } from \"../components/github-app-connect-launcher\";\nimport { openGitHubInstallationSettings } from \"../lib/github-app-connect\";\nimport { captureAnalyticsEvent } from \"../lib/analytics-observer\";\nimport { useWorkspaceMachines } from \"../lib/use-workspace-machines\";\nimport { useSessionListHintRefresh } from \"../lib/use-session-list-hint-refresh\";\nimport { useOpenGeni } from \"../../session-context\";\nimport {\n addsConnectorOutsideDefaults,\n changedConnectorExclusions,\n defaultConnectorSelection,\n newSessionConnectorCustomizeState,\n} from \"../lib/composer-connectors\";\n// The sessions index: the centered \"Start a session\" composer. The form is\n// organised top-down — (A) message + model/tools/repos pills → (B) WHERE SHOULD\n// THIS RUN? (when machines exist) → (C) rig or machine fields.\n// Goals are set by the agent (or later surfaces), not at create.\n//\n// \"Where should this run?\" is a first-class segmented control with two kinds:\n// Managed Sandbox (ephemeral, platform-owned — clones repos, injects env) vs\n// Connected Machine (a user-owned enrolled machine — its own checkout & git\n// auth, a working folder, no clone, no env injection). The kind gates the band\n// below it; invalid states (\"clone my repo onto a machine\") are unreachable by\n// construction.\n//\n// The Connected Machine path is opt-in when the deployment owns a managed\n// sandbox. On a selfhosted-primary deployment it is the only truthful default:\n// the composer selects an online machine and remains blocked when none exists.\nimport { FILE_ONLY_MESSAGE_TEXT, type ComposerState } from \"../../hooks/use-composer\";\nimport { LightboxProvider } from \"../../timeline\";\nimport { ModelMark } from \"../../components/model-mark\";\nimport { useChannels } from \"../../hooks/use-channels\";\nimport { useWorkspaceSessions } from \"../../hooks/use-workspace-sessions\";\nimport { resolveWorkspaceSessionToolDefaults, stableJson } from \"@opengeni/contracts\";\nimport { MACHINES_COMPOSER_POLL_MS, type MachineView } from \"../../machines\";\nimport {\n NewSessionRealtimeControl,\n prestartSessionRealtime,\n useRealtimeModelSelection,\n} from \"../../realtime\";\nimport {\n OpenGeniApiError,\n type NewSessionSelectionHistory,\n type Rig,\n type SessionRealtimeModel,\n} from \"@opengeni/sdk\";\nimport { Link, type PageHost, useNavigate, usePage } from \"../lib/navigation\";\nimport { ChevronDownIcon, CreditCardIcon, FolderIcon, LockIcon, PlusIcon } from \"lucide-react\";\nimport {\n createElement,\n lazy,\n Suspense,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { toast } from \"../lib/toast\";\n\nimport { BillingClassMark } from \"../components/billing-class-mark\";\nimport { ChannelCreateDialog } from \"../components/rail/channel-create-dialog\";\nimport { ConsoleComposer, useDraftAttachments } from \"../components/Composer\";\nimport { NewSessionStarters } from \"../components/new-session-starters\";\nimport { NewSessionDraftSyncNotice } from \"../components/new-session-draft-sync-notice\";\nimport { WorkspaceComposerPlus as ComposerMobilePlus } from \"../components/workspace-composer-plus\";\nimport {\n RunsOnMenuBody,\n RunsOnNotice,\n UsageLimitMenuBody,\n VisibilityMenuBody,\n hasRunsOnChoices,\n runsOnAttention,\n hasVisibilityChoice,\n runsOnSummary,\n visibilitySummary,\n} from \"../components/session/new-session-settings-menu\";\nimport {\n NO_SESSION_USAGE_LIMIT,\n parseSessionUsageLimitDraft,\n sessionUsageLimitCapability,\n sessionUsageLimitDraftSummary,\n type SessionUsageLimitDraft,\n} from \"../lib/session-usage-limit\";\nimport { ModelPicker, type SessionToolSelection } from \"../components/pickers\";\nimport {\n RepositoryContextMenuBody,\n type RepositoryContextPickerProps,\n} from \"../components/repository-picker\";\nimport { Button } from \"../../ui/button\";\nimport { sessionDisplayTitle } from \"../lib/session-rename\";\nimport {\n DropdownMenu,\n DropdownMenuCheck,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuTrigger,\n} from \"../../ui/dropdown-menu\";\nimport { Notice } from \"../../ui/notice\";\nimport { CreditRefusalNotice } from \"../components/credits/credit-refusal-notice\";\nimport { coveredModelChoice, creditRefusalGap, freeCreditGap } from \"../lib/free-credit-gap\";\nimport { isPaymentRequiredError } from \"../lib/model-access\";\nimport { isTransientServiceFailure, OPENGENI_UPDATING_NOTICE } from \"../lib/transient-retry\";\nimport { useConnectionAccounts } from \"../components/capabilities/use-connection-accounts\";\nimport { StatusDot } from \"../../ui/status-dot\";\nimport { useAppContext, useLatestCallback } from \"../app-context\";\nimport { useBrowserAccountBridgeBlocker } from \"../lib/browser-account-bridge\";\nimport {\n EMPTY_COMPOSER_LAUNCH,\n composerLaunchSearchKey,\n modelProvidedAfterLaunch,\n type ComposerLaunchSearch,\n} from \"../lib/composer-launch\";\nimport {\n FOCUS_CREATE_COMPOSER_EVENT,\n type CreateComposerFocusIntent,\n} from \"../lib/create-composer-focus\";\nimport type { RepoDraft } from \"../lib/session-tools\";\nimport { composerFallbackModel } from \"../lib/model-access-onboarding\";\nimport { useForgetLastSession } from \"../lib/last-session-memory\";\nimport {\n isMachineComputeSelectable,\n resolveSelectableMachineSandboxId,\n} from \"../lib/machine-selectability\";\nimport {\n effortOptionsForModel,\n findPickerRow,\n modelUsesCredits,\n runnableLatencyModesForModel,\n type PickerModelRow,\n} from \"../lib/model-policy\";\nimport { isPersonalWorkspace } from \"../lib/managed-self-context\";\nimport { attachManualRepository } from \"../lib/manual-repositories\";\nimport { hasAccountPermission, hasWorkspacePermission } from \"../lib/permissions\";\nimport {\n isPersonalAttachmentConflict,\n newSessionFixedResourceCatalogFailed,\n newSessionPersonalResourceAttachment,\n personalResourceSelectionIdentityKey,\n reconcileNewSessionFixedResources,\n recoverNewSessionPersonalResourceAttachment,\n resolvePersonalResourceOwnerScope,\n} from \"../lib/personal-resource-attachments\";\nimport {\n recentSessionModelPresentation,\n recentSessionStatus,\n recentSessionsForHome,\n relativeTimeLabel,\n sessionRepoLabel,\n} from \"../../session-list-model\";\nimport { signupStarterSet } from \"../lib/signup-starter-set\";\nimport {\n useWorkspaceModelCatalog,\n type WorkspaceModelCatalogState,\n} from \"../lib/use-workspace-model-catalog\";\nimport { resolveWorkspaceAgentDefaults } from \"@opengeni/contracts\";\nimport { ComposerCapabilitiesChip } from \"../components/composer-capabilities-chip\";\nimport { useVaults } from \"../../hooks/use-vaults\";\nimport {\n SessionSecretsMenuBody,\n draftSecretsRows,\n sessionSecretsSummary,\n} from \"../components/secrets/session-secrets-panel\";\nimport {\n capabilityAvailability,\n capabilityOn,\n capabilitySummary,\n draftFromRequest,\n requestFromDraft,\n workspaceAgentDefaultsDraft,\n type AgentCapabilityDraft,\n} from \"../lib/agent-capabilities\";\nimport {\n emptySessionDraft,\n fitToolPolicyToAgentCapabilities,\n isSessionDraftComputeReady,\n newSessionCreateVisibility,\n newSessionDraftOptionsFromSessionDraft,\n rememberedMachineFolder,\n sessionDraftFromNewSessionDraftOptions,\n submissionFromSessionDraft,\n type SessionDraft,\n} from \"../lib/session-create\";\nimport {\n clientFirstPartyMcpToolPolicy,\n firstPartySessionToolOptionsFor,\n selectableSessionMcpServerIds,\n unavailableSessionMcpServerIds,\n newSessionDraftToolPolicy,\n rehydrateRepositoryResources,\n repositorySelectionFromResources,\n} from \"../lib/session-tools\";\nimport { useNewSessionDraft, type NewSessionDraftEditable } from \"../lib/use-new-session-draft\";\nimport { userErrorText } from \"../../ui/api-error\";\nimport {\n newSessionCreateSnapshot,\n runNewSessionRouteSubmission,\n type CreatedSessionRouteAuthority,\n} from \"./sessions-index-submission\";\nimport {\n hydratedNewSessionProjectProvenancePresent,\n initialNewSessionProjectLaunchIntent,\n newSessionProjectSelection,\n nextFocusedNewSessionProjectLaunchIntent,\n nextNewSessionProjectLaunchIntent,\n resolveAmbientNewSessionProjectChannelId,\n resolveHydratedNewSessionProjectSelection,\n} from \"./sessions-index-hydration\";\nimport type { Channel, SandboxBackend, Session } from \"../types\";\nimport { useUiEventTarget } from \"../lib/ui-events\";\n\nconst useCommitSynchronousEffect = typeof window === \"undefined\" ? useEffect : useLayoutEffect;\n\nconst EmptyCreditsNotice = lazy(() =>\n import(\"../components/credit-required-prompt\").then((module) => ({\n default: module.EmptyCreditsNotice,\n })),\n);\nconst CreditTopupPrompt = lazy(() =>\n import(\"../components/credit-required-prompt\").then((module) => ({\n default: module.CreditRequiredPrompt,\n })),\n);\n\nexport function SessionsIndexRoute({\n workspaceId,\n launch = EMPTY_COMPOSER_LAUNCH,\n}: {\n workspaceId: string;\n launch?: ComposerLaunchSearch | undefined;\n}) {\n const { accessKeyVersion, accessContext } = useAppContext();\n useForgetLastSession(accessContext.subjectId, workspaceId);\n return (\n <SessionsIndexRouteContent\n key={`${workspaceId}:${accessKeyVersion}`}\n workspaceId={workspaceId}\n launch={launch}\n />\n );\n}\n\nfunction SessionsIndexRouteContent({\n workspaceId,\n launch,\n}: {\n workspaceId: string;\n launch: ComposerLaunchSearch;\n}) {\n const uiEvents = useUiEventTarget(\"window\");\n const context = useAppContext();\n const api = useAppApi();\n const page = usePage();\n const connectionAccounts = useConnectionAccounts(\n context.client,\n {\n id: \"new-session\",\n workspaceId,\n selectedIds: [...context.selectedCapabilityToolIds],\n },\n context.workspaceCapabilityCatalog,\n context.accessContext === null\n ? null\n : hasWorkspacePermission(context.accessContext, workspaceId, \"connections:read\"),\n );\n const repositoryCatalogRefresh = useRepositoryCatalogRefresh(workspaceId, context);\n // Hosted here, outside the repository menu, so the menu closing when the\n // authorization popup opens does not unmount GitHub App setup.\n const githubAppConnect = useGitHubAppConnectLauncher(workspaceId);\n const firstPartyMcpToolPolicy = useMemo(\n () => clientFirstPartyMcpToolPolicy(context.clientConfig),\n [context.clientConfig],\n );\n const workspace = context.workspaces.find((candidate) => candidate.id === workspaceId) ?? null;\n const configuredToolDefaults = useMemo(\n () => resolveWorkspaceSessionToolDefaults(workspace?.settings),\n [workspace?.settings],\n );\n const defaultFirstPartyMcpTools = useMemo(\n () =>\n configuredToolDefaults?.firstPartyMcpTools?.filter((tool) =>\n firstPartyMcpToolPolicy.allowed.includes(tool),\n ) ?? firstPartyMcpToolPolicy.default,\n [configuredToolDefaults, firstPartyMcpToolPolicy],\n );\n const defaultSandboxBackend = context.clientConfig.defaultSandboxBackend;\n const firstPartyToolOptions = useMemo(\n () => firstPartySessionToolOptionsFor(firstPartyMcpToolPolicy.allowed),\n [firstPartyMcpToolPolicy],\n );\n const navigate = useNavigate();\n const modelCatalog = useWorkspaceModelCatalog(workspaceId);\n const channelsQuery = useChannels({ pollIntervalMs: 60_000 });\n const launchChannelId = launch.channelId === \"default\" ? null : launch.channelId;\n const [selectedChannelId, setSelectedChannelId] = useState<string | null>(\n launchChannelId ?? null,\n );\n const selectedChannelIdRef = useRef(selectedChannelId);\n const setSelectedProjectChannelId = useCallback((channelId: string | null) => {\n selectedChannelIdRef.current = channelId;\n setSelectedChannelId(channelId);\n }, []);\n const [selectionHistory, setSelectionHistory] = useState<NewSessionSelectionHistory>({\n projects: [],\n });\n const [projectProvenancePresent, setProjectProvenancePresent] = useState(\n launchChannelId !== undefined,\n );\n const remoteDraftHydratedRef = useRef(false);\n const previousLaunchChannelIdRef = useRef<string | null | undefined>(launchChannelId);\n const launchProjectIntentRef = useRef(initialNewSessionProjectLaunchIntent(launchChannelId));\n const recentChannelId = selectionHistory.projects[0]?.channelId ?? null;\n const [projectDialogOpen, setProjectDialogOpen] = useState(false);\n const [projectNameDraft, setProjectNameDraft] = useState(\"\");\n const { resetSessionView } = context;\n const [message, setMessage] = useState(\"\");\n const [creditTopupOpen, setCreditTopupOpen] = useState(false);\n const [draft, setDraft] = useState<SessionDraft>(() =>\n emptySessionDraft(defaultFirstPartyMcpTools, defaultSandboxBackend),\n );\n const personalWorkspace = isPersonalWorkspace(workspace, context.managedSelfContext);\n const [capabilitiesOpenRequest, setCapabilitiesOpenRequest] = useState<\n { panel: \"capabilities\"; nonce: number } | undefined\n >(undefined);\n // \"+\" > Capabilities: the workspace's defaults, or this chat's own choice.\n const agentAvailability = useMemo(\n () => capabilityAvailability(context.clientConfig.agentConfig),\n [context.clientConfig.agentConfig],\n );\n const workspaceAgentDraft = useMemo(\n () =>\n workspaceAgentDefaultsDraft({\n capabilities: resolveWorkspaceAgentDefaults(workspace?.settings)?.capabilities,\n legacyHumanInputOff: workspace?.settings.agentHumanInputEnabled === false,\n }),\n [workspace?.settings],\n );\n const composerAgentCapabilities = {\n customized: draft.agentCapabilities !== undefined,\n draft:\n draft.agentCapabilities !== undefined\n ? draftFromRequest(draft.agentCapabilities)\n : workspaceAgentDraft,\n availability: agentAvailability,\n onCustomizedChange: (customized: boolean) =>\n setDraft((current) => {\n if (!customized) {\n const { agentCapabilities: _dropped, ...rest } = current;\n return rest;\n }\n return {\n ...current,\n agentCapabilities: requestFromDraft(workspaceAgentDraft, agentAvailability),\n };\n }),\n onChange: (next: AgentCapabilityDraft) =>\n setDraft((current) => ({\n ...current,\n agentCapabilities: requestFromDraft(next, agentAvailability),\n })),\n };\n // \"+\" > Secrets: which vaults this chat may use. Shown only while its agent\n // can use secrets (the workspace default or this chat's own capabilities).\n const draftSecretsOn =\n agentAvailability.isAvailable(\"secrets\") &&\n capabilityOn(composerAgentCapabilities.draft.values, \"secrets\");\n const canListSecrets =\n hasWorkspacePermission(context.accessContext, workspaceId, \"secrets:list\") ||\n hasWorkspacePermission(context.accessContext, workspaceId, \"variable-sets:list\");\n const draftVaults = useVaults({\n client: context.client,\n workspaceId,\n enabled: canListSecrets && draftSecretsOn,\n });\n const draftVaultPolicy = draft.vaultPolicy ?? { mode: \"all\" as const };\n const draftVaultRows = draftVaults.vaults\n ? draftSecretsRows(draftVaults.vaults, draftVaultPolicy)\n : null;\n const attachments = useDraftAttachments(\n workspaceId,\n personalWorkspace || draft.visibility === \"private\" ? \"personal\" : \"workspace\",\n );\n const fixedResourceCatalogEnabled = draft.compute.kind === \"sandbox\";\n const canUseRigs = hasWorkspacePermission(context.accessContext, workspaceId, \"rigs:use\");\n const rigs = useWorkspaceRigs({\n enabled: fixedResourceCatalogEnabled && canUseRigs,\n });\n const [tenancyCapabilities, setTenancyCapabilities] = useState<{\n activated: boolean;\n canCreatePrivate: boolean;\n reason: \"available\" | \"not_activated\" | \"managed_session_required\" | \"unavailable\";\n defaultVisibility?: \"private\" | \"workspace\" | undefined;\n } | null>(null);\n const tenancyCapabilityGeneration = useRef(0);\n // Whether the person picked who can see this new chat. Until they do, it\n // starts with the organization's default.\n const visibilityChosenRef = useRef(false);\n useEffect(() => {\n const generation = ++tenancyCapabilityGeneration.current;\n visibilityChosenRef.current = false;\n setTenancyCapabilities(null);\n void context.client\n .getSessionTenancyCreateCapabilities(workspaceId)\n .then((capabilities) => {\n if (tenancyCapabilityGeneration.current !== generation) return;\n setTenancyCapabilities(capabilities);\n if (!capabilities.canCreatePrivate) {\n setDraft((current) =>\n current.visibility === \"private\" ? { ...current, visibility: \"workspace\" } : current,\n );\n } else if (capabilities.defaultVisibility === \"private\" && !visibilityChosenRef.current) {\n setDraft((current) =>\n current.visibility === \"private\" ? current : { ...current, visibility: \"private\" },\n );\n }\n })\n .catch(() => {\n if (tenancyCapabilityGeneration.current !== generation) return;\n setTenancyCapabilities({\n activated: false,\n canCreatePrivate: false,\n reason: \"unavailable\",\n });\n setDraft((current) =>\n current.visibility === \"private\" ? { ...current, visibility: \"workspace\" } : current,\n );\n });\n }, [context.client, personalWorkspace, workspaceId]);\n const createVisibility = newSessionCreateVisibility(\n personalWorkspace,\n draft.visibility,\n tenancyCapabilities?.canCreatePrivate === true,\n );\n const personalOwnerScope = resolvePersonalResourceOwnerScope({\n authMode: context.clientConfig.auth.mode,\n authSession: context.authSession,\n accessSubjectId: context.accessContext.subjectId,\n managedSelfContext: context.managedSelfContext,\n workspace,\n });\n const personalResourcesAvailable =\n personalOwnerScope !== null && (personalWorkspace || tenancyCapabilities?.activated === true);\n const personalResourceEligibilitySettled =\n personalWorkspace || personalOwnerScope === null || tenancyCapabilities !== null;\n // Sandbox Environments configure the managed sandbox; a deployment without\n // one has nothing for them to apply to.\n const noManagedSandbox = defaultSandboxBackend === \"none\";\n const selectableRigs = noManagedSandbox\n ? []\n : rigs.rigs.filter((rig) => rig.scope !== \"user\" || personalResourcesAvailable);\n const selectedRig = selectableRigs.find((candidate) => candidate.id === draft.rigId);\n const selectableRigIdsKey = selectableRigs.map((rig) => rig.id).join(\"\\u0000\");\n const fixedResourceSelection = reconcileNewSessionFixedResources({\n selectedRigId: draft.rigId,\n selectableRigIds: fixedResourceCatalogEnabled\n ? selectableRigs.map((rig) => rig.id)\n : draft.rigId\n ? [draft.rigId]\n : [],\n rigsSettled:\n !fixedResourceCatalogEnabled ||\n (personalResourceEligibilitySettled && !rigs.loading && rigs.error === null),\n });\n const fixedResourceCatalogError =\n draft.compute.kind === \"sandbox\" &&\n newSessionFixedResourceCatalogFailed({\n selectedRigId: draft.rigId,\n selectionResolved: fixedResourceSelection.selectionResolved,\n rigCatalogFailed: rigs.error !== null,\n });\n useEffect(() => {\n setDraft((current) => {\n if (current.compute.kind !== \"sandbox\") return current;\n const reconciled = reconcileNewSessionFixedResources({\n selectedRigId: current.rigId,\n selectableRigIds: selectableRigIdsKey ? selectableRigIdsKey.split(\"\\u0000\") : [],\n rigsSettled: personalResourceEligibilitySettled && !rigs.loading && rigs.error === null,\n });\n return reconciled.rigId === current.rigId ? current : { ...current, rigId: reconciled.rigId };\n });\n }, [\n draft.rigId,\n personalResourceEligibilitySettled,\n rigs.error,\n rigs.loading,\n selectableRigIdsKey,\n ]);\n const [fleetPollMs, setFleetPollMs] = useState<number | undefined>(undefined);\n const fleet = useWorkspaceMachines({ pollIntervalMs: fleetPollMs });\n const machines = fleet.machines.filter((machine) => machine.kind === \"selfhosted\");\n // \"+\" > Runs on: where the new chat runs and on which environment or folder.\n const runsOnChoices = {\n draft,\n machines,\n rigs: selectableRigs,\n workspaceDefaultRigId: workspace?.defaultRigId ?? null,\n selfhostedPrimary: defaultSandboxBackend === \"selfhosted\",\n noManagedSandbox,\n // A 404 means Connected Machines are off here, not a failure.\n fleetLoadFailed:\n fleet.error != null &&\n !(fleet.error instanceof OpenGeniApiError && fleet.error.status === 404),\n selectedChannelId,\n selectionHistory,\n };\n const fleetEmpty = machines.length === 0;\n const fleetLoadFailed =\n fleet.error != null && !(fleet.error instanceof OpenGeniApiError && fleet.error.status === 404);\n useEffect(() => {\n if (fleet.loading) return;\n setFleetPollMs(!fleetEmpty || fleetLoadFailed ? MACHINES_COMPOSER_POLL_MS : undefined);\n }, [fleet.loading, fleetEmpty, fleetLoadFailed]);\n const selectedMachineSandboxId =\n draft.compute.kind === \"machine\" ? draft.compute.sandboxId : null;\n const selectedMachine = selectedMachineSandboxId\n ? (machines.find((machine) => machine.sandboxId === selectedMachineSandboxId) ?? null)\n : null;\n const personalMachineSelected = selectedMachine?.scope === \"user\";\n const selectedPersonalResourceNames =\n draft.compute.kind === \"sandbox\"\n ? selectedRig?.scope === \"user\"\n ? [selectedRig.name]\n : []\n : personalMachineSelected && selectedMachine\n ? [selectedMachine.name]\n : [];\n const personalResourceSelectionKey = personalResourceSelectionIdentityKey({\n rigId: selectedRig?.scope === \"user\" ? selectedRig.id : null,\n connectedMachineId:\n personalMachineSelected && selectedMachine ? selectedMachine.enrollmentId : null,\n });\n const selectedPersonalResourceCount = personalResourceSelectionKey\n ? personalResourceSelectionKey.split(\"\\u0000\").length\n : 0;\n const [personalResourceCatalogRefreshPending, setPersonalResourceCatalogRefreshPending] =\n useState(false);\n const personalResourceCatalogRefreshGeneration = useRef(0);\n const personalResourceAttachment = newSessionPersonalResourceAttachment({\n personalResourceCount: selectedPersonalResourceCount,\n visibility: createVisibility,\n });\n const refreshPersonalResourceCatalogs = useLatestCallback(async (): Promise<void> => {\n const generation = ++personalResourceCatalogRefreshGeneration.current;\n setPersonalResourceCatalogRefreshPending(true);\n try {\n if (canUseRigs) await rigs.refresh();\n } finally {\n if (personalResourceCatalogRefreshGeneration.current === generation) {\n setPersonalResourceCatalogRefreshPending(false);\n }\n }\n });\n const recoverPersonalResourceAttachment = useLatestCallback(\n (error: unknown, attemptedInput: Parameters<typeof isPersonalAttachmentConflict>[1]): void => {\n if (!isPersonalAttachmentConflict(error, attemptedInput)) return;\n void recoverNewSessionPersonalResourceAttachment({\n error,\n attemptedInput,\n refreshCatalogs: refreshPersonalResourceCatalogs,\n });\n },\n );\n const [toolSelectionExplicit, setToolSelectionExplicit] = useState(false);\n // Whether the person chose the composer's model policy. False follows the\n // server-resolved new-chat default; undefined means an older server that\n // does not report the marker, so none is sent back.\n const [modelProvided, setModelProvided] = useState<boolean | undefined>(undefined);\n const [connectorCustomizing, setConnectorCustomizing] = useState(false);\n const [connectorExclusions, setConnectorExclusions] = useState<string[]>([]);\n const followWorkspaceConnectors = () => {\n connectionAccounts.resetEmptyChoices();\n setConnectorCustomizing(false);\n setToolSelectionExplicit(false);\n setConnectorExclusions([]);\n context.setSelectedCapabilityToolIds(\n defaultConnectorSelection(context.workspaceDefaultToolIds, []),\n );\n };\n const changeConnectorSelection = (selection: SessionToolSelection) => {\n // Choosing accounts is also an explicit connector customization. Apply it\n // in this event, rather than waiting for the header switch to re-render.\n if (!connectorCustomizing) setConnectorCustomizing(true);\n if (\n !toolSelectionExplicit &&\n addsConnectorOutsideDefaults(\n context.selectedCapabilityToolIds,\n selection.mcpServerIds,\n context.workspaceDefaultToolIds,\n )\n ) {\n setToolSelectionExplicit(true);\n } else if (!toolSelectionExplicit) {\n setConnectorExclusions((current) =>\n changedConnectorExclusions(\n current,\n context.selectedCapabilityToolIds,\n selection.mcpServerIds,\n ),\n );\n }\n context.setSelectedCapabilityToolIds(selection.mcpServerIds);\n };\n const [submitting, setSubmitting] = useState(false);\n // The new chat's usage limit: local to this composer (never the synced\n // draft or a remembered default), and only offered when the server can\n // enforce it.\n const usageLimitCapability = sessionUsageLimitCapability(context.clientConfig);\n const [usageLimitDraft, setUsageLimitDraft] =\n useState<SessionUsageLimitDraft>(NO_SESSION_USAGE_LIMIT);\n const [usageLimitSendBlocked, setUsageLimitSendBlocked] = useState(false);\n // The API refused to start this chat because no credit pays for its model.\n const [createCreditRefusal, setCreateCreditRefusal] = useState<{\n workspaceId: string;\n model: string;\n message: string;\n } | null>(null);\n const [createdSessionAuthority, setCreatedSessionAuthority] =\n useState<CreatedSessionRouteAuthority | null>(null);\n const composerRegionRef = useRef<HTMLDivElement | null>(null);\n // 0 = no explicit request (mount uses ConsoleComposer autoFocus). >0 = same-route\n // new-session / shortcut asked us to put the caret back in the create composer.\n const [createComposerFocusGen, setCreateComposerFocusGen] = useState(0);\n const selectProject = useLatestCallback((channelId: string | null, explicit = true) => {\n const previousChannelId = selectedChannelIdRef.current;\n if (explicit) setProjectProvenancePresent(true);\n setSelectedProjectChannelId(channelId);\n setDraft((current) => {\n const selection = newSessionProjectSelection(\n selectionHistory,\n channelId,\n { channelId: previousChannelId, compute: current.compute },\n defaultSandboxBackend,\n );\n return selection.compute === current.compute\n ? current\n : { ...current, compute: selection.compute };\n });\n });\n const setExplicitComputeDraft = useLatestCallback((nextDraft: SessionDraft) => {\n setProjectProvenancePresent(true);\n setDraft(\n nextDraft.compute.kind === \"sandbox\" &&\n !nextDraft.compute.backend &&\n defaultSandboxBackend !== \"selfhosted\"\n ? {\n ...nextDraft,\n compute: {\n ...nextDraft.compute,\n backend: defaultSandboxBackend ?? \"\",\n },\n }\n : nextDraft,\n );\n });\n\n useEffect(() => {\n resetSessionView();\n }, [resetSessionView, workspaceId]);\n\n // Folder-launch links preselect their exact destination, including Default,\n // while the ordinary New session entry starts in Recents. Commit this intent\n // before pending draft continuations can run; keeping it in an effect also\n // preserves render purity and the useEffect server fallback preserves SSR.\n useCommitSynchronousEffect(() => {\n const previousLaunchChannelId = previousLaunchChannelIdRef.current;\n previousLaunchChannelIdRef.current = launchChannelId;\n launchProjectIntentRef.current = nextNewSessionProjectLaunchIntent(\n launchProjectIntentRef.current,\n previousLaunchChannelId,\n launchChannelId,\n );\n const channelId = resolveAmbientNewSessionProjectChannelId({\n launchChannelId,\n previousLaunchChannelId,\n recentChannelId,\n remoteDraftHydrated: remoteDraftHydratedRef.current,\n });\n if (channelId === undefined) return;\n if (launchChannelId === undefined && previousLaunchChannelId !== undefined) {\n setProjectProvenancePresent(false);\n }\n selectProject(channelId, launchChannelId !== undefined);\n }, [launchChannelId, recentChannelId, selectProject]);\n\n useEffect(() => {\n if (\n selectedChannelId !== null &&\n !channelsQuery.loading &&\n !channelsQuery.channels.some((channel) => channel.id === selectedChannelId)\n ) {\n selectProject(null, false);\n }\n }, [channelsQuery.channels, channelsQuery.loading, selectedChannelId, selectProject]);\n const createProject = useCallback(async () => {\n const name = projectNameDraft.trim();\n if (!name) return;\n const project = await channelsQuery.create({ name });\n if (!project) {\n toast.error(\"Couldn't create the project. The name may already be in use.\");\n return;\n }\n selectProject(project.id);\n setProjectDialogOpen(false);\n setProjectNameDraft(\"\");\n }, [channelsQuery, projectNameDraft, selectProject]);\n\n useEffect(() => {\n const onRequest = (event: Event) => {\n const requestedChannelId = (event as CustomEvent<CreateComposerFocusIntent>).detail\n ?.channelId;\n launchProjectIntentRef.current = nextFocusedNewSessionProjectLaunchIntent(\n launchProjectIntentRef.current,\n requestedChannelId,\n );\n if (requestedChannelId !== undefined) {\n selectProject(requestedChannelId);\n } else if (remoteDraftHydratedRef.current) {\n setProjectProvenancePresent(false);\n selectProject(recentChannelId, false);\n }\n setCreateComposerFocusGen((current) => current + 1);\n };\n uiEvents.addEventListener(FOCUS_CREATE_COMPOSER_EVENT, onRequest);\n return () => uiEvents.removeEventListener(FOCUS_CREATE_COMPOSER_EVENT, onRequest);\n }, [recentChannelId, selectProject, uiEvents]);\n\n const computeReady =\n isSessionDraftComputeReady(draft) &&\n (draft.compute.kind !== \"machine\" ||\n (!fleet.loading &&\n selectedMachine !== null &&\n isMachineComputeSelectable(selectedMachine.state)));\n const persistedToolPolicy = useMemo(\n () =>\n fitToolPolicyToAgentCapabilities(\n newSessionDraftToolPolicy({\n selectedMcpServerIds: context.selectedCapabilityToolIds,\n workspaceDefaultMcpServerIds: context.workspaceDefaultToolIds,\n catalogReady: context.workspaceMcpCatalogReady,\n customizing: connectorCustomizing,\n explicit: toolSelectionExplicit,\n ...(!toolSelectionExplicit ? { excludedMcpServerIds: connectorExclusions } : {}),\n }),\n draft.agentCapabilities,\n ),\n [\n context.selectedCapabilityToolIds,\n context.workspaceMcpCatalogReady,\n context.workspaceDefaultToolIds,\n toolSelectionExplicit,\n connectorCustomizing,\n connectorExclusions,\n draft.agentCapabilities,\n ],\n );\n const persistedValue = useMemo(\n () => ({\n text: message,\n resources: [\n ...(draft.compute.kind === \"machine\" ? [] : context.currentResources),\n ...attachments.readyResources,\n ],\n tools: persistedToolPolicy.tools,\n toolsProvided: persistedToolPolicy.toolsProvided,\n model: context.model,\n reasoningEffort: context.reasoningEffort,\n latencyMode: context.latencyMode,\n ...(modelProvided !== undefined ? { modelProvided } : {}),\n ...(projectProvenancePresent ? { selectedProjectChannelId: selectedChannelId } : {}),\n options: {\n ...newSessionDraftOptionsFromSessionDraft(\n draft,\n defaultFirstPartyMcpTools,\n createVisibility,\n ),\n ...(persistedToolPolicy.excludedMcpServerIds !== undefined\n ? { excludedMcpServerIds: persistedToolPolicy.excludedMcpServerIds }\n : {}),\n },\n }),\n [\n attachments.readyResources,\n context.model,\n context.latencyMode,\n context.reasoningEffort,\n context.currentResources,\n draft,\n defaultFirstPartyMcpTools,\n message,\n modelProvided,\n createVisibility,\n persistedToolPolicy,\n projectProvenancePresent,\n selectedChannelId,\n ],\n );\n useEffect(() => {\n if (\n context.selectedPersonalGitHubRepoIds.size > 0 &&\n !context.personalGitHubAuthority &&\n context.personalGitHubCatalogReady\n ) {\n void context.ensurePersonalGitHubAuthority(workspaceId);\n }\n }, [\n context,\n context.ensurePersonalGitHubAuthority,\n context.personalGitHubAuthority,\n context.personalGitHubCatalogReady,\n context.selectedPersonalGitHubRepoIds.size,\n workspaceId,\n ]);\n const hydrateResources = useLatestCallback((resources: NewSessionDraftEditable[\"resources\"]) =>\n rehydrateRepositoryResources(resources, context.githubRepos, {\n catalogReady: context.githubCatalogReady,\n personalRepositories: context.personalGitHubRepositories,\n personalCatalogReady: context.personalGitHubCatalogReady,\n }),\n );\n const setModel = context.setModel;\n const setReasoningEffort = context.setReasoningEffort;\n const setLatencyMode = context.setLatencyMode;\n const setSelectedCapabilityToolIds = context.setSelectedCapabilityToolIds;\n const setManualRepos = context.setManualRepos;\n const setSelectedRepoIds = context.setSelectedRepoIds;\n const setSelectedRepoRefs = context.setSelectedRepoRefs;\n const setSelectedPersonalGitHubRepoIds = context.setSelectedPersonalGitHubRepoIds;\n const setSelectedPersonalGitHubRepoRefs = context.setSelectedPersonalGitHubRepoRefs;\n const githubRepos = context.githubRepos;\n const workspaceDefaultToolIdsForHydration = context.workspaceDefaultToolIds;\n const applyRemoteDraft = useCallback(\n (remote: NewSessionDraftEditable, history: NewSessionSelectionHistory) => {\n setMessage(remote.text);\n const restored = sessionDraftFromNewSessionDraftOptions(\n remote.options,\n defaultFirstPartyMcpTools,\n defaultSandboxBackend,\n );\n const projectSelection = resolveHydratedNewSessionProjectSelection({\n launchIntent: launchProjectIntentRef.current,\n remote,\n history,\n restoredCompute: restored.compute,\n defaultSandboxBackend,\n });\n // Fence the ambient Recents effect before installing history. That state\n // update changes recentChannelId, but must not replace this hydrated\n // explicit/persisted selection (or the legacy fallback resolved above).\n remoteDraftHydratedRef.current = true;\n setSelectionHistory(history);\n setProjectProvenancePresent(\n hydratedNewSessionProjectProvenancePresent(launchProjectIntentRef.current, remote),\n );\n setSelectedProjectChannelId(projectSelection.channelId);\n const compute = initialWorkspaceMachineCompute({\n settings: workspace?.settings,\n options: remote.options,\n fallback: projectSelection.compute,\n backend: defaultSandboxBackend,\n });\n setDraft({ ...restored, compute });\n setModel(remote.model);\n setReasoningEffort(remote.reasoningEffort);\n setLatencyMode(remote.latencyMode);\n setModelProvided(remote.modelProvided);\n const customize = newSessionConnectorCustomizeState({\n toolsProvided: remote.toolsProvided,\n tools: remote.tools,\n excludedMcpServerIds: remote.options.excludedMcpServerIds,\n });\n setConnectorCustomizing(customize.customizing);\n setToolSelectionExplicit(customize.explicit);\n setConnectorExclusions(remote.options.excludedMcpServerIds ?? []);\n const selected = new Set(\n customize.explicit\n ? remote.tools.map((tool) => tool.id)\n : defaultConnectorSelection(\n workspaceDefaultToolIdsForHydration,\n customize.customizing ? (remote.options.excludedMcpServerIds ?? []) : [],\n ),\n );\n setSelectedCapabilityToolIds(selectableSessionMcpServerIds(selected));\n const repositorySelection = repositorySelectionFromResources(remote.resources, githubRepos);\n setManualRepos(repositorySelection.manualRepos);\n setSelectedRepoIds(repositorySelection.selectedRepoIds);\n setSelectedRepoRefs(repositorySelection.selectedRepoRefs);\n setSelectedPersonalGitHubRepoIds(repositorySelection.selectedPersonalRepoIds);\n setSelectedPersonalGitHubRepoRefs(repositorySelection.selectedPersonalRepoRefs);\n },\n [\n setManualRepos,\n setModel,\n setLatencyMode,\n setReasoningEffort,\n setSelectedCapabilityToolIds,\n setSelectedRepoIds,\n setSelectedRepoRefs,\n setSelectedPersonalGitHubRepoIds,\n setSelectedPersonalGitHubRepoRefs,\n githubRepos,\n defaultFirstPartyMcpTools,\n defaultSandboxBackend,\n setSelectedProjectChannelId,\n workspaceDefaultToolIdsForHydration,\n workspace?.settings,\n ],\n );\n const newSessionDraft = useNewSessionDraft({\n workspaceId,\n client: context.client,\n value: persistedValue,\n onApplyRemote: applyRemoteDraft,\n restoreReadyFiles: attachments.restoreReadyFiles,\n hydrateResources,\n suspendAutosave: submitting,\n // Establish the passive baseline only after effective visibility settles.\n // Otherwise a late Personal-workspace capability response turns hydration\n // into an autosave, racing navigation and sibling drafts without a user edit.\n // Failed capability reads settle to the existing unavailable fallback too.\n // GitHub remains optional and must not keep the composer unsendable.\n resourceHydrationReady: context.workspaceMcpCatalogReady && tenancyCapabilities !== null,\n });\n useEffect(() => {\n if (newSessionDraft.loading || !context.workspaceMcpCatalogReady || toolSelectionExplicit)\n return;\n const next = defaultConnectorSelection(\n context.workspaceDefaultToolIds,\n connectorCustomizing ? connectorExclusions : [],\n );\n setSelectedCapabilityToolIds((current) =>\n current.size === next.size && [...next].every((id) => current.has(id)) ? current : next,\n );\n }, [\n newSessionDraft.loading,\n context.workspaceMcpCatalogReady,\n context.workspaceDefaultToolIds,\n setSelectedCapabilityToolIds,\n connectorCustomizing,\n connectorExclusions,\n toolSelectionExplicit,\n ]);\n const busy = context.busy || submitting;\n const privateCreateUnavailable =\n (personalWorkspace && tenancyCapabilities === null) ||\n (!personalWorkspace &&\n draft.visibility === \"private\" &&\n tenancyCapabilities?.canCreatePrivate !== true);\n const selectedPolicyRow = findPickerRow(modelCatalog.rows, context.model);\n // A refused start names its model until the next start or a dismissal; before\n // any Send, an uncovered model with free credit left for others does the same.\n const refusedCreate =\n createCreditRefusal?.workspaceId === workspaceId ? createCreditRefusal : null;\n const creditCoverageOptions = {\n selectedModel: context.model,\n preferredModel: modelCatalog.defaultSelection?.model,\n };\n const creditGap = refusedCreate\n ? creditRefusalGap(modelCatalog.rows, refusedCreate.model, creditCoverageOptions)\n : freeCreditGap(modelCatalog.rows, context.model, creditCoverageOptions);\n const noteCreditRefusal = (error: Error, request: { model?: string | undefined }): boolean => {\n if (!isPaymentRequiredError(error)) return false;\n setCreateCreditRefusal({\n workspaceId,\n model: request.model ?? context.model,\n message: error.message,\n });\n // Re-read funding so the notice and picker name what the credit covers now.\n void modelCatalog.refresh();\n return true;\n };\n const chooseCoveredModel = (id: string) => {\n const row = findPickerRow(modelCatalog.rows, id);\n const choice = row\n ? coveredModelChoice(row, context.reasoningEffort, context.latencyMode)\n : null;\n if (!choice) return;\n setModelProvided(true);\n context.setModel(choice.model);\n context.setReasoningEffort(choice.effort);\n if (choice.latencyMode !== null) context.setLatencyMode(choice.latencyMode);\n };\n const newSessionPolicyValid = Boolean(\n selectedPolicyRow?.selectable &&\n effortOptionsForModel(selectedPolicyRow.catalog).includes(context.reasoningEffort) &&\n (context.latencyMode === \"standard\" ||\n runnableLatencyModesForModel(selectedPolicyRow.catalog).includes(context.latencyMode)),\n );\n const noRunnableModel =\n !modelCatalog.loading &&\n modelCatalog.rows.length > 0 &&\n !modelCatalog.rows.some((row) => row.selectable);\n const newSessionPolicyError =\n !modelCatalog.loading &&\n !newSessionPolicyValid &&\n !noRunnableModel &&\n selectedPolicyRow?.selectable\n ? \"Choose a supported model, reasoning level, and speed.\"\n : null;\n useEffect(() => {\n if (modelCatalog.loading || newSessionDraft.loading) return;\n if (findPickerRow(modelCatalog.rows, context.model)?.selectable) return;\n // The server-resolved default comes first (saved workspace default, then a\n // connected subscription, then credits, then the deployment default); the\n // client ranking only covers a default that is itself unavailable.\n const resolvedDefault = modelCatalog.defaultSelection;\n const next = composerFallbackModel({\n models: modelCatalog.models,\n rows: modelCatalog.rows,\n defaultSelection: resolvedDefault,\n });\n if (!next || next.id === context.model) return;\n setModel(next.id);\n setReasoningEffort(next.effort);\n // An automatic replacement is not the person's choice.\n setModelProvided((current) => (current === undefined ? current : false));\n }, [\n context.model,\n modelCatalog.defaultSelection,\n modelCatalog.loading,\n modelCatalog.models,\n modelCatalog.rows,\n newSessionDraft.loading,\n setModel,\n setReasoningEffort,\n ]);\n const codexConnected = modelCatalog.models.some(\n (candidate) =>\n candidate.provider === \"codex-subscription\" &&\n candidate.credentialReadiness.status === \"ready\",\n );\n const startBlocker =\n modelCatalog.loading || newSessionDraft.loading\n ? null\n : modelCatalog.error\n ? \"model_catalog_unavailable\"\n : !newSessionPolicyValid\n ? !modelCatalog.rows.some((row) => row.selectable)\n ? \"no_model_connected\"\n : selectedPolicyRow &&\n selectedPolicyRow.billingClass !== \"opengeni_credits\" &&\n selectedPolicyRow.catalog.credentialReadiness.status !== \"ready\"\n ? \"selected_model_not_connected\"\n : \"model_policy_unavailable\"\n : privateCreateUnavailable\n ? \"private_session_unavailable\"\n : attachments.hasUnresolved\n ? \"attachments_pending\"\n : !computeReady\n ? \"compute_unavailable\"\n : null;\n useEffect(() => {\n const record = () => {\n if (startBlocker)\n captureAnalyticsEvent(\"session_start_blocker_viewed\", {\n workspace_id: workspaceId,\n reason: startBlocker,\n });\n };\n record();\n window.addEventListener(ANALYTICS_COLLECTION_ENABLED_EVENT, record);\n return () => window.removeEventListener(ANALYTICS_COLLECTION_ENABLED_EVENT, record);\n }, [startBlocker, workspaceId]);\n // Shared with the bar start control and the mobile “+ → Voice model” panel.\n const voiceSelection = useRealtimeModelSelection({\n client: context.client,\n workspaceId,\n codexConnected,\n });\n\n useEffect(() => {\n if (createComposerFocusGen === 0 || newSessionDraft.loading) return;\n const textarea = composerRegionRef.current?.querySelector(\"textarea\");\n if (!textarea || textarea.disabled) return;\n textarea.focus();\n }, [createComposerFocusGen, newSessionDraft.loading]);\n\n const submitNewSession = useLatestCallback(\n async (\n realtimeModel: SessionRealtimeModel | null,\n policy?: Pick<ComposerLaunchSearch, \"model\" | \"effort\" | \"latency\">,\n ): Promise<boolean> => {\n if (startBlocker)\n captureAnalyticsEvent(\"session_start_blocked\", {\n workspace_id: workspaceId,\n reason: startBlocker,\n });\n const hasTypedText = message.trim().length > 0;\n const text = hasTypedText\n ? message\n : attachments.readyResources.length > 0\n ? FILE_ONLY_MESSAGE_TEXT(t)\n : \"\";\n if (\n busy ||\n !context.workspaceMcpCatalogReady ||\n newSessionDraft.loading ||\n !newSessionPolicyValid ||\n privateCreateUnavailable ||\n personalResourceCatalogRefreshPending ||\n (!realtimeModel &&\n createdSessionAuthority === null &&\n (connectionAccounts.loading ||\n connectionAccounts.error !== null ||\n connectionAccounts.requiresAccountChoice)) ||\n (createdSessionAuthority === null && !fixedResourceSelection.selectionResolved)\n )\n return false;\n if (createdSessionAuthority === null) {\n const unavailable = unavailableSessionMcpServerIds(\n context.selectedCapabilityToolIds,\n context.toolMcpServers,\n context.workspaceMcpCatalogLoadedSuccessfully,\n );\n if (unavailable.length > 0) {\n const removed = new Set(unavailable);\n context.setSelectedCapabilityToolIds(\n (current) => new Set([...current].filter((id) => !removed.has(id))),\n );\n setConnectorExclusions((current) => [...new Set([...current, ...unavailable])]);\n toast.error(\"Some selected tools are no longer available\", {\n description:\n \"Removed them from this draft. Your message is still here; review the tools and send again.\",\n });\n return false;\n }\n }\n if (realtimeModel && personalMachineSelected) {\n toast.error(\"Voice can't start on a personal Connected Machine\", {\n description:\n \"Start the session with a message first so Opengeni can attach the machine to an accepted turn.\",\n });\n return false;\n }\n if (\n createdSessionAuthority === null &&\n ((!text && !realtimeModel) || attachments.hasUnresolved || !computeReady)\n ) {\n return false;\n }\n // A chosen limit must be a valid amount; an older server never gets one.\n const usageLimit =\n usageLimitCapability === \"enabled\" ? parseSessionUsageLimitDraft(usageLimitDraft) : null;\n if (createdSessionAuthority === null && usageLimit && !usageLimit.ok) {\n setUsageLimitSendBlocked(true);\n toast.error(\"Check the usage limit\", {\n description: `${usageLimit.error} Change it under + > Usage limit.`,\n });\n return false;\n }\n const usageLimitMicros = usageLimit?.ok ? usageLimit.limitMicros : null;\n const model = policy?.model ?? persistedValue.model;\n const reasoningEffort = policy?.effort ?? persistedValue.reasoningEffort;\n const latencyMode = policy?.latency ?? persistedValue.latencyMode;\n // One Send always refers to one visible snapshot, even if a sibling edit\n // forces a draft save or create retry while the user continues typing.\n const visibleSignature = stableJson(persistedValue);\n const submittedSnapshot = newSessionCreateSnapshot(\n persistedValue,\n realtimeModel ? persistedValue.text : text,\n {\n model,\n reasoningEffort,\n latencyMode,\n },\n );\n const preserveNewerLocalDraft = async () => {\n if (!newSessionDraft.isCurrentSignature(visibleSignature)) {\n // A definitive create failure must not leave text typed during the\n // attempt unsaved after a retry persisted the clicked snapshot.\n await (realtimeModel ? newSessionDraft.flush() : newSessionDraft.flushForSend());\n }\n };\n setSubmitting(true);\n try {\n return await runNewSessionRouteSubmission({\n authority: createdSessionAuthority,\n onAuthorityChange: setCreatedSessionAuthority,\n create: async () => {\n // Voice launch is realtime-only: never turn composer text/files into\n // an initial message. Persist the draft so a pending autosave is not\n // lost on navigate, but do not consume it — text stays for later.\n if (realtimeModel) {\n for (let attempt = 0; attempt < 3; attempt += 1) {\n // Voice launch does not consume the draft. Save local edits if\n // possible, but never rebase an old voice draft over a sibling's\n // newer unsent message merely to start a realtime session.\n const flushed = await newSessionDraft.flush();\n if (!flushed) {\n reportDraftSaveFailure(newSessionDraft);\n return null;\n }\n const submission = submissionFromSessionDraft(\n draft,\n defaultFirstPartyMcpTools,\n personalResourceAttachment.intent,\n );\n let draftConflict = false;\n let outcomeUnknown = false;\n const created = await context.startSession(\n workspaceId,\n {\n text: \"\",\n resources: [],\n tools: submittedSnapshot.tools,\n model,\n reasoningEffort,\n latencyMode,\n ...submission.extras,\n },\n {\n targetSandboxId: submission.options.targetSandboxId,\n workingDir: submission.options.workingDir,\n channelId: selectedChannelId,\n omitWorkspaceResources: submission.omitWorkspaceResources,\n installedSkillIds: launch.skillCapabilityId\n ? [launch.skillCapabilityId]\n : undefined,\n startMode: \"realtime\",\n expectedNewSessionDraftRevision: flushed.revision,\n newSessionDraftToolPolicy: persistedToolPolicy,\n agentLearning: draft.agentLearning,\n usageLimitMicros,\n visibility: newSessionCreateVisibility(\n personalWorkspace,\n submission.options.visibility ?? \"workspace\",\n tenancyCapabilities?.canCreatePrivate === true,\n ),\n onFailure: ({ error, request, outcomeUnknown: uncertain }) => {\n draftConflict = newSessionDraft.captureConflict(error);\n outcomeUnknown = uncertain;\n recoverPersonalResourceAttachment(error, request);\n connectionAccounts.onSelectionError(error);\n // A brief outage shows the updating notice, not a toast.\n return (\n draftConflict ||\n newSessionDraft.reportUnavailable(error) ||\n noteCreditRefusal(error, request)\n );\n },\n },\n );\n if (!created) {\n if (draftConflict) continue;\n if (!outcomeUnknown) await preserveNewerLocalDraft();\n return null;\n }\n setUsageLimitDraft(NO_SESSION_USAGE_LIMIT);\n setCreateCreditRefusal(null);\n setUsageLimitSendBlocked(false);\n return {\n sessionId: created.id,\n settleDraft: async () => true,\n };\n }\n await preserveNewerLocalDraft();\n newSessionDraft.clearError();\n toast.error(\"Couldn't start voice\", {\n description: DRAFT_CHANGED_DURING_SEND_TEXT,\n });\n return null;\n }\n\n const submittedResources = submittedSnapshot.resources;\n for (let attempt = 0; attempt < 3; attempt += 1) {\n const flushed = await newSessionDraft.flushForSend(submittedSnapshot);\n if (!flushed) {\n reportDraftSaveFailure(newSessionDraft);\n return null;\n }\n const submission = submissionFromSessionDraft(\n draft,\n defaultFirstPartyMcpTools,\n personalResourceAttachment.intent,\n );\n let draftConflict = false;\n let outcomeUnknown = false;\n const created = await context.startSession(\n workspaceId,\n {\n text,\n resources: submittedResources,\n tools: submittedSnapshot.tools,\n model,\n reasoningEffort,\n latencyMode,\n ...submission.extras,\n connectionAccounts: connectionAccounts.selections,\n },\n {\n targetSandboxId: submission.options.targetSandboxId,\n workingDir: submission.options.workingDir,\n channelId: selectedChannelId,\n omitWorkspaceResources: submission.omitWorkspaceResources,\n installedSkillIds: launch.skillCapabilityId\n ? [launch.skillCapabilityId]\n : undefined,\n expectedNewSessionDraftRevision: flushed.revision,\n newSessionDraftToolPolicy: persistedToolPolicy,\n agentLearning: draft.agentLearning,\n usageLimitMicros,\n visibility: newSessionCreateVisibility(\n personalWorkspace,\n submission.options.visibility ?? \"workspace\",\n tenancyCapabilities?.canCreatePrivate === true,\n ),\n onFailure: ({ error, request, outcomeUnknown: uncertain }) => {\n draftConflict = newSessionDraft.captureConflict(error);\n outcomeUnknown = uncertain;\n recoverPersonalResourceAttachment(error, request);\n connectionAccounts.onSelectionError(error);\n // A brief outage shows the updating notice, not a toast.\n // An unconfirmed create keeps its idempotency key, so the\n // person's next Send cannot start a second session.\n return (\n draftConflict ||\n newSessionDraft.reportUnavailable(error) ||\n noteCreditRefusal(error, request)\n );\n },\n },\n );\n if (!created) {\n if (draftConflict) continue;\n if (!outcomeUnknown) await preserveNewerLocalDraft();\n return null;\n }\n // The limit belongs to the chat just created; the next starts with none.\n setUsageLimitDraft(NO_SESSION_USAGE_LIMIT);\n setCreateCreditRefusal(null);\n setUsageLimitSendBlocked(false);\n return {\n sessionId: created.id,\n settleDraft: async () => {\n const acknowledged = await newSessionDraft.acknowledgeConsumed(\n flushed,\n visibleSignature,\n );\n if (\n acknowledged?.kind === \"consumed\" &&\n newSessionDraft.isCurrentSignature(visibleSignature)\n ) {\n setMessage(\"\");\n visibilityChosenRef.current = false;\n setDraft({\n ...emptySessionDraft(defaultFirstPartyMcpTools, defaultSandboxBackend),\n visibility:\n tenancyCapabilities?.canCreatePrivate === true &&\n tenancyCapabilities.defaultVisibility === \"private\"\n ? \"private\"\n : \"workspace\",\n });\n attachments.removeReadyFiles(\n submittedResources.flatMap((resource) =>\n resource.kind === \"file\" ? [resource.fileId] : [],\n ),\n );\n } else if (\n acknowledged?.kind !== \"preserved\" ||\n !newSessionDraft.isCurrentSignature(acknowledged.flushed.signature)\n ) {\n // The message was already accepted. If there is no newer\n // local edit, leave a sibling's later draft untouched.\n if (!acknowledged && newSessionDraft.isCurrentSignature(visibleSignature)) {\n return true;\n }\n const preserved = await newSessionDraft.flushForSend();\n if (!preserved || !newSessionDraft.isCurrentSignature(preserved.signature)) {\n return false;\n }\n }\n return true;\n },\n };\n }\n await preserveNewerLocalDraft();\n // Each attempt saved the draft before the create refused it, so the\n // draft is not unsaved: clear that notice and resume autosave.\n newSessionDraft.clearError();\n toast.error(\"Couldn't send\", {\n description: DRAFT_CHANGED_DURING_SEND_TEXT,\n });\n return null;\n },\n navigate: async (sessionId) => {\n // Voice connects while the session page loads; the page adopts\n // the running call (`?realtime=` still selects its model there).\n const sessionPath = `/workspaces/${workspaceId}/sessions/${sessionId}`;\n const abandonVoice = realtimeModel\n ? prestartSessionRealtime({\n client: api.voiceRealtimeClient(\n context.client,\n () => new URL(sessionPath, page.origin()).href,\n ),\n workspaceId,\n sessionId,\n model: realtimeModel,\n language: voiceSelection.languageFor(realtimeModel),\n voiceSettings: voiceSelection.voiceSettingsFor(realtimeModel),\n })\n : null;\n try {\n await navigate({\n to: \"/workspaces/$workspaceId/sessions/$sessionId\",\n params: { workspaceId, sessionId },\n search: realtimeModel ? { realtime: realtimeModel } : {},\n });\n } catch (error) {\n abandonVoice?.();\n throw error;\n }\n },\n });\n } finally {\n setSubmitting(false);\n }\n },\n );\n\n // URL launch: ?model=&effort=&latency= prefill the composer; +?realtime= also\n // creates a realtime-first session and autostarts voice on the session page.\n // Wait for the durable new-session draft so remote hydrate cannot stomp the\n // URL policy after we apply it.\n const launchModel = launch.model;\n const launchEffort = launch.effort;\n const launchLatency = launch.latency;\n const launchRealtime = launch.realtime;\n const launchFollowDefault = launch.followDefault === true;\n const launchSkillCapabilityId = launch.skillCapabilityId;\n const launchKey = composerLaunchSearchKey(launch);\n const handledLaunchKeyRef = useRef<string | null>(null);\n useEffect(() => {\n if (!launchKey || handledLaunchKeyRef.current === launchKey) return;\n if (newSessionDraft.loading) return;\n if (launchModel) setModel(launchModel);\n if (launchEffort) setReasoningEffort(launchEffort);\n if (launchLatency) setLatencyMode(launchLatency);\n // A checkout return carries the credits default and keeps following the\n // default; any other launch policy is the person's choice.\n setModelProvided((current) =>\n modelProvidedAfterLaunch(\n {\n ...(launchModel ? { model: launchModel } : {}),\n ...(launchEffort ? { effort: launchEffort } : {}),\n ...(launchLatency ? { latency: launchLatency } : {}),\n ...(launchFollowDefault ? { followDefault: true } : {}),\n },\n current,\n ),\n );\n if (!launchRealtime) {\n handledLaunchKeyRef.current = launchKey;\n void navigate({\n to: \"/workspaces/$workspaceId/sessions\",\n params: { workspaceId },\n search: {\n ...(launch.channelId ? { channelId: launch.channelId } : {}),\n ...(launchSkillCapabilityId ? { skillCapabilityId: launchSkillCapabilityId } : {}),\n },\n replace: true,\n });\n return;\n }\n if (\n busy ||\n !computeReady ||\n !newSessionPolicyValid ||\n !context.workspaceMcpCatalogReady ||\n attachments.hasUnresolved\n ) {\n return;\n }\n handledLaunchKeyRef.current = launchKey;\n void submitNewSession(launchRealtime, {\n model: launchModel,\n effort: launchEffort,\n latency: launchLatency,\n }).then((ok) => {\n if (!ok) handledLaunchKeyRef.current = null;\n });\n }, [\n attachments.hasUnresolved,\n busy,\n computeReady,\n context.workspaceMcpCatalogReady,\n launchEffort,\n launchFollowDefault,\n launchLatency,\n launchModel,\n launchRealtime,\n launchSkillCapabilityId,\n launchKey,\n launch.channelId,\n navigate,\n newSessionDraft.loading,\n newSessionPolicyValid,\n setLatencyMode,\n setModel,\n setReasoningEffort,\n submitNewSession,\n workspaceId,\n ]);\n\n // The session does not exist yet, so this surface cannot use `useComposer`\n // (that hook sends to a session). It still renders the package ChatComposer\n // by implementing the same `ComposerState` contract over session creation.\n const createComposer: ComposerState = {\n value: message,\n setValue: setMessage,\n hasDraftContent: () => message.length > 0 || attachments.attachments.length > 0,\n sending: busy,\n // Mirrors useComposer's gate: a ready attachment with no typed draft is a\n // sendable file-only message (the API requires non-empty text, so send()\n // substitutes FILE_ONLY_MESSAGE_TEXT).\n canSend:\n (createdSessionAuthority !== null ||\n message.trim().length > 0 ||\n attachments.readyResources.length > 0) &&\n !busy &&\n !newSessionDraft.loading &&\n newSessionPolicyValid &&\n !personalResourceCatalogRefreshPending &&\n (createdSessionAuthority !== null ||\n (!connectionAccounts.loading &&\n connectionAccounts.error === null &&\n !connectionAccounts.requiresAccountChoice)) &&\n (createdSessionAuthority !== null || fixedResourceSelection.selectionResolved) &&\n (createdSessionAuthority !== null || (!attachments.hasUnresolved && computeReady)),\n pause: async () => {},\n pausing: false,\n resume: async () => {},\n resumeScope: async () => {},\n resuming: false,\n draft: null,\n draftRevision: newSessionDraft.revision,\n draftLoading: newSessionDraft.loading,\n draftSaving: newSessionDraft.saving,\n // A stale autosaved draft must not block or distract from explicit Send.\n draftConflict: null,\n policy: {\n model: context.model,\n reasoningEffort: context.reasoningEffort,\n latencyMode: context.latencyMode,\n },\n setModel: (model) => {\n setModelProvided(true);\n context.setModel(model);\n },\n setReasoningEffort: (effort) => {\n setModelProvided(true);\n context.setReasoningEffort(effort);\n },\n setLatencyMode: (latencyMode) => {\n setModelProvided(true);\n context.setLatencyMode(latencyMode);\n },\n draftPersistence: \"disabled\",\n applyDraft: () => {},\n reloadDraft: newSessionDraft.reload,\n resolveDraftConflict: newSessionDraft.resolveConflict,\n restoredResources: [],\n removeRestoredResource: () => {},\n // A brief outage is explained once by the updating notice below the\n // composer, never as a red error with a request reference.\n error: newSessionDraft.unavailable || newSessionDraft.conflict ? null : newSessionDraft.error,\n clearError: newSessionDraft.clearError,\n send: async () => await submitNewSession(null),\n steer: async () => {\n const text =\n message.trim() || (attachments.readyResources.length > 0 ? FILE_ONLY_MESSAGE_TEXT(t) : \"\");\n if (!text || busy || attachments.hasUnresolved || !computeReady || !newSessionPolicyValid) {\n return false;\n }\n return await createComposer.send();\n },\n };\n useBrowserAccountBridgeBlocker(`new-session-composer:${workspaceId}`, () => {\n if (attachments.hasUnresolved) {\n return {\n id: \"ignored\",\n label: \"A file upload is not settled\",\n detail: \"Wait for the upload or remove it before changing accounts.\",\n };\n }\n if (busy || submitting || newSessionDraft.saving) {\n return {\n id: \"ignored\",\n label: \"A new-session mutation is still running\",\n detail: \"Wait for the current save or session creation to finish.\",\n };\n }\n return createComposer.hasDraftContent()\n ? {\n id: \"ignored\",\n label: \"The new-session composer has an unsent draft\",\n detail: \"Continuing clears the account-bound draft.\",\n }\n : null;\n });\n\n // A transient outage is covered by the updating notice instead.\n const accountsFailure = connectionAccounts.error !== null && !connectionAccounts.unavailable;\n\n return createElement(\n LightboxProvider,\n null,\n // The canvas parent is overflow-hidden, so this route owns its scrolling —\n // without it the page clips (recent sessions were unreachable below the fold).\n <div\n data-workspace-scroll-owner=\"self-managed\"\n data-window-top-page\n className=\"min-h-0 flex-1 overflow-y-auto\"\n >\n {githubAppConnect.element}\n <div className=\"mx-auto flex w-full max-w-3xl flex-col px-4 pt-10 pb-16 sm:px-6 sm:pt-16\">\n <section className=\"flex flex-col items-center gap-2 text-center\">\n <h1 className=\"text-balance text-2xl font-semibold tracking-tight sm:text-3xl\">\n What should the agent do?\n </h1>\n {context.clientConfig.billingMode === \"stripe\" &&\n workspace?.accountId &&\n hasAccountPermission(context.accessContext, workspace.accountId, \"billing:manage\") ? (\n <>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"mt-2\"\n onClick={() => setCreditTopupOpen(true)}\n >\n <CreditCardIcon className=\"size-4\" />\n Add credits\n </Button>\n <Suspense fallback={null}>\n <CreditTopupPrompt\n purpose=\"topup\"\n open={creditTopupOpen}\n workspaceId={workspaceId}\n accountId={workspace.accountId}\n canBuyCredits\n onOpenChange={setCreditTopupOpen}\n />\n </Suspense>\n </>\n ) : null}\n </section>\n\n {launchSkillCapabilityId ? (\n <div className=\"mt-6\">\n <Notice tone=\"info\" title=\"Implementation guidance selected\">\n This installed Skill will be frozen onto this session only. Other workspace sessions\n will not receive it.\n </Notice>\n </div>\n ) : null}\n\n {creditGap ? (\n <div className=\"mt-6\">\n <CreditRefusalNotice\n gap={creditGap}\n message={refusedCreate?.message}\n workspaceId={workspaceId}\n canBuyCredits={\n context.clientConfig.billingMode === \"stripe\" &&\n hasAccountPermission(\n context.accessContext,\n workspace?.accountId ?? \"\",\n \"billing:manage\",\n )\n }\n canConnectModel={hasWorkspacePermission(\n context.accessContext,\n workspaceId,\n \"connections:write\",\n )}\n onChooseModel={busy ? undefined : chooseCoveredModel}\n {...(refusedCreate ? { onDismiss: () => setCreateCreditRefusal(null) } : {})}\n />\n </div>\n ) : modelUsesCredits(selectedPolicyRow?.catalog) &&\n hasAccountPermission(\n context.accessContext,\n workspace?.accountId ?? \"\",\n \"billing:read\",\n ) ? (\n <div className=\"mt-6\">\n <Suspense fallback={null}>\n <EmptyCreditsNotice\n creditFunding={selectedPolicyRow?.catalog.creditFunding}\n workspaceId={workspaceId}\n accountId={workspace?.accountId ?? null}\n canBuyCredits={hasAccountPermission(\n context.accessContext,\n workspace?.accountId ?? \"\",\n \"billing:manage\",\n )}\n canReadBilling\n />\n </Suspense>\n </div>\n ) : null}\n\n <div ref={composerRegionRef} className=\"mt-8 [&_textarea]:min-h-[calc(2lh+1rem)]\">\n <ConsoleComposer\n workspaceId={workspaceId}\n composer={createComposer}\n attachments={attachments}\n autoFocus\n disabled={newSessionDraft.loading || submitting}\n fileUploadsEnabled={context.clientConfig.fileUploads.enabled === true}\n placeholder=\"Describe a task for the agent…\"\n controlsLeading={\n <>\n <ComposerMobilePlus\n openRequest={capabilitiesOpenRequest}\n connectorActions={{\n accountControls: {\n groups: connectionAccounts.availableAccountGroups,\n choices: connectionAccounts.accountChoices,\n onChoose: connectionAccounts.selectAccount,\n loading: connectionAccounts.loading,\n error: connectionAccounts.error,\n accessDenied: connectionAccounts.accessDenied,\n onRefresh: () => void connectionAccounts.refresh(),\n disabled: busy || newSessionDraft.loading,\n },\n }}\n menuSide=\"bottom\"\n agentCapabilities={{\n ...composerAgentCapabilities,\n disabled: busy || newSessionDraft.loading,\n }}\n draftChatSettings={{\n workspaceId,\n scope:\n createVisibility === \"private\" || personalWorkspace\n ? \"personal\"\n : \"workspace\",\n value: draft.agentLearning ?? {},\n onChange: (agentLearning) =>\n setDraft((current) => ({ ...current, agentLearning })),\n }}\n workspaceId={workspaceId}\n disabled={busy || newSessionDraft.loading}\n fileUploadsEnabled={context.clientConfig.fileUploads.enabled === true}\n servers={context.toolMcpServers}\n firstPartyTools={firstPartyToolOptions}\n selection={{\n mcpServerIds: context.selectedCapabilityToolIds,\n firstPartyToolIds: draft.firstPartyMcpTools,\n }}\n toolsDisabled={busy || newSessionDraft.loading}\n connectorCustomizing={connectorCustomizing}\n onConnectorCustomizingChange={(next) => {\n if (next) setConnectorCustomizing(true);\n else followWorkspaceConnectors();\n }}\n onToolSelectionChange={(selection) => {\n changeConnectorSelection(selection);\n }}\n {...(hasRunsOnChoices(runsOnChoices)\n ? {\n runsOn: {\n summary: runsOnSummary(runsOnChoices),\n disabled: busy || newSessionDraft.loading,\n panel: (\n <RunsOnMenuBody\n {...runsOnChoices}\n disabled={busy || newSessionDraft.loading}\n onChange={setDraft}\n onComputeChange={setExplicitComputeDraft}\n onRetryMachines={() => void fleet.refresh()}\n />\n ),\n },\n }\n : {})}\n {...(hasVisibilityChoice({\n personalWorkspace,\n canCreatePrivate: tenancyCapabilities?.canCreatePrivate === true,\n })\n ? {\n visibility: {\n summary: visibilitySummary(draft.visibility),\n disabled: busy || newSessionDraft.loading,\n panel: (\n <VisibilityMenuBody\n value={draft.visibility}\n disabled={busy || newSessionDraft.loading}\n onChange={(visibility) => {\n visibilityChosenRef.current = true;\n setDraft((current) => ({\n ...current,\n visibility,\n }));\n }}\n />\n ),\n },\n }\n : {})}\n {...(usageLimitCapability === \"enabled\"\n ? {\n usageLimit: {\n summary: sessionUsageLimitDraftSummary(usageLimitDraft),\n disabled: busy || newSessionDraft.loading,\n panel: (\n <UsageLimitMenuBody\n value={usageLimitDraft}\n disabled={busy || newSessionDraft.loading}\n showRequiredError={usageLimitSendBlocked}\n onChange={setUsageLimitDraft}\n />\n ),\n },\n }\n : {})}\n {...(draft.compute.kind === \"sandbox\"\n ? {\n repositories: {\n selectedCount:\n context.selectedRepoIds.size +\n context.selectedPersonalGitHubRepoIds.size +\n context.manualRepos.filter((repo) => repo.url.trim().length > 0).length,\n disabled: busy || newSessionDraft.loading,\n panel: (\n <WorkspaceRepositoryMenuBody\n workspaceId={workspaceId}\n disabled={busy || newSessionDraft.loading}\n catalogRefresh={repositoryCatalogRefresh}\n onConnectWorkspaceApp={githubAppConnect.open}\n />\n ),\n },\n }\n : {})}\n {...(draftSecretsOn && canListSecrets\n ? {\n secrets: {\n summary: sessionSecretsSummary(draftVaultPolicy, draftVaultRows),\n disabled: busy || newSessionDraft.loading,\n panel: (\n <SessionSecretsMenuBody\n vaults={draftVaultRows}\n policy={draftVaultPolicy}\n narrowedByParent={false}\n canEdit\n disabled={busy || newSessionDraft.loading}\n loading={draftVaults.loading}\n error={draftVaults.error}\n onRetry={() => void draftVaults.refresh()}\n onPolicyChange={(policy) =>\n setDraft((current) => {\n const { vaultPolicy: _previous, ...rest } = current;\n return policy.mode === \"all\"\n ? rest\n : { ...rest, vaultPolicy: policy };\n })\n }\n onManage={() =>\n void navigate({\n to: \"/workspaces/$workspaceId/secrets\",\n params: { workspaceId },\n })\n }\n />\n ),\n },\n }\n : {})}\n />\n {composerAgentCapabilities.customized ? (\n <ComposerCapabilitiesChip\n summary={capabilitySummary(\n composerAgentCapabilities.draft.values,\n composerAgentCapabilities.availability,\n )}\n disabled={busy || newSessionDraft.loading}\n onOpen={() =>\n setCapabilitiesOpenRequest((current) => ({\n panel: \"capabilities\",\n nonce: (current?.nonce ?? 0) + 1,\n }))\n }\n />\n ) : null}\n </>\n }\n controls={\n <div className=\"@container/model-controls flex min-w-0 flex-1 items-center gap-1.5\">\n <SessionModelControl\n hasImageAttachments={attachments.attachments.some(\n (file) => file.status !== \"failed\" && file.contentType.startsWith(\"image/\"),\n )}\n modelCatalog={modelCatalog}\n policyError={newSessionPolicyError}\n disabled={busy || newSessionDraft.loading}\n workspaceId={workspaceId}\n onPolicyChosen={() => setModelProvided(true)}\n />\n </div>\n }\n actions={\n <>\n <NewSessionRealtimeControl\n client={context.client}\n workspaceId={workspaceId}\n codexConnected={codexConnected}\n models={voiceSelection.models}\n selectedModel={voiceSelection.selectedModel}\n onSelectModel={voiceSelection.selectModel}\n modelMenu=\"split\"\n disabled={\n busy ||\n newSessionDraft.loading ||\n attachments.hasUnresolved ||\n !newSessionPolicyValid ||\n !computeReady ||\n personalMachineSelected ||\n !context.workspaceMcpCatalogReady\n }\n disabledReason={\n attachments.hasUnresolved\n ? \"Wait for attachments to finish before starting voice.\"\n : !newSessionPolicyValid\n ? \"Choose supported model settings before starting voice.\"\n : !computeReady\n ? \"Choose where this session should run first.\"\n : personalMachineSelected\n ? \"Start with a message so personal machine access can attach to an accepted turn.\"\n : !context.workspaceMcpCatalogReady\n ? \"Wait for session tools to finish loading.\"\n : null\n }\n onStart={async (model) => await submitNewSession(model)}\n />\n </>\n }\n header={\n <SessionSetupStrip\n disabled={busy || newSessionDraft.loading}\n channels={channelsQuery.channels}\n selectedChannelId={selectedChannelId}\n onChannelChange={selectProject}\n onCreateProject={() => setProjectDialogOpen(true)}\n />\n }\n />\n\n {personalWorkspace ? <PrivateWorkspaceNote /> : null}\n {newSessionDraft.conflict ? <NewSessionDraftSyncNotice /> : null}\n\n {/* A deploy or restart makes Opengeni unreachable for a few seconds.\n Reads retry quietly first; if it lasts longer, this one calm line\n replaces every error, the message stays in the composer, and the\n hooks reconnect on their own so Send works again. */}\n {newSessionDraft.unavailable || connectionAccounts.unavailable ? (\n <div role=\"status\" className=\"mt-3\">\n <Notice tone=\"info\">{OPENGENI_UPDATING_NOTICE(t)}</Notice>\n </div>\n ) : null}\n\n {/* Accounts load quietly with the composer: only a problem shows here,\n never a loading line behind an open menu. */}\n {accountsFailure || connectionAccounts.accountChoiceMessage ? (\n <div role=\"alert\" className=\"mt-3\">\n <Notice\n tone=\"waiting\"\n action={\n accountsFailure && !connectionAccounts.accessDenied ? (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => void connectionAccounts.refresh()}\n >\n Retry\n </Button>\n ) : undefined\n }\n >\n {accountsFailure\n ? connectionAccounts.accessDenied\n ? connectionAccounts.error\n : \"Couldn't send your message. Try again.\"\n : connectionAccounts.accountChoiceMessage}\n </Notice>\n </div>\n ) : null}\n\n <ComputeTargetControl\n workspaceId={workspaceId}\n defaultSandboxBackend={defaultSandboxBackend}\n draft={draft}\n onChange={setDraft}\n onComputeChange={setExplicitComputeDraft}\n disabled={busy || newSessionDraft.loading}\n personalResourceAccess={{\n names: selectedPersonalResourceNames,\n visibility: createVisibility,\n }}\n fleet={fleet}\n machines={machines}\n rigs={selectableRigs}\n workspaceDefaultRigId={workspace?.defaultRigId ?? null}\n catalogRecovery={{\n error: fixedResourceCatalogError,\n refreshing: personalResourceCatalogRefreshPending,\n onRetry: () => void refreshPersonalResourceCatalogs(),\n }}\n selectedChannelId={selectedChannelId}\n selectionHistory={selectionHistory}\n />\n </div>\n\n <RecentSessions workspaceId={workspaceId} />\n <NewSessionStarters\n workspaceId={workspaceId}\n set={signupStarterSet(context.authSession?.user.email, workspace?.accountId)}\n disabled={busy || newSessionDraft.loading}\n onSelect={(prompt) => {\n setMessage(prompt);\n composerRegionRef.current?.querySelector(\"textarea\")?.focus({ preventScroll: true });\n }}\n />\n </div>\n <ChannelCreateDialog\n open={projectDialogOpen}\n name={projectNameDraft}\n busy={channelsQuery.mutating}\n onNameChange={setProjectNameDraft}\n onOpenChange={(open) => {\n setProjectDialogOpen(open);\n if (!open) setProjectNameDraft(\"\");\n }}\n onSubmit={() => void createProject()}\n />\n </div>,\n );\n}\n\n/** Send kept losing to a newer draft saved elsewhere (another tab or window). */\nconst DRAFT_CHANGED_DURING_SEND_TEXT =\n \"Your message is saved, but this draft kept changing in another tab or window. Check it and send again.\";\n\n/** A draft that didn't save: the message is kept, then what to do. */\nfunction draftSaveFailureText(draft: { conflict: Error | null; error: Error | null }): string {\n if (draft.conflict || !draft.error) return \"Your message is still here. Try again.\";\n return `Your message is still here. ${userErrorText(draft.error)}`;\n}\n\n/** A failed pre-send draft save: a brief outage shows the updating notice instead of a toast. */\nfunction reportDraftSaveFailure(draft: {\n conflict: Error | null;\n currentError: () => Error | null;\n}): void {\n const error = draft.currentError();\n if (isTransientServiceFailure(error)) return;\n toast.error(\"Couldn't save the draft\", {\n description: draftSaveFailureText({ conflict: draft.conflict, error }),\n });\n}\n\n// ── Recent sessions — the quiet main-canvas browser the rail can't be (D4.2) ──\n// A calm section below the composer: the most recent sessions as compact rows\n// (status, title, provider mark + catalog model label, relative time). Reuses\n// the rail's session list + the workspace model catalog so labels/marks match\n// the model picker — never raw wire ids as the primary display.\nfunction RecentSessions({ workspaceId }: { workspaceId: string }) {\n const { workspaceSessionListEvent } = useOpenGeni();\n const hintsAvailable =\n workspaceSessionListEvent?.workspaceId === workspaceId && workspaceSessionListEvent.available;\n const { sessions, pinned, refresh, error } = useWorkspaceSessions({\n limit: 12,\n // Top-level conversations: sub-agents open from their parent and would\n // otherwise fill this short page in a workspace that runs many of them.\n parentSessionId: null,\n pollIntervalMs: hintsAvailable ? undefined : 30_000,\n });\n useSessionListHintRefresh(refresh, error);\n const modelCatalog = useWorkspaceModelCatalog(workspaceId);\n // Pins are server-authoritative and sit above running and recency rows.\n const recent = useMemo(() => recentSessionsForHome(t, sessions, pinned, 6), [pinned, sessions]);\n\n if (recent.length === 0) {\n return null;\n }\n\n return (\n <section className=\"mt-12\">\n <h2 className=\"mb-1.5 px-0.5 text-2xs font-semibold uppercase tracking-wider text-fg\">\n Recent sessions\n </h2>\n {/* flex-col, not grid: a grid auto track grows to a nowrap row's full\n min-content width, defeating truncate and overflowing the page. */}\n <ul className=\"flex min-w-0 flex-col divide-y divide-border/60\">\n {recent.map((session) => (\n <RecentSessionRow\n key={session.id}\n workspaceId={workspaceId}\n session={session}\n catalogRows={modelCatalog.rows}\n />\n ))}\n </ul>\n </section>\n );\n}\n\nfunction RecentSessionRow({\n workspaceId,\n session,\n catalogRows,\n}: {\n workspaceId: string;\n session: Session;\n catalogRows: readonly PickerModelRow[];\n}) {\n const title = sessionDisplayTitle(session);\n const model = recentSessionModelPresentation(session.model, catalogRows);\n const repo = sessionRepoLabel(session);\n const metaBits = [model.label, repo].filter(Boolean);\n const status = recentSessionStatus(session);\n return (\n <li className=\"min-w-0\">\n <Link\n to=\"/workspaces/$workspaceId/sessions/$sessionId\"\n params={{ workspaceId, sessionId: session.id }}\n className=\"group flex items-center gap-3 rounded-md px-1 py-2.5 transition-colors hover:bg-hover\"\n >\n <StatusDot tone={status.tone} pulse={status.pulse} />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm text-fg group-hover:text-fg\">{title}</span>\n {metaBits.length > 0 ? (\n <span className=\"mt-0.5 flex min-w-0 items-center gap-1.5 text-2xs text-fg-subtle\">\n <ModelMark\n model={{ id: session.model, logoUrl: model.logoUrl }}\n className=\"size-3 text-fg-muted\"\n fallback={\n <BillingClassMark\n billingClass={model.billingClass}\n className=\"size-3\"\n aria-label=\"\"\n />\n }\n />\n <span className=\"truncate\">{metaBits.join(\" · \")}</span>\n </span>\n ) : null}\n </span>\n <span className=\"shrink-0 text-2xs tabular-nums text-fg-subtle\">\n {relativeTimeLabel(t, session.updatedAt)}\n </span>\n </Link>\n </li>\n );\n}\n\n// Setup selections sit above the prompt so the footer remains an action row.\n// Repo stays out of the compute band so that band only shows when rigs /\n// machines exist. Tools and repos live under “+” at every width.\nfunction SessionSetupStrip({\n disabled,\n channels,\n selectedChannelId,\n onChannelChange,\n onCreateProject,\n}: {\n disabled: boolean;\n channels: Channel[];\n selectedChannelId: string | null;\n onChannelChange: (channelId: string | null) => void;\n onCreateProject: () => void;\n}) {\n return (\n <div className=\"flex min-w-0 items-center gap-1.5 border-b border-border/70 px-3 py-2 sm:px-4\">\n <SessionFolderPicker\n channels={channels}\n selectedChannelId={selectedChannelId}\n disabled={disabled}\n onChange={onChannelChange}\n onCreateProject={onCreateProject}\n />\n </div>\n );\n}\n\n/** Keep model policy adjacent to voice/send in the bottom action row. */\nfunction SessionModelControl({\n hasImageAttachments,\n modelCatalog,\n policyError,\n disabled,\n workspaceId,\n onPolicyChosen,\n}: {\n hasImageAttachments: boolean;\n modelCatalog: WorkspaceModelCatalogState;\n policyError: string | null;\n disabled: boolean;\n workspaceId: string;\n /** The person picked a model, reasoning level, or speed. */\n onPolicyChosen: () => void;\n}) {\n const context = useAppContext();\n return (\n <ModelPicker\n hasImageAttachments={hasImageAttachments}\n onOpenChange={(open) => {\n if (open) void modelCatalog.refresh();\n }}\n rows={modelCatalog.rows}\n model={context.model}\n effort={context.reasoningEffort}\n latencyMode={context.latencyMode}\n disabled={disabled}\n loading={modelCatalog.loading}\n error={modelCatalog.error ?? policyError}\n menuSide=\"bottom\"\n connectModelsHref={`/workspaces/${encodeURIComponent(workspaceId)}/settings?section=models`}\n onModelChange={(model) => {\n onPolicyChosen();\n context.setModel(model);\n }}\n onEffortChange={(effort) => {\n onPolicyChosen();\n context.setReasoningEffort(effort);\n }}\n onLatencyModeChange={(latencyMode) => {\n onPolicyChosen();\n context.setLatencyMode(latencyMode);\n }}\n />\n );\n}\n\nfunction SessionFolderPicker({\n channels,\n selectedChannelId,\n disabled,\n onChange,\n onCreateProject,\n}: {\n channels: Channel[];\n selectedChannelId: string | null;\n disabled: boolean;\n onChange: (channelId: string | null) => void;\n onCreateProject: () => void;\n}) {\n const selected = channels.find((channel) => channel.id === selectedChannelId) ?? null;\n const label = selected?.name ?? \"Default\";\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n disabled={disabled}\n aria-label={`Project: ${label}`}\n title={label}\n className=\"h-8 min-w-0 max-w-[12rem] shrink gap-1.5 overflow-hidden rounded-full border border-transparent px-2.5 text-xs text-fg-muted hover:border-border hover:bg-surface-2 hover:text-fg sm:shrink-0\"\n >\n <FolderIcon className=\"size-3.5 shrink-0\" />\n <span className=\"min-w-0 truncate\">{label}</span>\n <ChevronDownIcon className=\"size-3 shrink-0\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" side=\"bottom\" sideOffset={8} className=\"w-60\">\n <DropdownMenuLabel>Save new session in</DropdownMenuLabel>\n <DropdownMenuItem onSelect={() => onChange(null)}>\n <FolderIcon />\n <span className=\"min-w-0 flex-1 truncate\">Default</span>\n <DropdownMenuCheck checked={selectedChannelId === null} />\n </DropdownMenuItem>\n {channels.map((channel) => (\n <DropdownMenuItem key={channel.id} onSelect={() => onChange(channel.id)}>\n <FolderIcon />\n <span className=\"min-w-0 flex-1 truncate\">{channel.name}</span>\n <DropdownMenuCheck checked={channel.id === selectedChannelId} />\n </DropdownMenuItem>\n ))}\n <DropdownMenuItem onSelect={onCreateProject}>\n <PlusIcon />\n New project\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\nfunction workspaceRepositoryPickerProps(\n context: ReturnType<typeof useAppContext>,\n workspaceId: string,\n disabled: boolean,\n onConnectWorkspaceApp: () => void,\n page: PageHost,\n): RepositoryContextPickerProps {\n return {\n setupMode:\n context.githubStatus?.setupMode ??\n (context.clientConfig.productAccessMode === \"managed\" ? \"platform\" : \"operator\"),\n configured: context.githubStatus?.configured === true,\n status: context.githubStatus?.status ?? (\"disabled\" as const),\n installUrl: context.githubStatus?.installUrl ?? null,\n linkUrl: context.githubStatus?.linkUrl ?? null,\n installations: context.githubStatus?.installations ?? [],\n repositories: context.githubRepos,\n personalGitHubStatus: context.personalGitHubStatus,\n personalGitHubRepositories: context.personalGitHubRepositories,\n selectedPersonalGitHubRepoIds: context.selectedPersonalGitHubRepoIds,\n selectedPersonalGitHubRepoRefs: context.selectedPersonalGitHubRepoRefs,\n personalGitHubBusy: context.personalGitHubBusy,\n groups: context.repositoryGroups,\n selectedRepoIds: context.selectedRepoIds,\n selectedRepoRefs: context.selectedRepoRefs,\n selectedInstallationId: context.selectedInstallationId,\n manualRepos: context.manualRepos,\n manualOpen: context.manualReposOpen,\n githubAppOpen: context.githubAppOpen,\n org: context.githubOrg,\n pending: context.busy || disabled,\n repoBusy: context.repoBusy,\n githubAppBusy: context.githubAppBusy,\n onRefresh: async () => {\n await Promise.all([\n context.refreshGitHub(workspaceId, undefined, { sync: true }),\n context.refreshPersonalGitHub(workspaceId),\n ]);\n },\n onConnectPersonalGitHub: () => void context.connectPersonalGitHub(workspaceId),\n onTogglePersonalGitHubRepo: (repository) =>\n void context.togglePersonalGitHubRepository(workspaceId, repository),\n onPersonalGitHubRefChange: (repositoryId: string, ref: string) =>\n context.setSelectedPersonalGitHubRepoRefs((current) => ({\n ...current,\n [repositoryId]: ref,\n })),\n onToggleRepo: context.toggleGitHubRepository,\n onRefChange: (repoId: number, ref: string) =>\n context.setSelectedRepoRefs((current) => ({ ...current, [repoId]: ref })),\n onLoadGitHubBranches: async (repository) => {\n const acceptedTransition = context.captureWorkspaceInvocation(workspaceId);\n if (!acceptedTransition) throw new Error(\"The workspace changed; refresh and try again.\");\n const { listGitHubRepositoryBranches } = await import(\"@opengeni/sdk/github-repositories\");\n const response = await listGitHubRepositoryBranches(\n context.client,\n workspaceId,\n repository.installationId,\n repository.id,\n { limit: 100 },\n );\n if (!context.ownsWorkspaceInvocation(workspaceId, acceptedTransition)) {\n throw new Error(\"The workspace changed; refresh and try again.\");\n }\n return response.branches;\n },\n onLoadPersonalGitHubBranches: async (repository) => {\n const acceptedTransition = context.captureWorkspaceInvocation(workspaceId);\n if (!acceptedTransition) throw new Error(\"The workspace changed; refresh and try again.\");\n const connectionId = context.personalGitHubStatus?.connection?.id;\n if (!connectionId) throw new Error(\"Connect your GitHub identity to load branches.\");\n const { listPersonalGitHubRepositoryBranches } =\n await import(\"@opengeni/sdk/github-repositories\");\n const response = await listPersonalGitHubRepositoryBranches(\n context.client,\n workspaceId,\n connectionId,\n repository.repositoryId,\n { limit: 100 },\n );\n if (!context.ownsWorkspaceInvocation(workspaceId, acceptedTransition)) {\n throw new Error(\"The workspace changed; refresh and try again.\");\n }\n return response.branches;\n },\n onManualOpenChange: context.setManualReposOpen,\n onManualAdd: context.addManualRepository,\n onManualUpdate: (id: number, patch: Partial<RepoDraft>) =>\n context.setManualRepos((current) =>\n current.map((repo) => (repo.id === id ? { ...repo, ...patch } : repo)),\n ),\n onManualRemove: (id: number) =>\n context.setManualRepos((current) => current.filter((repo) => repo.id !== id)),\n onManualAttach: async (repository) => {\n const acceptedTransition = context.captureWorkspaceInvocation(workspaceId);\n if (!acceptedTransition) throw new Error(\"The workspace changed; try again.\");\n const assertCurrent = () => {\n if (!context.ownsWorkspaceInvocation(workspaceId, acceptedTransition)) {\n throw new Error(\"The workspace changed; try again.\");\n }\n };\n assertCurrent();\n return await attachManualRepository({\n repository,\n workspaceRepositories: context.githubRepos,\n personalRepositories: context.personalGitHubRepositories,\n selectWorkspaceRepository: (matched, ref) => {\n assertCurrent();\n context.setSelectedRepoIds((current) => {\n const next =\n context.selectedInstallationId !== null &&\n context.selectedInstallationId !== matched.installationId\n ? new Set<number>()\n : new Set(current);\n next.add(matched.id);\n return next;\n });\n context.setSelectedRepoRefs((current) => ({\n ...current,\n [matched.id]: ref,\n }));\n context.setSelectedPersonalGitHubRepoIds(\n (current) =>\n new Set(\n [...current].filter(\n (id) =>\n context.personalGitHubRepositories\n .find((candidate) => candidate.repositoryId === id)\n ?.fullName.toLowerCase() !== matched.fullName.toLowerCase(),\n ),\n ),\n );\n },\n selectPersonalRepository: async (matched, ref) => {\n if (!(await context.ensurePersonalGitHubAuthority(workspaceId))) {\n throw new Error(\"Your GitHub identity could not be authorized for this workspace.\");\n }\n assertCurrent();\n context.setSelectedRepoIds(\n (current) =>\n new Set(\n [...current].filter(\n (id) =>\n context.githubRepos\n .find((candidate) => candidate.id === id)\n ?.fullName.toLowerCase() !== matched.fullName.toLowerCase(),\n ),\n ),\n );\n context.setSelectedPersonalGitHubRepoIds((current) =>\n new Set(current).add(matched.repositoryId),\n );\n context.setSelectedPersonalGitHubRepoRefs((current) => ({\n ...current,\n [matched.repositoryId]: ref,\n }));\n },\n verifyPublicGitHubRepository: async (request) => {\n const { verifyPublicGitHubRepositoryRef } =\n await import(\"@opengeni/sdk/github-repositories\");\n const verified = await verifyPublicGitHubRepositoryRef(\n context.client,\n workspaceId,\n request,\n );\n assertCurrent();\n return verified;\n },\n attach: (attached) => {\n assertCurrent();\n context.setManualRepos((current) =>\n current.map((candidate) => (candidate.id === attached.id ? attached : candidate)),\n );\n },\n remove: (id) => {\n assertCurrent();\n context.setManualRepos((current) => current.filter((candidate) => candidate.id !== id));\n },\n });\n },\n validationError: context.repositoryValidationError,\n onGitHubAppOpenChange: context.setGithubAppOpen,\n onOrgChange: context.setGithubOrg,\n onStartGitHubApp: () => void context.startGitHubAppManifestFlow(workspaceId),\n onConnectWorkspaceApp,\n onConfigureInstallation: (installationId: number) =>\n openGitHubInstallationSettings(context.client, workspaceId, installationId, page.assign),\n onDisconnectInstallation: async (installationId: number) => {\n await context.disconnectGitHubInstallation(workspaceId, installationId);\n },\n };\n}\n\nfunction WorkspaceRepositoryMenuBody({\n workspaceId,\n disabled,\n leading,\n catalogRefresh,\n onConnectWorkspaceApp,\n}: {\n workspaceId: string;\n disabled: boolean;\n leading?: ReactNode | undefined;\n catalogRefresh: ReturnType<typeof useRepositoryCatalogRefresh>;\n onConnectWorkspaceApp: () => void;\n}) {\n const page = usePage();\n const context = useAppContext();\n return (\n <RepositoryContextMenuBody\n {...workspaceRepositoryPickerProps(\n context,\n workspaceId,\n disabled,\n onConnectWorkspaceApp,\n page,\n )}\n {...catalogRefresh}\n {...(leading ? { leading } : {})}\n />\n );\n}\n\n// ── The promoted top-level compute target (the parent that gates the band) ────\n\ntype NewSessionPersonalResourceAccess = {\n names: string[];\n visibility: \"private\" | \"workspace\";\n};\n\ntype FixedResourceCatalogRecovery = {\n error: boolean;\n refreshing: boolean;\n onRetry: () => void;\n};\n\nfunction ComputeTargetControl(props: {\n workspaceId: string;\n defaultSandboxBackend?: SandboxBackend | undefined;\n draft: SessionDraft;\n onChange: (draft: SessionDraft) => void;\n onComputeChange: (draft: SessionDraft) => void;\n disabled: boolean;\n personalResourceAccess: NewSessionPersonalResourceAccess;\n fleet: ReturnType<typeof useWorkspaceMachines>;\n machines: MachineView[];\n rigs: Rig[];\n workspaceDefaultRigId: string | null;\n catalogRecovery: FixedResourceCatalogRecovery;\n selectedChannelId: string | null;\n selectionHistory: NewSessionSelectionHistory;\n}) {\n const { draft, onChange } = props;\n const { fleet, machines } = props;\n const selfhostedPrimary = props.defaultSandboxBackend === \"selfhosted\";\n // Managed-primary deployments keep Connected Machine opt-in and hide the\n // chooser when the fleet is empty. Selfhosted-primary deployments always show\n // the required machine path, including its honest unavailable state.\n const machineAvailabilityKey = machines\n .map((machine) => `${machine.sandboxId}:${machine.state}`)\n .join(\"\\u0000\");\n\n const selectedMachineSandboxId =\n draft.compute.kind === \"machine\" ? draft.compute.sandboxId : null;\n\n // A named machine stays selected when it disconnects or is removed. The\n // unavailable notice and submission gate require an explicit replacement.\n useEffect(() => {\n if (\n selfhostedPrimary &&\n draft.compute.kind === \"machine\" &&\n selectedMachineSandboxId === null &&\n !fleet.loading\n ) {\n const firstSelectableId = resolveSelectableMachineSandboxId(machines, null);\n if (firstSelectableId)\n onChange({\n ...draft,\n compute: {\n kind: \"machine\",\n sandboxId: firstSelectableId,\n folder: rememberedMachineFolder(\n props.selectionHistory,\n props.selectedChannelId,\n firstSelectableId,\n ),\n },\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selfhostedPrimary, fleet.loading, machineAvailabilityKey, selectedMachineSandboxId]);\n\n // A 404 means Connected Machines are off here, not a failure.\n const fleetLoadFailed =\n fleet.error != null && !(fleet.error instanceof OpenGeniApiError && fleet.error.status === 404);\n const attention = runsOnAttention({\n draft,\n machines,\n fleetLoadFailed,\n fleetLoading: fleet.loading,\n });\n\n // Where it runs is chosen under \"+\" > Runs on. Only what needs attention\n // shows under the composer: why Send waits on where it runs (with a retry\n // for a failed machine load), a catalog that couldn't be verified, and the\n // personal resources this chat will use.\n return (\n <>\n {attention ? (\n <div className=\"mt-3\">\n <RunsOnNotice\n attention={attention}\n machines={machines}\n disabled={props.disabled}\n onRetryMachines={() => void fleet.refresh()}\n connectAction={\n <Button asChild variant=\"outline\" size=\"sm\">\n <Link\n to=\"/workspaces/$workspaceId/machines\"\n params={{ workspaceId: props.workspaceId }}\n >\n Connect a machine\n </Link>\n </Button>\n }\n />\n </div>\n ) : null}\n {props.catalogRecovery.error ? (\n <div role=\"alert\" className=\"mt-3\">\n <Notice\n tone=\"failed\"\n title=\"Couldn’t verify the selected Sandbox Environment\"\n action={\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n disabled={props.disabled || props.catalogRecovery.refreshing}\n onClick={props.catalogRecovery.onRetry}\n >\n Try again\n </Button>\n }\n >\n Try again to reload your available resources before starting this session.\n </Notice>\n </div>\n ) : null}\n <div className=\"mt-3\">\n <PersonalResourceAccessInline access={props.personalResourceAccess} />\n </div>\n </>\n );\n}\n\nfunction PersonalResourceAccessInline(props: {\n access: NewSessionPersonalResourceAccess;\n embedded?: boolean | undefined;\n}) {\n if (props.access.names.length === 0) return null;\n const content = (\n <p className=\"text-2xs text-fg-subtle\">\n {props.access.names.join(\", \")} will be available for your work in this session.\n {props.access.visibility === \"workspace\"\n ? \" Results are visible to people who can access this chat.\"\n : null}\n </p>\n );\n return props.embedded ? (\n <div className=\"border-t border-border/70 px-3 py-2.5\">{content}</div>\n ) : (\n <div className=\"px-0.5\">{content}</div>\n );\n}\n\n/** One quiet line on the new-chat page of a Personal workspace: its chats are private. */\nfunction PrivateWorkspaceNote() {\n return (\n <p className=\"mt-3 flex items-center gap-1.5 px-0.5 text-xs text-fg-muted\">\n <LockIcon aria-hidden=\"true\" className=\"size-3.5 shrink-0\" />\n Private: only you can see chats here.\n </p>\n );\n}\n"],"mappings":"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","names":[]}
|