@opengeni/react 4.3.3-canary.39786771332001 → 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 +29 -29
- 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 +2 -2
- 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 +16 -16
- package/dist/app/components/artifacts/inline-chat-image.js +31 -30
- package/dist/app/components/artifacts/retained-file-preview.js +35 -34
- 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 +22 -21
- package/dist/app/components/artifacts/site-data.js +19 -19
- package/dist/app/components/artifacts/site-publishing.js +41 -41
- package/dist/app/components/artifacts/site-settings.js +50 -50
- package/dist/app/components/billing-class-mark.js +5 -5
- package/dist/app/components/capabilities/capability-detail-sheet.js +9 -9
- package/dist/app/components/capabilities/capability-logo-source.js +12 -12
- package/dist/app/components/capabilities/connector-tool-permissions.js +3 -3
- 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 +16 -16
- package/dist/app/components/capabilities/session-capability-card.js +94 -76
- package/dist/app/components/capabilities/session-capability-card.js.map +1 -1
- package/dist/app/components/capabilities/session-chrome-card.css +1023 -0
- package/dist/app/components/capabilities/session-chrome-card.css.map +1 -0
- package/dist/app/components/capabilities/session-chrome-card.d.ts +18 -0
- package/dist/app/components/capabilities/session-chrome-card.js +72 -0
- package/dist/app/components/capabilities/session-custom-mcp-card.js +20 -20
- package/dist/app/components/capabilities/session-github-card.js +24 -24
- package/dist/app/components/capabilities/session-machine-card.d.ts +27 -1
- package/dist/app/components/capabilities/session-machine-card.js +40 -36
- 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 +18 -17
- package/dist/app/components/command-menu/chat-switcher.js +19 -18
- package/dist/app/components/command-menu/chat-switcher.js.map +1 -1
- package/dist/app/components/command-menu/command-menu.js +36 -114
- package/dist/app/components/command-menu/command-menu.js.map +1 -1
- package/dist/app/components/command-menu/shortcut-sheet.js +17 -17
- package/dist/app/components/composer-capabilities-menu-body.js +3 -3
- package/dist/app/components/composer-mobile-plus-panel.js +20 -20
- 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 +12 -12
- 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 +7 -7
- 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 +5 -5
- 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 +9 -9
- 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 +9 -9
- package/dist/app/components/rail/rail-context.js +2 -2
- package/dist/app/components/rail/rail-sections.js +69 -66
- package/dist/app/components/rail/session-header.js +49 -48
- package/dist/app/components/rail/session-list.js +68 -65
- 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 +24 -23
- package/dist/app/components/rail/session-shell.js +107 -104
- 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 +5 -5
- package/dist/app/components/secrets/session-secrets-panel.js +3 -3
- package/dist/app/components/session/agent-configuration-panel.js +38 -38
- package/dist/app/components/session/artifact-link-boundary.js +2 -2
- package/dist/app/components/session/artifact-session-page.js +4 -4
- package/dist/app/components/session/banners.js +11 -11
- package/dist/app/components/session/codex-account-indicator.js +12 -12
- package/dist/app/components/session/editable-artifacts-workspace.js +45 -45
- package/dist/app/components/session/failed-session-banner.js +11 -11
- package/dist/app/components/session/human-input.js +59 -55
- package/dist/app/components/session/inspector.js +91 -87
- 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 +21 -20
- 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 +12 -12
- package/dist/app/components/session/sandbox-switcher.js +16 -16
- package/dist/app/components/session/sandbox-workspace.js +83 -79
- package/dist/app/components/session/search-markdown-highlight.js +10 -10
- package/dist/app/components/session/search-results-view.js +11 -11
- package/dist/app/components/session/session-admin-access.js +9 -9
- 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 +12 -12
- 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 +41 -26
- 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 +10 -9
- 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 +17 -16
- package/dist/app/components/session-connectors-menu-body.js +5 -5
- package/dist/app/components/settings/row-select.js +1 -1
- package/dist/app/components/transcription-settings.js +2 -2
- 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 +22 -22
- package/dist/app/embed/memory-navigation.js +2 -2
- package/dist/app/embed/session-app.js +275 -269
- package/dist/app/lib/actions/actions-provider.js +14 -14
- 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 +13 -13
- 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 +18 -17
- 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 +14 -13
- package/dist/app/lib/session-create.js +2 -2
- 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 +14 -13
- package/dist/app/lib/session-hover-facts.js +15 -14
- package/dist/app/lib/session-model.js +3 -3
- package/dist/app/lib/session-rail.js +10 -9
- 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 +22 -15
- 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 +5 -5
- 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 +8 -8
- 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 +136 -153
- 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 +177 -173
- package/dist/app/routes/sessions-index-hydration.js +3 -3
- package/dist/app/routes/sessions-index.js +123 -121
- 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-GIZGNFIX.js → chunk-22FFOHPT.js} +11 -11
- 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-LQKKSUCR.js → chunk-35BC2FU2.js} +19 -19
- 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-OQAAI33Y.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-GCGTYXJJ.js → chunk-3STBLX4O.js} +9 -9
- package/dist/{chunk-YXIW7H4N.js → chunk-3X5FKDYQ.js} +28 -28
- 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-DKCX643S.js → chunk-4RMN4E2Y.js} +13 -13
- package/dist/{chunk-E5FCEDMU.js → chunk-4SAGYEVB.js} +2 -2
- package/dist/{chunk-HTT3FB7T.js → chunk-4VK2R5QC.js} +3 -3
- package/dist/{chunk-CKG2EG62.js → chunk-4XQC7VLT.js} +14 -14
- 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-MNWQAYY3.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-NDETTZQA.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-WUHB422G.js → chunk-73WI7FL2.js} +18 -18
- package/dist/chunk-756MKA2J.js +45 -0
- package/dist/chunk-756MKA2J.js.map +1 -0
- package/dist/{chunk-QECZVL7S.js → chunk-7FJMRJDG.js} +2 -2
- package/dist/{chunk-7KGKDWWR.js → chunk-7HFLYNWN.js} +2 -2
- package/dist/{chunk-XVM566II.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-CKZW7A5S.js → chunk-7TCT7KPQ.js} +742 -644
- package/dist/chunk-7TCT7KPQ.js.map +1 -0
- package/dist/{chunk-O77Q4NG2.js → chunk-7XO7YKPC.js} +283 -1038
- package/dist/chunk-7XO7YKPC.js.map +1 -0
- package/dist/{chunk-S7PVL7XH.js → chunk-A4BD4ZVB.js} +4 -4
- package/dist/{chunk-VSQHDBHU.js → chunk-ACL2V2KE.js} +68 -35
- 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-FUSFVUIJ.js → chunk-CMLJSF2F.js} +12 -12
- package/dist/{chunk-O4DYOSOL.js → chunk-CP7ZQHBW.js} +13 -13
- 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-V5RJAWRP.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-IC7KNOBB.js → chunk-FDAV72IX.js} +7 -7
- 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-ZHFKMMOT.js → chunk-FTX5CNHA.js} +6 -6
- package/dist/{chunk-KYBALSWW.js → chunk-FWOBNL2A.js} +1 -1
- package/dist/{chunk-HJ5XWW62.js → chunk-FWYEZ3LE.js} +34 -34
- package/dist/{chunk-WSLPZ43N.js → chunk-G4HQUBO4.js} +12 -12
- 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-G3S2F35T.js → chunk-GHHM6WN4.js} +3 -3
- package/dist/{chunk-OANSIX34.js → chunk-GRSODLVO.js} +4 -4
- package/dist/{chunk-DDIBZA4X.js → chunk-GT7JFQ4E.js} +405 -148
- package/dist/chunk-GT7JFQ4E.js.map +1 -0
- package/dist/{chunk-EU6XSQFM.js → chunk-GXW2I2M2.js} +2 -2
- package/dist/{chunk-4246UYVG.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-Y7WMW74G.js → chunk-HQWVDQXW.js} +7 -7
- package/dist/{chunk-YTZQV2DD.js → chunk-HU6JTNWF.js} +2 -2
- package/dist/{chunk-QRVNI5V6.js → chunk-I6KIQKU6.js} +3 -3
- package/dist/{chunk-Q262Y2YX.js → chunk-IBA5FMRE.js} +141 -137
- 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-ETCB6SUJ.js → chunk-J22HD2PB.js} +6 -6
- package/dist/{chunk-U47YDYLQ.js → chunk-J5MEDX7C.js} +8 -8
- package/dist/{chunk-6VQTHC4W.js → chunk-J7FBBLHF.js} +36 -36
- 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-MM7OKOTE.js → chunk-JQCGPTZ6.js} +9 -9
- package/dist/chunk-JRSNCSZN.js +37 -0
- package/dist/chunk-JRSNCSZN.js.map +1 -0
- package/dist/{chunk-KNFDWNCH.js → chunk-JXT5QDJC.js} +5 -5
- 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-C535KSTY.js → chunk-LF5CBAOS.js} +4 -4
- 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-H5WGWAYX.js → chunk-LT4J7RHI.js} +13 -13
- package/dist/{chunk-DSGMYES6.js → chunk-MCTTONOW.js} +28 -28
- package/dist/{chunk-IGHELZI7.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-RKILMLA7.js → chunk-MXLKI7BI.js} +3 -3
- package/dist/{chunk-45WYYFP6.js → chunk-N3ZP4IDU.js} +2 -2
- 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-D3RK3NGM.js → chunk-PCFK7HKD.js} +17 -17
- 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-QIYBOFUV.js → chunk-QFMLAT7L.js} +246 -237
- 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-V77JK73U.js → chunk-RIYZFKIM.js} +37 -35
- package/dist/chunk-RIYZFKIM.js.map +1 -0
- package/dist/{chunk-VMFID36H.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-S37GP7LX.js +204 -0
- package/dist/chunk-S37GP7LX.js.map +1 -0
- package/dist/{chunk-A2EWJQXX.js → chunk-SM5QX6UK.js} +4 -4
- package/dist/{chunk-FBE6AIIW.js → chunk-SOKNCW5U.js} +2 -2
- package/dist/{chunk-Q4NM77K7.js → chunk-SSOO4GWN.js} +193 -194
- package/dist/chunk-SSOO4GWN.js.map +1 -0
- package/dist/{chunk-PFKTGZKE.js → chunk-SY2AAZNB.js} +2 -2
- package/dist/{chunk-DFZMKCVP.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-EDFJBX3V.js → chunk-U6MPB3K6.js} +9 -9
- package/dist/{chunk-TZD3U2S5.js → chunk-ULJAOMJA.js} +4 -4
- 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-324X6T6G.js → chunk-UP7I3W6O.js} +57 -55
- package/dist/chunk-UP7I3W6O.js.map +1 -0
- package/dist/{chunk-VU2EWALC.js → chunk-UUGR3X5I.js} +19 -12
- 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-NEVRLD77.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-H6WWEKEV.js → chunk-WCMG4HYI.js} +10 -10
- package/dist/{chunk-GZLLDA6P.js → chunk-WEFN327U.js} +2 -2
- package/dist/{chunk-VW3BBTMA.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-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-QILLL4JE.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-N7JKT4ZU.js → chunk-ZEIFJ6PX.js} +7 -7
- package/dist/{chunk-Q4OHNGGB.js → chunk-ZS2UQ3DV.js} +68 -11
- package/dist/chunk-ZS2UQ3DV.js.map +1 -0
- package/dist/{chunk-VRGOOVDB.js → chunk-ZVVT72MT.js} +2 -2
- package/dist/components/browser-viewer.d.ts +1 -1
- package/dist/composer.js +14 -14
- package/dist/{computer-viewer-KEDVLD42.js → computer-viewer-25AJIDYA.js} +9 -9
- package/dist/connect.js +11 -11
- package/dist/desktop.js +2 -2
- package/dist/editor.js +2 -2
- package/dist/{embedded-new-voice-5PYRDZ6T.js → embedded-new-voice-RZZEJT6M.js} +8 -8
- package/dist/{embedded-voice-PABC5NBD.js → embedded-voice-6OKSSPLW.js} +8 -8
- 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-5LIRVG4G.js → latest-question-2PFWQSSG.js} +4 -3
- package/dist/{latest-question-5LIRVG4G.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/model-policy-picker-menu-VVFGGAI6.js.map +1 -0
- 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 +7 -7
- 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 +277 -271
- 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 +77 -72
- package/dist/session.js +27 -25
- 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/types.d.ts +2 -0
- 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 +28 -26
- package/dist/ui/access-list.js +20 -20
- 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 +5 -5
- package/dist/ui/revision-history.js +11 -11
- package/dist/ui/role-select.js +6 -6
- 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-capability-card.tsx +14 -1
- package/src/app/components/capabilities/session-chrome-card.dom-fixture.tsx +377 -0
- package/src/app/components/capabilities/session-chrome-card.test.tsx +18 -0
- package/src/app/components/capabilities/session-chrome-card.tsx +243 -0
- package/src/app/components/capabilities/session-machine-card.dom-fixture.tsx +2 -0
- package/src/app/components/capabilities/session-machine-card.tsx +74 -16
- 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 +15 -8
- 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/src/timeline/types.ts +2 -0
- package/styles/compiled.css +38 -0
- package/dist/chunk-22ZBT6CN.js +0 -50
- package/dist/chunk-22ZBT6CN.js.map +0 -1
- package/dist/chunk-324X6T6G.js.map +0 -1
- package/dist/chunk-5JZYPZ72.js.map +0 -1
- package/dist/chunk-6W3LF3DB.js.map +0 -1
- package/dist/chunk-BJIZ7PL7.js.map +0 -1
- package/dist/chunk-CKZW7A5S.js.map +0 -1
- package/dist/chunk-DDIBZA4X.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-KF3MF6FP.js.map +0 -1
- package/dist/chunk-MYNUBDU7.js.map +0 -1
- package/dist/chunk-NAWXARTY.js.map +0 -1
- package/dist/chunk-O77Q4NG2.js.map +0 -1
- package/dist/chunk-PM3OSANE.js.map +0 -1
- package/dist/chunk-Q262Y2YX.js.map +0 -1
- package/dist/chunk-Q4NM77K7.js.map +0 -1
- package/dist/chunk-Q4OHNGGB.js.map +0 -1
- package/dist/chunk-QIYBOFUV.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-ROQOVH4N.js.map +0 -1
- package/dist/chunk-TQGJN5UZ.js.map +0 -1
- package/dist/chunk-V77JK73U.js.map +0 -1
- package/dist/chunk-VSQHDBHU.js.map +0 -1
- package/dist/chunk-VU2EWALC.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/components/capabilities/session-chrome-card.js.map} +0 -0
- /package/dist/{chat-interactive-block-ABCRKXJ4.js.map → app/lib/console-site.js.map} +0 -0
- /package/dist/{computer-viewer-KEDVLD42.js.map → app/lib/site-opened.js.map} +0 -0
- /package/dist/{embedded-new-voice-5PYRDZ6T.js.map → browser-viewer-QMCNV4RI.js.map} +0 -0
- /package/dist/{embedded-voice-PABC5NBD.js.map → chat-interactive-block-PMIAUXSO.js.map} +0 -0
- /package/dist/{chunk-GIZGNFIX.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-LQKKSUCR.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-OQAAI33Y.js.map → chunk-3RMKPHBL.js.map} +0 -0
- /package/dist/{chunk-GCGTYXJJ.js.map → chunk-3STBLX4O.js.map} +0 -0
- /package/dist/{chunk-YXIW7H4N.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-DKCX643S.js.map → chunk-4RMN4E2Y.js.map} +0 -0
- /package/dist/{chunk-E5FCEDMU.js.map → chunk-4SAGYEVB.js.map} +0 -0
- /package/dist/{chunk-HTT3FB7T.js.map → chunk-4VK2R5QC.js.map} +0 -0
- /package/dist/{chunk-CKG2EG62.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-MNWQAYY3.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-NDETTZQA.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-WUHB422G.js.map → chunk-73WI7FL2.js.map} +0 -0
- /package/dist/{chunk-QECZVL7S.js.map → chunk-7FJMRJDG.js.map} +0 -0
- /package/dist/{chunk-7KGKDWWR.js.map → chunk-7HFLYNWN.js.map} +0 -0
- /package/dist/{chunk-XVM566II.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-FUSFVUIJ.js.map → chunk-CMLJSF2F.js.map} +0 -0
- /package/dist/{chunk-O4DYOSOL.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-V5RJAWRP.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-IC7KNOBB.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-ZHFKMMOT.js.map → chunk-FTX5CNHA.js.map} +0 -0
- /package/dist/{chunk-KYBALSWW.js.map → chunk-FWOBNL2A.js.map} +0 -0
- /package/dist/{chunk-HJ5XWW62.js.map → chunk-FWYEZ3LE.js.map} +0 -0
- /package/dist/{chunk-WSLPZ43N.js.map → chunk-G4HQUBO4.js.map} +0 -0
- /package/dist/{chunk-CSHBR2IZ.js.map → chunk-GDLDBR6B.js.map} +0 -0
- /package/dist/{chunk-G3S2F35T.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-4246UYVG.js.map → chunk-GZS37O3G.js.map} +0 -0
- /package/dist/{chunk-Y7WMW74G.js.map → chunk-HQWVDQXW.js.map} +0 -0
- /package/dist/{chunk-YTZQV2DD.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-ETCB6SUJ.js.map → chunk-J22HD2PB.js.map} +0 -0
- /package/dist/{chunk-U47YDYLQ.js.map → chunk-J5MEDX7C.js.map} +0 -0
- /package/dist/{chunk-6VQTHC4W.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-MM7OKOTE.js.map → chunk-JQCGPTZ6.js.map} +0 -0
- /package/dist/{chunk-KNFDWNCH.js.map → chunk-JXT5QDJC.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-C535KSTY.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-H5WGWAYX.js.map → chunk-LT4J7RHI.js.map} +0 -0
- /package/dist/{chunk-DSGMYES6.js.map → chunk-MCTTONOW.js.map} +0 -0
- /package/dist/{chunk-IGHELZI7.js.map → chunk-MIECLOQC.js.map} +0 -0
- /package/dist/{chunk-FM4OUCC2.js.map → chunk-MOKYT3X3.js.map} +0 -0
- /package/dist/{chunk-RKILMLA7.js.map → chunk-MXLKI7BI.js.map} +0 -0
- /package/dist/{chunk-45WYYFP6.js.map → chunk-N3ZP4IDU.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-D3RK3NGM.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-VMFID36H.js.map → chunk-RQNZDTKT.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-PFKTGZKE.js.map → chunk-SY2AAZNB.js.map} +0 -0
- /package/dist/{chunk-DFZMKCVP.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-EDFJBX3V.js.map → chunk-U6MPB3K6.js.map} +0 -0
- /package/dist/{chunk-TZD3U2S5.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-NEVRLD77.js.map → chunk-VH5EGTH2.js.map} +0 -0
- /package/dist/{chunk-QEJTQTF5.js.map → chunk-W6T5HR3Z.js.map} +0 -0
- /package/dist/{chunk-H6WWEKEV.js.map → chunk-WCMG4HYI.js.map} +0 -0
- /package/dist/{chunk-GZLLDA6P.js.map → chunk-WEFN327U.js.map} +0 -0
- /package/dist/{chunk-VW3BBTMA.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-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-QILLL4JE.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-N7JKT4ZU.js.map → chunk-ZEIFJ6PX.js.map} +0 -0
- /package/dist/{chunk-VRGOOVDB.js.map → chunk-ZVVT72MT.js.map} +0 -0
- /package/dist/{model-policy-picker-menu-CURJ247L.js.map → computer-viewer-25AJIDYA.js.map} +0 -0
- /package/dist/{sandbox-files-4FBG3GS2.js.map → embedded-new-voice-RZZEJT6M.js.map} +0 -0
- /package/dist/{session-realtime-2XIB254N.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/{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/app/routes/session-unavailable.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\n\nimport { LoadingPanel, ProblemPanel } from \"../components/common\";\nimport { Button } from \"../../ui/button\";\nimport { CrossSlotDeepLinkRecovery } from \"../components/cross-slot-deep-link-recovery\";\nimport { useAppContext } from \"../app-context\";\nimport {\n authorizedSessionReadWorkspaceIds,\n canonicalSessionDeepLinkTarget,\n resolveAuthorizedSessionWorkspace,\n} from \"../lib/session-deep-link\";\nimport { workspaceSessionsPath } from \"../lib/routes\";\nimport { usePage } from \"../lib/navigation\";\n\nexport function SessionUnavailableRoute(props: { workspaceId: string; sessionId: string }) {\n const page = usePage();\n const context = useAppContext();\n const [state, setState] = useState<\"resolving\" | \"not-found\" | \"error\">(\"resolving\");\n const sessionWorkspaceIds = useMemo(\n () => authorizedSessionReadWorkspaceIds(context.accessContext, context.workspaces),\n [context.accessContext, context.workspaces],\n );\n const backWorkspaceId = sessionWorkspaceIds.includes(props.workspaceId)\n ? props.workspaceId\n : (sessionWorkspaceIds.find(\n (workspaceId) => workspaceId === context.accessContext.defaultWorkspaceId,\n ) ??\n sessionWorkspaceIds[0] ??\n null);\n\n useEffect(() => {\n let cancelled = false;\n setState(\"resolving\");\n void resolveAuthorizedSessionWorkspace(\n context.client,\n context.accessContext.workspaceGrants,\n props.sessionId,\n {\n authorizedWorkspaceIds: sessionWorkspaceIds,\n excludeWorkspaceId: props.workspaceId,\n },\n ).then((resolution) => {\n if (cancelled) return;\n if (resolution.status === \"resolved\") {\n page.assign(\n canonicalSessionDeepLinkTarget(\n resolution.workspaceId,\n props.sessionId,\n new URL(page.href()),\n ),\n { replace: true },\n );\n return;\n }\n setState(resolution.status === \"error\" ? \"error\" : \"not-found\");\n });\n return () => {\n cancelled = true;\n };\n }, [\n page,\n context.accessContext.workspaceGrants,\n context.client,\n sessionWorkspaceIds,\n props.sessionId,\n props.workspaceId,\n ]);\n\n if (state === \"resolving\") return <LoadingPanel label=\"Looking for this session\" />;\n const unavailable = (\n <ProblemPanel\n title={state === \"error\" ? \"Session unavailable\" : \"Session not found\"}\n description={\n state === \"error\"\n ? \"We couldn't verify another authorized workspace right now. Try again in a moment.\"\n : \"This session doesn't exist or isn't available in any workspace you can access.\"\n }\n action={\n backWorkspaceId ? (\n <Button asChild type=\"button\" variant=\"outline\">\n <a href={workspaceSessionsPath(backWorkspaceId)}>Back to sessions</a>\n </Button>\n ) : undefined\n }\n />\n );\n return state === \"not-found\" ? (\n <CrossSlotDeepLinkRecovery path={new URL(page.href()).pathname} fallback={unavailable} />\n ) : (\n unavailable\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,WAAW,SAAS,gBAAgB;AAoET;AAtD7B,SAAS,wBAAwB,OAAmD;AACzF,QAAM,OAAO,QAAQ;AACrB,QAAM,UAAU,cAAc;AAC9B,QAAM,CAAC,OAAO,QAAQ,IAAI,SAA8C,WAAW;AACnF,QAAM,sBAAsB;AAAA,IAC1B,MAAM,kCAAkC,QAAQ,eAAe,QAAQ,UAAU;AAAA,IACjF,CAAC,QAAQ,eAAe,QAAQ,UAAU;AAAA,EAC5C;AACA,QAAM,kBAAkB,oBAAoB,SAAS,MAAM,WAAW,IAClE,MAAM,cACL,oBAAoB;AAAA,IACnB,CAAC,gBAAgB,gBAAgB,QAAQ,cAAc;AAAA,EACzD,KACA,oBAAoB,CAAC,KACrB;AAEJ,YAAU,MAAM;AACd,QAAI,YAAY;AAChB,aAAS,WAAW;AACpB,SAAK;AAAA,MACH,QAAQ;AAAA,MACR,QAAQ,cAAc;AAAA,MACtB,MAAM;AAAA,MACN;AAAA,QACE,wBAAwB;AAAA,QACxB,oBAAoB,MAAM;AAAA,MAC5B;AAAA,IACF,EAAE,KAAK,CAAC,eAAe;AACrB,UAAI,UAAW;AACf,UAAI,WAAW,WAAW,YAAY;AACpC,aAAK;AAAA,UACH;AAAA,YACE,WAAW;AAAA,YACX,MAAM;AAAA,YACN,IAAI,IAAI,KAAK,KAAK,CAAC;AAAA,UACrB;AAAA,UACA,EAAE,SAAS,KAAK;AAAA,QAClB;AACA;AAAA,MACF;AACA,eAAS,WAAW,WAAW,UAAU,UAAU,WAAW;AAAA,IAChE,CAAC;AACD,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA,QAAQ,cAAc;AAAA,IACtB,QAAQ;AAAA,IACR;AAAA,IACA,MAAM;AAAA,IACN,MAAM;AAAA,EACR,CAAC;AAED,MAAI,UAAU,YAAa,QAAO,oBAAC,gBAAa,OAAM,4BAA2B;AACjF,QAAM,cACJ;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,UAAU,UAAU,wBAAwB;AAAA,MACnD,aACE,UAAU,UACN,sFACA;AAAA,MAEN,QACE,kBACE,oBAAC,UAAO,SAAO,MAAC,MAAK,UAAS,SAAQ,WACpC,8BAAC,OAAE,MAAM,sBAAsB,eAAe,GAAG,8BAAgB,GACnE,IACE;AAAA;AAAA,EAER;AAEF,SAAO,UAAU,cACf,oBAAC,6BAA0B,MAAM,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE,UAAU,UAAU,aAAa,IAEvF;AAEJ;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/app/routes/session.tsx"],"sourcesContent":["import { t } from \"../lib/console-text\";\nimport { Fragment } from \"react\";\nimport {\n createSessionRetainedScreenshotLoader,\n createWorkspaceRetainedArtifactLoader,\n createWorkspaceRetainedVideoLoader,\n} from \"../../timeline\";\nimport { isModelUnavailableSubmissionError } from \"../../lib/format\";\nimport { retainedImageId } from \"../../components/markdown\";\nimport { useConnectionAccounts } from \"../components/capabilities/use-connection-accounts\";\nimport { sessionAuthRecommendation } from \"../../session-auth-recommendation\";\nimport {\n attachSessionCapability,\n completeSessionCapabilityOAuth,\n} from \"../components/capabilities/attach-session-capability\";\nimport { loadSessionFeedback } from \"../../session-feedback-model\";\nimport { turnRatingsFromFeedback } from \"../../session-feedback-model\";\nimport { PersonalResourceAttachmentSurface } from \"../components/personal-resource-attachment-surface\";\nimport { useReadSessionInbox } from \"../lib/inbox\";\nimport { useWorkspaceMachines } from \"../lib/use-workspace-machines\";\nimport { getComposerSendBlocker } from \"../lib/composer-send-blocking\";\nimport { isEditableArtifactKind } from \"../lib/artifact-catalog\";\nimport type { NativeConnectRequest } from \"../components/capabilities/native-connect-setup\";\nimport { FailureRecoveryBoundary } from \"../components/session/failure-recovery-boundary\";\nimport { useMessageSenderRenderer } from \"../components/session/message-senders\";\nimport {\n createFailedSessionRetry,\n type FailedSessionRetryInput,\n} from \"../lib/failed-session-retry\";\nimport { useSessionStartupTimeline } from \"../../lib/session-startup-timeline\";\nimport { failedSessionCopy } from \"../lib/failed-session-copy\";\nimport { coveredModelChoice, creditRefusalGap, freeCreditGap } from \"../lib/free-credit-gap\";\nimport { isPaymentRequiredError } from \"../lib/model-access\";\nimport { timelineShowsFailure } from \"../lib/timeline-failure-owner\";\nimport { sessionDisplayTitle } from \"../lib/session-rename\";\nimport { useStreamHealthTelemetry } from \"../lib/stream-health\";\nimport { markIntegrationConnectRedirect } from \"../lib/integration-connect-redirect\";\nimport { noteTurnFailureAction } from \"../lib/turn-failure-actions\";\nimport { observeSessionTurnEvents } from \"../lib/analytics-observer\";\nimport { needsSandboxRecoveryCheck } from \"../lib/sandbox-failure\";\nimport {\n admissionRecheckControl,\n admissionControlNeedsRefresh,\n recheckSessionAdmission,\n SessionAdmissionNotice,\n} from \"../components/session/session-admission-notice\";\nimport {\n sessionAdmissionNeedsDifferentMachine,\n sessionAdmissionReason,\n} from \"../../session-admission-model\";\nimport {\n connectorSelectionUpdate,\n followWorkspaceConnectorPolicy,\n sessionConnectorPolicyIsCustomized,\n} from \"../lib/composer-connectors\";\n// The session view — live timeline plus one compact prompt queue above the\n// composer. Enter queues and Cmd/Ctrl+Enter steers; failed sessions stay\n// honest (reason + retry history) and revivable from the same composer.\nimport { LightboxProvider } from \"../../timeline\";\nimport { sessionAdmissionBlocked, sessionDisplayStatus } from \"../../session-status-model\";\nimport { useSessionSecrets } from \"../../hooks/use-vaults\";\nimport type { WorkspaceTab } from \"../../components/workspace-dock\";\nimport {\n SessionSecretsMenuBody,\n sessionSecretsSummary,\n} from \"../components/secrets/session-secrets-panel\";\nimport { MACHINES_SESSION_POLL_MS } from \"../../machines\";\nimport {\n ApprovalSurface,\n ToolActionReviewDetails,\n MessageTimeline,\n ToolReviewHistoryProvider,\n SessionChrome,\n KnowledgeActivityProvider,\n LearningRefusalActionsProvider,\n type LearningRefusalPlace,\n type TimelineSearchTarget,\n} from \"../../session-ui\";\nimport type { SessionSearchRoute } from \"../lib/session-search-route\";\nimport { OPEN_CONVERSATION_FIND_EVENT } from \"../lib/conversation-find-event\";\nimport {\n OPEN_SESSION_USAGE_LIMIT_EVENT,\n goalPausedAtUsageLimit,\n lineageHasRunningSession,\n sessionUsageLimitCapability,\n usageLimitRefusalFromState,\n useSessionUsageLimit,\n} from \"../lib/session-usage-limit\";\nimport { SessionUsageLimitNotice } from \"../../usage\";\nimport { isSessionUsageLimitSubmissionError } from \"../../lib/format\";\nimport { OpenGeniSessionUsageLimitReachedError } from \"@opengeni/sdk/browser\";\nimport { SESSION_USAGE_LIMIT_GOAL_PAUSED_REASON } from \"@opengeni/sdk/session-usage-limits\";\nimport { expireArtifactCatalog } from \"../lib/artifact-catalog-cache\";\nimport { useArtifactCatalogMutationInvalidation } from \"../lib/use-artifact-catalog-mutation-invalidation\";\nimport {\n creditExhaustedFromEvents,\n conversationTimeline,\n projectPendingApprovals,\n useComposer,\n useFileAttachments,\n useGoal,\n useHumanInputRequests,\n useSession,\n useSessionEvents,\n useSessionLineage,\n useTurnQueue,\n type AgentMessageItem,\n type AuthNeededItem,\n type PendingApproval,\n type OlderHistoryLoader,\n type TimelineItem,\n type UserMessageItem,\n} from \"../../session\";\nimport { sessionAgentsSignal } from \"../../session-agents-model\";\nimport { useNavigate, usePage, useRouterState } from \"../lib/navigation\";\nimport {\n BotIcon,\n BugIcon,\n Loader2Icon,\n MenuIcon,\n MessagesSquareIcon,\n PanelsTopLeftIcon,\n} from \"lucide-react\";\nimport {\n createElement,\n lazy,\n Suspense,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { toast } from \"../lib/toast\";\n\nimport { isApiErrorStatus, useAppApi } from \"../lib/app-api\";\nimport { apiErrorFacts, userErrorText } from \"../../ui/api-error\";\nimport { ConsoleComposer } from \"../components/Composer\";\nimport { CONSOLE_TIMELINE_ALLOWANCE_LABELS } from \"../lib/allowance-labels\";\nimport { WorkspaceComposerPlus as ComposerMobilePlus } from \"../components/workspace-composer-plus\";\nimport {\n SessionRunsOnMenuBody,\n SessionMachinePickerAction,\n useSessionRunsOn,\n} from \"../components/session/sandbox-switcher\";\nimport {\n currentSessionMachineAccess,\n SessionMachineAccessNotice,\n} from \"../components/session/session-machine-access-notice\";\nimport { LoadingPanel, ProblemPanel } from \"../components/common\";\nimport { useHostMessageContext } from \"../lib/app-host\";\nimport { useSessionUiFeature } from \"../lib/session-ui-features\";\nimport { useSessionOpening } from \"../lib/session-opening\";\nimport { creationHandoffReconciled } from \"../lib/session-creation-handoff\";\nimport { FollowUpRepositoryMenuBody } from \"../components/follow-up-repository-picker\";\nimport { MarkdownText } from \"../components/markdown\";\nimport { ModelPicker, type SessionToolSelection } from \"../components/pickers\";\nimport {\n TerminalSessionArchive,\n TerminalSessionBanner,\n UserMessageBody,\n} from \"../components/session/banners\";\nimport {\n ReadOnlySessionNotice,\n sessionReadOnlyArchive,\n} from \"../components/session/session-retention\";\nimport { useRail } from \"../components/rail/rail-context\";\nimport { sessionComputeLabel } from \"../../sandbox-label-model\";\nimport { useBackgroundAttentionTitle } from \"../lib/background-attention-title\";\nimport { ChatViewportFileDropTarget } from \"../components/session/chat-viewport-file-drop-target\";\nimport { SessionWorkspace } from \"../components/session/sandbox-workspace\";\nimport { ArtifactLinkBoundary } from \"../components/session/artifact-link-boundary\";\nimport { Button } from \"../../ui/button\";\nimport { EmptyState } from \"../../ui/empty-state\";\nimport { useAppContext } from \"../app-context\";\nimport { useBrowserAccountBridgeBlocker } from \"../lib/browser-account-bridge\";\nimport type { SessionArtifactSourceCache } from \"../lib/session-artifact-discovery\";\nimport type {\n SessionEditableArtifactSummary,\n SessionEditableArtifactsStatus,\n} from \"../components/session/editable-artifacts-workspace\";\nimport {\n normalizeProviderDomain,\n oauthConnectionOwnership,\n oauthConnectionRef,\n catalogConnectionAccountSelection,\n} from \"../lib/capabilities\";\nimport { startMcpOAuthWithTimeout } from \"../lib/mcp-oauth\";\nimport { useSessionRouteMemory } from \"../lib/last-session-memory\";\nimport { hasAccountPermission, hasWorkspacePermission } from \"../lib/permissions\";\nimport { secretSaveTargets } from \"../lib/secrets-ui\";\nimport { chatLearningScope } from \"../lib/chat-learning-scope\";\nimport { currentModelRecovery } from \"../lib/model-recovery\";\nimport { ModelRecoveryNotice } from \"../components/session/model-recovery-notice\";\nimport { isPersonalWorkspace } from \"../lib/managed-self-context\";\nimport {\n isTerminalSessionStatus,\n projectSessionTimeline,\n summarizeSessionFailure,\n} from \"../lib/events\";\nimport {\n EMPTY_COMPOSER_LAUNCH,\n composerLaunchSearchAfterPolicyApply,\n composerLaunchSearchKey,\n type ComposerLaunchSearch,\n} from \"../lib/composer-launch\";\nimport { connectableSubscriptions, isDeploymentFreeModel } from \"../lib/deployment-free-model\";\nimport {\n effortOptionsForModel,\n findPickerRow,\n runnableLatencyModesForModel,\n} from \"../lib/model-policy\";\nimport { sessionTimelineEmptyStateCopy } from \"../lib/session-empty-state\";\nimport {\n sessionModelMissingFromCatalog,\n unavailableModelName,\n unavailableModelReplacement,\n} from \"../lib/unavailable-session-model\";\nimport { UnavailableModelNotice } from \"../components/session/unavailable-model-notice\";\nimport {\n consumeSessionComposerFocusIntent,\n FOCUS_SESSION_COMPOSER_EVENT,\n focusSessionComposerWhenReady,\n sessionComposerFocusIntentIsEligible,\n type SessionComposerFocusIntent,\n} from \"../lib/session-focus\";\nimport {\n applySessionAttentionProjection,\n updateLocalSessionDeliveryAttention,\n notifySessionAttentionChanged,\n sessionAttentionReadThroughSequence,\n sessionReadProjectionKey,\n shouldAcknowledgeActiveSession,\n shouldProjectActiveSessionRead,\n} from \"../lib/session-attention\";\nimport {\n mergeSessionContextProjection,\n mergeSessionDetailReadProjection,\n} from \"../lib/session-pins\";\nimport {\n readSessionDockNavigation,\n sessionDockLayoutStorageId,\n updateSessionDockNavigation,\n} from \"../lib/session-dock-preferences\";\nimport { consoleLinkResolver } from \"../lib/session-artifact-navigation\";\nimport {\n clientFirstPartyMcpToolPolicy,\n firstPartySessionToolOptionsFor,\n sessionPolicyPickerIds,\n} from \"../lib/session-tools\";\nimport { resolveWorkspaceBusySend, stableJson } from \"@opengeni/contracts\";\nimport { useFollowUpRepositories } from \"../lib/use-follow-up-repositories\";\nimport type { ChatSendContext } from \"../components/capabilities/session-github-repositories\";\nimport { githubAppConnectRequest } from \"../lib/github-app-connect\";\nimport {\n clearGitHubInstallRequest,\n recordGitHubInstallRequest,\n} from \"../lib/github-install-request\";\nimport {\n useFixedRigScope,\n usePersonalResourceAttachment,\n} from \"../lib/use-personal-resource-attachment\";\nimport { personalMachineUseIntent } from \"../lib/personal-resource-attachments\";\nimport { isPersonalMachine, moveChatToMachine } from \"../lib/move-chat-to-machine\";\nimport type { MachineView } from \"../../machines\";\nimport { useWorkspaceModelCatalog } from \"../lib/use-workspace-model-catalog\";\nimport type {\n LineageNode,\n SessionRealtimeModel,\n UpdateSessionToolPolicyRequest,\n} from \"@opengeni/sdk\";\nimport type { ConnectionMetadata, Session, SessionEvent } from \"../types\";\nimport { useUiEventTarget } from \"../lib/ui-events\";\nimport { FORK_CURRENT_CHAT_EVENT } from \"../lib/actions/events\";\nimport { usePortalContainer } from \"../../ui/portal-container\";\n\nconst InlineChatArtifact = lazy(() =>\n import(\"../components/artifacts/retained-file-preview\").then((module) => ({\n default: module.InlineChatArtifact,\n })),\n);\nconst ChatInteractiveBlock = lazy(() =>\n import(\"../components/artifacts/chat-interactive-block\").then((module) => ({\n default: module.ChatInteractiveBlock,\n })),\n);\n\nconst HumanInputSurface = lazy(() => import(\"../components/session/human-input\"));\nconst SessionSkillReviews = lazy(() =>\n import(\"../components/session/session-skill-reviews\").then((module) => ({\n default: module.SessionSkillReviews,\n })),\n);\nconst SessionCommands = lazy(() =>\n import(\"../../session-ui\").then((module) => ({ default: module.SessionCommands })),\n);\n\nconst SessionCapabilityCard = lazy(async () => ({\n default: (await import(\"../components/capabilities/session-capability-card\"))\n .SessionCapabilityCard,\n}));\n\nconst NativeConnectSetup = lazy(() =>\n import(\"../components/capabilities/native-connect-setup\").then((module) => ({\n default: module.NativeConnectSetup,\n })),\n);\nconst LazySessionWaitStatus = lazy(() =>\n import(\"../components/session/session-wait-status\").then((module) => ({\n default: module.SessionWaitStatus,\n })),\n);\n\nconst MessageForkDialog = lazy(() =>\n import(\"../components/session/session-tenancy-control\").then((module) => ({\n default: module.SessionTenancyRouteControl,\n })),\n);\n\nconst MessageActions = lazy(() => import(\"../components/session/message-actions\"));\nconst ConversationFind = lazy(() => import(\"../components/session/conversation-find\"));\nconst EMPTY_SEARCH_TARGET: SessionSearchRoute = {};\n\nconst SubagentTree = lazy(() =>\n import(\"../components/session/subagents\").then((module) => ({ default: module.SubagentTree })),\n);\n\nconst LazyFailedSessionBanner = lazy(() =>\n import(\"../components/session/failed-session-banner\").then((module) => ({\n default: module.FailedSessionBanner,\n })),\n);\n\n// Only a refused Send shows it, so it stays out of the direct session bundle.\nconst LazyCreditRefusalNotice = lazy(() =>\n import(\"../components/credits/credit-refusal-notice\").then((module) => ({\n default: module.CreditRefusalNotice,\n })),\n);\n\nconst LazyAgentConfigurationPanel = lazy(() =>\n import(\"../components/session/agent-configuration-panel\").then(({ AgentConfigurationPanel }) => ({\n default: AgentConfigurationPanel,\n })),\n);\nconst LazySessionInspector = lazy(() =>\n import(\"../components/session/inspector\").then(({ SessionInspector }) => ({\n default: SessionInspector,\n })),\n);\n\nconst LazySessionEditableArtifactsWorkspace = lazy(() =>\n import(\"../components/session/editable-artifacts-workspace\").then(\n ({ SessionEditableArtifactsWorkspace }) => ({\n default: SessionEditableArtifactsWorkspace,\n }),\n ),\n);\n\nconst LazyCodexRealtimeControl = lazy(() =>\n import(\"../../realtime\").then(({ SessionRealtimeControl }) => ({\n default: SessionRealtimeControl,\n })),\n);\n\nconst LazySessionRouteAuxiliary = lazy(\n () => import(\"../components/session/session-tenancy-control\"),\n);\n\nexport function SessionRoute({\n workspaceId,\n sessionId,\n launch = EMPTY_COMPOSER_LAUNCH,\n realtimeAutostartModel,\n searchTarget = EMPTY_SEARCH_TARGET,\n}: {\n workspaceId: string;\n sessionId: string;\n launch?: ComposerLaunchSearch | undefined;\n realtimeAutostartModel?: SessionRealtimeModel | undefined;\n searchTarget?: SessionSearchRoute | undefined;\n}) {\n const uiEvents = useUiEventTarget(\"document\");\n const dockEnabled = useSessionUiFeature(\"dock\");\n useReadSessionInbox(sessionId);\n const context = useAppContext();\n const rail = useRail();\n const navigate = useNavigate();\n const page = usePage();\n const consumeRealtimeAutostart = useCallback(() => {\n void navigate({\n to: \"/workspaces/$workspaceId/sessions/$sessionId\",\n params: { workspaceId, sessionId },\n search: {},\n replace: true,\n });\n }, [navigate, sessionId, workspaceId]);\n // The session-search origin only labels the navigation that opened the find\n // bar. Drop it once the bar closes so a reload or shared link starts plain.\n const hasSearchOrigin = searchTarget.searchOrigin === \"session-search\";\n const consumeSearchOrigin = useCallback(() => {\n if (!hasSearchOrigin) return;\n void navigate({\n to: \"/workspaces/$workspaceId/sessions/$sessionId\",\n params: { workspaceId, sessionId },\n search: ({ searchOrigin: _searchOrigin, ...rest }) => rest,\n replace: true,\n });\n }, [hasSearchOrigin, navigate, sessionId, workspaceId]);\n\n // Session record + live event log via @opengeni/react. Fresh opens load a\n // bounded tail, then stream live events with resume-by-sequence.\n const {\n events,\n timeline: eventTimeline,\n sessionStatus,\n sessionStatusSequence,\n connectionState,\n initialLoading,\n initialHistoryReady,\n hasOlder,\n loadingOlder,\n loadOlder,\n hasNewer,\n loadingNewer,\n loadNewer,\n loadingOldest,\n loadOldest,\n jumpToLatest,\n jumpToSequence,\n error: streamError,\n } = useSessionEvents(sessionId);\n // Consented funnel telemetry: a session this page started reached its first\n // completed turn. Only event types are inspected.\n useEffect(() => observeSessionTurnEvents(sessionId, events), [events, sessionId]);\n const sessionDetailReadOwner = useRef<object>({});\n const beginSessionDetailRead = useCallback(\n () =>\n context.sessionChannelProjectionAuthority.beginDetailRead(sessionDetailReadOwner.current, {\n id: sessionId,\n workspaceId,\n }),\n [context.sessionChannelProjectionAuthority, sessionId, workspaceId],\n );\n const {\n session: fetchedSession,\n error: loadError,\n readRevision: sessionReadRevision,\n readGeneration: sessionReadGeneration,\n refresh: refreshSession,\n } = useSession(sessionId, {\n events,\n beginRead: beginSessionDetailRead,\n });\n // \"Back to sessions\" from Settings reopens this session (see last-session-memory).\n const restoredSessionId = useRouterState({\n select: (state) => state.location.state.restoredSessionId,\n });\n const leaveRestoredSession = useCallback(() => {\n void navigate({\n to: \"/workspaces/$workspaceId/sessions\",\n params: { workspaceId },\n replace: true,\n });\n }, [navigate, workspaceId]);\n const leavingRestoredSession = useSessionRouteMemory({\n subjectId: context.accessContext.subjectId,\n workspaceId,\n sessionId,\n openedSessionId: fetchedSession?.id ?? null,\n loadError,\n restoredSessionId,\n leave: leaveRestoredSession,\n });\n useEffect(\n () => () =>\n context.sessionChannelProjectionAuthority.finishDetailReads(sessionDetailReadOwner.current),\n [context.sessionChannelProjectionAuthority, sessionId, workspaceId],\n );\n useEffect(() => {\n if (loadError) {\n context.sessionChannelProjectionAuthority.finishDetailReads(sessionDetailReadOwner.current);\n }\n }, [context.sessionChannelProjectionAuthority, loadError]);\n const creationHandoff =\n context.sessionCreationHandoff?.session.id === sessionId && context.session?.id === sessionId\n ? context.sessionCreationHandoff\n : null;\n const pendingCreationHandoff = creationHandoffReconciled(creationHandoff, events)\n ? null\n : creationHandoff;\n // Queue + goal share the timeline's event stream — one SSE connection total.\n const queue = useTurnQueue(sessionId, { events });\n const goal = useGoal(sessionId, { events });\n const humanInput = useHumanInputRequests(sessionId, { events });\n const sessionSeed = fetchedSession ?? creationHandoff?.session ?? null;\n const session = useMemo(\n () =>\n sessionSeed\n ? {\n ...sessionSeed,\n // Old idle events must not overwrite a fresh queued/claimed detail read.\n status:\n (sessionStatusSequence ?? 0) > sessionSeed.lastSequence\n ? (sessionStatus ?? sessionSeed.status)\n : sessionSeed.status,\n effectiveControl: queue.effectiveControl ?? sessionSeed.effectiveControl,\n }\n : null,\n [queue.effectiveControl, sessionSeed, sessionStatus, sessionStatusSequence],\n );\n // Background-tab cue: mark the title when this open session settles for the user.\n useBackgroundAttentionTitle(sessionId, session?.status ?? null);\n // Dispatch retries update their durable ledger without timeline events. Read\n // that evidence only while this visible session is queued, with no overlapping\n // requests, so a moving retry schedule cannot masquerade as active execution.\n const waitingForDispatch =\n session?.status === \"queued\" &&\n session.activeTurnId === null &&\n session.effectiveControl.state === \"active\";\n useEffect(() => {\n if (!waitingForDispatch) return;\n let stopped = false;\n let timer: ReturnType<typeof setTimeout>;\n const refresh = async () => {\n try {\n if (document.visibilityState === \"visible\") await refreshSession();\n } finally {\n if (!stopped) timer = setTimeout(() => void refresh(), 15_000);\n }\n };\n timer = setTimeout(() => void refresh(), 15_000);\n return () => {\n stopped = true;\n clearTimeout(timer);\n };\n }, [waitingForDispatch, sessionId, refreshSession]);\n // /clear-view: a LOCAL, this-device-only collapse of the transcript. It hides\n // every event at or before the sequence seen when the operator ran it; the\n // server log is untouched and newer events (higher sequence) keep streaming\n // in. Reset when the session identity changes so a new session starts clean.\n // null = never cleared (distinct from \"cleared at sequence 0\"): clearing an\n // empty stream still latches, so the initial-message fallback is suppressed\n // and any later events stay hidden up to the cleared sequence.\n const [viewClearedAfter, setViewClearedAfter] = useState<number | null>(null);\n useEffect(() => {\n setViewClearedAfter(null);\n }, [sessionId]);\n const clearView = useCallback(() => {\n const latestSequence = events.reduce((max, event) => Math.max(max, event.sequence), 0);\n setViewClearedAfter(latestSequence);\n }, [events]);\n const visibleEvents = useMemo(\n () =>\n viewClearedAfter !== null\n ? events.filter((event) => event.sequence > viewClearedAfter)\n : events,\n [events, viewClearedAfter],\n );\n const { opened, hasObservedHistory } = useSessionOpening(\n `${workspaceId}:${sessionId}`,\n Boolean(session && (initialHistoryReady || pendingCreationHandoff)),\n events.length > 0,\n );\n const timeline = useMemo(() => {\n if (!session) {\n return [];\n }\n // While the tail window is still being fetched, render nothing rather than\n // projectSessionTimeline's initial-message fallback — on a large session\n // that fallback painted the GENESIS message at the top for the whole fetch\n // (user-reported). The fallback is only for genuinely-empty NEW sessions,\n // i.e. after the load settles with no events. Once real history was seen,\n // clearing the window for a reload (including failure) is never genesis.\n if (\n (!opened || initialLoading || hasObservedHistory) &&\n visibleEvents.length === 0 &&\n !pendingCreationHandoff\n ) {\n return [];\n }\n const projected = projectSessionTimeline(\n session,\n visibleEvents,\n pendingCreationHandoff?.clientEventId,\n viewClearedAfter === null ? eventTimeline : undefined,\n );\n // projectSessionTimeline falls back to the session's initial message when\n // the projection is empty; after a clear-view that fallback would resurrect\n // the very first message, so suppress it once the view has been cleared.\n return viewClearedAfter !== null && visibleEvents.length === 0 ? [] : projected;\n }, [\n pendingCreationHandoff,\n session,\n visibleEvents,\n viewClearedAfter,\n opened,\n initialLoading,\n hasObservedHistory,\n eventTimeline,\n ]);\n // Only approvals still awaiting a decision: the durable log replays every\n // historical `session.requiresAction`, so subtract decisions and finished\n // turns instead of rendering decided approvals as live buttons forever.\n const approvals = useMemo(() => projectPendingApprovals(events), [events]);\n // Credit death is sneaky: the engine can end the turn as a NOMINALLY\n // completed one (segmentLimit budget_exhausted), leaving the session idle and\n // healthy-looking. Track the terminal credit state from the last turn-end so\n // the banner shows for idle-but-broke sessions too, not only failed ones.\n const creditExhausted = useMemo(() => creditExhaustedFromEvents(events), [events]);\n const failure = useMemo(\n () =>\n session && (session.status === \"failed\" || creditExhausted)\n ? summarizeSessionFailure(\n events,\n session.status,\n session.failureDiagnostics,\n session.lastSequence,\n )\n : null,\n [events, session, creditExhausted],\n );\n\n // Keep the workspace header (title, status badge, connection pill) in sync.\n const {\n client,\n captureWorkspaceInvocation,\n ownsWorkspaceInvocation,\n setSession: setContextSession,\n setConnectionState: setContextConnectionState,\n sessionEventFeedStore,\n } = context;\n const acknowledgedProjectionRef = useRef<string | null>(null);\n const confirmedProjectionRef = useRef<string | null>(null);\n const retriedProjectionRef = useRef<string | null>(null);\n const [foreground, setForeground] = useState(() => ({\n documentVisible: document.visibilityState === \"visible\",\n windowFocused: document.hasFocus(),\n }));\n const [attentionRetryRevision, setAttentionRetryRevision] = useState(0);\n const reconciledSessionRead = useRef<{\n sessionId: string;\n revision: number;\n } | null>(null);\n useEffect(() => {\n if (!fetchedSession || sessionReadRevision === 0) return;\n if (\n reconciledSessionRead.current?.sessionId === sessionId &&\n reconciledSessionRead.current.revision === sessionReadRevision\n ) {\n return;\n }\n reconciledSessionRead.current = {\n sessionId,\n revision: sessionReadRevision,\n };\n const accepted = context.sessionChannelProjectionAuthority.recordRead(\n fetchedSession,\n sessionReadGeneration,\n );\n setContextSession((current) =>\n mergeSessionDetailReadProjection(\n current,\n fetchedSession,\n context.sessionChannelProjectionAuthority,\n sessionReadGeneration,\n accepted,\n ),\n );\n }, [\n context.sessionChannelProjectionAuthority,\n fetchedSession,\n sessionId,\n sessionReadGeneration,\n sessionReadRevision,\n setContextSession,\n ]);\n useEffect(() => {\n setContextSession((current) =>\n mergeSessionContextProjection(\n current,\n session,\n context.sessionChannelProjectionAuthority,\n \"live\",\n ),\n );\n }, [context.sessionChannelProjectionAuthority, session, setContextSession]);\n useEffect(() => {\n const reconcileForeground = () => {\n setForeground({\n documentVisible: document.visibilityState === \"visible\",\n windowFocused: document.hasFocus(),\n });\n };\n window.addEventListener(\"focus\", reconcileForeground);\n window.addEventListener(\"blur\", reconcileForeground);\n document.addEventListener(\"visibilitychange\", reconcileForeground);\n return () => {\n window.removeEventListener(\"focus\", reconcileForeground);\n window.removeEventListener(\"blur\", reconcileForeground);\n document.removeEventListener(\"visibilitychange\", reconcileForeground);\n };\n }, []);\n const projectSessionAttention = useCallback(\n (projection: Parameters<typeof notifySessionAttentionChanged>[0]) => {\n notifySessionAttentionChanged(projection);\n setContextSession((current) =>\n current?.id === projection.id\n ? applySessionAttentionProjection(current, projection)\n : current,\n );\n },\n [setContextSession],\n );\n // Raw token/progress batches do not create unread attention. Acknowledge\n // completed output or an actionable boundary, rather than every stream flush.\n const attentionThroughSequence = useMemo(\n () => sessionAttentionReadThroughSequence(events),\n [events],\n );\n const readThroughSequence = Math.max(session?.lastSequence ?? 0, attentionThroughSequence);\n const activeReadProjectionKey = session\n ? sessionReadProjectionKey(session.id, readThroughSequence)\n : null;\n const routeUnreadProjection = useMemo(\n () =>\n session\n ? {\n ...session,\n unread: session.unread || readThroughSequence > session.lastSequence,\n }\n : null,\n [readThroughSequence, session],\n );\n useLayoutEffect(() => {\n if (!session || !activeReadProjectionKey) return;\n if (\n confirmedProjectionRef.current === activeReadProjectionKey ||\n !shouldProjectActiveSessionRead({\n activeSessionId: sessionId,\n workspaceId,\n session: routeUnreadProjection,\n ...foreground,\n })\n ) {\n return;\n }\n\n const optimisticProjection = {\n id: session.id,\n workspaceId: session.workspaceId,\n unread: false,\n ...(session.attentionVersion !== undefined\n ? { attentionVersion: session.attentionVersion }\n : {}),\n lastSequence: readThroughSequence,\n };\n projectSessionAttention(optimisticProjection);\n }, [\n activeReadProjectionKey,\n foreground,\n projectSessionAttention,\n readThroughSequence,\n routeUnreadProjection,\n session,\n sessionId,\n workspaceId,\n ]);\n const acknowledgementSessionId = session?.id ?? null;\n const acknowledgementEligible = shouldAcknowledgeActiveSession({\n activeSessionId: sessionId,\n workspaceId,\n session: routeUnreadProjection,\n ...foreground,\n });\n // Same-value list/focus projections must not invalidate an in-flight retry.\n useEffect(() => {\n const projectionKey = activeReadProjectionKey;\n if (\n !acknowledgementSessionId ||\n !projectionKey ||\n acknowledgedProjectionRef.current === projectionKey ||\n !acknowledgementEligible\n ) {\n return;\n }\n let active = true;\n const acceptedTransition = captureWorkspaceInvocation(workspaceId);\n if (!acceptedTransition) return;\n acknowledgedProjectionRef.current = projectionKey;\n void client\n .updateSessionAttention(workspaceId, acknowledgementSessionId, {\n unread: false,\n acknowledgedThroughSequence: readThroughSequence,\n })\n .then((updated) => {\n if (!ownsWorkspaceInvocation(workspaceId, acceptedTransition)) return;\n confirmedProjectionRef.current = projectionKey;\n // The rail owns separately polled page objects. Keep this exact\n // frontier result there so a stale list poll cannot resurrect or\n // prematurely clear the unread dot.\n projectSessionAttention(updated);\n })\n .catch(() => {\n // Retry one transient failure for this exact frontier. Keeping the\n // receipt after the second failure prevents a permanent 4xx/5xx from\n // becoming an unbounded request and log loop.\n if (\n active &&\n ownsWorkspaceInvocation(workspaceId, acceptedTransition) &&\n acknowledgedProjectionRef.current === projectionKey &&\n retriedProjectionRef.current !== projectionKey\n ) {\n retriedProjectionRef.current = projectionKey;\n acknowledgedProjectionRef.current = null;\n setAttentionRetryRevision((revision) => revision + 1);\n return;\n }\n // A transient failure must never resurrect a dot the user already\n // cleared. Release the attempt receipt so a later focus/navigation\n // can retry this exact frontier; a reload still reads durable truth\n // if both attempts failed.\n if (acknowledgedProjectionRef.current === projectionKey) {\n acknowledgedProjectionRef.current = null;\n }\n });\n return () => {\n active = false;\n };\n }, [\n acknowledgementEligible,\n acknowledgementSessionId,\n attentionRetryRevision,\n activeReadProjectionKey,\n captureWorkspaceInvocation,\n client,\n ownsWorkspaceInvocation,\n projectSessionAttention,\n readThroughSequence,\n workspaceId,\n ]);\n useEffect(() => {\n setContextConnectionState(connectionState);\n }, [connectionState, setContextConnectionState]);\n // Content-free operational signal; see lib/stream-health.ts.\n useStreamHealthTelemetry(\"session\", connectionState);\n useEffect(() => {\n sessionEventFeedStore.set({ sessionId, events });\n }, [events, sessionId, sessionEventFeedStore]);\n useEffect(\n () => () => {\n setContextSession(null);\n setContextConnectionState(\"idle\");\n if (sessionEventFeedStore.getSnapshot()?.sessionId === sessionId) {\n sessionEventFeedStore.set(null);\n }\n },\n [sessionId, sessionEventFeedStore, setContextConnectionState, setContextSession],\n );\n useEffect(() => {\n if (streamError && !isApiErrorStatus(streamError, 404)) {\n toast.error(\"Event stream disconnected\", {\n description: streamError.message,\n });\n }\n }, [streamError]);\n useEffect(() => {\n if (loadError && !isApiErrorStatus(loadError, 404)) {\n toast.error(\"Failed to load session\", { description: String(loadError) });\n }\n }, [loadError]);\n // A reconnect OAuth round-trip lands back here (the reconnect card set\n // returnPath to this session). The connection is refreshed server-side, but\n // the original tool call was settled as an error and is never replayed. Strip\n // the params and tell the user to start a new turn.\n const oauthReturnHandled = useRef(false);\n const capabilityClient = context.client;\n const capabilityCatalog = context.workspaceCapabilityCatalog;\n const capabilityCatalogReady = context.workspaceMcpCatalogReady;\n const refreshCapabilityCatalog = context.refreshWorkspaceMcpServers;\n useEffect(() => {\n if (oauthReturnHandled.current || !capabilityCatalogReady) {\n return;\n }\n const params = page.readQuery();\n const outcome = params.get(\"integration_oauth\");\n if (!outcome) {\n return;\n }\n oauthReturnHandled.current = true;\n page.replaceQuery(new URLSearchParams());\n const capabilityId = params.get(\"capability_auth\");\n if (outcome !== \"success\") {\n // The failure copy loads only on this path, keeping it out of the route.\n void import(\"../lib/oauth-callback-messages\").then(({ mcpOAuthCallbackFailureMessage }) =>\n toast.error(\"Reconnect failed\", {\n description: mcpOAuthCallbackFailureMessage(params.get(\"stage\"), params.get(\"reason\")),\n }),\n );\n return;\n }\n if (!capabilityId) {\n toast.success(\"Connection restored\", {\n description: \"The earlier tool call wasn't replayed. Send a new message to try again.\",\n });\n return;\n }\n void (async () => {\n const item = capabilityCatalog.find((candidate) => candidate.id === capabilityId);\n const connectionId = params.get(\"connectionId\");\n const providerDomain = params.get(\"providerDomain\");\n const ownership = oauthConnectionOwnership(params.get(\"ownership\"));\n if (!item || item.kind !== \"mcp\" || !connectionId || !providerDomain || !ownership) {\n throw new Error(\"The authorized capability could not be resolved from the live catalog.\");\n }\n await capabilityClient.enableCapability(workspaceId, item.id, {\n connectionRef: oauthConnectionRef(\n ownership,\n connectionId,\n providerDomain,\n catalogConnectionAccountSelection(item),\n ),\n });\n await refreshCapabilityCatalog(workspaceId);\n const connected = (await capabilityClient.listCapabilities(workspaceId)).items.find(\n (candidate) => candidate.id === item.id,\n );\n if (!connected?.enabled)\n throw new Error(\n \"The connection was authorized, but enabling its tools could not be verified.\",\n );\n if (connected.connectionRef?.subjectScope === \"subject\") {\n toast.success(`${item.name} connected`, {\n description:\n \"Review its connection card to allow your personal account in this conversation.\",\n });\n return;\n }\n await attachSessionCapability(t, capabilityClient, workspaceId, sessionId, connected);\n toast.success(`${item.name} connected`, {\n description: \"It is available to new tool calls in this session.\",\n });\n })().catch((error) => {\n toast.error(\"Connection succeeded, but setup needs attention\", {\n description: userErrorText(error),\n });\n });\n }, [\n page,\n capabilityCatalog,\n capabilityCatalogReady,\n capabilityClient,\n refreshCapabilityCatalog,\n workspaceId,\n sessionId,\n ]);\n\n const nativeReturnHandled = useRef(false);\n useEffect(() => {\n if (nativeReturnHandled.current || !capabilityCatalogReady) return;\n const params = page.readQuery();\n const social = params.get(\"social_oauth\");\n const fiken = params.get(\"fiken\");\n if (!social && !fiken) return;\n nativeReturnHandled.current = true;\n page.replaceQuery(new URLSearchParams());\n if (social === \"success\" || fiken === \"connected\") {\n const capabilityId = params.get(\"capability_auth\");\n void (async () => {\n await refreshCapabilityCatalog(workspaceId);\n await completeSessionCapabilityOAuth(\n t,\n capabilityClient,\n workspaceId,\n sessionId,\n capabilityId,\n );\n toast.success(\"Connection setup completed\", {\n description: \"It is available to new tool calls in this session.\",\n });\n })().catch((error) =>\n toast.error(\"Connection authorized, but setup needs attention\", {\n description: userErrorText(error),\n }),\n );\n } else {\n toast.error(\"Connection wasn't completed\", {\n description: \"You can retry from the connection card.\",\n });\n }\n }, [\n page,\n capabilityCatalogReady,\n capabilityClient,\n refreshCapabilityCatalog,\n workspaceId,\n sessionId,\n ]);\n\n const githubReturnHandled = useRef(false);\n useEffect(() => {\n if (githubReturnHandled.current) return;\n const params = page.readQuery();\n const outcome = params.get(\"github\");\n if (outcome !== \"connected\" && outcome !== \"requested\") return;\n githubReturnHandled.current = true;\n page.replaceQuery(new URLSearchParams());\n if (outcome === \"requested\") {\n // A non-owner asked their GitHub organization owners to approve the app.\n recordGitHubInstallRequest(workspaceId);\n toast.success(\"Request sent to your GitHub organization owners\", {\n description:\n \"After an owner approves, an owner of the organization connects it here. Your GitHub card updates on its own.\",\n });\n return;\n }\n clearGitHubInstallRequest(workspaceId);\n toast.success(\"GitHub connected\", {\n description: \"Repository access is now available to new tool calls in this session.\",\n });\n }, [page, workspaceId]);\n\n // Start the recovery flow for a lapsed connection surfaced inline in the\n // timeline. OAuth connections reconnect in place (reuse the connectionId) and\n // return to this session; api-key ones can't OAuth, so hand off to credential\n // re-entry on the capabilities sheet for that provider. Throwing bubbles a\n // calm inline error on the reconnect card.\n const reconnectTransport = useMemo(() => context.client.connectTransport(), [context.client]);\n const [reconnectRequest, setReconnectRequest] = useState<NativeConnectRequest | null>(null);\n // Workspace GitHub App setup from the follow-up repository menu uses this\n // route-level Connect dialog: the menu closes when GitHub's authorization\n // popup takes focus, which would unmount a dialog hosted inside it.\n const connectGitHubApp = useCallback(\n () =>\n setReconnectRequest(githubAppConnectRequest(workspaceId, reconnectTransport, page.href())),\n [page, reconnectTransport, workspaceId],\n );\n const onReconnect = useCallback(\n async (item: AuthNeededItem) => {\n if (item.authoritySource === \"host\") {\n if (!item.authorizationUrl) {\n throw new Error(\n \"This connection is managed by the embedding host and has no recovery link.\",\n );\n }\n page.assign(item.authorizationUrl);\n return;\n }\n if (item.connectionId) {\n const { findConnectRecoveryAccount } = await import(\"@opengeni/connect\");\n const account = findConnectRecoveryAccount(\n await reconnectTransport.accounts(workspaceId),\n item.connectionId,\n );\n if (account) {\n setReconnectRequest({\n scope: { workspaceId, transport: reconnectTransport },\n providerId: account.providerId,\n ownership: account.ownership,\n reconnectAccountId: account.id,\n displayName: account.label,\n returnUrl: page.href(),\n idempotencyKey: crypto.randomUUID(),\n });\n return;\n }\n }\n if (item.capability) {\n const returnPath = `${new URL(page.href()).pathname}?capability_auth=${encodeURIComponent(item.capability.id)}`;\n if (item.capability.id === \"api:github-app\") {\n const status = await context.client.getGitHubApp(workspaceId, {\n returnPath,\n });\n if (status.status === \"bound\") {\n toast.success(\"GitHub is already connected\");\n return;\n }\n if (!status.linkUrl) {\n throw new Error(\n status.configured\n ? \"Your account cannot manage this workspace's GitHub connection.\"\n : \"GitHub is not configured on this deployment.\",\n );\n }\n await markIntegrationConnectRedirect(\"github\", \"app_install\");\n page.assign(status.linkUrl);\n return;\n }\n if (item.capability.id === \"mcp:codex_apps\") {\n page.assign(`/workspaces/${encodeURIComponent(workspaceId)}/settings`);\n return;\n }\n const catalogItem = context.workspaceCapabilityCatalog.find(\n (candidate) => candidate.id === item.capability?.id,\n );\n const canInstall =\n hasWorkspacePermission(context.accessContext, workspaceId, \"workspace:admin\") &&\n hasWorkspacePermission(context.accessContext, workspaceId, \"connections:write\");\n const mcpUrl = catalogItem?.mcpUrl ?? catalogItem?.endpointUrl ?? null;\n if (\n canInstall &&\n catalogItem?.kind === \"mcp\" &&\n catalogItem.authKind === \"oauth2\" &&\n mcpUrl\n ) {\n const response = await startMcpOAuthWithTimeout(context.client, workspaceId, {\n mcpUrl,\n ...(catalogItem.providerDomain ? { providerDomain: catalogItem.providerDomain } : {}),\n ownership: \"workspace\",\n returnPath,\n });\n if (!response.authorizationUrl) {\n throw new Error(\"The provider did not return an authorization link.\");\n }\n await markIntegrationConnectRedirect({ domain: mcpUrl }, \"oauth\");\n page.assign(response.authorizationUrl);\n return;\n }\n page.assign(\n `/workspaces/${encodeURIComponent(workspaceId)}/capabilities?suggested_capability=${encodeURIComponent(item.capability.id)}`,\n );\n return;\n }\n if (item.serverId === \"codex_apps\") {\n // Codex Apps is authorized by the designated workspace subscription,\n // not by the generic connection broker. Send the user to the existing\n // Codex subscription control instead of starting a meaningless OAuth\n // flow for chatgpt.com.\n page.assign(`/workspaces/${encodeURIComponent(workspaceId)}/settings`);\n return;\n }\n const connections = await context.client\n .listConnections(workspaceId)\n .catch(() => [] as ConnectionMetadata[]);\n const connection = item.connectionId\n ? (connections.find((candidate) => candidate.id === item.connectionId) ?? null)\n : null;\n if (connection?.kind === \"api_key\") {\n page.assign(\n `/workspaces/${encodeURIComponent(workspaceId)}/capabilities?reconnect_domain=${encodeURIComponent(item.providerDomain)}`,\n );\n return;\n }\n const pageUrl = new URL(page.href());\n const returnPath = `${pageUrl.pathname}${pageUrl.search}`;\n const response = await context.client.startConnectionOAuth(workspaceId, {\n providerDomain: item.providerDomain,\n ...(item.connectionId ? { connectionId: item.connectionId } : {}),\n ...(item.resource ? { resource: item.resource } : {}),\n returnPath,\n });\n if (!response.authorizationUrl) {\n throw new Error(\"The provider did not return an authorization link.\");\n }\n await markIntegrationConnectRedirect({ domain: item.providerDomain }, \"oauth\");\n page.assign(response.authorizationUrl);\n },\n [\n page,\n context.accessContext,\n context.client,\n context.workspaceCapabilityCatalog,\n workspaceId,\n reconnectTransport,\n ],\n );\n\n // The workspace shell already needs the capability catalog for session tool\n // policy. Reuse that authoritative read for timeline logos instead of\n // downloading the same large catalog again from the session route.\n const providerLogos = useMemo(() => {\n const logos = new Map<string, string>();\n for (const capability of context.workspaceCapabilityCatalog) {\n const domain = capability.providerDomain ?? capability.connectionRef?.providerDomain ?? null;\n const url = context.client.catalogAssetUrl(capability.logoAssetPath);\n if (domain && url) {\n const key = normalizeProviderDomain(domain);\n if (!logos.has(key)) logos.set(key, url);\n }\n }\n return logos;\n }, [context.client, context.workspaceCapabilityCatalog]);\n const resolveProviderLogo = useCallback(\n (domain: string) => providerLogos.get(normalizeProviderDomain(domain)) ?? null,\n [providerLogos],\n );\n // One lineage read feeds the single composer-anchored agents surface. Events\n // refresh it instantly on spawn/worker-completion, and a 30s poll ensures the pill's\n // \"running\" count doesn't go stale on CHILD-side status changes that emit no\n // event on this parent's feed. Must sit above the loading/error early-returns\n // — it's a hook, so it has to run unconditionally on every render.\n const lineage = useSessionLineage(sessionId, {\n events,\n pollIntervalMs: 30_000,\n });\n const agentNodes = lineage.lineage?.children ?? [];\n // The same lineage read names the agents the timeline spawns, messages, and\n // hears from (parent and descendants), following renames.\n const lineageTitles = useMemo(() => {\n const titles = new Map<string, string>();\n for (const ancestor of lineage.lineage?.ancestors ?? []) {\n titles.set(ancestor.id, sessionDisplayTitle(ancestor));\n }\n const visit = (nodes: readonly LineageNode[]) => {\n for (const node of nodes) {\n titles.set(node.session.id, sessionDisplayTitle(node.session));\n visit(node.children);\n }\n };\n visit(lineage.lineage?.children ?? []);\n return titles;\n }, [lineage.lineage]);\n const resolveSessionTitle = useCallback(\n (agentSessionId: string) => lineageTitles.get(agentSessionId) ?? null,\n [lineageTitles],\n );\n const sandboxFileRequestSeq = useRef(0);\n const [sandboxFileRequest, setSandboxFileRequest] = useState<{\n path: string;\n line?: number | undefined;\n requestId: number;\n } | null>(null);\n useEffect(() => {\n setSandboxFileRequest(null);\n }, [sessionId]);\n const setInspectorOpen = context.setInspectorOpen;\n // Composer + > Chat settings opens the dock's Agent tab at its Agent learning;\n // the header menu and the usage limit notice open it at Usage limit.\n const agentSettingsRequestSeq = useRef(0);\n const [agentSettingsRequest, setAgentSettingsRequest] = useState<{\n sessionId: string;\n requestId: number;\n target: \"learning\" | \"usage-limit\";\n } | null>(null);\n const openAgentSettings = useCallback(() => {\n setAgentSettingsRequest({\n sessionId,\n requestId: ++agentSettingsRequestSeq.current,\n target: \"learning\",\n });\n setInspectorOpen(true);\n }, [sessionId, setInspectorOpen]);\n const openUsageLimit = useCallback(() => {\n setAgentSettingsRequest({\n sessionId,\n requestId: ++agentSettingsRequestSeq.current,\n target: \"usage-limit\",\n });\n setInspectorOpen(true);\n }, [sessionId, setInspectorOpen]);\n useEffect(() => {\n uiEvents.addEventListener(OPEN_SESSION_USAGE_LIMIT_EVENT, openUsageLimit);\n return () => uiEvents.removeEventListener(OPEN_SESSION_USAGE_LIMIT_EVENT, openUsageLimit);\n }, [openUsageLimit, uiEvents]);\n const openSandboxFile = useCallback(\n (path: string, line?: number) => {\n setSandboxFileRequest({\n path,\n line,\n requestId: ++sandboxFileRequestSeq.current,\n });\n setInspectorOpen(true);\n },\n [setInspectorOpen],\n );\n\n // Keep the same pending canvas through detail and the first history read.\n // A freshly sent creation handoff already has visible conversation truth.\n // Never paint the genesis message or mount a second loading treatment first.\n if (!session || !opened) {\n if (leavingRestoredSession) return <LoadingPanel />;\n if (!session && loadError) {\n return (\n <Suspense fallback={<LoadingPanel />}>\n <LazySessionRouteAuxiliary\n workspaceId={workspaceId}\n sessionId={sessionId}\n loadError={loadError}\n />\n </Suspense>\n );\n }\n return (\n <div className=\"flex min-h-0 w-full min-w-0 flex-1 overflow-hidden\">\n <SessionDock\n workspaceId={workspaceId}\n sessionId={sessionId}\n session={null}\n events={events}\n connectionState={connectionState}\n primary={\n session && streamError && !initialLoading ? (\n <ProblemPanel\n title=\"Conversation couldn't be loaded\"\n description=\"Your saved messages are unchanged. Try loading them again.\"\n action={\n <Button variant=\"outline\" onClick={() => void jumpToLatest()}>\n Retry conversation\n </Button>\n }\n />\n ) : (\n <LoadingPanel />\n )\n }\n onReloadSession={refreshSession}\n dockCollapsed={!context.inspectorOpen}\n onDockCollapsedChange={(collapsed) => context.setInspectorOpen(!collapsed)}\n openFileRequest={sandboxFileRequest}\n onOpenNavigation={() => {\n context.setInspectorOpen(false);\n rail.setDrawerOpen(true);\n }}\n />\n </div>\n );\n }\n\n const chatPane = (\n <SessionChatPane\n key={session.id}\n session={session}\n admissionSessionControl={sessionSeed?.effectiveControl ?? session.effectiveControl}\n events={events}\n timeline={timeline}\n searchTarget={searchTarget}\n onJumpToSequence={jumpToSequence}\n initialLoading={initialLoading}\n historyReloadFailed={hasObservedHistory && events.length === 0 && !!streamError}\n launch={launch}\n realtimeAutostartModel={realtimeAutostartModel}\n onRealtimeAutostartConsumed={consumeRealtimeAutostart}\n onSearchOriginConsumed={consumeSearchOrigin}\n approvals={approvals}\n humanInput={humanInput}\n failure={failure}\n creditExhausted={creditExhausted}\n goal={goal}\n queue={queue}\n agentNodes={agentNodes}\n hasOlder={hasOlder}\n loadingOlder={loadingOlder}\n onLoadOlder={loadOlder}\n hasNewer={hasNewer}\n loadingNewer={loadingNewer}\n onLoadNewer={loadNewer}\n loadingOldest={loadingOldest}\n onJumpToStart={loadOldest}\n onJumpToLatest={jumpToLatest}\n onClearView={clearView}\n resolveSessionTitle={resolveSessionTitle}\n onOpenSession={(nextSessionId) =>\n void navigate({\n to: \"/workspaces/$workspaceId/sessions/$sessionId\",\n params: { workspaceId, sessionId: nextSessionId },\n })\n }\n onMemoryClick={(memoryId) =>\n void navigate({\n to: \"/workspaces/$workspaceId/memory\",\n params: { workspaceId },\n search: { memory: memoryId },\n })\n }\n onLearningRefusalOpen={(place) => {\n switch (place.kind) {\n case \"skill\":\n // The Skills page opens one Skill from its raw `open` parameter.\n void navigate({\n href: `/workspaces/${encodeURIComponent(workspaceId)}/plugins?section=skills&open=${encodeURIComponent(`skill:${place.skillId}`)}`,\n });\n return;\n case \"skills\":\n void navigate({\n to: \"/workspaces/$workspaceId/plugins\",\n params: { workspaceId },\n search: { section: \"skills\" },\n });\n return;\n case \"instructions\":\n void navigate({\n to: \"/workspaces/$workspaceId/state\",\n params: { workspaceId },\n search: { view: \"instructions\" },\n });\n return;\n case \"knowledge\":\n void navigate({ to: \"/workspaces/$workspaceId/state\", params: { workspaceId } });\n return;\n case \"learning-settings\":\n void navigate({\n to: \"/workspaces/$workspaceId/settings\",\n params: { workspaceId },\n search: { section: \"learning\" },\n });\n }\n }}\n onNewSession={() =>\n void navigate({\n to: \"/workspaces/$workspaceId/sessions\",\n params: { workspaceId },\n })\n }\n onApprove={(approvalId) => approve(approvalId, \"approve\")}\n onReject={(approvalId) => approve(approvalId, \"reject\")}\n onReconnect={onReconnect}\n onConnectGitHubApp={connectGitHubApp}\n resolveProviderLogo={resolveProviderLogo}\n onReloadSession={refreshSession}\n onOpenSandboxFile={openSandboxFile}\n // Both open the session panel's Agent tab; without the panel, neither shows.\n onOpenAgentSettings={dockEnabled ? openAgentSettings : undefined}\n onOpenUsageLimit={dockEnabled ? openUsageLimit : undefined}\n connectionState={connectionState}\n />\n );\n\n return (\n <div className=\"flex min-h-0 w-full min-w-0 flex-1 overflow-hidden\">\n {reconnectRequest && (\n <Suspense fallback={<LoadingPanel label=\"Opening connection setup\" />}>\n <NativeConnectSetup\n transport={reconnectTransport}\n workspaceId={workspaceId}\n request={reconnectRequest}\n onClose={() => setReconnectRequest(null)}\n onComplete={() => {\n setReconnectRequest(null);\n if (reconnectRequest.providerId === \"github-app\") {\n toast.success(\"GitHub connected\");\n void context.refreshGitHub(workspaceId, undefined, { sync: true });\n return;\n }\n toast.success(\"Connection updated\", {\n description: \"New tool calls can use the updated connection.\",\n });\n }}\n />\n </Suspense>\n )}\n <SessionDock\n workspaceId={workspaceId}\n sessionId={sessionId}\n session={session}\n events={events}\n connectionState={connectionState}\n primary={chatPane}\n onReloadSession={refreshSession}\n dockCollapsed={!context.inspectorOpen}\n onDockCollapsedChange={(collapsed) => context.setInspectorOpen(!collapsed)}\n openFileRequest={sandboxFileRequest}\n openAgentSettingsRequest={\n agentSettingsRequest?.sessionId === sessionId ? agentSettingsRequest : null\n }\n onOpenNavigation={() => {\n context.setInspectorOpen(false);\n rail.setDrawerOpen(true);\n }}\n />\n </div>\n );\n\n async function approve(approvalId: string, decision: \"approve\" | \"reject\") {\n try {\n await context.client.sendApprovalDecision(workspaceId, sessionId, {\n approvalId,\n decision,\n });\n } catch (error) {\n toast.error(\"Couldn't submit the decision\", {\n description: userErrorText(error),\n });\n throw error instanceof Error ? error : new Error(String(error));\n }\n }\n}\n\n/** The embedding page's per-message context, as a send extra. */\nfunction withHostMessageContext(messageContext: (() => string | undefined) | undefined): {\n modelContext?: string;\n} {\n const value = messageContext?.();\n return value ? { modelContext: value } : {};\n}\n\n/** The latest agent-settings change, and whether a turn has started since. */\nfunction lastAgentChange(events: readonly SessionEvent[]): { at: string; pending: boolean } | null {\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const event = events[index]!;\n if (event.type !== \"session.agent.updated\") continue;\n const pending = !events.slice(index + 1).some((later) => later.type === \"turn.started\");\n return { at: event.occurredAt, pending };\n }\n return null;\n}\n\n/**\n * The resizable Workspace dock: chat on the left, a collapsible/maximizable dock\n * on the right with the capability-gated sandbox surfaces (Files |\n * Terminal | Desktop) + Debug. Replaces the old fixed 390px aside.\n */\ntype SessionDockProps = {\n workspaceId: string;\n sessionId: string;\n session: Session | null;\n events: SessionEvent[];\n connectionState: ReturnType<typeof useSessionEvents>[\"connectionState\"];\n primary: React.ReactNode;\n onReloadSession: () => Promise<void>;\n dockCollapsed: boolean;\n onDockCollapsedChange: (collapsed: boolean) => void;\n onOpenNavigation: () => void;\n openFileRequest?:\n | {\n path: string;\n line?: number | null | undefined;\n requestId: number;\n }\n | null\n | undefined;\n /** Open the Agent tab at Agent learning or Usage limit. A new requestId reopens it. */\n openAgentSettingsRequest?:\n | { requestId: number; target: \"learning\" | \"usage-limit\" }\n | null\n | undefined;\n};\n\n/** The chat with the session panel beside it, or the chat alone when the surface has no panel. */\nfunction SessionDock(props: SessionDockProps) {\n if (!useSessionUiFeature(\"dock\")) {\n return (\n <div className=\"flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden\">{props.primary}</div>\n );\n }\n return <SessionDockPanel {...props} />;\n}\n\nfunction SessionDockPanel(props: SessionDockProps) {\n const context = useAppContext();\n // One request sequence for every tab the host opens (an artifact, the Agent\n // tab): the dock ignores a requestId it has already handled.\n const tabRequestSeq = useRef(0);\n const [tabRequest, setTabRequest] = useState<{\n sessionId: string;\n tab: string;\n requestId: number;\n } | null>(null);\n const agentSettingsRequestId = props.openAgentSettingsRequest?.requestId ?? null;\n const agentSettingsTarget = props.openAgentSettingsRequest?.target ?? \"learning\";\n const [agentLearningFocus, setAgentLearningFocus] = useState(0);\n const [usageLimitFocus, setUsageLimitFocus] = useState(0);\n useEffect(() => {\n if (agentSettingsRequestId === null) return;\n setTabRequest({\n sessionId: props.sessionId,\n tab: \"agent\",\n requestId: ++tabRequestSeq.current,\n });\n if (agentSettingsTarget === \"usage-limit\") setUsageLimitFocus((value) => value + 1);\n else setAgentLearningFocus((value) => value + 1);\n // oxlint-disable-next-line react-hooks/exhaustive-deps -- the target travels with its request\n }, [agentSettingsRequestId, props.sessionId]);\n const goalPausedAtLimit = useMemo(() => goalPausedAtUsageLimit(props.events), [props.events]);\n const currentTabRequest = tabRequest?.sessionId === props.sessionId ? tabRequest : null;\n const dockLayoutStorageId = sessionDockLayoutStorageId(\n context.accessContext.subjectId,\n props.sessionId,\n );\n const dockNavigation = useMemo(\n () => readSessionDockNavigation(dockLayoutStorageId),\n [dockLayoutStorageId],\n );\n const rememberArtifact = useCallback(\n (artifactId: string | null) => updateSessionDockNavigation(dockLayoutStorageId, { artifactId }),\n [dockLayoutStorageId],\n );\n // The workbench (Changes | Files | Terminal | Desktop + machine chip) lives in\n // the package now; the app injects durable artifacts and Debug around it.\n // Heavy editor/runtime code stays lazy until the user opens the tab.\n const artifactRefresh = useMemo(() => {\n for (let index = props.events.length - 1; index >= 0; index -= 1) {\n const event = props.events[index];\n if (\n event &&\n (event.type === \"agent.toolCall.output\" ||\n event.type === \"turn.completed\" ||\n event.type === \"turn.failed\" ||\n event.type === \"turn.cancelled\")\n ) {\n // Tool output re-reads the chat and only sub-sessions with new\n // activity; the end of a turn re-reads everything once.\n return { sequence: event.sequence, complete: event.type !== \"agent.toolCall.output\" };\n }\n }\n return { sequence: 0, complete: true };\n }, [props.events]);\n const artifactRefreshSequence = artifactRefresh.sequence;\n // Tool output may have published a file or Site: let the Artifacts page show\n // its cached rows on the next visit but refetch them.\n useEffect(() => {\n if (artifactRefreshSequence) expireArtifactCatalog(context.client, props.workspaceId);\n }, [artifactRefreshSequence, context.client, props.workspaceId]);\n const artifactState = useSessionEditableArtifactSummaries({\n workspaceId: props.workspaceId,\n sessionId: props.sessionId,\n refreshSequence: artifactRefreshSequence,\n completeRefresh: artifactRefresh.complete,\n });\n const expireAfterArtifactMutation = useArtifactCatalogMutationInvalidation(\n context.client,\n props.workspaceId,\n expireArtifactCatalog,\n );\n const [artifactRequest, setArtifactRequest] = useState<{\n sessionId: string;\n artifactId: string;\n artifactKind?: SessionEditableArtifactSummary[\"modality\"] | undefined;\n requestId: number;\n tab: string;\n } | null>(null);\n const currentArtifactRequest =\n artifactRequest?.sessionId === props.sessionId ? artifactRequest : null;\n const artifactTabRequestId = currentArtifactRequest?.requestId ?? null;\n useEffect(() => {\n if (artifactTabRequestId === null) return;\n setTabRequest({\n sessionId: props.sessionId,\n tab: \"artifacts\",\n requestId: ++tabRequestSeq.current,\n });\n }, [artifactTabRequestId, props.sessionId]);\n const artifactSummaries = [...artifactState.artifacts];\n // A just-published artifact may be linked before discovery refresh completes, or\n // belong to another session in this workspace. The viewer still authorizes its read.\n if (\n currentArtifactRequest &&\n !artifactSummaries.some(\n (item) =>\n item.id === currentArtifactRequest.artifactId &&\n (!currentArtifactRequest.artifactKind ||\n item.modality === currentArtifactRequest.artifactKind ||\n (currentArtifactRequest.artifactKind === \"file\" && item.modality === \"image\")),\n )\n ) {\n artifactSummaries.push({\n id: currentArtifactRequest.artifactId,\n modality: currentArtifactRequest.artifactKind ?? \"site\",\n title:\n currentArtifactRequest.artifactKind === \"image\"\n ? \"Image\"\n : currentArtifactRequest.artifactKind === \"file\"\n ? \"File\"\n : \"Site\",\n });\n }\n const trailingTabs: WorkspaceTab[] = [\n {\n id: \"artifacts\",\n label: \"Artifacts\",\n icon: <PanelsTopLeftIcon />,\n ...(artifactSummaries.length > 0\n ? {\n badge: (\n <span className=\"rounded-og-xs bg-og-accent-soft px-1 text-og-xs text-og-fg-muted\">\n {artifactSummaries.length}\n </span>\n ),\n }\n : {}),\n content: (\n <Suspense fallback={<LoadingPanel label=\"Opening artifact\" />}>\n <LazySessionEditableArtifactsWorkspace\n key={props.sessionId}\n workspaceId={props.workspaceId}\n sessionId={props.sessionId}\n artifacts={artifactSummaries}\n status={artifactState.status}\n onRetry={artifactState.retry}\n initialSelectedArtifactId={dockNavigation.artifactId}\n openArtifactRequest={currentArtifactRequest}\n onSelectedArtifactIdChange={rememberArtifact}\n onPin={\n hasWorkspacePermission(context.accessContext, props.workspaceId, \"artifacts:publish\")\n ? async (item, pinned) => {\n await context.client.updateArtifactPin(\n props.workspaceId,\n item.kind,\n item.id,\n pinned,\n );\n artifactState.applyPin(item.kind, item.id, pinned);\n expireAfterArtifactMutation();\n artifactState.retry();\n }\n : undefined\n }\n />\n </Suspense>\n ),\n },\n ];\n if (props.session) {\n trailingTabs.push({\n id: \"agent\",\n label: \"Agent\",\n icon: <BotIcon />,\n content: (\n <Suspense fallback={<LoadingPanel label=\"Opening agent settings\" />}>\n <LazyAgentConfigurationPanel\n key={props.session.id}\n session={props.session}\n lastChange={lastAgentChange(props.events)}\n onReloadSession={props.onReloadSession}\n learningFocusRequest={agentLearningFocus}\n usageLimitFocusRequest={usageLimitFocus}\n goalPausedAtUsageLimit={goalPausedAtLimit}\n />\n </Suspense>\n ),\n });\n }\n if (props.session) {\n trailingTabs.push({\n id: \"debug\",\n label: \"Debug\",\n icon: <BugIcon />,\n content: (\n <Suspense fallback={<LoadingPanel label=\"Opening debug inspector\" />}>\n <LazySessionInspector\n session={props.session}\n events={props.events}\n connectionState={props.connectionState}\n onReloadSession={props.onReloadSession}\n />\n </Suspense>\n ),\n });\n }\n\n return (\n <SessionWorkspace\n workspaceId={props.workspaceId}\n sessionId={props.sessionId}\n preferenceOwnerId={context.accessContext.subjectId}\n events={props.events}\n primary={\n <ArtifactLinkBoundary\n workspaceId={props.workspaceId}\n onOpen={(target) => {\n // Editable artifacts require their discovered modality; unlisted editor\n // links retain the normal full-page destination.\n if (\n target.editable &&\n !artifactSummaries.some(\n (item) => item.id === target.id && isEditableArtifactKind(item.modality),\n )\n )\n return false;\n setArtifactRequest((previous) => ({\n sessionId: props.sessionId,\n artifactId: target.id,\n artifactKind:\n target.kind === \"file\"\n ? (artifactSummaries.find(\n (item) =>\n item.id === target.id &&\n (item.modality === \"file\" || item.modality === \"image\"),\n )?.modality ?? \"file\")\n : target.editable\n ? artifactSummaries.find(\n (item) => item.id === target.id && isEditableArtifactKind(item.modality),\n )?.modality\n : \"site\",\n requestId: (previous?.requestId ?? 0) + 1,\n tab: \"artifacts\",\n }));\n return true;\n }}\n >\n {props.primary}\n </ArtifactLinkBoundary>\n }\n openTabRequest={currentTabRequest}\n trailingTabs={trailingTabs}\n collapsed={props.dockCollapsed}\n onCollapsedChange={props.onDockCollapsedChange}\n {...(props.openFileRequest ? { openFileRequest: props.openFileRequest } : {})}\n mobileLeadingControl={\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label=\"Open navigation\"\n onClick={props.onOpenNavigation}\n className=\"size-11\"\n >\n <MenuIcon className=\"size-4\" />\n </Button>\n }\n />\n );\n}\n\nfunction useSessionEditableArtifactSummaries(input: {\n workspaceId: string;\n sessionId: string;\n refreshSequence: number;\n /** Re-read every sub-session instead of only those with new activity. */\n completeRefresh: boolean;\n}): Readonly<{\n artifacts: readonly SessionEditableArtifactSummary[];\n status: SessionEditableArtifactsStatus;\n retry: () => void;\n applyPin: (kind: SessionEditableArtifactSummary[\"modality\"], id: string, pinned: boolean) => void;\n}> {\n const context = useAppContext();\n const authorityKey = `${input.workspaceId}:${input.sessionId}:${context.accessKeyVersion}`;\n const [retrySequence, setRetrySequence] = useState(0);\n const sourceCache = useRef<{\n key: string;\n client: typeof context.client;\n retrySequence: number;\n cache: SessionArtifactSourceCache;\n } | null>(null);\n const [loaded, setLoaded] = useState<{\n key: string;\n client: typeof context.client;\n status: SessionEditableArtifactsStatus;\n artifacts: readonly SessionEditableArtifactSummary[];\n } | null>(null);\n\n useEffect(() => {\n let current = true;\n if (\n input.completeRefresh ||\n sourceCache.current?.key !== authorityKey ||\n sourceCache.current.client !== context.client ||\n sourceCache.current.retrySequence !== retrySequence\n )\n sourceCache.current = {\n key: authorityKey,\n client: context.client,\n retrySequence,\n cache: new Map(),\n };\n const cache = sourceCache.current.cache;\n setLoaded((previous) =>\n previous?.key === authorityKey &&\n previous.client === context.client &&\n previous.status === \"ready\"\n ? previous\n : {\n key: authorityKey,\n client: context.client,\n status: \"loading\",\n artifacts:\n previous?.key === authorityKey && previous.client === context.client\n ? previous.artifacts\n : [],\n },\n );\n void import(\"../lib/session-artifact-discovery\")\n .then(async ({ discoverSessionArtifacts }) => {\n const reconcile = await discoverSessionArtifacts(\n input.workspaceId,\n input.sessionId,\n () => current,\n context.client,\n cache,\n );\n if (current) {\n setLoaded((previous) => ({\n key: authorityKey,\n client: context.client,\n ...reconcile(\n previous?.key === authorityKey && previous.client === context.client\n ? previous.artifacts\n : [],\n ),\n }));\n }\n })\n .catch(() => {\n if (!current) return;\n setLoaded((previous) => ({\n key: authorityKey,\n client: context.client,\n status: \"error\",\n artifacts:\n previous?.key === authorityKey && previous.client === context.client\n ? previous.artifacts\n : [],\n }));\n });\n return () => {\n // The stale-result fence is sufficient for this bounded metadata GET.\n // Aborting Chrome fetch during React StrictMode cleanup surfaced an\n // unhandled AbortError from the SDK/fetch boundary on every mount.\n current = false;\n };\n }, [\n authorityKey,\n context.client,\n input.completeRefresh,\n input.refreshSequence,\n input.sessionId,\n input.workspaceId,\n retrySequence,\n ]);\n\n const retry = useCallback(() => setRetrySequence((value) => value + 1), []);\n const applyPin = useCallback(\n (kind: SessionEditableArtifactSummary[\"modality\"], id: string, pinned: boolean) => {\n setLoaded((previous) => {\n if (previous?.key !== authorityKey || previous.client !== context.client) return previous;\n return {\n ...previous,\n artifacts: previous.artifacts.map((artifact) =>\n artifact.modality === kind && artifact.id === id && artifact.catalogItem\n ? { ...artifact, catalogItem: { ...artifact.catalogItem, pinned } }\n : artifact,\n ),\n };\n });\n },\n [authorityKey, context.client],\n );\n return loaded?.key === authorityKey && loaded.client === context.client\n ? { artifacts: loaded.artifacts, status: loaded.status, retry, applyPin }\n : { artifacts: [], status: \"loading\", retry, applyPin };\n}\n\nfunction SessionChatPane(props: {\n session: Session;\n /** Keep the raw detail snapshot: the general route projection prefers queue control. */\n admissionSessionControl: Session[\"effectiveControl\"];\n events: SessionEvent[];\n timeline: TimelineItem[];\n searchTarget: SessionSearchRoute;\n onJumpToSequence: (sequence: number, options?: { signal?: AbortSignal }) => Promise<boolean>;\n initialLoading: boolean;\n historyReloadFailed: boolean;\n launch?: ComposerLaunchSearch | undefined;\n realtimeAutostartModel?: SessionRealtimeModel | undefined;\n onRealtimeAutostartConsumed: () => void;\n onSearchOriginConsumed: () => void;\n approvals: PendingApproval[];\n humanInput: ReturnType<typeof useHumanInputRequests>;\n failure: ReturnType<typeof summarizeSessionFailure> | null;\n /** The last turn ended budget_exhausted — the workspace is out of credits. */\n creditExhausted: boolean;\n goal: ReturnType<typeof useGoal>;\n queue: ReturnType<typeof useTurnQueue>;\n /** Spawned-worker lineage children — feeds SessionChrome agents segment. */\n agentNodes: LineageNode[];\n hasOlder: boolean;\n loadingOlder: boolean;\n onLoadOlder: OlderHistoryLoader;\n hasNewer: boolean;\n loadingNewer: boolean;\n onLoadNewer: () => Promise<boolean>;\n loadingOldest: boolean;\n onJumpToStart: () => Promise<boolean>;\n onJumpToLatest: () => Promise<void>;\n /** Reset the local timeline view (the /clear-view command target). */\n onClearView: () => void;\n onOpenSession: (sessionId: string) => void;\n /** Current titles for the agents this session spawns, messages, and hears from. */\n resolveSessionTitle: (sessionId: string) => string | null;\n /** Deep-link a timeline memory step to its first-class workspace Memory record. */\n onMemoryClick: (memoryId: string) => void;\n /** Opens where a person can make a refused Skill, instruction, or Knowledge change. */\n onLearningRefusalOpen: (place: LearningRefusalPlace) => void;\n onNewSession: () => void;\n onApprove: (approvalId: string) => Promise<void>;\n onReject: (approvalId: string) => Promise<void>;\n onReconnect: (item: AuthNeededItem) => void | Promise<void>;\n /** Opens workspace GitHub App setup in the route-level Connect dialog. */\n onConnectGitHubApp: () => void;\n resolveProviderLogo: (providerDomain: string) => string | null;\n onReloadSession: () => Promise<void>;\n onOpenSandboxFile: (path: string, line?: number) => void;\n /** Composer + > Chat settings: open this chat's Agent tab. */\n onOpenAgentSettings: (() => void) | undefined;\n /** The usage limit notice's Change limit: open the Agent tab at Usage limit. */\n onOpenUsageLimit: (() => void) | undefined;\n connectionState: ReturnType<typeof useSessionEvents>[\"connectionState\"];\n}) {\n const findEvents = useUiEventTarget(\"document\");\n const findShortcutScope = usePortalContainer();\n const context = useAppContext();\n const api = useAppApi();\n const page = usePage();\n const hostMessageContext = useHostMessageContext();\n // Live voice starts only from the current build: a tab opened before a\n // deploy reloads onto it once and resumes voice via `?realtime=`.\n const realtimeClient = useMemo(\n () => api.voiceRealtimeClient(context.client, () => page.href()),\n [api, context.client, page],\n );\n // Opened on a moment (an inbox item, a notification): when it is older than\n // the loaded tail, load the window around it; the timeline then lands on it.\n const momentSequence = props.searchTarget.find ? undefined : props.searchTarget.at;\n const loadedMoment = useRef<number | null>(null);\n const { onJumpToSequence, initialLoading: historyLoading } = props;\n const firstLoadedSequence = props.events[0]?.sequence;\n useEffect(() => {\n if (!momentSequence || historyLoading || loadedMoment.current === momentSequence) return;\n loadedMoment.current = momentSequence;\n if (firstLoadedSequence !== undefined && firstLoadedSequence > momentSequence) {\n void onJumpToSequence(momentSequence);\n }\n }, [momentSequence, historyLoading, firstLoadedSequence, onJumpToSequence]);\n const [findOpen, setFindOpen] = useState(!!props.searchTarget.find);\n const [findMounted, setFindMounted] = useState(!!props.searchTarget.find);\n const [findFocusRevision, setFindFocusRevision] = useState(0);\n const [activeSearchTarget, setActiveSearchTarget] = useState<TimelineSearchTarget | null>(null);\n // Find opens from the session header (or Ctrl/Cmd+F); closing returns focus\n // to whatever opened it.\n const findReturnFocus = useRef<HTMLElement | null>(null);\n const openFind = useCallback(() => {\n const active = document.activeElement;\n if (active instanceof HTMLElement && active !== document.body) findReturnFocus.current = active;\n setFindMounted(true);\n setFindOpen(true);\n setFindFocusRevision((value) => value + 1);\n }, []);\n // The back link follows the URL's session-search origin, which closing the\n // bar removes, so Ctrl/Cmd+F and the Find button then open a plain bar.\n const { onSearchOriginConsumed } = props;\n const closeFind = useCallback(() => {\n setFindOpen(false);\n setActiveSearchTarget(null);\n onSearchOriginConsumed();\n requestAnimationFrame(() => {\n // Back to whatever opened Find, else the header's Find button when shown.\n const opener = findReturnFocus.current;\n findReturnFocus.current = null;\n const trigger = document.querySelector<HTMLElement>(\"[data-conversation-find-trigger]\");\n const target = opener?.isConnected\n ? opener\n : trigger && trigger.getClientRects().length > 0\n ? trigger\n : null;\n target?.focus({ preventScroll: true });\n });\n }, [onSearchOriginConsumed]);\n useEffect(() => {\n findEvents.addEventListener(OPEN_CONVERSATION_FIND_EVENT, openFind);\n return () => findEvents.removeEventListener(OPEN_CONVERSATION_FIND_EVENT, openFind);\n }, [findEvents, openFind]);\n useEffect(() => {\n if (props.searchTarget.find) openFind();\n }, [\n props.searchTarget.find,\n props.searchTarget.matchSequence,\n props.searchTarget.matchOffset,\n openFind,\n ]);\n useEffect(() => {\n const onKeyDown = (event: KeyboardEvent) => {\n if (\n !(event.ctrlKey || event.metaKey) ||\n event.altKey ||\n event.shiftKey ||\n event.key.toLowerCase() !== \"f\"\n )\n return;\n const target = event.target;\n // Dialogs and embedded editors own their own keyboard search behavior.\n if (\n target instanceof Element &&\n target.closest('[role=\"dialog\"], .cm-editor, .xterm, [data-native-find]')\n )\n return;\n event.preventDefault();\n openFind();\n };\n // An embedded app takes the shortcut only while focus is inside it, so\n // the host page keeps its own find.\n const scope = findShortcutScope ?? window;\n scope.addEventListener(\"keydown\", onKeyDown as EventListener);\n return () => scope.removeEventListener(\"keydown\", onKeyDown as EventListener);\n }, [findShortcutScope, openFind]);\n const fundingRevision = useMemo(() => {\n for (let index = props.events.length - 1; index >= 0; index -= 1) {\n const event = props.events[index]!;\n if (event.type === \"agent.model.usage\") return event.sequence;\n }\n return 0;\n }, [props.events]);\n const modelCatalog = useWorkspaceModelCatalog(\n props.session.workspaceId,\n `${props.session.id}:${props.session.status}:${fundingRevision}`,\n );\n const fleet = useWorkspaceMachines({\n sessionId: props.session.id,\n pollIntervalMs: MACHINES_SESSION_POLL_MS,\n });\n const computeLabel = sessionComputeLabel(t, fleet.machines);\n const loadRetainedScreenshot = useMemo(\n () =>\n createSessionRetainedScreenshotLoader(\n context.client,\n props.session.workspaceId,\n props.session.id,\n ),\n [context.client, props.session.id, props.session.workspaceId],\n );\n const loadRetainedArtifact = useMemo(\n () => createWorkspaceRetainedArtifactLoader(context.client, props.session.workspaceId),\n [context.client, props.session.workspaceId],\n );\n const loadVideoArtifactPlayback = useMemo(\n () => createWorkspaceRetainedVideoLoader(context.client, props.session.workspaceId),\n [context.client, props.session.workspaceId],\n );\n const cancelled = isTerminalSessionStatus(props.session.status);\n // Moved to long-term storage after a long idle period: readable, not continuable.\n const readOnlyArchive = sessionReadOnlyArchive(props.session);\n const terminal = cancelled || readOnlyArchive !== null;\n const composerRegionRef = useRef<HTMLDivElement | null>(null);\n const [composerFocusSignal, setComposerFocusSignal] = useState(0);\n const focusEvents = useUiEventTarget(\"window\");\n const [modelPickerSession, setModelPickerSession] = useState<string | null>(null);\n // The API's authoritative \"model is not available\" refusal for this session,\n // which also covers connection-owned models the catalog cannot judge.\n const [refusedModel, setRefusedModel] = useState<{ sessionId: string; model: string } | null>(\n null,\n );\n // The API's credit refusal of a Send: no remaining credit pays for that model.\n // It stays above the composer until a message is accepted or it is dismissed.\n const [creditRefusal, setCreditRefusal] = useState<{\n sessionId: string;\n model: string;\n message: string;\n } | null>(null);\n useEffect(() => {\n const onFocusRequest = (event: Event) => {\n const detail = (event as CustomEvent<SessionComposerFocusIntent>).detail;\n if (\n detail?.workspaceId === props.session.workspaceId &&\n detail.sessionId === props.session.id\n ) {\n setComposerFocusSignal(detail.nonce);\n }\n };\n focusEvents.addEventListener(FOCUS_SESSION_COMPOSER_EVENT, onFocusRequest);\n return () => focusEvents.removeEventListener(FOCUS_SESSION_COMPOSER_EVENT, onFocusRequest);\n }, [focusEvents, props.session.id, props.session.workspaceId]);\n // Opening a chat (a sidebar click, ⌘K, Control+Tab, a link or a reload)\n // puts the cursor in its composer, since typing is what comes next. Without\n // an explicit intent, only the first effect run for a chat may do this, and\n // only while nothing else has focus.\n const loadFocusSessionRef = useRef<string | null>(null);\n // The wait outlives effect re-runs (status, approvals) but not the chat.\n const composerFocusWaitRef = useRef<{ sessionId: string; cancel: () => void } | null>(null);\n useEffect(\n () => () => {\n composerFocusWaitRef.current?.cancel();\n composerFocusWaitRef.current = null;\n },\n [],\n );\n useEffect(() => {\n if (\n composerFocusWaitRef.current &&\n composerFocusWaitRef.current.sessionId !== props.session.id\n ) {\n composerFocusWaitRef.current.cancel();\n composerFocusWaitRef.current = null;\n }\n const intent = consumeSessionComposerFocusIntent(\n focusEvents,\n props.session.workspaceId,\n props.session.id,\n );\n const firstRunForChat = loadFocusSessionRef.current !== props.session.id;\n loadFocusSessionRef.current = props.session.id;\n const source = intent?.source ?? (firstRunForChat ? \"load\" : null);\n if (!source) return;\n if (\n !sessionComposerFocusIntentIsEligible({\n viewportWidth: globalThis.innerWidth,\n coarsePointer: globalThis.matchMedia?.(\"(pointer: coarse)\").matches ?? false,\n terminal,\n requiresAction: props.session.status === \"requires_action\",\n pendingHumanInput: props.humanInput.requests.length > 0,\n pendingApproval: props.approvals.length > 0,\n })\n ) {\n return;\n }\n composerFocusWaitRef.current?.cancel();\n composerFocusWaitRef.current = {\n sessionId: props.session.id,\n cancel: focusSessionComposerWhenReady({\n textarea: () => composerRegionRef.current?.querySelector(\"textarea\"),\n sessionId: props.session.id,\n source,\n }),\n };\n }, [\n composerFocusSignal,\n focusEvents,\n props.approvals.length,\n props.humanInput.requests.length,\n props.session.id,\n props.session.status,\n props.session.workspaceId,\n terminal,\n ]);\n const agentsSignal = useMemo(() => sessionAgentsSignal(t, props.agentNodes), [props.agentNodes]);\n const codexConnected = modelCatalog.models.some(\n (candidate) =>\n candidate.provider === \"codex-subscription\" &&\n candidate.credentialReadiness.status === \"ready\",\n );\n // Soft-hide dictate while realtime voice owns the mic (model + mutes stay on the bar).\n const [voiceActive, setVoiceActive] = useState(false);\n const onVoiceActiveChange = useCallback((active: boolean) => {\n setVoiceActive(active);\n }, []);\n // Per-approval decision state: an in-flight decision disables both buttons for\n // that approval and shows progress; a settled one can never double-submit even\n // if the strip lingers for a beat before the status flips.\n const [selectedApprovalId, setSelectedApprovalId] = useState<string | null>(null);\n const [reviewDetails, setReviewDetails] = useState<{\n review: import(\"@opengeni/sdk\").ToolActionReview;\n path: string;\n origin?: string | undefined;\n } | null>(null);\n const loadToolReview = useCallback(\n (approval: PendingApproval) =>\n context.client.getToolActionReview(props.session.workspaceId, props.session.id, approval.id),\n [context.client, props.session.workspaceId, props.session.id],\n );\n const loadRecordedToolReview = useCallback(\n (id: string) =>\n context.client.getToolActionReview(props.session.workspaceId, props.session.id, id),\n [context.client, props.session.workspaceId, props.session.id],\n );\n const viewToolReviewDetails = useCallback(\n (review: import(\"@opengeni/sdk\").ToolActionReview, path: string) =>\n setReviewDetails({\n review,\n path,\n origin:\n document.activeElement\n ?.closest(\"[data-review-origin]\")\n ?.getAttribute(\"data-review-origin\") ?? undefined,\n }),\n [],\n );\n const loadToolReviewDetails = useCallback(\n (review: import(\"@opengeni/sdk\").ToolActionReview, path: string, offset: number) =>\n context.client.getToolReviewDetails(props.session.workspaceId, props.session.id, review.id, {\n actionDigest: review.actionDigest,\n path,\n offset,\n }),\n [context.client, props.session.workspaceId, props.session.id],\n );\n const [approvalPending, setApprovalPending] = useState<Record<string, \"approve\" | \"reject\">>({});\n const [approvalSettled, setApprovalSettled] = useState<Record<string, \"approve\" | \"reject\">>({});\n // Decision state is scoped to ONE requires_action pause. Once the session\n // resumes, both maps reset — otherwise a later approval that reuses an id\n // (including the index-fallback ids) would render permanently disabled, and\n // long sessions would accumulate stale entries.\n useEffect(() => {\n if (props.session.status !== \"requires_action\") {\n setApprovalPending((current) => (Object.keys(current).length ? {} : current));\n setApprovalSettled((current) => (Object.keys(current).length ? {} : current));\n }\n }, [props.session.status]);\n const decideApproval = useCallback(\n async (approvalId: string, decision: \"approve\" | \"reject\") => {\n if (approvalPending[approvalId] || approvalSettled[approvalId]) {\n return;\n }\n setApprovalPending((current) => ({ ...current, [approvalId]: decision }));\n // A failure propagates so the approval surface releases its fence and\n // the buttons stay live for a retry.\n try {\n await (decision === \"approve\" ? props.onApprove(approvalId) : props.onReject(approvalId));\n setApprovalSettled((current) => ({\n ...current,\n [approvalId]: decision,\n }));\n } finally {\n setApprovalPending((current) => {\n const next = { ...current };\n delete next[approvalId];\n return next;\n });\n }\n },\n [approvalPending, approvalSettled, props],\n );\n // Workspace-scoped: the provider (mounted on the workspace route) supplies\n // the workspaceId, so the hook needs no positional argument.\n const attachments = useFileAttachments({\n scope:\n props.session.tenancy?.visibility === \"private\" ||\n props.session.memoryScope === \"user\" ||\n context.workspaces.find((w) => w.id === props.session.workspaceId)?.kind === \"personal\"\n ? \"personal\"\n : \"workspace\",\n });\n const repositories = useFollowUpRepositories(props.session, props.onConnectGitHubApp);\n const firstPartyToolOptions = firstPartySessionToolOptionsFor(\n clientFirstPartyMcpToolPolicy(context.clientConfig).allowed,\n );\n const selectableSessionMcpServers = context.toolMcpServers;\n const selectableToolIds = useMemo(\n () => selectableSessionMcpServers.map((server) => server.id),\n [selectableSessionMcpServers],\n );\n const policyToolIds = useMemo(\n () => sessionPolicyPickerIds(props.session, selectableToolIds, context.workspaceDefaultToolIds),\n [context.workspaceDefaultToolIds, props.session, selectableToolIds],\n );\n const [durableToolSelection, setDurableToolSelection] = useState<SessionToolSelection>(() => ({\n mcpServerIds: new Set(policyToolIds),\n firstPartyToolIds: new Set(props.session.firstPartyMcpTools),\n }));\n const [durableToolsSnapshot, setDurableToolsSnapshot] = useState(props.session);\n const durableToolsSaveInFlight = useRef(false);\n const [durableToolsHydrated, setDurableToolsHydrated] = useState(false);\n const durableToolsSessionId = useRef(props.session.id);\n const [durableToolsSaving, setDurableToolsSaving] = useState(false);\n const [durableToolsError, setDurableToolsError] = useState<string | null>(null);\n const [connectorCustomizingOverride, setConnectorCustomizingOverride] = useState<boolean | null>(\n null,\n );\n // \"+\" > Runs on: the compute this chat runs on and the machines it can move to.\n const runsOn = useSessionRunsOn(props.session.id, props.session.sandboxBackend);\n const machineAccess = currentSessionMachineAccess(\n runsOn.fleet.sessionMachineAccess,\n props.session.activeSandboxId,\n );\n const connectionAccounts = useConnectionAccounts(\n context.client,\n {\n id: props.session.id,\n workspaceId: props.session.workspaceId,\n selectedIds: [...durableToolSelection.mcpServerIds],\n },\n context.workspaceCapabilityCatalog,\n context.accessContext === null\n ? null\n : hasWorkspacePermission(\n context.accessContext,\n props.session.workspaceId,\n \"connections:read\",\n ),\n );\n // A conversation card's human attach is an ordinary Send. It reads the\n // composer's policy, control and account choices at click time.\n const chatSendContext = useRef<ChatSendContext>({\n blocked: null,\n awaitingHuman: false,\n extras: {},\n });\n const readChatSendContext = useCallback(() => chatSendContext.current, []);\n // \"+\" > Runs on: moving onto the person's own machine is their consent to use\n // it here, so it goes through the same move as the machine card (repoint, then\n // a message that carries that consent). Other machines only repoint.\n const runsOnAttach = runsOn.fleet.attach;\n const runsOnPreviousSandboxId = runsOn.fleet.activeSandboxId;\n // While the chat runs on the person's own machine (only its owner sees it in\n // their list), each message renews their consent for this chat, so a chat\n // whose move message never landed recovers on the next ordinary Send. The\n // session's own pointer must agree, so a move the agent or another tab made\n // since the last machine poll doesn't send consent for a machine it left.\n const runsOnActiveMachineConsent =\n runsOn.activeMachine &&\n isPersonalMachine(runsOn.activeMachine) &&\n runsOn.activeMachine.sandboxId === props.session.activeSandboxId\n ? personalMachineUseIntent(props.session.tenancy)\n : undefined;\n const runsOnCanMessage =\n context.accessContext === null ||\n context.accessContext === undefined ||\n hasWorkspacePermission(context.accessContext, props.session.workspaceId, \"sessions:control\");\n const reloadSessionAfterMachineChange = props.onReloadSession;\n const moveRunsOn = useCallback(\n async (machine: MachineView): Promise<string | null> => {\n if (!isPersonalMachine(machine)) {\n if (!(await runsOnAttach(machine.sandboxId)))\n return \"The machine change could not be confirmed. Try refreshing the machine list.\";\n await reloadSessionAfterMachineChange();\n return null;\n }\n const result = await moveChatToMachine({\n machine,\n chat: readChatSendContext(),\n canMessage: runsOnCanMessage,\n previousSandboxId: runsOnPreviousSandboxId,\n attach: runsOnAttach,\n sendMessage: (message) =>\n context.client.sendMessage(props.session.workspaceId, props.session.id, message),\n });\n if (result.moved) await reloadSessionAfterMachineChange();\n return result.moved\n ? null\n : (result.reason ??\n \"The machine change could not be confirmed. Refresh the machine list and try again.\");\n },\n [\n context.client,\n props.session.id,\n props.session.workspaceId,\n reloadSessionAfterMachineChange,\n readChatSendContext,\n runsOnAttach,\n runsOnCanMessage,\n runsOnPreviousSandboxId,\n ],\n );\n // Session reads return a new resources array; keep the identity while the\n // contents match so timeline renderers keyed on it do not reset.\n const sessionResourcesKey = stableJson(props.session.resources);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- keyed by content\n const stableSessionResources = useMemo(() => props.session.resources, [sessionResourcesKey]);\n const reloadSessionAfterSetup = props.onReloadSession;\n const refreshConnectionAccounts = connectionAccounts.refresh;\n const afterConnectionSetup = useCallback(async () => {\n await reloadSessionAfterSetup();\n await refreshConnectionAccounts();\n }, [reloadSessionAfterSetup, refreshConnectionAccounts]);\n const renderAuthNeeded = useCallback(\n (item: AuthNeededItem) => {\n const recommendation = item.setupRequest\n ? item\n : sessionAuthRecommendation(t, item, context.workspaceCapabilityCatalog);\n return recommendation ? (\n <Suspense\n fallback={\n <p role=\"status\" className=\"text-sm text-fg-muted\">\n Loading connection card…\n </p>\n }\n >\n <SessionCapabilityCard\n key={`${props.session.id}:${props.session.tenancy?.authorityEpoch}:${item.id}`}\n item={recommendation}\n workspaceId={props.session.workspaceId}\n sessionId={props.session.id}\n visibility={props.session.tenancy?.visibility ?? \"workspace\"}\n resources={stableSessionResources}\n sendContext={readChatSendContext}\n onConfigured={afterConnectionSetup}\n />\n </Suspense>\n ) : undefined;\n },\n [\n context.workspaceCapabilityCatalog,\n props.session.id,\n props.session.workspaceId,\n props.session.tenancy?.visibility,\n props.session.tenancy?.authorityEpoch,\n stableSessionResources,\n readChatSendContext,\n afterConnectionSetup,\n ],\n );\n const navigate = useNavigate();\n const launch = props.launch ?? EMPTY_COMPOSER_LAUNCH;\n const launchModel = launch.model;\n const launchEffort = launch.effort;\n const launchLatency = launch.latency;\n const launchRealtime = launch.realtime;\n const launchKey = composerLaunchSearchKey(launch);\n const appliedLaunchKeyRef = useRef<string | null>(null);\n useEffect(() => {\n if (durableToolsSessionId.current !== props.session.id) {\n durableToolsSessionId.current = props.session.id;\n setDurableToolsSnapshot(props.session);\n setDurableToolsHydrated(false);\n setConnectorCustomizingOverride(null);\n return;\n }\n if (!context.workspaceMcpCatalogReady) {\n setDurableToolsHydrated(false);\n return;\n }\n if (durableToolsSaving) return;\n // A PATCH response can be newer than the parent query. Never let stale\n // props restore a connector the user just excluded.\n const snapshot =\n props.session.toolPolicyVersion > durableToolsSnapshot.toolPolicyVersion\n ? props.session\n : durableToolsSnapshot;\n if (snapshot !== durableToolsSnapshot) setDurableToolsSnapshot(snapshot);\n const nextMcpIds = sessionPolicyPickerIds(\n snapshot,\n selectableToolIds,\n context.workspaceDefaultToolIds,\n );\n const nextFirstPartyIds = new Set(snapshot.firstPartyMcpTools);\n setDurableToolSelection((current) =>\n current.mcpServerIds.size === nextMcpIds.size &&\n [...nextMcpIds].every((id) => current.mcpServerIds.has(id)) &&\n current.firstPartyToolIds.size === nextFirstPartyIds.size &&\n [...nextFirstPartyIds].every((id) => current.firstPartyToolIds.has(id))\n ? current\n : { mcpServerIds: nextMcpIds, firstPartyToolIds: nextFirstPartyIds },\n );\n setDurableToolsHydrated(true);\n }, [\n context.workspaceMcpCatalogReady,\n context.workspaceDefaultToolIds,\n selectableToolIds,\n durableToolsSaving,\n durableToolsSnapshot,\n props.session,\n ]);\n const connectorCustomizing =\n connectorCustomizingOverride ?? sessionConnectorPolicyIsCustomized(durableToolsSnapshot);\n const applyDurableToolPolicy = useCallback(\n async (request: UpdateSessionToolPolicyRequest, optimistic?: SessionToolSelection) => {\n if (durableToolsSaveInFlight.current) return;\n durableToolsSaveInFlight.current = true;\n const targetSessionId = props.session.id;\n if (optimistic) setDurableToolSelection(optimistic);\n setDurableToolsSaving(true);\n setDurableToolsError(null);\n try {\n const updated = await context.client.updateSessionToolPolicy(\n props.session.workspaceId,\n targetSessionId,\n request,\n );\n if (durableToolsSessionId.current !== targetSessionId) return;\n setDurableToolSelection({\n mcpServerIds: sessionPolicyPickerIds(\n updated,\n selectableToolIds,\n context.workspaceDefaultToolIds,\n ),\n firstPartyToolIds: new Set(updated.firstPartyMcpTools),\n });\n setDurableToolsSnapshot(updated);\n setConnectorCustomizingOverride((current) => (current === true ? true : null));\n } catch (error) {\n const message = userErrorText(error);\n setDurableToolsError(message);\n toast.error(\"Couldn't save session tools\", { description: message });\n try {\n const refreshed = await context.client.getSession(\n props.session.workspaceId,\n props.session.id,\n );\n if (durableToolsSessionId.current !== targetSessionId) return;\n setDurableToolSelection({\n mcpServerIds: sessionPolicyPickerIds(\n refreshed,\n selectableToolIds,\n context.workspaceDefaultToolIds,\n ),\n firstPartyToolIds: new Set(refreshed.firstPartyMcpTools),\n });\n setDurableToolsSnapshot(refreshed);\n setConnectorCustomizingOverride((current) => (current === true ? true : null));\n } catch {\n if (durableToolsSessionId.current === targetSessionId) {\n setDurableToolSelection({\n mcpServerIds: sessionPolicyPickerIds(\n durableToolsSnapshot,\n selectableToolIds,\n context.workspaceDefaultToolIds,\n ),\n firstPartyToolIds: new Set(durableToolsSnapshot.firstPartyMcpTools),\n });\n }\n }\n } finally {\n durableToolsSaveInFlight.current = false;\n setDurableToolsSaving(false);\n }\n },\n [\n context.client,\n context.workspaceDefaultToolIds,\n durableToolsSnapshot,\n props.session.id,\n props.session.workspaceId,\n selectableToolIds,\n ],\n );\n const saveDurableToolPolicy = useCallback(\n async (next: SessionToolSelection) => {\n await applyDurableToolPolicy(\n connectorSelectionUpdate(\n durableToolsSnapshot,\n durableToolSelection.mcpServerIds,\n next.mcpServerIds,\n context.workspaceDefaultToolIds,\n ),\n {\n mcpServerIds: new Set(next.mcpServerIds),\n firstPartyToolIds: new Set(next.firstPartyToolIds),\n },\n );\n },\n [\n applyDurableToolPolicy,\n context.workspaceDefaultToolIds,\n durableToolsSnapshot,\n durableToolSelection,\n ],\n );\n const composerPolicyValidRef = useRef(false);\n const workspace =\n context.workspaces.find((candidate) => candidate.id === props.session.workspaceId) ?? null;\n const loadSkillReview = useCallback(\n (reference: NonNullable<import(\"@opengeni/sdk\").HumanInputQuestion[\"skillReview\"]>) =>\n context.client.readWorkspaceSkill(\n props.session.workspaceId,\n reference.skillId,\n reference.revisionId,\n ),\n // A browser-account switch must discard the previous actor's loaded preview\n // even when the SDK client instance and workspace remain unchanged.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [context.client, props.session.workspaceId, context.accessContext.subjectId],\n );\n const fixedResourceCatalogEnabled = props.session.sandboxBackend !== \"selfhosted\";\n const fixedRigScope = useFixedRigScope(\n context.client,\n workspace?.id ?? null,\n props.session.rigId,\n fixedResourceCatalogEnabled &&\n hasWorkspacePermission(context.accessContext, props.session.workspaceId, \"rigs:use\"),\n );\n const personalAttachment = usePersonalResourceAttachment({\n client: context.client,\n authMode: context.clientConfig.auth.mode,\n authSession: context.authSession,\n accessSubjectId: context.accessContext.subjectId,\n accessContext: context.accessContext,\n managedSelfContext: context.managedSelfContext,\n workspace,\n session: props.session,\n enabled: props.session.sandboxBackend !== \"selfhosted\",\n fixed: {\n rigId: props.session.rigId,\n rigScope: fixedRigScope,\n connectedMachine: null,\n },\n personalWorkspaceTarget: isPersonalWorkspace(workspace, context.managedSelfContext),\n onReloadSession: props.onReloadSession,\n });\n const composerSendBlocker = () =>\n getComposerSendBlocker({\n uploadPending: attachments.hasUnresolved,\n repositoryError: repositories.error,\n policyValid: composerPolicyValidRef.current,\n personalDecision:\n personalAttachment.requiresDecision || connectionAccounts.requiresAccountChoice,\n machineAccessDenied: machineAccess !== null && !machineAccess.isOwner,\n personalLoading:\n durableToolsSaving ||\n durableToolsSaveInFlight.current ||\n !durableToolsHydrated ||\n personalAttachment.loading ||\n personalAttachment.refreshing ||\n connectionAccounts.loading ||\n connectionAccounts.error !== null,\n });\n const composer = useComposer(props.session.id, {\n events: props.events,\n sendExtras: () => ({\n ...withHostMessageContext(hostMessageContext),\n resources: [...attachments.readyResources, ...repositories.pendingResources],\n connectionAccounts: [\n ...connectionAccounts.selections,\n ...(repositories.pendingResources.some(\n (resource) =>\n resource.kind === \"repository\" && resource.connectionType === \"github_personal\",\n ) && context.personalGitHubAuthority\n ? [context.personalGitHubAuthority]\n : []),\n ],\n ...(personalAttachment.intent\n ? { personalResourceAttachment: personalAttachment.intent }\n : runsOnActiveMachineConsent\n ? { personalResourceAttachment: runsOnActiveMachineConsent }\n : {}),\n }),\n sendBlocked: () => composerSendBlocker() !== null,\n effectiveControl: props.queue.effectiveControl ?? props.session.effectiveControl,\n sendDestination: () =>\n props.session.activeTurnId !== null || props.queue.queue.length > 0 ? \"queue\" : \"chat\",\n busySend: resolveWorkspaceBusySend(workspace?.settings),\n // The console always offers the other choice beside Send.\n offerQueue: true,\n // Ordinary Send is acknowledged locally. Clear only resources captured in\n // that immutable optimistic operation; later additions belong to the next\n // draft, while retry keeps the original resource refs in the failed bubble.\n onSubmitted: (_text, input) => {\n noteTurnFailureAction(\"send_message\");\n attachments.removeReadyFiles(\n (input.resources ?? []).flatMap((resource) =>\n resource.kind === \"file\" ? [resource.fileId] : [],\n ),\n );\n repositories.commitSent(input.resources ?? []);\n },\n // Steer and recovered sends do not pass through onSubmitted. Keep the\n // host-owned upload/repository queue in sync once those inputs are\n // accepted too; the immutable input snapshot preserves later additions.\n onSent: (_text, input) => {\n setCreditRefusal(null);\n attachments.removeReadyFiles(\n (input.resources ?? []).flatMap((resource) =>\n resource.kind === \"file\" ? [resource.fileId] : [],\n ),\n );\n repositories.commitSent(input.resources ?? []);\n personalAttachment.onAccepted(input);\n },\n onDeliveryError: (error, input, delivery) => {\n personalAttachment.onDeliveryError(error, input, delivery);\n connectionAccounts.onSelectionError(error);\n // Retrying cannot help: re-read the catalog so the composer offers a\n // replacement, and open the picker so the next step is visible.\n if (isModelUnavailableSubmissionError(error)) {\n const refused = refusedModelId(error, input);\n if (refused) setRefusedModel({ sessionId: props.session.id, model: refused });\n void modelCatalog.refresh();\n setModelPickerSession(props.session.id);\n }\n // Re-read funding so the notice and picker name what the credit covers now.\n if (isPaymentRequiredError(error)) {\n setCreditRefusal({\n sessionId: props.session.id,\n model: refusedModelId(error, input) ?? props.session.model,\n message: error.message,\n });\n void modelCatalog.refresh();\n }\n },\n });\n useBrowserAccountBridgeBlocker(`session-composer:${props.session.id}`, () => {\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 (composer.sending || composer.draftSaving || durableToolsSaving) {\n return {\n id: \"ignored\",\n label: \"A session mutation is still running\",\n detail: \"Wait for the current save or send to finish.\",\n };\n }\n return composer.hasDraftContent()\n ? {\n id: \"ignored\",\n label: \"This session has an unsent draft\",\n detail: \"Continuing clears the account-bound composer state.\",\n }\n : null;\n });\n chatSendContext.current = {\n blocked: isTerminalSessionStatus(props.session.status)\n ? \"This chat has ended. Start a new chat to use a repository.\"\n : sessionReadOnlyArchive(props.session)\n ? \"This chat is read-only. Start a new chat to use a repository.\"\n : connectionAccounts.requiresAccountChoice\n ? \"Choose an account for this chat's connected tools in the composer first.\"\n : personalAttachment.requiresDecision\n ? \"Finish the personal access choice in the composer first.\"\n : null,\n awaitingHuman:\n props.session.status === \"requires_action\" && !sessionAdmissionBlocked(props.session),\n personalMachineIntent: personalMachineUseIntent(props.session.tenancy),\n extras: {\n ...(composer.policy ?? {}),\n ...((props.queue.effectiveControl ?? props.session.effectiveControl)?.controlEtag\n ? {\n controlEtag: (props.queue.effectiveControl ?? props.session.effectiveControl)!\n .controlEtag,\n }\n : {}),\n ...(connectionAccounts.selections.length > 0\n ? { connectionAccounts: connectionAccounts.selections }\n : {}),\n },\n };\n const composerPolicy = composer.policy;\n const [retryOperation, setRetryOperation] = useState<FailedSessionRetryInput | null>(null);\n const pendingRetryInput =\n retryOperation?.failureEventId === props.failure?.failureEventId ? retryOperation : null;\n // A failure before a logical turn exists cannot preserve an original intent.\n // Prefer detail evidence; paged timeline absence is not positive eligibility.\n const failureTurnId =\n props.session.failureDiagnostics?.eventId === props.failure?.failureEventId\n ? props.session.failureDiagnostics?.turnId\n : props.events.find((event) => event.id === props.failure?.failureEventId)?.turnId;\n const retryHasRetainedTurn = Boolean(failureTurnId);\n const retryFailedSession = useMemo(\n () =>\n createFailedSessionRetry(\n (input) => context.client.retrySession(props.session.workspaceId, props.session.id, input),\n setRetryOperation,\n ),\n [context.client, props.session.workspaceId, props.session.id],\n );\n const composerDraftLoading = composer.draftLoading;\n const setComposerModel = composer.setModel;\n const setComposerReasoningEffort = composer.setReasoningEffort;\n const setComposerLatencyMode = composer.setLatencyMode;\n const hasComposerPolicy = composerPolicy !== null;\n const modelPickerDisabled =\n composer.sending || composer.draftLoading || !hasComposerPolicy || Boolean(pendingRetryInput);\n const canChooseRecoveryModel = !modelPickerDisabled;\n // Free credit can still cover other models after this model's credit ran out.\n const creditGap = props.creditExhausted\n ? freeCreditGap(modelCatalog.rows, props.session.model, {\n selectedModel: composerPolicy?.model,\n preferredModel: modelCatalog.defaultSelection?.model,\n })\n : null;\n // Shown while the banner chunk loads or if it fails. On the free model the\n // generic daily-limit line then gives way to the free-model copy; that brief\n // text change keeps the free-model copy out of the direct session bundle.\n const failureFallback = props.failure ? (\n <div role=\"alert\" className=\"mx-auto my-2 w-full max-w-3xl px-4 text-sm text-fg-muted sm:px-6\">\n {\n failedSessionCopy(\n props.failure,\n props.creditExhausted && !props.failure.structuralSandboxFailure,\n Boolean(composerPolicy && composerPolicy.model !== props.session.model),\n canChooseRecoveryModel && !props.failure.structuralSandboxFailure,\n creditGap,\n ).reason\n }\n </div>\n ) : null;\n const model = composerPolicy?.model ?? props.session.model;\n const reasoningEffort = composerPolicy?.reasoningEffort ?? props.session.reasoningEffort;\n const latencyMode = composerPolicy?.latencyMode ?? props.session.latencyMode;\n const selectedPolicyRow = findPickerRow(modelCatalog.rows, model);\n // The banner's one-click switch: the same model, effort and speed coercion as the picker.\n const chooseCoveredModel = (id: string) => {\n const row = findPickerRow(modelCatalog.rows, id);\n const choice =\n row && !modelPickerDisabled ? coveredModelChoice(row, reasoningEffort, latencyMode) : null;\n if (!choice) return;\n setComposerModel(choice.model);\n setComposerReasoningEffort(choice.effort);\n if (choice.latencyMode !== null) setComposerLatencyMode(choice.latencyMode);\n };\n const matchesFrozenSessionPolicy = Boolean(\n composerPolicy &&\n composerPolicy.model === props.session.model &&\n composerPolicy.reasoningEffort === props.session.reasoningEffort &&\n composerPolicy.latencyMode === props.session.latencyMode,\n );\n const catalogComboValid = Boolean(\n selectedPolicyRow?.selectable &&\n (props.session.codexCompactionMode !== \"remote_v2\" ||\n selectedPolicyRow.catalog.source === \"codex\") &&\n effortOptionsForModel(selectedPolicyRow.catalog).includes(reasoningEffort) &&\n (latencyMode === \"standard\" ||\n runnableLatencyModesForModel(selectedPolicyRow.catalog).includes(latencyMode)),\n );\n // A model the catalog no longer lists (retired or removed) is refused by the\n // API, so the frozen session policy stops counting as sendable for it.\n const refusedSessionModel =\n refusedModel?.sessionId === props.session.id ? refusedModel.model : null;\n const composerModelUnavailable =\n model === refusedSessionModel ||\n sessionModelMissingFromCatalog({\n model,\n models: modelCatalog.models,\n error: modelCatalog.error,\n });\n const sessionModelUnavailable =\n props.session.model === refusedSessionModel ||\n sessionModelMissingFromCatalog({\n model: props.session.model,\n models: modelCatalog.models,\n error: modelCatalog.error,\n });\n // Only someone who can send may have the composer's model replaced: the\n // replacement is saved to their durable draft.\n const canControlSession = Boolean(\n context.accessContext.workspaceGrants\n .find((grant) => grant.workspaceId === props.session.workspaceId)\n ?.permissions.includes(\"sessions:control\"),\n );\n const composerPolicyValid = Boolean(\n composerPolicy &&\n (catalogComboValid || (matchesFrozenSessionPolicy && !composerModelUnavailable)),\n );\n const noRunnableModel =\n !modelCatalog.loading &&\n modelCatalog.rows.length > 0 &&\n !modelCatalog.rows.some((row) => row.selectable);\n const composerPolicyError =\n composerPolicy && !modelCatalog.loading && !composerPolicyValid && !noRunnableModel\n ? composerModelUnavailable\n ? \"This model is no longer available. Select a different model to continue.\"\n : \"Choose a model, reasoning level, and speed supported by this session.\"\n : null;\n composerPolicyValidRef.current = composerPolicyValid;\n\n // Preselect a runnable model for the next message when the composer still\n // names an unavailable one. Accepted turns and history keep their frozen\n // model; the notice above the input names the replacement.\n const unavailableReplacement = useMemo(\n () =>\n composerModelUnavailable || sessionModelUnavailable\n ? unavailableModelReplacement({\n rows: modelCatalog.rows,\n defaultSelection: modelCatalog.defaultSelection,\n latencyMode,\n codexOnly: props.session.codexCompactionMode === \"remote_v2\",\n })\n : null,\n [\n composerModelUnavailable,\n sessionModelUnavailable,\n modelCatalog.rows,\n modelCatalog.defaultSelection,\n latencyMode,\n props.session.codexCompactionMode,\n ],\n );\n useEffect(() => {\n if (!composerModelUnavailable || !unavailableReplacement) return;\n if (composerDraftLoading || !hasComposerPolicy || modelPickerDisabled || terminal) return;\n // A failed session keeps its model until the person chooses: the\n // failure banner's Retry re-runs that turn with the composer's model.\n if (!canControlSession || props.failure) return;\n setComposerModel(unavailableReplacement.model);\n setComposerReasoningEffort(unavailableReplacement.reasoningEffort);\n if (unavailableReplacement.latencyMode) {\n setComposerLatencyMode(unavailableReplacement.latencyMode);\n }\n }, [\n canControlSession,\n props.failure,\n composerDraftLoading,\n composerModelUnavailable,\n hasComposerPolicy,\n modelPickerDisabled,\n setComposerLatencyMode,\n setComposerModel,\n setComposerReasoningEffort,\n terminal,\n unavailableReplacement,\n ]);\n const unavailableModelNotice =\n (sessionModelUnavailable || composerModelUnavailable) && !terminal ? (\n <UnavailableModelNotice\n modelName={unavailableModelName(sessionModelUnavailable ? props.session.model : model)}\n replacementLabel={composerModelUnavailable ? null : (selectedPolicyRow?.label ?? null)}\n />\n ) : null;\n\n useEffect(() => {\n if (\n !launchKey ||\n appliedLaunchKeyRef.current === launchKey ||\n composerDraftLoading ||\n !hasComposerPolicy\n ) {\n return;\n }\n const hasPolicy = Boolean(launchModel || launchEffort || launchLatency);\n appliedLaunchKeyRef.current = launchKey;\n if (!hasPolicy) return;\n if (launchModel) setComposerModel(launchModel);\n if (launchEffort) setComposerReasoningEffort(launchEffort);\n if (launchLatency) setComposerLatencyMode(launchLatency);\n void navigate({\n to: \"/workspaces/$workspaceId/sessions/$sessionId\",\n params: {\n workspaceId: props.session.workspaceId,\n sessionId: props.session.id,\n },\n search: composerLaunchSearchAfterPolicyApply({\n model: launchModel,\n effort: launchEffort,\n latency: launchLatency,\n realtime: launchRealtime,\n }),\n replace: true,\n });\n }, [\n composerDraftLoading,\n hasComposerPolicy,\n launchEffort,\n launchKey,\n launchLatency,\n launchModel,\n launchRealtime,\n navigate,\n props.session.id,\n props.session.workspaceId,\n setComposerLatencyMode,\n setComposerModel,\n setComposerReasoningEffort,\n ]);\n const acceptedClientEventIds = useMemo(\n () =>\n new Set(\n props.events\n .filter((event) => event.type === \"user.message\" && event.clientEventId)\n .map((event) => event.clientEventId as string),\n ),\n [props.events],\n );\n const {\n optimisticMessages,\n retryOptimisticMessage,\n restoreOptimisticMessage,\n removeOptimisticMessage,\n } = composer;\n const failedOptimisticMessageCount = (optimisticMessages ?? []).filter(\n (message) => message.state === \"failed\" && !acceptedClientEventIds.has(message.clientEventId),\n ).length;\n useEffect(() => {\n updateLocalSessionDeliveryAttention({\n workspaceId: props.session.workspaceId,\n sessionId: props.session.id,\n failedMessageCount: failedOptimisticMessageCount,\n });\n }, [failedOptimisticMessageCount, props.session.id, props.session.workspaceId]);\n\n // The task's usage limit: one live read shared with the Agent tab, and the\n // calm composer notice near and at the limit. Enforcement is server-side;\n // this only keeps the view fresh.\n const usageLimitCapability = sessionUsageLimitCapability(context.clientConfig);\n const usageLimitTreeActive =\n props.session.status === \"running\" || lineageHasRunningSession(props.agentNodes);\n const usageLimit = useSessionUsageLimit({\n client: context.client,\n workspaceId: props.session.workspaceId,\n sessionId: props.session.id,\n initial: props.session.usageLimit,\n enabled: usageLimitCapability !== \"absent\",\n live: {\n events: props.events,\n active: usageLimitTreeActive,\n watch: props.agentNodes.length > 0,\n connectionState: props.connectionState,\n },\n });\n // A Send refused at the limit keeps its message (as a failed bubble with\n // Restore, never Retry). Reread the limit; until that answers, show reached.\n const refusedUsageLimitSendIds = (optimisticMessages ?? [])\n .filter(\n (message) =>\n message.state === \"failed\" &&\n message.error !== undefined &&\n !acceptedClientEventIds.has(message.clientEventId) &&\n isSessionUsageLimitSubmissionError(new Error(message.error)),\n )\n .map((message) => message.clientEventId)\n .join(\",\");\n const composerUsageLimitError =\n composer.error instanceof OpenGeniSessionUsageLimitReachedError ? composer.error : null;\n const [usageLimitRefusalPending, setUsageLimitRefusalPending] = useState(false);\n const refreshUsageLimit = usageLimit.refresh;\n useEffect(() => {\n if (!refusedUsageLimitSendIds && !composerUsageLimitError) return;\n setUsageLimitRefusalPending(true);\n void refreshUsageLimit().finally(() => setUsageLimitRefusalPending(false));\n }, [composerUsageLimitError, refreshUsageLimit, refusedUsageLimitSendIds]);\n const usageLimitRefusal = usageLimitRefusalFromState({\n pending: usageLimitRefusalPending,\n error: composerUsageLimitError,\n usage: usageLimit.usage,\n });\n const usageLimitChild =\n Boolean(props.session.parentSessionId) || usageLimit.usage?.inherited === true;\n const usageLimitRootId = usageLimit.usage?.rootSessionId ?? null;\n const usageLimitNotice =\n usageLimitCapability !== \"absent\" && !terminal ? (\n <SessionUsageLimitNotice\n usage={usageLimit.usage}\n stale={usageLimit.error !== null && usageLimit.usage !== null}\n refusal={usageLimitRefusal}\n onChangeLimit={!usageLimitChild && canControlSession ? props.onOpenUsageLimit : undefined}\n mainTaskHref={\n usageLimitChild && usageLimitRootId\n ? `/workspaces/${props.session.workspaceId}/sessions/${usageLimitRootId}`\n : undefined\n }\n goalPaused={props.goal.goal?.pausedReason === SESSION_USAGE_LIMIT_GOAL_PAUSED_REASON}\n dismissStorageKey={`opengeni:${props.session.workspaceId}`}\n />\n ) : null;\n const timelineWithOptimisticSends = useMemo<TimelineItem[]>(() => {\n return conversationTimeline(\n props.timeline,\n {\n queue: props.queue.queue,\n snapshot: props.queue.snapshot,\n acceptedSteers: props.queue.acceptedSteers,\n },\n {\n optimisticMessages,\n retryOptimisticMessage,\n restoreOptimisticMessage,\n removeOptimisticMessage,\n },\n );\n }, [\n optimisticMessages,\n removeOptimisticMessage,\n props.queue.acceptedSteers,\n props.queue.queue,\n props.queue.snapshot,\n props.timeline,\n retryOptimisticMessage,\n restoreOptimisticMessage,\n ]);\n const repositoryPickerProps = repositories.pickerProps(terminal || composer.sending);\n const admissionControl = admissionRecheckControl(\n props.admissionSessionControl,\n props.queue.effectiveControl,\n composer.effectiveControl,\n );\n const admissionRefreshRequired = admissionControlNeedsRefresh(\n admissionControl,\n props.admissionSessionControl,\n props.queue.effectiveControl,\n composer.effectiveControl,\n );\n const timelineWithStartup = useSessionStartupTimeline(timelineWithOptimisticSends, {\n session: { ...props.session, effectiveControl: admissionControl },\n events: props.events,\n optimisticMessages,\n hasNewer: props.hasNewer,\n queue: props.queue.snapshot,\n });\n const timelineEmptyStateCopy = sessionTimelineEmptyStateCopy(\n sessionDisplayStatus(props.session),\n (props.queue.effectiveControl ?? props.session.effectiveControl).state === \"paused\",\n );\n\n // Slash-command palette context: the operator controls (/goal, /clear,\n // /compact, /help) act on THIS session. Permissions come from the workspace\n // grant so the palette hides commands the operator can't run.\n const workspacePermissions = useMemo(\n () =>\n context.accessContext.workspaceGrants.find(\n (grant) => grant.workspaceId === props.session.workspaceId,\n )?.permissions ?? [],\n [context.accessContext.workspaceGrants, props.session.workspaceId],\n );\n const workspaceAccountId = context.workspaces.find(\n (candidate) => candidate.id === props.session.workspaceId,\n )?.accountId;\n // The chat's Secrets row: hidden when its agent can't use secrets.\n const sessionSecrets = useSessionSecrets(props.session.id, {\n enabled: workspacePermissions.includes(\"secrets:list\"),\n });\n const secretsView = sessionSecrets.secrets;\n const renderMessageSender = useMessageSenderRenderer(\n context.client,\n props.session.workspaceId,\n context.accessContext.subjectId,\n );\n const commandContext = useMemo(\n () => ({\n client: context.client,\n workspaceId: props.session.workspaceId,\n sessionId: props.session.id,\n status: props.session.status,\n permissions: workspacePermissions,\n }),\n [\n context.client,\n props.session.workspaceId,\n props.session.id,\n props.session.status,\n workspacePermissions,\n ],\n );\n\n const [forkEventId, setForkEventId] = useState<string | null>(null);\n const [turnRatings, setTurnRatings] = useState<Record<string, \"positive\" | \"negative\">>({});\n const mayRate = hasWorkspacePermission(\n context.accessContext,\n props.session.workspaceId,\n \"sessions:create\",\n );\n useEffect(() => {\n setTurnRatings({});\n setForkEventId(null);\n if (!mayRate) return;\n return loadSessionFeedback(\n context.client,\n props.session.workspaceId,\n props.session.id,\n ({ feedback }) => {\n const ratings = turnRatingsFromFeedback(feedback);\n setTurnRatings((saved) => ({ ...ratings, ...saved }));\n },\n );\n }, [\n context.client,\n props.session.workspaceId,\n props.session.id,\n mayRate,\n context.accessContext.subjectId,\n ]);\n const mayForkMessage =\n context.clientConfig.auth.mode === \"managedSession\" &&\n context.authSession !== null &&\n Boolean(props.session.tenancy) &&\n mayRate;\n // \"Fork chat\" from the ⌘K menu or the desktop menu bar forks from the latest\n // message, as the fork button under that message does.\n const forkRequests = useUiEventTarget(\"document\");\n const eventsRef = useRef(props.events);\n eventsRef.current = props.events;\n useEffect(() => {\n if (!mayForkMessage) return;\n const fork = () => {\n const events = eventsRef.current;\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const event = events[index]!;\n if (event.type === \"agent.message.completed\" || event.type === \"user.message\") {\n setForkEventId(event.id);\n return;\n }\n }\n };\n forkRequests.addEventListener(FORK_CURRENT_CHAT_EVENT, fork);\n return () => forkRequests.removeEventListener(FORK_CURRENT_CHAT_EVENT, fork);\n }, [forkRequests, mayForkMessage]);\n const onMessageRated = useCallback((turnId: string, sentiment: \"positive\" | \"negative\") => {\n setTurnRatings((saved) => ({ ...saved, [turnId]: sentiment }));\n }, []);\n const renderMessageActions = useCallback(\n (item: AgentMessageItem | UserMessageItem) => (\n <Suspense fallback={null}>\n <MessageActions\n item={item}\n client={context.client}\n workspaceId={props.session.workspaceId}\n sessionId={props.session.id}\n mayRate={mayRate}\n mayFork={mayForkMessage}\n savedSentiment={\n item.kind === \"agent-message\" && item.turnId ? (turnRatings[item.turnId] ?? null) : null\n }\n onRated={onMessageRated}\n onFork={setForkEventId}\n />\n </Suspense>\n ),\n [\n context.client,\n props.session.workspaceId,\n props.session.id,\n mayRate,\n mayForkMessage,\n turnRatings,\n onMessageRated,\n ],\n );\n\n const renderImage = useCallback(\n (image: { src: string; alt: string }) => {\n const artifactId = retainedImageId(image.src);\n return artifactId ? (\n <Suspense fallback={<span role=\"status\">Loading image…</span>}>\n <InlineChatArtifact\n key={props.session.workspaceId + \":\" + artifactId}\n workspaceId={props.session.workspaceId}\n artifactId={artifactId}\n alt={image.alt}\n />\n </Suspense>\n ) : null;\n },\n [props.session.workspaceId],\n );\n const renderInteractiveBlock = useCallback(\n (block: { kind: \"html\" | \"site\"; content: string }) => (\n <Suspense fallback={<span role=\"status\">Loading preview…</span>}>\n <ChatInteractiveBlock workspaceId={props.session.workspaceId} {...block} />\n </Suspense>\n ),\n [props.session.workspaceId],\n );\n\n const renderMessageText = useCallback(\n (\n text: string,\n item: AgentMessageItem | UserMessageItem,\n renderContext: { searchTarget: TimelineSearchTarget | null },\n ) => {\n if (item.kind === \"user-message\") {\n return (\n <UserMessageBody\n sessionId={props.session.id}\n workspaceId={props.session.workspaceId}\n item={item}\n searchTarget={renderContext.searchTarget}\n />\n );\n }\n return (\n <div data-testid=\"assistant-markdown\">\n <MarkdownText\n artifactHref={(id) => `/workspaces/${props.session.workspaceId}/artifacts/files/${id}`}\n text={text}\n searchTarget={renderContext.searchTarget}\n softLineBreaks\n streaming={item.kind === \"agent-message\" && item.streaming}\n onSandboxFile={props.onOpenSandboxFile}\n renderInteractiveBlock={renderInteractiveBlock}\n renderImage={renderImage}\n />\n </div>\n );\n },\n [\n props.onOpenSandboxFile,\n props.session.id,\n props.session.workspaceId,\n renderInteractiveBlock,\n renderImage,\n ],\n );\n\n const canBuyCredits =\n context.clientConfig.billingMode === \"stripe\" &&\n Boolean(workspaceAccountId) &&\n hasAccountPermission(context.accessContext, workspaceAccountId ?? \"\", \"billing:manage\");\n const canConnectModel = hasWorkspacePermission(\n context.accessContext,\n props.session.workspaceId,\n \"connections:write\",\n );\n const failureRecovery =\n !props.hasNewer &&\n props.failure &&\n (props.session.status === \"failed\" ||\n (props.creditExhausted && props.session.status === \"idle\")) ? (\n <FailureRecoveryBoundary key={props.session.id} fallback={failureFallback}>\n <Suspense fallback={failureFallback}>\n <LazyFailedSessionBanner\n key={props.session.id}\n failure={props.failure}\n shownInTimeline={timelineShowsFailure(timelineWithStartup, {\n failureEventId: props.failure.failureEventId,\n turnId: failureTurnId,\n })}\n analyticsKey={\n props.failure.failureEventId ??\n `${props.session.id}:${props.failure.failedAt ?? \"unknown\"}`\n }\n canChooseModel={canChooseRecoveryModel}\n hasModelPicker={hasComposerPolicy}\n freeModel={isDeploymentFreeModel(modelCatalog.rows, props.session.model)}\n subscriptions={connectableSubscriptions(context.clientConfig.models)}\n modelChanged={Boolean(composerPolicy && composerPolicy.model !== props.session.model)}\n creditExhausted={props.creditExhausted}\n freeCreditGap={creditGap}\n onChooseModel={chooseCoveredModel}\n workspaceId={props.session.workspaceId}\n canBuyCredits={canBuyCredits}\n canConnectModel={canConnectModel}\n sandboxRecovery={\n needsSandboxRecoveryCheck(props.session, props.failure.structuralSandboxFailure)\n ? {\n client: context.client,\n workspaceId: props.session.workspaceId,\n sessionId: props.session.id,\n canControl: workspacePermissions.includes(\"sessions:control\"),\n }\n : undefined\n }\n actions={{\n failureId: props.failure.failureEventId,\n retryInput: pendingRetryInput,\n composerBlocker: composerSendBlocker(),\n onRetry: async () => {\n if (\n composer.hasDraftContent() ||\n composerSendBlocker() ||\n !props.failure?.failureEventId ||\n !retryHasRetainedTurn ||\n !composerPolicy ||\n !workspacePermissions.includes(\"sessions:control\") ||\n admissionControl.state === \"paused\"\n )\n return false;\n try {\n return await retryFailedSession(props.failure.failureEventId, composerPolicy);\n } finally {\n await Promise.allSettled([props.onReloadSession(), props.queue.refresh()]);\n }\n },\n retryBlocker: !workspacePermissions.includes(\"sessions:control\")\n ? \"permission\"\n : admissionControl.state === \"paused\"\n ? \"paused\"\n : composer.hasDraftContent()\n ? \"draft\"\n : failedOptimisticMessageCount > 0\n ? \"unsent\"\n : (optimisticMessages ?? []).some(\n (message) => !acceptedClientEventIds.has(message.clientEventId),\n )\n ? \"delivery\"\n : props.session.activeTurnId !== null || props.queue.queue.length > 0\n ? \"queued\"\n : composer.sending ||\n composer.draftLoading ||\n !hasComposerPolicy ||\n !retryHasRetainedTurn ||\n !props.failure.failureEventId\n ? \"loading\"\n : null,\n }}\n />\n </Suspense>\n </FailureRecoveryBoundary>\n ) : null;\n // A refused Send names its model, the models the credit still covers, and the\n // next step above the composer. The credit-stop banner already says this.\n const sessionCreditRefusal =\n creditRefusal?.sessionId === props.session.id &&\n !terminal &&\n !(failureRecovery && props.creditExhausted)\n ? creditRefusal\n : null;\n // The plain refusal text shows while the notice chunk loads or if it fails.\n const creditRefusalFallback = sessionCreditRefusal ? (\n <p role=\"alert\" className=\"px-1.5 text-sm text-fg-muted\">\n {apiErrorFacts(sessionCreditRefusal.message).serverMessage ?? sessionCreditRefusal.message}\n </p>\n ) : null;\n const creditRefusalNotice = sessionCreditRefusal ? (\n <FailureRecoveryBoundary key={props.session.id} fallback={creditRefusalFallback}>\n <Suspense fallback={creditRefusalFallback}>\n <LazyCreditRefusalNotice\n gap={creditRefusalGap(modelCatalog.rows, sessionCreditRefusal.model, {\n selectedModel: composerPolicy?.model,\n preferredModel: modelCatalog.defaultSelection?.model,\n })}\n message={sessionCreditRefusal.message}\n workspaceId={props.session.workspaceId}\n canBuyCredits={canBuyCredits}\n canConnectModel={canConnectModel}\n onChooseModel={modelPickerDisabled ? undefined : chooseCoveredModel}\n onDismiss={() => setCreditRefusal(null)}\n />\n </Suspense>\n </FailureRecoveryBoundary>\n ) : null;\n\n const modelRecovery = props.hasNewer\n ? null\n : currentModelRecovery({ ...props.session, effectiveControl: admissionControl }, props.events);\n\n const reviewDetailPane = reviewDetails ? (\n <div className=\"min-h-0 flex-1 overflow-y-auto\" data-workspace-scroll-owner=\"self-managed\">\n <ToolActionReviewDetails\n key={reviewDetails.review.id + reviewDetails.path}\n review={reviewDetails.review}\n path={reviewDetails.path}\n load={loadToolReviewDetails}\n onBack={() => {\n const { review, path, origin } = reviewDetails;\n setReviewDetails(null);\n requestAnimationFrame(() => {\n const selector = `[data-approval-id=\"${CSS.escape(review.id)}\"]${origin ? `[data-review-origin=\"${CSS.escape(origin)}\"]` : \"\"} button[data-review-path=\"${CSS.escape(path)}\"]`;\n document.querySelector<HTMLElement>(selector)?.focus();\n });\n }}\n />\n </div>\n ) : null;\n\n return createElement(\n Fragment,\n null,\n reviewDetailPane,\n createElement(\n \"div\",\n { className: reviewDetails ? \"hidden\" : \"contents\", inert: reviewDetails ? true : undefined },\n createElement(\n LightboxProvider,\n null,\n <ChatViewportFileDropTarget\n data-workspace-scroll-owner=\"self-managed\"\n enabled={!terminal && context.clientConfig.fileUploads.enabled === true}\n onFiles={attachments.addFiles}\n >\n {findMounted ? (\n <Suspense fallback={null}>\n <ConversationFind\n workspaceId={props.session.workspaceId}\n sessionId={props.session.id}\n open={findOpen}\n focusRevision={findFocusRevision}\n initial={props.searchTarget}\n showBackToSessionSearch={props.searchTarget.searchOrigin === \"session-search\"}\n onClose={closeFind}\n onTarget={setActiveSearchTarget}\n onJump={props.onJumpToSequence}\n />\n </Suspense>\n ) : null}\n {cancelled ? (\n <div className=\"mx-auto w-full max-w-3xl px-4 pt-6 sm:px-6\">\n <TerminalSessionBanner session={props.session} onNewSession={props.onNewSession} />\n <TerminalSessionArchive session={props.session} eventCount={props.timeline.length} />\n </div>\n ) : readOnlyArchive ? (\n <div className=\"mx-auto w-full max-w-3xl px-4 pt-6 sm:px-6\">\n <ReadOnlySessionNotice\n session={props.session}\n idleDays={context.clientConfig.sessionArchive?.idleDays}\n onNewSession={props.onNewSession}\n />\n </div>\n ) : null}\n {\n <>\n <div data-testid=\"session-timeline\" className=\"min-h-0 min-w-0 flex-1\">\n <LearningRefusalActionsProvider onOpen={props.onLearningRefusalOpen}>\n <KnowledgeActivityProvider\n onInspect={props.onMemoryClick}\n onRetryFile={(fileId) =>\n composer.send(\n `Retry searchable source preparation for attached file ${fileId}. Use knowledge_retain_file and report its result.`,\n )\n }\n retryDisabled={\n composer.hasDraftContent() ||\n composer.sending ||\n composer.draftLoading ||\n !hasComposerPolicy\n }\n >\n <ToolReviewHistoryProvider\n events={props.events}\n load={loadRecordedToolReview}\n onViewDetails={viewToolReviewDetails}\n >\n <MessageTimeline\n resolveLink={consoleLinkResolver}\n renderMessageSender={renderMessageSender}\n allowanceExhaustedLabels={CONSOLE_TIMELINE_ALLOWANCE_LABELS}\n trailingState={\n <>\n {/* Recovery follows the failed request, only in the latest history window.\n Credit exhaustion also surfaces on idle sessions. */}\n {failureRecovery}\n {props.approvals.length > 0 &&\n props.session.status === \"requires_action\" && (\n <ApprovalSurface\n approvals={props.approvals}\n selectedApprovalId={selectedApprovalId}\n onSelectedApprovalChange={setSelectedApprovalId}\n loadReview={loadToolReview}\n onViewDetails={viewToolReviewDetails}\n onApprove={(approval) => decideApproval(approval.id, \"approve\")}\n onReject={(approval) => decideApproval(approval.id, \"reject\")}\n />\n )}\n <Suspense fallback={null}>\n <SessionSkillReviews\n key={`${context.accessContext.subjectId}:${props.session.workspaceId}:${props.session.id}`}\n context={context}\n workspaceId={props.session.workspaceId}\n sessionId={props.session.id}\n events={props.events}\n />\n </Suspense>\n {props.humanInput.requests.length > 0 &&\n props.session.status === \"requires_action\" ? (\n <div className=\"pb-1\" data-human-input-timeline-surface=\"\">\n <Suspense fallback={<LoadingPanel label=\"Loading questions…\" />}>\n <HumanInputSurface\n loadSkillReview={loadSkillReview}\n allowedSaveTo={secretSaveTargets(\n context.accessContext,\n props.session.workspaceId,\n )}\n requests={props.humanInput.requests}\n respondingRequestId={props.humanInput.respondingRequestId}\n error={props.humanInput.mutationError?.message}\n onSubmit={async (requestId, response) => {\n // A failed send resolves null. Reject so the card\n // keeps what was typed (including a secret) to retry.\n if (!(await props.humanInput.respond(requestId, response))) {\n throw new Error(\"Your answer wasn't sent. Try again.\");\n }\n }}\n />\n </Suspense>\n </div>\n ) : null}\n </>\n }\n turnSummary={{ rolling: true }}\n key={props.session.id}\n className=\"h-full\"\n items={timelineWithStartup}\n searchTarget={activeSearchTarget}\n focusSequence={momentSequence}\n events={props.events}\n status={props.session.status}\n computeLabel={computeLabel}\n renderMessageText={renderMessageText}\n renderMessageActions={renderMessageActions}\n onAnnotate={composer.addAnnotation}\n draftAnnotations={composer.annotations}\n onDraftAnnotationSelect={composer.requestAnnotationReview}\n onOpenSession={props.onOpenSession}\n resolveSessionTitle={props.resolveSessionTitle}\n onMemoryClick={props.onMemoryClick}\n onReconnect={props.onReconnect}\n renderAuthNeeded={renderAuthNeeded}\n resolveProviderLogo={props.resolveProviderLogo}\n loadRetainedScreenshot={loadRetainedScreenshot}\n loadRetainedArtifact={loadRetainedArtifact}\n loadVideoArtifactPlayback={loadVideoArtifactPlayback}\n hasOlder={props.hasOlder}\n loadingOlder={props.loadingOlder}\n onLoadOlder={props.onLoadOlder}\n hasNewer={props.hasNewer}\n loadingNewer={props.loadingNewer}\n onLoadNewer={props.onLoadNewer}\n loadingOldest={props.loadingOldest}\n onJumpToStart={async () => {\n await props.onJumpToStart();\n }}\n onJumpToLatest={props.onJumpToLatest}\n emptyState={\n // Clear view hides history, not the retained failure or retry operation.\n failureRecovery ??\n (props.queue.stoppingPreviousAttempt ? (\n <EmptyState\n className=\"min-h-[24rem]\"\n icon={\n <Loader2Icon className=\"size-4 animate-spin motion-reduce:animate-none\" />\n }\n title={\n props.queue.effectiveControl?.state === \"paused\"\n ? \"Stopping current work\"\n : \"Stopping previous work\"\n }\n description={\n props.queue.effectiveControl?.state === \"paused\"\n ? \"Waiting for the current command to stop safely. Queued work stays saved.\"\n : \"Your direction is saved. It starts after the previous command stops safely.\"\n }\n />\n ) : props.initialLoading ? (\n <div className=\"flex min-h-[24rem]\">\n <LoadingPanel />\n </div>\n ) : props.historyReloadFailed ? (\n <ProblemPanel\n title=\"Conversation couldn't be loaded\"\n description=\"Your saved messages are unchanged. Try loading them again.\"\n action={\n <Button\n variant=\"outline\"\n onClick={() => void props.onJumpToLatest()}\n >\n Retry conversation\n </Button>\n }\n />\n ) : (\n <EmptyState\n className=\"min-h-[24rem]\"\n icon={\n props.session.status === \"running\" ||\n props.session.status === \"recovering\" ? (\n <Loader2Icon className=\"size-4 animate-spin motion-reduce:animate-none\" />\n ) : (\n <MessagesSquareIcon className=\"size-4\" />\n )\n }\n title={timelineEmptyStateCopy.title}\n description={timelineEmptyStateCopy.description}\n />\n ))\n }\n />\n </ToolReviewHistoryProvider>\n </KnowledgeActivityProvider>\n </LearningRefusalActionsProvider>\n </div>\n </>\n }\n\n {forkEventId ? (\n <Suspense fallback={null}>\n <MessageForkDialog\n key={forkEventId}\n session={props.session}\n events={props.events}\n sourceEventId={forkEventId}\n onForkClose={() => setForkEventId(null)}\n />\n </Suspense>\n ) : null}\n\n {modelRecovery ? <ModelRecoveryNotice recovery={modelRecovery} /> : null}\n\n {props.session.inputWait &&\n props.session.status === \"idle\" &&\n admissionControl.state === \"active\" ? (\n <Suspense fallback={null}>\n <LazySessionWaitStatus session={props.session} />\n </Suspense>\n ) : null}\n\n {/* Compact session chrome above the composer — incoming, queue, goal,\n and agents as one dock. Hides entirely when there are no signals. */}\n <div className=\"mb-2 w-full shrink-0 px-4 sm:px-6\">\n <div className=\"mx-auto w-full max-w-3xl\">\n <SessionAdmissionNotice\n key={`${props.session.workspaceId}:${props.session.id}`}\n session={props.session}\n machineAccess={machineAccess}\n machineAction={\n <SessionMachinePickerAction\n queuedWork\n runsOn={runsOn}\n workspaceId={props.session.workspaceId}\n rigId={props.session.rigId}\n move={moveRunsOn}\n />\n }\n canControl={workspacePermissions.includes(\"sessions:control\")}\n paused={admissionControl.state === \"paused\"}\n refreshRequired={admissionRefreshRequired}\n busy={\n composer.resuming || composer.pausing || composer.sending || props.queue.mutating\n }\n onRecheck={() =>\n recheckSessionAdmission({\n control: admissionControl,\n refreshOnly: admissionRefreshRequired,\n resume: (control) =>\n context.client.resumeSession(props.session.workspaceId, props.session.id, {\n clientEventId: crypto.randomUUID(),\n expectedControlEtag: control.controlEtag,\n }),\n refresh: [props.onReloadSession, props.queue.refresh],\n })\n }\n />\n <SessionChrome\n sessionStatus={props.session.status}\n onOpenSession={props.onOpenSession}\n queue={props.queue}\n composer={terminal ? undefined : composer}\n goal={props.goal}\n readOnly={terminal}\n commandsCount={props.session.backgroundCommandActivity?.count ?? 0}\n commandsPanel={\n <Suspense fallback={<LoadingPanel label=\"Loading commands…\" />}>\n <SessionCommands\n key={props.session.id}\n sessionId={props.session.id}\n readOnly={terminal}\n />\n </Suspense>\n }\n agentsSignal={agentsSignal}\n agentsPanel={\n props.agentNodes.length > 0 ? (\n <Suspense fallback={<LoadingPanel label=\"Loading agents…\" />}>\n <SubagentTree\n workspaceId={props.session.workspaceId}\n nodes={props.agentNodes}\n />\n </Suspense>\n ) : null\n }\n />\n </div>\n </div>\n\n {/* A read-only chat can't continue: its notice offers a new chat instead. */}\n <div\n ref={composerRegionRef}\n data-read-only-composer={readOnlyArchive ? \"hidden\" : undefined}\n className={`shrink-0 px-4 pb-4 pt-1 sm:px-6${readOnlyArchive ? \" hidden\" : \"\"}`}\n >\n <div className=\"mx-auto w-full max-w-3xl\">\n <PersonalResourceAttachmentSurface\n controller={personalAttachment}\n disabled={terminal || composer.sending}\n compact\n />\n <ConsoleComposer\n workspaceId={props.session.workspaceId}\n usageRefreshKey={props.session.status}\n composer={composer}\n attachments={attachments}\n effectiveControl={composer.effectiveControl}\n queuedAheadCount={props.queue.queue.length}\n canControlWorkspace={workspacePermissions.includes(\"workspace:admin\")}\n controlLinks={{\n workspaceHref: `/workspaces/${props.session.workspaceId}`,\n sessionHref: (sessionId) =>\n `/workspaces/${props.session.workspaceId}/sessions/${sessionId}`,\n }}\n disabled={terminal}\n header={\n unavailableModelNotice ||\n usageLimitNotice ||\n creditRefusalNotice ||\n (machineAccess && !machineAccess.isOwner) ? (\n <>\n {!sessionAdmissionNeedsDifferentMachine(\n sessionAdmissionReason(props.session),\n machineAccess,\n ) ? (\n <SessionMachineAccessNotice\n access={machineAccess}\n action={\n <SessionMachinePickerAction\n runsOn={runsOn}\n workspaceId={props.session.workspaceId}\n rigId={props.session.rigId}\n move={moveRunsOn}\n />\n }\n />\n ) : null}\n {unavailableModelNotice}\n {usageLimitNotice}\n {creditRefusalNotice ? (\n <div className=\"px-2 pt-2\">{creditRefusalNotice}</div>\n ) : null}\n </>\n ) : null\n }\n commandContext={commandContext}\n onClearView={props.onClearView}\n fileUploadsEnabled={context.clientConfig.fileUploads.enabled === true}\n transcriptionSuppressed={voiceActive}\n controlsLeading={\n <>\n <ComposerMobilePlus\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:\n terminal ||\n composer.sending ||\n durableToolsSaving ||\n !durableToolsHydrated,\n },\n }}\n chatSettings={\n props.onOpenAgentSettings\n ? {\n workspaceId: props.session.workspaceId,\n sessionId: props.session.id,\n scope: chatLearningScope(\n props.session,\n isPersonalWorkspace(workspace, context.managedSelfContext),\n ),\n canEdit: workspacePermissions.includes(\"sessions:control\"),\n onOpen: props.onOpenAgentSettings,\n }\n : undefined\n }\n workspaceId={props.session.workspaceId}\n disabled={terminal || composer.sending}\n fileUploadsEnabled={context.clientConfig.fileUploads.enabled === true}\n servers={selectableSessionMcpServers}\n firstPartyTools={firstPartyToolOptions}\n selection={durableToolSelection}\n toolsSaving={durableToolsSaving}\n toolsDisabled={\n composer.sending || terminal || durableToolsSaving || !durableToolsHydrated\n }\n connectorCustomizing={connectorCustomizing}\n onConnectorCustomizingChange={(next) => {\n setConnectorCustomizingOverride(next);\n if (next) return;\n connectionAccounts.resetEmptyChoices();\n void applyDurableToolPolicy(\n followWorkspaceConnectorPolicy(durableToolsSnapshot),\n );\n }}\n onToolSelectionChange={(next) => void saveDurableToolPolicy(next)}\n {...(secretsView?.capabilityEnabled\n ? {\n secrets: {\n summary: sessionSecretsSummary(\n secretsView.policy,\n secretsView.reachableVaults,\n ),\n panel: (\n <SessionSecretsMenuBody\n vaults={secretsView.reachableVaults}\n policy={secretsView.policy}\n narrowedByParent={secretsView.narrowedBySessionId !== null}\n taskItems={secretsView.taskItems}\n canEdit={workspacePermissions.includes(\"sessions:control\")}\n disabled={terminal}\n loading={sessionSecrets.loading}\n error={sessionSecrets.error}\n onRetry={() => void sessionSecrets.refresh()}\n onPolicyChange={async (policy) => {\n await sessionSecrets.api.setSessionVaultPolicy(\n props.session.id,\n policy,\n );\n await sessionSecrets.refresh();\n }}\n onSaveTo={async (item, target) => {\n await sessionSecrets.api.moveItem(item.vaultId, item.id, {\n targetVaultId: target.id,\n mode: \"copy\",\n });\n toast.success(`Saved ${item.name} to ${target.name}`);\n }}\n onManage={() =>\n void navigate({\n to: \"/workspaces/$workspaceId/secrets\",\n params: { workspaceId: props.session.workspaceId },\n })\n }\n />\n ),\n },\n }\n : {})}\n repositories={{\n selectedCount: repositories.selectionCount,\n disabled: terminal || composer.sending,\n panel: <FollowUpRepositoryMenuBody {...repositoryPickerProps} />,\n }}\n {...(runsOn.hasChoices ||\n props.session.rigId ||\n (runsOn.activeMachine && !runsOn.activeMachine.isSessionGroup)\n ? {\n runsOn: {\n summary: runsOn.activeName,\n panel: (\n <SessionRunsOnMenuBody\n runsOn={runsOn}\n workspaceId={props.session.workspaceId}\n rigId={props.session.rigId ?? null}\n move={moveRunsOn}\n />\n ),\n },\n }\n : {})}\n />\n </>\n }\n actions={\n !terminal ? (\n <Suspense fallback={null}>\n <LazyCodexRealtimeControl\n client={realtimeClient}\n workspaceId={props.session.workspaceId}\n sessionId={props.session.id}\n sessionStatus={props.session.status}\n effectiveControl={\n props.queue.effectiveControl ?? props.session.effectiveControl\n }\n events={props.events}\n eventsReady={!props.initialLoading}\n codexConnected={codexConnected}\n realtimeAutostartModel={props.realtimeAutostartModel}\n onRealtimeAutostartConsumed={props.onRealtimeAutostartConsumed}\n onVoiceActiveChange={onVoiceActiveChange}\n />\n </Suspense>\n ) : null\n }\n placeholder={\n props.session.status === \"cancelled\"\n ? \"This session was cancelled.\"\n : props.creditExhausted &&\n (props.session.status === \"failed\" || props.session.status === \"idle\")\n ? // \"Send a message to revive\" is a dead end without credits —\n // the reply turn dies the same budget death. With free\n // credit left for other models, a covered model revives it.\n creditGap\n ? creditGap.selectionUsable\n ? \"Send a follow-up…\"\n : \"Your free credits don't cover this model — choose another model or add credits.\"\n : \"Out of Opengeni credits — add credits to continue.\"\n : \"Send a follow-up…\"\n }\n controls={\n <div className=\"@container/model-controls flex min-w-0 flex-1 items-center gap-1.5\">\n <ModelPicker\n hasImageAttachments={attachments.attachments.some(\n (file) => file.status !== \"failed\" && file.contentType.startsWith(\"image/\"),\n )}\n open={modelPickerSession === props.session.id && !pendingRetryInput}\n onOpenChange={(open) => {\n setModelPickerSession(open ? props.session.id : null);\n if (open) void modelCatalog.refresh();\n }}\n rows={modelCatalog.rows}\n model={model}\n effort={reasoningEffort}\n latencyMode={latencyMode}\n disabled={modelPickerDisabled}\n loading={modelCatalog.loading || composer.draftLoading}\n error={modelCatalog.error ?? composerPolicyError}\n sessionKey={props.session.id}\n menuSide=\"top\"\n connectModelsHref={`/workspaces/${encodeURIComponent(props.session.workspaceId)}/settings?section=models`}\n codexOnly={props.session.codexCompactionMode === \"remote_v2\"}\n onModelChange={composer.setModel}\n onEffortChange={composer.setReasoningEffort}\n onLatencyModeChange={composer.setLatencyMode}\n />\n {durableToolsError ? (\n <span className=\"sr-only\" role=\"alert\">\n {durableToolsError}\n </span>\n ) : null}\n </div>\n }\n />\n </div>\n </div>\n </ChatViewportFileDropTarget>,\n ),\n ),\n );\n}\n\n/** The model a \"model is not available\" refusal named: the API detail, else the attempted input. */\nfunction refusedModelId(error: Error, input: unknown): string | null {\n const details = (error as { details?: Record<string, unknown> | undefined }).details;\n if (typeof details?.modelId === \"string\" && details.modelId) return details.modelId;\n const attempted = (input as { model?: unknown } | null)?.model;\n return typeof attempted === \"string\" && attempted ? attempted : null;\n}\n"],"mappings":"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","names":["Fragment","returnPath","response"]}
|