@opengeni/react 4.4.1 → 4.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app/app-state.js +25 -25
- package/dist/app/components/Composer.js +27 -27
- package/dist/app/components/agent/agent-capability-picker.js +4 -4
- package/dist/app/components/artifacts/artifact-browse-controls.js +3 -3
- package/dist/app/components/artifacts/artifact-library.js +19 -19
- package/dist/app/components/artifacts/artifact-page-chrome.js +2 -2
- package/dist/app/components/artifacts/chat-interactive-block.js +15 -15
- package/dist/app/components/artifacts/inline-chat-image.js +30 -29
- package/dist/app/components/artifacts/retained-file-preview.js +34 -33
- package/dist/app/components/artifacts/retained-text-preview.js +5 -5
- package/dist/app/components/artifacts/site-audience.js +4 -4
- package/dist/app/components/artifacts/site-conversations.js +20 -19
- package/dist/app/components/artifacts/site-data.js +18 -18
- package/dist/app/components/artifacts/site-publishing.js +39 -39
- package/dist/app/components/artifacts/site-settings.js +46 -46
- package/dist/app/components/billing-class-mark.js +5 -5
- package/dist/app/components/capabilities/capability-detail-sheet.js +8 -8
- package/dist/app/components/capabilities/capability-logo-source.js +11 -11
- package/dist/app/components/capabilities/connector-tool-permissions.js +4 -4
- package/dist/app/components/capabilities/native-connect-setup.js +14 -14
- package/dist/app/components/capabilities/perform-capability-action.js +1 -1
- package/dist/app/components/capabilities/prepared-mcp-setup-card.js +15 -15
- package/dist/app/components/capabilities/session-capability-card.js +77 -75
- package/dist/app/components/capabilities/session-capability-card.js.map +1 -1
- package/dist/app/components/capabilities/session-chrome-card.js +35 -33
- package/dist/app/components/capabilities/session-custom-mcp-card.js +19 -19
- package/dist/app/components/capabilities/session-github-card.js +22 -22
- package/dist/app/components/capabilities/session-machine-card.js +34 -32
- package/dist/app/components/capabilities/use-capabilities-catalog.js +3 -3
- package/dist/app/components/capabilities/use-connection-accounts.js +1 -1
- package/dist/app/components/command-menu/chat-status.js +15 -14
- package/dist/app/components/command-menu/chat-switcher.js +16 -15
- package/dist/app/components/command-menu/chat-switcher.js.map +1 -1
- package/dist/app/components/command-menu/command-menu.js +32 -110
- package/dist/app/components/command-menu/command-menu.js.map +1 -1
- package/dist/app/components/command-menu/shortcut-sheet.js +15 -15
- package/dist/app/components/composer-capabilities-menu-body.js +3 -3
- package/dist/app/components/composer-mobile-plus-panel.js +17 -17
- package/dist/app/components/composer-mobile-plus.js +1 -1
- package/dist/app/components/credit-required-gate.js +1 -1
- package/dist/app/components/credit-required-prompt.js +9 -9
- package/dist/app/components/credits/coupon-redeem.js +2 -2
- package/dist/app/components/credits/credit-refusal-notice.js +2 -2
- package/dist/app/components/desktop/app-shots.js +6 -6
- package/dist/app/components/desktop/this-computer.js +4 -4
- package/dist/app/components/feedback.js +4 -4
- package/dist/app/components/follow-up-repository-menu-body.js +4 -4
- package/dist/app/components/follow-up-repository-picker.js +1 -1
- package/dist/app/components/github-app-connect-launcher.js +2 -2
- package/dist/app/components/in-app-help-link.js +2 -2
- package/dist/app/components/knowledge/agent-learning-settings.js +3 -3
- package/dist/app/components/machines/connect-machine-dialog.js +18 -18
- package/dist/app/components/markdown.js +8 -8
- package/dist/app/components/message-context-pills.js +2 -2
- package/dist/app/components/models/models-ui.js +8 -8
- package/dist/app/components/new-session-starters.js +2 -2
- package/dist/app/components/pickers.js +8 -8
- package/dist/app/components/rail/rail-context.js +3 -3
- package/dist/app/components/rail/rail-sections.js +65 -62
- package/dist/app/components/rail/session-header.js +48 -47
- package/dist/app/components/rail/session-list.js +64 -61
- package/dist/app/components/rail/session-row-content.d.ts +6 -2
- package/dist/app/components/rail/session-row-content.js +1 -1
- package/dist/app/components/rail/session-row-hover-details.js +20 -19
- package/dist/app/components/rail/session-shell.js +104 -101
- package/dist/app/components/rail/site-session-group-heading.d.ts +7 -1
- package/dist/app/components/rail/site-session-group-heading.js +20 -3
- package/dist/app/components/repository-picker.js +4 -4
- package/dist/app/components/secrets/session-secrets-panel.js +3 -3
- package/dist/app/components/session/agent-configuration-panel.js +33 -33
- package/dist/app/components/session/artifact-link-boundary.js +2 -2
- package/dist/app/components/session/artifact-session-page.js +5 -5
- package/dist/app/components/session/banners.js +10 -10
- package/dist/app/components/session/codex-account-indicator.js +11 -11
- package/dist/app/components/session/editable-artifacts-workspace.js +44 -44
- package/dist/app/components/session/failed-session-banner.js +10 -10
- package/dist/app/components/session/human-input.js +57 -53
- package/dist/app/components/session/inspector.js +94 -90
- package/dist/app/components/session/inspector.js.map +1 -1
- package/dist/app/components/session/message-actions.js +4 -4
- package/dist/app/components/session/message-resource-attachments.js +20 -19
- package/dist/app/components/session/message-resource-attachments.js.map +1 -1
- package/dist/app/components/session/model-account-indicator.js +11 -11
- package/dist/app/components/session/model-context-inspector.js +2 -2
- package/dist/app/components/session/model-recovery-notice.js +3 -3
- package/dist/app/components/session/new-session-settings-menu.js +9 -9
- package/dist/app/components/session/sandbox-switcher.js +16 -16
- package/dist/app/components/session/sandbox-workspace.js +81 -77
- package/dist/app/components/session/search-markdown-highlight.js +9 -9
- package/dist/app/components/session/search-results-view.js +10 -10
- package/dist/app/components/session/session-admin-access.js +8 -8
- package/dist/app/components/session/session-admission-notice.js +6 -6
- package/dist/app/components/session/session-machine-access-notice.js +6 -6
- package/dist/app/components/session/session-retention.js +4 -4
- package/dist/app/components/session/session-search-dialog.js +11 -11
- package/dist/app/components/session/session-skill-reviews.js +1 -1
- package/dist/app/components/session/session-tenancy-control.d.ts +2 -0
- package/dist/app/components/session/session-tenancy-control.js +40 -25
- package/dist/app/components/session/session-tenancy-control.js.map +1 -1
- package/dist/app/components/session/session-usage-limit-section.js +11 -11
- package/dist/app/components/session/session-wait-status.js +9 -8
- package/dist/app/components/session/session-wait-status.js.map +1 -1
- package/dist/app/components/session/site-origin-link.d.ts +1 -0
- package/dist/app/components/session/site-origin-link.js +2 -2
- package/dist/app/components/session/subagents.js +16 -15
- package/dist/app/components/session-connectors-menu-body.js +5 -5
- package/dist/app/components/settings/row-select.js +3 -3
- package/dist/app/components/transcription-settings.js +4 -4
- package/dist/app/components/ui/destructive-confirm.js +6 -6
- package/dist/app/components/usage/usage-entry.js +8 -8
- package/dist/app/components/workspace-composer-plus.js +21 -21
- package/dist/app/embed/memory-navigation.js +2 -2
- package/dist/app/embed/session-app.js +256 -250
- package/dist/app/lib/actions/actions-provider.js +15 -15
- package/dist/app/lib/actions/held-modifier.d.ts +11 -0
- package/dist/app/lib/app-surfaces.js +2 -2
- package/dist/app/lib/codex-usage-query.js +6 -6
- package/dist/app/lib/composer-connectors.js +12 -12
- package/dist/app/lib/console-site.d.ts +6 -0
- package/dist/app/lib/console-site.js +14 -0
- package/dist/app/lib/console-text.js +2 -2
- package/dist/app/lib/events.js +17 -16
- package/dist/app/lib/failed-session-copy.js +3 -3
- package/dist/app/lib/model-access-onboarding.js +3 -3
- package/dist/app/lib/move-chat-to-machine.js +3 -3
- package/dist/app/lib/navigation.d.ts +5 -0
- package/dist/app/lib/navigation.js +1 -1
- package/dist/app/lib/routes.d.ts +17 -0
- package/dist/app/lib/routes.js +9 -3
- package/dist/app/lib/session-branch-cache.js +13 -12
- package/dist/app/lib/session-deep-link.js +2 -2
- package/dist/app/lib/session-failure-toasts.d.ts +8 -0
- package/dist/app/lib/session-group-pagination.js +13 -12
- package/dist/app/lib/session-hover-facts.js +14 -13
- package/dist/app/lib/session-model.js +3 -3
- package/dist/app/lib/session-rail.js +9 -8
- package/dist/app/lib/session-rename.js +3 -3
- package/dist/app/lib/session-ui-features.d.ts +6 -1
- package/dist/app/lib/session-ui-features.js +1 -1
- package/dist/app/lib/sessions-group.d.ts +43 -3
- package/dist/app/lib/sessions-group.js +21 -14
- package/dist/app/lib/shared-query.js +3 -3
- package/dist/app/lib/site-opened.d.ts +6 -0
- package/dist/app/lib/site-opened.js +10 -0
- package/dist/app/lib/turn-failure-analytics.js +4 -4
- package/dist/app/lib/use-duplicate-site.js +3 -3
- package/dist/app/lib/use-follow-up-repositories.js +4 -4
- package/dist/app/lib/use-session-list-hint-refresh.d.ts +20 -2
- package/dist/app/lib/use-session-list-hint-refresh.js +5 -1
- package/dist/app/lib/use-workspace-machines.js +6 -6
- package/dist/app/lib/use-workspace-model-catalog.js +7 -7
- package/dist/app/lib/use-workspace-rigs.js +8 -8
- package/dist/app/lib/workspace-navigation-preference.js +5 -5
- package/dist/app/lib/workspace-scope-context.js +4 -4
- package/dist/app/routes/artifacts.js +132 -149
- package/dist/app/routes/artifacts.js.map +1 -1
- package/dist/app/routes/retained-artifact.js +63 -62
- package/dist/app/routes/retained-artifact.js.map +1 -1
- package/dist/app/routes/session-unavailable.js +7 -5
- package/dist/app/routes/session.js +170 -166
- package/dist/app/routes/sessions-index.js +110 -108
- package/dist/app/routes/site-view.d.ts +11 -0
- package/dist/app/routes/site-view.js +597 -0
- package/dist/app/routes/site-view.js.map +1 -0
- package/dist/artifacts-document.js +4 -4
- package/dist/artifacts-presentation.js +4 -4
- package/dist/artifacts-spreadsheet.js +4 -4
- package/dist/artifacts.js +39 -39
- package/dist/{browser-viewer-RYYQSRTC.js → browser-viewer-QMCNV4RI.js} +9 -7
- package/dist/{chat-interactive-block-ABCRKXJ4.js → chat-interactive-block-PMIAUXSO.js} +6 -6
- package/dist/{chunk-TGVVEGZG.js → chunk-22FFOHPT.js} +9 -9
- package/dist/chunk-22GTC4MZ.js +15 -0
- package/dist/chunk-22GTC4MZ.js.map +1 -0
- package/dist/{chunk-Z5WMLJKI.js → chunk-22JFMNMF.js} +92 -4
- package/dist/chunk-22JFMNMF.js.map +1 -0
- package/dist/{chunk-UHFWF6ZU.js → chunk-2FPS5H2D.js} +2 -2
- package/dist/{chunk-NAWXARTY.js → chunk-2KO2G3RI.js} +72 -6
- package/dist/chunk-2KO2G3RI.js.map +1 -0
- package/dist/{chunk-5POTDNQT.js → chunk-2NC7NZCE.js} +6 -6
- package/dist/{chunk-ZKYYZH6L.js → chunk-2QBYDGWO.js} +9 -9
- package/dist/{chunk-TWXIFWBD.js → chunk-34EU25RL.js} +2 -2
- package/dist/{chunk-R63QEVPK.js → chunk-35BC2FU2.js} +16 -16
- package/dist/{chunk-PTGRFAMH.js → chunk-3ABPIUCK.js} +2 -2
- package/dist/{chunk-S4SC5SSV.js → chunk-3GU7AWG7.js} +18 -18
- package/dist/{chunk-722UO6YQ.js → chunk-3PEXVG4D.js} +2 -2
- package/dist/{chunk-63VGE4OH.js → chunk-3RMKPHBL.js} +3 -3
- package/dist/{chunk-6JKZILLF.js → chunk-3RQUWFZT.js} +67 -67
- package/dist/{chunk-6JKZILLF.js.map → chunk-3RQUWFZT.js.map} +1 -1
- package/dist/{chunk-RQDFYQHA.js → chunk-3STBLX4O.js} +9 -9
- package/dist/{chunk-S4EZ3JUB.js → chunk-3X5FKDYQ.js} +23 -23
- package/dist/{chunk-KTRKZRID.js → chunk-4GLLWX33.js} +11 -11
- package/dist/{chunk-ROQOVH4N.js → chunk-4HEXNAFI.js} +20 -20
- package/dist/chunk-4HEXNAFI.js.map +1 -0
- package/dist/{chunk-SD2K5ZN5.js → chunk-4LPA25NQ.js} +4 -4
- package/dist/{chunk-KWKGBGAF.js → chunk-4RMN4E2Y.js} +9 -9
- package/dist/{chunk-X7ASQHR6.js → chunk-4SAGYEVB.js} +2 -2
- package/dist/{chunk-HTT3FB7T.js → chunk-4VK2R5QC.js} +3 -3
- package/dist/{chunk-DDK4WFJ3.js → chunk-4XQC7VLT.js} +9 -9
- package/dist/{chunk-IVOA3DXA.js → chunk-4YXAQMTD.js} +12 -12
- package/dist/{chunk-HOJGAJAB.js → chunk-52WK2GGK.js} +8 -8
- package/dist/{chunk-NYZQ7LO7.js → chunk-552UYIQ7.js} +20 -20
- package/dist/{chunk-LEXPBQ56.js → chunk-5DSKMG2I.js} +4 -4
- package/dist/{chunk-WNG757ID.js → chunk-5FA455GR.js} +4 -4
- package/dist/{chunk-HWDGJFM4.js → chunk-5FEN3KYH.js} +11 -11
- package/dist/{chunk-OSVHU2WU.js → chunk-5JHRMUAZ.js} +12 -12
- package/dist/{chunk-PM3OSANE.js → chunk-5MJHH72T.js} +14 -3
- package/dist/chunk-5MJHH72T.js.map +1 -0
- package/dist/{chunk-RKB2Z457.js → chunk-5VGJXWQ2.js} +2 -2
- package/dist/{chunk-GFUUFM2O.js → chunk-5W6ZDKRR.js} +6 -6
- package/dist/{chunk-6PQNLL4E.js → chunk-5W7KJ5NQ.js} +37 -37
- package/dist/{chunk-Q35YZVDZ.js → chunk-5Y2FPLZE.js} +9 -9
- package/dist/{chunk-6W3LF3DB.js → chunk-5YFY4SFC.js} +2 -12
- package/dist/chunk-5YFY4SFC.js.map +1 -0
- package/dist/{chunk-F3NERYBQ.js → chunk-62VER7O4.js} +6 -6
- package/dist/{chunk-FBMU3VK5.js → chunk-6DCEDIF6.js} +2 -2
- package/dist/{chunk-LE2EDBXU.js → chunk-73WI7FL2.js} +18 -18
- package/dist/chunk-756MKA2J.js +45 -0
- package/dist/chunk-756MKA2J.js.map +1 -0
- package/dist/{chunk-ZRJCGBVV.js → chunk-7FJMRJDG.js} +2 -2
- package/dist/{chunk-7KGKDWWR.js → chunk-7HFLYNWN.js} +2 -2
- package/dist/{chunk-72J6C2AJ.js → chunk-7KIENXRE.js} +2 -2
- package/dist/{chunk-CBY5CXBD.js → chunk-7NPCEBZE.js} +5 -5
- package/dist/{chunk-46VBQG2D.js → chunk-7P4AQMGA.js} +13 -13
- package/dist/{chunk-X7L4H4VG.js → chunk-7TCT7KPQ.js} +742 -644
- package/dist/chunk-7TCT7KPQ.js.map +1 -0
- package/dist/{chunk-CVG4FILQ.js → chunk-7XO7YKPC.js} +280 -1035
- package/dist/chunk-7XO7YKPC.js.map +1 -0
- package/dist/{chunk-S7PVL7XH.js → chunk-A4BD4ZVB.js} +4 -4
- package/dist/{chunk-EF5SYXAY.js → chunk-ACL2V2KE.js} +30 -22
- package/dist/chunk-ACL2V2KE.js.map +1 -0
- package/dist/{chunk-73SOCVLS.js → chunk-AIEXYO2X.js} +3 -3
- package/dist/{chunk-U7TC2XJQ.js → chunk-AJPW3SV4.js} +3 -3
- package/dist/{chunk-HRJQAFKR.js → chunk-AX6YJA5U.js} +2 -2
- package/dist/{chunk-P5WABK2H.js → chunk-BCM7C3MJ.js} +9 -9
- package/dist/{chunk-DT7BORXG.js → chunk-BMJTNPWK.js} +2 -2
- package/dist/{chunk-HIHO2QE7.js → chunk-BT2MVGHT.js} +2 -2
- package/dist/{chunk-3XOISKZC.js → chunk-BXQYAAVE.js} +4 -4
- package/dist/{chunk-IBTXYLBW.js → chunk-CCFWY4GF.js} +2 -2
- package/dist/{chunk-ZOC3OP6F.js → chunk-CCR33J7L.js} +2 -2
- package/dist/{chunk-GTQ3SNEI.js → chunk-CD3MO3IC.js} +2 -2
- package/dist/{chunk-WSMYOLHG.js → chunk-CDEXRJB6.js} +5 -5
- package/dist/{chunk-3GLAPCVI.js → chunk-CFFNT2OY.js} +8 -8
- package/dist/{chunk-HO5Y2OOX.js → chunk-CMLJSF2F.js} +10 -10
- package/dist/{chunk-RA3FNMWF.js → chunk-CP7ZQHBW.js} +10 -10
- package/dist/{chunk-IOKSNX74.js → chunk-D5OWJZQR.js} +2 -2
- package/dist/{chunk-SQGXMHJO.js → chunk-DGLRZMXL.js} +3 -3
- package/dist/{chunk-GNEHAPKV.js → chunk-DJFTH2DI.js} +3 -3
- package/dist/{chunk-HQG4SLTE.js → chunk-DYJGYGPB.js} +2 -2
- package/dist/{chunk-4EAF3HSD.js → chunk-EJ7WARW7.js} +2 -2
- package/dist/{chunk-3AA6RNGE.js → chunk-ENS6E4RZ.js} +2 -2
- package/dist/{chunk-OOEO4MKY.js → chunk-EPWD4KRA.js} +2 -2
- package/dist/{chunk-PN66T6JA.js → chunk-EQE3MNQN.js} +5 -5
- package/dist/{chunk-TSBE4KOQ.js → chunk-EWL6NDOO.js} +3 -3
- package/dist/{chunk-OO2T63BY.js → chunk-EYS4ZOF5.js} +2 -2
- package/dist/{chunk-7CZTKBTI.js → chunk-FDAV72IX.js} +5 -5
- package/dist/{chunk-AG7VGUIW.js → chunk-FFNPUSVO.js} +7 -7
- package/dist/{chunk-P5T36BA3.js → chunk-FRP64DEK.js} +2 -2
- package/dist/{chunk-KBF3SE7G.js → chunk-FSP334UU.js} +2 -2
- package/dist/{chunk-BSX2R4CW.js → chunk-FTX5CNHA.js} +4 -4
- package/dist/{chunk-O756O2I7.js → chunk-FWOBNL2A.js} +1 -1
- package/dist/{chunk-6NIB2KGJ.js → chunk-FWYEZ3LE.js} +33 -33
- package/dist/{chunk-DLOYMWUQ.js → chunk-G4HQUBO4.js} +7 -7
- package/dist/{chunk-CSHBR2IZ.js → chunk-GDLDBR6B.js} +2 -2
- package/dist/chunk-GGV4NSG3.js +792 -0
- package/dist/chunk-GGV4NSG3.js.map +1 -0
- package/dist/{chunk-U36PO27Q.js → chunk-GHHM6WN4.js} +3 -3
- package/dist/{chunk-OANSIX34.js → chunk-GRSODLVO.js} +4 -4
- package/dist/{chunk-4R3JCVID.js → chunk-GT7JFQ4E.js} +410 -153
- package/dist/chunk-GT7JFQ4E.js.map +1 -0
- package/dist/{chunk-EU6XSQFM.js → chunk-GXW2I2M2.js} +2 -2
- package/dist/{chunk-5JEIDFPD.js → chunk-GZS37O3G.js} +1 -1
- package/dist/{chunk-XFNLU7EW.js → chunk-H5M33DAL.js} +15 -6
- package/dist/chunk-H5M33DAL.js.map +1 -0
- package/dist/{chunk-HNYJEAES.js → chunk-HQWVDQXW.js} +7 -7
- package/dist/{chunk-YXOKAG66.js → chunk-HU6JTNWF.js} +2 -2
- package/dist/{chunk-QRVNI5V6.js → chunk-I6KIQKU6.js} +3 -3
- package/dist/{chunk-APU42QDI.js → chunk-IBA5FMRE.js} +115 -111
- package/dist/chunk-IBA5FMRE.js.map +1 -0
- package/dist/{chunk-BNUPYHHZ.js → chunk-IDXTASGN.js} +4 -4
- package/dist/{chunk-KF3MF6FP.js → chunk-IECRGM6K.js} +3 -2
- package/dist/chunk-IECRGM6K.js.map +1 -0
- package/dist/chunk-IJYL5BZM.js +38 -0
- package/dist/chunk-IJYL5BZM.js.map +1 -0
- package/dist/{chunk-L6RXRRN3.js → chunk-ILDOW2IQ.js} +3 -3
- package/dist/{chunk-VUHPA3XQ.js → chunk-ITX2TB4K.js} +6 -6
- package/dist/{chunk-BXRIQZAH.js → chunk-J22HD2PB.js} +5 -5
- package/dist/{chunk-U47YDYLQ.js → chunk-J5MEDX7C.js} +8 -8
- package/dist/{chunk-F6LBGYS6.js → chunk-J7FBBLHF.js} +35 -35
- package/dist/{chunk-5JZYPZ72.js → chunk-JFK7NTEA.js} +4 -4
- package/dist/chunk-JFK7NTEA.js.map +1 -0
- package/dist/{chunk-QZRDCFHI.js → chunk-JM4HQPAI.js} +5 -5
- package/dist/{chunk-PIVGX42P.js → chunk-JNY5MT3I.js} +2 -2
- package/dist/{chunk-XWWXIZFP.js → chunk-JO6R5EXF.js} +7 -7
- package/dist/{chunk-NWZW2WHN.js → chunk-JQCGPTZ6.js} +9 -9
- package/dist/chunk-JRSNCSZN.js +37 -0
- package/dist/chunk-JRSNCSZN.js.map +1 -0
- package/dist/{chunk-OR37STQZ.js → chunk-KEXYBG7Q.js} +3 -3
- package/dist/{chunk-AZVANYMB.js → chunk-KUNFUSZ7.js} +2 -2
- package/dist/{chunk-DXZNDKQD.js → chunk-LEEJBZ5B.js} +2 -2
- package/dist/{chunk-STUCI6QA.js → chunk-LEKBNKLD.js} +1 -1
- package/dist/{chunk-STUCI6QA.js.map → chunk-LEKBNKLD.js.map} +1 -1
- package/dist/{chunk-AOLE4IRZ.js → chunk-LF5CBAOS.js} +5 -5
- package/dist/{chunk-BJIZ7PL7.js → chunk-LHLK7FUA.js} +145 -29
- package/dist/chunk-LHLK7FUA.js.map +1 -0
- package/dist/{chunk-RIMKJBCD.js → chunk-LMPTC4CX.js} +2 -2
- package/dist/{chunk-3KVWXKD6.js → chunk-LQ47YL6E.js} +2 -2
- package/dist/{chunk-RSNYGEVZ.js → chunk-LT4J7RHI.js} +13 -13
- package/dist/{chunk-U3HSFCON.js → chunk-MCTTONOW.js} +28 -28
- package/dist/{chunk-7DU35P5J.js → chunk-MIECLOQC.js} +9 -9
- package/dist/{chunk-FM4OUCC2.js → chunk-MOKYT3X3.js} +3 -3
- package/dist/{chunk-GZ64CASI.js → chunk-MVZYNZXE.js} +5 -4
- package/dist/chunk-MVZYNZXE.js.map +1 -0
- package/dist/{chunk-L7YURQI2.js → chunk-MXLKI7BI.js} +3 -3
- package/dist/{chunk-XRRSFQEV.js → chunk-NAZZLAWX.js} +2 -2
- package/dist/{chunk-UWJ5P5CU.js → chunk-NEK4WB5P.js} +3 -3
- package/dist/{chunk-6L7U46Y2.js → chunk-NKNVIO66.js} +2 -2
- package/dist/{chunk-JKUICTLM.js → chunk-NLAFNMPK.js} +2 -2
- package/dist/{chunk-4LKNIGHB.js → chunk-O2SBHS2N.js} +2 -2
- package/dist/{chunk-DWPOQ3S5.js → chunk-OTMWHZBY.js} +2 -2
- package/dist/{chunk-JTN3T4QN.js → chunk-PCFK7HKD.js} +14 -14
- package/dist/{chunk-VVCDB2T7.js → chunk-PCJLH45G.js} +3 -3
- package/dist/{chunk-PZ24CYDO.js → chunk-PFAUGEV5.js} +2 -2
- package/dist/{chunk-HGMWMK5K.js → chunk-PO3BH3KQ.js} +2 -2
- package/dist/{chunk-B74GSYR6.js → chunk-PUTS4DYW.js} +2 -2
- package/dist/{chunk-JSIDLTTG.js → chunk-PZ2V2XIK.js} +2 -2
- package/dist/{chunk-TMEQPODK.js → chunk-PZ37VDB5.js} +2 -2
- package/dist/{chunk-Q35DT6I6.js → chunk-QFMLAT7L.js} +234 -225
- package/dist/chunk-QFMLAT7L.js.map +1 -0
- package/dist/{chunk-LVONK3YQ.js → chunk-QRKTESVE.js} +2 -2
- package/dist/{chunk-HT5WSUC7.js → chunk-QXEDIDBZ.js} +3 -3
- package/dist/{chunk-WURSS6MP.js → chunk-R66YMYJU.js} +2 -2
- package/dist/{chunk-HDHK3SXK.js → chunk-RFLYID6H.js} +5 -5
- package/dist/{chunk-ADJJQSYC.js → chunk-RIYZFKIM.js} +39 -37
- package/dist/chunk-RIYZFKIM.js.map +1 -0
- package/dist/{chunk-JK7C5A4I.js → chunk-RQNZDTKT.js} +19 -19
- package/dist/{chunk-EHCUFCXM.js → chunk-RYSRFAHN.js} +32 -22
- package/dist/chunk-RYSRFAHN.js.map +1 -0
- package/dist/{chunk-I6VUUEXH.js → chunk-S2U4CDAC.js} +150 -150
- package/dist/chunk-S2U4CDAC.js.map +1 -0
- package/dist/{chunk-ST22GONV.js → chunk-S37GP7LX.js} +19 -19
- package/dist/{chunk-A2EWJQXX.js → chunk-SM5QX6UK.js} +4 -4
- package/dist/{chunk-FBE6AIIW.js → chunk-SOKNCW5U.js} +2 -2
- package/dist/{chunk-4W7VISE7.js → chunk-SSOO4GWN.js} +193 -194
- package/dist/chunk-SSOO4GWN.js.map +1 -0
- package/dist/{chunk-UP4BE32Y.js → chunk-SY2AAZNB.js} +5 -5
- package/dist/{chunk-33TPANCR.js → chunk-TFK4KFKA.js} +4 -4
- package/dist/{chunk-4432A3HQ.js → chunk-TIQPKOFW.js} +4 -4
- package/dist/{chunk-HPPKLBTJ.js → chunk-TJQDL3JH.js} +2 -2
- package/dist/chunk-TL7BOFFL.js +89 -0
- package/dist/chunk-TL7BOFFL.js.map +1 -0
- package/dist/{chunk-FD4Q5KFL.js → chunk-TLL22FFO.js} +2 -2
- package/dist/{chunk-QM5H4FPT.js → chunk-TV6BWONY.js} +3 -3
- package/dist/{chunk-4VKA5O7T.js → chunk-U6MPB3K6.js} +4 -4
- package/dist/{chunk-XOFUXMPP.js → chunk-ULJAOMJA.js} +2 -2
- package/dist/chunk-ULYQEFNH.js +529 -0
- package/dist/chunk-ULYQEFNH.js.map +1 -0
- package/dist/{chunk-H5EVWF6L.js → chunk-UNNJUJVD.js} +2 -2
- package/dist/{chunk-RGW24ZZM.js → chunk-UP7I3W6O.js} +51 -49
- package/dist/chunk-UP7I3W6O.js.map +1 -0
- package/dist/{chunk-5MZTJMZ3.js → chunk-UUGR3X5I.js} +17 -11
- package/dist/chunk-UUGR3X5I.js.map +1 -0
- package/dist/{chunk-Z6DKXQG7.js → chunk-UXXFMF4X.js} +2 -2
- package/dist/{chunk-OBQVTCTW.js → chunk-UYNCMZX5.js} +4 -4
- package/dist/{chunk-RGPYMHKI.js → chunk-V3K4RQO7.js} +9 -3
- package/dist/chunk-V3K4RQO7.js.map +1 -0
- package/dist/{chunk-KZHW27BV.js → chunk-V4QZ7UBK.js} +2 -2
- package/dist/{chunk-SUVEDKE2.js → chunk-VH5EGTH2.js} +3 -3
- package/dist/{chunk-MYNUBDU7.js → chunk-VYKW6TB2.js} +1 -1
- package/dist/chunk-VYKW6TB2.js.map +1 -0
- package/dist/{chunk-QEJTQTF5.js → chunk-W6T5HR3Z.js} +3 -3
- package/dist/{chunk-VP62LPLW.js → chunk-WCMG4HYI.js} +10 -10
- package/dist/{chunk-GZLLDA6P.js → chunk-WEFN327U.js} +2 -2
- package/dist/{chunk-7BST7BA6.js → chunk-WKHUZIOW.js} +1 -1
- package/dist/{chunk-ANHUMDJX.js → chunk-WNDTLK44.js} +2 -2
- package/dist/{chunk-2DS4UOYQ.js → chunk-WSZQNTVN.js} +2 -2
- package/dist/{chunk-GALB2G3W.js → chunk-X2AH4DRF.js} +2 -2
- package/dist/{chunk-Z2DAWUO3.js → chunk-XMNUZUUA.js} +6 -6
- package/dist/{chunk-GAIM5RNE.js → chunk-XN7NSPE6.js} +3 -3
- package/dist/chunk-XV6ZYRHK.js +59 -0
- package/dist/chunk-XV6ZYRHK.js.map +1 -0
- package/dist/{chunk-FLGUVRR7.js → chunk-Y5BSA3I7.js} +5 -5
- package/dist/{chunk-WRLWLGEF.js → chunk-Y5E3XQ2S.js} +25 -2
- package/dist/{chunk-WRLWLGEF.js.map → chunk-Y5E3XQ2S.js.map} +1 -1
- package/dist/{chunk-QCD5Y7K5.js → chunk-YEROLKOA.js} +16 -16
- package/dist/{chunk-NDF3SH3X.js → chunk-YJPKDRI2.js} +15 -15
- package/dist/{chunk-TQGJN5UZ.js → chunk-YV56F4UP.js} +318 -700
- package/dist/chunk-YV56F4UP.js.map +1 -0
- package/dist/{chunk-VAIESMPY.js → chunk-YVBHGMKC.js} +4 -4
- package/dist/{chunk-AD22P5X3.js → chunk-YXA2EKV3.js} +3 -3
- package/dist/{chunk-FDNJVZRE.js → chunk-YYCOSTUU.js} +17 -17
- package/dist/{chunk-NLMTNEWW.js → chunk-Z6E6TUAE.js} +2 -2
- package/dist/{chunk-BJW7G6EF.js → chunk-Z7IGO5EA.js} +3 -3
- package/dist/{chunk-NCX5SAQY.js → chunk-ZEIFJ6PX.js} +5 -5
- package/dist/{chunk-JRXHSVD5.js → chunk-ZS2UQ3DV.js} +65 -8
- package/dist/chunk-ZS2UQ3DV.js.map +1 -0
- package/dist/{chunk-4EONHNJU.js → chunk-ZVVT72MT.js} +2 -2
- package/dist/components/browser-viewer.d.ts +1 -1
- package/dist/composer.js +13 -13
- package/dist/{computer-viewer-KEDVLD42.js → computer-viewer-25AJIDYA.js} +9 -9
- package/dist/connect.js +10 -10
- package/dist/desktop.js +2 -2
- package/dist/editor.js +2 -2
- package/dist/{embedded-new-voice-LFHWWYD2.js → embedded-new-voice-RZZEJT6M.js} +7 -7
- package/dist/{embedded-voice-6QS4ANNX.js → embedded-voice-6OKSSPLW.js} +7 -7
- package/dist/{fleet-decision-row-QNSTP3VX.js → fleet-decision-row-NN2HXDX3.js} +2 -2
- package/dist/hooks/internal.d.ts +38 -0
- package/dist/hooks/use-client-config-flags.d.ts +12 -0
- package/dist/hooks/use-workspace-sessions.d.ts +10 -1
- package/dist/index.js +233 -227
- package/dist/interaction.js +11 -9
- package/dist/interaction.js.map +1 -1
- package/dist/{latest-question-AW3PPDUM.js → latest-question-2PFWQSSG.js} +4 -3
- package/dist/{latest-question-AW3PPDUM.js.map → latest-question-2PFWQSSG.js.map} +1 -1
- package/dist/machines.js +5 -5
- package/dist/messages/en.d.ts +3 -3
- package/dist/messages.js +1 -1
- package/dist/{model-policy-picker-menu-CURJ247L.js → model-policy-picker-menu-VVFGGAI6.js} +6 -6
- package/dist/native-previews.js +3 -3
- package/dist/{platform-activity-row-BMXXNZKX.js → platform-activity-row-ENQVIFTL.js} +2 -2
- package/dist/{queue-surface-implementation-2X5AXB6I.js → queue-surface-implementation-4SHOQPQQ.js} +10 -8
- package/dist/{queue-surface-implementation-2X5AXB6I.js.map → queue-surface-implementation-4SHOQPQQ.js.map} +1 -1
- package/dist/realtime.js +6 -6
- package/dist/{sandbox-files-4FBG3GS2.js → sandbox-files-CCOTGXXA.js} +11 -11
- package/dist/sandbox-files-CCOTGXXA.js.map +1 -0
- package/dist/session-app.js +258 -252
- package/dist/session-list-model.d.ts +1 -0
- package/dist/session-list-model.js +8 -2
- package/dist/{session-realtime-2XIB254N.js → session-realtime-JNKDSGH7.js} +3 -3
- package/dist/session-realtime-JNKDSGH7.js.map +1 -0
- package/dist/session-realtime.js +2 -2
- package/dist/session-ui.js +76 -71
- package/dist/session.js +24 -22
- package/dist/sites.js +2 -2
- package/dist/terminal.js +2 -2
- package/dist/this-computer.js +3 -3
- package/dist/timeline/invoked-tool.d.ts +5 -0
- package/dist/timeline/tool-display-name.d.ts +2 -2
- package/dist/timeline/tool-icon.d.ts +14 -0
- package/dist/timeline/tool-presentation.d.ts +8 -3
- package/dist/{timeline-annotation-markers-X4K2IEOO.js → timeline-annotation-markers-KHNYNY2J.js} +5 -5
- package/dist/{timeline-annotation-selection-MEHBW676.js → timeline-annotation-selection-AXEDJHBP.js} +7 -7
- package/dist/{timeline-annotations-dialog-U2FPQ3UY.js → timeline-annotations-dialog-AV4ZBXRC.js} +9 -9
- package/dist/timeline-model.js +25 -23
- package/dist/ui/access-list.js +18 -18
- package/dist/ui/cadence-picker.js +2 -2
- package/dist/ui/choice-cards.js +2 -2
- package/dist/ui/detail-page.js +2 -2
- package/dist/ui/detail-sheet.js +2 -2
- package/dist/ui/diff-view.js +2 -2
- package/dist/ui/disclosure.js +4 -4
- package/dist/ui/flush-form-page.js +3 -3
- package/dist/ui/form-dialog.js +2 -2
- package/dist/ui/list-row.js +4 -4
- package/dist/ui/revision-history.js +11 -11
- package/dist/ui/role-select.js +7 -7
- package/dist/ui/select-menu.js +2 -2
- package/dist/ui/settings-nav.js +3 -3
- package/dist/usage.js +3 -3
- package/dist/workbench.js +11 -11
- package/package.json +4 -4
- package/src/app/app-state.tsx +3 -1
- package/src/app/components/capabilities/session-machine-card.tsx +9 -2
- package/src/app/components/rail/session-list.tsx +254 -44
- package/src/app/components/rail/session-row-content.tsx +24 -2
- package/src/app/components/rail/session-shell.tsx +14 -9
- package/src/app/components/rail/site-session-group-heading.tsx +59 -20
- package/src/app/components/session/session-tenancy-control.tsx +18 -0
- package/src/app/components/session/site-origin-link.test.tsx +73 -0
- package/src/app/components/session/site-origin-link.tsx +4 -2
- package/src/app/embed/memory-navigation.tsx +1 -0
- package/src/app/lib/actions/held-modifier.test.ts +101 -0
- package/src/app/lib/actions/held-modifier.ts +108 -0
- package/src/app/lib/console-site.tsx +38 -0
- package/src/app/lib/navigation.tsx +4 -0
- package/src/app/lib/routes.tsx +42 -0
- package/src/app/lib/session-failure-toasts.ts +26 -0
- package/src/app/lib/session-ui-features.tsx +18 -4
- package/src/app/lib/sessions-group.tsx +219 -30
- package/src/app/lib/site-opened.tsx +48 -0
- package/src/app/lib/site-session-groups.test.ts +173 -6
- package/src/app/lib/site-view-routes.test.ts +55 -0
- package/src/app/lib/use-session-list-hint-refresh.tsx +44 -4
- package/src/app/routes/artifacts.tsx +2 -29
- package/src/app/routes/session-transient-failures.test.tsx +343 -0
- package/src/app/routes/session-unavailable.tsx +74 -3
- package/src/app/routes/session.tsx +4 -13
- package/src/app/routes/sessions-index.tsx +13 -9
- package/src/app/routes/site-view.test.tsx +476 -0
- package/src/app/routes/site-view.tsx +583 -0
- package/src/components/browser-viewer.tsx +16 -2
- package/src/hooks/internal.ts +129 -6
- package/src/hooks/use-client-config-flags.ts +8 -0
- package/src/hooks/use-session-events.ts +83 -9
- package/src/hooks/use-workspace-sessions.ts +21 -1
- package/src/messages/en.ts +3 -3
- package/src/session-list-model.ts +4 -0
- package/src/timeline/activity-rail.tsx +3 -2
- package/src/timeline/invoked-tool.ts +14 -4
- package/src/timeline/projection.ts +11 -6
- package/src/timeline/rolling-activity.tsx +6 -2
- package/src/timeline/tool-display-name.ts +2 -2
- package/src/timeline/tool-icon.tsx +165 -0
- package/src/timeline/tool-presentation.ts +207 -48
- package/src/timeline/tool-renderers.tsx +1 -70
- package/styles/compiled.css +38 -0
- package/dist/chunk-22ZBT6CN.js +0 -50
- package/dist/chunk-22ZBT6CN.js.map +0 -1
- package/dist/chunk-4R3JCVID.js.map +0 -1
- package/dist/chunk-4W7VISE7.js.map +0 -1
- package/dist/chunk-5JZYPZ72.js.map +0 -1
- package/dist/chunk-5MZTJMZ3.js.map +0 -1
- package/dist/chunk-6W3LF3DB.js.map +0 -1
- package/dist/chunk-ADJJQSYC.js.map +0 -1
- package/dist/chunk-APU42QDI.js.map +0 -1
- package/dist/chunk-BJIZ7PL7.js.map +0 -1
- package/dist/chunk-CVG4FILQ.js.map +0 -1
- package/dist/chunk-EF5SYXAY.js.map +0 -1
- package/dist/chunk-EHCUFCXM.js.map +0 -1
- package/dist/chunk-GZ64CASI.js.map +0 -1
- package/dist/chunk-I6VUUEXH.js.map +0 -1
- package/dist/chunk-JRXHSVD5.js.map +0 -1
- package/dist/chunk-KF3MF6FP.js.map +0 -1
- package/dist/chunk-MYNUBDU7.js.map +0 -1
- package/dist/chunk-NAWXARTY.js.map +0 -1
- package/dist/chunk-PM3OSANE.js.map +0 -1
- package/dist/chunk-Q35DT6I6.js.map +0 -1
- package/dist/chunk-R25ZKOZR.js +0 -24
- package/dist/chunk-R25ZKOZR.js.map +0 -1
- package/dist/chunk-RGPYMHKI.js.map +0 -1
- package/dist/chunk-RGW24ZZM.js.map +0 -1
- package/dist/chunk-ROQOVH4N.js.map +0 -1
- package/dist/chunk-TQGJN5UZ.js.map +0 -1
- package/dist/chunk-X7L4H4VG.js.map +0 -1
- package/dist/chunk-XFNLU7EW.js.map +0 -1
- package/dist/chunk-Z5WMLJKI.js.map +0 -1
- /package/dist/{browser-viewer-RYYQSRTC.js.map → app/lib/console-site.js.map} +0 -0
- /package/dist/{chat-interactive-block-ABCRKXJ4.js.map → app/lib/site-opened.js.map} +0 -0
- /package/dist/{computer-viewer-KEDVLD42.js.map → browser-viewer-QMCNV4RI.js.map} +0 -0
- /package/dist/{embedded-new-voice-LFHWWYD2.js.map → chat-interactive-block-PMIAUXSO.js.map} +0 -0
- /package/dist/{chunk-TGVVEGZG.js.map → chunk-22FFOHPT.js.map} +0 -0
- /package/dist/{chunk-UHFWF6ZU.js.map → chunk-2FPS5H2D.js.map} +0 -0
- /package/dist/{chunk-5POTDNQT.js.map → chunk-2NC7NZCE.js.map} +0 -0
- /package/dist/{chunk-ZKYYZH6L.js.map → chunk-2QBYDGWO.js.map} +0 -0
- /package/dist/{chunk-TWXIFWBD.js.map → chunk-34EU25RL.js.map} +0 -0
- /package/dist/{chunk-R63QEVPK.js.map → chunk-35BC2FU2.js.map} +0 -0
- /package/dist/{chunk-PTGRFAMH.js.map → chunk-3ABPIUCK.js.map} +0 -0
- /package/dist/{chunk-S4SC5SSV.js.map → chunk-3GU7AWG7.js.map} +0 -0
- /package/dist/{chunk-722UO6YQ.js.map → chunk-3PEXVG4D.js.map} +0 -0
- /package/dist/{chunk-63VGE4OH.js.map → chunk-3RMKPHBL.js.map} +0 -0
- /package/dist/{chunk-RQDFYQHA.js.map → chunk-3STBLX4O.js.map} +0 -0
- /package/dist/{chunk-S4EZ3JUB.js.map → chunk-3X5FKDYQ.js.map} +0 -0
- /package/dist/{chunk-KTRKZRID.js.map → chunk-4GLLWX33.js.map} +0 -0
- /package/dist/{chunk-SD2K5ZN5.js.map → chunk-4LPA25NQ.js.map} +0 -0
- /package/dist/{chunk-KWKGBGAF.js.map → chunk-4RMN4E2Y.js.map} +0 -0
- /package/dist/{chunk-X7ASQHR6.js.map → chunk-4SAGYEVB.js.map} +0 -0
- /package/dist/{chunk-HTT3FB7T.js.map → chunk-4VK2R5QC.js.map} +0 -0
- /package/dist/{chunk-DDK4WFJ3.js.map → chunk-4XQC7VLT.js.map} +0 -0
- /package/dist/{chunk-IVOA3DXA.js.map → chunk-4YXAQMTD.js.map} +0 -0
- /package/dist/{chunk-HOJGAJAB.js.map → chunk-52WK2GGK.js.map} +0 -0
- /package/dist/{chunk-NYZQ7LO7.js.map → chunk-552UYIQ7.js.map} +0 -0
- /package/dist/{chunk-LEXPBQ56.js.map → chunk-5DSKMG2I.js.map} +0 -0
- /package/dist/{chunk-WNG757ID.js.map → chunk-5FA455GR.js.map} +0 -0
- /package/dist/{chunk-HWDGJFM4.js.map → chunk-5FEN3KYH.js.map} +0 -0
- /package/dist/{chunk-OSVHU2WU.js.map → chunk-5JHRMUAZ.js.map} +0 -0
- /package/dist/{chunk-RKB2Z457.js.map → chunk-5VGJXWQ2.js.map} +0 -0
- /package/dist/{chunk-GFUUFM2O.js.map → chunk-5W6ZDKRR.js.map} +0 -0
- /package/dist/{chunk-6PQNLL4E.js.map → chunk-5W7KJ5NQ.js.map} +0 -0
- /package/dist/{chunk-Q35YZVDZ.js.map → chunk-5Y2FPLZE.js.map} +0 -0
- /package/dist/{chunk-F3NERYBQ.js.map → chunk-62VER7O4.js.map} +0 -0
- /package/dist/{chunk-FBMU3VK5.js.map → chunk-6DCEDIF6.js.map} +0 -0
- /package/dist/{chunk-LE2EDBXU.js.map → chunk-73WI7FL2.js.map} +0 -0
- /package/dist/{chunk-ZRJCGBVV.js.map → chunk-7FJMRJDG.js.map} +0 -0
- /package/dist/{chunk-7KGKDWWR.js.map → chunk-7HFLYNWN.js.map} +0 -0
- /package/dist/{chunk-72J6C2AJ.js.map → chunk-7KIENXRE.js.map} +0 -0
- /package/dist/{chunk-CBY5CXBD.js.map → chunk-7NPCEBZE.js.map} +0 -0
- /package/dist/{chunk-46VBQG2D.js.map → chunk-7P4AQMGA.js.map} +0 -0
- /package/dist/{chunk-S7PVL7XH.js.map → chunk-A4BD4ZVB.js.map} +0 -0
- /package/dist/{chunk-73SOCVLS.js.map → chunk-AIEXYO2X.js.map} +0 -0
- /package/dist/{chunk-U7TC2XJQ.js.map → chunk-AJPW3SV4.js.map} +0 -0
- /package/dist/{chunk-HRJQAFKR.js.map → chunk-AX6YJA5U.js.map} +0 -0
- /package/dist/{chunk-P5WABK2H.js.map → chunk-BCM7C3MJ.js.map} +0 -0
- /package/dist/{chunk-DT7BORXG.js.map → chunk-BMJTNPWK.js.map} +0 -0
- /package/dist/{chunk-HIHO2QE7.js.map → chunk-BT2MVGHT.js.map} +0 -0
- /package/dist/{chunk-3XOISKZC.js.map → chunk-BXQYAAVE.js.map} +0 -0
- /package/dist/{chunk-IBTXYLBW.js.map → chunk-CCFWY4GF.js.map} +0 -0
- /package/dist/{chunk-ZOC3OP6F.js.map → chunk-CCR33J7L.js.map} +0 -0
- /package/dist/{chunk-GTQ3SNEI.js.map → chunk-CD3MO3IC.js.map} +0 -0
- /package/dist/{chunk-WSMYOLHG.js.map → chunk-CDEXRJB6.js.map} +0 -0
- /package/dist/{chunk-3GLAPCVI.js.map → chunk-CFFNT2OY.js.map} +0 -0
- /package/dist/{chunk-HO5Y2OOX.js.map → chunk-CMLJSF2F.js.map} +0 -0
- /package/dist/{chunk-RA3FNMWF.js.map → chunk-CP7ZQHBW.js.map} +0 -0
- /package/dist/{chunk-IOKSNX74.js.map → chunk-D5OWJZQR.js.map} +0 -0
- /package/dist/{chunk-SQGXMHJO.js.map → chunk-DGLRZMXL.js.map} +0 -0
- /package/dist/{chunk-GNEHAPKV.js.map → chunk-DJFTH2DI.js.map} +0 -0
- /package/dist/{chunk-HQG4SLTE.js.map → chunk-DYJGYGPB.js.map} +0 -0
- /package/dist/{chunk-4EAF3HSD.js.map → chunk-EJ7WARW7.js.map} +0 -0
- /package/dist/{chunk-3AA6RNGE.js.map → chunk-ENS6E4RZ.js.map} +0 -0
- /package/dist/{chunk-OOEO4MKY.js.map → chunk-EPWD4KRA.js.map} +0 -0
- /package/dist/{chunk-PN66T6JA.js.map → chunk-EQE3MNQN.js.map} +0 -0
- /package/dist/{chunk-TSBE4KOQ.js.map → chunk-EWL6NDOO.js.map} +0 -0
- /package/dist/{chunk-OO2T63BY.js.map → chunk-EYS4ZOF5.js.map} +0 -0
- /package/dist/{chunk-7CZTKBTI.js.map → chunk-FDAV72IX.js.map} +0 -0
- /package/dist/{chunk-AG7VGUIW.js.map → chunk-FFNPUSVO.js.map} +0 -0
- /package/dist/{chunk-P5T36BA3.js.map → chunk-FRP64DEK.js.map} +0 -0
- /package/dist/{chunk-KBF3SE7G.js.map → chunk-FSP334UU.js.map} +0 -0
- /package/dist/{chunk-BSX2R4CW.js.map → chunk-FTX5CNHA.js.map} +0 -0
- /package/dist/{chunk-O756O2I7.js.map → chunk-FWOBNL2A.js.map} +0 -0
- /package/dist/{chunk-6NIB2KGJ.js.map → chunk-FWYEZ3LE.js.map} +0 -0
- /package/dist/{chunk-DLOYMWUQ.js.map → chunk-G4HQUBO4.js.map} +0 -0
- /package/dist/{chunk-CSHBR2IZ.js.map → chunk-GDLDBR6B.js.map} +0 -0
- /package/dist/{chunk-U36PO27Q.js.map → chunk-GHHM6WN4.js.map} +0 -0
- /package/dist/{chunk-OANSIX34.js.map → chunk-GRSODLVO.js.map} +0 -0
- /package/dist/{chunk-EU6XSQFM.js.map → chunk-GXW2I2M2.js.map} +0 -0
- /package/dist/{chunk-5JEIDFPD.js.map → chunk-GZS37O3G.js.map} +0 -0
- /package/dist/{chunk-HNYJEAES.js.map → chunk-HQWVDQXW.js.map} +0 -0
- /package/dist/{chunk-YXOKAG66.js.map → chunk-HU6JTNWF.js.map} +0 -0
- /package/dist/{chunk-QRVNI5V6.js.map → chunk-I6KIQKU6.js.map} +0 -0
- /package/dist/{chunk-BNUPYHHZ.js.map → chunk-IDXTASGN.js.map} +0 -0
- /package/dist/{chunk-L6RXRRN3.js.map → chunk-ILDOW2IQ.js.map} +0 -0
- /package/dist/{chunk-VUHPA3XQ.js.map → chunk-ITX2TB4K.js.map} +0 -0
- /package/dist/{chunk-BXRIQZAH.js.map → chunk-J22HD2PB.js.map} +0 -0
- /package/dist/{chunk-U47YDYLQ.js.map → chunk-J5MEDX7C.js.map} +0 -0
- /package/dist/{chunk-F6LBGYS6.js.map → chunk-J7FBBLHF.js.map} +0 -0
- /package/dist/{chunk-QZRDCFHI.js.map → chunk-JM4HQPAI.js.map} +0 -0
- /package/dist/{chunk-PIVGX42P.js.map → chunk-JNY5MT3I.js.map} +0 -0
- /package/dist/{chunk-XWWXIZFP.js.map → chunk-JO6R5EXF.js.map} +0 -0
- /package/dist/{chunk-NWZW2WHN.js.map → chunk-JQCGPTZ6.js.map} +0 -0
- /package/dist/{chunk-OR37STQZ.js.map → chunk-KEXYBG7Q.js.map} +0 -0
- /package/dist/{chunk-AZVANYMB.js.map → chunk-KUNFUSZ7.js.map} +0 -0
- /package/dist/{chunk-DXZNDKQD.js.map → chunk-LEEJBZ5B.js.map} +0 -0
- /package/dist/{chunk-AOLE4IRZ.js.map → chunk-LF5CBAOS.js.map} +0 -0
- /package/dist/{chunk-RIMKJBCD.js.map → chunk-LMPTC4CX.js.map} +0 -0
- /package/dist/{chunk-3KVWXKD6.js.map → chunk-LQ47YL6E.js.map} +0 -0
- /package/dist/{chunk-RSNYGEVZ.js.map → chunk-LT4J7RHI.js.map} +0 -0
- /package/dist/{chunk-U3HSFCON.js.map → chunk-MCTTONOW.js.map} +0 -0
- /package/dist/{chunk-7DU35P5J.js.map → chunk-MIECLOQC.js.map} +0 -0
- /package/dist/{chunk-FM4OUCC2.js.map → chunk-MOKYT3X3.js.map} +0 -0
- /package/dist/{chunk-L7YURQI2.js.map → chunk-MXLKI7BI.js.map} +0 -0
- /package/dist/{chunk-XRRSFQEV.js.map → chunk-NAZZLAWX.js.map} +0 -0
- /package/dist/{chunk-UWJ5P5CU.js.map → chunk-NEK4WB5P.js.map} +0 -0
- /package/dist/{chunk-6L7U46Y2.js.map → chunk-NKNVIO66.js.map} +0 -0
- /package/dist/{chunk-JKUICTLM.js.map → chunk-NLAFNMPK.js.map} +0 -0
- /package/dist/{chunk-4LKNIGHB.js.map → chunk-O2SBHS2N.js.map} +0 -0
- /package/dist/{chunk-DWPOQ3S5.js.map → chunk-OTMWHZBY.js.map} +0 -0
- /package/dist/{chunk-JTN3T4QN.js.map → chunk-PCFK7HKD.js.map} +0 -0
- /package/dist/{chunk-VVCDB2T7.js.map → chunk-PCJLH45G.js.map} +0 -0
- /package/dist/{chunk-PZ24CYDO.js.map → chunk-PFAUGEV5.js.map} +0 -0
- /package/dist/{chunk-HGMWMK5K.js.map → chunk-PO3BH3KQ.js.map} +0 -0
- /package/dist/{chunk-B74GSYR6.js.map → chunk-PUTS4DYW.js.map} +0 -0
- /package/dist/{chunk-JSIDLTTG.js.map → chunk-PZ2V2XIK.js.map} +0 -0
- /package/dist/{chunk-TMEQPODK.js.map → chunk-PZ37VDB5.js.map} +0 -0
- /package/dist/{chunk-LVONK3YQ.js.map → chunk-QRKTESVE.js.map} +0 -0
- /package/dist/{chunk-HT5WSUC7.js.map → chunk-QXEDIDBZ.js.map} +0 -0
- /package/dist/{chunk-WURSS6MP.js.map → chunk-R66YMYJU.js.map} +0 -0
- /package/dist/{chunk-HDHK3SXK.js.map → chunk-RFLYID6H.js.map} +0 -0
- /package/dist/{chunk-JK7C5A4I.js.map → chunk-RQNZDTKT.js.map} +0 -0
- /package/dist/{chunk-ST22GONV.js.map → chunk-S37GP7LX.js.map} +0 -0
- /package/dist/{chunk-A2EWJQXX.js.map → chunk-SM5QX6UK.js.map} +0 -0
- /package/dist/{chunk-FBE6AIIW.js.map → chunk-SOKNCW5U.js.map} +0 -0
- /package/dist/{chunk-UP4BE32Y.js.map → chunk-SY2AAZNB.js.map} +0 -0
- /package/dist/{chunk-33TPANCR.js.map → chunk-TFK4KFKA.js.map} +0 -0
- /package/dist/{chunk-4432A3HQ.js.map → chunk-TIQPKOFW.js.map} +0 -0
- /package/dist/{chunk-HPPKLBTJ.js.map → chunk-TJQDL3JH.js.map} +0 -0
- /package/dist/{chunk-FD4Q5KFL.js.map → chunk-TLL22FFO.js.map} +0 -0
- /package/dist/{chunk-QM5H4FPT.js.map → chunk-TV6BWONY.js.map} +0 -0
- /package/dist/{chunk-4VKA5O7T.js.map → chunk-U6MPB3K6.js.map} +0 -0
- /package/dist/{chunk-XOFUXMPP.js.map → chunk-ULJAOMJA.js.map} +0 -0
- /package/dist/{chunk-H5EVWF6L.js.map → chunk-UNNJUJVD.js.map} +0 -0
- /package/dist/{chunk-Z6DKXQG7.js.map → chunk-UXXFMF4X.js.map} +0 -0
- /package/dist/{chunk-OBQVTCTW.js.map → chunk-UYNCMZX5.js.map} +0 -0
- /package/dist/{chunk-KZHW27BV.js.map → chunk-V4QZ7UBK.js.map} +0 -0
- /package/dist/{chunk-SUVEDKE2.js.map → chunk-VH5EGTH2.js.map} +0 -0
- /package/dist/{chunk-QEJTQTF5.js.map → chunk-W6T5HR3Z.js.map} +0 -0
- /package/dist/{chunk-VP62LPLW.js.map → chunk-WCMG4HYI.js.map} +0 -0
- /package/dist/{chunk-GZLLDA6P.js.map → chunk-WEFN327U.js.map} +0 -0
- /package/dist/{chunk-7BST7BA6.js.map → chunk-WKHUZIOW.js.map} +0 -0
- /package/dist/{chunk-ANHUMDJX.js.map → chunk-WNDTLK44.js.map} +0 -0
- /package/dist/{chunk-2DS4UOYQ.js.map → chunk-WSZQNTVN.js.map} +0 -0
- /package/dist/{chunk-GALB2G3W.js.map → chunk-X2AH4DRF.js.map} +0 -0
- /package/dist/{chunk-Z2DAWUO3.js.map → chunk-XMNUZUUA.js.map} +0 -0
- /package/dist/{chunk-GAIM5RNE.js.map → chunk-XN7NSPE6.js.map} +0 -0
- /package/dist/{chunk-FLGUVRR7.js.map → chunk-Y5BSA3I7.js.map} +0 -0
- /package/dist/{chunk-QCD5Y7K5.js.map → chunk-YEROLKOA.js.map} +0 -0
- /package/dist/{chunk-NDF3SH3X.js.map → chunk-YJPKDRI2.js.map} +0 -0
- /package/dist/{chunk-VAIESMPY.js.map → chunk-YVBHGMKC.js.map} +0 -0
- /package/dist/{chunk-AD22P5X3.js.map → chunk-YXA2EKV3.js.map} +0 -0
- /package/dist/{chunk-FDNJVZRE.js.map → chunk-YYCOSTUU.js.map} +0 -0
- /package/dist/{chunk-NLMTNEWW.js.map → chunk-Z6E6TUAE.js.map} +0 -0
- /package/dist/{chunk-BJW7G6EF.js.map → chunk-Z7IGO5EA.js.map} +0 -0
- /package/dist/{chunk-NCX5SAQY.js.map → chunk-ZEIFJ6PX.js.map} +0 -0
- /package/dist/{chunk-4EONHNJU.js.map → chunk-ZVVT72MT.js.map} +0 -0
- /package/dist/{embedded-voice-6QS4ANNX.js.map → computer-viewer-25AJIDYA.js.map} +0 -0
- /package/dist/{model-policy-picker-menu-CURJ247L.js.map → embedded-new-voice-RZZEJT6M.js.map} +0 -0
- /package/dist/{sandbox-files-4FBG3GS2.js.map → embedded-voice-6OKSSPLW.js.map} +0 -0
- /package/dist/{fleet-decision-row-QNSTP3VX.js.map → fleet-decision-row-NN2HXDX3.js.map} +0 -0
- /package/dist/{session-realtime-2XIB254N.js.map → model-policy-picker-menu-VVFGGAI6.js.map} +0 -0
- /package/dist/{platform-activity-row-BMXXNZKX.js.map → platform-activity-row-ENQVIFTL.js.map} +0 -0
- /package/dist/{timeline-annotation-markers-X4K2IEOO.js.map → timeline-annotation-markers-KHNYNY2J.js.map} +0 -0
- /package/dist/{timeline-annotation-selection-MEHBW676.js.map → timeline-annotation-selection-AXEDJHBP.js.map} +0 -0
- /package/dist/{timeline-annotations-dialog-U2FPQ3UY.js.map → timeline-annotations-dialog-AV4ZBXRC.js.map} +0 -0
|
@@ -11,6 +11,8 @@ export default function SessionRouteAuxiliary(props: {
|
|
|
11
11
|
workspaceId: string;
|
|
12
12
|
sessionId: string;
|
|
13
13
|
loadError: unknown;
|
|
14
|
+
/** Retry the session read now (it also keeps retrying in the background). */
|
|
15
|
+
onRetry?: (() => void) | undefined;
|
|
14
16
|
session?: never | undefined;
|
|
15
17
|
events?: never | undefined;
|
|
16
18
|
}): import("react").JSX.Element;
|
|
@@ -1,7 +1,4 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {
|
|
3
|
-
sessionTenancyOperationController
|
|
4
|
-
} from "../../../chunk-HQ6SKOZ2.js";
|
|
5
2
|
import {
|
|
6
3
|
classifySessionTenancyFailure,
|
|
7
4
|
isCurrentSessionTenancyTarget,
|
|
@@ -13,14 +10,17 @@ import {
|
|
|
13
10
|
sessionVisibilityWorkStopsWork,
|
|
14
11
|
sessionVisibilityWorkSummary
|
|
15
12
|
} from "../../../chunk-ENGJ3OT6.js";
|
|
13
|
+
import {
|
|
14
|
+
sessionTenancyOperationController
|
|
15
|
+
} from "../../../chunk-HQ6SKOZ2.js";
|
|
16
16
|
import {
|
|
17
17
|
SessionUnavailableRoute
|
|
18
|
-
} from "../../../chunk-
|
|
18
|
+
} from "../../../chunk-ZS2UQ3DV.js";
|
|
19
19
|
import "../../../chunk-YUVGBL7S.js";
|
|
20
|
-
import "../../../chunk-
|
|
20
|
+
import "../../../chunk-6DCEDIF6.js";
|
|
21
21
|
import {
|
|
22
22
|
workspaceSessionsPath
|
|
23
|
-
} from "../../../chunk-
|
|
23
|
+
} from "../../../chunk-Y5E3XQ2S.js";
|
|
24
24
|
import "../../../chunk-7LP3W5H5.js";
|
|
25
25
|
import {
|
|
26
26
|
ProblemPanel
|
|
@@ -33,23 +33,6 @@ import {
|
|
|
33
33
|
ConfirmDialog
|
|
34
34
|
} from "../../../chunk-Q27G7PF6.js";
|
|
35
35
|
import "../../../chunk-HZUL2CUH.js";
|
|
36
|
-
import {
|
|
37
|
-
runCurrentTransitionInvocation
|
|
38
|
-
} from "../../../chunk-ANALJOJL.js";
|
|
39
|
-
import {
|
|
40
|
-
isPersonalWorkspace
|
|
41
|
-
} from "../../../chunk-74JEZLLQ.js";
|
|
42
|
-
import {
|
|
43
|
-
toast
|
|
44
|
-
} from "../../../chunk-YG6NARQY.js";
|
|
45
|
-
import {
|
|
46
|
-
useNavigate
|
|
47
|
-
} from "../../../chunk-MYNUBDU7.js";
|
|
48
|
-
import "../../../chunk-IZUAIHR4.js";
|
|
49
|
-
import "../../../chunk-L4OF77LE.js";
|
|
50
|
-
import {
|
|
51
|
-
useAppContext
|
|
52
|
-
} from "../../../chunk-W6KAUGXO.js";
|
|
53
36
|
import {
|
|
54
37
|
DropdownMenu,
|
|
55
38
|
DropdownMenuContent,
|
|
@@ -57,13 +40,30 @@ import {
|
|
|
57
40
|
DropdownMenuSeparator,
|
|
58
41
|
DropdownMenuTrigger
|
|
59
42
|
} from "../../../chunk-TREHTIBD.js";
|
|
60
|
-
import "../../../chunk-5OTQA7CM.js";
|
|
61
43
|
import {
|
|
62
44
|
Tooltip,
|
|
63
45
|
TooltipContent,
|
|
64
46
|
TooltipProvider,
|
|
65
47
|
TooltipTrigger
|
|
66
48
|
} from "../../../chunk-OLTGED2Q.js";
|
|
49
|
+
import {
|
|
50
|
+
runCurrentTransitionInvocation
|
|
51
|
+
} from "../../../chunk-ANALJOJL.js";
|
|
52
|
+
import {
|
|
53
|
+
toast
|
|
54
|
+
} from "../../../chunk-YG6NARQY.js";
|
|
55
|
+
import {
|
|
56
|
+
useNavigate
|
|
57
|
+
} from "../../../chunk-VYKW6TB2.js";
|
|
58
|
+
import "../../../chunk-IZUAIHR4.js";
|
|
59
|
+
import {
|
|
60
|
+
isPersonalWorkspace
|
|
61
|
+
} from "../../../chunk-74JEZLLQ.js";
|
|
62
|
+
import {
|
|
63
|
+
useAppContext
|
|
64
|
+
} from "../../../chunk-W6KAUGXO.js";
|
|
65
|
+
import "../../../chunk-5OTQA7CM.js";
|
|
66
|
+
import "../../../chunk-L4OF77LE.js";
|
|
67
67
|
import {
|
|
68
68
|
Notice
|
|
69
69
|
} from "../../../chunk-WLEDGIVS.js";
|
|
@@ -71,9 +71,12 @@ import {
|
|
|
71
71
|
Button
|
|
72
72
|
} from "../../../chunk-HMU5IELG.js";
|
|
73
73
|
import "../../../chunk-J3BHDXQQ.js";
|
|
74
|
+
import "../../../chunk-2KO2G3RI.js";
|
|
75
|
+
import "../../../chunk-CM7LVUKC.js";
|
|
74
76
|
import "../../../chunk-TXS65BB2.js";
|
|
75
77
|
|
|
76
78
|
// src/app/components/session/session-tenancy-control.tsx
|
|
79
|
+
import { isTransientRequestError } from "@opengeni/sdk";
|
|
77
80
|
import {
|
|
78
81
|
ChevronDownIcon,
|
|
79
82
|
CircleAlertIcon,
|
|
@@ -86,7 +89,19 @@ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
|
86
89
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
87
90
|
var STOPPING_WORK_RETRIES = 3;
|
|
88
91
|
function SessionRouteAuxiliary(props) {
|
|
89
|
-
return props.session ? /* @__PURE__ */ jsx(SessionTenancyRouteControl, { session: props.session, events: props.events }) :
|
|
92
|
+
return props.session ? /* @__PURE__ */ jsx(SessionTenancyRouteControl, { session: props.session, events: props.events }) : isTransientRequestError(props.loadError) ? (
|
|
93
|
+
// The session read has failed transiently for a while (an outage outlasting
|
|
94
|
+
// a rolling deploy). The read keeps retrying and the page opens the session
|
|
95
|
+
// on its own when it succeeds.
|
|
96
|
+
/* @__PURE__ */ jsx(
|
|
97
|
+
ProblemPanel,
|
|
98
|
+
{
|
|
99
|
+
title: "Temporarily unavailable",
|
|
100
|
+
description: "Retrying automatically.",
|
|
101
|
+
action: props.onRetry ? /* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", onClick: props.onRetry, children: "Try again" }) : void 0
|
|
102
|
+
}
|
|
103
|
+
)
|
|
104
|
+
) : !isApiErrorStatus(props.loadError, 404) ? /* @__PURE__ */ jsx(
|
|
90
105
|
ProblemPanel,
|
|
91
106
|
{
|
|
92
107
|
title: "Unable to open session",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/app/components/session/session-tenancy-control.tsx"],"sourcesContent":["import type { OpenGeniBrowserClient } from \"@opengeni/sdk/browser\";\nimport type {\n Session,\n SessionEvent,\n SessionVisibility,\n SessionVisibilityWork,\n} from \"@opengeni/sdk\";\nimport { useNavigate } from \"../../lib/navigation\";\nimport {\n ChevronDownIcon,\n CircleAlertIcon,\n CopyPlusIcon,\n Loader2Icon,\n LockKeyholeIcon,\n UsersIcon,\n} from \"lucide-react\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { toast } from \"../../lib/toast\";\n\nimport { Button } from \"../../../ui/button\";\nimport { ConfirmDialog } from \"../../../ui/confirm-dialog\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"../../../ui/dropdown-menu\";\nimport { Notice } from \"../../../ui/notice\";\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from \"../../../ui/tooltip\";\nimport { ProblemPanel } from \"../common\";\nimport { useAppContext } from \"../../app-context\";\nimport { isApiErrorStatus } from \"../../lib/app-api\";\nimport { isPersonalWorkspace } from \"../../lib/managed-self-context\";\nimport { workspaceSessionsPath } from \"../../lib/routes\";\nimport { SessionUnavailableRoute } from \"../../routes/session-unavailable\";\nimport {\n classifySessionTenancyFailure,\n isCurrentSessionTenancyTarget,\n isStoppingSessionWorkError,\n normalizeSessionVisibilityWork,\n privateSessionSandboxNote,\n retryableSessionTenancyReconciliationFailure,\n sessionVisibilityWorkIsEmpty,\n sessionVisibilityWorkStopsWork,\n sessionVisibilityWorkSummary,\n type SessionTenancyTarget,\n} from \"../../lib/session-tenancy\";\nimport {\n sessionTenancyOperationController,\n type SessionTenancyOperationController,\n type SessionTenancyOperationScope,\n} from \"../../lib/session-tenancy-operation-controller\";\nimport {\n runCurrentTransitionInvocation,\n type WorkspaceTransitionIdentity,\n} from \"../../lib/workspace-transition\";\n\ntype Confirmation =\n | { kind: \"visibility\"; visibility: SessionVisibility }\n | { kind: \"fork\"; visibility: SessionVisibility };\n\n/**\n * What a change to Only me would stop or drop, read before anything is shown.\n * Nothing in the way: the change just happens. `unavailable` (an older server\n * or a failed read) opens the plain confirmation; the server answers\n * `active_work` with the same summary if something is in the way.\n */\ntype VisibilityChangePreview =\n | { status: \"ready\"; work: SessionVisibilityWork }\n | { status: \"unavailable\" };\n\n/** Each request already waits for the stop to settle; a few more cover a slow worker. */\nconst STOPPING_WORK_RETRIES = 3;\n\nexport default function SessionRouteAuxiliary(\n props:\n | {\n session: Session;\n events: SessionEvent[];\n workspaceId?: never | undefined;\n sessionId?: never | undefined;\n }\n | {\n workspaceId: string;\n sessionId: string;\n loadError: unknown;\n session?: never | undefined;\n events?: never | undefined;\n },\n) {\n return props.session ? (\n <SessionTenancyRouteControl session={props.session} events={props.events} />\n ) : !isApiErrorStatus(props.loadError, 404) ? (\n <ProblemPanel\n title=\"Unable to open session\"\n description={\n props.loadError instanceof Error ? props.loadError.message : String(props.loadError)\n }\n action={\n <Button asChild type=\"button\" variant=\"outline\">\n <a href={workspaceSessionsPath(props.workspaceId)}>Back to sessions</a>\n </Button>\n }\n />\n ) : (\n <SessionUnavailableRoute workspaceId={props.workspaceId} sessionId={props.sessionId} />\n );\n}\n\n/** Route adapter kept inside the activation-gated lazy chunk. */\n/**\n * A private fork lands in the SOURCE workspace, so it is the same product\n * decision migration 0323 makes for a private create: an organization whose\n * owner has not enabled private sessions gets no private destination in a\n * shared workspace. Migration 0336's fork lifecycle routine fails that closed\n * with SQLSTATE 55000, and this hook keeps the dialog from offering a choice\n * the database will refuse. A personal workspace is exempt, exactly as on the create path,\n * and an unknown answer fails closed rather than offering Private optimistically.\n */\nfunction usePrivateForkCapability(options: {\n client: OpenGeniBrowserClient;\n workspaceId: string;\n personalWorkspace: boolean;\n managedSession: boolean;\n}): boolean {\n const { client, workspaceId, personalWorkspace, managedSession } = options;\n const [canForkPrivately, setCanForkPrivately] = useState(personalWorkspace);\n useEffect(() => {\n if (personalWorkspace) {\n setCanForkPrivately(true);\n return;\n }\n setCanForkPrivately(false);\n if (!managedSession) return;\n let current = true;\n void client\n .getSessionTenancyCreateCapabilities(workspaceId)\n .then((capabilities) => {\n if (current) setCanForkPrivately(capabilities.canCreatePrivate === true);\n })\n .catch(() => {\n if (current) setCanForkPrivately(false);\n });\n return () => {\n current = false;\n };\n }, [client, managedSession, personalWorkspace, workspaceId]);\n return canForkPrivately;\n}\n\nexport function SessionTenancyRouteControl({\n session,\n events,\n sourceEventId,\n onForkClose,\n}: {\n session: Session;\n events: SessionEvent[];\n sourceEventId?: string | undefined;\n onForkClose?: (() => void) | undefined;\n}) {\n const context = useAppContext();\n const navigate = useNavigate();\n const workspace = context.workspaces.find((candidate) => candidate.id === session.workspaceId);\n const personalWorkspace = isPersonalWorkspace(workspace ?? null, context.managedSelfContext);\n const managedSession =\n context.clientConfig.auth.mode === \"managedSession\" && context.authSession !== null;\n const canForkPrivately = usePrivateForkCapability({\n client: context.client,\n workspaceId: session.workspaceId,\n personalWorkspace,\n managedSession,\n });\n const transition = context.captureWorkspaceInvocation(session.workspaceId);\n if (!transition) return null;\n const scopeLabel = personalWorkspace\n ? `${workspace?.name ?? \"this workspace\"} Personal workspace`\n : (workspace?.name ?? \"this workspace\");\n\n return (\n <SessionTenancyControl\n key={`${context.accessContext.subjectId}:${transition.revision}:${session.workspaceId}:${session.id}`}\n session={session}\n events={events}\n sourceEventId={sourceEventId}\n onForkClose={onForkClose}\n client={context.client}\n managedSession={managedSession}\n canForkPrivately={canForkPrivately}\n scopeLabel={scopeLabel}\n captureWorkspaceInvocation={context.captureWorkspaceInvocation}\n ownsWorkspaceInvocation={context.ownsWorkspaceInvocation}\n operationController={sessionTenancyOperationController}\n operationScope={{\n principalId: context.accessContext.subjectId,\n workspaceId: session.workspaceId,\n sessionId: session.id,\n workspaceTransitionRevision: transition.revision,\n }}\n onOpenSession={(workspaceId, sessionId) =>\n void navigate({\n to: \"/workspaces/$workspaceId/sessions/$sessionId\",\n params: { workspaceId, sessionId },\n })\n }\n />\n );\n}\n\nexport function SessionTenancyControl({\n sourceEventId,\n onForkClose,\n session,\n events,\n client,\n managedSession,\n canForkPrivately,\n scopeLabel,\n captureWorkspaceInvocation,\n ownsWorkspaceInvocation,\n operationController,\n operationScope,\n onOpenSession,\n}: {\n session: Session;\n events?: SessionEvent[] | undefined;\n sourceEventId?: string | undefined;\n onForkClose?: (() => void) | undefined;\n client: OpenGeniBrowserClient;\n managedSession: boolean;\n /** False also covers \"not yet known\": a private fork is never offered on a\n * guess, because the database refuses it under the 0323 product decision. */\n canForkPrivately: boolean;\n scopeLabel: string;\n captureWorkspaceInvocation: (workspaceId: string) => WorkspaceTransitionIdentity | null;\n ownsWorkspaceInvocation: (workspaceId: string, accepted: WorkspaceTransitionIdentity) => boolean;\n operationController: SessionTenancyOperationController;\n operationScope: SessionTenancyOperationScope;\n onRefreshSession?: (() => Promise<void>) | undefined;\n onOpenSession: (workspaceId: string, sessionId: string) => void;\n}) {\n const target = useMemo<SessionTenancyTarget>(\n () => ({ workspaceId: session.workspaceId, sessionId: session.id }),\n [session.id, session.workspaceId],\n );\n const targetRef = useRef(target);\n targetRef.current = target;\n const mountedRef = useRef(false);\n const operationSequenceRef = useRef(0);\n const visibilityEventSequenceRef = useRef(0);\n const operationSnapshot = operationController.snapshot(operationScope);\n const pendingVisibility = operationSnapshot.visibility;\n const pendingFork = operationSnapshot.fork;\n const [override, setOverride] = useState(session.tenancy);\n const [confirmation, setConfirmation] = useState<Confirmation | null>(() =>\n sourceEventId\n ? {\n kind: \"fork\",\n visibility:\n operationSnapshot.fork?.visibility ??\n (canForkPrivately ? (session.tenancy?.visibility ?? \"workspace\") : \"workspace\"),\n }\n : null,\n );\n const [busy, setBusy] = useState(false);\n const [failure, setFailure] = useState<string | null>(null);\n const [visibilityPreview, setVisibilityPreview] = useState<VisibilityChangePreview | null>(null);\n const [announcement, setAnnouncement] = useState(\"\");\n const [, setControllerRevision] = useState(0);\n const accessTriggerRef = useRef<HTMLButtonElement>(null);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n useEffect(() => {\n operationSequenceRef.current += 1;\n setBusy(false);\n setFailure(null);\n if (!sourceEventId) setConfirmation(null);\n }, [session.id, session.workspaceId, sourceEventId]);\n\n useEffect(() => {\n if (!session.tenancy) {\n setOverride(undefined);\n return;\n }\n setOverride((current) =>\n !current || session.tenancy!.authorityEpoch >= current.authorityEpoch\n ? session.tenancy\n : current,\n );\n }, [session.tenancy]);\n\n useEffect(() => {\n if (\n pendingVisibility &&\n (!session.tenancy ||\n session.tenancy.authorityEpoch > pendingVisibility.expectedAuthorityEpoch)\n ) {\n operationController.settleVisibility(operationScope, pendingVisibility);\n setControllerRevision((current) => current + 1);\n }\n }, [operationController, operationScope, pendingVisibility, session.tenancy]);\n\n const displayedTenancy = override;\n const mayManage = Boolean(displayedTenancy?.ownedByCurrentUser && managedSession);\n\n const mayFork = Boolean(\n displayedTenancy &&\n managedSession &&\n (displayedTenancy.visibility === \"workspace\" || displayedTenancy.ownedByCurrentUser),\n );\n const isCurrentInvocation = useCallback(\n (\n acceptedTarget: SessionTenancyTarget,\n acceptedTransition: WorkspaceTransitionIdentity,\n operationSequence: number,\n ) =>\n mountedRef.current &&\n operationSequenceRef.current === operationSequence &&\n isCurrentSessionTenancyTarget(targetRef.current, acceptedTarget) &&\n ownsWorkspaceInvocation(acceptedTarget.workspaceId, acceptedTransition),\n [ownsWorkspaceInvocation],\n );\n\n const reconcileSource = useCallback(\n async (\n acceptedTarget: SessionTenancyTarget,\n acceptedTransition: WorkspaceTransitionIdentity,\n operationSequence: number,\n ): Promise<Session | null> => {\n const result = await runCurrentTransitionInvocation({\n isCurrent: () => isCurrentInvocation(acceptedTarget, acceptedTransition, operationSequence),\n request: async () =>\n await client.getSession(acceptedTarget.workspaceId, acceptedTarget.sessionId, {\n fresh: true,\n }),\n });\n if (result.status === \"stale\") return null;\n setOverride(result.value.tenancy);\n return result.value;\n },\n [client, isCurrentInvocation],\n );\n\n const latestVisibilitySequence = events?.reduce(\n (latest, event) =>\n event.type === \"session.visibility.changed\" ? Math.max(latest, event.sequence) : latest,\n 0,\n );\n useEffect(() => {\n if (\n !latestVisibilitySequence ||\n latestVisibilitySequence <= visibilityEventSequenceRef.current\n ) {\n return;\n }\n visibilityEventSequenceRef.current = latestVisibilitySequence;\n const acceptedTransition = captureWorkspaceInvocation(target.workspaceId);\n if (!acceptedTransition) return;\n let cancelled = false;\n void client\n .getSession(target.workspaceId, target.sessionId, { fresh: true })\n .then((current) => {\n if (\n cancelled ||\n !mountedRef.current ||\n !isCurrentSessionTenancyTarget(targetRef.current, target) ||\n !ownsWorkspaceInvocation(target.workspaceId, acceptedTransition)\n ) {\n return;\n }\n setOverride(current.tenancy);\n const retained = operationController.snapshot(operationScope).visibility;\n if (\n retained &&\n (!current.tenancy || current.tenancy.authorityEpoch > retained.expectedAuthorityEpoch)\n ) {\n operationController.settleVisibility(operationScope, retained);\n setControllerRevision((revision) => revision + 1);\n }\n setAnnouncement(\n !current.tenancy\n ? \"Session access controls are no longer available.\"\n : current.tenancy.visibility === \"private\"\n ? \"Session is private to you.\"\n : `Session is visible to ${scopeLabel}.`,\n );\n })\n .catch(() => undefined);\n return () => {\n cancelled = true;\n };\n }, [\n captureWorkspaceInvocation,\n client,\n latestVisibilitySequence,\n operationController,\n operationScope,\n ownsWorkspaceInvocation,\n scopeLabel,\n target,\n ]);\n\n const changeVisibility = useCallback(\n async (visibility: SessionVisibility, stopActiveWork: boolean): Promise<boolean> => {\n if (!displayedTenancy || !mayManage || visibility === displayedTenancy.visibility) {\n return true;\n }\n const acceptedTransition = captureWorkspaceInvocation(target.workspaceId);\n if (!acceptedTransition) return true;\n const operationSequence = operationSequenceRef.current + 1;\n operationSequenceRef.current = operationSequence;\n const attempt = operationController.prepareVisibility(\n operationScope,\n { visibility, expectedAuthorityEpoch: displayedTenancy.authorityEpoch },\n () => crypto.randomUUID(),\n );\n setBusy(true);\n setFailure(null);\n let receiptConfirmed = false;\n\n try {\n const result = await runCurrentTransitionInvocation({\n isCurrent: () => isCurrentInvocation(target, acceptedTransition, operationSequence),\n request: async () => {\n for (let retry = 0; ; retry += 1) {\n try {\n return await client.updateSessionVisibility(target.workspaceId, target.sessionId, {\n visibility: attempt.visibility,\n expectedAuthorityEpoch: attempt.expectedAuthorityEpoch,\n idempotencyKey: attempt.idempotencyKey,\n ...(stopActiveWork ? { stopActiveWork: true } : {}),\n });\n } catch (error) {\n // Same key, same consent: the server resumes the stop it began.\n if (\n retry < STOPPING_WORK_RETRIES &&\n isStoppingSessionWorkError(error) &&\n isCurrentInvocation(target, acceptedTransition, operationSequence)\n ) {\n continue;\n }\n throw error;\n }\n }\n },\n });\n if (result.status === \"stale\") return true;\n receiptConfirmed = true;\n\n if (result.value.replay) {\n const authoritative = await reconcileSource(\n target,\n acceptedTransition,\n operationSequence,\n );\n if (!authoritative) return true;\n operationController.settleVisibility(operationScope, attempt);\n if (authoritative.tenancy) {\n const message =\n authoritative.tenancy.visibility === \"private\"\n ? \"Session is private to you.\"\n : `Session is visible to ${scopeLabel}.`;\n setAnnouncement(message);\n toast.info(\"Session access refreshed\", { description: message });\n } else {\n const message = \"Session access controls are no longer available.\";\n setAnnouncement(message);\n toast.info(\"Session access refreshed\", { description: message });\n }\n return true;\n } else {\n setOverride({\n ...displayedTenancy,\n visibility: result.value.visibility,\n authorityEpoch: result.value.authorityEpoch,\n });\n }\n operationController.settleVisibility(operationScope, attempt);\n const message =\n result.value.visibility === \"private\"\n ? \"Session is private to you.\"\n : `Session is visible to ${scopeLabel}.`;\n setAnnouncement(message);\n toast.success(\"Session access updated\", { description: message });\n return true;\n } catch (error) {\n if (!isCurrentInvocation(target, acceptedTransition, operationSequence)) return true;\n const classified = classifySessionTenancyFailure(error);\n if (classified.kind === \"active_work\" && classified.work) {\n // Something appeared after the preview: show what it is and ask once.\n setVisibilityPreview({ status: \"ready\", work: classified.work });\n setConfirmation({ kind: \"visibility\", visibility });\n }\n let authoritative: Session | null = null;\n if (classified.reconcile) {\n authoritative = await reconcileSource(\n target,\n acceptedTransition,\n operationSequence,\n ).catch(() => null);\n }\n if (!isCurrentInvocation(target, acceptedTransition, operationSequence)) return true;\n if (\n authoritative &&\n (!authoritative.tenancy ||\n authoritative.tenancy.authorityEpoch > attempt.expectedAuthorityEpoch)\n ) {\n operationController.settleVisibility(operationScope, attempt);\n if (classified.kind === \"epoch_conflict\") {\n setFailure(classified.message);\n setAnnouncement(classified.message);\n return true;\n }\n const message = !authoritative.tenancy\n ? \"Session access controls are no longer available.\"\n : authoritative.tenancy.visibility === \"private\"\n ? \"Session is private to you.\"\n : `Session is visible to ${scopeLabel}.`;\n setAnnouncement(message);\n toast.info(\"Session access refreshed\", { description: message });\n return true;\n }\n const retainAttempt =\n classified.retainAttempt ||\n (receiptConfirmed && retryableSessionTenancyReconciliationFailure(error));\n if (!retainAttempt) {\n operationController.settleVisibility(operationScope, attempt);\n }\n setFailure(classified.message);\n setAnnouncement(classified.message);\n return !retainAttempt;\n } finally {\n if (isCurrentInvocation(target, acceptedTransition, operationSequence)) setBusy(false);\n }\n },\n [\n captureWorkspaceInvocation,\n client,\n displayedTenancy,\n isCurrentInvocation,\n mayManage,\n operationController,\n operationScope,\n reconcileSource,\n scopeLabel,\n target,\n ],\n );\n\n /**\n * Sharing always asks. Limiting to me reads what it would stop or drop first:\n * nothing in the way just makes the change; anything else is listed in one\n * confirmation whose single button does it all.\n */\n const startVisibilityChange = useCallback(\n async (visibility: SessionVisibility) => {\n setFailure(null);\n setVisibilityPreview(null);\n if (visibility !== \"private\") {\n setConfirmation({ kind: \"visibility\", visibility });\n return;\n }\n const operationSequence = operationSequenceRef.current;\n setBusy(true);\n let preview: VisibilityChangePreview;\n try {\n const result = await client.previewSessionVisibilityChange(\n target.workspaceId,\n target.sessionId,\n visibility,\n );\n const work = normalizeSessionVisibilityWork(result.work);\n preview = work ? { status: \"ready\", work } : { status: \"unavailable\" };\n } catch {\n preview = { status: \"unavailable\" };\n }\n if (!mountedRef.current || operationSequenceRef.current !== operationSequence) return;\n setBusy(false);\n if (preview.status === \"ready\" && sessionVisibilityWorkIsEmpty(preview.work)) {\n await changeVisibility(visibility, false);\n return;\n }\n setVisibilityPreview(preview);\n setConfirmation({ kind: \"visibility\", visibility });\n },\n [changeVisibility, client, target],\n );\n\n const forkSession = useCallback(\n async (visibility: SessionVisibility): Promise<boolean> => {\n if (!displayedTenancy || !mayFork) return true;\n if (sourceEventId && pendingFork && pendingFork.sourceEventId !== sourceEventId) {\n setFailure(\n \"A previous fork still needs a retry. Resolve it from the session menu before choosing another message.\",\n );\n return false;\n }\n const acceptedTransition = captureWorkspaceInvocation(target.workspaceId);\n if (!acceptedTransition) return true;\n const operationSequence = operationSequenceRef.current + 1;\n operationSequenceRef.current = operationSequence;\n const workspaceSharedAcknowledged =\n displayedTenancy.visibility === \"private\" && visibility === \"workspace\";\n const attempt = operationController.prepareFork(\n operationScope,\n { visibility, workspaceSharedAcknowledged, ...(sourceEventId ? { sourceEventId } : {}) },\n () => crypto.randomUUID(),\n );\n setBusy(true);\n setFailure(null);\n let receiptConfirmed = false;\n try {\n const result = await runCurrentTransitionInvocation({\n isCurrent: () => isCurrentInvocation(target, acceptedTransition, operationSequence),\n request: async () =>\n await client.forkSession(target.workspaceId, target.sessionId, {\n ...(attempt.sourceEventId ? { sourceEventId: attempt.sourceEventId } : {}),\n visibility: attempt.visibility,\n workspaceSharedAcknowledged: attempt.workspaceSharedAcknowledged,\n idempotencyKey: attempt.idempotencyKey,\n }),\n });\n if (result.status === \"stale\") return true;\n receiptConfirmed = true;\n const destination = await runCurrentTransitionInvocation({\n isCurrent: () => isCurrentInvocation(target, acceptedTransition, operationSequence),\n request: async () =>\n await client.getSession(result.value.workspaceId, result.value.sessionId, {\n fresh: true,\n }),\n });\n if (destination.status === \"stale\") return true;\n if (\n destination.value.workspaceId !== target.workspaceId ||\n destination.value.tenancy?.visibility !== result.value.visibility ||\n !destination.value.tenancy.ownedByCurrentUser\n ) {\n throw new Error(\"The fork receipt did not resolve to the expected owned session.\");\n }\n operationController.settleFork(operationScope, attempt);\n const description =\n result.value.visibility === \"private\"\n ? \"The independent copy is private to you.\"\n : `The independent copy is visible to ${scopeLabel}.`;\n setAnnouncement(description);\n toast.success(result.value.replay ? \"Session fork recovered\" : \"Session fork created\", {\n description,\n });\n onOpenSession(result.value.workspaceId, result.value.sessionId);\n return true;\n } catch (error) {\n if (!isCurrentInvocation(target, acceptedTransition, operationSequence)) return true;\n const classified = classifySessionTenancyFailure(error);\n const retainAttempt =\n classified.retainAttempt ||\n (receiptConfirmed && retryableSessionTenancyReconciliationFailure(error));\n if (!retainAttempt) operationController.settleFork(operationScope, attempt);\n const message = classified.message;\n setFailure(message);\n setAnnouncement(message);\n return sourceEventId ? false : !retainAttempt;\n } finally {\n if (isCurrentInvocation(target, acceptedTransition, operationSequence)) setBusy(false);\n }\n },\n [\n captureWorkspaceInvocation,\n client,\n displayedTenancy,\n isCurrentInvocation,\n mayFork,\n sourceEventId,\n pendingFork,\n onOpenSession,\n operationController,\n operationScope,\n scopeLabel,\n target,\n ],\n );\n\n if (!displayedTenancy) return null;\n\n const privateSession = displayedTenancy.visibility === \"private\";\n const alternateVisibility: SessionVisibility = privateSession ? \"workspace\" : \"private\";\n const retryingVisibility =\n pendingVisibility?.visibility === alternateVisibility &&\n pendingVisibility.expectedAuthorityEpoch === displayedTenancy.authorityEpoch;\n const visibilityAction = privateSession\n ? \"Share this session with workspace…\"\n : \"Limit this session to me\";\n const readyPreview = visibilityPreview?.status === \"ready\" ? visibilityPreview : null;\n // What the one confirmation also stops or drops; null when nothing is listed.\n const workToStop =\n readyPreview && !sessionVisibilityWorkIsEmpty(readyPreview.work) ? readyPreview.work : null;\n const stopsWork = workToStop !== null && sessionVisibilityWorkStopsWork(workToStop);\n const visibilityConfirmLabel = privateSession\n ? retryingVisibility\n ? \"Retry share with workspace\"\n : \"Share with workspace\"\n : stopsWork\n ? \"Stop work and limit to me\"\n : retryingVisibility\n ? \"Retry limit to me\"\n : \"Limit to me\";\n const stateLabel = privateSession ? \"Private\" : \"Workspace\";\n const stateDescription = privateSession\n ? \"Only you can open this session.\"\n : `Visible to people in ${scopeLabel}.`;\n const retryingFork = pendingFork !== null;\n const stateChip = (\n // Phones show just the icon (a 44px target, no chip chrome); the labelled\n // chip with its chevron returns from sm. A narrow title bar (a small app\n // window beside the sidebar) also gets just the icon, so the title keeps\n // its room.\n <span className=\"inline-flex min-h-8 min-w-0 items-center gap-1.5 rounded-full text-xs font-medium text-fg pointer-coarse:min-h-11 max-sm:min-w-8 max-sm:justify-center max-sm:pointer-coarse:min-w-11 sm:border sm:border-border sm:bg-surface/55 sm:px-2.5 @max-[34rem]/titlebar:min-w-8! @max-[34rem]/titlebar:justify-center @max-[34rem]/titlebar:border-0! @max-[34rem]/titlebar:bg-transparent! @max-[34rem]/titlebar:px-0!\">\n {privateSession ? (\n <LockKeyholeIcon className=\"size-3.5 shrink-0 text-brand\" aria-hidden=\"true\" />\n ) : (\n <UsersIcon className=\"size-3.5 shrink-0 text-fg-muted\" aria-hidden=\"true\" />\n )}\n <span className=\"hidden sm:inline @max-[34rem]/titlebar:hidden!\">{stateLabel}</span>\n {failure ? <CircleAlertIcon className=\"size-3.5 text-status-waiting\" aria-hidden /> : null}\n {mayFork ? (\n <ChevronDownIcon\n className=\"hidden size-3.5 text-fg-muted sm:block @max-[34rem]/titlebar:hidden!\"\n aria-hidden\n />\n ) : null}\n </span>\n );\n\n return (\n <TooltipProvider delayDuration={300}>\n <section\n aria-label=\"Session access\"\n className={sourceEventId ? \"hidden\" : \"flex shrink-0 items-center\"}\n >\n {mayFork ? (\n <DropdownMenu>\n <DropdownMenuTrigger asChild disabled={busy}>\n <button\n ref={accessTriggerRef}\n type=\"button\"\n aria-label={\n mayManage\n ? `${stateLabel} session access. Manage session access`\n : `${stateLabel} session access. Session actions`\n }\n aria-busy={busy}\n className=\"rounded-full focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {busy ? (\n <span className=\"inline-flex min-h-8 items-center gap-1.5 rounded-full border border-border bg-surface/55 px-2.5 text-xs font-medium pointer-coarse:min-h-11\">\n <Loader2Icon className=\"size-3.5 animate-spin motion-reduce:animate-none\" />\n <span className=\"hidden sm:inline\">Updating</span>\n </span>\n ) : (\n stateChip\n )}\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-72\">\n <div className=\"px-2.5 py-1.5\">\n <p className=\"text-sm font-medium text-fg\">{stateLabel} session</p>\n <p className=\"mt-0.5 text-xs leading-4.5 text-fg-muted\">{stateDescription}</p>\n </div>\n {mayManage ? (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n onSelect={() => void startVisibilityChange(alternateVisibility)}\n >\n {privateSession ? <UsersIcon /> : <LockKeyholeIcon />}\n {retryingVisibility ? `Retry: ${visibilityAction}` : visibilityAction}\n </DropdownMenuItem>\n </>\n ) : null}\n <DropdownMenuSeparator />\n <DropdownMenuItem\n onSelect={() =>\n setConfirmation({\n kind: \"fork\",\n visibility:\n pendingFork?.visibility ??\n (canForkPrivately ? displayedTenancy.visibility : \"workspace\"),\n })\n }\n >\n <CopyPlusIcon />\n {retryingFork ? \"Retry session fork\" : \"Fork session\"}\n </DropdownMenuItem>\n {failure ? (\n <>\n <DropdownMenuSeparator />\n <div className=\"px-2.5 py-1.5 text-xs leading-4.5 text-status-waiting\">\n <span className=\"font-medium\">Access change needs attention.</span> {failure}\n </div>\n </>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n ) : (\n <Tooltip>\n <TooltipTrigger asChild>\n <span\n role=\"img\"\n tabIndex={0}\n aria-label={`${stateLabel} session access. ${stateDescription}`}\n >\n {stateChip}\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">{stateDescription}</TooltipContent>\n </Tooltip>\n )}\n <span className=\"sr-only\" aria-live=\"polite\" aria-atomic=\"true\">\n {announcement}\n </span>\n </section>\n\n <ConfirmDialog\n open={confirmation !== null}\n onOpenChange={(open) => {\n if (!open) {\n setConfirmation(null);\n setVisibilityPreview(null);\n onForkClose?.();\n }\n }}\n title={\n confirmation?.kind === \"fork\"\n ? confirmation.visibility === \"workspace\"\n ? `Fork a workspace-visible copy?`\n : \"Fork a private copy?\"\n : confirmation?.visibility === \"workspace\"\n ? `Share this session with ${scopeLabel}?`\n : \"Limit this session to you?\"\n }\n description={\n (pendingFork ? pendingFork.sourceEventId : sourceEventId)\n ? `Copy the conversation through the selected message${confirmation?.visibility === \"workspace\" ? ` into a session visible to people in ${scopeLabel}` : \" into a session visible only to you\"}. Later messages are excluded. Live credentials, tools, goals, and processes are not copied.`\n : confirmation?.kind === \"fork\" &&\n displayedTenancy.visibility === \"private\" &&\n confirmation.visibility === \"workspace\"\n ? `This private session's complete conversation will be copied into a new session visible to people in ${scopeLabel}. Live credentials, connections, tools, goals, and processes are not copied.`\n : confirmation?.kind === \"fork\"\n ? confirmation.visibility === \"workspace\"\n ? `Create an independent copy visible to people in ${scopeLabel}. Live credentials, connections, tools, goals, and processes are not copied.`\n : \"Create an independent copy visible only to you. Live credentials, connections, tools, goals, and processes are not copied.\"\n : confirmation?.visibility === \"workspace\"\n ? \"People who can access this workspace will be able to open and continue the session. Current work keeps running with its existing identity and connections.\"\n : `Only you will be able to open the session.${privateSessionSandboxNote(session.sandboxBackend)}`\n }\n confirmLabel={\n confirmation?.kind === \"fork\"\n ? retryingFork\n ? \"Retry fork\"\n : confirmation.visibility === \"workspace\"\n ? \"Fork for workspace\"\n : \"Fork privately\"\n : visibilityConfirmLabel\n }\n pendingLabel={\n confirmation?.kind === \"visibility\" && stopsWork ? \"Stopping work…\" : \"Working…\"\n }\n // A fork only widens exposure when a private source is copied into the\n // workspace. Changing an existing session to workspace visibility always\n // does, and making it private destroys the work and access it drops.\n // A shared-to-shared fork exposes nothing new.\n destructive={\n confirmation?.kind === \"fork\"\n ? displayedTenancy.visibility === \"private\" && confirmation.visibility === \"workspace\"\n : confirmation?.visibility === \"workspace\" || workToStop !== null\n }\n cancelAutoFocus\n restoreFocusRef={sourceEventId ? undefined : accessTriggerRef}\n onConfirm={() => {\n if (!confirmation) return true;\n return confirmation.kind === \"visibility\"\n ? changeVisibility(confirmation.visibility, workToStop !== null)\n : forkSession(confirmation.visibility);\n }}\n >\n {confirmation?.kind === \"visibility\" && workToStop ? (\n <Notice tone=\"waiting\" title=\"This will also\">\n <ul className=\"list-disc space-y-0.5 pl-4\">\n {sessionVisibilityWorkSummary(workToStop).map((line) => (\n <li key={line}>{line}</li>\n ))}\n </ul>\n </Notice>\n ) : null}\n {confirmation?.kind === \"fork\" && !retryingFork ? (\n <div\n className={canForkPrivately ? \"grid grid-cols-2 gap-2\" : \"grid gap-2\"}\n role=\"radiogroup\"\n aria-label=\"Fork visibility\"\n >\n {canForkPrivately ? (\n <Button\n type=\"button\"\n variant={confirmation.visibility === \"private\" ? \"secondary\" : \"outline\"}\n className=\"aria-checked:text-fg\"\n role=\"radio\"\n aria-checked={confirmation.visibility === \"private\"}\n onClick={() => setConfirmation({ kind: \"fork\", visibility: \"private\" })}\n >\n <LockKeyholeIcon /> Private\n </Button>\n ) : null}\n <Button\n type=\"button\"\n variant={confirmation.visibility === \"workspace\" ? \"secondary\" : \"outline\"}\n className=\"aria-checked:text-fg\"\n role=\"radio\"\n aria-checked={confirmation.visibility === \"workspace\"}\n onClick={() => setConfirmation({ kind: \"fork\", visibility: \"workspace\" })}\n >\n <UsersIcon /> Workspace\n </Button>\n </div>\n ) : null}\n {failure ? (\n <Notice tone=\"waiting\" title=\"Access change needs attention\">\n {failure}\n </Notice>\n ) : null}\n </ConfirmDialog>\n </TooltipProvider>\n );\n}\n"],"mappings":"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","names":["message"]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/app/components/session/session-tenancy-control.tsx"],"sourcesContent":["import type { OpenGeniBrowserClient } from \"@opengeni/sdk/browser\";\nimport { isTransientRequestError } from \"@opengeni/sdk\";\nimport type {\n Session,\n SessionEvent,\n SessionVisibility,\n SessionVisibilityWork,\n} from \"@opengeni/sdk\";\nimport { useNavigate } from \"../../lib/navigation\";\nimport {\n ChevronDownIcon,\n CircleAlertIcon,\n CopyPlusIcon,\n Loader2Icon,\n LockKeyholeIcon,\n UsersIcon,\n} from \"lucide-react\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { toast } from \"../../lib/toast\";\n\nimport { Button } from \"../../../ui/button\";\nimport { ConfirmDialog } from \"../../../ui/confirm-dialog\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"../../../ui/dropdown-menu\";\nimport { Notice } from \"../../../ui/notice\";\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from \"../../../ui/tooltip\";\nimport { ProblemPanel } from \"../common\";\nimport { useAppContext } from \"../../app-context\";\nimport { isApiErrorStatus } from \"../../lib/app-api\";\nimport { isPersonalWorkspace } from \"../../lib/managed-self-context\";\nimport { workspaceSessionsPath } from \"../../lib/routes\";\nimport { SessionUnavailableRoute } from \"../../routes/session-unavailable\";\nimport {\n classifySessionTenancyFailure,\n isCurrentSessionTenancyTarget,\n isStoppingSessionWorkError,\n normalizeSessionVisibilityWork,\n privateSessionSandboxNote,\n retryableSessionTenancyReconciliationFailure,\n sessionVisibilityWorkIsEmpty,\n sessionVisibilityWorkStopsWork,\n sessionVisibilityWorkSummary,\n type SessionTenancyTarget,\n} from \"../../lib/session-tenancy\";\nimport {\n sessionTenancyOperationController,\n type SessionTenancyOperationController,\n type SessionTenancyOperationScope,\n} from \"../../lib/session-tenancy-operation-controller\";\nimport {\n runCurrentTransitionInvocation,\n type WorkspaceTransitionIdentity,\n} from \"../../lib/workspace-transition\";\n\ntype Confirmation =\n | { kind: \"visibility\"; visibility: SessionVisibility }\n | { kind: \"fork\"; visibility: SessionVisibility };\n\n/**\n * What a change to Only me would stop or drop, read before anything is shown.\n * Nothing in the way: the change just happens. `unavailable` (an older server\n * or a failed read) opens the plain confirmation; the server answers\n * `active_work` with the same summary if something is in the way.\n */\ntype VisibilityChangePreview =\n | { status: \"ready\"; work: SessionVisibilityWork }\n | { status: \"unavailable\" };\n\n/** Each request already waits for the stop to settle; a few more cover a slow worker. */\nconst STOPPING_WORK_RETRIES = 3;\n\nexport default function SessionRouteAuxiliary(\n props:\n | {\n session: Session;\n events: SessionEvent[];\n workspaceId?: never | undefined;\n sessionId?: never | undefined;\n }\n | {\n workspaceId: string;\n sessionId: string;\n loadError: unknown;\n /** Retry the session read now (it also keeps retrying in the background). */\n onRetry?: (() => void) | undefined;\n session?: never | undefined;\n events?: never | undefined;\n },\n) {\n return props.session ? (\n <SessionTenancyRouteControl session={props.session} events={props.events} />\n ) : isTransientRequestError(props.loadError) ? (\n // The session read has failed transiently for a while (an outage outlasting\n // a rolling deploy). The read keeps retrying and the page opens the session\n // on its own when it succeeds.\n <ProblemPanel\n title=\"Temporarily unavailable\"\n description=\"Retrying automatically.\"\n action={\n props.onRetry ? (\n <Button type=\"button\" variant=\"outline\" onClick={props.onRetry}>\n Try again\n </Button>\n ) : undefined\n }\n />\n ) : !isApiErrorStatus(props.loadError, 404) ? (\n <ProblemPanel\n title=\"Unable to open session\"\n description={\n props.loadError instanceof Error ? props.loadError.message : String(props.loadError)\n }\n action={\n <Button asChild type=\"button\" variant=\"outline\">\n <a href={workspaceSessionsPath(props.workspaceId)}>Back to sessions</a>\n </Button>\n }\n />\n ) : (\n <SessionUnavailableRoute workspaceId={props.workspaceId} sessionId={props.sessionId} />\n );\n}\n\n/** Route adapter kept inside the activation-gated lazy chunk. */\n/**\n * A private fork lands in the SOURCE workspace, so it is the same product\n * decision migration 0323 makes for a private create: an organization whose\n * owner has not enabled private sessions gets no private destination in a\n * shared workspace. Migration 0336's fork lifecycle routine fails that closed\n * with SQLSTATE 55000, and this hook keeps the dialog from offering a choice\n * the database will refuse. A personal workspace is exempt, exactly as on the create path,\n * and an unknown answer fails closed rather than offering Private optimistically.\n */\nfunction usePrivateForkCapability(options: {\n client: OpenGeniBrowserClient;\n workspaceId: string;\n personalWorkspace: boolean;\n managedSession: boolean;\n}): boolean {\n const { client, workspaceId, personalWorkspace, managedSession } = options;\n const [canForkPrivately, setCanForkPrivately] = useState(personalWorkspace);\n useEffect(() => {\n if (personalWorkspace) {\n setCanForkPrivately(true);\n return;\n }\n setCanForkPrivately(false);\n if (!managedSession) return;\n let current = true;\n void client\n .getSessionTenancyCreateCapabilities(workspaceId)\n .then((capabilities) => {\n if (current) setCanForkPrivately(capabilities.canCreatePrivate === true);\n })\n .catch(() => {\n if (current) setCanForkPrivately(false);\n });\n return () => {\n current = false;\n };\n }, [client, managedSession, personalWorkspace, workspaceId]);\n return canForkPrivately;\n}\n\nexport function SessionTenancyRouteControl({\n session,\n events,\n sourceEventId,\n onForkClose,\n}: {\n session: Session;\n events: SessionEvent[];\n sourceEventId?: string | undefined;\n onForkClose?: (() => void) | undefined;\n}) {\n const context = useAppContext();\n const navigate = useNavigate();\n const workspace = context.workspaces.find((candidate) => candidate.id === session.workspaceId);\n const personalWorkspace = isPersonalWorkspace(workspace ?? null, context.managedSelfContext);\n const managedSession =\n context.clientConfig.auth.mode === \"managedSession\" && context.authSession !== null;\n const canForkPrivately = usePrivateForkCapability({\n client: context.client,\n workspaceId: session.workspaceId,\n personalWorkspace,\n managedSession,\n });\n const transition = context.captureWorkspaceInvocation(session.workspaceId);\n if (!transition) return null;\n const scopeLabel = personalWorkspace\n ? `${workspace?.name ?? \"this workspace\"} Personal workspace`\n : (workspace?.name ?? \"this workspace\");\n\n return (\n <SessionTenancyControl\n key={`${context.accessContext.subjectId}:${transition.revision}:${session.workspaceId}:${session.id}`}\n session={session}\n events={events}\n sourceEventId={sourceEventId}\n onForkClose={onForkClose}\n client={context.client}\n managedSession={managedSession}\n canForkPrivately={canForkPrivately}\n scopeLabel={scopeLabel}\n captureWorkspaceInvocation={context.captureWorkspaceInvocation}\n ownsWorkspaceInvocation={context.ownsWorkspaceInvocation}\n operationController={sessionTenancyOperationController}\n operationScope={{\n principalId: context.accessContext.subjectId,\n workspaceId: session.workspaceId,\n sessionId: session.id,\n workspaceTransitionRevision: transition.revision,\n }}\n onOpenSession={(workspaceId, sessionId) =>\n void navigate({\n to: \"/workspaces/$workspaceId/sessions/$sessionId\",\n params: { workspaceId, sessionId },\n })\n }\n />\n );\n}\n\nexport function SessionTenancyControl({\n sourceEventId,\n onForkClose,\n session,\n events,\n client,\n managedSession,\n canForkPrivately,\n scopeLabel,\n captureWorkspaceInvocation,\n ownsWorkspaceInvocation,\n operationController,\n operationScope,\n onOpenSession,\n}: {\n session: Session;\n events?: SessionEvent[] | undefined;\n sourceEventId?: string | undefined;\n onForkClose?: (() => void) | undefined;\n client: OpenGeniBrowserClient;\n managedSession: boolean;\n /** False also covers \"not yet known\": a private fork is never offered on a\n * guess, because the database refuses it under the 0323 product decision. */\n canForkPrivately: boolean;\n scopeLabel: string;\n captureWorkspaceInvocation: (workspaceId: string) => WorkspaceTransitionIdentity | null;\n ownsWorkspaceInvocation: (workspaceId: string, accepted: WorkspaceTransitionIdentity) => boolean;\n operationController: SessionTenancyOperationController;\n operationScope: SessionTenancyOperationScope;\n onRefreshSession?: (() => Promise<void>) | undefined;\n onOpenSession: (workspaceId: string, sessionId: string) => void;\n}) {\n const target = useMemo<SessionTenancyTarget>(\n () => ({ workspaceId: session.workspaceId, sessionId: session.id }),\n [session.id, session.workspaceId],\n );\n const targetRef = useRef(target);\n targetRef.current = target;\n const mountedRef = useRef(false);\n const operationSequenceRef = useRef(0);\n const visibilityEventSequenceRef = useRef(0);\n const operationSnapshot = operationController.snapshot(operationScope);\n const pendingVisibility = operationSnapshot.visibility;\n const pendingFork = operationSnapshot.fork;\n const [override, setOverride] = useState(session.tenancy);\n const [confirmation, setConfirmation] = useState<Confirmation | null>(() =>\n sourceEventId\n ? {\n kind: \"fork\",\n visibility:\n operationSnapshot.fork?.visibility ??\n (canForkPrivately ? (session.tenancy?.visibility ?? \"workspace\") : \"workspace\"),\n }\n : null,\n );\n const [busy, setBusy] = useState(false);\n const [failure, setFailure] = useState<string | null>(null);\n const [visibilityPreview, setVisibilityPreview] = useState<VisibilityChangePreview | null>(null);\n const [announcement, setAnnouncement] = useState(\"\");\n const [, setControllerRevision] = useState(0);\n const accessTriggerRef = useRef<HTMLButtonElement>(null);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n useEffect(() => {\n operationSequenceRef.current += 1;\n setBusy(false);\n setFailure(null);\n if (!sourceEventId) setConfirmation(null);\n }, [session.id, session.workspaceId, sourceEventId]);\n\n useEffect(() => {\n if (!session.tenancy) {\n setOverride(undefined);\n return;\n }\n setOverride((current) =>\n !current || session.tenancy!.authorityEpoch >= current.authorityEpoch\n ? session.tenancy\n : current,\n );\n }, [session.tenancy]);\n\n useEffect(() => {\n if (\n pendingVisibility &&\n (!session.tenancy ||\n session.tenancy.authorityEpoch > pendingVisibility.expectedAuthorityEpoch)\n ) {\n operationController.settleVisibility(operationScope, pendingVisibility);\n setControllerRevision((current) => current + 1);\n }\n }, [operationController, operationScope, pendingVisibility, session.tenancy]);\n\n const displayedTenancy = override;\n const mayManage = Boolean(displayedTenancy?.ownedByCurrentUser && managedSession);\n\n const mayFork = Boolean(\n displayedTenancy &&\n managedSession &&\n (displayedTenancy.visibility === \"workspace\" || displayedTenancy.ownedByCurrentUser),\n );\n const isCurrentInvocation = useCallback(\n (\n acceptedTarget: SessionTenancyTarget,\n acceptedTransition: WorkspaceTransitionIdentity,\n operationSequence: number,\n ) =>\n mountedRef.current &&\n operationSequenceRef.current === operationSequence &&\n isCurrentSessionTenancyTarget(targetRef.current, acceptedTarget) &&\n ownsWorkspaceInvocation(acceptedTarget.workspaceId, acceptedTransition),\n [ownsWorkspaceInvocation],\n );\n\n const reconcileSource = useCallback(\n async (\n acceptedTarget: SessionTenancyTarget,\n acceptedTransition: WorkspaceTransitionIdentity,\n operationSequence: number,\n ): Promise<Session | null> => {\n const result = await runCurrentTransitionInvocation({\n isCurrent: () => isCurrentInvocation(acceptedTarget, acceptedTransition, operationSequence),\n request: async () =>\n await client.getSession(acceptedTarget.workspaceId, acceptedTarget.sessionId, {\n fresh: true,\n }),\n });\n if (result.status === \"stale\") return null;\n setOverride(result.value.tenancy);\n return result.value;\n },\n [client, isCurrentInvocation],\n );\n\n const latestVisibilitySequence = events?.reduce(\n (latest, event) =>\n event.type === \"session.visibility.changed\" ? Math.max(latest, event.sequence) : latest,\n 0,\n );\n useEffect(() => {\n if (\n !latestVisibilitySequence ||\n latestVisibilitySequence <= visibilityEventSequenceRef.current\n ) {\n return;\n }\n visibilityEventSequenceRef.current = latestVisibilitySequence;\n const acceptedTransition = captureWorkspaceInvocation(target.workspaceId);\n if (!acceptedTransition) return;\n let cancelled = false;\n void client\n .getSession(target.workspaceId, target.sessionId, { fresh: true })\n .then((current) => {\n if (\n cancelled ||\n !mountedRef.current ||\n !isCurrentSessionTenancyTarget(targetRef.current, target) ||\n !ownsWorkspaceInvocation(target.workspaceId, acceptedTransition)\n ) {\n return;\n }\n setOverride(current.tenancy);\n const retained = operationController.snapshot(operationScope).visibility;\n if (\n retained &&\n (!current.tenancy || current.tenancy.authorityEpoch > retained.expectedAuthorityEpoch)\n ) {\n operationController.settleVisibility(operationScope, retained);\n setControllerRevision((revision) => revision + 1);\n }\n setAnnouncement(\n !current.tenancy\n ? \"Session access controls are no longer available.\"\n : current.tenancy.visibility === \"private\"\n ? \"Session is private to you.\"\n : `Session is visible to ${scopeLabel}.`,\n );\n })\n .catch(() => undefined);\n return () => {\n cancelled = true;\n };\n }, [\n captureWorkspaceInvocation,\n client,\n latestVisibilitySequence,\n operationController,\n operationScope,\n ownsWorkspaceInvocation,\n scopeLabel,\n target,\n ]);\n\n const changeVisibility = useCallback(\n async (visibility: SessionVisibility, stopActiveWork: boolean): Promise<boolean> => {\n if (!displayedTenancy || !mayManage || visibility === displayedTenancy.visibility) {\n return true;\n }\n const acceptedTransition = captureWorkspaceInvocation(target.workspaceId);\n if (!acceptedTransition) return true;\n const operationSequence = operationSequenceRef.current + 1;\n operationSequenceRef.current = operationSequence;\n const attempt = operationController.prepareVisibility(\n operationScope,\n { visibility, expectedAuthorityEpoch: displayedTenancy.authorityEpoch },\n () => crypto.randomUUID(),\n );\n setBusy(true);\n setFailure(null);\n let receiptConfirmed = false;\n\n try {\n const result = await runCurrentTransitionInvocation({\n isCurrent: () => isCurrentInvocation(target, acceptedTransition, operationSequence),\n request: async () => {\n for (let retry = 0; ; retry += 1) {\n try {\n return await client.updateSessionVisibility(target.workspaceId, target.sessionId, {\n visibility: attempt.visibility,\n expectedAuthorityEpoch: attempt.expectedAuthorityEpoch,\n idempotencyKey: attempt.idempotencyKey,\n ...(stopActiveWork ? { stopActiveWork: true } : {}),\n });\n } catch (error) {\n // Same key, same consent: the server resumes the stop it began.\n if (\n retry < STOPPING_WORK_RETRIES &&\n isStoppingSessionWorkError(error) &&\n isCurrentInvocation(target, acceptedTransition, operationSequence)\n ) {\n continue;\n }\n throw error;\n }\n }\n },\n });\n if (result.status === \"stale\") return true;\n receiptConfirmed = true;\n\n if (result.value.replay) {\n const authoritative = await reconcileSource(\n target,\n acceptedTransition,\n operationSequence,\n );\n if (!authoritative) return true;\n operationController.settleVisibility(operationScope, attempt);\n if (authoritative.tenancy) {\n const message =\n authoritative.tenancy.visibility === \"private\"\n ? \"Session is private to you.\"\n : `Session is visible to ${scopeLabel}.`;\n setAnnouncement(message);\n toast.info(\"Session access refreshed\", { description: message });\n } else {\n const message = \"Session access controls are no longer available.\";\n setAnnouncement(message);\n toast.info(\"Session access refreshed\", { description: message });\n }\n return true;\n } else {\n setOverride({\n ...displayedTenancy,\n visibility: result.value.visibility,\n authorityEpoch: result.value.authorityEpoch,\n });\n }\n operationController.settleVisibility(operationScope, attempt);\n const message =\n result.value.visibility === \"private\"\n ? \"Session is private to you.\"\n : `Session is visible to ${scopeLabel}.`;\n setAnnouncement(message);\n toast.success(\"Session access updated\", { description: message });\n return true;\n } catch (error) {\n if (!isCurrentInvocation(target, acceptedTransition, operationSequence)) return true;\n const classified = classifySessionTenancyFailure(error);\n if (classified.kind === \"active_work\" && classified.work) {\n // Something appeared after the preview: show what it is and ask once.\n setVisibilityPreview({ status: \"ready\", work: classified.work });\n setConfirmation({ kind: \"visibility\", visibility });\n }\n let authoritative: Session | null = null;\n if (classified.reconcile) {\n authoritative = await reconcileSource(\n target,\n acceptedTransition,\n operationSequence,\n ).catch(() => null);\n }\n if (!isCurrentInvocation(target, acceptedTransition, operationSequence)) return true;\n if (\n authoritative &&\n (!authoritative.tenancy ||\n authoritative.tenancy.authorityEpoch > attempt.expectedAuthorityEpoch)\n ) {\n operationController.settleVisibility(operationScope, attempt);\n if (classified.kind === \"epoch_conflict\") {\n setFailure(classified.message);\n setAnnouncement(classified.message);\n return true;\n }\n const message = !authoritative.tenancy\n ? \"Session access controls are no longer available.\"\n : authoritative.tenancy.visibility === \"private\"\n ? \"Session is private to you.\"\n : `Session is visible to ${scopeLabel}.`;\n setAnnouncement(message);\n toast.info(\"Session access refreshed\", { description: message });\n return true;\n }\n const retainAttempt =\n classified.retainAttempt ||\n (receiptConfirmed && retryableSessionTenancyReconciliationFailure(error));\n if (!retainAttempt) {\n operationController.settleVisibility(operationScope, attempt);\n }\n setFailure(classified.message);\n setAnnouncement(classified.message);\n return !retainAttempt;\n } finally {\n if (isCurrentInvocation(target, acceptedTransition, operationSequence)) setBusy(false);\n }\n },\n [\n captureWorkspaceInvocation,\n client,\n displayedTenancy,\n isCurrentInvocation,\n mayManage,\n operationController,\n operationScope,\n reconcileSource,\n scopeLabel,\n target,\n ],\n );\n\n /**\n * Sharing always asks. Limiting to me reads what it would stop or drop first:\n * nothing in the way just makes the change; anything else is listed in one\n * confirmation whose single button does it all.\n */\n const startVisibilityChange = useCallback(\n async (visibility: SessionVisibility) => {\n setFailure(null);\n setVisibilityPreview(null);\n if (visibility !== \"private\") {\n setConfirmation({ kind: \"visibility\", visibility });\n return;\n }\n const operationSequence = operationSequenceRef.current;\n setBusy(true);\n let preview: VisibilityChangePreview;\n try {\n const result = await client.previewSessionVisibilityChange(\n target.workspaceId,\n target.sessionId,\n visibility,\n );\n const work = normalizeSessionVisibilityWork(result.work);\n preview = work ? { status: \"ready\", work } : { status: \"unavailable\" };\n } catch {\n preview = { status: \"unavailable\" };\n }\n if (!mountedRef.current || operationSequenceRef.current !== operationSequence) return;\n setBusy(false);\n if (preview.status === \"ready\" && sessionVisibilityWorkIsEmpty(preview.work)) {\n await changeVisibility(visibility, false);\n return;\n }\n setVisibilityPreview(preview);\n setConfirmation({ kind: \"visibility\", visibility });\n },\n [changeVisibility, client, target],\n );\n\n const forkSession = useCallback(\n async (visibility: SessionVisibility): Promise<boolean> => {\n if (!displayedTenancy || !mayFork) return true;\n if (sourceEventId && pendingFork && pendingFork.sourceEventId !== sourceEventId) {\n setFailure(\n \"A previous fork still needs a retry. Resolve it from the session menu before choosing another message.\",\n );\n return false;\n }\n const acceptedTransition = captureWorkspaceInvocation(target.workspaceId);\n if (!acceptedTransition) return true;\n const operationSequence = operationSequenceRef.current + 1;\n operationSequenceRef.current = operationSequence;\n const workspaceSharedAcknowledged =\n displayedTenancy.visibility === \"private\" && visibility === \"workspace\";\n const attempt = operationController.prepareFork(\n operationScope,\n { visibility, workspaceSharedAcknowledged, ...(sourceEventId ? { sourceEventId } : {}) },\n () => crypto.randomUUID(),\n );\n setBusy(true);\n setFailure(null);\n let receiptConfirmed = false;\n try {\n const result = await runCurrentTransitionInvocation({\n isCurrent: () => isCurrentInvocation(target, acceptedTransition, operationSequence),\n request: async () =>\n await client.forkSession(target.workspaceId, target.sessionId, {\n ...(attempt.sourceEventId ? { sourceEventId: attempt.sourceEventId } : {}),\n visibility: attempt.visibility,\n workspaceSharedAcknowledged: attempt.workspaceSharedAcknowledged,\n idempotencyKey: attempt.idempotencyKey,\n }),\n });\n if (result.status === \"stale\") return true;\n receiptConfirmed = true;\n const destination = await runCurrentTransitionInvocation({\n isCurrent: () => isCurrentInvocation(target, acceptedTransition, operationSequence),\n request: async () =>\n await client.getSession(result.value.workspaceId, result.value.sessionId, {\n fresh: true,\n }),\n });\n if (destination.status === \"stale\") return true;\n if (\n destination.value.workspaceId !== target.workspaceId ||\n destination.value.tenancy?.visibility !== result.value.visibility ||\n !destination.value.tenancy.ownedByCurrentUser\n ) {\n throw new Error(\"The fork receipt did not resolve to the expected owned session.\");\n }\n operationController.settleFork(operationScope, attempt);\n const description =\n result.value.visibility === \"private\"\n ? \"The independent copy is private to you.\"\n : `The independent copy is visible to ${scopeLabel}.`;\n setAnnouncement(description);\n toast.success(result.value.replay ? \"Session fork recovered\" : \"Session fork created\", {\n description,\n });\n onOpenSession(result.value.workspaceId, result.value.sessionId);\n return true;\n } catch (error) {\n if (!isCurrentInvocation(target, acceptedTransition, operationSequence)) return true;\n const classified = classifySessionTenancyFailure(error);\n const retainAttempt =\n classified.retainAttempt ||\n (receiptConfirmed && retryableSessionTenancyReconciliationFailure(error));\n if (!retainAttempt) operationController.settleFork(operationScope, attempt);\n const message = classified.message;\n setFailure(message);\n setAnnouncement(message);\n return sourceEventId ? false : !retainAttempt;\n } finally {\n if (isCurrentInvocation(target, acceptedTransition, operationSequence)) setBusy(false);\n }\n },\n [\n captureWorkspaceInvocation,\n client,\n displayedTenancy,\n isCurrentInvocation,\n mayFork,\n sourceEventId,\n pendingFork,\n onOpenSession,\n operationController,\n operationScope,\n scopeLabel,\n target,\n ],\n );\n\n if (!displayedTenancy) return null;\n\n const privateSession = displayedTenancy.visibility === \"private\";\n const alternateVisibility: SessionVisibility = privateSession ? \"workspace\" : \"private\";\n const retryingVisibility =\n pendingVisibility?.visibility === alternateVisibility &&\n pendingVisibility.expectedAuthorityEpoch === displayedTenancy.authorityEpoch;\n const visibilityAction = privateSession\n ? \"Share this session with workspace…\"\n : \"Limit this session to me\";\n const readyPreview = visibilityPreview?.status === \"ready\" ? visibilityPreview : null;\n // What the one confirmation also stops or drops; null when nothing is listed.\n const workToStop =\n readyPreview && !sessionVisibilityWorkIsEmpty(readyPreview.work) ? readyPreview.work : null;\n const stopsWork = workToStop !== null && sessionVisibilityWorkStopsWork(workToStop);\n const visibilityConfirmLabel = privateSession\n ? retryingVisibility\n ? \"Retry share with workspace\"\n : \"Share with workspace\"\n : stopsWork\n ? \"Stop work and limit to me\"\n : retryingVisibility\n ? \"Retry limit to me\"\n : \"Limit to me\";\n const stateLabel = privateSession ? \"Private\" : \"Workspace\";\n const stateDescription = privateSession\n ? \"Only you can open this session.\"\n : `Visible to people in ${scopeLabel}.`;\n const retryingFork = pendingFork !== null;\n const stateChip = (\n // Phones show just the icon (a 44px target, no chip chrome); the labelled\n // chip with its chevron returns from sm. A narrow title bar (a small app\n // window beside the sidebar) also gets just the icon, so the title keeps\n // its room.\n <span className=\"inline-flex min-h-8 min-w-0 items-center gap-1.5 rounded-full text-xs font-medium text-fg pointer-coarse:min-h-11 max-sm:min-w-8 max-sm:justify-center max-sm:pointer-coarse:min-w-11 sm:border sm:border-border sm:bg-surface/55 sm:px-2.5 @max-[34rem]/titlebar:min-w-8! @max-[34rem]/titlebar:justify-center @max-[34rem]/titlebar:border-0! @max-[34rem]/titlebar:bg-transparent! @max-[34rem]/titlebar:px-0!\">\n {privateSession ? (\n <LockKeyholeIcon className=\"size-3.5 shrink-0 text-brand\" aria-hidden=\"true\" />\n ) : (\n <UsersIcon className=\"size-3.5 shrink-0 text-fg-muted\" aria-hidden=\"true\" />\n )}\n <span className=\"hidden sm:inline @max-[34rem]/titlebar:hidden!\">{stateLabel}</span>\n {failure ? <CircleAlertIcon className=\"size-3.5 text-status-waiting\" aria-hidden /> : null}\n {mayFork ? (\n <ChevronDownIcon\n className=\"hidden size-3.5 text-fg-muted sm:block @max-[34rem]/titlebar:hidden!\"\n aria-hidden\n />\n ) : null}\n </span>\n );\n\n return (\n <TooltipProvider delayDuration={300}>\n <section\n aria-label=\"Session access\"\n className={sourceEventId ? \"hidden\" : \"flex shrink-0 items-center\"}\n >\n {mayFork ? (\n <DropdownMenu>\n <DropdownMenuTrigger asChild disabled={busy}>\n <button\n ref={accessTriggerRef}\n type=\"button\"\n aria-label={\n mayManage\n ? `${stateLabel} session access. Manage session access`\n : `${stateLabel} session access. Session actions`\n }\n aria-busy={busy}\n className=\"rounded-full focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {busy ? (\n <span className=\"inline-flex min-h-8 items-center gap-1.5 rounded-full border border-border bg-surface/55 px-2.5 text-xs font-medium pointer-coarse:min-h-11\">\n <Loader2Icon className=\"size-3.5 animate-spin motion-reduce:animate-none\" />\n <span className=\"hidden sm:inline\">Updating</span>\n </span>\n ) : (\n stateChip\n )}\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-72\">\n <div className=\"px-2.5 py-1.5\">\n <p className=\"text-sm font-medium text-fg\">{stateLabel} session</p>\n <p className=\"mt-0.5 text-xs leading-4.5 text-fg-muted\">{stateDescription}</p>\n </div>\n {mayManage ? (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n onSelect={() => void startVisibilityChange(alternateVisibility)}\n >\n {privateSession ? <UsersIcon /> : <LockKeyholeIcon />}\n {retryingVisibility ? `Retry: ${visibilityAction}` : visibilityAction}\n </DropdownMenuItem>\n </>\n ) : null}\n <DropdownMenuSeparator />\n <DropdownMenuItem\n onSelect={() =>\n setConfirmation({\n kind: \"fork\",\n visibility:\n pendingFork?.visibility ??\n (canForkPrivately ? displayedTenancy.visibility : \"workspace\"),\n })\n }\n >\n <CopyPlusIcon />\n {retryingFork ? \"Retry session fork\" : \"Fork session\"}\n </DropdownMenuItem>\n {failure ? (\n <>\n <DropdownMenuSeparator />\n <div className=\"px-2.5 py-1.5 text-xs leading-4.5 text-status-waiting\">\n <span className=\"font-medium\">Access change needs attention.</span> {failure}\n </div>\n </>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n ) : (\n <Tooltip>\n <TooltipTrigger asChild>\n <span\n role=\"img\"\n tabIndex={0}\n aria-label={`${stateLabel} session access. ${stateDescription}`}\n >\n {stateChip}\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">{stateDescription}</TooltipContent>\n </Tooltip>\n )}\n <span className=\"sr-only\" aria-live=\"polite\" aria-atomic=\"true\">\n {announcement}\n </span>\n </section>\n\n <ConfirmDialog\n open={confirmation !== null}\n onOpenChange={(open) => {\n if (!open) {\n setConfirmation(null);\n setVisibilityPreview(null);\n onForkClose?.();\n }\n }}\n title={\n confirmation?.kind === \"fork\"\n ? confirmation.visibility === \"workspace\"\n ? `Fork a workspace-visible copy?`\n : \"Fork a private copy?\"\n : confirmation?.visibility === \"workspace\"\n ? `Share this session with ${scopeLabel}?`\n : \"Limit this session to you?\"\n }\n description={\n (pendingFork ? pendingFork.sourceEventId : sourceEventId)\n ? `Copy the conversation through the selected message${confirmation?.visibility === \"workspace\" ? ` into a session visible to people in ${scopeLabel}` : \" into a session visible only to you\"}. Later messages are excluded. Live credentials, tools, goals, and processes are not copied.`\n : confirmation?.kind === \"fork\" &&\n displayedTenancy.visibility === \"private\" &&\n confirmation.visibility === \"workspace\"\n ? `This private session's complete conversation will be copied into a new session visible to people in ${scopeLabel}. Live credentials, connections, tools, goals, and processes are not copied.`\n : confirmation?.kind === \"fork\"\n ? confirmation.visibility === \"workspace\"\n ? `Create an independent copy visible to people in ${scopeLabel}. Live credentials, connections, tools, goals, and processes are not copied.`\n : \"Create an independent copy visible only to you. Live credentials, connections, tools, goals, and processes are not copied.\"\n : confirmation?.visibility === \"workspace\"\n ? \"People who can access this workspace will be able to open and continue the session. Current work keeps running with its existing identity and connections.\"\n : `Only you will be able to open the session.${privateSessionSandboxNote(session.sandboxBackend)}`\n }\n confirmLabel={\n confirmation?.kind === \"fork\"\n ? retryingFork\n ? \"Retry fork\"\n : confirmation.visibility === \"workspace\"\n ? \"Fork for workspace\"\n : \"Fork privately\"\n : visibilityConfirmLabel\n }\n pendingLabel={\n confirmation?.kind === \"visibility\" && stopsWork ? \"Stopping work…\" : \"Working…\"\n }\n // A fork only widens exposure when a private source is copied into the\n // workspace. Changing an existing session to workspace visibility always\n // does, and making it private destroys the work and access it drops.\n // A shared-to-shared fork exposes nothing new.\n destructive={\n confirmation?.kind === \"fork\"\n ? displayedTenancy.visibility === \"private\" && confirmation.visibility === \"workspace\"\n : confirmation?.visibility === \"workspace\" || workToStop !== null\n }\n cancelAutoFocus\n restoreFocusRef={sourceEventId ? undefined : accessTriggerRef}\n onConfirm={() => {\n if (!confirmation) return true;\n return confirmation.kind === \"visibility\"\n ? changeVisibility(confirmation.visibility, workToStop !== null)\n : forkSession(confirmation.visibility);\n }}\n >\n {confirmation?.kind === \"visibility\" && workToStop ? (\n <Notice tone=\"waiting\" title=\"This will also\">\n <ul className=\"list-disc space-y-0.5 pl-4\">\n {sessionVisibilityWorkSummary(workToStop).map((line) => (\n <li key={line}>{line}</li>\n ))}\n </ul>\n </Notice>\n ) : null}\n {confirmation?.kind === \"fork\" && !retryingFork ? (\n <div\n className={canForkPrivately ? \"grid grid-cols-2 gap-2\" : \"grid gap-2\"}\n role=\"radiogroup\"\n aria-label=\"Fork visibility\"\n >\n {canForkPrivately ? (\n <Button\n type=\"button\"\n variant={confirmation.visibility === \"private\" ? \"secondary\" : \"outline\"}\n className=\"aria-checked:text-fg\"\n role=\"radio\"\n aria-checked={confirmation.visibility === \"private\"}\n onClick={() => setConfirmation({ kind: \"fork\", visibility: \"private\" })}\n >\n <LockKeyholeIcon /> Private\n </Button>\n ) : null}\n <Button\n type=\"button\"\n variant={confirmation.visibility === \"workspace\" ? \"secondary\" : \"outline\"}\n className=\"aria-checked:text-fg\"\n role=\"radio\"\n aria-checked={confirmation.visibility === \"workspace\"}\n onClick={() => setConfirmation({ kind: \"fork\", visibility: \"workspace\" })}\n >\n <UsersIcon /> Workspace\n </Button>\n </div>\n ) : null}\n {failure ? (\n <Notice tone=\"waiting\" title=\"Access change needs attention\">\n {failure}\n </Notice>\n ) : null}\n </ConfirmDialog>\n </TooltipProvider>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,SAAS,+BAA+B;AAQxC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,aAAa,WAAW,SAAS,QAAQ,gBAAgB;AA8E9D,SA0rBY,UA1rBZ,KAqoBA,YAroBA;AArBJ,IAAM,wBAAwB;AAEf,SAAR,sBACL,OAgBA;AACA,SAAO,MAAM,UACX,oBAAC,8BAA2B,SAAS,MAAM,SAAS,QAAQ,MAAM,QAAQ,IACxE,wBAAwB,MAAM,SAAS;AAAA;AAAA;AAAA;AAAA,IAIzC;AAAA,MAAC;AAAA;AAAA,QACC,OAAM;AAAA,QACN,aAAY;AAAA,QACZ,QACE,MAAM,UACJ,oBAAC,UAAO,MAAK,UAAS,SAAQ,WAAU,SAAS,MAAM,SAAS,uBAEhE,IACE;AAAA;AAAA,IAER;AAAA,MACE,CAAC,iBAAiB,MAAM,WAAW,GAAG,IACxC;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,aACE,MAAM,qBAAqB,QAAQ,MAAM,UAAU,UAAU,OAAO,MAAM,SAAS;AAAA,MAErF,QACE,oBAAC,UAAO,SAAO,MAAC,MAAK,UAAS,SAAQ,WACpC,8BAAC,OAAE,MAAM,sBAAsB,MAAM,WAAW,GAAG,8BAAgB,GACrE;AAAA;AAAA,EAEJ,IAEA,oBAAC,2BAAwB,aAAa,MAAM,aAAa,WAAW,MAAM,WAAW;AAEzF;AAYA,SAAS,yBAAyB,SAKtB;AACV,QAAM,EAAE,QAAQ,aAAa,mBAAmB,eAAe,IAAI;AACnE,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAAS,iBAAiB;AAC1E,YAAU,MAAM;AACd,QAAI,mBAAmB;AACrB,0BAAoB,IAAI;AACxB;AAAA,IACF;AACA,wBAAoB,KAAK;AACzB,QAAI,CAAC,eAAgB;AACrB,QAAI,UAAU;AACd,SAAK,OACF,oCAAoC,WAAW,EAC/C,KAAK,CAAC,iBAAiB;AACtB,UAAI,QAAS,qBAAoB,aAAa,qBAAqB,IAAI;AAAA,IACzE,CAAC,EACA,MAAM,MAAM;AACX,UAAI,QAAS,qBAAoB,KAAK;AAAA,IACxC,CAAC;AACH,WAAO,MAAM;AACX,gBAAU;AAAA,IACZ;AAAA,EACF,GAAG,CAAC,QAAQ,gBAAgB,mBAAmB,WAAW,CAAC;AAC3D,SAAO;AACT;AAEO,SAAS,2BAA2B;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,QAAM,UAAU,cAAc;AAC9B,QAAM,WAAW,YAAY;AAC7B,QAAM,YAAY,QAAQ,WAAW,KAAK,CAAC,cAAc,UAAU,OAAO,QAAQ,WAAW;AAC7F,QAAM,oBAAoB,oBAAoB,aAAa,MAAM,QAAQ,kBAAkB;AAC3F,QAAM,iBACJ,QAAQ,aAAa,KAAK,SAAS,oBAAoB,QAAQ,gBAAgB;AACjF,QAAM,mBAAmB,yBAAyB;AAAA,IAChD,QAAQ,QAAQ;AAAA,IAChB,aAAa,QAAQ;AAAA,IACrB;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,aAAa,QAAQ,2BAA2B,QAAQ,WAAW;AACzE,MAAI,CAAC,WAAY,QAAO;AACxB,QAAM,aAAa,oBACf,GAAG,WAAW,QAAQ,gBAAgB,wBACrC,WAAW,QAAQ;AAExB,SACE;AAAA,IAAC;AAAA;AAAA,MAEC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,QAAQ;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA,4BAA4B,QAAQ;AAAA,MACpC,yBAAyB,QAAQ;AAAA,MACjC,qBAAqB;AAAA,MACrB,gBAAgB;AAAA,QACd,aAAa,QAAQ,cAAc;AAAA,QACnC,aAAa,QAAQ;AAAA,QACrB,WAAW,QAAQ;AAAA,QACnB,6BAA6B,WAAW;AAAA,MAC1C;AAAA,MACA,eAAe,CAAC,aAAa,cAC3B,KAAK,SAAS;AAAA,QACZ,IAAI;AAAA,QACJ,QAAQ,EAAE,aAAa,UAAU;AAAA,MACnC,CAAC;AAAA;AAAA,IAtBE,GAAG,QAAQ,cAAc,SAAS,IAAI,WAAW,QAAQ,IAAI,QAAQ,WAAW,IAAI,QAAQ,EAAE;AAAA,EAwBrG;AAEJ;AAEO,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAiBG;AACD,QAAM,SAAS;AAAA,IACb,OAAO,EAAE,aAAa,QAAQ,aAAa,WAAW,QAAQ,GAAG;AAAA,IACjE,CAAC,QAAQ,IAAI,QAAQ,WAAW;AAAA,EAClC;AACA,QAAM,YAAY,OAAO,MAAM;AAC/B,YAAU,UAAU;AACpB,QAAM,aAAa,OAAO,KAAK;AAC/B,QAAM,uBAAuB,OAAO,CAAC;AACrC,QAAM,6BAA6B,OAAO,CAAC;AAC3C,QAAM,oBAAoB,oBAAoB,SAAS,cAAc;AACrE,QAAM,oBAAoB,kBAAkB;AAC5C,QAAM,cAAc,kBAAkB;AACtC,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,QAAQ,OAAO;AACxD,QAAM,CAAC,cAAc,eAAe,IAAI;AAAA,IAA8B,MACpE,gBACI;AAAA,MACE,MAAM;AAAA,MACN,YACE,kBAAkB,MAAM,eACvB,mBAAoB,QAAQ,SAAS,cAAc,cAAe;AAAA,IACvE,IACA;AAAA,EACN;AACA,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AACtC,QAAM,CAAC,SAAS,UAAU,IAAI,SAAwB,IAAI;AAC1D,QAAM,CAAC,mBAAmB,oBAAoB,IAAI,SAAyC,IAAI;AAC/F,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,EAAE;AACnD,QAAM,CAAC,EAAE,qBAAqB,IAAI,SAAS,CAAC;AAC5C,QAAM,mBAAmB,OAA0B,IAAI;AAEvD,YAAU,MAAM;AACd,eAAW,UAAU;AACrB,WAAO,MAAM;AACX,iBAAW,UAAU;AAAA,IACvB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,YAAU,MAAM;AACd,yBAAqB,WAAW;AAChC,YAAQ,KAAK;AACb,eAAW,IAAI;AACf,QAAI,CAAC,cAAe,iBAAgB,IAAI;AAAA,EAC1C,GAAG,CAAC,QAAQ,IAAI,QAAQ,aAAa,aAAa,CAAC;AAEnD,YAAU,MAAM;AACd,QAAI,CAAC,QAAQ,SAAS;AACpB,kBAAY,MAAS;AACrB;AAAA,IACF;AACA;AAAA,MAAY,CAAC,YACX,CAAC,WAAW,QAAQ,QAAS,kBAAkB,QAAQ,iBACnD,QAAQ,UACR;AAAA,IACN;AAAA,EACF,GAAG,CAAC,QAAQ,OAAO,CAAC;AAEpB,YAAU,MAAM;AACd,QACE,sBACC,CAAC,QAAQ,WACR,QAAQ,QAAQ,iBAAiB,kBAAkB,yBACrD;AACA,0BAAoB,iBAAiB,gBAAgB,iBAAiB;AACtE,4BAAsB,CAAC,YAAY,UAAU,CAAC;AAAA,IAChD;AAAA,EACF,GAAG,CAAC,qBAAqB,gBAAgB,mBAAmB,QAAQ,OAAO,CAAC;AAE5E,QAAM,mBAAmB;AACzB,QAAM,YAAY,QAAQ,kBAAkB,sBAAsB,cAAc;AAEhF,QAAM,UAAU;AAAA,IACd,oBACA,mBACC,iBAAiB,eAAe,eAAe,iBAAiB;AAAA,EACnE;AACA,QAAM,sBAAsB;AAAA,IAC1B,CACE,gBACA,oBACA,sBAEA,WAAW,WACX,qBAAqB,YAAY,qBACjC,8BAA8B,UAAU,SAAS,cAAc,KAC/D,wBAAwB,eAAe,aAAa,kBAAkB;AAAA,IACxE,CAAC,uBAAuB;AAAA,EAC1B;AAEA,QAAM,kBAAkB;AAAA,IACtB,OACE,gBACA,oBACA,sBAC4B;AAC5B,YAAM,SAAS,MAAM,+BAA+B;AAAA,QAClD,WAAW,MAAM,oBAAoB,gBAAgB,oBAAoB,iBAAiB;AAAA,QAC1F,SAAS,YACP,MAAM,OAAO,WAAW,eAAe,aAAa,eAAe,WAAW;AAAA,UAC5E,OAAO;AAAA,QACT,CAAC;AAAA,MACL,CAAC;AACD,UAAI,OAAO,WAAW,QAAS,QAAO;AACtC,kBAAY,OAAO,MAAM,OAAO;AAChC,aAAO,OAAO;AAAA,IAChB;AAAA,IACA,CAAC,QAAQ,mBAAmB;AAAA,EAC9B;AAEA,QAAM,2BAA2B,QAAQ;AAAA,IACvC,CAAC,QAAQ,UACP,MAAM,SAAS,+BAA+B,KAAK,IAAI,QAAQ,MAAM,QAAQ,IAAI;AAAA,IACnF;AAAA,EACF;AACA,YAAU,MAAM;AACd,QACE,CAAC,4BACD,4BAA4B,2BAA2B,SACvD;AACA;AAAA,IACF;AACA,+BAA2B,UAAU;AACrC,UAAM,qBAAqB,2BAA2B,OAAO,WAAW;AACxE,QAAI,CAAC,mBAAoB;AACzB,QAAI,YAAY;AAChB,SAAK,OACF,WAAW,OAAO,aAAa,OAAO,WAAW,EAAE,OAAO,KAAK,CAAC,EAChE,KAAK,CAAC,YAAY;AACjB,UACE,aACA,CAAC,WAAW,WACZ,CAAC,8BAA8B,UAAU,SAAS,MAAM,KACxD,CAAC,wBAAwB,OAAO,aAAa,kBAAkB,GAC/D;AACA;AAAA,MACF;AACA,kBAAY,QAAQ,OAAO;AAC3B,YAAM,WAAW,oBAAoB,SAAS,cAAc,EAAE;AAC9D,UACE,aACC,CAAC,QAAQ,WAAW,QAAQ,QAAQ,iBAAiB,SAAS,yBAC/D;AACA,4BAAoB,iBAAiB,gBAAgB,QAAQ;AAC7D,8BAAsB,CAAC,aAAa,WAAW,CAAC;AAAA,MAClD;AACA;AAAA,QACE,CAAC,QAAQ,UACL,qDACA,QAAQ,QAAQ,eAAe,YAC7B,+BACA,yBAAyB,UAAU;AAAA,MAC3C;AAAA,IACF,CAAC,EACA,MAAM,MAAM,MAAS;AACxB,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,mBAAmB;AAAA,IACvB,OAAO,YAA+B,mBAA8C;AAClF,UAAI,CAAC,oBAAoB,CAAC,aAAa,eAAe,iBAAiB,YAAY;AACjF,eAAO;AAAA,MACT;AACA,YAAM,qBAAqB,2BAA2B,OAAO,WAAW;AACxE,UAAI,CAAC,mBAAoB,QAAO;AAChC,YAAM,oBAAoB,qBAAqB,UAAU;AACzD,2BAAqB,UAAU;AAC/B,YAAM,UAAU,oBAAoB;AAAA,QAClC;AAAA,QACA,EAAE,YAAY,wBAAwB,iBAAiB,eAAe;AAAA,QACtE,MAAM,OAAO,WAAW;AAAA,MAC1B;AACA,cAAQ,IAAI;AACZ,iBAAW,IAAI;AACf,UAAI,mBAAmB;AAEvB,UAAI;AACF,cAAM,SAAS,MAAM,+BAA+B;AAAA,UAClD,WAAW,MAAM,oBAAoB,QAAQ,oBAAoB,iBAAiB;AAAA,UAClF,SAAS,YAAY;AACnB,qBAAS,QAAQ,KAAK,SAAS,GAAG;AAChC,kBAAI;AACF,uBAAO,MAAM,OAAO,wBAAwB,OAAO,aAAa,OAAO,WAAW;AAAA,kBAChF,YAAY,QAAQ;AAAA,kBACpB,wBAAwB,QAAQ;AAAA,kBAChC,gBAAgB,QAAQ;AAAA,kBACxB,GAAI,iBAAiB,EAAE,gBAAgB,KAAK,IAAI,CAAC;AAAA,gBACnD,CAAC;AAAA,cACH,SAAS,OAAO;AAEd,oBACE,QAAQ,yBACR,2BAA2B,KAAK,KAChC,oBAAoB,QAAQ,oBAAoB,iBAAiB,GACjE;AACA;AAAA,gBACF;AACA,sBAAM;AAAA,cACR;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAC;AACD,YAAI,OAAO,WAAW,QAAS,QAAO;AACtC,2BAAmB;AAEnB,YAAI,OAAO,MAAM,QAAQ;AACvB,gBAAM,gBAAgB,MAAM;AAAA,YAC1B;AAAA,YACA;AAAA,YACA;AAAA,UACF;AACA,cAAI,CAAC,cAAe,QAAO;AAC3B,8BAAoB,iBAAiB,gBAAgB,OAAO;AAC5D,cAAI,cAAc,SAAS;AACzB,kBAAMA,WACJ,cAAc,QAAQ,eAAe,YACjC,+BACA,yBAAyB,UAAU;AACzC,4BAAgBA,QAAO;AACvB,kBAAM,KAAK,4BAA4B,EAAE,aAAaA,SAAQ,CAAC;AAAA,UACjE,OAAO;AACL,kBAAMA,WAAU;AAChB,4BAAgBA,QAAO;AACvB,kBAAM,KAAK,4BAA4B,EAAE,aAAaA,SAAQ,CAAC;AAAA,UACjE;AACA,iBAAO;AAAA,QACT,OAAO;AACL,sBAAY;AAAA,YACV,GAAG;AAAA,YACH,YAAY,OAAO,MAAM;AAAA,YACzB,gBAAgB,OAAO,MAAM;AAAA,UAC/B,CAAC;AAAA,QACH;AACA,4BAAoB,iBAAiB,gBAAgB,OAAO;AAC5D,cAAM,UACJ,OAAO,MAAM,eAAe,YACxB,+BACA,yBAAyB,UAAU;AACzC,wBAAgB,OAAO;AACvB,cAAM,QAAQ,0BAA0B,EAAE,aAAa,QAAQ,CAAC;AAChE,eAAO;AAAA,MACT,SAAS,OAAO;AACd,YAAI,CAAC,oBAAoB,QAAQ,oBAAoB,iBAAiB,EAAG,QAAO;AAChF,cAAM,aAAa,8BAA8B,KAAK;AACtD,YAAI,WAAW,SAAS,iBAAiB,WAAW,MAAM;AAExD,+BAAqB,EAAE,QAAQ,SAAS,MAAM,WAAW,KAAK,CAAC;AAC/D,0BAAgB,EAAE,MAAM,cAAc,WAAW,CAAC;AAAA,QACpD;AACA,YAAI,gBAAgC;AACpC,YAAI,WAAW,WAAW;AACxB,0BAAgB,MAAM;AAAA,YACpB;AAAA,YACA;AAAA,YACA;AAAA,UACF,EAAE,MAAM,MAAM,IAAI;AAAA,QACpB;AACA,YAAI,CAAC,oBAAoB,QAAQ,oBAAoB,iBAAiB,EAAG,QAAO;AAChF,YACE,kBACC,CAAC,cAAc,WACd,cAAc,QAAQ,iBAAiB,QAAQ,yBACjD;AACA,8BAAoB,iBAAiB,gBAAgB,OAAO;AAC5D,cAAI,WAAW,SAAS,kBAAkB;AACxC,uBAAW,WAAW,OAAO;AAC7B,4BAAgB,WAAW,OAAO;AAClC,mBAAO;AAAA,UACT;AACA,gBAAM,UAAU,CAAC,cAAc,UAC3B,qDACA,cAAc,QAAQ,eAAe,YACnC,+BACA,yBAAyB,UAAU;AACzC,0BAAgB,OAAO;AACvB,gBAAM,KAAK,4BAA4B,EAAE,aAAa,QAAQ,CAAC;AAC/D,iBAAO;AAAA,QACT;AACA,cAAM,gBACJ,WAAW,iBACV,oBAAoB,6CAA6C,KAAK;AACzE,YAAI,CAAC,eAAe;AAClB,8BAAoB,iBAAiB,gBAAgB,OAAO;AAAA,QAC9D;AACA,mBAAW,WAAW,OAAO;AAC7B,wBAAgB,WAAW,OAAO;AAClC,eAAO,CAAC;AAAA,MACV,UAAE;AACA,YAAI,oBAAoB,QAAQ,oBAAoB,iBAAiB,EAAG,SAAQ,KAAK;AAAA,MACvF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAOA,QAAM,wBAAwB;AAAA,IAC5B,OAAO,eAAkC;AACvC,iBAAW,IAAI;AACf,2BAAqB,IAAI;AACzB,UAAI,eAAe,WAAW;AAC5B,wBAAgB,EAAE,MAAM,cAAc,WAAW,CAAC;AAClD;AAAA,MACF;AACA,YAAM,oBAAoB,qBAAqB;AAC/C,cAAQ,IAAI;AACZ,UAAI;AACJ,UAAI;AACF,cAAM,SAAS,MAAM,OAAO;AAAA,UAC1B,OAAO;AAAA,UACP,OAAO;AAAA,UACP;AAAA,QACF;AACA,cAAM,OAAO,+BAA+B,OAAO,IAAI;AACvD,kBAAU,OAAO,EAAE,QAAQ,SAAS,KAAK,IAAI,EAAE,QAAQ,cAAc;AAAA,MACvE,QAAQ;AACN,kBAAU,EAAE,QAAQ,cAAc;AAAA,MACpC;AACA,UAAI,CAAC,WAAW,WAAW,qBAAqB,YAAY,kBAAmB;AAC/E,cAAQ,KAAK;AACb,UAAI,QAAQ,WAAW,WAAW,6BAA6B,QAAQ,IAAI,GAAG;AAC5E,cAAM,iBAAiB,YAAY,KAAK;AACxC;AAAA,MACF;AACA,2BAAqB,OAAO;AAC5B,sBAAgB,EAAE,MAAM,cAAc,WAAW,CAAC;AAAA,IACpD;AAAA,IACA,CAAC,kBAAkB,QAAQ,MAAM;AAAA,EACnC;AAEA,QAAM,cAAc;AAAA,IAClB,OAAO,eAAoD;AACzD,UAAI,CAAC,oBAAoB,CAAC,QAAS,QAAO;AAC1C,UAAI,iBAAiB,eAAe,YAAY,kBAAkB,eAAe;AAC/E;AAAA,UACE;AAAA,QACF;AACA,eAAO;AAAA,MACT;AACA,YAAM,qBAAqB,2BAA2B,OAAO,WAAW;AACxE,UAAI,CAAC,mBAAoB,QAAO;AAChC,YAAM,oBAAoB,qBAAqB,UAAU;AACzD,2BAAqB,UAAU;AAC/B,YAAM,8BACJ,iBAAiB,eAAe,aAAa,eAAe;AAC9D,YAAM,UAAU,oBAAoB;AAAA,QAClC;AAAA,QACA,EAAE,YAAY,6BAA6B,GAAI,gBAAgB,EAAE,cAAc,IAAI,CAAC,EAAG;AAAA,QACvF,MAAM,OAAO,WAAW;AAAA,MAC1B;AACA,cAAQ,IAAI;AACZ,iBAAW,IAAI;AACf,UAAI,mBAAmB;AACvB,UAAI;AACF,cAAM,SAAS,MAAM,+BAA+B;AAAA,UAClD,WAAW,MAAM,oBAAoB,QAAQ,oBAAoB,iBAAiB;AAAA,UAClF,SAAS,YACP,MAAM,OAAO,YAAY,OAAO,aAAa,OAAO,WAAW;AAAA,YAC7D,GAAI,QAAQ,gBAAgB,EAAE,eAAe,QAAQ,cAAc,IAAI,CAAC;AAAA,YACxE,YAAY,QAAQ;AAAA,YACpB,6BAA6B,QAAQ;AAAA,YACrC,gBAAgB,QAAQ;AAAA,UAC1B,CAAC;AAAA,QACL,CAAC;AACD,YAAI,OAAO,WAAW,QAAS,QAAO;AACtC,2BAAmB;AACnB,cAAM,cAAc,MAAM,+BAA+B;AAAA,UACvD,WAAW,MAAM,oBAAoB,QAAQ,oBAAoB,iBAAiB;AAAA,UAClF,SAAS,YACP,MAAM,OAAO,WAAW,OAAO,MAAM,aAAa,OAAO,MAAM,WAAW;AAAA,YACxE,OAAO;AAAA,UACT,CAAC;AAAA,QACL,CAAC;AACD,YAAI,YAAY,WAAW,QAAS,QAAO;AAC3C,YACE,YAAY,MAAM,gBAAgB,OAAO,eACzC,YAAY,MAAM,SAAS,eAAe,OAAO,MAAM,cACvD,CAAC,YAAY,MAAM,QAAQ,oBAC3B;AACA,gBAAM,IAAI,MAAM,iEAAiE;AAAA,QACnF;AACA,4BAAoB,WAAW,gBAAgB,OAAO;AACtD,cAAM,cACJ,OAAO,MAAM,eAAe,YACxB,4CACA,sCAAsC,UAAU;AACtD,wBAAgB,WAAW;AAC3B,cAAM,QAAQ,OAAO,MAAM,SAAS,2BAA2B,wBAAwB;AAAA,UACrF;AAAA,QACF,CAAC;AACD,sBAAc,OAAO,MAAM,aAAa,OAAO,MAAM,SAAS;AAC9D,eAAO;AAAA,MACT,SAAS,OAAO;AACd,YAAI,CAAC,oBAAoB,QAAQ,oBAAoB,iBAAiB,EAAG,QAAO;AAChF,cAAM,aAAa,8BAA8B,KAAK;AACtD,cAAM,gBACJ,WAAW,iBACV,oBAAoB,6CAA6C,KAAK;AACzE,YAAI,CAAC,cAAe,qBAAoB,WAAW,gBAAgB,OAAO;AAC1E,cAAM,UAAU,WAAW;AAC3B,mBAAW,OAAO;AAClB,wBAAgB,OAAO;AACvB,eAAO,gBAAgB,QAAQ,CAAC;AAAA,MAClC,UAAE;AACA,YAAI,oBAAoB,QAAQ,oBAAoB,iBAAiB,EAAG,SAAQ,KAAK;AAAA,MACvF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,iBAAkB,QAAO;AAE9B,QAAM,iBAAiB,iBAAiB,eAAe;AACvD,QAAM,sBAAyC,iBAAiB,cAAc;AAC9E,QAAM,qBACJ,mBAAmB,eAAe,uBAClC,kBAAkB,2BAA2B,iBAAiB;AAChE,QAAM,mBAAmB,iBACrB,4CACA;AACJ,QAAM,eAAe,mBAAmB,WAAW,UAAU,oBAAoB;AAEjF,QAAM,aACJ,gBAAgB,CAAC,6BAA6B,aAAa,IAAI,IAAI,aAAa,OAAO;AACzF,QAAM,YAAY,eAAe,QAAQ,+BAA+B,UAAU;AAClF,QAAM,yBAAyB,iBAC3B,qBACE,+BACA,yBACF,YACE,8BACA,qBACE,sBACA;AACR,QAAM,aAAa,iBAAiB,YAAY;AAChD,QAAM,mBAAmB,iBACrB,oCACA,wBAAwB,UAAU;AACtC,QAAM,eAAe,gBAAgB;AACrC,QAAM;AAAA;AAAA;AAAA;AAAA;AAAA,IAKJ,qBAAC,UAAK,WAAU,qZACb;AAAA,uBACC,oBAAC,mBAAgB,WAAU,gCAA+B,eAAY,QAAO,IAE7E,oBAAC,aAAU,WAAU,mCAAkC,eAAY,QAAO;AAAA,MAE5E,oBAAC,UAAK,WAAU,kDAAkD,sBAAW;AAAA,MAC5E,UAAU,oBAAC,mBAAgB,WAAU,gCAA+B,eAAW,MAAC,IAAK;AAAA,MACrF,UACC;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,eAAW;AAAA;AAAA,MACb,IACE;AAAA,OACN;AAAA;AAGF,SACE,qBAAC,mBAAgB,eAAe,KAC9B;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,cAAW;AAAA,QACX,WAAW,gBAAgB,WAAW;AAAA,QAErC;AAAA,oBACC,qBAAC,gBACC;AAAA,gCAAC,uBAAoB,SAAO,MAAC,UAAU,MACrC;AAAA,cAAC;AAAA;AAAA,gBACC,KAAK;AAAA,gBACL,MAAK;AAAA,gBACL,cACE,YACI,GAAG,UAAU,2CACb,GAAG,UAAU;AAAA,gBAEnB,aAAW;AAAA,gBACX,WAAU;AAAA,gBAET,iBACC,qBAAC,UAAK,WAAU,+IACd;AAAA,sCAAC,eAAY,WAAU,oDAAmD;AAAA,kBAC1E,oBAAC,UAAK,WAAU,oBAAmB,sBAAQ;AAAA,mBAC7C,IAEA;AAAA;AAAA,YAEJ,GACF;AAAA,YACA,qBAAC,uBAAoB,OAAM,OAAM,WAAU,QACzC;AAAA,mCAAC,SAAI,WAAU,iBACb;AAAA,qCAAC,OAAE,WAAU,+BAA+B;AAAA;AAAA,kBAAW;AAAA,mBAAQ;AAAA,gBAC/D,oBAAC,OAAE,WAAU,4CAA4C,4BAAiB;AAAA,iBAC5E;AAAA,cACC,YACC,iCACE;AAAA,oCAAC,yBAAsB;AAAA,gBACvB;AAAA,kBAAC;AAAA;AAAA,oBACC,UAAU,MAAM,KAAK,sBAAsB,mBAAmB;AAAA,oBAE7D;AAAA,uCAAiB,oBAAC,aAAU,IAAK,oBAAC,mBAAgB;AAAA,sBAClD,qBAAqB,UAAU,gBAAgB,KAAK;AAAA;AAAA;AAAA,gBACvD;AAAA,iBACF,IACE;AAAA,cACJ,oBAAC,yBAAsB;AAAA,cACvB;AAAA,gBAAC;AAAA;AAAA,kBACC,UAAU,MACR,gBAAgB;AAAA,oBACd,MAAM;AAAA,oBACN,YACE,aAAa,eACZ,mBAAmB,iBAAiB,aAAa;AAAA,kBACtD,CAAC;AAAA,kBAGH;AAAA,wCAAC,gBAAa;AAAA,oBACb,eAAe,uBAAuB;AAAA;AAAA;AAAA,cACzC;AAAA,cACC,UACC,iCACE;AAAA,oCAAC,yBAAsB;AAAA,gBACvB,qBAAC,SAAI,WAAU,yDACb;AAAA,sCAAC,UAAK,WAAU,eAAc,4CAA8B;AAAA,kBAAO;AAAA,kBAAE;AAAA,mBACvE;AAAA,iBACF,IACE;AAAA,eACN;AAAA,aACF,IAEA,qBAAC,WACC;AAAA,gCAAC,kBAAe,SAAO,MACrB;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,UAAU;AAAA,gBACV,cAAY,GAAG,UAAU,oBAAoB,gBAAgB;AAAA,gBAE5D;AAAA;AAAA,YACH,GACF;AAAA,YACA,oBAAC,kBAAe,MAAK,UAAU,4BAAiB;AAAA,aAClD;AAAA,UAEF,oBAAC,UAAK,WAAU,WAAU,aAAU,UAAS,eAAY,QACtD,wBACH;AAAA;AAAA;AAAA,IACF;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,iBAAiB;AAAA,QACvB,cAAc,CAAC,SAAS;AACtB,cAAI,CAAC,MAAM;AACT,4BAAgB,IAAI;AACpB,iCAAqB,IAAI;AACzB,0BAAc;AAAA,UAChB;AAAA,QACF;AAAA,QACA,OACE,cAAc,SAAS,SACnB,aAAa,eAAe,cAC1B,mCACA,yBACF,cAAc,eAAe,cAC3B,2BAA2B,UAAU,MACrC;AAAA,QAER,cACG,cAAc,YAAY,gBAAgB,iBACvC,qDAAqD,cAAc,eAAe,cAAc,wCAAwC,UAAU,KAAK,qCAAqC,iGAC5L,cAAc,SAAS,UACrB,iBAAiB,eAAe,aAChC,aAAa,eAAe,cAC5B,uGAAuG,UAAU,iFACjH,cAAc,SAAS,SACrB,aAAa,eAAe,cAC1B,mDAAmD,UAAU,iFAC7D,+HACF,cAAc,eAAe,cAC3B,+JACA,6CAA6C,0BAA0B,QAAQ,cAAc,CAAC;AAAA,QAE1G,cACE,cAAc,SAAS,SACnB,eACE,eACA,aAAa,eAAe,cAC1B,uBACA,mBACJ;AAAA,QAEN,cACE,cAAc,SAAS,gBAAgB,YAAY,wBAAmB;AAAA,QAMxE,aACE,cAAc,SAAS,SACnB,iBAAiB,eAAe,aAAa,aAAa,eAAe,cACzE,cAAc,eAAe,eAAe,eAAe;AAAA,QAEjE,iBAAe;AAAA,QACf,iBAAiB,gBAAgB,SAAY;AAAA,QAC7C,WAAW,MAAM;AACf,cAAI,CAAC,aAAc,QAAO;AAC1B,iBAAO,aAAa,SAAS,eACzB,iBAAiB,aAAa,YAAY,eAAe,IAAI,IAC7D,YAAY,aAAa,UAAU;AAAA,QACzC;AAAA,QAEC;AAAA,wBAAc,SAAS,gBAAgB,aACtC,oBAAC,UAAO,MAAK,WAAU,OAAM,kBAC3B,8BAAC,QAAG,WAAU,8BACX,uCAA6B,UAAU,EAAE,IAAI,CAAC,SAC7C,oBAAC,QAAe,kBAAP,IAAY,CACtB,GACH,GACF,IACE;AAAA,UACH,cAAc,SAAS,UAAU,CAAC,eACjC;AAAA,YAAC;AAAA;AAAA,cACC,WAAW,mBAAmB,2BAA2B;AAAA,cACzD,MAAK;AAAA,cACL,cAAW;AAAA,cAEV;AAAA,mCACC;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS,aAAa,eAAe,YAAY,cAAc;AAAA,oBAC/D,WAAU;AAAA,oBACV,MAAK;AAAA,oBACL,gBAAc,aAAa,eAAe;AAAA,oBAC1C,SAAS,MAAM,gBAAgB,EAAE,MAAM,QAAQ,YAAY,UAAU,CAAC;AAAA,oBAEtE;AAAA,0CAAC,mBAAgB;AAAA,sBAAE;AAAA;AAAA;AAAA,gBACrB,IACE;AAAA,gBACJ;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS,aAAa,eAAe,cAAc,cAAc;AAAA,oBACjE,WAAU;AAAA,oBACV,MAAK;AAAA,oBACL,gBAAc,aAAa,eAAe;AAAA,oBAC1C,SAAS,MAAM,gBAAgB,EAAE,MAAM,QAAQ,YAAY,YAAY,CAAC;AAAA,oBAExE;AAAA,0CAAC,aAAU;AAAA,sBAAE;AAAA;AAAA;AAAA,gBACf;AAAA;AAAA;AAAA,UACF,IACE;AAAA,UACH,UACC,oBAAC,UAAO,MAAK,WAAU,OAAM,iCAC1B,mBACH,IACE;AAAA;AAAA;AAAA,IACN;AAAA,KACF;AAEJ;","names":["message"]}
|
|
@@ -3,33 +3,33 @@ import {
|
|
|
3
3
|
SESSION_USAGE_LIMIT_UNKNOWN_RETRY_MS,
|
|
4
4
|
SessionUsageLimitSection,
|
|
5
5
|
sessionHref
|
|
6
|
-
} from "../../../chunk-
|
|
6
|
+
} from "../../../chunk-5JHRMUAZ.js";
|
|
7
7
|
import "../../../chunk-RBRX5ZS3.js";
|
|
8
8
|
import "../../../chunk-JM4XEJPM.js";
|
|
9
9
|
import "../../../chunk-A3MTTRCX.js";
|
|
10
|
-
import "../../../chunk-325C2TCI.js";
|
|
11
10
|
import "../../../chunk-GQPRDEHX.js";
|
|
12
11
|
import "../../../chunk-WHMKC7OQ.js";
|
|
12
|
+
import "../../../chunk-325C2TCI.js";
|
|
13
13
|
import "../../../chunk-XSOPQZGH.js";
|
|
14
|
+
import "../../../chunk-XNTW77T6.js";
|
|
14
15
|
import "../../../chunk-X6WZOHBI.js";
|
|
16
|
+
import "../../../chunk-YG6NARQY.js";
|
|
15
17
|
import "../../../chunk-FIDD34ZF.js";
|
|
16
18
|
import "../../../chunk-74JEZLLQ.js";
|
|
17
|
-
import "../../../chunk-YG6NARQY.js";
|
|
18
|
-
import "../../../chunk-L4OF77LE.js";
|
|
19
19
|
import "../../../chunk-W6KAUGXO.js";
|
|
20
|
-
import "../../../chunk-XNTW77T6.js";
|
|
21
|
-
import "../../../chunk-HY7EYWIG.js";
|
|
22
20
|
import "../../../chunk-KS57MLGE.js";
|
|
23
|
-
import "../../../chunk-
|
|
24
|
-
import "../../../chunk-
|
|
25
|
-
import "../../../chunk-4U7SHFQ2.js";
|
|
21
|
+
import "../../../chunk-HY7EYWIG.js";
|
|
22
|
+
import "../../../chunk-L4OF77LE.js";
|
|
26
23
|
import "../../../chunk-NRP4REXE.js";
|
|
24
|
+
import "../../../chunk-AJPW3SV4.js";
|
|
25
|
+
import "../../../chunk-HMU5IELG.js";
|
|
27
26
|
import "../../../chunk-J3BHDXQQ.js";
|
|
28
|
-
import "../../../chunk-
|
|
27
|
+
import "../../../chunk-4U7SHFQ2.js";
|
|
28
|
+
import "../../../chunk-2KO2G3RI.js";
|
|
29
29
|
import "../../../chunk-CM7LVUKC.js";
|
|
30
30
|
import "../../../chunk-TVQCDDSZ.js";
|
|
31
31
|
import "../../../chunk-TXS65BB2.js";
|
|
32
|
-
import "../../../chunk-
|
|
32
|
+
import "../../../chunk-JFK7NTEA.js";
|
|
33
33
|
export {
|
|
34
34
|
SESSION_USAGE_LIMIT_UNKNOWN_RETRY_MS,
|
|
35
35
|
SessionUsageLimitSection,
|
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import "../../../chunk-
|
|
2
|
+
import "../../../chunk-CD3MO3IC.js";
|
|
3
3
|
import {
|
|
4
4
|
sessionInputWait
|
|
5
|
-
} from "../../../chunk-
|
|
5
|
+
} from "../../../chunk-22JFMNMF.js";
|
|
6
|
+
import "../../../chunk-CFEFYPNR.js";
|
|
6
7
|
import "../../../chunk-LY6727IF.js";
|
|
7
|
-
import "../../../chunk-
|
|
8
|
+
import "../../../chunk-S2U4CDAC.js";
|
|
8
9
|
import "../../../chunk-LJUMYUBO.js";
|
|
9
|
-
import "../../../chunk-
|
|
10
|
+
import "../../../chunk-YV56F4UP.js";
|
|
10
11
|
import "../../../chunk-HEVQKE27.js";
|
|
11
|
-
import "../../../chunk-
|
|
12
|
-
import "../../../chunk-IZV5FTJC.js";
|
|
13
|
-
import "../../../chunk-STUCI6QA.js";
|
|
12
|
+
import "../../../chunk-WNDTLK44.js";
|
|
14
13
|
import "../../../chunk-DNJ23AWQ.js";
|
|
15
14
|
import "../../../chunk-OB3YGXHQ.js";
|
|
16
15
|
import "../../../chunk-DHXKEJBH.js";
|
|
17
|
-
import "../../../chunk-
|
|
16
|
+
import "../../../chunk-IZV5FTJC.js";
|
|
17
|
+
import "../../../chunk-ULYQEFNH.js";
|
|
18
|
+
import "../../../chunk-LEKBNKLD.js";
|
|
18
19
|
import "../../../chunk-SJGAHTY5.js";
|
|
19
20
|
import "../../../chunk-4NHJ6EXL.js";
|
|
20
21
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/app/components/session/session-wait-status.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { Clock3Icon } from \"lucide-react\";\nimport type { Session } from \"@opengeni/sdk\";\nimport { sessionInputWait } from \"../../lib/session-rail\";\n/** The agent's deliberate wait retains its own reason and deadline. */\nexport function SessionWaitStatus({\n session,\n}: {\n session: Pick<Session, \"status\" | \"effectiveControl\" | \"inputWait\">;\n}) {\n const waiting = sessionInputWait(session);\n const deadlineAt = waiting?.deadlineAt;\n const [now, setNow] = useState(Date.now);\n useEffect(() => {\n if (!deadlineAt) return;\n setNow(Date.now());\n const timer = setInterval(() => setNow(Date.now()), 15_000);\n return () => clearInterval(timer);\n }, [deadlineAt]);\n if (!waiting) return null;\n const deadline = new Date(waiting.deadlineAt);\n const time = deadline.toLocaleString(undefined, {\n ...(deadline.toDateString() === new Date(now).toDateString()\n ? {}\n : { month: \"short\", day: \"numeric\" }),\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n const reason = waiting.reason.trim();\n // Older agents used this field for verbose internal notes. Preserve those in\n // disclosure instead of promoting them into the current status headline.\n const compact = reason.length <= 180 && !/[\\n]|[0-9a-f]{8}-[0-9a-f-]{27,}/i.test(reason);\n return (\n <div className=\"shrink-0 px-4 py-2 sm:px-6\" data-session-wait-status=\"\">\n <div className=\"mx-auto flex w-full max-w-3xl items-start gap-2 text-sm text-fg-muted\">\n <Clock3Icon aria-hidden className=\"mt-0.5 size-4 shrink-0\" />\n <div className=\"min-w-0\">\n <div role=\"status\">\n <p className=\"font-medium text-fg\">\n {compact && reason ? reason : \"Waiting for work in progress\"}\n </p>\n <p className=\"mt-0.5 text-xs\">\n {deadline.getTime() <= now\n ? \"Recheck due · waiting to resume\"\n : `Checks again at ${time} · resumes sooner if an update arrives`}\n </p>\n </div>\n {!compact && (\n <details className=\"mt-1 text-xs\">\n <summary className=\"cursor-pointer\">Wait details</summary>\n <p className=\"mt-1 max-h-32 overflow-y-auto whitespace-pre-wrap break-words\">\n {reason}\n </p>\n </details>\n )}\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../../src/app/components/session/session-wait-status.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { Clock3Icon } from \"lucide-react\";\nimport type { Session } from \"@opengeni/sdk\";\nimport { sessionInputWait } from \"../../lib/session-rail\";\n/** The agent's deliberate wait retains its own reason and deadline. */\nexport function SessionWaitStatus({\n session,\n}: {\n session: Pick<Session, \"status\" | \"effectiveControl\" | \"inputWait\">;\n}) {\n const waiting = sessionInputWait(session);\n const deadlineAt = waiting?.deadlineAt;\n const [now, setNow] = useState(Date.now);\n useEffect(() => {\n if (!deadlineAt) return;\n setNow(Date.now());\n const timer = setInterval(() => setNow(Date.now()), 15_000);\n return () => clearInterval(timer);\n }, [deadlineAt]);\n if (!waiting) return null;\n const deadline = new Date(waiting.deadlineAt);\n const time = deadline.toLocaleString(undefined, {\n ...(deadline.toDateString() === new Date(now).toDateString()\n ? {}\n : { month: \"short\", day: \"numeric\" }),\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n const reason = waiting.reason.trim();\n // Older agents used this field for verbose internal notes. Preserve those in\n // disclosure instead of promoting them into the current status headline.\n const compact = reason.length <= 180 && !/[\\n]|[0-9a-f]{8}-[0-9a-f-]{27,}/i.test(reason);\n return (\n <div className=\"shrink-0 px-4 py-2 sm:px-6\" data-session-wait-status=\"\">\n <div className=\"mx-auto flex w-full max-w-3xl items-start gap-2 text-sm text-fg-muted\">\n <Clock3Icon aria-hidden className=\"mt-0.5 size-4 shrink-0\" />\n <div className=\"min-w-0\">\n <div role=\"status\">\n <p className=\"font-medium text-fg\">\n {compact && reason ? reason : \"Waiting for work in progress\"}\n </p>\n <p className=\"mt-0.5 text-xs\">\n {deadline.getTime() <= now\n ? \"Recheck due · waiting to resume\"\n : `Checks again at ${time} · resumes sooner if an update arrives`}\n </p>\n </div>\n {!compact && (\n <details className=\"mt-1 text-xs\">\n <summary className=\"cursor-pointer\">Wait details</summary>\n <p className=\"mt-1 max-h-32 overflow-y-auto whitespace-pre-wrap break-words\">\n {reason}\n </p>\n </details>\n )}\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,WAAW,gBAAgB;AACpC,SAAS,kBAAkB;AAkCnB,cAEE,YAFF;AA9BD,SAAS,kBAAkB;AAAA,EAChC;AACF,GAEG;AACD,QAAM,UAAU,iBAAiB,OAAO;AACxC,QAAM,aAAa,SAAS;AAC5B,QAAM,CAAC,KAAK,MAAM,IAAI,SAAS,KAAK,GAAG;AACvC,YAAU,MAAM;AACd,QAAI,CAAC,WAAY;AACjB,WAAO,KAAK,IAAI,CAAC;AACjB,UAAM,QAAQ,YAAY,MAAM,OAAO,KAAK,IAAI,CAAC,GAAG,IAAM;AAC1D,WAAO,MAAM,cAAc,KAAK;AAAA,EAClC,GAAG,CAAC,UAAU,CAAC;AACf,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,WAAW,IAAI,KAAK,QAAQ,UAAU;AAC5C,QAAM,OAAO,SAAS,eAAe,QAAW;AAAA,IAC9C,GAAI,SAAS,aAAa,MAAM,IAAI,KAAK,GAAG,EAAE,aAAa,IACvD,CAAC,IACD,EAAE,OAAO,SAAS,KAAK,UAAU;AAAA,IACrC,MAAM;AAAA,IACN,QAAQ;AAAA,EACV,CAAC;AACD,QAAM,SAAS,QAAQ,OAAO,KAAK;AAGnC,QAAM,UAAU,OAAO,UAAU,OAAO,CAAC,mCAAmC,KAAK,MAAM;AACvF,SACE,oBAAC,SAAI,WAAU,8BAA6B,4BAAyB,IACnE,+BAAC,SAAI,WAAU,yEACb;AAAA,wBAAC,cAAW,eAAW,MAAC,WAAU,0BAAyB;AAAA,IAC3D,qBAAC,SAAI,WAAU,WACb;AAAA,2BAAC,SAAI,MAAK,UACR;AAAA,4BAAC,OAAE,WAAU,uBACV,qBAAW,SAAS,SAAS,gCAChC;AAAA,QACA,oBAAC,OAAE,WAAU,kBACV,mBAAS,QAAQ,KAAK,MACnB,uCACA,mBAAmB,IAAI,6CAC7B;AAAA,SACF;AAAA,MACC,CAAC,WACA,qBAAC,aAAQ,WAAU,gBACjB;AAAA,4BAAC,aAAQ,WAAU,kBAAiB,0BAAY;AAAA,QAChD,oBAAC,OAAE,WAAU,iEACV,kBACH;AAAA,SACF;AAAA,OAEJ;AAAA,KACF,GACF;AAEJ;","names":[]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { RailSession as Session } from "../../lib/session-list-entry.js";
|
|
2
|
+
/** Where a session came from: opens its Site view with this conversation selected. */
|
|
2
3
|
export declare function SiteOriginLink({ session, compact, }: {
|
|
3
4
|
session: Session;
|
|
4
5
|
compact?: boolean | undefined;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import {
|
|
3
3
|
SiteOriginLink
|
|
4
|
-
} from "../../../chunk-
|
|
4
|
+
} from "../../../chunk-MVZYNZXE.js";
|
|
5
5
|
import "../../../chunk-K3TJNJSU.js";
|
|
6
|
-
import "../../../chunk-
|
|
6
|
+
import "../../../chunk-VYKW6TB2.js";
|
|
7
7
|
import "../../../chunk-IZUAIHR4.js";
|
|
8
8
|
export {
|
|
9
9
|
SiteOriginLink
|
|
@@ -5,36 +5,37 @@ import {
|
|
|
5
5
|
SubagentsLabel,
|
|
6
6
|
sessionStatusTone,
|
|
7
7
|
subagentAttentionHint
|
|
8
|
-
} from "../../../chunk-
|
|
9
|
-
import "../../../chunk-
|
|
10
|
-
import "../../../chunk-
|
|
8
|
+
} from "../../../chunk-4GLLWX33.js";
|
|
9
|
+
import "../../../chunk-CD3MO3IC.js";
|
|
10
|
+
import "../../../chunk-EJ7WARW7.js";
|
|
11
11
|
import "../../../chunk-5TLEWXAB.js";
|
|
12
12
|
import "../../../chunk-A3MTTRCX.js";
|
|
13
|
+
import "../../../chunk-TREHTIBD.js";
|
|
13
14
|
import "../../../chunk-X6WZOHBI.js";
|
|
14
|
-
import "../../../chunk-
|
|
15
|
-
import "../../../chunk-
|
|
15
|
+
import "../../../chunk-TJQDL3JH.js";
|
|
16
|
+
import "../../../chunk-VYKW6TB2.js";
|
|
16
17
|
import "../../../chunk-IZUAIHR4.js";
|
|
17
|
-
import "../../../chunk-TREHTIBD.js";
|
|
18
18
|
import "../../../chunk-5OTQA7CM.js";
|
|
19
|
+
import "../../../chunk-22JFMNMF.js";
|
|
19
20
|
import "../../../chunk-A3KMTJZS.js";
|
|
20
|
-
import "../../../chunk-
|
|
21
|
+
import "../../../chunk-J3BHDXQQ.js";
|
|
22
|
+
import "../../../chunk-CFEFYPNR.js";
|
|
21
23
|
import "../../../chunk-LY6727IF.js";
|
|
22
|
-
import "../../../chunk-
|
|
24
|
+
import "../../../chunk-S2U4CDAC.js";
|
|
23
25
|
import "../../../chunk-LJUMYUBO.js";
|
|
24
|
-
import "../../../chunk-
|
|
26
|
+
import "../../../chunk-YV56F4UP.js";
|
|
25
27
|
import "../../../chunk-HEVQKE27.js";
|
|
26
|
-
import "../../../chunk-
|
|
27
|
-
import "../../../chunk-IZV5FTJC.js";
|
|
28
|
-
import "../../../chunk-STUCI6QA.js";
|
|
28
|
+
import "../../../chunk-WNDTLK44.js";
|
|
29
29
|
import "../../../chunk-DNJ23AWQ.js";
|
|
30
30
|
import "../../../chunk-OB3YGXHQ.js";
|
|
31
31
|
import "../../../chunk-DHXKEJBH.js";
|
|
32
|
-
import "../../../chunk-
|
|
33
|
-
import "../../../chunk-
|
|
32
|
+
import "../../../chunk-IZV5FTJC.js";
|
|
33
|
+
import "../../../chunk-ULYQEFNH.js";
|
|
34
|
+
import "../../../chunk-LEKBNKLD.js";
|
|
34
35
|
import "../../../chunk-SJGAHTY5.js";
|
|
35
36
|
import "../../../chunk-4NHJ6EXL.js";
|
|
36
37
|
import "../../../chunk-TXS65BB2.js";
|
|
37
|
-
import "../../../chunk-
|
|
38
|
+
import "../../../chunk-JFK7NTEA.js";
|
|
38
39
|
export {
|
|
39
40
|
SessionAncestryBreadcrumb,
|
|
40
41
|
SubagentTree,
|
|
@@ -9,26 +9,26 @@ import "../../chunk-22NENBA3.js";
|
|
|
9
9
|
import {
|
|
10
10
|
cn
|
|
11
11
|
} from "../../chunk-A3MTTRCX.js";
|
|
12
|
-
import {
|
|
13
|
-
ConnectorAction
|
|
14
|
-
} from "../../chunk-6P44NG6Y.js";
|
|
15
12
|
import {
|
|
16
13
|
ComposerMenuHeader,
|
|
17
14
|
ComposerMenuRowsSkeleton,
|
|
18
15
|
ComposerMenuSwitch,
|
|
19
16
|
ComposerMenuSwitchIndicator
|
|
20
17
|
} from "../../chunk-O2LGEYG4.js";
|
|
18
|
+
import {
|
|
19
|
+
ConnectorAction
|
|
20
|
+
} from "../../chunk-6P44NG6Y.js";
|
|
21
|
+
import "../../chunk-TREHTIBD.js";
|
|
21
22
|
import {
|
|
22
23
|
isComposerConnector
|
|
23
24
|
} from "../../chunk-L6Y4ALSM.js";
|
|
24
|
-
import "../../chunk-L4OF77LE.js";
|
|
25
|
-
import "../../chunk-TREHTIBD.js";
|
|
26
25
|
import {
|
|
27
26
|
MENU_BACK_BUTTON_CLASS,
|
|
28
27
|
MENU_CHECK_CLASS,
|
|
29
28
|
MENU_LABEL_CLASS,
|
|
30
29
|
MENU_NOTE_CLASS
|
|
31
30
|
} from "../../chunk-5OTQA7CM.js";
|
|
31
|
+
import "../../chunk-L4OF77LE.js";
|
|
32
32
|
import "../../chunk-J3BHDXQQ.js";
|
|
33
33
|
import "../../chunk-TXS65BB2.js";
|
|
34
34
|
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import {
|
|
3
3
|
RowSelect
|
|
4
|
-
} from "../../../chunk-
|
|
5
|
-
import "../../../chunk-
|
|
4
|
+
} from "../../../chunk-X2AH4DRF.js";
|
|
5
|
+
import "../../../chunk-TFK4KFKA.js";
|
|
6
6
|
import "../../../chunk-XSOPQZGH.js";
|
|
7
|
-
import "../../../chunk-5OTQA7CM.js";
|
|
8
7
|
import "../../../chunk-XNTW77T6.js";
|
|
8
|
+
import "../../../chunk-5OTQA7CM.js";
|
|
9
9
|
import "../../../chunk-KS57MLGE.js";
|
|
10
10
|
import "../../../chunk-J3BHDXQQ.js";
|
|
11
11
|
import "../../../chunk-TXS65BB2.js";
|