@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/components/rail/session-shell.tsx"],"sourcesContent":["// The session shell every session surface renders: the left rail (fixed and\n// resizable on desktop, an overlay drawer on phones), the canvas top strip with\n// the session header on session routes, and the canvas itself. Surface-owned\n// sections (workspace switcher, navigation extras, footer, banners) come in as\n// slots, so the web app and embeds share one shell and differ only in what they\n// put in it.\nimport type { SessionSummary } from \"@opengeni/sdk\";\nimport { MenuIcon, MessagesSquareIcon, Settings2Icon } from \"lucide-react\";\nimport {\n useCallback,\n useContext,\n useEffect,\n lazy,\n useId,\n useRef,\n useState,\n useSyncExternalStore,\n Suspense,\n type PointerEvent as ReactPointerEvent,\n type ReactNode,\n type RefObject,\n} from \"react\";\nimport { toast } from \"../../lib/toast\";\n\nimport { findPickerRow } from \"../../../model-policy\";\nimport { useLastStartedTurnPolicy } from \"../../../hooks/use-last-started-turn-policy\";\nimport { useSessionLineage } from \"../../../hooks/use-session-lineage\";\nimport { BrandMark, Wordmark } from \"../brand-mark\";\nimport { SessionHeader } from \"./session-header\";\nimport { SessionStartupProvider } from \"../../../lib/session-startup\";\nimport {\n requestSessionUsageLimitEditor,\n sessionUsageLimitCapability,\n} from \"../../lib/session-usage-limit\";\nimport { RAIL_DEFAULT_WIDTH, RAIL_MAX_WIDTH, RAIL_MIN_WIDTH, useRail } from \"./rail-context\";\nimport { CollapsedSessionsButton, SessionList } from \"./session-list\";\nimport {\n PrimaryNav,\n RailHeader,\n SessionShellSlotsContext,\n type SessionShellSlots,\n} from \"./rail-sections\";\n\nexport {\n PrimaryNav,\n RailHeader,\n SessionShellSlotsProvider,\n type SessionShellSlots,\n} from \"./rail-sections\";\nimport {\n SessionComputeIndicator,\n sessionSupportsFleetSwitching,\n} from \"../session/sandbox-switcher\";\nimport { CodexAccountIndicator } from \"../session/codex-account-indicator\";\nimport { ModelAccountIndicator } from \"../session/model-account-indicator\";\nimport { PrivateSessionIndicator } from \"../session/private-session-indicator\";\nimport { Button } from \"../../../ui/button\";\nimport { Sheet, SheetContent, SheetDescription, SheetTitle } from \"../../../ui/sheet\";\nimport { TooltipProvider } from \"../../../ui/tooltip\";\nimport { Link, useNavigate, useRouterState } from \"../../lib/navigation\";\nimport { useWorkspaceModelCatalog } from \"../../lib/use-workspace-model-catalog\";\nimport { useAppContext } from \"../../app-context\";\nimport { isPersonalWorkspace } from \"../../lib/managed-self-context\";\nimport { isCodexProductModel } from \"../../lib/session-model\";\nimport { isIntelligenceEffort } from \"../../lib/session-tools\";\nimport { useSessionRepliesMute } from \"../../lib/inbox\";\nimport { useSessionAdminAccess } from \"../session/session-admin-access\";\nimport { applySessionArchiveProjection } from \"../../lib/session-pagination\";\nimport { notifySessionListChanged } from \"../../lib/session-list-invalidation\";\nimport type { Session } from \"../../types\";\nimport { cn } from \"../../lib/utils\";\nimport { windowControlsInPage } from \"../../lib/desktop\";\nimport { useSessionUiFeature } from \"../../lib/session-ui-features\";\nimport { useUiEventTarget } from \"../../lib/ui-events\";\n\nconst LazySessionTenancyRouteControl = lazy(() =>\n import(\"../session/session-tenancy-control\").then(({ SessionTenancyRouteControl }) => ({\n default: SessionTenancyRouteControl,\n })),\n);\n\n/** The rail body — shared between the fixed desktop column and the mobile drawer. */\nexport function RailBody() {\n const rail = useRail();\n const { switcher, mobileWorkspacePanel, railFooter } = useContext(SessionShellSlotsContext);\n const [mobileSection, setMobileSection] = useState<\"sessions\" | \"workspace\">(\"sessions\");\n const sessionsTabRef = useRef<HTMLButtonElement>(null);\n const workspaceTabRef = useRef<HTMLButtonElement>(null);\n // Unique per app, so two apps on one page never share these ids.\n const mobileNavId = `mobile-nav-${useId().replaceAll(\":\", \"\")}`;\n useEffect(() => {\n if (rail.drawerOpen) setMobileSection(\"sessions\");\n }, [rail.drawerOpen]);\n const moveMobileTab = (section: \"sessions\" | \"workspace\") => {\n setMobileSection(section);\n window.requestAnimationFrame(() =>\n (section === \"sessions\" ? sessionsTabRef : workspaceTabRef).current?.focus(),\n );\n };\n return (\n <div\n data-rail\n className=\"og-rail-glow isolate flex h-full min-h-0 flex-col overflow-hidden pt-[env(safe-area-inset-top)]\"\n >\n {/* Native macOS controls sit over this row. Keep it outside the clipped\n viewport so navigation cannot scroll underneath them. */}\n {windowControlsInPage ? (\n <div data-rail-window-controls className=\"relative z-10 shrink-0 pb-3\">\n <RailHeader showSwitcher={false} />\n </div>\n ) : null}\n <div\n data-rail-scroll-viewport\n className=\"relative z-0 min-h-0 flex-1 overflow-x-hidden overflow-y-auto overscroll-y-contain\"\n >\n <div className=\"flex min-h-full flex-col\">\n {!windowControlsInPage ? <RailHeader /> : null}\n\n {rail.collapsed || windowControlsInPage ? switcher : null}\n\n {rail.isMobile && mobileWorkspacePanel ? (\n <>\n <div\n role=\"tablist\"\n aria-label=\"Navigation section\"\n onKeyDown={(event) => {\n if (event.key === \"ArrowLeft\" || event.key === \"Home\") {\n event.preventDefault();\n moveMobileTab(\"sessions\");\n } else if (event.key === \"ArrowRight\" || event.key === \"End\") {\n event.preventDefault();\n moveMobileTab(\"workspace\");\n }\n }}\n className=\"mx-3 mt-3 grid shrink-0 grid-cols-2 rounded-lg bg-surface-2/70 p-1\"\n >\n <button\n ref={sessionsTabRef}\n id={`${mobileNavId}-tab-sessions`}\n type=\"button\"\n role=\"tab\"\n aria-selected={mobileSection === \"sessions\"}\n aria-controls={`${mobileNavId}-panel-sessions`}\n tabIndex={mobileSection === \"sessions\" ? 0 : -1}\n onClick={() => setMobileSection(\"sessions\")}\n className={cn(\n \"flex h-10 items-center justify-center gap-2 rounded-md text-sm font-normal transition-colors\",\n mobileSection === \"sessions\"\n ? \"bg-surface-3 text-fg shadow-sm\"\n : \"text-fg-label hover:text-fg\",\n )}\n >\n <MessagesSquareIcon className=\"size-4\" />\n Sessions\n </button>\n <button\n ref={workspaceTabRef}\n id={`${mobileNavId}-tab-workspace`}\n type=\"button\"\n role=\"tab\"\n aria-selected={mobileSection === \"workspace\"}\n aria-controls={`${mobileNavId}-panel-workspace`}\n tabIndex={mobileSection === \"workspace\" ? 0 : -1}\n onClick={() => setMobileSection(\"workspace\")}\n className={cn(\n \"flex h-10 items-center justify-center gap-2 rounded-md text-sm font-normal transition-colors\",\n mobileSection === \"workspace\"\n ? \"bg-surface-3 text-fg shadow-sm\"\n : \"text-fg-label hover:text-fg\",\n )}\n >\n <Settings2Icon className=\"size-4\" />\n Workspace\n </button>\n </div>\n {mobileSection === \"sessions\" ? (\n <div\n id={`${mobileNavId}-panel-sessions`}\n role=\"tabpanel\"\n aria-labelledby={`${mobileNavId}-tab-sessions`}\n className=\"mt-2 flex shrink-0 flex-col\"\n >\n <PrimaryNav />\n <SessionList />\n </div>\n ) : (\n <div\n id={`${mobileNavId}-panel-workspace`}\n role=\"tabpanel\"\n aria-labelledby={`${mobileNavId}-tab-workspace`}\n className=\"mt-2 flex shrink-0 flex-col border-t border-border pt-2\"\n >\n {mobileWorkspacePanel}\n </div>\n )}\n </>\n ) : (\n <>\n {/* Sessions are the primary object. Workspace administration remains\n secondary on desktop and becomes its own screen on phones. */}\n <PrimaryNav />\n <div className=\"mt-2 flex shrink-0 flex-col\">\n {rail.collapsed ? <CollapsedSessionsButton /> : <SessionList />}\n </div>\n </>\n )}\n </div>\n </div>\n {/* Keep the persistent controls above the scroll viewport, including\n session-row actions with their own stacking levels. The footer is a\n sibling of the clipped viewport, so it can stay transparent and let\n the rail glow run to the bottom edge. */}\n {railFooter ? (\n <div data-rail-footer className=\"relative z-10 shrink-0 border-t border-border\">\n {railFooter}\n </div>\n ) : null}\n </div>\n );\n}\n\n/**\n * The drag handle on the expanded rail's right edge. A quiet, wide-ish hit area\n * straddling the border: at rest it's invisible (the border is the only line);\n * on hover it thickens into a stronger line, and while dragging it wears the\n * brand tint. Double-click snaps back to the default width. Keyboard users get\n * the collapse toggle elsewhere; this is a pointer affordance (hidden from the\n * a11y tree beyond its separator role + label).\n */\nfunction RailResizeHandle({\n onStart,\n active,\n}: {\n onStart: (event: ReactPointerEvent) => void;\n active: boolean;\n}) {\n const rail = useRail();\n return (\n <div\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label=\"Resize sidebar\"\n onPointerDown={onStart}\n onDoubleClick={() => rail.setWidth(RAIL_DEFAULT_WIDTH)}\n className=\"group absolute inset-y-0 -right-1 z-20 w-2 cursor-col-resize touch-none select-none\"\n >\n <span\n className={cn(\n \"absolute inset-y-0 right-1 w-px transition-[width,background-color] duration-150\",\n active\n ? \"w-0.5 bg-brand/70\"\n : \"bg-transparent group-hover:w-0.5 group-hover:bg-border-strong\",\n )}\n />\n </div>\n );\n}\n\nconst NO_SLOTS: SessionShellSlots = {};\n\nexport function SessionShell({\n children,\n slots = NO_SLOTS,\n}: {\n children: ReactNode;\n slots?: SessionShellSlots | undefined;\n}) {\n return (\n <SessionShellSlotsContext.Provider value={slots}>\n <SessionShellFrame>{children}</SessionShellFrame>\n </SessionShellSlotsContext.Provider>\n );\n}\n\nfunction SessionShellFrame({ children }: { children: ReactNode }) {\n const rail = useRail();\n const chatList = useSessionUiFeature(\"chatList\");\n const context = useAppContext();\n const { canvasBanners } = useContext(SessionShellSlotsContext);\n const pathname = useRouterState({\n select: (state) => state.location.pathname,\n });\n // Focus returns here when the mobile drawer closes (D9.1): the drawer is a\n // controlled Sheet with no in-tree trigger, so radix can't restore focus on\n // its own — we point it back at the hamburger that opened it.\n const hamburgerRef = rail.drawerTriggerRef;\n\n // Live width while the reader drags the resize handle. Held locally (not in\n // context) so we don't write localStorage on every pointer move — the chosen\n // width is committed once on pointer-up. `null` means \"not resizing\".\n const [liveWidth, setLiveWidth] = useState<number | null>(null);\n const resizing = liveWidth !== null;\n // Teardown for an in-progress drag (remove window listeners + reset body\n // styles). Held in a ref so an unmount / route change MID-DRAG can run it —\n // otherwise the listeners and the col-resize cursor / no-select body styles\n // linger until an unrelated pointer release elsewhere.\n const endResizeRef = useRef<(() => void) | null>(null);\n const startResize = useCallback(\n (event: ReactPointerEvent) => {\n // Ignore anything but a primary-button / touch drag.\n if (event.button !== 0) {\n return;\n }\n event.preventDefault();\n const startX = event.clientX;\n const startWidth = rail.width;\n const clamp = (w: number) =>\n Math.min(RAIL_MAX_WIDTH, Math.max(RAIL_MIN_WIDTH, Math.round(w)));\n setLiveWidth(startWidth);\n document.body.style.userSelect = \"none\";\n document.body.style.cursor = \"col-resize\";\n const onMove = (moveEvent: PointerEvent) =>\n setLiveWidth(clamp(startWidth + (moveEvent.clientX - startX)));\n const teardown = () => {\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onUp);\n document.body.style.userSelect = \"\";\n document.body.style.cursor = \"\";\n endResizeRef.current = null;\n };\n const onUp = (upEvent: PointerEvent) => {\n rail.setWidth(clamp(startWidth + (upEvent.clientX - startX)));\n setLiveWidth(null);\n teardown();\n };\n endResizeRef.current = teardown;\n window.addEventListener(\"pointermove\", onMove);\n window.addEventListener(\"pointerup\", onUp);\n },\n [rail],\n );\n // Unmount / route-change mid-drag: run the drag teardown so listeners and\n // body styles never leak.\n useEffect(() => () => endResizeRef.current?.(), []);\n\n // Close the mobile drawer on route change.\n useEffect(() => {\n if (rail.drawerOpen) {\n rail.setDrawerOpen(false);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pathname]);\n\n return (\n <TooltipProvider delayDuration={300}>\n <div\n className=\"flex h-full min-h-0 w-full flex-1 overflow-hidden\"\n // Lets page chrome (the desktop title bar) follow the rail without a\n // document-wide `:has()` selector.\n data-rail-collapsed={chatList && !rail.isMobile && rail.collapsed ? \"true\" : undefined}\n >\n {/* Fixed desktop rail — user-resizable when expanded. */}\n {chatList && !rail.isMobile ? (\n <nav\n aria-label=\"Primary\"\n data-collapsed={rail.collapsed}\n style={rail.collapsed ? undefined : { width: resizing ? liveWidth! : rail.width }}\n className={cn(\n \"relative shrink-0 border-r border-border\",\n // Animate the collapse/expand toggle, but never while dragging — a\n // transition there would lag the handle behind the pointer.\n !resizing && \"motion-safe:transition-[width] motion-safe:duration-150\",\n rail.collapsed && \"w-[56px]\",\n )}\n >\n <RailBody />\n {/* The drag handle only exists on the expanded desktop rail; the\n collapsed strip and the mobile drawer are fixed-width. */}\n {!rail.collapsed ? <RailResizeHandle onStart={startResize} active={resizing} /> : null}\n </nav>\n ) : null}\n\n {/* Mobile overlay drawer. */}\n {chatList && rail.isMobile ? (\n <Sheet open={rail.drawerOpen} onOpenChange={rail.setDrawerOpen}>\n <SheetContent\n side=\"left\"\n showCloseButton={false}\n aria-label=\"Session navigation\"\n className=\"w-screen max-w-none gap-0 p-0 sm:w-[380px] sm:max-w-[90vw]\"\n onCloseAutoFocus={(event) => {\n event.preventDefault();\n rail.restoreDrawerFocus();\n }}\n >\n <SheetTitle className=\"sr-only\">Session navigation</SheetTitle>\n <SheetDescription className=\"sr-only\">\n Browse workspace sessions or open Workspace.\n </SheetDescription>\n <nav aria-label=\"Primary\" className=\"h-full\">\n <RailBody />\n </nav>\n </SheetContent>\n </Sheet>\n ) : null}\n\n {/* Main canvas. */}\n <div data-canvas className=\"flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden\">\n <SessionStartupProvider session={context.session}>\n <CanvasTopStrip hamburgerRef={hamburgerRef} />\n {canvasBanners}\n <div className=\"flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden\">{children}</div>\n </SessionStartupProvider>\n </div>\n </div>\n </TooltipProvider>\n );\n}\n\n/**\n * The slim canvas top strip. On mobile it always shows (hamburger + brand). On\n * session routes it also carries the session title/status, the connection and\n * lock pills, and the inspector toggle — moved here from the old top header.\n */\nfunction CanvasTopStrip({ hamburgerRef }: { hamburgerRef: RefObject<HTMLButtonElement | null> }) {\n const rail = useRail();\n const chatList = useSessionUiFeature(\"chatList\");\n const context = useAppContext();\n const pathname = useRouterState({\n select: (state) => state.location.pathname,\n });\n const isSessionRoute = /\\/sessions\\/[^/]+/.test(pathname);\n const showSessionActions = Boolean(context.session) && isSessionRoute;\n const sharedFeed = useSyncExternalStore(\n context.sessionEventFeedStore.subscribe,\n context.sessionEventFeedStore.getSnapshot,\n context.sessionEventFeedStore.getSnapshot,\n );\n const sessionEvents =\n sharedFeed && sharedFeed.sessionId === context.session?.id ? sharedFeed.events : [];\n // The route owns the only session stream. An empty shared feed is still an\n // authoritative shared feed, so this header can never fall back to self-streaming.\n const lineage = useSessionLineage(context.session?.id ?? null, {\n events: sessionEvents,\n pollIntervalMs: 30_000,\n });\n const ancestors = lineage.lineage?.ancestors ?? [];\n\n // On desktop, the strip only renders when there is something to show.\n if (!rail.isMobile && !showSessionActions) {\n return null;\n }\n\n const hamburger =\n chatList && rail.isMobile ? (\n <Button\n ref={hamburgerRef}\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label=\"Open navigation\"\n onClick={() => {\n // On phones the workspace inspector is also a full-screen surface.\n // Make the two overlays mutually exclusive instead of stacking one\n // modal beneath another and trapping the navigation out of sight.\n context.setInspectorOpen(false);\n rail.setDrawerOpen(true);\n }}\n className=\"size-11\"\n >\n <MenuIcon className=\"size-4\" />\n </Button>\n ) : null;\n\n // Session route: the full identity + status header (its own bar). The live\n // sandbox switcher and codex indicator flow in as slots so the header stays a\n // pure, screenshot-testable component.\n if (showSessionActions && context.session) {\n // Both schedule facts come from one read, so a newer lineage never pairs\n // with an older session read (an older server sends no upcoming flag).\n const lineageSchedules = lineage.lineage?.sessionHasSchedules;\n return (\n <SessionRouteHeader\n session={{\n ...context.session,\n ...(lineageSchedules === undefined\n ? {}\n : {\n hasSchedules: lineageSchedules,\n hasUpcomingSchedules:\n lineage.lineage?.sessionHasUpcomingSchedules ?? lineageSchedules,\n }),\n }}\n ancestors={ancestors}\n lineageLoading={lineage.loading}\n lineageError={lineage.error}\n events={sessionEvents}\n hamburger={hamburger}\n />\n );\n }\n\n // Mobile, off a session route: the slim brand strip.\n return (\n <header className=\"flex h-12 shrink-0 items-center gap-3 border-b border-border bg-canvas/75 px-3 backdrop-blur sm:px-4\">\n {hamburger}\n <Link\n to=\"/workspaces/$workspaceId/sessions\"\n params={{ workspaceId: rail.workspaceId }}\n className=\"flex items-center gap-2 text-fg\"\n >\n <BrandMark className=\"w-5\" />\n <Wordmark className=\"text-[17px]\" />\n </Link>\n </header>\n );\n}\n\n/** Session-route header: last-admitted model·effort, not the composer next pick. */\nfunction SessionRouteHeader({\n session,\n ancestors,\n lineageLoading,\n lineageError,\n events,\n hamburger,\n}: {\n session: Session;\n ancestors: SessionSummary[];\n lineageLoading: boolean;\n lineageError: Error | null;\n events: import(\"@opengeni/sdk\").SessionEvent[];\n hamburger: ReactNode;\n}) {\n const uiEvents = useUiEventTarget(\"document\");\n const rail = useRail();\n const context = useAppContext();\n const lastStarted = useLastStartedTurnPolicy(session.id, {\n events,\n pollIntervalMs: 15_000,\n includeServingModel: true,\n });\n const lastStartedModel = lastStarted.policy?.model;\n const lastStartedReasoningEffort = isIntelligenceEffort(lastStarted.policy?.reasoningEffort)\n ? lastStarted.policy.reasoningEffort\n : undefined;\n const lastStartedLatencyMode = lastStarted.policy?.latencyMode;\n // Wait for last-started fetch before trusting session.model — creation default\n // can be a different rail than the newest admitted turn.\n const policyReady = !lastStarted.loading;\n const displayModelId = policyReady ? lastStartedModel || session.model : session.model;\n const navigate = useNavigate();\n const catalog = useWorkspaceModelCatalog(session.workspaceId);\n const selectedRow = findPickerRow(catalog.rows, displayModelId);\n const policyLoading = lastStarted.loading || catalog.loading;\n const credentialSource = selectedRow?.catalog.credentialSource;\n const subscriptionProvider =\n credentialSource?.kind === \"connected_subscription\" ? credentialSource.provider : null;\n const repliesMute = useSessionRepliesMute(session);\n const sessionAdminAccess = useSessionAdminAccess(session);\n const adminAccess = useSessionUiFeature(\"adminAccess\") ? sessionAdminAccess : null;\n const dock = useSessionUiFeature(\"dock\");\n const archiveInFlight = useRef(false);\n const onArchive = useCallback(\n async (target: Session, archived: boolean) => {\n if (archiveInFlight.current) return;\n const accepted = context.captureWorkspaceInvocation(target.workspaceId);\n if (!accepted) return;\n archiveInFlight.current = true;\n try {\n const updated = await context.client.updateSessionArchive(target.workspaceId, target.id, {\n archived,\n expectedVersion: target.archiveVersion ?? 0,\n });\n if (!context.ownsWorkspaceInvocation(target.workspaceId, accepted)) return;\n context.setSession((current) =>\n current?.id === updated.id && current.workspaceId === updated.workspaceId\n ? applySessionArchiveProjection(current, updated)\n : current,\n );\n notifySessionListChanged({\n workspaceId: target.workspaceId,\n sessionId: target.id,\n archived: updated.archived,\n });\n toast.success(updated.archived ? \"Chat archived.\" : \"Chat restored.\");\n } catch (error) {\n if (!context.ownsWorkspaceInvocation(target.workspaceId, accepted)) return;\n toast.error(archived ? \"Couldn't archive the chat.\" : \"Couldn't restore the chat.\", {\n description: error instanceof Error ? error.message : String(error),\n });\n } finally {\n archiveInFlight.current = false;\n }\n },\n [context],\n );\n\n return (\n <SessionHeader\n session={session}\n ancestors={ancestors}\n onOpenSchedule={\n session.hasSchedules\n ? () =>\n void navigate({\n to: \"/workspaces/$workspaceId/schedules\",\n params: { workspaceId: session.workspaceId },\n search: { targetSessionId: session.id },\n })\n : null\n }\n lineageLoading={lineageLoading}\n lineageError={lineageError}\n connectionState={context.connectionState}\n status={session.status}\n keyAuthRequired={context.keyAuthRequired}\n onForgetAccessKey={context.forgetAccessKey}\n inspectorOpen={context.inspectorOpen}\n onToggleInspector={\n dock\n ? () => {\n if (!context.inspectorOpen && rail.isMobile) rail.setDrawerOpen(false);\n context.setInspectorOpen((open) => !open);\n }\n : undefined\n }\n onRename={context.updateSessionTitle}\n onPin={(target, pinned) =>\n context.updateSessionPin(target.workspaceId, target.id, pinned, target.pinVersion ?? 0)\n }\n onArchive={onArchive}\n repliesMute={repliesMute}\n adminAccess={adminAccess}\n onOpenUsageLimit={\n // The editor lives in the session panel's Agent tab.\n sessionUsageLimitCapability(context.clientConfig) === \"absent\" || !dock\n ? null\n : () => requestSessionUsageLimitEditor(uiEvents)\n }\n leading={hamburger}\n lastStartedModel={lastStartedModel}\n lastStartedReasoningEffort={lastStartedReasoningEffort}\n lastStartedLatencyMode={lastStartedLatencyMode}\n billingClass={selectedRow?.billingClass}\n modelLabel={selectedRow?.label}\n modelLogoUrl={selectedRow?.catalog.logoUrl}\n policyLoading={policyLoading}\n accessSlot={\n session.tenancy ? (\n <Suspense fallback={null}>\n <LazySessionTenancyRouteControl session={session} events={events} />\n </Suspense>\n ) : isPersonalWorkspace(\n context.workspaces.find((candidate) => candidate.id === session.workspaceId) ?? null,\n context.managedSelfContext,\n ) ? (\n // Without a tenancy record there is no access control to show, but a\n // Personal workspace chat is still private: say so, read-only.\n <PrivateSessionIndicator />\n ) : null\n }\n sandboxSlot={\n sessionSupportsFleetSwitching(session.sandboxBackend) ? (\n <SessionComputeIndicator sessionId={session.id} sandboxBackend={session.sandboxBackend} />\n ) : null\n }\n codexSlot={\n policyReady && isCodexProductModel(displayModelId) ? (\n <CodexAccountIndicator\n workspaceId={session.workspaceId}\n sessionId={session.id}\n model={displayModelId}\n modelReady={policyReady}\n events={events}\n />\n ) : policyReady && subscriptionProvider ? (\n <ModelAccountIndicator\n workspaceId={session.workspaceId}\n sessionId={session.id}\n organizationId={\n context.workspaces.find((candidate) => candidate.id === session.workspaceId)\n ?.accountId ?? null\n }\n provider={subscriptionProvider}\n servingTurnId={lastStarted.policy?.turnId}\n events={events}\n />\n ) : null\n }\n />\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/app/components/capabilities/session-machine-card.tsx"],"sourcesContent":["import { t } from \"../../lib/console-text\";\nimport type { AuthNeededItem } from \"../../../timeline\";\nimport { MACHINES_SESSION_POLL_MS, type MachineView } from \"../../../machines\";\nimport { machineDisplayName, machineScopeLabel } from \"../../../sandbox-label-model\";\nimport { OPENGENI_BROWSER_EXTENSION_URL } from \"@opengeni/contracts\";\nimport { OpenGeniApiError } from \"@opengeni/sdk\";\nimport {\n ArrowUpRightIcon,\n CheckIcon,\n ChevronRightIcon,\n LaptopIcon,\n Loader2Icon,\n MonitorIcon,\n PlusIcon,\n PuzzleIcon,\n ServerIcon,\n} from \"lucide-react\";\nimport { useCallback, useEffect, useMemo, useRef, useState, type ReactNode } from \"react\";\n\nimport { useAppApi } from \"../../lib/app-api\";\nimport {\n ConnectMachineDialog,\n connectScopeFor,\n type ConnectMachineScope,\n} from \"../machines/connect-machine-dialog\";\nimport { Button } from \"../../../ui/button\";\nimport { ListRow, RowList } from \"../../../ui/list-row\";\nimport { LogoTile } from \"../../../ui/logo-tile\";\nimport { Notice } from \"../../../ui/notice\";\nimport { RowButton } from \"../../../ui/page-actions\";\nimport { useAppContext } from \"../../app-context\";\nimport { userErrorText } from \"../../../ui/api-error\";\nimport { isMachineComputeSelectable } from \"../../lib/machine-selectability\";\nimport { useDesktopThisComputer } from \"../desktop/this-computer\";\nimport { moveChatToMachine } from \"../../lib/move-chat-to-machine\";\nimport { hasWorkspacePermission } from \"../../lib/permissions\";\nimport { useWorkspaceMachines } from \"../../lib/use-workspace-machines\";\nimport { thisComputerReady, thisComputerNeedsPermissions } from \"../../../this-computer\";\nimport { SessionCapabilityFrame } from \"../../../components/session-capability-frame\";\nimport type { ChatSendContext } from \"./session-github-repositories\";\n\n/** While the connect dialog is open, look for the new machine every few seconds. */\nconst WATCH_POLL_MS = 3_000;\n/** After \"Add to Chrome\", how often to check whether the extension linked up. */\nconst CHROME_POLL_MS = 5_000;\n/** Stop checking for the extension after this long without a link. */\nconst CHROME_POLL_LIMIT_MS = 10 * 60_000;\n\nexport { machineUseMessage } from \"../../lib/move-chat-to-machine\";\n\n/** A neutral laptop mark for the card (the frame renders logos as images). */\nexport const CONNECTED_MACHINE_LOGO =\n \"data:image/svg+xml;utf8,\" +\n encodeURIComponent(\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-2 -2 28 28\" fill=\"none\" stroke=\"#71717a\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 5a2 2 0 0 1 2 2v8.526a2 2 0 0 0 .212.897l1.068 2.127a1 1 0 0 1-.9 1.45H3.62a1 1 0 0 1-.9-1.45l1.068-2.127A2 2 0 0 0 4 15.526V7a2 2 0 0 1 2-2z\"/><path d=\"M20.054 15.987H3.946\"/></svg>',\n );\n\nexport type SessionMachineCapabilityCardProps = {\n item: AuthNeededItem;\n workspaceId: string;\n sessionId: string;\n /** What a composer Send would carry now, so this Send follows the same rules. */\n sendContext?: (() => ChatSendContext) | undefined;\n /** Re-read the session after the chat moves to a machine. */\n onConfigured?: (() => Promise<void>) | undefined;\n};\n\nfunction stateLabel(machine: MachineView): string {\n switch (machine.state) {\n case \"online\":\n case \"consent_required\":\n return \"Online\";\n case \"display_unavailable\":\n return \"Online · no display\";\n case \"reconnecting\":\n return \"Reconnecting\";\n case \"enrolling\":\n return \"Connecting\";\n default:\n return \"Offline\";\n }\n}\n\n/** Focus moves only when the person is not working somewhere else. */\nfunction focusIfIdle(card: HTMLElement | null, target: HTMLElement | null = card) {\n requestAnimationFrame(() => {\n const active = document.activeElement;\n const idle = !active || active === document.body || (card?.contains(active) ?? false);\n if (idle && target?.isConnected) target.focus();\n else if (idle && card?.isConnected) card.focus();\n });\n}\n\n/**\n * The Connected Machine card in a conversation. The agent can post it, but only\n * the person can connect a machine or move this chat onto one. Once a machine with a\n * screen is reachable, the card offers the Opengeni Browser extension for it.\n */\nexport function SessionMachineCapabilityCard({\n item,\n workspaceId,\n sessionId,\n sendContext,\n onConfigured,\n}: SessionMachineCapabilityCardProps) {\n const context = useAppContext();\n const { apiBaseUrl } = useAppApi();\n const recommendation = item.capability!;\n const accessKnown = context.accessContext !== null && context.accessContext !== undefined;\n const canMessage =\n !accessKnown || hasWorkspacePermission(context.accessContext, workspaceId, \"sessions:control\");\n\n const [setupOpen, setSetupOpen] = useState(false);\n // Reconnecting to turn screen control on starts with it already chosen, and\n // with the machine's own access so the same machine reconnects as it was.\n const [setupScreenControl, setSetupScreenControl] = useState(false);\n const [setupScope, setSetupScope] = useState<ConnectMachineScope>(\"user\");\n const [justConnected, setJustConnected] = useState<string | null>(null);\n const [using, setUsing] = useState<string | null>(null);\n const [useError, setUseError] = useState<{ name: string; reason: string | null } | null>(null);\n const [outcome, setOutcome] = useState<{ sandboxId: string; text: string } | null>(null);\n const [announcement, setAnnouncement] = useState(\"\");\n const [othersOpen, setOthersOpen] = useState(false);\n const cardRef = useRef<HTMLElement>(null);\n const opener = useRef<HTMLButtonElement>(null);\n const setupOpener = useRef<HTMLElement | null>(null);\n const alive = useRef(true);\n useEffect(() => {\n alive.current = true;\n return () => {\n alive.current = false;\n };\n }, []);\n\n const fleet = useWorkspaceMachines({\n workspaceId,\n sessionId,\n pollIntervalMs: setupOpen ? WATCH_POLL_MS : MACHINES_SESSION_POLL_MS,\n });\n const unavailableOnDeployment =\n fleet.error instanceof OpenGeniApiError && fleet.error.status === 404;\n const machines = useMemo(\n () => fleet.machines.filter((machine) => !machine.isSessionGroup && machine.enrollmentId),\n [fleet.machines],\n );\n const activeMachine = machines.find((machine) => machine.active) ?? null;\n const reachable = machines.filter((machine) => isMachineComputeSelectable(machine.state));\n // The machine the agent asked for, while this chat doesn't run on it yet.\n const requested =\n (item.requestedSandboxId\n ? machines.find((machine) => machine.sandboxId === item.requestedSandboxId)\n : undefined) ?? null;\n const asking = requested !== null && !requested.active;\n const requestedName = requested ? machineDisplayName(t, requested) : \"\";\n // The person can allow it right here: lead with that, other machines fold away.\n const allowHere =\n asking && fleet.canAttach && isMachineComputeSelectable(requested.state) ? requested : null;\n const personalWorkspace =\n context.workspaces?.find((workspace) => workspace.id === workspaceId)?.kind === \"personal\";\n\n const openSetup = (reconnect?: MachineView) => {\n const active = document.activeElement;\n setupOpener.current = active instanceof HTMLElement ? active : null;\n setJustConnected(null);\n setSetupScreenControl(reconnect !== undefined);\n setSetupScope(reconnect ? connectScopeFor(reconnect) : \"user\");\n setSetupOpen(true);\n };\n const closeSetup = () => {\n // Fast polling ends with the dialog; focus returns to what opened it.\n setSetupOpen(false);\n const back = setupOpener.current?.isConnected ? setupOpener.current : opener.current;\n focusIfIdle(cardRef.current, back);\n };\n\n const ordered = useMemo(() => {\n const rank = (machine: MachineView) =>\n machine.sandboxId === justConnected\n ? 0\n : machine.active\n ? 1\n : isMachineComputeSelectable(machine.state)\n ? 2\n : 3;\n return [...machines]\n .filter((machine) => machine.sandboxId !== allowHere?.sandboxId)\n .sort(\n (left, right) =>\n rank(left) - rank(right) ||\n machineDisplayName(t, left).localeCompare(machineDisplayName(t, right)),\n );\n }, [allowHere?.sandboxId, justConnected, machines]);\n\n const use = useCallback(\n async (machine: MachineView) => {\n if (using !== null) return;\n const name = machineDisplayName(t, machine);\n setUseError(null);\n setOutcome(null);\n const chat = sendContext?.() ?? { blocked: null, awaitingHuman: false, extras: {} };\n if (chat.blocked) {\n setUseError({ name, reason: chat.blocked });\n return;\n }\n setUsing(machine.sandboxId);\n const result = await moveChatToMachine({\n machine,\n chat,\n canMessage,\n previousSandboxId: fleet.machines.find((candidate) => candidate.active)?.sandboxId ?? null,\n attach: fleet.attach,\n sendMessage: (message) => context.client.sendMessage(workspaceId, sessionId, message),\n });\n if (!alive.current) return;\n if (!result.moved) {\n setUsing(null);\n setUseError({ name, reason: result.reason });\n return;\n }\n const text = result.text;\n setUsing(null);\n setOutcome({ sandboxId: machine.sandboxId, text });\n setAnnouncement(text);\n focusIfIdle(cardRef.current);\n await onConfigured?.().catch(() => {});\n },\n [canMessage, context.client, fleet, onConfigured, sendContext, sessionId, using, workspaceId],\n );\n\n // Chrome belongs to a machine with a screen: the one this chat runs on if it\n // has one, otherwise the first reachable one.\n const chromeMachine =\n (activeMachine?.hasDisplay && isMachineComputeSelectable(activeMachine.state)\n ? activeMachine\n : null) ??\n reachable.find((machine) => machine.hasDisplay) ??\n null;\n const chrome = useAttachedChrome(\n workspaceId,\n fleet.canRead ? (chromeMachine?.enrollmentId ?? null) : null,\n );\n const fresh = justConnected\n ? (machines.find((machine) => machine.sandboxId === justConnected) ?? null)\n : null;\n const origin = apiBaseUrl || (typeof window !== \"undefined\" ? window.location.origin : \"\");\n\n // One clear action per state. With a reachable machine, the list's \"Use in\n // this chat\" is primary and connecting another is a quiet secondary action.\n const actionUnavailable = unavailableOnDeployment\n ? \"Connected Machines aren't available on this deployment.\"\n : asking && !isMachineComputeSelectable(requested.state)\n ? `Turn on ${requestedName} to allow it here.`\n : !fleet.canRead\n ? \"You don't have access to this workspace's machines.\"\n : fresh && fleet.canAttach && !fresh.active\n ? `${machineDisplayName(t, fresh)} connected. Choose it below to use it here.`\n : reachable.length > 0 && fleet.canAttach\n ? \"Choose where this chat runs.\"\n : reachable.length > 0\n ? \"You can't change where this chat runs.\"\n : fleet.canManage\n ? null\n : machines.length > 0\n ? \"Turn on one of the machines below to use it here.\"\n : \"Ask a workspace admin to connect a machine.\";\n // Inside the desktop app, the computer it runs on is one click away.\n const desktop = useDesktopThisComputer();\n const desktopReady =\n thisComputerReady(desktop?.computer.status ?? null) && !desktop?.computer.status?.reconnecting;\n const offerThisComputer =\n desktop !== null &&\n desktop.computer.status !== null &&\n desktop.computer.status.state !== \"unavailable\" &&\n !thisComputerReady(desktop.computer.status) &&\n !unavailableOnDeployment &&\n fleet.canRead;\n const connectAnother = fleet.canManage && (reachable.length > 0 || activeMachine !== null);\n const visibleDetails =\n useError !== null || ordered.length > 0 || chromeMachine !== null || connectAnother;\n // While the agent's request can be allowed here, everything else is one\n // click away instead of competing with it.\n const folded = allowHere !== null && !othersOpen;\n const foldable =\n allowHere !== null && (ordered.length > 0 || chromeMachine !== null || connectAnother);\n\n return (\n <>\n <SessionCapabilityFrame\n name={asking ? requestedName : recommendation.name || \"Connected Machine\"}\n subtitle={\n asking\n ? `${stateLabel(requested)} · ${machineScopeLabel(t, requested.scope)}`\n : \"Your computer or server\"\n }\n logo={CONNECTED_MACHINE_LOGO}\n typeLabel=\"Machine\"\n description={\n allowHere\n ? \"The agent asked to use this machine. Allowing it moves this chat here, and the agent continues on it.\"\n : asking\n ? `The agent asked to use ${requestedName}.`\n : recommendation.rationale\n }\n skill={false}\n expanded={false}\n complete={activeMachine !== null || desktopReady}\n completeLabel={\n activeMachine\n ? outcome?.sandboxId === activeMachine.sandboxId\n ? outcome.text\n : `This chat runs on ${machineDisplayName(t, activeMachine)}`\n : desktopReady\n ? `Your agents can use ${desktop?.computer.status?.machineName || \"this computer\"}.`\n : undefined\n }\n actionLabel={\n allowHere\n ? using === allowHere.sandboxId\n ? \"Allowing…\"\n : \"Allow\"\n : offerThisComputer\n ? desktop.computer.acting\n ? \"Connecting…\"\n : \"Use this computer\"\n : \"Connect a computer\"\n }\n busy={allowHere ? using !== null : offerThisComputer && desktop.computer.acting}\n actionUnavailable={allowHere || offerThisComputer ? null : actionUnavailable}\n opensDialog={false}\n note={\n allowHere\n ? \"\"\n : offerThisComputer\n ? \"Only you can use this computer. Your agents can work with files and use the screen after you allow system permissions. Turn it off anytime in the app.\"\n : fleet.canManage\n ? \"You can remove a connected machine anytime from Machines.\"\n : \"\"\n }\n onOpen={() => {\n if (allowHere) return void use(allowHere);\n if (!offerThisComputer) return openSetup();\n if (desktop.computer.acting) return;\n if (thisComputerNeedsPermissions(desktop.computer.status)) return desktop.openSetup();\n void (\n desktop.computer.status?.state === \"paused\"\n ? desktop.computer.resume().then(() => desktop.computer.status)\n : desktop.computer.connect({ screenControl: true })\n ).then((next) => {\n if (thisComputerNeedsPermissions(next)) desktop.openSetup();\n void fleet.refresh();\n });\n }}\n onClose={closeSetup}\n opener={opener}\n cardRef={cardRef}\n details={\n unavailableOnDeployment || !fleet.canRead ? null : (\n <>\n {desktop?.computer.actionError !== null &&\n desktop?.computer.actionError !== undefined ? (\n <Notice tone=\"failed\" live=\"assertive\" className=\"mx-4 mb-3 text-xs\">\n Couldn't connect this computer. {desktop.computer.actionError || \"Try again.\"}\n </Notice>\n ) : null}\n {/* Always mounted, so moves and new machines are announced. */}\n <span className=\"sr-only\" role=\"status\" aria-live=\"polite\">\n {announcement}\n </span>\n {visibleDetails ? (\n <div\n data-slot=\"connected-machines\"\n className=\"space-y-3 border-t border-border px-[19px] pt-3 pb-4 max-[480px]:px-3.5\"\n >\n {useError ? (\n <Notice tone=\"failed\" live=\"assertive\" className=\"text-xs\">\n {`Couldn't move this chat to ${useError.name}. ${\n useError.reason ??\n (fleet.mutationError\n ? userErrorText(fleet.mutationError, \"Try again.\")\n : \"Try again.\")\n }`}\n </Notice>\n ) : null}\n {foldable ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"-ml-2 text-fg-muted\"\n aria-expanded={othersOpen}\n onClick={() => setOthersOpen((open) => !open)}\n >\n <ChevronRightIcon\n aria-hidden\n className={\n othersOpen ? \"rotate-90 transition-transform\" : \"transition-transform\"\n }\n />\n Use a different machine\n </Button>\n ) : null}\n {!folded && ordered.length > 0 ? (\n <RowList label=\"Connected machines\" flush>\n {ordered.map((machine) => (\n <MachineRow\n key={machine.sandboxId}\n machine={machine}\n primary={machine.sandboxId === justConnected || reachable.length === 1}\n canUse={fleet.canAttach}\n busy={using === machine.sandboxId}\n locked={using !== null || fleet.attaching}\n onUse={() => void use(machine)}\n />\n ))}\n </RowList>\n ) : null}\n {!folded && chromeMachine ? (\n <ScreenControlStep\n key={chromeMachine.sandboxId}\n machine={chromeMachine}\n workspaceId={workspaceId}\n canManage={fleet.canManage}\n refresh={fleet.refresh}\n onReconnect={() => openSetup(chromeMachine)}\n />\n ) : null}\n {!folded && chromeMachine ? (\n <ChromeStep\n chrome={chrome}\n machineName={machineDisplayName(t, chromeMachine)}\n />\n ) : null}\n {!folded && connectAnother ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"-ml-2 text-fg-muted\"\n onClick={() => openSetup()}\n >\n <PlusIcon aria-hidden />\n Connect another machine\n </Button>\n ) : null}\n </div>\n ) : null}\n </>\n )\n }\n />\n {fleet.canManage && !unavailableOnDeployment ? (\n <ConnectMachineDialog\n open={setupOpen}\n onOpenChange={(open) => {\n if (!open) closeSetup();\n }}\n workspaceId={workspaceId}\n sessionId={sessionId}\n origin={origin}\n machines={fleet.machines}\n machinesLoading={fleet.loading}\n machinesError={fleet.error}\n personalWorkspace={personalWorkspace}\n defaultScope={setupScope}\n defaultAllowScreenControl={setupScreenControl}\n onConnected={(machine) => {\n setJustConnected(machine.sandboxId);\n setAnnouncement(`${machineDisplayName(t, machine)} connected.`);\n }}\n useInChat={{ canUse: fleet.canAttach, onUse: (machine) => void use(machine) }}\n />\n ) : null}\n </>\n );\n}\n\n/**\n * An earlier Connected Machine card whose request the agent made again further\n * down. The newer card is the live one, so this stays a single quiet line.\n */\nexport function RepeatedMachineRequestNote() {\n return (\n <p className=\"flex items-center gap-2 text-xs text-fg-muted\">\n <LaptopIcon aria-hidden className=\"size-3.5 shrink-0\" />\n The agent asked to use a machine. It asked again below.\n </p>\n );\n}\n\nfunction MachineRow({\n machine,\n primary,\n canUse,\n busy,\n locked,\n onUse,\n}: {\n machine: MachineView;\n primary: boolean;\n canUse: boolean;\n busy: boolean;\n locked: boolean;\n onUse: () => void;\n}) {\n const name = machineDisplayName(t, machine);\n const selectable = isMachineComputeSelectable(machine.state);\n const Icon = machine.os === \"linux\" && !machine.hasDisplay ? ServerIcon : LaptopIcon;\n const common = {\n leading: <LogoTile icon={<Icon />} />,\n title: name,\n meta: [stateLabel(machine), machineScopeLabel(t, machine.scope)],\n };\n if (machine.active) {\n return (\n <ListRow\n {...common}\n control={\n <span className=\"inline-flex items-center gap-1 text-xs font-medium text-status-idle\">\n <CheckIcon aria-hidden className=\"size-3.5\" />\n In this chat\n </span>\n }\n />\n );\n }\n // The meta line already says why (\"Offline\", \"Reconnecting\").\n if (!selectable) return <ListRow {...common} disabled />;\n if (!canUse) return <ListRow {...common} />;\n const label = busy ? `Moving this chat to ${name}` : `Use ${name} in this chat`;\n return (\n <ListRow\n {...common}\n control={\n primary ? (\n <Button\n type=\"button\"\n size=\"sm\"\n aria-label={label}\n aria-disabled={locked || undefined}\n className=\"rounded-[10px] pointer-coarse:h-11\"\n onClick={() => {\n if (!locked) onUse();\n }}\n >\n {busy ? <Loader2Icon aria-hidden className=\"animate-spin\" /> : null}\n {busy ? \"Moving…\" : \"Use in this chat\"}\n </Button>\n ) : (\n <RowButton\n aria-label={label}\n aria-disabled={locked || undefined}\n onClick={() => {\n if (!locked) onUse();\n }}\n >\n {busy ? <Loader2Icon aria-hidden className=\"animate-spin\" /> : null}\n {busy ? \"Moving…\" : \"Use\"}\n </RowButton>\n )\n }\n />\n );\n}\n\ntype ChromeState = {\n connected: { name: string } | null;\n /** Start checking for the extension (after the person opens the store). */\n watch: () => void;\n};\n\n/**\n * Whether the Opengeni Browser extension linked a Chrome profile on this exact\n * machine. Reads once; polls only after the person opens the store, stops once\n * linked, after a bounded time, or when the inventory is not available to them.\n */\nfunction useAttachedChrome(workspaceId: string, enrollmentId: string | null): ChromeState {\n const { client } = useAppContext();\n // Poll on its own timer; a new client identity on re-render must not refetch.\n const clientRef = useRef(client);\n clientRef.current = client;\n const [connected, setConnected] = useState<{ name: string } | null>(null);\n const [watchSince, setWatchSince] = useState<number | null>(null);\n const [denied, setDenied] = useState(false);\n const linked = connected !== null;\n\n useEffect(() => {\n setConnected(null);\n setDenied(false);\n }, [enrollmentId]);\n\n useEffect(() => {\n if (!enrollmentId || denied) return;\n let cancelled = false;\n const read = async () => {\n try {\n const result = await clientRef.current.listAttachedBrowsers(workspaceId);\n if (cancelled) return;\n const device = result.devices.find(\n (candidate) => candidate.state === \"connected\" && candidate.enrollmentId === enrollmentId,\n );\n setConnected(device ? { name: device.profileLabel ?? device.browserName } : null);\n } catch (failure) {\n // Without inventory access the step still offers the install link.\n if (\n !cancelled &&\n failure instanceof OpenGeniApiError &&\n failure.status >= 400 &&\n failure.status < 500\n ) {\n setDenied(true);\n }\n }\n };\n void read();\n if (linked || watchSince === null) return () => void (cancelled = true);\n const timer = window.setInterval(() => {\n if (Date.now() - watchSince > CHROME_POLL_LIMIT_MS) {\n window.clearInterval(timer);\n return;\n }\n if (document.visibilityState !== \"hidden\") void read();\n }, CHROME_POLL_MS);\n return () => {\n cancelled = true;\n window.clearInterval(timer);\n };\n }, [denied, enrollmentId, linked, watchSince, workspaceId]);\n\n const watch = useCallback(() => setWatchSince(Date.now()), []);\n return { connected, watch };\n}\n\n/** How long to keep checking for the new consent, or a granted Mac permission. */\nconst SCREEN_CONTROL_WATCH_MS = 90_000;\nconst MAC_PERMISSION_WATCH_MS = 3 * 60_000;\nconst SCREEN_CONTROL_POLL_MS = 3_000;\n\ntype MacPermissionPane = \"screen_recording\" | \"accessibility\" | \"input_monitoring\";\ntype MacPermissions = NonNullable<NonNullable<MachineView[\"runtime\"]>[\"macPermissions\"]>;\n\n/** The order the agent needs them in: seeing the screen first, then input. */\nconst MAC_PERMISSIONS: ReadonlyArray<{\n pane: MacPermissionPane;\n key: keyof MacPermissions;\n label: string;\n}> = [\n { pane: \"screen_recording\", key: \"screenRecording\", label: \"Screen Recording\" },\n { pane: \"accessibility\", key: \"accessibility\", label: \"Accessibility\" },\n { pane: \"input_monitoring\", key: \"inputMonitoring\", label: \"Input Monitoring\" },\n];\n\nfunction isOnline(machine: MachineView): boolean {\n return (\n machine.state === \"online\" ||\n machine.state === \"consent_required\" ||\n machine.state === \"display_unavailable\"\n );\n}\n\n/**\n * Screen control for the machine with a screen. Turning it on changes this\n * machine in place (agents can do the same themselves); the step then follows\n * what the machine reports: the agent's own consent, then on a Mac each of the\n * three OS permissions, one System Settings pane at a time.\n */\nfunction ScreenControlStep({\n machine,\n workspaceId,\n canManage,\n refresh,\n onReconnect,\n}: {\n machine: MachineView;\n workspaceId: string;\n canManage: boolean;\n refresh: () => Promise<void>;\n /** Open the connect command, for a connection too old to change in place. */\n onReconnect: () => void;\n}) {\n const { client } = useAppContext();\n const stepRef = useRef<HTMLDivElement>(null);\n const refreshRef = useRef(refresh);\n refreshRef.current = refresh;\n const [busy, setBusy] = useState(false);\n const [note, setNote] = useState<string | null>(null);\n const [opened, setOpened] = useState<MacPermissionPane | null>(null);\n const [watchUntil, setWatchUntil] = useState(0);\n const [stalled, setStalled] = useState(false);\n const [reconnect, setReconnect] = useState(false);\n\n const online = isOnline(machine);\n const runtime = machine.runtime;\n const allowed = machine.allowScreenControl;\n // Older reports cannot say whether the agent holds the consent; trust the row.\n const applied = allowed && (runtime?.capabilities.screenControl ?? true);\n const renewable = runtime?.capabilities.credentialRenew === true;\n const mac = machine.os === \"macos\";\n const permissions = mac ? (runtime?.macPermissions ?? null) : null;\n const reason = machine.desktopUnavailableReason?.trim() || null;\n const missing = permissions\n ? (MAC_PERMISSIONS.find((step) => !permissions[step.key]) ?? null)\n : mac && reason !== null && /screen recording/i.test(reason)\n ? MAC_PERMISSIONS[0]!\n : null;\n const updating = runtime?.versionState === \"updating\";\n const waiting =\n (allowed && !applied && online && (renewable || updating) && !reconnect) || opened !== null;\n\n // Also when the card opens on a change already underway (a reload, or an\n // agent turned it on): watch for a while, then offer Try again.\n useEffect(() => {\n if (waiting && watchUntil === 0) setWatchUntil(Date.now() + SCREEN_CONTROL_WATCH_MS);\n }, [waiting, watchUntil]);\n\n // Re-read the machine while a change is on its way, for a bounded time.\n useEffect(() => {\n if (!waiting || watchUntil === 0) return;\n const timer = window.setInterval(() => {\n if (Date.now() > watchUntil) {\n window.clearInterval(timer);\n setStalled(true);\n return;\n }\n void refreshRef.current().catch(() => {});\n }, SCREEN_CONTROL_POLL_MS);\n return () => window.clearInterval(timer);\n }, [waiting, watchUntil]);\n\n async function turnOn() {\n if (busy || !machine.enrollmentId) return;\n setBusy(true);\n setNote(null);\n setStalled(false);\n try {\n const result = await client.enableMachineScreenControl(workspaceId, machine.enrollmentId);\n if (result.reason === \"renewal_failed\") setNote(result.message);\n setReconnect(result.reason === \"reconnect_required\");\n setWatchUntil(Date.now() + SCREEN_CONTROL_WATCH_MS);\n await refreshRef.current().catch(() => {});\n } catch (failure) {\n setNote(\n failure instanceof OpenGeniApiError && failure.status === 403\n ? \"Only an organization admin can turn this on.\"\n : userErrorText(failure, \"Try again.\"),\n );\n } finally {\n setBusy(false);\n focusIfIdle(stepRef.current);\n }\n }\n\n async function updateAgent() {\n if (busy || !machine.enrollmentId) return;\n setBusy(true);\n setNote(null);\n try {\n await client.updateMachineAgent(workspaceId, machine.enrollmentId);\n setStalled(false);\n setWatchUntil(Date.now() + MAC_PERMISSION_WATCH_MS);\n await refreshRef.current().catch(() => {});\n } catch (failure) {\n setNote(userErrorText(failure, \"Try again.\"));\n } finally {\n setBusy(false);\n }\n }\n\n async function openPane(pane: MacPermissionPane) {\n if (busy || !machine.enrollmentId) return;\n setBusy(true);\n setNote(null);\n try {\n const result = await client.openMachinePrivacySettings(workspaceId, machine.enrollmentId, {\n pane,\n });\n if (result.opened) {\n setOpened(pane);\n setStalled(false);\n setWatchUntil(Date.now() + MAC_PERMISSION_WATCH_MS);\n } else {\n setNote(result.message);\n }\n } catch (failure) {\n setNote(userErrorText(failure, \"Try again.\"));\n } finally {\n setBusy(false);\n }\n }\n\n const button = (label: string, onClick: () => void) => (\n <RowButton aria-disabled={busy || undefined} aria-busy={busy || undefined} onClick={onClick}>\n {busy ? <Loader2Icon aria-hidden className=\"animate-spin\" /> : null}\n {label}\n </RowButton>\n );\n const done = (\n <span className=\"inline-flex items-center gap-1 text-xs font-medium text-status-idle\">\n <CheckIcon aria-hidden className=\"size-3.5\" />\n On\n </span>\n );\n\n // The row stays one short line like its neighbours; anything the person has\n // to do on the machine goes in the wrapping line under it.\n let description: string;\n let hint: string | null = null;\n let control: ReactNode = null;\n if (!allowed) {\n description = canManage\n ? \"Let agents see and use this screen\"\n : \"Ask a workspace admin to turn it on\";\n if (canManage) control = button(busy ? \"Turning on…\" : \"Turn on\", () => void turnOn());\n } else if (!applied) {\n // The step only shows for a reachable machine.\n if (reconnect) {\n description = \"Needs a fresh connection\";\n hint = \"Run the connect command on this machine again, with screen control on.\";\n if (canManage) control = button(\"Connect again\", onReconnect);\n } else if (updating) {\n description = \"Updating the agent…\";\n } else if (!renewable) {\n description = \"Waiting for an agent update\";\n hint = \"It turns on by itself once this machine's agent is updated.\";\n if (canManage && !runtime?.updateBlockedReason) {\n control = button(busy ? \"Updating…\" : \"Update agent\", () => void updateAgent());\n }\n } else if (stalled || note) {\n description = \"Not on yet\";\n if (canManage) control = button(busy ? \"Trying…\" : \"Try again\", () => void turnOn());\n } else {\n description = \"Turning on…\";\n }\n } else if (missing) {\n const shown = opened === missing.pane;\n // The row stays short at any width; the hint names the permission.\n description = \"Mac permission needed\";\n hint = shown\n ? `On the Mac, switch on Opengeni under ${missing.label}.${\n missing.pane === \"screen_recording\" ? \" Choose Quit & Reopen if macOS asks.\" : \"\"\n }`\n : `Allow ${missing.label} for Opengeni on this Mac.`;\n if (canManage && online) {\n control = button(shown ? \"Open again\" : \"Open settings\", () => void openPane(missing.pane));\n }\n } else if (reason) {\n description = reason;\n } else {\n description = \"Agents can see and use this screen\";\n control = done;\n }\n const notice = note ?? hint;\n\n return (\n <div\n data-slot=\"screen-control\"\n ref={stepRef}\n tabIndex={-1}\n className=\"space-y-2 outline-hidden\"\n >\n <RowList label=\"Screen control\" flush>\n <ListRow\n leading={<LogoTile icon={<MonitorIcon />} />}\n title=\"Screen control\"\n description={description}\n control={control}\n />\n </RowList>\n <span className=\"sr-only\" aria-live=\"polite\">\n {notice ? `${description}. ${notice}` : description}\n </span>\n {notice ? (\n <Notice tone=\"waiting\" className=\"text-xs\">\n {notice}\n </Notice>\n ) : null}\n </div>\n );\n}\n\nfunction ChromeStep({ chrome, machineName }: { chrome: ChromeState; machineName: string }) {\n return (\n <div data-slot=\"chrome-extension\">\n <RowList label=\"Chrome\" flush>\n <ListRow\n leading={<LogoTile icon={<PuzzleIcon />} />}\n title=\"Chrome\"\n description={\n chrome.connected\n ? `${chrome.connected.name} on ${machineName}`\n : `Add Opengeni Browser on ${machineName}`\n }\n control={\n chrome.connected ? (\n <span className=\"inline-flex items-center gap-1 text-xs font-medium text-status-idle\">\n <CheckIcon aria-hidden className=\"size-3.5\" />\n Connected\n </span>\n ) : (\n <Button asChild size=\"sm\" variant=\"outline\" className=\"rounded-[10px]\">\n <a\n href={OPENGENI_BROWSER_EXTENSION_URL}\n target=\"_blank\"\n rel=\"noreferrer\"\n onClick={chrome.watch}\n >\n Add to Chrome\n <ArrowUpRightIcon aria-hidden />\n <span className=\"sr-only\"> (opens the Chrome Web Store in a new tab)</span>\n </a>\n </Button>\n )\n }\n />\n </RowList>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|