@opengeni/react 6.8.0 → 6.8.1-canary.41842879332001
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 +8 -8
- package/dist/app/components/Composer.js +18 -18
- package/dist/app/components/agent/agent-capability-picker.js +6 -6
- package/dist/app/components/artifacts/artifact-library.js +6 -6
- package/dist/app/components/artifacts/artifact-viewer.js +18 -18
- package/dist/app/components/artifacts/chat-interactive-block.js +11 -11
- package/dist/app/components/artifacts/file-reach-dialog.js +6 -6
- package/dist/app/components/artifacts/inline-chat-image.js +19 -19
- package/dist/app/components/artifacts/retained-file-preview.js +20 -20
- package/dist/app/components/artifacts/retained-text-preview.js +3 -3
- package/dist/app/components/artifacts/site-audience.js +3 -3
- package/dist/app/components/artifacts/site-conversations.js +9 -9
- package/dist/app/components/artifacts/site-data.js +10 -10
- package/dist/app/components/artifacts/site-publishing-page.js +25 -25
- package/dist/app/components/artifacts/site-publishing.js +22 -22
- package/dist/app/components/artifacts/site-settings.js +24 -24
- package/dist/app/components/artifacts/site-version-menu.js +3 -3
- package/dist/app/components/billing-class-mark.js +3 -3
- package/dist/app/components/bots/bot-launch-strip.js +20 -20
- package/dist/app/components/bots/bot-template-dialog.js +26 -26
- package/dist/app/components/bots/bot-template-shortcuts.js +20 -20
- package/dist/app/components/bots/bot-templates-page.js +30 -30
- package/dist/app/components/capabilities/capability-detail-sheet.js +6 -6
- package/dist/app/components/capabilities/capability-logo-source.js +13 -13
- package/dist/app/components/capabilities/connector-tool-permissions.js +4 -4
- package/dist/app/components/capabilities/native-connect-setup.js +13 -13
- package/dist/app/components/capabilities/own-logins-shared-heads-up.js +3 -3
- package/dist/app/components/capabilities/prepared-mcp-setup-card.js +15 -15
- package/dist/app/components/capabilities/session-capability-card.js +47 -47
- package/dist/app/components/capabilities/session-chrome-card.js +20 -20
- package/dist/app/components/capabilities/session-custom-mcp-card.js +16 -16
- package/dist/app/components/capabilities/session-github-card.js +16 -16
- package/dist/app/components/capabilities/session-machine-card.js +19 -19
- package/dist/app/components/capabilities/session-personal-github-card.js +14 -14
- package/dist/app/components/capabilities/session-plugin-card.js +8 -8
- package/dist/app/components/command-menu/chat-status.js +15 -15
- package/dist/app/components/command-menu/chat-switcher.js +32 -32
- package/dist/app/components/command-menu/command-menu.js +36 -36
- package/dist/app/components/command-menu/shortcut-sheet.js +8 -8
- package/dist/app/components/composer-capabilities-menu-body.js +4 -4
- package/dist/app/components/composer-mobile-plus-panel.js +8 -8
- 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 +3 -3
- package/dist/app/components/desktop/app-shots.js +6 -6
- package/dist/app/components/desktop/computer-use.js +2 -2
- package/dist/app/components/desktop/this-computer.js +5 -5
- package/dist/app/components/feedback.js +3 -3
- package/dist/app/components/github-app-connect-launcher.js +1 -1
- package/dist/app/components/machines/connect-machine-dialog.js +11 -11
- package/dist/app/components/markdown.js +6 -6
- package/dist/app/components/models/models-ui.js +5 -5
- package/dist/app/components/my-things.js +4 -4
- package/dist/app/components/own-where-it-works.js +3 -3
- package/dist/app/components/personal-resource-attachment-surface.js +4 -4
- package/dist/app/components/pickers.js +5 -5
- package/dist/app/components/rail/channel-create-dialog.js +3 -3
- package/dist/app/components/rail/project-glyph.js +20 -20
- package/dist/app/components/rail/project-profile.js +27 -27
- package/dist/app/components/rail/rail-context.js +1 -1
- package/dist/app/components/rail/rail-sections.js +55 -55
- package/dist/app/components/rail/session-header.js +47 -47
- package/dist/app/components/rail/session-list.js +53 -53
- package/dist/app/components/rail/session-row-content.js +4 -4
- package/dist/app/components/rail/session-row-hover-details.js +14 -14
- package/dist/app/components/rail/session-shell.js +73 -73
- package/dist/app/components/rail/site-session-group-heading.js +8 -8
- package/dist/app/components/session/agent-configuration-panel.js +12 -12
- package/dist/app/components/session/banners.js +8 -8
- package/dist/app/components/session/console-new-conversation.js +39 -39
- package/dist/app/components/session/descendant-requests.js +36 -36
- package/dist/app/components/session/editable-artifacts-workspace.js +16 -16
- package/dist/app/components/session/failed-session-banner.js +6 -6
- package/dist/app/components/session/failure-recovery-boundary.js +3 -3
- package/dist/app/components/session/human-input-delegation-record.js +2 -2
- package/dist/app/components/session/human-input.js +33 -33
- package/dist/app/components/session/inspector.js +43 -43
- package/dist/app/components/session/message-actions.js +3 -3
- package/dist/app/components/session/message-resource-attachments.js +10 -10
- package/dist/app/components/session/model-recovery-notice.js +3 -3
- package/dist/app/components/session/new-session-settings-menu.js +6 -6
- package/dist/app/components/session/new-session-setup-strip.js +21 -21
- package/dist/app/components/session/sandbox-recovery-actions.js +3 -3
- package/dist/app/components/session/sandbox-switcher.js +7 -7
- package/dist/app/components/session/sandbox-workspace.js +48 -48
- package/dist/app/components/session/search-markdown-highlight.js +7 -7
- package/dist/app/components/session/search-results-view.js +8 -8
- package/dist/app/components/session/session-admin-access.js +4 -4
- package/dist/app/components/session/session-admission-notice.js +4 -4
- package/dist/app/components/session/session-avatar-picker.js +21 -21
- package/dist/app/components/session/session-avatar.js +19 -19
- package/dist/app/components/session/session-machine-access-notice.js +4 -4
- package/dist/app/components/session/session-profile-dialog.js +25 -25
- package/dist/app/components/session/session-profile-editor.js +26 -26
- package/dist/app/components/session/session-retention.js +3 -3
- package/dist/app/components/session/session-search-dialog.js +8 -8
- package/dist/app/components/session/session-tenancy-control.js +2 -2
- package/dist/app/components/session/session-usage-limit-section.js +4 -4
- package/dist/app/components/session/share-chat-dialog.js +5 -5
- package/dist/app/components/session/subagents.js +8 -8
- package/dist/app/components/session/subscription-account-indicator.js +6 -6
- package/dist/app/components/settings/row-select.js +4 -4
- package/dist/app/components/transcription-settings.js +6 -6
- package/dist/app/components/ui/destructive-confirm.js +5 -5
- package/dist/app/components/usage/usage-entry.js +3 -3
- package/dist/app/components/window-bar.js +9 -9
- package/dist/app/components/workspace-composer-plus.js +16 -16
- package/dist/app/components/workspace-reach.js +4 -4
- package/dist/app/embed/session-app.js +156 -156
- package/dist/app/lib/actions/actions-provider.js +8 -8
- package/dist/app/lib/agent-capabilities.js +3 -3
- package/dist/app/lib/codex-usage-query.js +2 -2
- package/dist/app/lib/composer-connectors.js +14 -14
- package/dist/app/lib/console-site.js +2 -2
- package/dist/app/lib/console-text.js +2 -2
- package/dist/app/lib/events.js +12 -12
- 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/session-branch-cache.js +8 -8
- package/dist/app/lib/session-create.js +4 -4
- package/dist/app/lib/session-group-pagination.js +8 -8
- package/dist/app/lib/session-hover-facts.js +13 -13
- package/dist/app/lib/session-model.js +2 -2
- package/dist/app/lib/session-pins.js +1 -1
- package/dist/app/lib/session-rail.js +5 -5
- package/dist/app/lib/session-rename.js +3 -3
- package/dist/app/lib/sessions-group.d.ts +5 -3
- package/dist/app/lib/sessions-group.js +7 -7
- package/dist/app/lib/site-tool-consent-dialog.js +7 -7
- package/dist/app/lib/site-tool-consent.js +1 -1
- package/dist/app/lib/turn-failure-analytics.js +4 -4
- package/dist/app/lib/use-follow-up-repositories.js +3 -3
- package/dist/app/lib/use-workspace-machines.js +4 -4
- package/dist/app/lib/use-workspace-model-catalog.js +3 -3
- package/dist/app/lib/use-workspace-rigs.js +2 -2
- package/dist/app/lib/workspace-navigation-preference.js +4 -4
- package/dist/app/lib/workspace-scope-context.js +3 -3
- package/dist/app/routes/artifacts.js +48 -48
- package/dist/app/routes/retained-artifact.js +32 -32
- package/dist/app/routes/session.js +94 -94
- package/dist/app/routes/sessions-index-hydration.js +5 -5
- package/dist/app/routes/sessions-index.js +76 -76
- package/dist/app/routes/site-view.js +55 -55
- 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 +10 -10
- package/dist/automations.js +10 -10
- package/dist/{browser-viewer-ZHQDVHZ2.js → browser-viewer-H7PKY67P.js} +4 -4
- package/dist/{chat-interactive-block-VSDD6X3M.js → chat-interactive-block-47TCT4DN.js} +5 -5
- package/dist/{chunk-7Z76QP64.js → chunk-2QH3Q6Z2.js} +35 -5
- package/dist/chunk-2QH3Q6Z2.js.map +1 -0
- package/dist/{chunk-5MHMCE2G.js → chunk-2X2B6D5G.js} +3 -3
- package/dist/{chunk-OCXEY7HE.js → chunk-3BUI5DT7.js} +2 -2
- package/dist/{chunk-OSJ366KR.js → chunk-3FWP3TD3.js} +29 -29
- package/dist/{chunk-PWUSSSSL.js → chunk-3G5IA36N.js} +2 -2
- package/dist/{chunk-RGR57NYY.js → chunk-3NK4JAHL.js} +2 -2
- package/dist/{chunk-XUOYNJPB.js → chunk-3O7UZRWM.js} +24 -24
- package/dist/{chunk-JV3UI7BH.js → chunk-3OR6HMA4.js} +3 -3
- package/dist/{chunk-MV2CLIO6.js → chunk-3PC45I5N.js} +6 -6
- package/dist/{chunk-SJYTQLN3.js → chunk-3PI2BYK5.js} +3 -3
- package/dist/{chunk-DCEQCGVN.js → chunk-3PNA2P2Z.js} +2 -2
- package/dist/{chunk-ESXAECZ3.js → chunk-3XBZKF3K.js} +2 -2
- package/dist/{chunk-SBXSKRFA.js → chunk-45OGYO3S.js} +3 -3
- package/dist/{chunk-M3FDGRB4.js → chunk-4A7TKVNX.js} +3 -3
- package/dist/{chunk-RHXYO4H2.js → chunk-4BXRGXTD.js} +2 -2
- package/dist/{chunk-CV4VVLPZ.js → chunk-4HQAJA3T.js} +2 -2
- package/dist/{chunk-VCJQQYRE.js → chunk-4X2A3KPB.js} +4 -4
- package/dist/{chunk-OCXTTKVA.js → chunk-555K37A7.js} +2 -2
- package/dist/{chunk-EBIVTDEG.js → chunk-57L5ZXDS.js} +2 -2
- package/dist/{chunk-3L465FBR.js → chunk-5IADORIV.js} +6 -6
- package/dist/{chunk-SK5S2PCK.js → chunk-5IZQT4TE.js} +14 -14
- package/dist/chunk-5IZQT4TE.js.map +1 -0
- package/dist/{chunk-ZW5YTIH3.js → chunk-5PB46DAA.js} +1 -1
- package/dist/{chunk-ZW5YTIH3.js.map → chunk-5PB46DAA.js.map} +1 -1
- package/dist/{chunk-PVB4YVDP.js → chunk-5Y2O2432.js} +2 -2
- package/dist/{chunk-OOOSGPJL.js → chunk-6572EFE4.js} +1 -1
- package/dist/{chunk-YMI27QPF.js → chunk-6BG5HCUP.js} +2 -2
- package/dist/{chunk-QRECBCJM.js → chunk-6EXFJWII.js} +2 -2
- package/dist/{chunk-74CBR5YE.js → chunk-6PNRUGOK.js} +2 -2
- package/dist/{chunk-PUUEI4W3.js → chunk-6RJEY6TC.js} +5 -5
- package/dist/{chunk-DLVIRJGK.js → chunk-727GL2YY.js} +2 -2
- package/dist/{chunk-J2BTILRR.js → chunk-7FGYLFW6.js} +2 -2
- package/dist/{chunk-MKDFYE2E.js → chunk-7IMWTFEG.js} +2 -2
- package/dist/{chunk-FER6EVIY.js → chunk-7POKH54R.js} +2 -2
- package/dist/{chunk-H6BX6WOW.js → chunk-7T26IH6W.js} +3 -3
- package/dist/{chunk-R33SBMB7.js → chunk-7XQRVZZQ.js} +3 -3
- package/dist/{chunk-NFCS5WYC.js → chunk-A3SPPXMC.js} +3 -3
- package/dist/{chunk-DQPIEQGP.js → chunk-A7CWPDEH.js} +2 -2
- package/dist/{chunk-3PM3M2Q6.js → chunk-AGOYVKTI.js} +2 -2
- package/dist/{chunk-OBGOLHCP.js → chunk-AIQKZUPB.js} +3 -3
- package/dist/{chunk-GSCGKJNK.js → chunk-AMYDHG3S.js} +2 -2
- package/dist/{chunk-U4LTPFD2.js → chunk-APJPB6TX.js} +2 -2
- package/dist/{chunk-SP44O3OU.js → chunk-APLGT5EI.js} +2 -2
- package/dist/{chunk-M3HGBO2Y.js → chunk-ATNKMGLO.js} +1 -1
- package/dist/{chunk-4O2XWOLZ.js → chunk-AVX4CZQ3.js} +3 -3
- package/dist/{chunk-CXAN2FHF.js → chunk-B46MK44K.js} +6 -6
- package/dist/{chunk-RMCLFSMX.js → chunk-BBKUPEGG.js} +2 -2
- package/dist/{chunk-J2WY42FA.js → chunk-BES6OQE3.js} +2 -2
- package/dist/{chunk-GU7T2S5N.js → chunk-BM2N26SH.js} +2 -2
- package/dist/{chunk-HEGV4QMS.js → chunk-C3NS74PZ.js} +2 -2
- package/dist/{chunk-752WXSDN.js → chunk-C56ABB5V.js} +2 -2
- package/dist/{chunk-77SYIH6O.js → chunk-C6MATJQ5.js} +2 -2
- package/dist/{chunk-KUE5BOQE.js → chunk-CRX47CO6.js} +4 -4
- package/dist/{chunk-QPQ7R77C.js → chunk-CUIV2XPO.js} +3 -1
- package/dist/chunk-CUIV2XPO.js.map +1 -0
- package/dist/{chunk-GTHCHCWW.js → chunk-D33KWZQJ.js} +3 -3
- package/dist/{chunk-AH3DGOTK.js → chunk-D7E3BSCX.js} +2 -2
- package/dist/{chunk-OJWDNNW3.js → chunk-DFR3TMTZ.js} +5 -5
- package/dist/{chunk-WYGTAQMX.js → chunk-DICC75CU.js} +2 -2
- package/dist/{chunk-736RUNIA.js → chunk-DJ2LMKKX.js} +4 -4
- package/dist/{chunk-4F3AEJI6.js → chunk-DJI4D7PM.js} +4 -4
- package/dist/{chunk-LVELUUK6.js → chunk-DSZUQL4W.js} +2 -2
- package/dist/{chunk-MT2R57SF.js → chunk-DVF246BE.js} +2 -2
- package/dist/{chunk-OI6VI6SU.js → chunk-DVOWBHWN.js} +8 -8
- package/dist/{chunk-PZKHST7A.js → chunk-E2KPRSA4.js} +2 -2
- package/dist/{chunk-EKJHOWTZ.js → chunk-E3LMLWEB.js} +4 -4
- package/dist/{chunk-QURYQFDN.js → chunk-EDC7X7PW.js} +2 -2
- package/dist/{chunk-HYEIA25Y.js → chunk-EDSMULHU.js} +2 -2
- package/dist/{chunk-U6552Q3T.js → chunk-EQQOZ6DD.js} +2 -2
- package/dist/{chunk-IFSXVU2S.js → chunk-ERBDQ2GY.js} +2 -2
- package/dist/{chunk-IZXYFWA4.js → chunk-EWI73URG.js} +13 -13
- package/dist/{chunk-N3FM4BNA.js → chunk-EZ6LFN33.js} +2 -2
- package/dist/{chunk-4K64EKM7.js → chunk-F7YL6DPR.js} +4 -4
- package/dist/{chunk-ICAMYP5M.js → chunk-FIGFXMUP.js} +2 -2
- package/dist/{chunk-54U6ZBEX.js → chunk-FJRJK67G.js} +3 -3
- package/dist/{chunk-E5KOWRDU.js → chunk-FLHB2NZT.js} +2 -2
- package/dist/{chunk-OWET7EY2.js → chunk-FRSZSL2S.js} +19 -13
- package/dist/{chunk-OWET7EY2.js.map → chunk-FRSZSL2S.js.map} +1 -1
- package/dist/{chunk-D3PTVN2I.js → chunk-FUGGM76A.js} +2 -2
- package/dist/{chunk-QQIZMVAJ.js → chunk-FWLLGNGP.js} +51 -49
- package/dist/chunk-FWLLGNGP.js.map +1 -0
- package/dist/{chunk-TDTD66BK.js → chunk-FXPZAZYT.js} +2 -2
- package/dist/{chunk-KO3OHHY2.js → chunk-GAGAM4MT.js} +2 -2
- package/dist/{chunk-TK5FWVZR.js → chunk-GESGH3HY.js} +3 -3
- package/dist/{chunk-2VJOSU4H.js → chunk-GI4PWKXI.js} +2 -2
- package/dist/{chunk-KFNZZ2N6.js → chunk-GJTEBAZ7.js} +2 -2
- package/dist/{chunk-LTJFV2JI.js → chunk-GNCGEW7F.js} +2 -2
- package/dist/{chunk-34NV52R3.js → chunk-GOMUNPB6.js} +4 -4
- package/dist/{chunk-7YTR3UFO.js → chunk-GPWE5UD7.js} +8 -5
- package/dist/chunk-GPWE5UD7.js.map +1 -0
- package/dist/{chunk-LIJNVIT3.js → chunk-GUMUILEI.js} +3 -3
- package/dist/{chunk-7NLF35YL.js → chunk-GVGNHBFT.js} +4 -4
- package/dist/{chunk-K3D7IQQP.js → chunk-GW4YI3FB.js} +6 -6
- package/dist/{chunk-D5TIVCXG.js → chunk-GXKCV7X7.js} +2 -2
- package/dist/{chunk-2J77TWGH.js → chunk-H467EQA6.js} +3 -3
- package/dist/{chunk-3OK7Y6ES.js → chunk-HE77VDDR.js} +2 -2
- package/dist/{chunk-UO35OEOX.js → chunk-HT65RGCX.js} +3 -3
- package/dist/{chunk-G6ICCGJ3.js → chunk-HVQSFTE7.js} +2 -2
- package/dist/{chunk-G5UQBTXY.js → chunk-HXJPDC76.js} +2 -2
- package/dist/{chunk-GIWFLWXG.js → chunk-I6LQW24C.js} +4 -4
- package/dist/{chunk-467WDSOK.js → chunk-I7A6S5YL.js} +2 -2
- package/dist/{chunk-AAS7OWV6.js → chunk-IADS4ZYD.js} +3 -3
- package/dist/{chunk-Y3XZEKDQ.js → chunk-IJWMWCGR.js} +2 -2
- package/dist/{chunk-SGH7I7OY.js → chunk-IWFO6KOU.js} +2 -2
- package/dist/{chunk-GMHIOYB7.js → chunk-IYC6QGV2.js} +4 -4
- package/dist/{chunk-2OXSB2OL.js → chunk-J2TZIFRC.js} +3 -2
- package/dist/chunk-J2TZIFRC.js.map +1 -0
- package/dist/{chunk-3NNAC43A.js → chunk-J5AODKJO.js} +2 -2
- package/dist/{chunk-DIP7YALH.js → chunk-JKI3LMLH.js} +2 -2
- package/dist/{chunk-IJR6VOLU.js → chunk-JSYRWOCE.js} +2 -2
- package/dist/{chunk-CEMSIU4Z.js → chunk-JTQTWO4D.js} +5 -5
- package/dist/{chunk-JHZRAYI4.js → chunk-JWSRFXRN.js} +2 -2
- package/dist/chunk-JWSRFXRN.js.map +1 -0
- package/dist/{chunk-BASI553K.js → chunk-KBTKAAHM.js} +4 -4
- package/dist/{chunk-OYOFPNLC.js → chunk-KD7VEMWY.js} +4 -4
- package/dist/{chunk-3DRLCX5V.js → chunk-KPGFGRSA.js} +2 -2
- package/dist/{chunk-PLYVGZIN.js → chunk-KWFDEJFI.js} +1 -1
- package/dist/{chunk-FNXCFIPW.js → chunk-KYLEH4OF.js} +2 -2
- package/dist/{chunk-WXF2RTS4.js → chunk-L7FJTFJN.js} +2 -2
- package/dist/{chunk-KI46GKMD.js → chunk-L7VVQOSY.js} +7 -7
- package/dist/{chunk-M5IQVMLR.js → chunk-LAZ2QZTJ.js} +11 -4
- package/dist/chunk-LAZ2QZTJ.js.map +1 -0
- package/dist/chunk-LKLQVANM.js +2 -0
- package/dist/{chunk-YNTLWCF4.js → chunk-LLYEAZ4E.js} +3 -3
- package/dist/{chunk-4Z5X7PLC.js → chunk-LWM7JUW6.js} +3 -3
- package/dist/{chunk-CHU3RDV4.js → chunk-LXKV4ND3.js} +3 -3
- package/dist/{chunk-AB5IW227.js → chunk-LYLICEQO.js} +3 -3
- package/dist/{chunk-PSM3CU7N.js → chunk-M3OZOCIK.js} +46 -39
- package/dist/chunk-M3OZOCIK.js.map +1 -0
- package/dist/{chunk-OTW25A6I.js → chunk-M5GRI5K4.js} +3 -3
- package/dist/{chunk-X2QJXDE4.js → chunk-MF65PKKF.js} +8 -8
- package/dist/{chunk-EDDKPIIV.js → chunk-MJ4XIOPM.js} +2 -2
- package/dist/{chunk-FLWQJDJ5.js → chunk-MMPJJQG3.js} +6 -6
- package/dist/{chunk-T67LTMSW.js → chunk-MOU54FGD.js} +10 -10
- package/dist/{chunk-LQKVNREV.js → chunk-NAWHQ4IL.js} +3 -3
- package/dist/{chunk-ZBHGNE2J.js → chunk-NBHBB2VV.js} +3 -3
- package/dist/{chunk-PF2WU2IL.js → chunk-ND4IQJUM.js} +120 -17
- package/dist/chunk-ND4IQJUM.js.map +1 -0
- package/dist/{chunk-U5UGM5XD.js → chunk-NMOZDAEZ.js} +5 -5
- package/dist/{chunk-D74Z2N4K.js → chunk-NZA4R3BE.js} +2 -2
- package/dist/{chunk-WRMUXZ7C.js → chunk-OB2CX7PJ.js} +3 -3
- package/dist/{chunk-YJSCLGAW.js → chunk-OB4I4OIT.js} +3 -3
- package/dist/{chunk-DWJ6J3YW.js → chunk-OKQW2FPL.js} +4 -4
- package/dist/{chunk-2GCHGWNE.js → chunk-ORLX6A3C.js} +3 -3
- package/dist/{chunk-EBTUPRRQ.js → chunk-P5N4EYFW.js} +4 -4
- package/dist/{chunk-JKL5S7UQ.js → chunk-PL4JE3NI.js} +6 -6
- package/dist/{chunk-OP2GD6QW.js → chunk-PNUHKDY2.js} +2 -2
- package/dist/{chunk-MZY3VKKM.js → chunk-PWJE7D6V.js} +2 -2
- package/dist/{chunk-RISUROBM.js → chunk-PYE27I6J.js} +4 -4
- package/dist/{chunk-SPD4ULVB.js → chunk-PYMROAWS.js} +2 -1
- package/dist/chunk-PYMROAWS.js.map +1 -0
- package/dist/{chunk-Q5K2J5GG.js → chunk-Q74FQK3A.js} +13 -3
- package/dist/chunk-Q74FQK3A.js.map +1 -0
- package/dist/{chunk-R5QAL43H.js → chunk-QIJHK6P4.js} +2 -2
- package/dist/{chunk-AJBDAVX3.js → chunk-QK3A23NP.js} +7 -7
- package/dist/{chunk-CYDXCILL.js → chunk-QLWDNAOV.js} +7 -7
- package/dist/{chunk-BQYRZIZ7.js → chunk-QS6DQBVJ.js} +2 -2
- package/dist/{chunk-3PZ3LRPV.js → chunk-QSUVFPG3.js} +3 -3
- package/dist/{chunk-PYB4BFEC.js → chunk-QUC5MLTN.js} +3 -3
- package/dist/{chunk-WDASYY4S.js → chunk-QVT5AWPI.js} +6 -6
- package/dist/{chunk-K4DQS2ML.js → chunk-QZC6WCBR.js} +4 -4
- package/dist/{chunk-HWVPLFIW.js → chunk-RAHNICPP.js} +2 -2
- package/dist/{chunk-H6MJFMHZ.js → chunk-RME6RGIW.js} +3 -3
- package/dist/{chunk-XMBOLFFS.js → chunk-RQIB2F53.js} +2 -2
- package/dist/{chunk-OXQ2SXVC.js → chunk-RUA72NQY.js} +2 -2
- package/dist/{chunk-UMX6DZME.js → chunk-SCJHWN4X.js} +2 -2
- package/dist/{chunk-HTMQGS63.js → chunk-SIXBDT5F.js} +8 -8
- package/dist/{chunk-ZAX4XQLN.js → chunk-SPK3T4JK.js} +2 -2
- package/dist/{chunk-WTSQUCHB.js → chunk-SSN2YSST.js} +3 -3
- package/dist/{chunk-5MIBQ4P5.js → chunk-SYJCDX5V.js} +2 -2
- package/dist/{chunk-NQ2CPQJF.js → chunk-SYL7LCRA.js} +26 -3
- package/dist/chunk-SYL7LCRA.js.map +1 -0
- package/dist/{chunk-ZR5EKJT6.js → chunk-T6276OXI.js} +2 -2
- package/dist/{chunk-DEHLWZSI.js → chunk-T7OARG4N.js} +4 -4
- package/dist/{chunk-77BHKC43.js → chunk-TF5L3BEV.js} +1 -1
- package/dist/{chunk-GOCODNQS.js → chunk-TF6Z7BOP.js} +2 -2
- package/dist/{chunk-WIFDNUKD.js → chunk-TJDXWZMO.js} +3 -3
- package/dist/{chunk-SFIXTOOJ.js → chunk-TL5ATBHZ.js} +3 -3
- package/dist/{chunk-XZCCEKPW.js → chunk-TMOHIOMT.js} +6 -6
- package/dist/{chunk-AVXDIRRW.js → chunk-UI5X63YC.js} +2 -2
- package/dist/{chunk-6QK65ZWM.js → chunk-UIY7BDZC.js} +3 -3
- package/dist/{chunk-VATYK3JQ.js → chunk-UMBFMEO7.js} +3 -3
- package/dist/{chunk-UU5FBVRX.js → chunk-UU5G7OA4.js} +2 -2
- package/dist/{chunk-EGKARC53.js → chunk-UZUCYCF4.js} +2 -2
- package/dist/{chunk-LPKJ77EK.js → chunk-V2A7G7S7.js} +2 -2
- package/dist/{chunk-CH4UQ4NO.js → chunk-V5G4TKRC.js} +5 -5
- package/dist/{chunk-UBRQ3PQD.js → chunk-VKAVW34W.js} +2 -2
- package/dist/{chunk-JV5ULONH.js → chunk-VVLEVNTQ.js} +36 -36
- package/dist/{chunk-44JWVYJB.js → chunk-VW7X7TWZ.js} +2 -2
- package/dist/{chunk-3CDJSKDW.js → chunk-VWA2CHSL.js} +3 -3
- package/dist/{chunk-IN3VQFKS.js → chunk-W43HZPM7.js} +2 -2
- package/dist/{chunk-SXGJL7UT.js → chunk-WHGD7Q2L.js} +14 -14
- package/dist/{chunk-XOIDUM2H.js → chunk-WNXKYEVN.js} +1 -1
- package/dist/{chunk-TKQL7EDB.js → chunk-WSA7UBX4.js} +2 -2
- package/dist/{chunk-AJDGP2N4.js → chunk-WZ5TQJ3T.js} +19 -19
- package/dist/{chunk-FBA2NXYH.js → chunk-X3TGNSOG.js} +3 -3
- package/dist/{chunk-R4JA5JFI.js → chunk-X4WXYI3N.js} +3 -3
- package/dist/{chunk-Q5EZNBPI.js → chunk-XIQ3AIAJ.js} +3 -3
- package/dist/{chunk-S27VZ5DO.js → chunk-XWYT4LEL.js} +6 -6
- package/dist/{chunk-477DTTMH.js → chunk-Y3PU75OC.js} +3 -3
- package/dist/{chunk-4JXPLTWV.js → chunk-Y5ZWX5YS.js} +2 -2
- package/dist/{chunk-4BWMAGJJ.js → chunk-YA5PABND.js} +3 -3
- package/dist/{chunk-VXORMNU4.js → chunk-YBHAAULA.js} +67 -2
- package/dist/chunk-YBHAAULA.js.map +1 -0
- package/dist/{chunk-OGU73VUN.js → chunk-YBPRR2QS.js} +2 -2
- package/dist/{chunk-TNSJFZ6Q.js → chunk-YDYR7XQE.js} +4 -4
- package/dist/{chunk-GTRAH4FG.js → chunk-YG6V2LQH.js} +2 -2
- package/dist/{chunk-XVLEBB4Y.js → chunk-YUXA7ALE.js} +2 -2
- package/dist/{chunk-SN2WENRP.js → chunk-YWHQDXPB.js} +3 -3
- package/dist/{chunk-BFFNINCC.js → chunk-YWRR5R7B.js} +3 -3
- package/dist/{chunk-FSDQQQIA.js → chunk-YYRK7A4N.js} +3 -3
- package/dist/{chunk-MRECRNVU.js → chunk-Z26CDLUV.js} +5 -5
- package/dist/{chunk-OYCK4JRS.js → chunk-Z27EXLMQ.js} +2 -2
- package/dist/{chunk-UTRNLNCW.js → chunk-Z7GDH7W2.js} +3 -3
- package/dist/{chunk-PRT4J2DL.js → chunk-ZGVLSAWL.js} +2 -2
- package/dist/{chunk-OK7BQMCI.js → chunk-ZM6Q5NQN.js} +9 -9
- package/dist/components/message-timeline.d.ts +10 -2
- package/dist/composer.js +8 -8
- package/dist/{computer-viewer-5LKRCEVQ.js → computer-viewer-SROXREYD.js} +5 -5
- package/dist/connect.js +12 -12
- package/dist/desktop-dictation.js +8 -8
- package/dist/desktop.js +2 -2
- package/dist/editor.js +2 -2
- package/dist/{embedded-new-voice-GHJRY3YL.js → embedded-new-voice-EIQY2VBF.js} +5 -5
- package/dist/{embedded-voice-ASQXBSTX.js → embedded-voice-LMWNH7F7.js} +5 -5
- package/dist/{fleet-decision-row-U7LDVBEM.js → fleet-decision-row-X2G56ZRA.js} +2 -2
- package/dist/hooks/use-recordings.d.ts +4 -2
- package/dist/in-chat-connect-model.js +5 -5
- package/dist/index.d.ts +2 -2
- package/dist/index.js +66 -60
- package/dist/interaction.js +5 -5
- package/dist/{latest-question-RNVF262Q.js → latest-question-KA7AQYVI.js} +2 -2
- package/dist/machines.js +3 -3
- package/dist/meetings/recorder-context.d.ts +6 -1
- package/dist/meetings/recorder-panel.d.ts +2 -5
- package/dist/meetings-recorder.js +1 -1
- package/dist/meetings.js +22 -21
- package/dist/meetings.js.map +1 -1
- package/dist/messages/en.d.ts +2 -0
- package/dist/messages.js +1 -1
- package/dist/{model-policy-picker-menu-E6XKMFTA.js → model-policy-picker-menu-SHWPT5VA.js} +4 -4
- package/dist/{payment-page-card-DJDKV2LW.js → payment-page-card-NNVUISN4.js} +4 -4
- package/dist/{platform-activity-row-MSDCSMET.js → platform-activity-row-7UDWSAHK.js} +2 -2
- package/dist/{queue-surface-implementation-GUAIG6TK.js → queue-surface-implementation-BUXSO24N.js} +5 -5
- package/dist/realtime.js +4 -4
- package/dist/{recorder-host-2MYDJPQW.js → recorder-host-POX54CFT.js} +5 -5
- package/dist/recordings.js +4 -4
- package/dist/{sandbox-files-W5W2LW4K.js → sandbox-files-33QD7DW2.js} +6 -6
- package/dist/session-app.js +156 -156
- package/dist/{session-connect-cards-HPH7JOZP.js → session-connect-cards-CXGNVA2A.js} +9 -9
- package/dist/session-list-model.js +2 -2
- package/dist/{session-realtime-SDTKFFIR.js → session-realtime-CVDSEULB.js} +3 -3
- package/dist/session-realtime.js +2 -2
- package/dist/session-ui.js +33 -33
- package/dist/session.d.ts +3 -2
- package/dist/session.js +16 -10
- package/dist/sites.js +2 -2
- package/dist/terminal.js +2 -2
- package/dist/this-computer.js +3 -3
- package/dist/timeline/index.d.ts +3 -2
- package/dist/timeline/projection.d.ts +52 -0
- package/dist/timeline/turn-summary-model.d.ts +4 -3
- package/dist/timeline/types.d.ts +8 -2
- package/dist/timeline/use-timeline-pauses.d.ts +12 -0
- package/dist/timeline/work-presentation.d.ts +4 -3
- package/dist/{timeline-annotation-markers-FNILLWNU.js → timeline-annotation-markers-5J5TM5IP.js} +2 -2
- package/dist/{timeline-annotation-selection-MBCIDO2Q.js → timeline-annotation-selection-WLY7FB7F.js} +2 -2
- package/dist/{timeline-annotations-dialog-JPNKLOTE.js → timeline-annotations-dialog-67VRFKJU.js} +3 -3
- package/dist/timeline-model.js +2 -2
- package/dist/ui/access-list.js +5 -5
- package/dist/ui/cadence-picker.js +4 -4
- package/dist/ui/choice-cards.js +3 -3
- package/dist/ui/confirm-dialog.js +2 -2
- package/dist/ui/copy-field.js +3 -3
- package/dist/ui/detail-page.js +2 -2
- package/dist/ui/detail-sheet.js +2 -2
- package/dist/ui/disclosure.js +3 -3
- package/dist/ui/email-chips-input.js +3 -3
- package/dist/ui/field.js +2 -2
- package/dist/ui/flush-form-page.js +3 -3
- package/dist/ui/form-dialog.js +2 -2
- package/dist/ui/list-row.js +3 -3
- package/dist/ui/relative-time.js +2 -2
- package/dist/ui/revision-history.js +4 -4
- package/dist/ui/role-select.js +5 -5
- package/dist/ui/select-menu.js +3 -3
- package/dist/ui/usage-meter.js +3 -3
- package/dist/usage.js +2 -2
- package/dist/workbench.js +4 -4
- package/package.json +6 -5
- package/src/app/components/rail/session-row-content.tsx +27 -0
- package/src/app/lib/session-branch-cache.tsx +1 -0
- package/src/app/lib/session-pins.tsx +1 -0
- package/src/app/lib/session-row-paused.test.tsx +183 -0
- package/src/app/lib/sessions-group-channels.test.ts +4 -4
- package/src/app/lib/sessions-group.tsx +62 -4
- package/src/app/routes/session.tsx +2 -0
- package/src/components/message-timeline.tsx +14 -2
- package/src/components/session-conversation.tsx +2 -1
- package/src/components/timeline-annotations.tsx +4 -1
- package/src/components/timeline-settlement.ts +1 -1
- package/src/hooks/use-recordings.ts +5 -0
- package/src/index.ts +5 -0
- package/src/meetings/recorder-context.tsx +28 -5
- package/src/meetings/recorder-panel.tsx +13 -5
- package/src/meetings/recorder-workspace.test.tsx +57 -8
- package/src/messages/en.ts +2 -0
- package/src/session.ts +8 -1
- package/src/timeline/index.ts +4 -1
- package/src/timeline/projection.ts +228 -16
- package/src/timeline/turn-summary-model.ts +4 -3
- package/src/timeline/turn-summary.tsx +15 -2
- package/src/timeline/types.ts +8 -2
- package/src/timeline/use-timeline-pauses.ts +105 -0
- package/src/timeline/work-presentation.ts +13 -4
- package/dist/chunk-2OXSB2OL.js.map +0 -1
- package/dist/chunk-7YTR3UFO.js.map +0 -1
- package/dist/chunk-7Z76QP64.js.map +0 -1
- package/dist/chunk-JHZRAYI4.js.map +0 -1
- package/dist/chunk-M5IQVMLR.js.map +0 -1
- package/dist/chunk-NQ2CPQJF.js.map +0 -1
- package/dist/chunk-O2UPPN5M.js +0 -2
- package/dist/chunk-PF2WU2IL.js.map +0 -1
- package/dist/chunk-PSM3CU7N.js.map +0 -1
- package/dist/chunk-Q5K2J5GG.js.map +0 -1
- package/dist/chunk-QPQ7R77C.js.map +0 -1
- package/dist/chunk-QQIZMVAJ.js.map +0 -1
- package/dist/chunk-SK5S2PCK.js.map +0 -1
- package/dist/chunk-SPD4ULVB.js.map +0 -1
- package/dist/chunk-VXORMNU4.js.map +0 -1
- /package/dist/{browser-viewer-ZHQDVHZ2.js.map → browser-viewer-H7PKY67P.js.map} +0 -0
- /package/dist/{chat-interactive-block-VSDD6X3M.js.map → chat-interactive-block-47TCT4DN.js.map} +0 -0
- /package/dist/{chunk-5MHMCE2G.js.map → chunk-2X2B6D5G.js.map} +0 -0
- /package/dist/{chunk-OCXEY7HE.js.map → chunk-3BUI5DT7.js.map} +0 -0
- /package/dist/{chunk-OSJ366KR.js.map → chunk-3FWP3TD3.js.map} +0 -0
- /package/dist/{chunk-PWUSSSSL.js.map → chunk-3G5IA36N.js.map} +0 -0
- /package/dist/{chunk-RGR57NYY.js.map → chunk-3NK4JAHL.js.map} +0 -0
- /package/dist/{chunk-XUOYNJPB.js.map → chunk-3O7UZRWM.js.map} +0 -0
- /package/dist/{chunk-JV3UI7BH.js.map → chunk-3OR6HMA4.js.map} +0 -0
- /package/dist/{chunk-MV2CLIO6.js.map → chunk-3PC45I5N.js.map} +0 -0
- /package/dist/{chunk-SJYTQLN3.js.map → chunk-3PI2BYK5.js.map} +0 -0
- /package/dist/{chunk-DCEQCGVN.js.map → chunk-3PNA2P2Z.js.map} +0 -0
- /package/dist/{chunk-ESXAECZ3.js.map → chunk-3XBZKF3K.js.map} +0 -0
- /package/dist/{chunk-SBXSKRFA.js.map → chunk-45OGYO3S.js.map} +0 -0
- /package/dist/{chunk-M3FDGRB4.js.map → chunk-4A7TKVNX.js.map} +0 -0
- /package/dist/{chunk-RHXYO4H2.js.map → chunk-4BXRGXTD.js.map} +0 -0
- /package/dist/{chunk-CV4VVLPZ.js.map → chunk-4HQAJA3T.js.map} +0 -0
- /package/dist/{chunk-VCJQQYRE.js.map → chunk-4X2A3KPB.js.map} +0 -0
- /package/dist/{chunk-OCXTTKVA.js.map → chunk-555K37A7.js.map} +0 -0
- /package/dist/{chunk-EBIVTDEG.js.map → chunk-57L5ZXDS.js.map} +0 -0
- /package/dist/{chunk-3L465FBR.js.map → chunk-5IADORIV.js.map} +0 -0
- /package/dist/{chunk-PVB4YVDP.js.map → chunk-5Y2O2432.js.map} +0 -0
- /package/dist/{chunk-OOOSGPJL.js.map → chunk-6572EFE4.js.map} +0 -0
- /package/dist/{chunk-YMI27QPF.js.map → chunk-6BG5HCUP.js.map} +0 -0
- /package/dist/{chunk-QRECBCJM.js.map → chunk-6EXFJWII.js.map} +0 -0
- /package/dist/{chunk-74CBR5YE.js.map → chunk-6PNRUGOK.js.map} +0 -0
- /package/dist/{chunk-PUUEI4W3.js.map → chunk-6RJEY6TC.js.map} +0 -0
- /package/dist/{chunk-DLVIRJGK.js.map → chunk-727GL2YY.js.map} +0 -0
- /package/dist/{chunk-J2BTILRR.js.map → chunk-7FGYLFW6.js.map} +0 -0
- /package/dist/{chunk-MKDFYE2E.js.map → chunk-7IMWTFEG.js.map} +0 -0
- /package/dist/{chunk-FER6EVIY.js.map → chunk-7POKH54R.js.map} +0 -0
- /package/dist/{chunk-H6BX6WOW.js.map → chunk-7T26IH6W.js.map} +0 -0
- /package/dist/{chunk-R33SBMB7.js.map → chunk-7XQRVZZQ.js.map} +0 -0
- /package/dist/{chunk-NFCS5WYC.js.map → chunk-A3SPPXMC.js.map} +0 -0
- /package/dist/{chunk-DQPIEQGP.js.map → chunk-A7CWPDEH.js.map} +0 -0
- /package/dist/{chunk-3PM3M2Q6.js.map → chunk-AGOYVKTI.js.map} +0 -0
- /package/dist/{chunk-OBGOLHCP.js.map → chunk-AIQKZUPB.js.map} +0 -0
- /package/dist/{chunk-GSCGKJNK.js.map → chunk-AMYDHG3S.js.map} +0 -0
- /package/dist/{chunk-U4LTPFD2.js.map → chunk-APJPB6TX.js.map} +0 -0
- /package/dist/{chunk-SP44O3OU.js.map → chunk-APLGT5EI.js.map} +0 -0
- /package/dist/{chunk-M3HGBO2Y.js.map → chunk-ATNKMGLO.js.map} +0 -0
- /package/dist/{chunk-4O2XWOLZ.js.map → chunk-AVX4CZQ3.js.map} +0 -0
- /package/dist/{chunk-CXAN2FHF.js.map → chunk-B46MK44K.js.map} +0 -0
- /package/dist/{chunk-RMCLFSMX.js.map → chunk-BBKUPEGG.js.map} +0 -0
- /package/dist/{chunk-J2WY42FA.js.map → chunk-BES6OQE3.js.map} +0 -0
- /package/dist/{chunk-GU7T2S5N.js.map → chunk-BM2N26SH.js.map} +0 -0
- /package/dist/{chunk-HEGV4QMS.js.map → chunk-C3NS74PZ.js.map} +0 -0
- /package/dist/{chunk-752WXSDN.js.map → chunk-C56ABB5V.js.map} +0 -0
- /package/dist/{chunk-77SYIH6O.js.map → chunk-C6MATJQ5.js.map} +0 -0
- /package/dist/{chunk-KUE5BOQE.js.map → chunk-CRX47CO6.js.map} +0 -0
- /package/dist/{chunk-GTHCHCWW.js.map → chunk-D33KWZQJ.js.map} +0 -0
- /package/dist/{chunk-AH3DGOTK.js.map → chunk-D7E3BSCX.js.map} +0 -0
- /package/dist/{chunk-OJWDNNW3.js.map → chunk-DFR3TMTZ.js.map} +0 -0
- /package/dist/{chunk-WYGTAQMX.js.map → chunk-DICC75CU.js.map} +0 -0
- /package/dist/{chunk-736RUNIA.js.map → chunk-DJ2LMKKX.js.map} +0 -0
- /package/dist/{chunk-4F3AEJI6.js.map → chunk-DJI4D7PM.js.map} +0 -0
- /package/dist/{chunk-LVELUUK6.js.map → chunk-DSZUQL4W.js.map} +0 -0
- /package/dist/{chunk-MT2R57SF.js.map → chunk-DVF246BE.js.map} +0 -0
- /package/dist/{chunk-OI6VI6SU.js.map → chunk-DVOWBHWN.js.map} +0 -0
- /package/dist/{chunk-PZKHST7A.js.map → chunk-E2KPRSA4.js.map} +0 -0
- /package/dist/{chunk-EKJHOWTZ.js.map → chunk-E3LMLWEB.js.map} +0 -0
- /package/dist/{chunk-QURYQFDN.js.map → chunk-EDC7X7PW.js.map} +0 -0
- /package/dist/{chunk-HYEIA25Y.js.map → chunk-EDSMULHU.js.map} +0 -0
- /package/dist/{chunk-U6552Q3T.js.map → chunk-EQQOZ6DD.js.map} +0 -0
- /package/dist/{chunk-IFSXVU2S.js.map → chunk-ERBDQ2GY.js.map} +0 -0
- /package/dist/{chunk-IZXYFWA4.js.map → chunk-EWI73URG.js.map} +0 -0
- /package/dist/{chunk-N3FM4BNA.js.map → chunk-EZ6LFN33.js.map} +0 -0
- /package/dist/{chunk-4K64EKM7.js.map → chunk-F7YL6DPR.js.map} +0 -0
- /package/dist/{chunk-ICAMYP5M.js.map → chunk-FIGFXMUP.js.map} +0 -0
- /package/dist/{chunk-54U6ZBEX.js.map → chunk-FJRJK67G.js.map} +0 -0
- /package/dist/{chunk-E5KOWRDU.js.map → chunk-FLHB2NZT.js.map} +0 -0
- /package/dist/{chunk-D3PTVN2I.js.map → chunk-FUGGM76A.js.map} +0 -0
- /package/dist/{chunk-TDTD66BK.js.map → chunk-FXPZAZYT.js.map} +0 -0
- /package/dist/{chunk-KO3OHHY2.js.map → chunk-GAGAM4MT.js.map} +0 -0
- /package/dist/{chunk-TK5FWVZR.js.map → chunk-GESGH3HY.js.map} +0 -0
- /package/dist/{chunk-2VJOSU4H.js.map → chunk-GI4PWKXI.js.map} +0 -0
- /package/dist/{chunk-KFNZZ2N6.js.map → chunk-GJTEBAZ7.js.map} +0 -0
- /package/dist/{chunk-LTJFV2JI.js.map → chunk-GNCGEW7F.js.map} +0 -0
- /package/dist/{chunk-34NV52R3.js.map → chunk-GOMUNPB6.js.map} +0 -0
- /package/dist/{chunk-LIJNVIT3.js.map → chunk-GUMUILEI.js.map} +0 -0
- /package/dist/{chunk-7NLF35YL.js.map → chunk-GVGNHBFT.js.map} +0 -0
- /package/dist/{chunk-K3D7IQQP.js.map → chunk-GW4YI3FB.js.map} +0 -0
- /package/dist/{chunk-D5TIVCXG.js.map → chunk-GXKCV7X7.js.map} +0 -0
- /package/dist/{chunk-2J77TWGH.js.map → chunk-H467EQA6.js.map} +0 -0
- /package/dist/{chunk-3OK7Y6ES.js.map → chunk-HE77VDDR.js.map} +0 -0
- /package/dist/{chunk-UO35OEOX.js.map → chunk-HT65RGCX.js.map} +0 -0
- /package/dist/{chunk-G6ICCGJ3.js.map → chunk-HVQSFTE7.js.map} +0 -0
- /package/dist/{chunk-G5UQBTXY.js.map → chunk-HXJPDC76.js.map} +0 -0
- /package/dist/{chunk-GIWFLWXG.js.map → chunk-I6LQW24C.js.map} +0 -0
- /package/dist/{chunk-467WDSOK.js.map → chunk-I7A6S5YL.js.map} +0 -0
- /package/dist/{chunk-AAS7OWV6.js.map → chunk-IADS4ZYD.js.map} +0 -0
- /package/dist/{chunk-Y3XZEKDQ.js.map → chunk-IJWMWCGR.js.map} +0 -0
- /package/dist/{chunk-SGH7I7OY.js.map → chunk-IWFO6KOU.js.map} +0 -0
- /package/dist/{chunk-GMHIOYB7.js.map → chunk-IYC6QGV2.js.map} +0 -0
- /package/dist/{chunk-3NNAC43A.js.map → chunk-J5AODKJO.js.map} +0 -0
- /package/dist/{chunk-DIP7YALH.js.map → chunk-JKI3LMLH.js.map} +0 -0
- /package/dist/{chunk-IJR6VOLU.js.map → chunk-JSYRWOCE.js.map} +0 -0
- /package/dist/{chunk-CEMSIU4Z.js.map → chunk-JTQTWO4D.js.map} +0 -0
- /package/dist/{chunk-BASI553K.js.map → chunk-KBTKAAHM.js.map} +0 -0
- /package/dist/{chunk-OYOFPNLC.js.map → chunk-KD7VEMWY.js.map} +0 -0
- /package/dist/{chunk-3DRLCX5V.js.map → chunk-KPGFGRSA.js.map} +0 -0
- /package/dist/{chunk-PLYVGZIN.js.map → chunk-KWFDEJFI.js.map} +0 -0
- /package/dist/{chunk-FNXCFIPW.js.map → chunk-KYLEH4OF.js.map} +0 -0
- /package/dist/{chunk-WXF2RTS4.js.map → chunk-L7FJTFJN.js.map} +0 -0
- /package/dist/{chunk-KI46GKMD.js.map → chunk-L7VVQOSY.js.map} +0 -0
- /package/dist/{chunk-O2UPPN5M.js.map → chunk-LKLQVANM.js.map} +0 -0
- /package/dist/{chunk-YNTLWCF4.js.map → chunk-LLYEAZ4E.js.map} +0 -0
- /package/dist/{chunk-4Z5X7PLC.js.map → chunk-LWM7JUW6.js.map} +0 -0
- /package/dist/{chunk-CHU3RDV4.js.map → chunk-LXKV4ND3.js.map} +0 -0
- /package/dist/{chunk-AB5IW227.js.map → chunk-LYLICEQO.js.map} +0 -0
- /package/dist/{chunk-OTW25A6I.js.map → chunk-M5GRI5K4.js.map} +0 -0
- /package/dist/{chunk-X2QJXDE4.js.map → chunk-MF65PKKF.js.map} +0 -0
- /package/dist/{chunk-EDDKPIIV.js.map → chunk-MJ4XIOPM.js.map} +0 -0
- /package/dist/{chunk-FLWQJDJ5.js.map → chunk-MMPJJQG3.js.map} +0 -0
- /package/dist/{chunk-T67LTMSW.js.map → chunk-MOU54FGD.js.map} +0 -0
- /package/dist/{chunk-LQKVNREV.js.map → chunk-NAWHQ4IL.js.map} +0 -0
- /package/dist/{chunk-ZBHGNE2J.js.map → chunk-NBHBB2VV.js.map} +0 -0
- /package/dist/{chunk-U5UGM5XD.js.map → chunk-NMOZDAEZ.js.map} +0 -0
- /package/dist/{chunk-D74Z2N4K.js.map → chunk-NZA4R3BE.js.map} +0 -0
- /package/dist/{chunk-WRMUXZ7C.js.map → chunk-OB2CX7PJ.js.map} +0 -0
- /package/dist/{chunk-YJSCLGAW.js.map → chunk-OB4I4OIT.js.map} +0 -0
- /package/dist/{chunk-DWJ6J3YW.js.map → chunk-OKQW2FPL.js.map} +0 -0
- /package/dist/{chunk-2GCHGWNE.js.map → chunk-ORLX6A3C.js.map} +0 -0
- /package/dist/{chunk-EBTUPRRQ.js.map → chunk-P5N4EYFW.js.map} +0 -0
- /package/dist/{chunk-JKL5S7UQ.js.map → chunk-PL4JE3NI.js.map} +0 -0
- /package/dist/{chunk-OP2GD6QW.js.map → chunk-PNUHKDY2.js.map} +0 -0
- /package/dist/{chunk-MZY3VKKM.js.map → chunk-PWJE7D6V.js.map} +0 -0
- /package/dist/{chunk-RISUROBM.js.map → chunk-PYE27I6J.js.map} +0 -0
- /package/dist/{chunk-R5QAL43H.js.map → chunk-QIJHK6P4.js.map} +0 -0
- /package/dist/{chunk-AJBDAVX3.js.map → chunk-QK3A23NP.js.map} +0 -0
- /package/dist/{chunk-CYDXCILL.js.map → chunk-QLWDNAOV.js.map} +0 -0
- /package/dist/{chunk-BQYRZIZ7.js.map → chunk-QS6DQBVJ.js.map} +0 -0
- /package/dist/{chunk-3PZ3LRPV.js.map → chunk-QSUVFPG3.js.map} +0 -0
- /package/dist/{chunk-PYB4BFEC.js.map → chunk-QUC5MLTN.js.map} +0 -0
- /package/dist/{chunk-WDASYY4S.js.map → chunk-QVT5AWPI.js.map} +0 -0
- /package/dist/{chunk-K4DQS2ML.js.map → chunk-QZC6WCBR.js.map} +0 -0
- /package/dist/{chunk-HWVPLFIW.js.map → chunk-RAHNICPP.js.map} +0 -0
- /package/dist/{chunk-H6MJFMHZ.js.map → chunk-RME6RGIW.js.map} +0 -0
- /package/dist/{chunk-XMBOLFFS.js.map → chunk-RQIB2F53.js.map} +0 -0
- /package/dist/{chunk-OXQ2SXVC.js.map → chunk-RUA72NQY.js.map} +0 -0
- /package/dist/{chunk-UMX6DZME.js.map → chunk-SCJHWN4X.js.map} +0 -0
- /package/dist/{chunk-HTMQGS63.js.map → chunk-SIXBDT5F.js.map} +0 -0
- /package/dist/{chunk-ZAX4XQLN.js.map → chunk-SPK3T4JK.js.map} +0 -0
- /package/dist/{chunk-WTSQUCHB.js.map → chunk-SSN2YSST.js.map} +0 -0
- /package/dist/{chunk-5MIBQ4P5.js.map → chunk-SYJCDX5V.js.map} +0 -0
- /package/dist/{chunk-ZR5EKJT6.js.map → chunk-T6276OXI.js.map} +0 -0
- /package/dist/{chunk-DEHLWZSI.js.map → chunk-T7OARG4N.js.map} +0 -0
- /package/dist/{chunk-77BHKC43.js.map → chunk-TF5L3BEV.js.map} +0 -0
- /package/dist/{chunk-GOCODNQS.js.map → chunk-TF6Z7BOP.js.map} +0 -0
- /package/dist/{chunk-WIFDNUKD.js.map → chunk-TJDXWZMO.js.map} +0 -0
- /package/dist/{chunk-SFIXTOOJ.js.map → chunk-TL5ATBHZ.js.map} +0 -0
- /package/dist/{chunk-XZCCEKPW.js.map → chunk-TMOHIOMT.js.map} +0 -0
- /package/dist/{chunk-AVXDIRRW.js.map → chunk-UI5X63YC.js.map} +0 -0
- /package/dist/{chunk-6QK65ZWM.js.map → chunk-UIY7BDZC.js.map} +0 -0
- /package/dist/{chunk-VATYK3JQ.js.map → chunk-UMBFMEO7.js.map} +0 -0
- /package/dist/{chunk-UU5FBVRX.js.map → chunk-UU5G7OA4.js.map} +0 -0
- /package/dist/{chunk-EGKARC53.js.map → chunk-UZUCYCF4.js.map} +0 -0
- /package/dist/{chunk-LPKJ77EK.js.map → chunk-V2A7G7S7.js.map} +0 -0
- /package/dist/{chunk-CH4UQ4NO.js.map → chunk-V5G4TKRC.js.map} +0 -0
- /package/dist/{chunk-UBRQ3PQD.js.map → chunk-VKAVW34W.js.map} +0 -0
- /package/dist/{chunk-JV5ULONH.js.map → chunk-VVLEVNTQ.js.map} +0 -0
- /package/dist/{chunk-44JWVYJB.js.map → chunk-VW7X7TWZ.js.map} +0 -0
- /package/dist/{chunk-3CDJSKDW.js.map → chunk-VWA2CHSL.js.map} +0 -0
- /package/dist/{chunk-IN3VQFKS.js.map → chunk-W43HZPM7.js.map} +0 -0
- /package/dist/{chunk-SXGJL7UT.js.map → chunk-WHGD7Q2L.js.map} +0 -0
- /package/dist/{chunk-XOIDUM2H.js.map → chunk-WNXKYEVN.js.map} +0 -0
- /package/dist/{chunk-TKQL7EDB.js.map → chunk-WSA7UBX4.js.map} +0 -0
- /package/dist/{chunk-AJDGP2N4.js.map → chunk-WZ5TQJ3T.js.map} +0 -0
- /package/dist/{chunk-FBA2NXYH.js.map → chunk-X3TGNSOG.js.map} +0 -0
- /package/dist/{chunk-R4JA5JFI.js.map → chunk-X4WXYI3N.js.map} +0 -0
- /package/dist/{chunk-Q5EZNBPI.js.map → chunk-XIQ3AIAJ.js.map} +0 -0
- /package/dist/{chunk-S27VZ5DO.js.map → chunk-XWYT4LEL.js.map} +0 -0
- /package/dist/{chunk-477DTTMH.js.map → chunk-Y3PU75OC.js.map} +0 -0
- /package/dist/{chunk-4JXPLTWV.js.map → chunk-Y5ZWX5YS.js.map} +0 -0
- /package/dist/{chunk-4BWMAGJJ.js.map → chunk-YA5PABND.js.map} +0 -0
- /package/dist/{chunk-OGU73VUN.js.map → chunk-YBPRR2QS.js.map} +0 -0
- /package/dist/{chunk-TNSJFZ6Q.js.map → chunk-YDYR7XQE.js.map} +0 -0
- /package/dist/{chunk-GTRAH4FG.js.map → chunk-YG6V2LQH.js.map} +0 -0
- /package/dist/{chunk-XVLEBB4Y.js.map → chunk-YUXA7ALE.js.map} +0 -0
- /package/dist/{chunk-SN2WENRP.js.map → chunk-YWHQDXPB.js.map} +0 -0
- /package/dist/{chunk-BFFNINCC.js.map → chunk-YWRR5R7B.js.map} +0 -0
- /package/dist/{chunk-FSDQQQIA.js.map → chunk-YYRK7A4N.js.map} +0 -0
- /package/dist/{chunk-MRECRNVU.js.map → chunk-Z26CDLUV.js.map} +0 -0
- /package/dist/{chunk-OYCK4JRS.js.map → chunk-Z27EXLMQ.js.map} +0 -0
- /package/dist/{chunk-UTRNLNCW.js.map → chunk-Z7GDH7W2.js.map} +0 -0
- /package/dist/{chunk-PRT4J2DL.js.map → chunk-ZGVLSAWL.js.map} +0 -0
- /package/dist/{chunk-OK7BQMCI.js.map → chunk-ZM6Q5NQN.js.map} +0 -0
- /package/dist/{computer-viewer-5LKRCEVQ.js.map → computer-viewer-SROXREYD.js.map} +0 -0
- /package/dist/{embedded-new-voice-GHJRY3YL.js.map → embedded-new-voice-EIQY2VBF.js.map} +0 -0
- /package/dist/{embedded-voice-ASQXBSTX.js.map → embedded-voice-LMWNH7F7.js.map} +0 -0
- /package/dist/{fleet-decision-row-U7LDVBEM.js.map → fleet-decision-row-X2G56ZRA.js.map} +0 -0
- /package/dist/{latest-question-RNVF262Q.js.map → latest-question-KA7AQYVI.js.map} +0 -0
- /package/dist/{model-policy-picker-menu-E6XKMFTA.js.map → model-policy-picker-menu-SHWPT5VA.js.map} +0 -0
- /package/dist/{payment-page-card-DJDKV2LW.js.map → payment-page-card-NNVUISN4.js.map} +0 -0
- /package/dist/{platform-activity-row-MSDCSMET.js.map → platform-activity-row-7UDWSAHK.js.map} +0 -0
- /package/dist/{queue-surface-implementation-GUAIG6TK.js.map → queue-surface-implementation-BUXSO24N.js.map} +0 -0
- /package/dist/{recorder-host-2MYDJPQW.js.map → recorder-host-POX54CFT.js.map} +0 -0
- /package/dist/{sandbox-files-W5W2LW4K.js.map → sandbox-files-33QD7DW2.js.map} +0 -0
- /package/dist/{session-connect-cards-HPH7JOZP.js.map → session-connect-cards-CXGNVA2A.js.map} +0 -0
- /package/dist/{session-realtime-SDTKFFIR.js.map → session-realtime-CVDSEULB.js.map} +0 -0
- /package/dist/{timeline-annotation-markers-FNILLWNU.js.map → timeline-annotation-markers-5J5TM5IP.js.map} +0 -0
- /package/dist/{timeline-annotation-selection-MBCIDO2Q.js.map → timeline-annotation-selection-WLY7FB7F.js.map} +0 -0
- /package/dist/{timeline-annotations-dialog-JPNKLOTE.js.map → timeline-annotations-dialog-67VRFKJU.js.map} +0 -0
|
@@ -2482,6 +2482,184 @@ export function sessionStatusFromEvents(events: SessionEvent[]): SessionStatus |
|
|
|
2482
2482
|
return null;
|
|
2483
2483
|
}
|
|
2484
2484
|
|
|
2485
|
+
/**
|
|
2486
|
+
* A span in which the session's work was paused: by Pause of the chat, of
|
|
2487
|
+
* an ancestor, or of the workspace. An open span (no `endedAt`) is a pause
|
|
2488
|
+
* still in force.
|
|
2489
|
+
*/
|
|
2490
|
+
export type TimelinePauseSpan = { startedAt: string; endedAt?: string };
|
|
2491
|
+
|
|
2492
|
+
/**
|
|
2493
|
+
* The host's live view of the session's Pause, from its effective control.
|
|
2494
|
+
* `since` is when the pause in force began, when known. `resumedAt` is when
|
|
2495
|
+
* the host saw the pause end, for a resume whose events have not arrived.
|
|
2496
|
+
*/
|
|
2497
|
+
export type TimelineLivePause = {
|
|
2498
|
+
paused: boolean;
|
|
2499
|
+
since?: string | null | undefined;
|
|
2500
|
+
resumedAt?: string | null | undefined;
|
|
2501
|
+
};
|
|
2502
|
+
|
|
2503
|
+
/** Interruption reasons that park a turn for Resume rather than end it. */
|
|
2504
|
+
const PAUSE_INTERRUPTION_REASONS: ReadonlySet<unknown> = new Set([
|
|
2505
|
+
"session_pause",
|
|
2506
|
+
"workspace_pause",
|
|
2507
|
+
]);
|
|
2508
|
+
|
|
2509
|
+
type LivePauseBlocker = { changedAt?: string | null | undefined };
|
|
2510
|
+
|
|
2511
|
+
/**
|
|
2512
|
+
* The live pause from an effective session control; undefined when it is
|
|
2513
|
+
* unknown. A pause in force since several blockers took hold began with the
|
|
2514
|
+
* earliest of them.
|
|
2515
|
+
*/
|
|
2516
|
+
export function timelineLivePause(
|
|
2517
|
+
control:
|
|
2518
|
+
| {
|
|
2519
|
+
state: string;
|
|
2520
|
+
primaryBlocker?: LivePauseBlocker | null | undefined;
|
|
2521
|
+
blockers?: readonly LivePauseBlocker[] | null | undefined;
|
|
2522
|
+
}
|
|
2523
|
+
| null
|
|
2524
|
+
| undefined,
|
|
2525
|
+
): TimelineLivePause | undefined {
|
|
2526
|
+
if (!control) return undefined;
|
|
2527
|
+
if (control.state !== "paused") return { paused: false };
|
|
2528
|
+
let since: string | null = null;
|
|
2529
|
+
for (const blocker of [control.primaryBlocker, ...(control.blockers ?? [])]) {
|
|
2530
|
+
const changedAt = blocker?.changedAt;
|
|
2531
|
+
if (changedAt && (since === null || Date.parse(changedAt) < Date.parse(since)))
|
|
2532
|
+
since = changedAt;
|
|
2533
|
+
}
|
|
2534
|
+
return { paused: true, since };
|
|
2535
|
+
}
|
|
2536
|
+
|
|
2537
|
+
/** Events that start or end a pause span. */
|
|
2538
|
+
const PAUSE_EVENT_TYPES: ReadonlySet<string> = new Set([
|
|
2539
|
+
"session.control.paused",
|
|
2540
|
+
"session.control.resumed",
|
|
2541
|
+
"turn.recovery.requested",
|
|
2542
|
+
"session.status.changed",
|
|
2543
|
+
"turn.started",
|
|
2544
|
+
]);
|
|
2545
|
+
|
|
2546
|
+
/**
|
|
2547
|
+
* When the session's work was paused, from its events and (when the host
|
|
2548
|
+
* knows it) its live control.
|
|
2549
|
+
*
|
|
2550
|
+
* Pause parks the running turn for Resume instead of ending it, so the turn
|
|
2551
|
+
* stays open. A direct Pause records `session.control.paused`; a Pause of an
|
|
2552
|
+
* ancestor or of the workspace reaches the chat only as the interruption
|
|
2553
|
+
* (`turn.recovery.requested` with a pause reason) and the parked idle status.
|
|
2554
|
+
* Work resumes with `session.control.resumed`, or when the turn runs again.
|
|
2555
|
+
* A wait that a pause held without interrupting anything has no events at
|
|
2556
|
+
* all, so the live control decides whether a pause is in force now, and
|
|
2557
|
+
* `observed` carries pauses the host saw begin and end only through it.
|
|
2558
|
+
*/
|
|
2559
|
+
export function timelinePauseSpans(
|
|
2560
|
+
events: readonly SessionEvent[],
|
|
2561
|
+
live?: TimelineLivePause | null,
|
|
2562
|
+
observed: readonly TimelinePauseSpan[] = [],
|
|
2563
|
+
): TimelinePauseSpan[] {
|
|
2564
|
+
let latest: SessionEvent | undefined;
|
|
2565
|
+
const relevant: SessionEvent[] = [];
|
|
2566
|
+
for (const event of events) {
|
|
2567
|
+
if (!latest || event.sequence > latest.sequence) latest = event;
|
|
2568
|
+
if (PAUSE_EVENT_TYPES.has(event.type)) relevant.push(event);
|
|
2569
|
+
}
|
|
2570
|
+
relevant.sort((left, right) => left.sequence - right.sequence);
|
|
2571
|
+
const spans: TimelinePauseSpan[] = [];
|
|
2572
|
+
let open: TimelinePauseSpan | null = null;
|
|
2573
|
+
// Cancel also leaves the control paused while the turn winds down; that is
|
|
2574
|
+
// not a pause of the work, which is ending.
|
|
2575
|
+
let cancelling = false;
|
|
2576
|
+
for (const event of relevant) {
|
|
2577
|
+
const payload = asRecord(event.payload);
|
|
2578
|
+
if (
|
|
2579
|
+
(event.type === "session.control.paused" && payload.terminal === true) ||
|
|
2580
|
+
// A parent's Cancel reaches its sub-chats as their status alone.
|
|
2581
|
+
(event.type === "session.status.changed" && payload.status === "cancelled")
|
|
2582
|
+
) {
|
|
2583
|
+
cancelling = true;
|
|
2584
|
+
continue;
|
|
2585
|
+
}
|
|
2586
|
+
const starts =
|
|
2587
|
+
event.type === "session.control.paused" ||
|
|
2588
|
+
(event.type === "turn.recovery.requested" &&
|
|
2589
|
+
PAUSE_INTERRUPTION_REASONS.has(payload.reason)) ||
|
|
2590
|
+
(event.type === "session.status.changed" &&
|
|
2591
|
+
payload.status === "idle" &&
|
|
2592
|
+
payload.reason === "paused_recovery_settled");
|
|
2593
|
+
if (starts) {
|
|
2594
|
+
open ??= { startedAt: event.occurredAt };
|
|
2595
|
+
continue;
|
|
2596
|
+
}
|
|
2597
|
+
if (
|
|
2598
|
+
event.type === "session.control.resumed" ||
|
|
2599
|
+
event.type === "turn.started" ||
|
|
2600
|
+
(event.type === "session.status.changed" && payload.status === "running")
|
|
2601
|
+
) {
|
|
2602
|
+
cancelling = false;
|
|
2603
|
+
if (open) {
|
|
2604
|
+
spans.push({ startedAt: open.startedAt, endedAt: event.occurredAt });
|
|
2605
|
+
open = null;
|
|
2606
|
+
}
|
|
2607
|
+
}
|
|
2608
|
+
}
|
|
2609
|
+
const latestAt = latest?.occurredAt;
|
|
2610
|
+
if (live?.paused && !cancelling) {
|
|
2611
|
+
const startedAt = open?.startedAt ?? live.since ?? latestAt;
|
|
2612
|
+
if (startedAt) spans.push({ startedAt });
|
|
2613
|
+
} else if (open) {
|
|
2614
|
+
if (live) {
|
|
2615
|
+
// The host already sees the session running again; its resume events
|
|
2616
|
+
// are still on their way. End the pause when the host saw it end.
|
|
2617
|
+
const endedAt = live.resumedAt ?? latestAt ?? open.startedAt;
|
|
2618
|
+
spans.push({
|
|
2619
|
+
startedAt: open.startedAt,
|
|
2620
|
+
endedAt: Date.parse(endedAt) > Date.parse(open.startedAt) ? endedAt : open.startedAt,
|
|
2621
|
+
});
|
|
2622
|
+
} else {
|
|
2623
|
+
spans.push(open);
|
|
2624
|
+
}
|
|
2625
|
+
}
|
|
2626
|
+
// A pause seen only through the live control, by the host's clock; skip it
|
|
2627
|
+
// where the events record the same pause.
|
|
2628
|
+
const recorded = [...spans];
|
|
2629
|
+
for (const span of observed) {
|
|
2630
|
+
if (!span.endedAt) continue;
|
|
2631
|
+
const start = Date.parse(span.startedAt);
|
|
2632
|
+
const end = Date.parse(span.endedAt);
|
|
2633
|
+
const overlaps = recorded.some(
|
|
2634
|
+
(other) =>
|
|
2635
|
+
Date.parse(other.startedAt) < end &&
|
|
2636
|
+
(other.endedAt === undefined || Date.parse(other.endedAt) > start),
|
|
2637
|
+
);
|
|
2638
|
+
if (!overlaps) spans.push(span);
|
|
2639
|
+
}
|
|
2640
|
+
return spans;
|
|
2641
|
+
}
|
|
2642
|
+
|
|
2643
|
+
/** Total length of the union of intervals, each clipped to `[from, to)`. */
|
|
2644
|
+
function unionLength(
|
|
2645
|
+
intervals: ReadonlyArray<readonly [number, number]>,
|
|
2646
|
+
from: number,
|
|
2647
|
+
to: number,
|
|
2648
|
+
): number {
|
|
2649
|
+
const clipped = intervals
|
|
2650
|
+
.map(([start, end]) => [Math.max(start, from), Math.min(end, to)] as const)
|
|
2651
|
+
.filter(([start, end]) => Number.isFinite(start) && Number.isFinite(end) && end > start)
|
|
2652
|
+
.sort((left, right) => left[0] - right[0]);
|
|
2653
|
+
let total = 0;
|
|
2654
|
+
let cursor = Number.NEGATIVE_INFINITY;
|
|
2655
|
+
for (const [start, end] of clipped) {
|
|
2656
|
+
const begin = Math.max(start, cursor);
|
|
2657
|
+
if (end > begin) total += end - begin;
|
|
2658
|
+
cursor = Math.max(cursor, end);
|
|
2659
|
+
}
|
|
2660
|
+
return total;
|
|
2661
|
+
}
|
|
2662
|
+
|
|
2485
2663
|
/* ----------------------------------------------------------------------------
|
|
2486
2664
|
Visual grouping: consecutive activity items (reasoning / tools / workers /
|
|
2487
2665
|
sandbox) cluster into collapsible blocks. Once a turn settles, the full
|
|
@@ -2549,6 +2727,12 @@ export type GroupTimelineOptions = {
|
|
|
2549
2727
|
readableTurns?: boolean;
|
|
2550
2728
|
/** @deprecated Use readableTurns. Cross-turn exchange folding has been removed. */
|
|
2551
2729
|
foldExchanges?: boolean;
|
|
2730
|
+
/**
|
|
2731
|
+
* When the session was paused ({@link timelinePauseSpans}). A readable
|
|
2732
|
+
* turn still open under a pause in force reads as paused, and paused time
|
|
2733
|
+
* is not counted as work.
|
|
2734
|
+
*/
|
|
2735
|
+
pauses?: readonly TimelinePauseSpan[];
|
|
2552
2736
|
};
|
|
2553
2737
|
|
|
2554
2738
|
export function groupTimeline(
|
|
@@ -2556,7 +2740,8 @@ export function groupTimeline(
|
|
|
2556
2740
|
items: TimelineItem[],
|
|
2557
2741
|
options: GroupTimelineOptions = {},
|
|
2558
2742
|
): TimelineGroup[] {
|
|
2559
|
-
if (options.readableTurns || options.foldExchanges)
|
|
2743
|
+
if (options.readableTurns || options.foldExchanges)
|
|
2744
|
+
return groupReadableTurns(t, items, options.pauses ?? []);
|
|
2560
2745
|
const groups: TimelineGroup[] = [];
|
|
2561
2746
|
for (const item of items) {
|
|
2562
2747
|
// A recovered capacity wait is over; it leaves no warning behind.
|
|
@@ -2585,7 +2770,11 @@ export function groupTimeline(
|
|
|
2585
2770
|
}
|
|
2586
2771
|
|
|
2587
2772
|
/** Live prose stays primary; settled progress joins its own turn's work history. */
|
|
2588
|
-
function groupReadableTurns(
|
|
2773
|
+
function groupReadableTurns(
|
|
2774
|
+
t: OpenGeniText,
|
|
2775
|
+
items: TimelineItem[],
|
|
2776
|
+
pauses: readonly TimelinePauseSpan[],
|
|
2777
|
+
): TimelineGroup[] {
|
|
2589
2778
|
type Work = Extract<TimelineGroup, { kind: "activity" }>;
|
|
2590
2779
|
let groups: TimelineGroup[] = [];
|
|
2591
2780
|
const turns = new Map<string, Work>();
|
|
@@ -2721,12 +2910,12 @@ function groupReadableTurns(t: OpenGeniText, items: TimelineItem[]): TimelineGro
|
|
|
2721
2910
|
group.work!.details.push({ kind: "activity", id: `work-item-${item.id}`, items: [item] });
|
|
2722
2911
|
delete group.work!.waiting;
|
|
2723
2912
|
} else if (item.kind === "notice" && item.capacityWait) {
|
|
2724
|
-
const
|
|
2725
|
-
|
|
2913
|
+
const idle = idleSpans.get(key) ?? [];
|
|
2914
|
+
idle.push({
|
|
2726
2915
|
startedAt: item.occurredAt,
|
|
2727
2916
|
...(item.resolvedAt ? { endedAt: item.resolvedAt } : {}),
|
|
2728
2917
|
});
|
|
2729
|
-
idleSpans.set(key,
|
|
2918
|
+
idleSpans.set(key, idle);
|
|
2730
2919
|
if (!item.resolvedAt) {
|
|
2731
2920
|
if (settlements.has(key)) groups.push({ kind: "item", item });
|
|
2732
2921
|
else {
|
|
@@ -2842,6 +3031,7 @@ function groupReadableTurns(t: OpenGeniText, items: TimelineItem[]): TimelineGro
|
|
|
2842
3031
|
? t("timeline.projection.waitingForYou")
|
|
2843
3032
|
: t("timeline.projection.waiting"),
|
|
2844
3033
|
since: item.occurredAt,
|
|
3034
|
+
...(item.approval === true ? { waitingOn: "you" as const } : {}),
|
|
2845
3035
|
};
|
|
2846
3036
|
} else if (
|
|
2847
3037
|
item.kind === "session-status" &&
|
|
@@ -2852,6 +3042,7 @@ function groupReadableTurns(t: OpenGeniText, items: TimelineItem[]): TimelineGro
|
|
|
2852
3042
|
current.waiting = {
|
|
2853
3043
|
label: t("timeline.projection.waitingForYou"),
|
|
2854
3044
|
since: item.occurredAt,
|
|
3045
|
+
waitingOn: "you",
|
|
2855
3046
|
};
|
|
2856
3047
|
} else if (
|
|
2857
3048
|
item.kind === "session-status" &&
|
|
@@ -2890,17 +3081,38 @@ function groupReadableTurns(t: OpenGeniText, items: TimelineItem[]): TimelineGro
|
|
|
2890
3081
|
untimed: true,
|
|
2891
3082
|
};
|
|
2892
3083
|
}
|
|
2893
|
-
const
|
|
2894
|
-
|
|
2895
|
-
|
|
2896
|
-
|
|
2897
|
-
|
|
2898
|
-
|
|
2899
|
-
|
|
2900
|
-
|
|
2901
|
-
|
|
2902
|
-
|
|
2903
|
-
|
|
3084
|
+
const workStart = Date.parse(work.startedAt);
|
|
3085
|
+
const workEnd = work.endedAt ? Date.parse(work.endedAt) : Number.POSITIVE_INFINITY;
|
|
3086
|
+
// A pause still in force over this open turn: the turn is parked for
|
|
3087
|
+
// Resume, so it reads as paused and its clock stops when the pause began.
|
|
3088
|
+
// A wait on the person (an approval, a question) keeps saying so.
|
|
3089
|
+
const openPause =
|
|
3090
|
+
work.endedAt || work.waiting?.waitingOn === "you"
|
|
3091
|
+
? undefined
|
|
3092
|
+
: pauses.find((pause) => !pause.endedAt && Date.parse(pause.startedAt) < workEnd);
|
|
3093
|
+
const pausedAt = openPause
|
|
3094
|
+
? Math.max(workStart, Date.parse(openPause.startedAt))
|
|
3095
|
+
: Number.POSITIVE_INFINITY;
|
|
3096
|
+
if (openPause && Number.isFinite(pausedAt)) {
|
|
3097
|
+
work.pausedAt = new Date(pausedAt).toISOString();
|
|
3098
|
+
delete work.waiting;
|
|
3099
|
+
}
|
|
3100
|
+
// Capacity waits, failed-attempt gaps and pauses can overlap; their union
|
|
3101
|
+
// is time the agent was not working. A span still open runs to the end of
|
|
3102
|
+
// the work (a turn cancelled while paused) or to the pause that stopped
|
|
3103
|
+
// its clock; on a turn still running it has no end yet and counts later.
|
|
3104
|
+
const until = Math.min(workEnd, pausedAt);
|
|
3105
|
+
const pausedMs = unionLength(
|
|
3106
|
+
[...(idleSpans.get(key) ?? []), ...pauses].flatMap((span) =>
|
|
3107
|
+
span.endedAt
|
|
3108
|
+
? [[Date.parse(span.startedAt), Date.parse(span.endedAt)] as const]
|
|
3109
|
+
: Number.isFinite(until)
|
|
3110
|
+
? [[Date.parse(span.startedAt), until] as const]
|
|
3111
|
+
: [],
|
|
3112
|
+
),
|
|
3113
|
+
workStart,
|
|
3114
|
+
until,
|
|
3115
|
+
);
|
|
2904
3116
|
if (pausedMs > 0) work.pausedMs = pausedMs;
|
|
2905
3117
|
}
|
|
2906
3118
|
groups = groups.filter((entry) => {
|
|
@@ -81,10 +81,11 @@ export type TurnSummaryOptions = Readonly<{
|
|
|
81
81
|
|
|
82
82
|
/**
|
|
83
83
|
* Exchange status shown in place of the plain facet line. `working` and
|
|
84
|
-
* `waiting` run a live clock from `since`; `worked` shows the settled span
|
|
84
|
+
* `waiting` run a live clock from `since`; `worked` shows the settled span;
|
|
85
|
+
* `paused` shows the work done before the pause, with its clock stopped.
|
|
85
86
|
*/
|
|
86
87
|
export type TurnSummaryStatus = Readonly<{
|
|
87
|
-
kind: "working" | "waiting" | "worked";
|
|
88
|
+
kind: "working" | "waiting" | "worked" | "paused";
|
|
88
89
|
/** Replaces the default "Working" / "Waiting" wording. */
|
|
89
90
|
label?: string | undefined;
|
|
90
91
|
/** Who the wait is on: `you` when it needs the reader. */
|
|
@@ -93,7 +94,7 @@ export type TurnSummaryStatus = Readonly<{
|
|
|
93
94
|
updates?: number | undefined;
|
|
94
95
|
/** Live clock start for `working` and `waiting`. */
|
|
95
96
|
since?: string | undefined;
|
|
96
|
-
/** Settled span for `worked`. */
|
|
97
|
+
/** Settled span for `worked`; work done before the pause for `paused`. */
|
|
97
98
|
durationMs?: number | undefined;
|
|
98
99
|
/** Live step preview under the row while it is collapsed. */
|
|
99
100
|
preview?: ReactNode;
|
|
@@ -597,8 +597,9 @@ export function TurnSummary({
|
|
|
597
597
|
}
|
|
598
598
|
|
|
599
599
|
/**
|
|
600
|
-
* "Working · 2m 14s", "Waiting for 2 agents · 3m 5s",
|
|
601
|
-
* null when a settled span is too
|
|
600
|
+
* "Working · 2m 14s", "Waiting for 2 agents · 3m 5s", "Paused · 2m 14s" (its
|
|
601
|
+
* clock stopped), or "Worked for 4m 10s"; null when a settled span is too
|
|
602
|
+
* short to state.
|
|
602
603
|
*/
|
|
603
604
|
function turnSummaryStatusLine(t: OpenGeniText, status: TurnSummaryStatus): ReactNode {
|
|
604
605
|
if (status.kind === "worked") {
|
|
@@ -610,6 +611,18 @@ function turnSummaryStatusLine(t: OpenGeniText, status: TurnSummaryStatus): Reac
|
|
|
610
611
|
</span>
|
|
611
612
|
) : null;
|
|
612
613
|
}
|
|
614
|
+
if (status.kind === "paused") {
|
|
615
|
+
return (
|
|
616
|
+
<span data-og-exchange-status="paused">
|
|
617
|
+
{status.label ?? t("timeline.turnSummary.paused")}
|
|
618
|
+
{status.durationMs !== undefined &&
|
|
619
|
+
Number.isFinite(status.durationMs) &&
|
|
620
|
+
status.durationMs >= 1000 ? (
|
|
621
|
+
<span className="tabular-nums">{` · ${formatElapsed(t, status.durationMs)}`}</span>
|
|
622
|
+
) : null}
|
|
623
|
+
</span>
|
|
624
|
+
);
|
|
625
|
+
}
|
|
613
626
|
const label =
|
|
614
627
|
status.label ??
|
|
615
628
|
(status.kind === "working"
|
package/src/timeline/types.ts
CHANGED
|
@@ -782,10 +782,16 @@ export type TimelineGroup =
|
|
|
782
782
|
/**
|
|
783
783
|
* Settled time inside this work span in which the agent was not
|
|
784
784
|
* working: capacity waits, and the gap between a failed attempt and
|
|
785
|
-
* the Retry that reopened the turn. The worked
|
|
786
|
-
* working clock exclude it.
|
|
785
|
+
* the Retry that reopened the turn, and settled pauses. The worked
|
|
786
|
+
* duration and the live working clock exclude it.
|
|
787
787
|
*/
|
|
788
788
|
pausedMs?: number;
|
|
789
|
+
/**
|
|
790
|
+
* Set while a pause is in force over this still-open turn: when it
|
|
791
|
+
* began. Pause parks the turn for Resume, so it reads as paused with
|
|
792
|
+
* its clock stopped here, not as working.
|
|
793
|
+
*/
|
|
794
|
+
pausedAt?: string;
|
|
789
795
|
details: TimelineGroup[];
|
|
790
796
|
/**
|
|
791
797
|
* While the turn is live, its progress notes stay readable above the
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import type { SessionEvent } from "@opengeni/sdk";
|
|
2
|
+
import { useMemo, useState } from "react";
|
|
3
|
+
import { timelinePauseSpans, type TimelineLivePause, type TimelinePauseSpan } from "./projection";
|
|
4
|
+
|
|
5
|
+
/** At most this many pauses seen only through the live control are kept. */
|
|
6
|
+
const OBSERVED_PAUSE_LIMIT = 20;
|
|
7
|
+
|
|
8
|
+
type LivePauseHistory = {
|
|
9
|
+
sessionId: string | null;
|
|
10
|
+
/** The live pause as last rendered; undefined while it is unknown. */
|
|
11
|
+
live: boolean | undefined;
|
|
12
|
+
/** The last known pause state: a brief unknown does not forget a pause. */
|
|
13
|
+
paused: boolean | undefined;
|
|
14
|
+
/** When the pause in force began, as best known. */
|
|
15
|
+
since: string | null;
|
|
16
|
+
/** When this view saw the latest pause end. */
|
|
17
|
+
resumedAt: string | null;
|
|
18
|
+
/** Pauses this view saw begin and end. */
|
|
19
|
+
observed: TimelinePauseSpan[];
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
function nextHistory(
|
|
23
|
+
previous: LivePauseHistory | null,
|
|
24
|
+
sessionId: string | null,
|
|
25
|
+
paused: boolean | undefined,
|
|
26
|
+
since: string | null,
|
|
27
|
+
now: string,
|
|
28
|
+
): LivePauseHistory {
|
|
29
|
+
if (!previous || previous.sessionId !== sessionId) {
|
|
30
|
+
return {
|
|
31
|
+
sessionId,
|
|
32
|
+
live: paused,
|
|
33
|
+
paused,
|
|
34
|
+
since: paused ? (since ?? now) : null,
|
|
35
|
+
resumedAt: null,
|
|
36
|
+
observed: [],
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
if (paused === undefined) return { ...previous, live: paused };
|
|
40
|
+
if (previous.paused === true && paused === false) {
|
|
41
|
+
return {
|
|
42
|
+
...previous,
|
|
43
|
+
live: paused,
|
|
44
|
+
paused,
|
|
45
|
+
since: null,
|
|
46
|
+
resumedAt: now,
|
|
47
|
+
observed: [...previous.observed, { startedAt: previous.since ?? now, endedAt: now }].slice(
|
|
48
|
+
-OBSERVED_PAUSE_LIMIT,
|
|
49
|
+
),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
if (paused === true && previous.paused !== true) {
|
|
53
|
+
return { ...previous, live: paused, paused, since: since ?? now, resumedAt: null };
|
|
54
|
+
}
|
|
55
|
+
return { ...previous, live: paused, paused };
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* The session's pause spans for `groupTimeline`, from its events and its live
|
|
60
|
+
* pause (`timelineLivePause(session.effectiveControl)`).
|
|
61
|
+
*
|
|
62
|
+
* A pause that held a waiting turn, or an ancestor's pause of a turn it did
|
|
63
|
+
* not interrupt, leaves no events, so this view remembers the pauses it saw
|
|
64
|
+
* through the live control. It also notes the moment it saw a pause end, so
|
|
65
|
+
* the paused time never counts as work while the resume's events arrive.
|
|
66
|
+
*/
|
|
67
|
+
export function useTimelinePauses(
|
|
68
|
+
events: readonly SessionEvent[] | undefined,
|
|
69
|
+
pause: TimelineLivePause | null | undefined,
|
|
70
|
+
enabled = true,
|
|
71
|
+
): TimelinePauseSpan[] {
|
|
72
|
+
const paused = pause?.paused;
|
|
73
|
+
const since = pause?.since ?? null;
|
|
74
|
+
const sessionId = events?.[0]?.sessionId ?? null;
|
|
75
|
+
const [stored, setStored] = useState<LivePauseHistory | null>(null);
|
|
76
|
+
let history = stored;
|
|
77
|
+
if (!history || history.sessionId !== sessionId || history.live !== paused) {
|
|
78
|
+
// Derived during render so the first render after a flip is already right.
|
|
79
|
+
history = nextHistory(stored, sessionId, paused, since, new Date().toISOString());
|
|
80
|
+
setStored(history);
|
|
81
|
+
}
|
|
82
|
+
// While the control is briefly unknown, the last known pause stays in force.
|
|
83
|
+
const livePaused = paused ?? (history.paused === true ? true : undefined);
|
|
84
|
+
const historySince = history.since;
|
|
85
|
+
const historyResumedAt = history.resumedAt;
|
|
86
|
+
const observed = history.observed;
|
|
87
|
+
const resumedAt = pause?.resumedAt ?? null;
|
|
88
|
+
return useMemo(
|
|
89
|
+
() =>
|
|
90
|
+
enabled
|
|
91
|
+
? timelinePauseSpans(
|
|
92
|
+
events ?? [],
|
|
93
|
+
livePaused === undefined
|
|
94
|
+
? undefined
|
|
95
|
+
: {
|
|
96
|
+
paused: livePaused,
|
|
97
|
+
since: since ?? historySince,
|
|
98
|
+
resumedAt: resumedAt ?? historyResumedAt,
|
|
99
|
+
},
|
|
100
|
+
observed,
|
|
101
|
+
)
|
|
102
|
+
: [],
|
|
103
|
+
[enabled, events, livePaused, since, historySince, resumedAt, historyResumedAt, observed],
|
|
104
|
+
);
|
|
105
|
+
}
|
|
@@ -92,6 +92,7 @@ export function isPreparingWork(group: ActivityGroup, options: ReadableWorkOptio
|
|
|
92
92
|
!options.startupDismissed &&
|
|
93
93
|
!group.work.endedAt &&
|
|
94
94
|
!group.work.waiting &&
|
|
95
|
+
!group.work.pausedAt &&
|
|
95
96
|
phases.length > 0 &&
|
|
96
97
|
group.items.every(
|
|
97
98
|
(item) => item.kind === "startup-phase" || (item.kind === "reasoning" && !item.text.trim()),
|
|
@@ -132,9 +133,10 @@ export function readableWorkHasDetails(
|
|
|
132
133
|
/**
|
|
133
134
|
* Status of a readable turn's work row, minus the host-rendered live preview.
|
|
134
135
|
* Time spent waiting for model capacity, or between a failed attempt and its
|
|
135
|
-
* Retry, is not work: the worked duration and the live working
|
|
136
|
-
* it, and a capacity wait itself shows no clock. A
|
|
137
|
-
*
|
|
136
|
+
* Retry, or paused, is not work: the worked duration and the live working
|
|
137
|
+
* clock exclude it, and a capacity wait itself shows no clock. A turn parked
|
|
138
|
+
* by a pause still in force reads as paused, its clock stopped where the
|
|
139
|
+
* pause began. A wait's `detail` is its one quiet secondary line.
|
|
138
140
|
*/
|
|
139
141
|
export function readableWorkStatus(
|
|
140
142
|
t: OpenGeniText,
|
|
@@ -157,8 +159,15 @@ export function readableWorkStatus(
|
|
|
157
159
|
durationMs: durationMs === undefined ? undefined : Math.max(0, durationMs - pausedMs),
|
|
158
160
|
};
|
|
159
161
|
}
|
|
162
|
+
if (group.work.pausedAt) {
|
|
163
|
+
const durationMs = durationBetween(group.work.startedAt, group.work.pausedAt);
|
|
164
|
+
return {
|
|
165
|
+
kind: "paused",
|
|
166
|
+
durationMs: durationMs === undefined ? undefined : Math.max(0, durationMs - pausedMs),
|
|
167
|
+
};
|
|
168
|
+
}
|
|
160
169
|
if (group.work.waiting) {
|
|
161
|
-
const { untimed, since, ...waiting } = group.work.waiting;
|
|
170
|
+
const { untimed, since, waitingOn: _waitingOn, ...waiting } = group.work.waiting;
|
|
162
171
|
return { kind: "waiting", ...waiting, ...(untimed ? {} : { since }) };
|
|
163
172
|
}
|
|
164
173
|
const started = Date.parse(group.work.startedAt);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/app/lib/session-branch-cache.tsx"],"sourcesContent":["import type { Session as SessionDetails } from \"../types\";\nimport type { RailSession as Session } from \"./session-list-entry\";\n\nimport { mergeSessionForRail } from \"./sessions-group\";\n\nexport type SessionBranchPage<T extends Session = SessionDetails> = {\n sessions: T[];\n /** Per-row causal generations for rows returned by accepted branch reads. */\n channelGenerations: ReadonlyMap<string, number>;\n nextCursor: string | null;\n loading: boolean;\n /** Whether this load cycle may paint loading or retry feedback in the tree. */\n feedbackVisible: boolean;\n failed: boolean;\n stale: boolean;\n requestId: number | null;\n retryCursor: string | null;\n};\n\nexport type SessionBranchSummaryDecision = {\n acknowledge: boolean;\n refresh: boolean;\n markStale: boolean;\n};\n\n/**\n * Stable summary of the server-owned descendant facts that make an already\n * loaded branch stale. Child creation changes direct/total counts; lifecycle\n * changes advance the status aggregates. Title/content stays owned by the\n * child page or active route projection.\n */\nexport function sessionBranchSummaryKey(session: Session, readRevision = 0): string {\n const stats = session.treeStats;\n if (!stats) return `${session.id}:${session.updatedAt}:unknown:${readRevision}`;\n return [\n readRevision,\n session.id,\n session.updatedAt,\n stats.directChildren,\n stats.totalDescendants,\n stats.runningDescendants,\n stats.queuedDescendants,\n stats.attentionDescendants,\n stats.pausedDescendants,\n stats.failedDescendants,\n stats.unreadFailedDescendants ?? stats.failedDescendants,\n stats.unreadDescendants ?? 0,\n stats.activelyWorkingDescendants ?? 0,\n stats.attentionSince ?? \"\",\n stats.truncated ? 1 : 0,\n ].join(\":\");\n}\n\n/**\n * Persist a route/lineage child in its already-loaded parent branch. The route\n * owns current lifecycle/content while the cached row retains rail ordering\n * timestamps and may own treeStats.\n */\nexport function upsertSessionBranchChild(\n pages: ReadonlyMap<string, SessionBranchPage<SessionDetails>>,\n child: SessionDetails,\n): ReadonlyMap<string, SessionBranchPage<SessionDetails>>;\nexport function upsertSessionBranchChild<T extends Session = SessionDetails>(\n pages: ReadonlyMap<string, SessionBranchPage<T>>,\n child: T,\n): ReadonlyMap<string, SessionBranchPage<T>>;\nexport function upsertSessionBranchChild<T extends Session = SessionDetails>(\n pages: ReadonlyMap<string, SessionBranchPage<T>>,\n child: T,\n): ReadonlyMap<string, SessionBranchPage<T>> {\n const parentSessionId = child.parentSessionId;\n if (!parentSessionId) return pages;\n const page = pages.get(parentSessionId);\n const sessions = page?.sessions ?? [];\n const index = sessions.findIndex((session) => session.id === child.id);\n const nextSessions = [...sessions];\n if (index === -1) {\n nextSessions.push(child);\n } else {\n const cached = sessions[index]!;\n const merged = {\n ...mergeSessionForRail(cached, child),\n // Route/detail timestamps can be millisecond-truncated or ahead of the\n // list activity clock. Only a branch-page commit replaces rail ordering.\n createdAt: cached.createdAt,\n updatedAt: cached.updatedAt,\n };\n nextSessions[index] = page?.channelGenerations.has(child.id)\n ? { ...merged, channelId: cached.channelId ?? null }\n : merged;\n }\n return new Map(pages).set(parentSessionId, {\n sessions: nextSessions,\n channelGenerations: page?.channelGenerations ?? new Map(),\n nextCursor: page?.nextCursor ?? null,\n loading: page?.loading ?? false,\n feedbackVisible: page?.feedbackVisible ?? false,\n failed: page?.failed ?? false,\n stale: page?.stale ?? false,\n requestId: page?.requestId ?? null,\n retryCursor: page?.retryCursor ?? null,\n });\n}\n\n/** Mark one exact branch request active without discarding loaded children. */\nexport function beginSessionBranchRequest<T extends Session = SessionDetails>(\n pages: ReadonlyMap<string, SessionBranchPage<T>>,\n parentSessionId: string,\n requestId: number,\n cursor?: string,\n options: { feedbackVisible?: boolean | undefined } = {},\n): ReadonlyMap<string, SessionBranchPage<T>> {\n const previous = pages.get(parentSessionId);\n return new Map(pages).set(parentSessionId, {\n sessions: previous?.sessions ?? [],\n channelGenerations: previous?.channelGenerations ?? new Map(),\n nextCursor: previous?.nextCursor ?? null,\n loading: true,\n feedbackVisible: options.feedbackVisible ?? true,\n failed: false,\n stale: false,\n requestId,\n retryCursor: cursor ?? null,\n });\n}\n\n/** Refresh the already-loaded window with bounded, opaque-cursor reads. */\nexport async function readLoadedSessionBranchWindow<T extends Session = SessionDetails>(\n readPage: (cursor?: string) => Promise<{ sessions: T[]; pinned: T[]; nextCursor: string | null }>,\n minimumCount: number,\n initialCursor?: string,\n): Promise<{ sessions: T[]; nextCursor: string | null }> {\n const sessions = new Map<string, T>();\n const seen = new Set<string>();\n let cursor = initialCursor;\n for (let reads = 0; reads <= Math.max(1, minimumCount); reads += 1) {\n const page = await readPage(cursor);\n for (const session of [...page.sessions, ...page.pinned]) sessions.set(session.id, session);\n if (!page.nextCursor || sessions.size >= minimumCount) {\n return { sessions: [...sessions.values()], nextCursor: page.nextCursor };\n }\n if (seen.has(page.nextCursor)) throw new Error(\"Child pagination cursor repeated\");\n seen.add(page.nextCursor);\n cursor = page.nextCursor;\n }\n throw new Error(\"Child pagination made no progress\");\n}\n\n/** Commit one server child page or a fully refreshed loaded window. */\nexport function commitSessionBranchPage(\n pages: ReadonlyMap<string, SessionBranchPage<SessionDetails>>,\n parentSessionId: string,\n input: { sessions: readonly SessionDetails[]; nextCursor: string | null },\n options?: {\n append?: boolean | undefined;\n replaceWindow?: boolean | undefined;\n preserve?: readonly SessionDetails[] | undefined;\n requestId?: number | undefined;\n readGeneration?: number | undefined;\n },\n): ReadonlyMap<string, SessionBranchPage<SessionDetails>>;\nexport function commitSessionBranchPage<T extends Session = SessionDetails>(\n pages: ReadonlyMap<string, SessionBranchPage<T>>,\n parentSessionId: string,\n input: { sessions: readonly T[]; nextCursor: string | null },\n options?: {\n append?: boolean | undefined;\n replaceWindow?: boolean | undefined;\n preserve?: readonly T[] | undefined;\n requestId?: number | undefined;\n readGeneration?: number | undefined;\n },\n): ReadonlyMap<string, SessionBranchPage<T>>;\nexport function commitSessionBranchPage<T extends Session = SessionDetails>(\n pages: ReadonlyMap<string, SessionBranchPage<T>>,\n parentSessionId: string,\n input: { sessions: readonly T[]; nextCursor: string | null },\n options: {\n append?: boolean | undefined;\n replaceWindow?: boolean | undefined;\n preserve?: readonly T[] | undefined;\n requestId?: number | undefined;\n readGeneration?: number | undefined;\n } = {},\n): ReadonlyMap<string, SessionBranchPage<T>> {\n const previous = pages.get(parentSessionId);\n if (options.requestId !== undefined && previous?.requestId !== options.requestId) return pages;\n const merged = new Map<string, T>();\n const channelGenerations = options.append\n ? new Map(previous?.channelGenerations ?? [])\n : new Map<string, number>();\n if (options.append) {\n for (const session of [\n ...(previous?.sessions ?? []),\n ...(options.preserve ?? []),\n ...input.sessions,\n ]) {\n merged.set(session.id, session);\n }\n } else {\n // A refreshed first page owns the leading order. Retain already-loaded\n // tail entries (including an active child outside the first 50) behind it.\n for (const session of input.sessions) merged.set(session.id, session);\n for (const session of [\n ...(options.replaceWindow ? [] : (previous?.sessions ?? [])),\n ...(options.preserve ?? []),\n ]) {\n if (!merged.has(session.id)) merged.set(session.id, session);\n }\n }\n const readGeneration = options.readGeneration ?? 0;\n if (readGeneration > 0) {\n for (const session of input.sessions) {\n channelGenerations.set(session.id, readGeneration);\n }\n }\n return new Map(pages).set(parentSessionId, {\n sessions: [...merged.values()],\n channelGenerations,\n nextCursor: input.nextCursor,\n loading: false,\n feedbackVisible: false,\n failed: false,\n stale: false,\n requestId: null,\n retryCursor: null,\n });\n}\n\n/** Current branch rows that may own channel filing, with their actual read starts. */\nexport function authoritativeSessionBranchChannels<T extends Session = SessionDetails>(\n page: SessionBranchPage<T>,\n): Array<readonly [session: T, readGeneration: number]> {\n const byId = new Map(page.sessions.map((session) => [session.id, session]));\n const evidence: Array<readonly [session: T, readGeneration: number]> = [];\n for (const [sessionId, readGeneration] of page.channelGenerations) {\n const session = byId.get(sessionId);\n if (session && readGeneration > 0) evidence.push([session, readGeneration]);\n }\n return evidence;\n}\n\n/** Fail only the still-current request and expose its exact retry cursor. */\nexport function failSessionBranchRequest<T extends Session = SessionDetails>(\n pages: ReadonlyMap<string, SessionBranchPage<T>>,\n parentSessionId: string,\n requestId: number,\n): ReadonlyMap<string, SessionBranchPage<T>> {\n const previous = pages.get(parentSessionId);\n if (!previous || previous.requestId !== requestId) return pages;\n return new Map(pages).set(parentSessionId, {\n ...previous,\n loading: false,\n // Background hydration may suppress transient loading feedback, but a\n // failure must become actionable instead of leaving the branch silently\n // incomplete for the rest of the active route.\n feedbackVisible: true,\n failed: true,\n stale: false,\n requestId: null,\n });\n}\n\n/** A fresh cached page already owns the active child's parent branch. */\nexport function sessionBranchNeedsHydration<T extends Session = SessionDetails>(\n page: SessionBranchPage<T> | undefined,\n): boolean {\n return page === undefined || page.failed || page.stale;\n}\n\n/** Decide whether a changed parent summary can be acknowledged right now. */\nexport function sessionBranchSummaryDecision(input: {\n previousKey: string | undefined;\n nextKey: string;\n loading: boolean;\n expanded: boolean;\n stale: boolean;\n}): SessionBranchSummaryDecision {\n if (input.loading) {\n return {\n acknowledge: input.previousKey === input.nextKey,\n refresh: false,\n markStale: false,\n };\n }\n if (input.previousKey === undefined || input.previousKey === input.nextKey) {\n return { acknowledge: true, refresh: false, markStale: false };\n }\n return {\n acknowledge: true,\n refresh: input.expanded,\n markStale: !input.expanded && !input.stale,\n };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/timeline-annotations.tsx"],"sourcesContent":["import type { TimelineAnnotationSource } from \"@opengeni/sdk\";\nimport { QuoteIcon, XIcon } from \"lucide-react\";\nimport {\n Suspense,\n lazy,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type ReactNode,\n type RefObject,\n} from \"react\";\nimport { cn } from \"../lib/cn\";\nimport {\n AnnotationAccentRow,\n AnnotationNotePreview,\n AnnotationQuoteSourceButton,\n type TimelineAnnotationLike,\n} from \"./timeline-annotation-chrome\";\nimport { ANNOTATION_CARD_STACK_SCROLL_AT } from \"./timeline-annotation-layout\";\nimport {\n TimelineAnnotationSourceRootContext,\n useTimelineAnnotationSourceRoot,\n} from \"./timeline-annotation-reveal-context\";\nimport {\n annotationDisplayOrdinal,\n annotationHasNote,\n resolveAnnotationRevealRoot,\n} from \"./timeline-annotation-shared\";\nimport { useOpenGeniText } from \"../messages/runtime\";\n\nexport type { TimelineAnnotationLike } from \"./timeline-annotation-chrome\";\n\nconst TimelineAnnotationsDialog = lazy(() => import(\"./timeline-annotations-dialog\"));\n\nfunction AnnotationSourceRootBridge({\n triggerRef,\n children,\n}: {\n triggerRef: RefObject<HTMLElement | null>;\n children: ReactNode;\n}) {\n const inheritedRoot = useTimelineAnnotationSourceRoot();\n const conversationRootRef = useRef<HTMLElement | null>(null);\n if (!inheritedRoot) {\n conversationRootRef.current = resolveAnnotationRevealRoot(triggerRef.current);\n }\n useLayoutEffect(() => {\n if (inheritedRoot) return;\n conversationRootRef.current = resolveAnnotationRevealRoot(triggerRef.current);\n });\n if (inheritedRoot) return children;\n return (\n <TimelineAnnotationSourceRootContext.Provider value={conversationRootRef}>\n {children}\n </TimelineAnnotationSourceRootContext.Provider>\n );\n}\n\nexport function TimelineAnnotationCards({\n annotations,\n onRevealSource,\n className,\n}: {\n annotations: readonly TimelineAnnotationLike[];\n onRevealSource?: ((source: TimelineAnnotationSource) => boolean) | undefined;\n className?: string | undefined;\n}) {\n const t = useOpenGeniText();\n const [unavailableId, setUnavailableId] = useState<string | null>(null);\n if (annotations.length === 0) return null;\n return (\n <div\n data-og-annotation-cards=\"\"\n className={cn(\n \"grid gap-2\",\n annotations.length >= ANNOTATION_CARD_STACK_SCROLL_AT &&\n \"max-h-[min(28rem,55vh)] overflow-x-hidden overflow-y-auto overscroll-contain pr-1\",\n className,\n )}\n >\n {annotations.map((annotation, index) => {\n const ordinal = annotationDisplayOrdinal(annotation, index);\n return (\n <section\n key={annotation.id}\n aria-label={t(\"timelineAnnotations.annotationOrdinal\", { ordinal })}\n >\n <AnnotationAccentRow>\n <p className=\"mb-0.5 text-og-xs font-medium tabular-nums text-og-fg-subtle\">\n {t(\"timelineAnnotations.annotationOrdinal\", { ordinal })}\n </p>\n <AnnotationQuoteSourceButton\n annotation={annotation}\n lines={2}\n onRevealSource={onRevealSource}\n onUnavailable={setUnavailableId}\n />\n {unavailableId === annotation.id ? (\n <p role=\"status\" className=\"text-og-xs text-og-status-waiting\">\n {t(\"timelineAnnotations.sourceIsOutsideTheLoaded\")}\n </p>\n ) : null}\n <AnnotationNotePreview\n note={annotation.note}\n annotationId={annotation.id}\n ordinal={ordinal}\n />\n </AnnotationAccentRow>\n </section>\n );\n })}\n </div>\n );\n}\n\nexport function TimelineAnnotationsChip({\n annotations,\n editable = false,\n focusAnnotationId,\n onFocusConsumed,\n onUpdate,\n onRemove,\n onRevealSource,\n className,\n compact = false,\n onCommit,\n}: {\n annotations: readonly TimelineAnnotationLike[];\n editable?: boolean | undefined;\n focusAnnotationId?: string | null | undefined;\n onFocusConsumed?: (() => void) | undefined;\n onUpdate?: ((id: string, note: string) => void) | undefined;\n onRemove?: ((id: string) => void) | undefined;\n /** Return focus to the owning input after all notes are completed with Enter. */\n onCommit?: (() => void) | undefined;\n onRevealSource?: ((source: TimelineAnnotationSource) => boolean) | undefined;\n className?: string | undefined;\n /** Dense trigger for single-line rows such as the compact queue dock. */\n compact?: boolean | undefined;\n}) {\n const t = useOpenGeniText();\n const focusRequested = Boolean(\n focusAnnotationId && annotations.some((item) => item.id === focusAnnotationId),\n );\n const [open, setOpen] = useState(focusRequested);\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n const openedFocusId = useRef<string | null>(focusRequested ? (focusAnnotationId ?? null) : null);\n\n useEffect(() => {\n if (!focusRequested || !focusAnnotationId) {\n if (!focusRequested) openedFocusId.current = null;\n return;\n }\n if (openedFocusId.current === focusAnnotationId) return;\n openedFocusId.current = focusAnnotationId;\n setOpen(true);\n }, [focusAnnotationId, focusRequested]);\n\n if (annotations.length === 0) return null;\n const countLabel = t(\"counts.annotations\", { count: annotations.length });\n const incomplete = annotations.some((annotation) => !annotationHasNote(annotation.note));\n const canClear = Boolean(editable && onRemove);\n\n const dismiss = (restoreFocus: boolean) => {\n setOpen(false);\n onFocusConsumed?.();\n if (restoreFocus) triggerRef.current?.focus();\n };\n\n return (\n <span className={cn(\"inline-flex max-w-full items-center\", className)}>\n <span\n className={cn(\n \"inline-flex max-w-full items-center rounded-full border bg-og-surface-1 text-og-fg-muted\",\n incomplete ? \"border-og-accent/45 bg-og-accent-soft/50\" : \"border-og-border\",\n )}\n >\n <button\n ref={triggerRef}\n type=\"button\"\n className={cn(\n \"inline-flex min-w-0 max-w-full items-center gap-1.5 rounded-full border-0 bg-transparent font-medium outline-hidden transition hover:text-og-fg focus-visible:ring-2 focus-visible:ring-og-accent pointer-coarse:min-h-[44px]\",\n compact ? \"min-h-6 py-0.5 text-og-xs\" : \"min-h-8 py-1 text-og-sm\",\n canClear ? \"pr-1 pl-2.5\" : \"px-2.5\",\n )}\n aria-label={t(\"timelineAnnotations.reviewCountlabel\", { countLabel })}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n onClick={() => setOpen((current) => !current)}\n >\n <QuoteIcon className=\"size-3.5 shrink-0 text-og-accent\" aria-hidden=\"true\" />\n <span className=\"min-w-0 truncate\">{countLabel}</span>\n </button>\n {canClear ? (\n <button\n type=\"button\"\n className=\"inline-flex size-7 shrink-0 items-center justify-center rounded-full border-0 bg-transparent text-og-fg-subtle outline-hidden hover:text-og-status-failed focus-visible:ring-2 focus-visible:ring-og-accent pointer-coarse:size-11\"\n aria-label={t(\"timelineAnnotations.removeAllAnnotations\")}\n onClick={() => {\n for (const annotation of annotations) onRemove?.(annotation.id);\n }}\n >\n <XIcon className=\"size-3.5\" aria-hidden=\"true\" />\n </button>\n ) : null}\n </span>\n {open ? (\n <AnnotationSourceRootBridge triggerRef={triggerRef}>\n <Suspense fallback={null}>\n <TimelineAnnotationsDialog\n annotations={annotations}\n editable={editable}\n focusAnnotationId={focusAnnotationId}\n onFocusConsumed={onFocusConsumed}\n onUpdate={onUpdate}\n onRemove={onRemove}\n onRevealSource={onRevealSource}\n triggerRef={triggerRef}\n countLabel={countLabel}\n onDismiss={dismiss}\n onCommit={() => {\n dismiss(!onCommit);\n onCommit?.();\n }}\n />\n </Suspense>\n </AnnotationSourceRootBridge>\n ) : null}\n </span>\n );\n}\n\nexport default TimelineAnnotationsChip;\n"],"mappings":"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","names":[]}
|