@opengeni/react 4.4.1 → 4.5.1-canary.39832248373001
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 +15 -15
- package/dist/app/components/Composer.js +19 -19
- package/dist/app/components/artifacts/artifact-browse-controls.js +3 -3
- package/dist/app/components/artifacts/artifact-library.js +9 -9
- package/dist/app/components/artifacts/artifact-page-chrome.js +2 -2
- package/dist/app/components/artifacts/chat-interactive-block.js +14 -14
- package/dist/app/components/artifacts/inline-chat-image.js +22 -21
- package/dist/app/components/artifacts/retained-file-preview.js +24 -23
- package/dist/app/components/artifacts/retained-text-preview.js +2 -2
- package/dist/app/components/artifacts/site-audience.js +2 -2
- package/dist/app/components/artifacts/site-conversations.js +14 -13
- package/dist/app/components/artifacts/site-data.js +4 -4
- package/dist/app/components/artifacts/site-publishing.js +20 -20
- package/dist/app/components/artifacts/site-settings.js +25 -25
- package/dist/app/components/billing-class-mark.js +3 -3
- package/dist/app/components/capabilities/capability-detail-sheet.js +6 -6
- package/dist/app/components/capabilities/capability-logo-source.js +8 -8
- package/dist/app/components/capabilities/connector-tool-permissions.js +3 -3
- package/dist/app/components/capabilities/native-connect-setup.js +8 -8
- package/dist/app/components/capabilities/prepared-mcp-setup-card.js +10 -10
- package/dist/app/components/capabilities/session-capability-card.js +43 -41
- package/dist/app/components/capabilities/session-capability-card.js.map +1 -1
- package/dist/app/components/capabilities/session-chrome-card.js +20 -18
- package/dist/app/components/capabilities/session-custom-mcp-card.js +11 -11
- package/dist/app/components/capabilities/session-github-card.js +13 -13
- package/dist/app/components/capabilities/session-machine-card.js +19 -17
- package/dist/app/components/command-menu/chat-status.js +16 -15
- package/dist/app/components/command-menu/chat-switcher.js +19 -18
- package/dist/app/components/command-menu/chat-switcher.js.map +1 -1
- package/dist/app/components/command-menu/command-menu.js +29 -107
- package/dist/app/components/command-menu/command-menu.js.map +1 -1
- package/dist/app/components/command-menu/shortcut-sheet.js +9 -9
- package/dist/app/components/composer-mobile-plus-panel.js +9 -9
- 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 +5 -5
- package/dist/app/components/credits/coupon-redeem.js +2 -2
- package/dist/app/components/credits/credit-refusal-notice.js +2 -2
- package/dist/app/components/desktop/app-shots.js +7 -7
- package/dist/app/components/desktop/this-computer.js +4 -4
- package/dist/app/components/feedback.js +3 -3
- package/dist/app/components/follow-up-repository-menu-body.js +2 -2
- 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/machines/connect-machine-dialog.js +3 -3
- package/dist/app/components/markdown.js +5 -5
- package/dist/app/components/models/models-ui.js +3 -3
- package/dist/app/components/new-session-starters.js +2 -2
- package/dist/app/components/pickers.js +6 -6
- package/dist/app/components/rail/rail-context.js +3 -3
- package/dist/app/components/rail/rail-sections.js +51 -48
- package/dist/app/components/rail/session-header.js +29 -28
- package/dist/app/components/rail/session-list.js +50 -47
- 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 +17 -16
- package/dist/app/components/rail/session-shell.js +78 -75
- 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 +2 -2
- package/dist/app/components/session/agent-configuration-panel.js +18 -18
- 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 +7 -7
- package/dist/app/components/session/codex-account-indicator.js +10 -10
- package/dist/app/components/session/editable-artifacts-workspace.js +24 -24
- package/dist/app/components/session/failed-session-banner.js +6 -6
- package/dist/app/components/session/human-input.js +41 -37
- package/dist/app/components/session/inspector.js +61 -57
- package/dist/app/components/session/inspector.js.map +1 -1
- package/dist/app/components/session/message-actions.js +3 -3
- package/dist/app/components/session/message-resource-attachments.js +12 -11
- package/dist/app/components/session/message-resource-attachments.js.map +1 -1
- package/dist/app/components/session/model-account-indicator.js +9 -9
- package/dist/app/components/session/model-recovery-notice.js +3 -3
- package/dist/app/components/session/new-session-settings-menu.js +8 -8
- package/dist/app/components/session/sandbox-switcher.js +12 -12
- package/dist/app/components/session/sandbox-workspace.js +58 -54
- package/dist/app/components/session/search-markdown-highlight.js +6 -6
- package/dist/app/components/session/search-results-view.js +7 -7
- package/dist/app/components/session/session-admin-access.js +3 -3
- package/dist/app/components/session/session-admission-notice.js +5 -5
- package/dist/app/components/session/session-machine-access-notice.js +5 -5
- package/dist/app/components/session/session-search-dialog.js +8 -8
- package/dist/app/components/session/session-tenancy-control.d.ts +2 -0
- package/dist/app/components/session/session-tenancy-control.js +26 -11
- package/dist/app/components/session/session-tenancy-control.js.map +1 -1
- package/dist/app/components/session/session-usage-limit-section.js +4 -4
- package/dist/app/components/session/session-wait-status.js +8 -7
- 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 +13 -12
- package/dist/app/components/settings/row-select.js +3 -3
- package/dist/app/components/transcription-settings.js +4 -4
- package/dist/app/components/usage/usage-entry.js +5 -5
- package/dist/app/components/workspace-composer-plus.js +12 -12
- package/dist/app/embed/memory-navigation.js +2 -2
- package/dist/app/embed/session-app.js +196 -190
- package/dist/app/lib/actions/actions-provider.js +9 -9
- 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 +9 -9
- 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 +13 -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/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 +12 -11
- package/dist/app/lib/session-create.js +2 -2
- package/dist/app/lib/session-deep-link.js +2 -2
- package/dist/app/lib/session-failure-toasts.d.ts +8 -0
- package/dist/app/lib/session-group-pagination.js +12 -11
- package/dist/app/lib/session-hover-facts.js +12 -11
- package/dist/app/lib/session-model.js +2 -2
- package/dist/app/lib/session-rail.js +8 -7
- package/dist/app/lib/session-rename.js +2 -2
- 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 +19 -12
- package/dist/app/lib/shared-query.js +3 -3
- package/dist/app/lib/site-opened.d.ts +6 -0
- package/dist/app/lib/site-opened.js +10 -0
- package/dist/app/lib/turn-failure-analytics.js +5 -5
- package/dist/app/lib/use-duplicate-site.js +2 -2
- package/dist/app/lib/use-follow-up-repositories.js +2 -2
- 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 +5 -5
- package/dist/app/lib/use-workspace-model-catalog.js +7 -7
- package/dist/app/lib/use-workspace-rigs.js +7 -7
- 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 +70 -87
- package/dist/app/routes/artifacts.js.map +1 -1
- package/dist/app/routes/retained-artifact.js +36 -35
- package/dist/app/routes/retained-artifact.js.map +1 -1
- package/dist/app/routes/session-unavailable.js +6 -4
- package/dist/app/routes/session.js +127 -123
- package/dist/app/routes/sessions-index-hydration.js +3 -3
- package/dist/app/routes/sessions-index.js +96 -94
- 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 +13 -13
- package/dist/{browser-viewer-RYYQSRTC.js → browser-viewer-VPK3CV2H.js} +7 -5
- package/dist/{chat-interactive-block-ABCRKXJ4.js → chat-interactive-block-AMDSW656.js} +5 -5
- package/dist/chunk-22GTC4MZ.js +15 -0
- package/dist/chunk-22GTC4MZ.js.map +1 -0
- package/dist/{chunk-RQDFYQHA.js → chunk-25LWDG5D.js} +6 -6
- package/dist/{chunk-U3HSFCON.js → chunk-2CKVVAGP.js} +15 -15
- package/dist/{chunk-F6LBGYS6.js → chunk-2DL6NJP5.js} +15 -15
- 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-TWXIFWBD.js → chunk-34EU25RL.js} +2 -2
- package/dist/{chunk-PTGRFAMH.js → chunk-3ABPIUCK.js} +2 -2
- package/dist/{chunk-722UO6YQ.js → chunk-3PEXVG4D.js} +2 -2
- package/dist/{chunk-N3ZP4IDU.js → chunk-45WYYFP6.js} +2 -2
- package/dist/{chunk-HOJGAJAB.js → chunk-4MQLGMV2.js} +5 -5
- package/dist/{chunk-L7YURQI2.js → chunk-4U4GXWXS.js} +3 -3
- package/dist/{chunk-63VGE4OH.js → chunk-5HIOVXOX.js} +3 -3
- package/dist/{chunk-GFUUFM2O.js → chunk-5M23GZA2.js} +3 -3
- 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-6W3LF3DB.js → chunk-5YFY4SFC.js} +2 -12
- package/dist/chunk-5YFY4SFC.js.map +1 -0
- package/dist/{chunk-I6VUUEXH.js → chunk-6AFSZKZA.js} +3 -3
- package/dist/{chunk-FBMU3VK5.js → chunk-6DCEDIF6.js} +2 -2
- package/dist/{chunk-5MZTJMZ3.js → chunk-6MRY2RUZ.js} +13 -7
- package/dist/chunk-6MRY2RUZ.js.map +1 -0
- package/dist/{chunk-4EONHNJU.js → chunk-6O4VWKSO.js} +2 -2
- package/dist/chunk-756MKA2J.js +45 -0
- package/dist/chunk-756MKA2J.js.map +1 -0
- package/dist/{chunk-BSX2R4CW.js → chunk-767WCGAX.js} +6 -6
- package/dist/{chunk-7KGKDWWR.js → chunk-7HFLYNWN.js} +2 -2
- package/dist/{chunk-OSVHU2WU.js → chunk-7IYAHFPE.js} +2 -2
- package/dist/{chunk-4EAF3HSD.js → chunk-7J7PZB4S.js} +2 -2
- package/dist/{chunk-ADJJQSYC.js → chunk-7PUFAH4I.js} +34 -32
- package/dist/chunk-7PUFAH4I.js.map +1 -0
- package/dist/{chunk-OR37STQZ.js → chunk-7R2JQHBX.js} +3 -3
- package/dist/{chunk-QM5H4FPT.js → chunk-7VN6VC3D.js} +3 -3
- package/dist/{chunk-HWDGJFM4.js → chunk-A2E3ZF6N.js} +4 -4
- package/dist/{chunk-RGW24ZZM.js → chunk-A6CK4ENG.js} +19 -17
- package/dist/chunk-A6CK4ENG.js.map +1 -0
- package/dist/{chunk-4432A3HQ.js → chunk-A6T4FGE7.js} +4 -4
- package/dist/{chunk-73SOCVLS.js → chunk-AIEXYO2X.js} +3 -3
- package/dist/{chunk-U7TC2XJQ.js → chunk-AJPW3SV4.js} +3 -3
- package/dist/{chunk-46VBQG2D.js → chunk-AOUCHCSB.js} +5 -5
- package/dist/{chunk-HDHK3SXK.js → chunk-AT4K4F6S.js} +2 -2
- package/dist/{chunk-TQGJN5UZ.js → chunk-AW3QEFOF.js} +140 -522
- package/dist/chunk-AW3QEFOF.js.map +1 -0
- package/dist/{chunk-HRJQAFKR.js → chunk-AX6YJA5U.js} +2 -2
- package/dist/{chunk-HO5Y2OOX.js → chunk-BLPXOHG6.js} +6 -6
- package/dist/{chunk-DT7BORXG.js → chunk-BMJTNPWK.js} +2 -2
- package/dist/{chunk-HIHO2QE7.js → chunk-BT2MVGHT.js} +2 -2
- package/dist/{chunk-AOLE4IRZ.js → chunk-C535KSTY.js} +2 -2
- package/dist/{chunk-IVOA3DXA.js → chunk-CB574ERL.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-NYZQ7LO7.js → chunk-CDUDKETD.js} +2 -2
- package/dist/{chunk-JTN3T4QN.js → chunk-D3RK3NGM.js} +4 -4
- package/dist/{chunk-IOKSNX74.js → chunk-D5OWJZQR.js} +2 -2
- package/dist/{chunk-BJIZ7PL7.js → chunk-D64Z4V26.js} +145 -29
- package/dist/chunk-D64Z4V26.js.map +1 -0
- package/dist/{chunk-XWWXIZFP.js → chunk-DFXZYNTX.js} +7 -7
- package/dist/{chunk-SQGXMHJO.js → chunk-DGLRZMXL.js} +3 -3
- package/dist/{chunk-GNEHAPKV.js → chunk-DJFTH2DI.js} +3 -3
- package/dist/{chunk-KWKGBGAF.js → chunk-DKCX643S.js} +11 -11
- package/dist/{chunk-HQG4SLTE.js → chunk-DYJGYGPB.js} +2 -2
- package/dist/{chunk-GTQ3SNEI.js → chunk-E36IC3LU.js} +2 -2
- package/dist/{chunk-CVG4FILQ.js → chunk-ECHYJP63.js} +253 -1008
- package/dist/chunk-ECHYJP63.js.map +1 -0
- package/dist/{chunk-Q35DT6I6.js → chunk-EH7TTYE6.js} +179 -170
- package/dist/chunk-EH7TTYE6.js.map +1 -0
- package/dist/{chunk-72J6C2AJ.js → chunk-EMCB6XKU.js} +2 -2
- package/dist/{chunk-3AA6RNGE.js → chunk-ENS6E4RZ.js} +2 -2
- package/dist/{chunk-AG7VGUIW.js → chunk-ERG355NM.js} +3 -3
- package/dist/{chunk-TSBE4KOQ.js → chunk-EWL6NDOO.js} +3 -3
- package/dist/{chunk-Z5WMLJKI.js → chunk-F2RMKGDQ.js} +89 -1
- package/dist/chunk-F2RMKGDQ.js.map +1 -0
- package/dist/{chunk-X7L4H4VG.js → chunk-F33EDYS7.js} +524 -426
- package/dist/chunk-F33EDYS7.js.map +1 -0
- package/dist/{chunk-HTT3FB7T.js → chunk-F3FN6DO6.js} +2 -2
- package/dist/{chunk-ST22GONV.js → chunk-FB3B45FP.js} +11 -11
- package/dist/{chunk-P5T36BA3.js → chunk-FRP64DEK.js} +2 -2
- package/dist/{chunk-KBF3SE7G.js → chunk-FSP334UU.js} +2 -2
- package/dist/{chunk-4VKA5O7T.js → chunk-FVL4B552.js} +9 -9
- package/dist/{chunk-VP62LPLW.js → chunk-G2BX56CN.js} +5 -5
- package/dist/{chunk-CSHBR2IZ.js → chunk-GDLDBR6B.js} +2 -2
- package/dist/{chunk-PN66T6JA.js → chunk-GFSOXB2K.js} +2 -2
- package/dist/{chunk-S4EZ3JUB.js → chunk-GZGQHQI7.js} +29 -29
- package/dist/chunk-H4IE2PYF.js +792 -0
- package/dist/chunk-H4IE2PYF.js.map +1 -0
- package/dist/{chunk-XFNLU7EW.js → chunk-H5M33DAL.js} +15 -6
- package/dist/chunk-H5M33DAL.js.map +1 -0
- package/dist/{chunk-BXRIQZAH.js → chunk-HNNM2GDN.js} +3 -3
- package/dist/{chunk-EU6XSQFM.js → chunk-HPB4KSV3.js} +2 -2
- package/dist/{chunk-QCD5Y7K5.js → chunk-HSQRYJ4P.js} +5 -5
- package/dist/{chunk-YXOKAG66.js → chunk-HUXDGWAN.js} +2 -2
- package/dist/{chunk-VUHPA3XQ.js → chunk-I66ZB6KD.js} +3 -3
- package/dist/{chunk-7CZTKBTI.js → chunk-IC7KNOBB.js} +5 -5
- package/dist/{chunk-KF3MF6FP.js → chunk-IECRGM6K.js} +3 -2
- package/dist/chunk-IECRGM6K.js.map +1 -0
- package/dist/{chunk-HGMWMK5K.js → chunk-IIO2MR3B.js} +2 -2
- 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-O756O2I7.js → chunk-IPPVX5GF.js} +1 -1
- package/dist/{chunk-X7ASQHR6.js → chunk-IUK5QGP5.js} +2 -2
- package/dist/{chunk-5JZYPZ72.js → chunk-JFK7NTEA.js} +4 -4
- package/dist/chunk-JFK7NTEA.js.map +1 -0
- package/dist/{chunk-PIVGX42P.js → chunk-JNY5MT3I.js} +2 -2
- package/dist/chunk-JRSNCSZN.js +37 -0
- package/dist/chunk-JRSNCSZN.js.map +1 -0
- package/dist/{chunk-DDK4WFJ3.js → chunk-JWN7SLTO.js} +9 -9
- package/dist/{chunk-Q35YZVDZ.js → chunk-KFWVBTUH.js} +3 -3
- package/dist/{chunk-JXT5QDJC.js → chunk-KNFDWNCH.js} +5 -5
- 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-RSNYGEVZ.js → chunk-LKJ2C7PH.js} +8 -8
- package/dist/{chunk-RIMKJBCD.js → chunk-LMPTC4CX.js} +2 -2
- package/dist/{chunk-3KVWXKD6.js → chunk-LQ47YL6E.js} +2 -2
- package/dist/{chunk-GAIM5RNE.js → chunk-MJQBC7C5.js} +3 -3
- package/dist/{chunk-NWZW2WHN.js → chunk-MM7OKOTE.js} +6 -6
- 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-XRRSFQEV.js → chunk-NAZZLAWX.js} +2 -2
- package/dist/{chunk-XOFUXMPP.js → chunk-ND2WCWXI.js} +4 -4
- package/dist/{chunk-6L7U46Y2.js → chunk-NKNVIO66.js} +2 -2
- package/dist/{chunk-JKUICTLM.js → chunk-NLAFNMPK.js} +2 -2
- package/dist/{chunk-OO2T63BY.js → chunk-NML44AW2.js} +2 -2
- package/dist/chunk-NQQKOJDI.js +89 -0
- package/dist/chunk-NQQKOJDI.js.map +1 -0
- package/dist/{chunk-4LKNIGHB.js → chunk-O2SBHS2N.js} +2 -2
- package/dist/{chunk-RA3FNMWF.js → chunk-O4DYOSOL.js} +5 -5
- package/dist/{chunk-ZKYYZH6L.js → chunk-OFB6TUDC.js} +4 -4
- package/dist/{chunk-DWPOQ3S5.js → chunk-OTMWHZBY.js} +2 -2
- package/dist/{chunk-VVCDB2T7.js → chunk-PCJLH45G.js} +3 -3
- package/dist/{chunk-WSMYOLHG.js → chunk-PEKPWK5M.js} +2 -2
- package/dist/{chunk-PZ24CYDO.js → chunk-PFAUGEV5.js} +2 -2
- package/dist/{chunk-KTRKZRID.js → chunk-PKEKZ2VA.js} +5 -5
- package/dist/{chunk-6JKZILLF.js → chunk-PMD7V4N7.js} +3 -3
- package/dist/{chunk-B74GSYR6.js → chunk-PUTS4DYW.js} +2 -2
- package/dist/{chunk-ZRJCGBVV.js → chunk-PVR5EELP.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-FLGUVRR7.js → chunk-QBADR2FO.js} +6 -6
- package/dist/{chunk-TGVVEGZG.js → chunk-QLIDZGPV.js} +6 -6
- 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-6PQNLL4E.js → chunk-R7XCJWCD.js} +11 -11
- package/dist/{chunk-4R3JCVID.js → chunk-RAMZTZOB.js} +360 -103
- package/dist/chunk-RAMZTZOB.js.map +1 -0
- package/dist/{chunk-QRVNI5V6.js → chunk-SCNEQFIW.js} +3 -3
- package/dist/{chunk-BNUPYHHZ.js → chunk-SD4PPZFB.js} +4 -4
- package/dist/{chunk-ROQOVH4N.js → chunk-SFAU5R5S.js} +3 -3
- package/dist/{chunk-R63QEVPK.js → chunk-SJORXXLV.js} +6 -6
- package/dist/{chunk-FBE6AIIW.js → chunk-SOKNCW5U.js} +2 -2
- package/dist/{chunk-JRXHSVD5.js → chunk-SOXZ4LGS.js} +68 -11
- package/dist/chunk-SOXZ4LGS.js.map +1 -0
- package/dist/{chunk-EF5SYXAY.js → chunk-SQDPHCK2.js} +22 -14
- package/dist/chunk-SQDPHCK2.js.map +1 -0
- package/dist/{chunk-NDF3SH3X.js → chunk-TDIOBPLA.js} +5 -5
- package/dist/{chunk-EHCUFCXM.js → chunk-TEPPPAJI.js} +17 -7
- package/dist/chunk-TEPPPAJI.js.map +1 -0
- package/dist/{chunk-33TPANCR.js → chunk-TFK4KFKA.js} +4 -4
- package/dist/{chunk-6NIB2KGJ.js → chunk-THVIT3PW.js} +22 -22
- package/dist/{chunk-HPPKLBTJ.js → chunk-TJQDL3JH.js} +2 -2
- package/dist/{chunk-FD4Q5KFL.js → chunk-TLL22FFO.js} +2 -2
- package/dist/{chunk-7DU35P5J.js → chunk-TN5T5HRZ.js} +7 -7
- package/dist/{chunk-JK7C5A4I.js → chunk-TR4HIKJ2.js} +8 -8
- package/dist/{chunk-HNYJEAES.js → chunk-UGEWCWVV.js} +3 -3
- 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-AD22P5X3.js → chunk-UUSAOIJR.js} +3 -3
- package/dist/{chunk-Z6DKXQG7.js → chunk-UXXFMF4X.js} +2 -2
- package/dist/{chunk-RGPYMHKI.js → chunk-V3K4RQO7.js} +9 -3
- package/dist/chunk-V3K4RQO7.js.map +1 -0
- package/dist/{chunk-UP4BE32Y.js → chunk-VO6RVVP7.js} +5 -5
- package/dist/{chunk-S4SC5SSV.js → chunk-VPNXQUUS.js} +11 -11
- package/dist/{chunk-7BST7BA6.js → chunk-VW3BBTMA.js} +1 -1
- package/dist/{chunk-CBY5CXBD.js → chunk-VWSFA4LJ.js} +2 -2
- 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-5JEIDFPD.js → chunk-WBPQ7OPC.js} +1 -1
- package/dist/{chunk-GZLLDA6P.js → chunk-WEFN327U.js} +2 -2
- package/dist/{chunk-ANHUMDJX.js → chunk-WNDTLK44.js} +2 -2
- package/dist/{chunk-DLOYMWUQ.js → chunk-WSLPZ43N.js} +7 -7
- package/dist/{chunk-2DS4UOYQ.js → chunk-WSZQNTVN.js} +2 -2
- package/dist/{chunk-LE2EDBXU.js → chunk-WUHB422G.js} +5 -5
- package/dist/{chunk-BJW7G6EF.js → chunk-WVX5AQXS.js} +3 -3
- package/dist/{chunk-5POTDNQT.js → chunk-WWOHORRO.js} +3 -3
- package/dist/{chunk-4W7VISE7.js → chunk-WYDZP5F2.js} +93 -94
- package/dist/chunk-WYDZP5F2.js.map +1 -0
- package/dist/{chunk-KZHW27BV.js → chunk-WYEPUXGL.js} +2 -2
- package/dist/{chunk-GALB2G3W.js → chunk-X2AH4DRF.js} +2 -2
- package/dist/{chunk-NCX5SAQY.js → chunk-XN6CALYY.js} +9 -9
- package/dist/{chunk-SUVEDKE2.js → chunk-XNACICAB.js} +3 -3
- package/dist/{chunk-FDNJVZRE.js → chunk-XU4I47IP.js} +4 -4
- package/dist/chunk-XV6ZYRHK.js +59 -0
- package/dist/chunk-XV6ZYRHK.js.map +1 -0
- 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-U36PO27Q.js → chunk-YG3IJCM2.js} +3 -3
- package/dist/{chunk-UWJ5P5CU.js → chunk-YGSJWWT3.js} +3 -3
- package/dist/{chunk-APU42QDI.js → chunk-YO64YVYL.js} +105 -101
- package/dist/chunk-YO64YVYL.js.map +1 -0
- package/dist/{chunk-P5WABK2H.js → chunk-Z4GJB24B.js} +2 -2
- package/dist/{chunk-NLMTNEWW.js → chunk-Z6E6TUAE.js} +2 -2
- package/dist/{chunk-OBQVTCTW.js → chunk-ZX5H7LWD.js} +2 -2
- package/dist/components/browser-viewer.d.ts +1 -1
- package/dist/composer.js +8 -8
- package/dist/{computer-viewer-KEDVLD42.js → computer-viewer-VA5JONUH.js} +6 -6
- package/dist/connect.js +7 -7
- package/dist/desktop.js +2 -2
- package/dist/editor.js +2 -2
- package/dist/{embedded-new-voice-LFHWWYD2.js → embedded-new-voice-6BILAOUG.js} +6 -6
- package/dist/{embedded-voice-6QS4ANNX.js → embedded-voice-UDE4JRKB.js} +6 -6
- 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 +86 -80
- package/dist/interaction.js +8 -6
- package/dist/interaction.js.map +1 -1
- package/dist/{latest-question-AW3PPDUM.js → latest-question-4WDBECXB.js} +4 -3
- package/dist/{latest-question-AW3PPDUM.js.map → latest-question-4WDBECXB.js.map} +1 -1
- package/dist/machines.js +4 -4
- 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-NRTO6FRP.js} +4 -4
- package/dist/{platform-activity-row-BMXXNZKX.js → platform-activity-row-ENQVIFTL.js} +2 -2
- package/dist/{queue-surface-implementation-2X5AXB6I.js → queue-surface-implementation-H4XSNHZE.js} +8 -6
- package/dist/{queue-surface-implementation-2X5AXB6I.js.map → queue-surface-implementation-H4XSNHZE.js.map} +1 -1
- package/dist/realtime.js +5 -5
- package/dist/{sandbox-files-4FBG3GS2.js → sandbox-files-IEHODU35.js} +9 -9
- package/dist/sandbox-files-IEHODU35.js.map +1 -0
- package/dist/session-app.js +198 -192
- package/dist/session-list-model.d.ts +1 -0
- package/dist/session-list-model.js +7 -1
- 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 +48 -43
- package/dist/session.js +20 -18
- 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-ZSOFW7PG.js} +2 -2
- package/dist/{timeline-annotation-selection-MEHBW676.js → timeline-annotation-selection-YWV2UC34.js} +2 -2
- package/dist/{timeline-annotations-dialog-U2FPQ3UY.js → timeline-annotations-dialog-ZWQVX2HI.js} +3 -3
- package/dist/timeline-model.js +16 -14
- package/dist/ui/access-list.js +7 -7
- package/dist/ui/cadence-picker.js +2 -2
- package/dist/ui/list-row.js +3 -3
- package/dist/ui/revision-history.js +2 -2
- package/dist/ui/role-select.js +3 -3
- package/dist/ui/select-menu.js +2 -2
- package/dist/usage.js +3 -3
- package/dist/workbench.js +4 -4
- 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-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-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-VPK3CV2H.js.map} +0 -0
- /package/dist/{embedded-new-voice-LFHWWYD2.js.map → chat-interactive-block-AMDSW656.js.map} +0 -0
- /package/dist/{chunk-RQDFYQHA.js.map → chunk-25LWDG5D.js.map} +0 -0
- /package/dist/{chunk-U3HSFCON.js.map → chunk-2CKVVAGP.js.map} +0 -0
- /package/dist/{chunk-F6LBGYS6.js.map → chunk-2DL6NJP5.js.map} +0 -0
- /package/dist/{chunk-UHFWF6ZU.js.map → chunk-2FPS5H2D.js.map} +0 -0
- /package/dist/{chunk-TWXIFWBD.js.map → chunk-34EU25RL.js.map} +0 -0
- /package/dist/{chunk-PTGRFAMH.js.map → chunk-3ABPIUCK.js.map} +0 -0
- /package/dist/{chunk-722UO6YQ.js.map → chunk-3PEXVG4D.js.map} +0 -0
- /package/dist/{chunk-N3ZP4IDU.js.map → chunk-45WYYFP6.js.map} +0 -0
- /package/dist/{chunk-HOJGAJAB.js.map → chunk-4MQLGMV2.js.map} +0 -0
- /package/dist/{chunk-L7YURQI2.js.map → chunk-4U4GXWXS.js.map} +0 -0
- /package/dist/{chunk-63VGE4OH.js.map → chunk-5HIOVXOX.js.map} +0 -0
- /package/dist/{chunk-GFUUFM2O.js.map → chunk-5M23GZA2.js.map} +0 -0
- /package/dist/{chunk-RKB2Z457.js.map → chunk-5VGJXWQ2.js.map} +0 -0
- /package/dist/{chunk-I6VUUEXH.js.map → chunk-6AFSZKZA.js.map} +0 -0
- /package/dist/{chunk-FBMU3VK5.js.map → chunk-6DCEDIF6.js.map} +0 -0
- /package/dist/{chunk-4EONHNJU.js.map → chunk-6O4VWKSO.js.map} +0 -0
- /package/dist/{chunk-BSX2R4CW.js.map → chunk-767WCGAX.js.map} +0 -0
- /package/dist/{chunk-7KGKDWWR.js.map → chunk-7HFLYNWN.js.map} +0 -0
- /package/dist/{chunk-OSVHU2WU.js.map → chunk-7IYAHFPE.js.map} +0 -0
- /package/dist/{chunk-4EAF3HSD.js.map → chunk-7J7PZB4S.js.map} +0 -0
- /package/dist/{chunk-OR37STQZ.js.map → chunk-7R2JQHBX.js.map} +0 -0
- /package/dist/{chunk-QM5H4FPT.js.map → chunk-7VN6VC3D.js.map} +0 -0
- /package/dist/{chunk-HWDGJFM4.js.map → chunk-A2E3ZF6N.js.map} +0 -0
- /package/dist/{chunk-4432A3HQ.js.map → chunk-A6T4FGE7.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-46VBQG2D.js.map → chunk-AOUCHCSB.js.map} +0 -0
- /package/dist/{chunk-HDHK3SXK.js.map → chunk-AT4K4F6S.js.map} +0 -0
- /package/dist/{chunk-HRJQAFKR.js.map → chunk-AX6YJA5U.js.map} +0 -0
- /package/dist/{chunk-HO5Y2OOX.js.map → chunk-BLPXOHG6.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-AOLE4IRZ.js.map → chunk-C535KSTY.js.map} +0 -0
- /package/dist/{chunk-IVOA3DXA.js.map → chunk-CB574ERL.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-NYZQ7LO7.js.map → chunk-CDUDKETD.js.map} +0 -0
- /package/dist/{chunk-JTN3T4QN.js.map → chunk-D3RK3NGM.js.map} +0 -0
- /package/dist/{chunk-IOKSNX74.js.map → chunk-D5OWJZQR.js.map} +0 -0
- /package/dist/{chunk-XWWXIZFP.js.map → chunk-DFXZYNTX.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-KWKGBGAF.js.map → chunk-DKCX643S.js.map} +0 -0
- /package/dist/{chunk-HQG4SLTE.js.map → chunk-DYJGYGPB.js.map} +0 -0
- /package/dist/{chunk-GTQ3SNEI.js.map → chunk-E36IC3LU.js.map} +0 -0
- /package/dist/{chunk-72J6C2AJ.js.map → chunk-EMCB6XKU.js.map} +0 -0
- /package/dist/{chunk-3AA6RNGE.js.map → chunk-ENS6E4RZ.js.map} +0 -0
- /package/dist/{chunk-AG7VGUIW.js.map → chunk-ERG355NM.js.map} +0 -0
- /package/dist/{chunk-TSBE4KOQ.js.map → chunk-EWL6NDOO.js.map} +0 -0
- /package/dist/{chunk-HTT3FB7T.js.map → chunk-F3FN6DO6.js.map} +0 -0
- /package/dist/{chunk-ST22GONV.js.map → chunk-FB3B45FP.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-4VKA5O7T.js.map → chunk-FVL4B552.js.map} +0 -0
- /package/dist/{chunk-VP62LPLW.js.map → chunk-G2BX56CN.js.map} +0 -0
- /package/dist/{chunk-CSHBR2IZ.js.map → chunk-GDLDBR6B.js.map} +0 -0
- /package/dist/{chunk-PN66T6JA.js.map → chunk-GFSOXB2K.js.map} +0 -0
- /package/dist/{chunk-S4EZ3JUB.js.map → chunk-GZGQHQI7.js.map} +0 -0
- /package/dist/{chunk-BXRIQZAH.js.map → chunk-HNNM2GDN.js.map} +0 -0
- /package/dist/{chunk-EU6XSQFM.js.map → chunk-HPB4KSV3.js.map} +0 -0
- /package/dist/{chunk-QCD5Y7K5.js.map → chunk-HSQRYJ4P.js.map} +0 -0
- /package/dist/{chunk-YXOKAG66.js.map → chunk-HUXDGWAN.js.map} +0 -0
- /package/dist/{chunk-VUHPA3XQ.js.map → chunk-I66ZB6KD.js.map} +0 -0
- /package/dist/{chunk-7CZTKBTI.js.map → chunk-IC7KNOBB.js.map} +0 -0
- /package/dist/{chunk-HGMWMK5K.js.map → chunk-IIO2MR3B.js.map} +0 -0
- /package/dist/{chunk-L6RXRRN3.js.map → chunk-ILDOW2IQ.js.map} +0 -0
- /package/dist/{chunk-O756O2I7.js.map → chunk-IPPVX5GF.js.map} +0 -0
- /package/dist/{chunk-X7ASQHR6.js.map → chunk-IUK5QGP5.js.map} +0 -0
- /package/dist/{chunk-PIVGX42P.js.map → chunk-JNY5MT3I.js.map} +0 -0
- /package/dist/{chunk-DDK4WFJ3.js.map → chunk-JWN7SLTO.js.map} +0 -0
- /package/dist/{chunk-Q35YZVDZ.js.map → chunk-KFWVBTUH.js.map} +0 -0
- /package/dist/{chunk-JXT5QDJC.js.map → chunk-KNFDWNCH.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-RSNYGEVZ.js.map → chunk-LKJ2C7PH.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-GAIM5RNE.js.map → chunk-MJQBC7C5.js.map} +0 -0
- /package/dist/{chunk-NWZW2WHN.js.map → chunk-MM7OKOTE.js.map} +0 -0
- /package/dist/{chunk-FM4OUCC2.js.map → chunk-MOKYT3X3.js.map} +0 -0
- /package/dist/{chunk-XRRSFQEV.js.map → chunk-NAZZLAWX.js.map} +0 -0
- /package/dist/{chunk-XOFUXMPP.js.map → chunk-ND2WCWXI.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-OO2T63BY.js.map → chunk-NML44AW2.js.map} +0 -0
- /package/dist/{chunk-4LKNIGHB.js.map → chunk-O2SBHS2N.js.map} +0 -0
- /package/dist/{chunk-RA3FNMWF.js.map → chunk-O4DYOSOL.js.map} +0 -0
- /package/dist/{chunk-ZKYYZH6L.js.map → chunk-OFB6TUDC.js.map} +0 -0
- /package/dist/{chunk-DWPOQ3S5.js.map → chunk-OTMWHZBY.js.map} +0 -0
- /package/dist/{chunk-VVCDB2T7.js.map → chunk-PCJLH45G.js.map} +0 -0
- /package/dist/{chunk-WSMYOLHG.js.map → chunk-PEKPWK5M.js.map} +0 -0
- /package/dist/{chunk-PZ24CYDO.js.map → chunk-PFAUGEV5.js.map} +0 -0
- /package/dist/{chunk-KTRKZRID.js.map → chunk-PKEKZ2VA.js.map} +0 -0
- /package/dist/{chunk-6JKZILLF.js.map → chunk-PMD7V4N7.js.map} +0 -0
- /package/dist/{chunk-B74GSYR6.js.map → chunk-PUTS4DYW.js.map} +0 -0
- /package/dist/{chunk-ZRJCGBVV.js.map → chunk-PVR5EELP.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-FLGUVRR7.js.map → chunk-QBADR2FO.js.map} +0 -0
- /package/dist/{chunk-TGVVEGZG.js.map → chunk-QLIDZGPV.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-6PQNLL4E.js.map → chunk-R7XCJWCD.js.map} +0 -0
- /package/dist/{chunk-QRVNI5V6.js.map → chunk-SCNEQFIW.js.map} +0 -0
- /package/dist/{chunk-BNUPYHHZ.js.map → chunk-SD4PPZFB.js.map} +0 -0
- /package/dist/{chunk-ROQOVH4N.js.map → chunk-SFAU5R5S.js.map} +0 -0
- /package/dist/{chunk-R63QEVPK.js.map → chunk-SJORXXLV.js.map} +0 -0
- /package/dist/{chunk-FBE6AIIW.js.map → chunk-SOKNCW5U.js.map} +0 -0
- /package/dist/{chunk-NDF3SH3X.js.map → chunk-TDIOBPLA.js.map} +0 -0
- /package/dist/{chunk-33TPANCR.js.map → chunk-TFK4KFKA.js.map} +0 -0
- /package/dist/{chunk-6NIB2KGJ.js.map → chunk-THVIT3PW.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-7DU35P5J.js.map → chunk-TN5T5HRZ.js.map} +0 -0
- /package/dist/{chunk-JK7C5A4I.js.map → chunk-TR4HIKJ2.js.map} +0 -0
- /package/dist/{chunk-HNYJEAES.js.map → chunk-UGEWCWVV.js.map} +0 -0
- /package/dist/{chunk-H5EVWF6L.js.map → chunk-UNNJUJVD.js.map} +0 -0
- /package/dist/{chunk-AD22P5X3.js.map → chunk-UUSAOIJR.js.map} +0 -0
- /package/dist/{chunk-Z6DKXQG7.js.map → chunk-UXXFMF4X.js.map} +0 -0
- /package/dist/{chunk-UP4BE32Y.js.map → chunk-VO6RVVP7.js.map} +0 -0
- /package/dist/{chunk-S4SC5SSV.js.map → chunk-VPNXQUUS.js.map} +0 -0
- /package/dist/{chunk-7BST7BA6.js.map → chunk-VW3BBTMA.js.map} +0 -0
- /package/dist/{chunk-CBY5CXBD.js.map → chunk-VWSFA4LJ.js.map} +0 -0
- /package/dist/{chunk-QEJTQTF5.js.map → chunk-W6T5HR3Z.js.map} +0 -0
- /package/dist/{chunk-5JEIDFPD.js.map → chunk-WBPQ7OPC.js.map} +0 -0
- /package/dist/{chunk-GZLLDA6P.js.map → chunk-WEFN327U.js.map} +0 -0
- /package/dist/{chunk-ANHUMDJX.js.map → chunk-WNDTLK44.js.map} +0 -0
- /package/dist/{chunk-DLOYMWUQ.js.map → chunk-WSLPZ43N.js.map} +0 -0
- /package/dist/{chunk-2DS4UOYQ.js.map → chunk-WSZQNTVN.js.map} +0 -0
- /package/dist/{chunk-LE2EDBXU.js.map → chunk-WUHB422G.js.map} +0 -0
- /package/dist/{chunk-BJW7G6EF.js.map → chunk-WVX5AQXS.js.map} +0 -0
- /package/dist/{chunk-5POTDNQT.js.map → chunk-WWOHORRO.js.map} +0 -0
- /package/dist/{chunk-KZHW27BV.js.map → chunk-WYEPUXGL.js.map} +0 -0
- /package/dist/{chunk-GALB2G3W.js.map → chunk-X2AH4DRF.js.map} +0 -0
- /package/dist/{chunk-NCX5SAQY.js.map → chunk-XN6CALYY.js.map} +0 -0
- /package/dist/{chunk-SUVEDKE2.js.map → chunk-XNACICAB.js.map} +0 -0
- /package/dist/{chunk-FDNJVZRE.js.map → chunk-XU4I47IP.js.map} +0 -0
- /package/dist/{chunk-U36PO27Q.js.map → chunk-YG3IJCM2.js.map} +0 -0
- /package/dist/{chunk-UWJ5P5CU.js.map → chunk-YGSJWWT3.js.map} +0 -0
- /package/dist/{chunk-P5WABK2H.js.map → chunk-Z4GJB24B.js.map} +0 -0
- /package/dist/{chunk-NLMTNEWW.js.map → chunk-Z6E6TUAE.js.map} +0 -0
- /package/dist/{chunk-OBQVTCTW.js.map → chunk-ZX5H7LWD.js.map} +0 -0
- /package/dist/{embedded-voice-6QS4ANNX.js.map → computer-viewer-VA5JONUH.js.map} +0 -0
- /package/dist/{model-policy-picker-menu-CURJ247L.js.map → embedded-new-voice-6BILAOUG.js.map} +0 -0
- /package/dist/{sandbox-files-4FBG3GS2.js.map → embedded-voice-UDE4JRKB.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-NRTO6FRP.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-ZSOFW7PG.js.map} +0 -0
- /package/dist/{timeline-annotation-selection-MEHBW676.js.map → timeline-annotation-selection-YWV2UC34.js.map} +0 -0
- /package/dist/{timeline-annotations-dialog-U2FPQ3UY.js.map → timeline-annotations-dialog-ZWQVX2HI.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/app/lib/sessions-group.tsx"],"sourcesContent":["// Pure helpers behind the rail's session list: relative-time labels, recency\n// bucketing (Today / Yesterday / Previous 7 days / Older), and the ordering\n// rule — RUNNING sessions pinned to the very top, then most-recent activity\n// first within each recency group.\nimport { t } from \"./console-text\";\nimport { formatWaitingSince } from \"./format\";\nimport { awaitsPerson } from \"./needs-you\";\nimport { sessionInputWait } from \"./session-rail\";\nimport { sessionSiteOrigin, type SessionSiteOrigin } from \"./session-site-origin\";\nimport type { SessionListTotals } from \"@opengeni/sdk\";\nimport type { RailSession as Session } from \"./session-list-entry\";\n\n// The flat list rules are shared with native renderers through the pure\n// session-list model; the rail-only forest, project and browse logic stays here.\nimport {\n compareSessionActivity,\n hasActiveEffectiveControl,\n isEffectivelyRunning,\n partitionPinnedSessions,\n recencyGroupFor,\n SESSION_GROUP_LABELS,\n SESSION_GROUP_ORDER,\n sessionActivityTime,\n type SessionRecencyGroup,\n} from \"../../session-list-model\";\n\nexport {\n compareSessionActivity,\n compareSessionPins,\n groupSessionsForRail,\n isRunningStatus,\n partitionPinnedSessions,\n recencyGroupFor,\n relativeTimeLabel,\n SESSION_GROUP_LABELS,\n SESSION_GROUP_ORDER,\n sessionActivityTime,\n type GroupedSessions,\n type SessionRecencyBucket,\n type SessionRecencyGroup,\n} from \"../../session-list-model\";\n\n/* ----------------------------------------------------------------------------\n Lineage nesting for the rail\n\n The rail nests spawned worker sessions under the manager that spawned them\n (parentSessionId). A session is a ROOT in the rail when it has no parent OR\n its parent isn't in the loaded page (an orphan child renders at the root, as\n before). Roots are pinned/bucketed exactly like the flat list — but a root\n counts as \"running\" when it OR any descendant is active, so a manager whose\n only activity is a live child still floats to the top.\n -------------------------------------------------------------------------- */\n\nexport type SessionTreeNode = {\n /** Presentation-only group; never persisted or used for session actions. */\n siteGroup?: SessionSiteOrigin | undefined;\n session: Session;\n children: SessionTreeNode[];\n /** A descendant (any depth, not the node itself) is running/queued/awaiting action. */\n hasActiveDescendant: boolean;\n};\n\nexport type RailAggregateStatusKind =\n | \"send_failed\"\n | \"needs_attention\"\n | \"failed\"\n | \"active\"\n | \"queued\"\n | \"waiting\"\n | \"unread\"\n | \"active_work\"\n | \"neutral\";\n\nexport type RailAggregateStatus = {\n kind: RailAggregateStatusKind;\n /** Number of sessions represented by the winning status. */\n count: number;\n /** Total sessions represented by the node or section. */\n total: number;\n label: string;\n /**\n * `needs_attention` only: when the longest-waiting represented session\n * entered `requires_action` (the earliest known `requiresActionSince` /\n * `treeStats.attentionSince`). Absent when no server reported it.\n */\n attentionSince?: string | undefined;\n};\n\nexport type RailStatusCounts = {\n total: number;\n sendFailed: number;\n attention: number;\n /** Earliest known requires_action entry across the counted `attention` sessions. */\n attentionSince: string | null;\n failed: number;\n active: number;\n queued: number;\n /** Idle sessions parked on their own wake-up (input or timer), not executing. */\n waiting: number;\n unread: number;\n activeWork: number;\n};\n\n/** Complete ordinary project counters; absent groups are authoritative zeroes. */\nexport function sessionProjectTotals(\n totals: SessionListTotals,\n channelIds: readonly string[],\n): Map<string | null, RailStatusCounts> {\n const known = new Set(channelIds);\n const zero = (): RailStatusCounts => ({\n total: 0,\n sendFailed: 0,\n attention: 0,\n attentionSince: null,\n failed: 0,\n active: 0,\n queued: 0,\n waiting: 0,\n unread: 0,\n activeWork: 0,\n });\n const result = new Map<string | null, RailStatusCounts>([\n ...channelIds.map((id) => [id, zero()] as const),\n [null, zero()],\n ]);\n for (const group of totals.groups) {\n const id = group.channelId && known.has(group.channelId) ? group.channelId : null;\n // Server `active` includes input waits for older clients; split them out.\n const waiting = Math.min(group.waiting ?? 0, group.active);\n addRailStatusCounts(result.get(id)!, {\n ...group,\n active: group.active - waiting,\n waiting,\n sendFailed: 0,\n });\n }\n return result;\n}\n\nfunction earliestIso(a: string | null | undefined, b: string | null | undefined): string | null {\n if (!a) return b ?? null;\n if (!b) return a;\n return Date.parse(b) < Date.parse(a) ? b : a;\n}\n\nfunction ownRailStatusCounts(\n session: Session,\n localDeliveryAttention: ReadonlyMap<string, number>,\n): RailStatusCounts {\n return {\n total: 1,\n sendFailed: localDeliveryAttention.get(session.id) ?? 0,\n attention: awaitsPerson(session) ? 1 : 0,\n attentionSince: awaitsPerson(session) ? (session.requiresActionSince ?? null) : null,\n // Failed is a review signal in the rail, not a permanent copy of the\n // lifecycle badge. Opening the session (or a parent agent consuming its\n // result) acknowledges the failure together with the unread frontier.\n failed: session.status === \"failed\" && session.unread ? 1 : 0,\n active:\n hasActiveEffectiveControl(session) &&\n (session.status === \"running\" || session.status === \"recovering\")\n ? 1\n : 0,\n queued:\n hasActiveEffectiveControl(session) &&\n (session.status === \"queued\" || session.status === \"waiting_capacity\")\n ? 1\n : 0,\n waiting: sessionInputWait(session) ? 1 : 0,\n unread: session.unread ? 1 : 0,\n activeWork: session.activelyWorking ? 1 : 0,\n };\n}\n\nfunction addRailStatusCounts(target: RailStatusCounts, source: RailStatusCounts): void {\n target.total += source.total;\n target.sendFailed += source.sendFailed;\n target.attention += source.attention;\n target.attentionSince = earliestIso(target.attentionSince, source.attentionSince);\n target.failed += source.failed;\n target.active += source.active;\n target.queued += source.queued;\n target.waiting += source.waiting;\n target.unread += source.unread;\n target.activeWork += source.activeWork;\n}\n\nfunction railStatusCounts(\n node: SessionTreeNode,\n localDeliveryAttention: ReadonlyMap<string, number>,\n): RailStatusCounts {\n if (node.siteGroup) {\n const counts = ownRailStatusCounts(node.session, localDeliveryAttention);\n for (const key of [\n \"total\",\n \"sendFailed\",\n \"attention\",\n \"failed\",\n \"active\",\n \"queued\",\n \"waiting\",\n \"unread\",\n \"activeWork\",\n ] as const)\n counts[key] = 0;\n counts.attentionSince = null;\n for (const child of node.children)\n addRailStatusCounts(counts, railStatusCounts(child, localDeliveryAttention));\n return counts;\n }\n const counts = ownRailStatusCounts(node.session, localDeliveryAttention);\n const stats = node.session.treeStats;\n if (stats) {\n counts.total += stats.totalDescendants;\n counts.attention += stats.attentionDescendants;\n counts.attentionSince = earliestIso(counts.attentionSince, stats.attentionSince);\n counts.failed += stats.unreadFailedDescendants ?? stats.failedDescendants;\n counts.active += stats.runningDescendants;\n counts.queued += stats.queuedDescendants;\n counts.waiting += stats.waitingDescendants ?? 0;\n counts.unread += stats.unreadDescendants ?? 0;\n counts.activeWork += stats.activelyWorkingDescendants ?? 0;\n\n // Scheduled-task grouping appends older root runs as synthetic children of\n // the newest run. They are not part of that run's server treeStats, unlike\n // ordinary spawned children, so include only those extra roots here.\n for (const child of node.children) {\n if (child.session.parentSessionId !== node.session.id) {\n addRailStatusCounts(counts, railStatusCounts(child, localDeliveryAttention));\n } else {\n counts.sendFailed += loadedLocalDeliveryFailureCount(child, localDeliveryAttention);\n }\n }\n } else {\n for (const child of node.children) {\n addRailStatusCounts(counts, railStatusCounts(child, localDeliveryAttention));\n }\n }\n return counts;\n}\n\n/**\n * Durable treeStats already account for ordinary descendants' lifecycle state,\n * but browser-local delivery failures have no server aggregate. Fold only that\n * local fact through the loaded child tree so collapsed parents stay truthful.\n */\nfunction loadedLocalDeliveryFailureCount(\n node: SessionTreeNode,\n localDeliveryAttention: ReadonlyMap<string, number>,\n): number {\n return (\n (localDeliveryAttention.get(node.session.id) ?? 0) +\n node.children.reduce(\n (total, child) => total + loadedLocalDeliveryFailureCount(child, localDeliveryAttention),\n 0,\n )\n );\n}\n\n/** One status for a collapsed parent or workstream, including all descendants. */\nexport function summarizeRailNodes(\n nodes: readonly SessionTreeNode[],\n localDeliveryAttention: ReadonlyMap<string, number> = new Map(),\n now: Date = new Date(),\n): RailAggregateStatus {\n const counts: RailStatusCounts = {\n total: 0,\n sendFailed: 0,\n attention: 0,\n attentionSince: null,\n failed: 0,\n active: 0,\n queued: 0,\n waiting: 0,\n unread: 0,\n activeWork: 0,\n };\n for (const node of nodes) {\n addRailStatusCounts(counts, railStatusCounts(node, localDeliveryAttention));\n }\n\n return summarizeRailStatusCounts(counts, now);\n}\n\n/** Shared presentation for complete server metadata and loaded node summaries. */\nexport function summarizeRailStatusCounts(\n counts: RailStatusCounts,\n now: Date = new Date(),\n): RailAggregateStatus {\n if (counts.sendFailed > 0) {\n return {\n kind: \"send_failed\",\n count: counts.sendFailed,\n total: counts.total,\n label: `${counts.sendFailed} message${counts.sendFailed === 1 ? \"\" : \"s\"} not sent`,\n };\n }\n\n if (counts.attention > 0) {\n // \"2 need you · 10h\": how long the longest-waiting one has been blocked on\n // a human, so a parked child is never silent in a collapsed parent row.\n const waiting = counts.attentionSince ? formatWaitingSince(counts.attentionSince, now) : \"\";\n return {\n kind: \"needs_attention\",\n count: counts.attention,\n total: counts.total,\n label: `${counts.attention} need${counts.attention === 1 ? \"s\" : \"\"} you${\n waiting ? ` · ${waiting}` : \"\"\n }`,\n ...(counts.attentionSince ? { attentionSince: counts.attentionSince } : {}),\n };\n }\n if (counts.failed > 0) {\n return {\n kind: \"failed\",\n count: counts.failed,\n total: counts.total,\n label: `${counts.failed} failed`,\n };\n }\n if (counts.active > 0) {\n return {\n kind: \"active\",\n count: counts.active,\n total: counts.total,\n label: `${counts.active} working`,\n };\n }\n if (counts.queued > 0) {\n return {\n kind: \"queued\",\n count: counts.queued,\n total: counts.total,\n label: `${counts.queued} waiting to run`,\n };\n }\n if (counts.waiting > 0) {\n return {\n kind: \"waiting\",\n count: counts.waiting,\n total: counts.total,\n label: `${counts.waiting} waiting to resume`,\n };\n }\n if (counts.unread > 0) {\n return {\n kind: \"unread\",\n count: counts.unread,\n total: counts.total,\n label: `${counts.unread} unread`,\n };\n }\n if (counts.activeWork > 0) {\n return {\n kind: \"active_work\",\n count: counts.activeWork,\n total: counts.total,\n label: `${counts.activeWork} actively working`,\n };\n }\n return {\n kind: \"neutral\",\n count: 0,\n total: counts.total,\n label: counts.total > 0 ? \"Read\" : \"Empty\",\n };\n}\n\n/**\n * Merge two projections of the same session for the rail. Detail/SSE data is\n * fresher for lifecycle fields, but detail reads intentionally omit treeStats.\n * An omitted list-only field must not make the selected row forget its loaded\n * hierarchy summary (and therefore lose its disclosure control).\n */\nexport function mergeSessionForRail<T extends Session>(current: Session, incoming: T): T {\n if (incoming.treeStats !== undefined || current.treeStats === undefined) {\n return incoming;\n }\n return { ...incoming, treeStats: current.treeStats };\n}\n\nexport type SessionForest = {\n running: SessionTreeNode[];\n grouped: {\n group: string;\n label: string;\n sessions: SessionTreeNode[];\n }[];\n};\n\nexport type SessionBrowseGroupBy = \"activity\" | \"project\" | \"none\" | \"created\" | \"creator\";\nexport type SessionBrowseSortBy = \"updatedAt\" | \"createdAt\" | \"name\";\n\nconst sessionNameEncoder = new TextEncoder();\nfunction sessionNameSortKey(title: string | null | undefined): Uint8Array {\n return sessionNameEncoder.encode(\n (title ?? \"\").replace(/^ +| +$/g, \"\").replace(/[A-Z]/g, (letter) => letter.toLowerCase()),\n );\n}\n\nfunction sessionSortMicroseconds(value: string): number {\n const fraction = value.match(/\\.(\\d+)(?:Z|[+-]\\d{2}:\\d{2})$/)?.[1] ?? \"\";\n return Number(fraction.padEnd(6, \"0\").slice(3, 6));\n}\n\n/** The same ordering as the server page, reapplied after live projection merges. */\nexport function compareSessionBrowse(\n left: Session,\n right: Session,\n sortBy: SessionBrowseSortBy,\n): number {\n if (sortBy === \"name\") {\n const a = sessionNameSortKey(left.title);\n const b = sessionNameSortKey(right.title);\n for (let index = 0; index < Math.min(a.length, b.length); index += 1) {\n if (a[index] !== b[index]) return a[index]! - b[index]!;\n }\n return a.length - b.length || left.id.localeCompare(right.id);\n }\n return (\n Date.parse(right[sortBy]) - Date.parse(left[sortBy]) ||\n sessionSortMicroseconds(right[sortBy]) - sessionSortMicroseconds(left[sortBy]) ||\n right.id.localeCompare(left.id)\n );\n}\n\nexport function sortSessionForest(\n forest: SessionForest,\n sortBy: SessionBrowseSortBy,\n): SessionForest {\n const sortNodes = (nodes: SessionTreeNode[]): SessionTreeNode[] =>\n nodes\n .map((node) => ({ ...node, children: sortNodes(node.children) }))\n .sort((a, b) => compareSessionBrowse(a.session, b.session, sortBy));\n return {\n running: sortNodes(forest.running),\n grouped: forest.grouped.map((bucket) => ({\n ...bucket,\n sessions: sortNodes(bucket.sessions),\n })),\n };\n}\nexport type SessionBrowseDateField = \"activity\" | \"created\";\nexport type SessionBrowseDateRange = \"any\" | \"today\" | \"week\" | \"month\";\n\nexport function sessionCreatorKey(session: Session): string {\n return `${session.createdBy.kind}:${session.createdBy.subjectId}`;\n}\n\nexport function sessionCreatorLabel(session: Session): string {\n const explicit = session.createdBy.label?.trim();\n if (explicit) return explicit;\n if (session.createdBy.subjectId === \"unattributed-legacy\") return \"Unattributed\";\n if (session.createdBy.kind === \"service\") {\n return `Service · ${session.createdBy.subjectId}`;\n }\n return session.createdBy.subjectId;\n}\n\nexport type SessionCreatorOption = {\n value: string;\n label: string;\n};\n\n/**\n * Loaded creator choices with identity-specific labels only when frozen display\n * labels collide. The subject ID remains opaque; it is displayed, not parsed.\n */\nexport function sessionCreatorLabelMap(sessions: Session[]): ReadonlyMap<string, string> {\n const byKey = new Map<\n string,\n { label: string; kind: Session[\"createdBy\"][\"kind\"]; subjectId: string }\n >();\n for (const session of sessions) {\n byKey.set(sessionCreatorKey(session), {\n label: sessionCreatorLabel(session),\n kind: session.createdBy.kind,\n subjectId: session.createdBy.subjectId,\n });\n }\n\n const labelCounts = new Map<string, number>();\n for (const creator of byKey.values()) {\n labelCounts.set(creator.label, (labelCounts.get(creator.label) ?? 0) + 1);\n }\n\n return new Map(\n [...byKey.entries()]\n .map(([value, creator]) => ({\n value,\n label:\n labelCounts.get(creator.label) === 1\n ? creator.label\n : `${creator.label} · ${creator.kind === \"service\" ? \"Service\" : \"Subject\"} · ${creator.subjectId}`,\n }))\n .sort(\n (left, right) =>\n left.label.localeCompare(right.label) || left.value.localeCompare(right.value),\n )\n .map((creator) => [creator.value, creator.label]),\n );\n}\n\nexport function sessionCreatorOptions(sessions: Session[]): SessionCreatorOption[] {\n return [...sessionCreatorLabelMap(sessions)].map(([value, label]) => ({ value, label }));\n}\n\n/** Drop a flat-search creator selection that is not valid for hierarchical browse roots. */\nexport function normalizeSessionBrowseCreator(\n creator: string | null,\n creatorLabels: ReadonlyMap<string, string>,\n hierarchical: boolean,\n): string | null {\n if (!hierarchical || !creator || creatorLabels.has(creator)) return creator;\n return null;\n}\n\n/** Count matching rows in flat search, or matching workstream roots in hierarchical browse. */\nexport function sessionBrowseResultCount(\n sessions: readonly Session[],\n hierarchical: boolean,\n): number {\n if (!hierarchical) return sessions.length;\n const loadedIds = new Set(sessions.map((session) => session.id));\n return sessions.filter(\n (session) => !session.parentSessionId || !loadedIds.has(session.parentSessionId),\n ).length;\n}\n\nfunction browseTimestamp(session: Session, field: SessionBrowseDateField): number {\n if (field === \"activity\") return sessionActivityTime(session);\n const created = Date.parse(session.createdAt);\n return Number.isNaN(created) ? 0 : created;\n}\n\nexport function filterSessionsForBrowse<T extends Session>(\n sessions: T[],\n options: {\n creator: string | null;\n dateField: SessionBrowseDateField;\n dateRange: SessionBrowseDateRange;\n /** Filter whole loaded workstreams by their root instead of orphaning descendants. */\n hierarchical?: boolean | undefined;\n now?: Date | undefined;\n },\n): T[] {\n const now = options.now ?? new Date();\n const startOfToday = new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime();\n const threshold =\n options.dateRange === \"today\"\n ? startOfToday\n : options.dateRange === \"week\"\n ? startOfToday - 6 * 24 * 60 * 60 * 1000\n : options.dateRange === \"month\"\n ? startOfToday - 29 * 24 * 60 * 60 * 1000\n : null;\n const matches = (session: T): boolean =>\n (!options.creator || sessionCreatorKey(session) === options.creator) &&\n (threshold === null || browseTimestamp(session, options.dateField) >= threshold);\n if (!options.hierarchical) return sessions.filter(matches);\n\n const byId = new Map(sessions.map((session) => [session.id, session]));\n const rootById = new Map<string, T>();\n const hierarchyRoot = (session: T): T => {\n const cached = rootById.get(session.id);\n if (cached) return cached;\n\n const path: T[] = [];\n const seen = new Set<string>();\n let current = session;\n while (current.parentSessionId) {\n if (seen.has(current.id)) {\n // A pathological cycle has no meaningful root. Fall back to direct\n // row filtering so every member stays independently reachable.\n return session;\n }\n seen.add(current.id);\n path.push(current);\n const parent = byId.get(current.parentSessionId);\n if (!parent) break;\n current = parent;\n }\n rootById.set(current.id, current);\n for (const member of path) rootById.set(member.id, current);\n return current;\n };\n\n return sessions.filter((session) => matches(hierarchyRoot(session)));\n}\n\n/** Regroup already-built workstream roots without flattening their descendants. */\nexport function groupSessionForestForBrowse(\n forest: SessionForest,\n groupBy: Exclude<SessionBrowseGroupBy, \"activity\">,\n options: {\n now?: Date | undefined;\n creatorLabels?: ReadonlyMap<string, string> | undefined;\n } = {},\n): SessionForest {\n const now = options.now ?? new Date();\n const roots = forestRoots(forest);\n if (groupBy === \"none\" || groupBy === \"project\") {\n return { running: [], grouped: [{ group: \"none\", label: \"Sessions\", sessions: roots }] };\n }\n const running = roots\n .filter(nodeIsActive)\n .sort((left, right) => compareSessionActivity(left.session, right.session));\n const rest = roots.filter((node) => !nodeIsActive(node));\n if (groupBy === \"created\") {\n const buckets = new Map<SessionRecencyGroup, SessionTreeNode[]>();\n for (const node of rest) {\n const group = recencyGroupFor(browseTimestamp(node.session, \"created\"), now);\n const list = buckets.get(group) ?? [];\n list.push(node);\n buckets.set(group, list);\n }\n return {\n running,\n grouped: SESSION_GROUP_ORDER.flatMap((group) => {\n const list = buckets.get(group);\n if (!list?.length) return [];\n const label =\n group === \"today\"\n ? \"Created today\"\n : group === \"yesterday\"\n ? \"Created yesterday\"\n : group === \"previous7\"\n ? \"Created in previous 7 days\"\n : \"Created earlier\";\n return [\n {\n group: `created:${group}`,\n label,\n sessions: list.sort(\n (left, right) =>\n browseTimestamp(right.session, \"created\") -\n browseTimestamp(left.session, \"created\") ||\n right.session.id.localeCompare(left.session.id),\n ),\n },\n ];\n }),\n };\n }\n\n const creatorLabels =\n options.creatorLabels ?? sessionCreatorLabelMap(roots.map((node) => node.session));\n const creators = new Map<string, { label: string; sessions: SessionTreeNode[] }>();\n for (const node of rest) {\n const key = sessionCreatorKey(node.session);\n const bucket = creators.get(key) ?? {\n label: creatorLabels.get(key) ?? sessionCreatorLabel(node.session),\n sessions: [],\n };\n bucket.sessions.push(node);\n creators.set(key, bucket);\n }\n return {\n running,\n grouped: [...creators.entries()]\n .sort(([, left], [, right]) => left.label.localeCompare(right.label))\n .map(([key, bucket]) => ({\n group: `creator:${key}`,\n label: bucket.label,\n sessions: bucket.sessions.sort((left, right) =>\n compareSessionActivity(left.session, right.session),\n ),\n })),\n };\n}\n\n/** Build and regroup a loaded session set while preserving its lineage tree. */\nexport function groupSessionsForBrowse(\n sessions: Session[],\n groupBy: Exclude<SessionBrowseGroupBy, \"activity\">,\n options: {\n now?: Date | undefined;\n creatorLabels?: ReadonlyMap<string, string> | undefined;\n } = {},\n): SessionForest {\n return groupSessionForestForBrowse(buildRailForest(sessions, options.now), groupBy, options);\n}\n\nexport type PinnedRailSections = {\n /** Complete loaded hierarchy, used for expansion and lineage lookups. */\n complete: SessionForest;\n /** Every explicit pin is an independently ordered shortcut root. */\n pinned: SessionTreeNode[];\n /** The ordinary hierarchy with every pin-owned subtree removed. */\n ordinary: SessionForest;\n};\n\n/** Whether the node's own status, or any descendant, is in a live state. */\nexport function nodeIsActive(node: SessionTreeNode): boolean {\n const stats = node.session.treeStats;\n const summarizedActive = Boolean(\n stats &&\n stats.runningDescendants +\n stats.queuedDescendants +\n (stats.waitingDescendants ?? 0) +\n stats.attentionDescendants >\n 0,\n );\n return isEffectivelyRunning(node.session) || node.hasActiveDescendant || summarizedActive;\n}\n\n/** Bucket already-built roots using the rail's activity and recency rules. */\n/**\n * The scheduled task a session was created for, or null. The worker stamps this\n * onto every session it generates for a run; it is deliberately read from\n * metadata rather than a column, because that is where the scheduler writes it.\n * A session a human started never carries the key, so it never groups.\n */\nexport function scheduledTaskIdOf(session: Session): string | null {\n if (\"scheduledTaskId\" in session) return session.scheduledTaskId;\n const value = (session.metadata as Record<string, unknown> | undefined)?.scheduledTaskId;\n return typeof value === \"string\" && value.length > 0 ? value : null;\n}\n\n/**\n * Collapse repeat runs of one scheduled task into a single rail entry.\n *\n * A schedule that fires hourly would otherwise push every other session out of\n * the rail, so runs of the same task fold together. This deliberately does NOT\n * introduce a scheduled-task row type: the newest run IS the entry, and the\n * older runs become its children, so the group renders and behaves exactly like\n * an ordinary session with spawned children. Clicking it opens the latest run,\n * expanding it reveals the rest, and each one stays individually openable.\n *\n * A task with a single run is left completely alone - one session is not a\n * flood, and wrapping it would only add a disclosure with nothing behind it.\n *\n * `roots` arrives running-first-then-recency, not purely newest-first, so the\n * members are re-sorted by activity here: the umbrella must be the latest run,\n * and the runs behind it must read newest to oldest. The group keeps the list\n * position of whichever member ranked highest in the incoming order, so folding\n * never pushes a live run down the rail.\n */\nexport function groupScheduledRuns(roots: SessionTreeNode[]): SessionTreeNode[] {\n const membersByTask = new Map<string, SessionTreeNode[]>();\n for (const node of roots) {\n const taskId = scheduledTaskIdOf(node.session);\n if (!taskId) continue;\n const members = membersByTask.get(taskId) ?? [];\n members.push(node);\n membersByTask.set(taskId, members);\n }\n for (const members of membersByTask.values()) {\n members.sort((left, right) => compareSessionActivity(left.session, right.session));\n }\n const grouped: SessionTreeNode[] = [];\n const emitted = new Set<string>();\n for (const node of roots) {\n const taskId = scheduledTaskIdOf(node.session);\n const members = taskId ? (membersByTask.get(taskId) ?? []) : [];\n if (members.length < 2) {\n grouped.push(node);\n continue;\n }\n if (emitted.has(taskId!)) continue;\n emitted.add(taskId!);\n const [latestRun, ...olderRuns] = members as [SessionTreeNode, ...SessionTreeNode[]];\n grouped.push({\n ...latestRun,\n // The latest run's own spawned children stay first; previous runs follow,\n // so a subagent of the latest run never sorts below an older run.\n children: [...latestRun.children, ...olderRuns],\n hasActiveDescendant:\n latestRun.hasActiveDescendant ||\n olderRuns.some((run) => nodeIsActive(run) || run.hasActiveDescendant),\n });\n }\n return grouped;\n}\n\n/** Explicit project placement wins; pins have already been split out. */\nexport function groupSiteConversations(roots: SessionTreeNode[]): SessionTreeNode[] {\n const groups = new Map<string, SessionTreeNode[]>();\n for (const node of roots) {\n const origin = sessionSiteOrigin(node.session);\n if (!origin || node.session.channelId || node.session.parentSessionId) continue;\n const members = groups.get(origin.siteId) ?? [];\n members.push(node);\n groups.set(origin.siteId, members);\n }\n const emitted = new Set<string>();\n return roots.flatMap((node) => {\n const origin = sessionSiteOrigin(node.session);\n const members =\n origin && !node.session.channelId && !node.session.parentSessionId\n ? groups.get(origin.siteId)\n : undefined;\n if (!members || !origin) return [node];\n if (emitted.has(origin.siteId)) return [];\n emitted.add(origin.siteId);\n members.sort((a, b) => compareSessionActivity(a.session, b.session));\n const latest = members[0]!;\n return [\n {\n siteGroup: origin,\n session: { ...latest.session, id: `site:${origin.siteId}`, treeStats: undefined },\n children: members,\n hasActiveDescendant: members.some(nodeIsActive),\n },\n ];\n });\n}\n\nexport function categorizeRailRoots(\n rootNodes: SessionTreeNode[],\n now: Date = new Date(),\n): SessionForest {\n const running = rootNodes\n .filter((node) => nodeIsActive(node))\n .sort((a, b) => compareSessionActivity(a.session, b.session));\n const rest = rootNodes\n .filter((node) => !nodeIsActive(node))\n .sort((a, b) => compareSessionActivity(a.session, b.session));\n\n const buckets = new Map<SessionRecencyGroup, SessionTreeNode[]>();\n for (const node of rest) {\n const group = recencyGroupFor(sessionActivityTime(node.session), now);\n const list = buckets.get(group) ?? [];\n list.push(node);\n buckets.set(group, list);\n }\n const grouped: SessionForest[\"grouped\"] = [];\n for (const group of SESSION_GROUP_ORDER) {\n const list = buckets.get(group);\n if (list && list.length > 0) {\n grouped.push({\n group,\n label: SESSION_GROUP_LABELS(t)[group],\n sessions: list,\n });\n }\n }\n return { running, grouped };\n}\n\n/**\n * Build the rail forest: roots (parentSessionId null, or parent absent from the\n * page) at the top level, spawned children nested beneath their parent, each\n * subtree ordered most-recent-first. Running roots (self or via a live\n * descendant) are pinned above the recency buckets. A `seen` guard makes a\n * pathological parent cycle in the loaded page terminate rather than recurse\n * forever.\n */\nexport function buildRailForest(sessions: Session[], now: Date = new Date()): SessionForest {\n const byId = new Map(sessions.map((session) => [session.id, session]));\n const childrenOf = new Map<string, Session[]>();\n const roots: Session[] = [];\n for (const session of sessions) {\n const parentId = session.parentSessionId;\n if (parentId && parentId !== session.id && byId.has(parentId)) {\n const list = childrenOf.get(parentId) ?? [];\n list.push(session);\n childrenOf.set(parentId, list);\n } else {\n roots.push(session);\n }\n }\n\n const build = (session: Session, seen: Set<string>): SessionTreeNode => {\n const children = seen.has(session.id)\n ? []\n : (childrenOf.get(session.id) ?? [])\n .sort(compareSessionActivity)\n .map((child) => build(child, new Set(seen).add(session.id)));\n const hasActiveDescendant = children.some((child) => nodeIsActive(child));\n return { session, children, hasActiveDescendant };\n };\n\n const rootNodes = roots.map((session) => build(session, new Set()));\n const reachable = new Set<string>();\n const markReachable = (node: SessionTreeNode): void => {\n if (reachable.has(node.session.id)) {\n return;\n }\n reachable.add(node.session.id);\n for (const child of node.children) {\n markReachable(child);\n }\n };\n for (const node of rootNodes) {\n markReachable(node);\n }\n for (const session of sessions) {\n if (!reachable.has(session.id)) {\n rootNodes.push({ session, children: [], hasActiveDescendant: false });\n reachable.add(session.id);\n }\n }\n return categorizeRailRoots(rootNodes, now);\n}\n\ntype RemovedCounts = {\n total: number;\n running: number;\n queued: number;\n waiting: number;\n attention: number;\n paused: number;\n failed: number;\n unreadFailed: number;\n unread: number;\n activeWork: number;\n};\n\nfunction emptyRemovedCounts(): RemovedCounts {\n return {\n total: 0,\n running: 0,\n queued: 0,\n waiting: 0,\n attention: 0,\n paused: 0,\n failed: 0,\n unreadFailed: 0,\n unread: 0,\n activeWork: 0,\n };\n}\n\nfunction addRemovedCounts(target: RemovedCounts, source: RemovedCounts): void {\n target.total += source.total;\n target.running += source.running;\n target.queued += source.queued;\n target.waiting += source.waiting;\n target.attention += source.attention;\n target.paused += source.paused;\n target.failed += source.failed;\n target.unreadFailed += source.unreadFailed;\n target.unread += source.unread;\n target.activeWork += source.activeWork;\n}\n\nfunction subtreeCounts(node: SessionTreeNode): RemovedCounts {\n const status = node.session.status;\n const active = hasActiveEffectiveControl(node.session);\n const counts: RemovedCounts = {\n total: 1,\n running: active && (status === \"running\" || status === \"recovering\") ? 1 : 0,\n queued: active && (status === \"queued\" || status === \"waiting_capacity\") ? 1 : 0,\n waiting: sessionInputWait(node.session) ? 1 : 0,\n attention: awaitsPerson(node.session) ? 1 : 0,\n paused: node.session.effectiveControl?.state === \"paused\" ? 1 : 0,\n failed: status === \"failed\" ? 1 : 0,\n unreadFailed: status === \"failed\" && node.session.unread ? 1 : 0,\n unread: node.session.unread ? 1 : 0,\n activeWork: node.session.activelyWorking ? 1 : 0,\n };\n const stats = node.session.treeStats;\n if (stats) {\n counts.total += stats.totalDescendants;\n counts.running += stats.runningDescendants;\n counts.queued += stats.queuedDescendants;\n counts.waiting += stats.waitingDescendants ?? 0;\n counts.attention += stats.attentionDescendants;\n counts.paused += stats.pausedDescendants;\n counts.failed += stats.failedDescendants;\n counts.unreadFailed += stats.unreadFailedDescendants ?? stats.failedDescendants;\n counts.unread += stats.unreadDescendants ?? 0;\n counts.activeWork += stats.activelyWorkingDescendants ?? 0;\n } else {\n for (const child of node.children) addRemovedCounts(counts, subtreeCounts(child));\n }\n return counts;\n}\n\nfunction prunePinnedSubtreesWithCounts(\n node: SessionTreeNode,\n keepRoot: boolean,\n): { node: SessionTreeNode | null; removed: RemovedCounts } {\n if (node.session.pinned && !keepRoot) {\n return { node: null, removed: subtreeCounts(node) };\n }\n\n const removed = emptyRemovedCounts();\n let removedDirectChildren = 0;\n const children: SessionTreeNode[] = [];\n for (const child of node.children) {\n const result = prunePinnedSubtreesWithCounts(child, false);\n addRemovedCounts(removed, result.removed);\n if (result.node) children.push(result.node);\n else removedDirectChildren += 1;\n }\n\n const stats = node.session.treeStats;\n const session = stats\n ? {\n ...node.session,\n treeStats: {\n directChildren: Math.max(0, stats.directChildren - removedDirectChildren),\n totalDescendants: Math.max(0, stats.totalDescendants - removed.total),\n runningDescendants: Math.max(0, stats.runningDescendants - removed.running),\n queuedDescendants: Math.max(0, stats.queuedDescendants - removed.queued),\n ...(stats.waitingDescendants !== undefined\n ? { waitingDescendants: Math.max(0, stats.waitingDescendants - removed.waiting) }\n : {}),\n attentionDescendants: Math.max(0, stats.attentionDescendants - removed.attention),\n pausedDescendants: Math.max(0, stats.pausedDescendants - removed.paused),\n failedDescendants: Math.max(0, stats.failedDescendants - removed.failed),\n ...(stats.unreadFailedDescendants !== undefined\n ? {\n unreadFailedDescendants: Math.max(\n 0,\n stats.unreadFailedDescendants - removed.unreadFailed,\n ),\n }\n : {}),\n ...(stats.unreadDescendants !== undefined\n ? { unreadDescendants: Math.max(0, stats.unreadDescendants - removed.unread) }\n : {}),\n ...(stats.activelyWorkingDescendants !== undefined\n ? {\n activelyWorkingDescendants: Math.max(\n 0,\n stats.activelyWorkingDescendants - removed.activeWork,\n ),\n }\n : {}),\n // The pruned subtree may have held the oldest waiter; keep the server\n // timestamp only while some counted attention descendant remains.\n ...(stats.attentionSince !== undefined\n ? {\n attentionSince:\n stats.attentionDescendants - removed.attention > 0 ? stats.attentionSince : null,\n }\n : {}),\n truncated: stats.truncated,\n },\n }\n : node.session;\n return {\n node: {\n session,\n children,\n hasActiveDescendant: children.some((child) => nodeIsActive(child)),\n },\n removed,\n };\n}\n\n/**\n * Remove explicit pinned roots below `node`. `keepRoot` is used to build one\n * pin shortcut: that pin stays, but any nested explicit pin is promoted to its\n * own globally ordered shortcut instead of appearing twice.\n */\nexport function prunePinnedSubtrees(\n node: SessionTreeNode,\n keepRoot = false,\n): SessionTreeNode | null {\n return prunePinnedSubtreesWithCounts(node, keepRoot).node;\n}\n\nfunction forestRoots(forest: SessionForest): SessionTreeNode[] {\n return [...forest.running, ...forest.grouped.flatMap((bucket) => bucket.sessions)];\n}\n\n/**\n * Rows as the rail will actually render them.\n *\n * Hierarchy mode nests spawned sessions under their parent, so lineage stays.\n * Search results are deliberately flat because a partial match set is not a\n * tree, so every result there IS top-level and must say so. A row that renders\n * at the top level while still naming an absent parent is the bug this prevents.\n */\nexport function projectRailSessions<T extends Session>(sessions: T[], hierarchyMode: boolean): T[] {\n return hierarchyMode\n ? sessions\n : sessions.map((session) => ({ ...session, parentSessionId: null }));\n}\n\n/** Build the complete, explicit-pin, and ordinary rail projections together. */\nexport function buildPinnedRailSections(\n sessions: Session[],\n now: Date = new Date(),\n options: { groupSites?: boolean | undefined } = {},\n): PinnedRailSections {\n const complete = buildRailForest(sessions, now);\n const roots = forestRoots(complete);\n const nodesById = new Map<string, SessionTreeNode>();\n const visit = (node: SessionTreeNode): void => {\n if (nodesById.has(node.session.id)) return;\n nodesById.set(node.session.id, node);\n for (const child of node.children) visit(child);\n };\n for (const root of roots) visit(root);\n\n const { pinned: pinnedSessions } = partitionPinnedSessions(sessions);\n const pinned = pinnedSessions.flatMap((session) => {\n const completeNode = nodesById.get(session.id) ?? {\n session,\n children: [],\n hasActiveDescendant: false,\n };\n const pruned = prunePinnedSubtrees(completeNode, true);\n return pruned ? [pruned] : [];\n });\n const ordinaryRoots = roots.flatMap((root) => {\n const pruned = prunePinnedSubtrees(root);\n return pruned ? [pruned] : [];\n });\n\n return {\n complete,\n pinned,\n ordinary: categorizeRailRoots(\n options.groupSites === false\n ? groupScheduledRuns(ordinaryRoots)\n : groupSiteConversations(groupScheduledRuns(ordinaryRoots)),\n now,\n ),\n };\n}\n\n/** The selected descendant under a collapsed node, projected one level deeper. */\nexport function selectedDescendantNode(\n node: SessionTreeNode,\n selectedSessionId: string | null,\n): SessionTreeNode | null {\n if (!selectedSessionId || node.session.id === selectedSessionId) return null;\n for (const child of node.children) {\n if (child.session.id === selectedSessionId) return child;\n const selected = selectedDescendantNode(child, selectedSessionId);\n if (selected) return selected;\n }\n return null;\n}\n\n/** Flatten the forest to the rows currently VISIBLE, given the expanded set —\n * a node, then its children only when the node is expanded (depth-first).\n * A collapsed branch keeps its selected descendant visible as one ordinary\n * child row, matching the rail projection. Keyboard navigation walks this. */\nexport function visibleTreeRows(\n roots: SessionTreeNode[],\n expanded: ReadonlySet<string>,\n selectedSessionId: string | null = null,\n): { node: SessionTreeNode; depth: number }[] {\n const rows: { node: SessionTreeNode; depth: number }[] = [];\n const walk = (node: SessionTreeNode, depth: number): void => {\n if (!node.siteGroup) rows.push({ node, depth });\n if (node.children.length > 0 && expanded.has(node.session.id)) {\n for (const child of node.children) {\n walk(child, depth + 1);\n }\n } else {\n const selected = selectedDescendantNode(node, selectedSessionId);\n if (selected) rows.push({ node: selected, depth: depth + 1 });\n }\n };\n for (const node of roots) walk(node, 0);\n return rows;\n}\n\nexport function visibleForestRows(\n forest: SessionForest,\n expanded: ReadonlySet<string>,\n selectedSessionId: string | null = null,\n): { node: SessionTreeNode; depth: number }[] {\n return visibleTreeRows(forestRoots(forest), expanded, selectedSessionId);\n}\n\n/* --------------------------------------------------------------------------\n Workstream sections. The hierarchy rail groups ordinary roots by their ROOT\n session's channel, with unfiled roots in Recents.\n -------------------------------------------------------------------------- */\n\nexport type ChannelRailSection = {\n /** Stable render key: the channel id, or \"recents\" for unfiled roots. */\n key: string;\n channelId: string | null;\n /** User-facing workstream name. */\n name: string;\n sessions: SessionTreeNode[];\n};\n\n/**\n * Group an ordinary rail forest's roots by channel. Channels render in the\n * given (server-defined) order — pinned projects first, then ordinary ones —\n * including empty ones, so a just-created project is immediately visible.\n * The catch-all \"Default\" section for unfiled roots follows them (only when\n * it has members). Within a section, active roots\n * keep floating above recency-ordered idle ones because the incoming forest\n * is flattened in that order. A root whose channel no longer exists folds\n * into Default rather than disappearing.\n */\nexport function channelRailSections(\n forest: SessionForest,\n channels: readonly { id: string; name: string }[],\n): ChannelRailSection[] {\n const roots = [...forest.running, ...forest.grouped.flatMap((bucket) => bucket.sessions)];\n const byChannel = new Map<string | null, SessionTreeNode[]>();\n for (const node of roots) {\n const channelId = node.session.channelId ?? null;\n const known = channelId !== null && channels.some((channel) => channel.id === channelId);\n const key = known ? channelId : null;\n const list = byChannel.get(key) ?? [];\n list.push(node);\n byChannel.set(key, list);\n }\n for (const list of byChannel.values()) {\n list.sort((left, right) => {\n const leftRank = nodeIsActive(left) ? 0 : left.session.activelyWorking ? 1 : 2;\n const rightRank = nodeIsActive(right) ? 0 : right.session.activelyWorking ? 1 : 2;\n return leftRank - rightRank || compareSessionActivity(left.session, right.session);\n });\n }\n const sections: ChannelRailSection[] = [];\n sections.push(\n ...channels.map((channel) => ({\n key: channel.id,\n channelId: channel.id,\n name: channel.name,\n sessions: byChannel.get(channel.id) ?? [],\n })),\n );\n const defaultSessions = byChannel.get(null) ?? [];\n if (defaultSessions.length > 0) {\n sections.push({ key: \"default\", channelId: null, name: \"Default\", sessions: defaultSessions });\n }\n return sections;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAwGO,SAAS,qBACd,QACA,YACsC;AACtC,QAAM,QAAQ,IAAI,IAAI,UAAU;AAChC,QAAM,OAAO,OAAyB;AAAA,IACpC,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,YAAY;AAAA,EACd;AACA,QAAM,SAAS,IAAI,IAAqC;AAAA,IACtD,GAAG,WAAW,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,CAAU;AAAA,IAC/C,CAAC,MAAM,KAAK,CAAC;AAAA,EACf,CAAC;AACD,aAAW,SAAS,OAAO,QAAQ;AACjC,UAAM,KAAK,MAAM,aAAa,MAAM,IAAI,MAAM,SAAS,IAAI,MAAM,YAAY;AAE7E,UAAM,UAAU,KAAK,IAAI,MAAM,WAAW,GAAG,MAAM,MAAM;AACzD,wBAAoB,OAAO,IAAI,EAAE,GAAI;AAAA,MACnC,GAAG;AAAA,MACH,QAAQ,MAAM,SAAS;AAAA,MACvB;AAAA,MACA,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,SAAS,YAAY,GAA8B,GAA6C;AAC9F,MAAI,CAAC,EAAG,QAAO,KAAK;AACpB,MAAI,CAAC,EAAG,QAAO;AACf,SAAO,KAAK,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,IAAI;AAC7C;AAEA,SAAS,oBACP,SACA,wBACkB;AAClB,SAAO;AAAA,IACL,OAAO;AAAA,IACP,YAAY,uBAAuB,IAAI,QAAQ,EAAE,KAAK;AAAA,IACtD,WAAW,aAAa,OAAO,IAAI,IAAI;AAAA,IACvC,gBAAgB,aAAa,OAAO,IAAK,QAAQ,uBAAuB,OAAQ;AAAA;AAAA;AAAA;AAAA,IAIhF,QAAQ,QAAQ,WAAW,YAAY,QAAQ,SAAS,IAAI;AAAA,IAC5D,QACE,0BAA0B,OAAO,MAChC,QAAQ,WAAW,aAAa,QAAQ,WAAW,gBAChD,IACA;AAAA,IACN,QACE,0BAA0B,OAAO,MAChC,QAAQ,WAAW,YAAY,QAAQ,WAAW,sBAC/C,IACA;AAAA,IACN,SAAS,iBAAiB,OAAO,IAAI,IAAI;AAAA,IACzC,QAAQ,QAAQ,SAAS,IAAI;AAAA,IAC7B,YAAY,QAAQ,kBAAkB,IAAI;AAAA,EAC5C;AACF;AAEA,SAAS,oBAAoB,QAA0B,QAAgC;AACrF,SAAO,SAAS,OAAO;AACvB,SAAO,cAAc,OAAO;AAC5B,SAAO,aAAa,OAAO;AAC3B,SAAO,iBAAiB,YAAY,OAAO,gBAAgB,OAAO,cAAc;AAChF,SAAO,UAAU,OAAO;AACxB,SAAO,UAAU,OAAO;AACxB,SAAO,UAAU,OAAO;AACxB,SAAO,WAAW,OAAO;AACzB,SAAO,UAAU,OAAO;AACxB,SAAO,cAAc,OAAO;AAC9B;AAEA,SAAS,iBACP,MACA,wBACkB;AAClB,MAAI,KAAK,WAAW;AAClB,UAAMA,UAAS,oBAAoB,KAAK,SAAS,sBAAsB;AACvE,eAAW,OAAO;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACE,MAAAA,QAAO,GAAG,IAAI;AAChB,IAAAA,QAAO,iBAAiB;AACxB,eAAW,SAAS,KAAK;AACvB,0BAAoBA,SAAQ,iBAAiB,OAAO,sBAAsB,CAAC;AAC7E,WAAOA;AAAA,EACT;AACA,QAAM,SAAS,oBAAoB,KAAK,SAAS,sBAAsB;AACvE,QAAM,QAAQ,KAAK,QAAQ;AAC3B,MAAI,OAAO;AACT,WAAO,SAAS,MAAM;AACtB,WAAO,aAAa,MAAM;AAC1B,WAAO,iBAAiB,YAAY,OAAO,gBAAgB,MAAM,cAAc;AAC/E,WAAO,UAAU,MAAM,2BAA2B,MAAM;AACxD,WAAO,UAAU,MAAM;AACvB,WAAO,UAAU,MAAM;AACvB,WAAO,WAAW,MAAM,sBAAsB;AAC9C,WAAO,UAAU,MAAM,qBAAqB;AAC5C,WAAO,cAAc,MAAM,8BAA8B;AAKzD,eAAW,SAAS,KAAK,UAAU;AACjC,UAAI,MAAM,QAAQ,oBAAoB,KAAK,QAAQ,IAAI;AACrD,4BAAoB,QAAQ,iBAAiB,OAAO,sBAAsB,CAAC;AAAA,MAC7E,OAAO;AACL,eAAO,cAAc,gCAAgC,OAAO,sBAAsB;AAAA,MACpF;AAAA,IACF;AAAA,EACF,OAAO;AACL,eAAW,SAAS,KAAK,UAAU;AACjC,0BAAoB,QAAQ,iBAAiB,OAAO,sBAAsB,CAAC;AAAA,IAC7E;AAAA,EACF;AACA,SAAO;AACT;AAOA,SAAS,gCACP,MACA,wBACQ;AACR,UACG,uBAAuB,IAAI,KAAK,QAAQ,EAAE,KAAK,KAChD,KAAK,SAAS;AAAA,IACZ,CAAC,OAAO,UAAU,QAAQ,gCAAgC,OAAO,sBAAsB;AAAA,IACvF;AAAA,EACF;AAEJ;AAGO,SAAS,mBACd,OACA,yBAAsD,oBAAI,IAAI,GAC9D,MAAY,oBAAI,KAAK,GACA;AACrB,QAAM,SAA2B;AAAA,IAC/B,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,YAAY;AAAA,EACd;AACA,aAAW,QAAQ,OAAO;AACxB,wBAAoB,QAAQ,iBAAiB,MAAM,sBAAsB,CAAC;AAAA,EAC5E;AAEA,SAAO,0BAA0B,QAAQ,GAAG;AAC9C;AAGO,SAAS,0BACd,QACA,MAAY,oBAAI,KAAK,GACA;AACrB,MAAI,OAAO,aAAa,GAAG;AACzB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO,OAAO;AAAA,MACd,OAAO,OAAO;AAAA,MACd,OAAO,GAAG,OAAO,UAAU,WAAW,OAAO,eAAe,IAAI,KAAK,GAAG;AAAA,IAC1E;AAAA,EACF;AAEA,MAAI,OAAO,YAAY,GAAG;AAGxB,UAAM,UAAU,OAAO,iBAAiB,mBAAmB,OAAO,gBAAgB,GAAG,IAAI;AACzF,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO,OAAO;AAAA,MACd,OAAO,OAAO;AAAA,MACd,OAAO,GAAG,OAAO,SAAS,QAAQ,OAAO,cAAc,IAAI,MAAM,EAAE,OACjE,UAAU,SAAM,OAAO,KAAK,EAC9B;AAAA,MACA,GAAI,OAAO,iBAAiB,EAAE,gBAAgB,OAAO,eAAe,IAAI,CAAC;AAAA,IAC3E;AAAA,EACF;AACA,MAAI,OAAO,SAAS,GAAG;AACrB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO,OAAO;AAAA,MACd,OAAO,OAAO;AAAA,MACd,OAAO,GAAG,OAAO,MAAM;AAAA,IACzB;AAAA,EACF;AACA,MAAI,OAAO,SAAS,GAAG;AACrB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO,OAAO;AAAA,MACd,OAAO,OAAO;AAAA,MACd,OAAO,GAAG,OAAO,MAAM;AAAA,IACzB;AAAA,EACF;AACA,MAAI,OAAO,SAAS,GAAG;AACrB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO,OAAO;AAAA,MACd,OAAO,OAAO;AAAA,MACd,OAAO,GAAG,OAAO,MAAM;AAAA,IACzB;AAAA,EACF;AACA,MAAI,OAAO,UAAU,GAAG;AACtB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO,OAAO;AAAA,MACd,OAAO,OAAO;AAAA,MACd,OAAO,GAAG,OAAO,OAAO;AAAA,IAC1B;AAAA,EACF;AACA,MAAI,OAAO,SAAS,GAAG;AACrB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO,OAAO;AAAA,MACd,OAAO,OAAO;AAAA,MACd,OAAO,GAAG,OAAO,MAAM;AAAA,IACzB;AAAA,EACF;AACA,MAAI,OAAO,aAAa,GAAG;AACzB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO,OAAO;AAAA,MACd,OAAO,OAAO;AAAA,MACd,OAAO,GAAG,OAAO,UAAU;AAAA,IAC7B;AAAA,EACF;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO,OAAO;AAAA,IACd,OAAO,OAAO,QAAQ,IAAI,SAAS;AAAA,EACrC;AACF;AAQO,SAAS,oBAAuC,SAAkB,UAAgB;AACvF,MAAI,SAAS,cAAc,UAAa,QAAQ,cAAc,QAAW;AACvE,WAAO;AAAA,EACT;AACA,SAAO,EAAE,GAAG,UAAU,WAAW,QAAQ,UAAU;AACrD;AAcA,IAAM,qBAAqB,IAAI,YAAY;AAC3C,SAAS,mBAAmB,OAA8C;AACxE,SAAO,mBAAmB;AAAA,KACvB,SAAS,IAAI,QAAQ,YAAY,EAAE,EAAE,QAAQ,UAAU,CAAC,WAAW,OAAO,YAAY,CAAC;AAAA,EAC1F;AACF;AAEA,SAAS,wBAAwB,OAAuB;AACtD,QAAM,WAAW,MAAM,MAAM,+BAA+B,IAAI,CAAC,KAAK;AACtE,SAAO,OAAO,SAAS,OAAO,GAAG,GAAG,EAAE,MAAM,GAAG,CAAC,CAAC;AACnD;AAGO,SAAS,qBACd,MACA,OACA,QACQ;AACR,MAAI,WAAW,QAAQ;AACrB,UAAM,IAAI,mBAAmB,KAAK,KAAK;AACvC,UAAM,IAAI,mBAAmB,MAAM,KAAK;AACxC,aAAS,QAAQ,GAAG,QAAQ,KAAK,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG;AACpE,UAAI,EAAE,KAAK,MAAM,EAAE,KAAK,EAAG,QAAO,EAAE,KAAK,IAAK,EAAE,KAAK;AAAA,IACvD;AACA,WAAO,EAAE,SAAS,EAAE,UAAU,KAAK,GAAG,cAAc,MAAM,EAAE;AAAA,EAC9D;AACA,SACE,KAAK,MAAM,MAAM,MAAM,CAAC,IAAI,KAAK,MAAM,KAAK,MAAM,CAAC,KACnD,wBAAwB,MAAM,MAAM,CAAC,IAAI,wBAAwB,KAAK,MAAM,CAAC,KAC7E,MAAM,GAAG,cAAc,KAAK,EAAE;AAElC;AAEO,SAAS,kBACd,QACA,QACe;AACf,QAAM,YAAY,CAAC,UACjB,MACG,IAAI,CAAC,UAAU,EAAE,GAAG,MAAM,UAAU,UAAU,KAAK,QAAQ,EAAE,EAAE,EAC/D,KAAK,CAAC,GAAG,MAAM,qBAAqB,EAAE,SAAS,EAAE,SAAS,MAAM,CAAC;AACtE,SAAO;AAAA,IACL,SAAS,UAAU,OAAO,OAAO;AAAA,IACjC,SAAS,OAAO,QAAQ,IAAI,CAAC,YAAY;AAAA,MACvC,GAAG;AAAA,MACH,UAAU,UAAU,OAAO,QAAQ;AAAA,IACrC,EAAE;AAAA,EACJ;AACF;AAIO,SAAS,kBAAkB,SAA0B;AAC1D,SAAO,GAAG,QAAQ,UAAU,IAAI,IAAI,QAAQ,UAAU,SAAS;AACjE;AAEO,SAAS,oBAAoB,SAA0B;AAC5D,QAAM,WAAW,QAAQ,UAAU,OAAO,KAAK;AAC/C,MAAI,SAAU,QAAO;AACrB,MAAI,QAAQ,UAAU,cAAc,sBAAuB,QAAO;AAClE,MAAI,QAAQ,UAAU,SAAS,WAAW;AACxC,WAAO,gBAAa,QAAQ,UAAU,SAAS;AAAA,EACjD;AACA,SAAO,QAAQ,UAAU;AAC3B;AAWO,SAAS,uBAAuB,UAAkD;AACvF,QAAM,QAAQ,oBAAI,IAGhB;AACF,aAAW,WAAW,UAAU;AAC9B,UAAM,IAAI,kBAAkB,OAAO,GAAG;AAAA,MACpC,OAAO,oBAAoB,OAAO;AAAA,MAClC,MAAM,QAAQ,UAAU;AAAA,MACxB,WAAW,QAAQ,UAAU;AAAA,IAC/B,CAAC;AAAA,EACH;AAEA,QAAM,cAAc,oBAAI,IAAoB;AAC5C,aAAW,WAAW,MAAM,OAAO,GAAG;AACpC,gBAAY,IAAI,QAAQ,QAAQ,YAAY,IAAI,QAAQ,KAAK,KAAK,KAAK,CAAC;AAAA,EAC1E;AAEA,SAAO,IAAI;AAAA,IACT,CAAC,GAAG,MAAM,QAAQ,CAAC,EAChB,IAAI,CAAC,CAAC,OAAO,OAAO,OAAO;AAAA,MAC1B;AAAA,MACA,OACE,YAAY,IAAI,QAAQ,KAAK,MAAM,IAC/B,QAAQ,QACR,GAAG,QAAQ,KAAK,SAAM,QAAQ,SAAS,YAAY,YAAY,SAAS,SAAM,QAAQ,SAAS;AAAA,IACvG,EAAE,EACD;AAAA,MACC,CAAC,MAAM,UACL,KAAK,MAAM,cAAc,MAAM,KAAK,KAAK,KAAK,MAAM,cAAc,MAAM,KAAK;AAAA,IACjF,EACC,IAAI,CAAC,YAAY,CAAC,QAAQ,OAAO,QAAQ,KAAK,CAAC;AAAA,EACpD;AACF;AAEO,SAAS,sBAAsB,UAA6C;AACjF,SAAO,CAAC,GAAG,uBAAuB,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,EAAE,OAAO,MAAM,EAAE;AACzF;AAGO,SAAS,8BACd,SACA,eACA,cACe;AACf,MAAI,CAAC,gBAAgB,CAAC,WAAW,cAAc,IAAI,OAAO,EAAG,QAAO;AACpE,SAAO;AACT;AAGO,SAAS,yBACd,UACA,cACQ;AACR,MAAI,CAAC,aAAc,QAAO,SAAS;AACnC,QAAM,YAAY,IAAI,IAAI,SAAS,IAAI,CAAC,YAAY,QAAQ,EAAE,CAAC;AAC/D,SAAO,SAAS;AAAA,IACd,CAAC,YAAY,CAAC,QAAQ,mBAAmB,CAAC,UAAU,IAAI,QAAQ,eAAe;AAAA,EACjF,EAAE;AACJ;AAEA,SAAS,gBAAgB,SAAkB,OAAuC;AAChF,MAAI,UAAU,WAAY,QAAO,oBAAoB,OAAO;AAC5D,QAAM,UAAU,KAAK,MAAM,QAAQ,SAAS;AAC5C,SAAO,OAAO,MAAM,OAAO,IAAI,IAAI;AACrC;AAEO,SAAS,wBACd,UACA,SAQK;AACL,QAAM,MAAM,QAAQ,OAAO,oBAAI,KAAK;AACpC,QAAM,eAAe,IAAI,KAAK,IAAI,YAAY,GAAG,IAAI,SAAS,GAAG,IAAI,QAAQ,CAAC,EAAE,QAAQ;AACxF,QAAM,YACJ,QAAQ,cAAc,UAClB,eACA,QAAQ,cAAc,SACpB,eAAe,IAAI,KAAK,KAAK,KAAK,MAClC,QAAQ,cAAc,UACpB,eAAe,KAAK,KAAK,KAAK,KAAK,MACnC;AACV,QAAM,UAAU,CAAC,aACd,CAAC,QAAQ,WAAW,kBAAkB,OAAO,MAAM,QAAQ,aAC3D,cAAc,QAAQ,gBAAgB,SAAS,QAAQ,SAAS,KAAK;AACxE,MAAI,CAAC,QAAQ,aAAc,QAAO,SAAS,OAAO,OAAO;AAEzD,QAAM,OAAO,IAAI,IAAI,SAAS,IAAI,CAAC,YAAY,CAAC,QAAQ,IAAI,OAAO,CAAC,CAAC;AACrE,QAAM,WAAW,oBAAI,IAAe;AACpC,QAAM,gBAAgB,CAAC,YAAkB;AACvC,UAAM,SAAS,SAAS,IAAI,QAAQ,EAAE;AACtC,QAAI,OAAQ,QAAO;AAEnB,UAAM,OAAY,CAAC;AACnB,UAAM,OAAO,oBAAI,IAAY;AAC7B,QAAI,UAAU;AACd,WAAO,QAAQ,iBAAiB;AAC9B,UAAI,KAAK,IAAI,QAAQ,EAAE,GAAG;AAGxB,eAAO;AAAA,MACT;AACA,WAAK,IAAI,QAAQ,EAAE;AACnB,WAAK,KAAK,OAAO;AACjB,YAAM,SAAS,KAAK,IAAI,QAAQ,eAAe;AAC/C,UAAI,CAAC,OAAQ;AACb,gBAAU;AAAA,IACZ;AACA,aAAS,IAAI,QAAQ,IAAI,OAAO;AAChC,eAAW,UAAU,KAAM,UAAS,IAAI,OAAO,IAAI,OAAO;AAC1D,WAAO;AAAA,EACT;AAEA,SAAO,SAAS,OAAO,CAAC,YAAY,QAAQ,cAAc,OAAO,CAAC,CAAC;AACrE;AAGO,SAAS,4BACd,QACA,SACA,UAGI,CAAC,GACU;AACf,QAAM,MAAM,QAAQ,OAAO,oBAAI,KAAK;AACpC,QAAM,QAAQ,YAAY,MAAM;AAChC,MAAI,YAAY,UAAU,YAAY,WAAW;AAC/C,WAAO,EAAE,SAAS,CAAC,GAAG,SAAS,CAAC,EAAE,OAAO,QAAQ,OAAO,YAAY,UAAU,MAAM,CAAC,EAAE;AAAA,EACzF;AACA,QAAM,UAAU,MACb,OAAO,YAAY,EACnB,KAAK,CAAC,MAAM,UAAU,uBAAuB,KAAK,SAAS,MAAM,OAAO,CAAC;AAC5E,QAAM,OAAO,MAAM,OAAO,CAAC,SAAS,CAAC,aAAa,IAAI,CAAC;AACvD,MAAI,YAAY,WAAW;AACzB,UAAM,UAAU,oBAAI,IAA4C;AAChE,eAAW,QAAQ,MAAM;AACvB,YAAM,QAAQ,gBAAgB,gBAAgB,KAAK,SAAS,SAAS,GAAG,GAAG;AAC3E,YAAM,OAAO,QAAQ,IAAI,KAAK,KAAK,CAAC;AACpC,WAAK,KAAK,IAAI;AACd,cAAQ,IAAI,OAAO,IAAI;AAAA,IACzB;AACA,WAAO;AAAA,MACL;AAAA,MACA,SAAS,oBAAoB,QAAQ,CAAC,UAAU;AAC9C,cAAM,OAAO,QAAQ,IAAI,KAAK;AAC9B,YAAI,CAAC,MAAM,OAAQ,QAAO,CAAC;AAC3B,cAAM,QACJ,UAAU,UACN,kBACA,UAAU,cACR,sBACA,UAAU,cACR,+BACA;AACV,eAAO;AAAA,UACL;AAAA,YACE,OAAO,WAAW,KAAK;AAAA,YACvB;AAAA,YACA,UAAU,KAAK;AAAA,cACb,CAAC,MAAM,UACL,gBAAgB,MAAM,SAAS,SAAS,IACtC,gBAAgB,KAAK,SAAS,SAAS,KACzC,MAAM,QAAQ,GAAG,cAAc,KAAK,QAAQ,EAAE;AAAA,YAClD;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,gBACJ,QAAQ,iBAAiB,uBAAuB,MAAM,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC;AACnF,QAAM,WAAW,oBAAI,IAA4D;AACjF,aAAW,QAAQ,MAAM;AACvB,UAAM,MAAM,kBAAkB,KAAK,OAAO;AAC1C,UAAM,SAAS,SAAS,IAAI,GAAG,KAAK;AAAA,MAClC,OAAO,cAAc,IAAI,GAAG,KAAK,oBAAoB,KAAK,OAAO;AAAA,MACjE,UAAU,CAAC;AAAA,IACb;AACA,WAAO,SAAS,KAAK,IAAI;AACzB,aAAS,IAAI,KAAK,MAAM;AAAA,EAC1B;AACA,SAAO;AAAA,IACL;AAAA,IACA,SAAS,CAAC,GAAG,SAAS,QAAQ,CAAC,EAC5B,KAAK,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,KAAK,MAAM,KAAK,MAAM,cAAc,MAAM,KAAK,CAAC,EACnE,IAAI,CAAC,CAAC,KAAK,MAAM,OAAO;AAAA,MACvB,OAAO,WAAW,GAAG;AAAA,MACrB,OAAO,OAAO;AAAA,MACd,UAAU,OAAO,SAAS;AAAA,QAAK,CAAC,MAAM,UACpC,uBAAuB,KAAK,SAAS,MAAM,OAAO;AAAA,MACpD;AAAA,IACF,EAAE;AAAA,EACN;AACF;AAGO,SAAS,uBACd,UACA,SACA,UAGI,CAAC,GACU;AACf,SAAO,4BAA4B,gBAAgB,UAAU,QAAQ,GAAG,GAAG,SAAS,OAAO;AAC7F;AAYO,SAAS,aAAa,MAAgC;AAC3D,QAAM,QAAQ,KAAK,QAAQ;AAC3B,QAAM,mBAAmB;AAAA,IACvB,SACA,MAAM,qBACJ,MAAM,qBACL,MAAM,sBAAsB,KAC7B,MAAM,uBACN;AAAA,EACJ;AACA,SAAO,qBAAqB,KAAK,OAAO,KAAK,KAAK,uBAAuB;AAC3E;AASO,SAAS,kBAAkB,SAAiC;AACjE,MAAI,qBAAqB,QAAS,QAAO,QAAQ;AACjD,QAAM,QAAS,QAAQ,UAAkD;AACzE,SAAO,OAAO,UAAU,YAAY,MAAM,SAAS,IAAI,QAAQ;AACjE;AAqBO,SAAS,mBAAmB,OAA6C;AAC9E,QAAM,gBAAgB,oBAAI,IAA+B;AACzD,aAAW,QAAQ,OAAO;AACxB,UAAM,SAAS,kBAAkB,KAAK,OAAO;AAC7C,QAAI,CAAC,OAAQ;AACb,UAAM,UAAU,cAAc,IAAI,MAAM,KAAK,CAAC;AAC9C,YAAQ,KAAK,IAAI;AACjB,kBAAc,IAAI,QAAQ,OAAO;AAAA,EACnC;AACA,aAAW,WAAW,cAAc,OAAO,GAAG;AAC5C,YAAQ,KAAK,CAAC,MAAM,UAAU,uBAAuB,KAAK,SAAS,MAAM,OAAO,CAAC;AAAA,EACnF;AACA,QAAM,UAA6B,CAAC;AACpC,QAAM,UAAU,oBAAI,IAAY;AAChC,aAAW,QAAQ,OAAO;AACxB,UAAM,SAAS,kBAAkB,KAAK,OAAO;AAC7C,UAAM,UAAU,SAAU,cAAc,IAAI,MAAM,KAAK,CAAC,IAAK,CAAC;AAC9D,QAAI,QAAQ,SAAS,GAAG;AACtB,cAAQ,KAAK,IAAI;AACjB;AAAA,IACF;AACA,QAAI,QAAQ,IAAI,MAAO,EAAG;AAC1B,YAAQ,IAAI,MAAO;AACnB,UAAM,CAAC,WAAW,GAAG,SAAS,IAAI;AAClC,YAAQ,KAAK;AAAA,MACX,GAAG;AAAA;AAAA;AAAA,MAGH,UAAU,CAAC,GAAG,UAAU,UAAU,GAAG,SAAS;AAAA,MAC9C,qBACE,UAAU,uBACV,UAAU,KAAK,CAAC,QAAQ,aAAa,GAAG,KAAK,IAAI,mBAAmB;AAAA,IACxE,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAGO,SAAS,uBAAuB,OAA6C;AAClF,QAAM,SAAS,oBAAI,IAA+B;AAClD,aAAW,QAAQ,OAAO;AACxB,UAAM,SAAS,kBAAkB,KAAK,OAAO;AAC7C,QAAI,CAAC,UAAU,KAAK,QAAQ,aAAa,KAAK,QAAQ,gBAAiB;AACvE,UAAM,UAAU,OAAO,IAAI,OAAO,MAAM,KAAK,CAAC;AAC9C,YAAQ,KAAK,IAAI;AACjB,WAAO,IAAI,OAAO,QAAQ,OAAO;AAAA,EACnC;AACA,QAAM,UAAU,oBAAI,IAAY;AAChC,SAAO,MAAM,QAAQ,CAAC,SAAS;AAC7B,UAAM,SAAS,kBAAkB,KAAK,OAAO;AAC7C,UAAM,UACJ,UAAU,CAAC,KAAK,QAAQ,aAAa,CAAC,KAAK,QAAQ,kBAC/C,OAAO,IAAI,OAAO,MAAM,IACxB;AACN,QAAI,CAAC,WAAW,CAAC,OAAQ,QAAO,CAAC,IAAI;AACrC,QAAI,QAAQ,IAAI,OAAO,MAAM,EAAG,QAAO,CAAC;AACxC,YAAQ,IAAI,OAAO,MAAM;AACzB,YAAQ,KAAK,CAAC,GAAG,MAAM,uBAAuB,EAAE,SAAS,EAAE,OAAO,CAAC;AACnE,UAAM,SAAS,QAAQ,CAAC;AACxB,WAAO;AAAA,MACL;AAAA,QACE,WAAW;AAAA,QACX,SAAS,EAAE,GAAG,OAAO,SAAS,IAAI,QAAQ,OAAO,MAAM,IAAI,WAAW,OAAU;AAAA,QAChF,UAAU;AAAA,QACV,qBAAqB,QAAQ,KAAK,YAAY;AAAA,MAChD;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEO,SAAS,oBACd,WACA,MAAY,oBAAI,KAAK,GACN;AACf,QAAM,UAAU,UACb,OAAO,CAAC,SAAS,aAAa,IAAI,CAAC,EACnC,KAAK,CAAC,GAAG,MAAM,uBAAuB,EAAE,SAAS,EAAE,OAAO,CAAC;AAC9D,QAAM,OAAO,UACV,OAAO,CAAC,SAAS,CAAC,aAAa,IAAI,CAAC,EACpC,KAAK,CAAC,GAAG,MAAM,uBAAuB,EAAE,SAAS,EAAE,OAAO,CAAC;AAE9D,QAAM,UAAU,oBAAI,IAA4C;AAChE,aAAW,QAAQ,MAAM;AACvB,UAAM,QAAQ,gBAAgB,oBAAoB,KAAK,OAAO,GAAG,GAAG;AACpE,UAAM,OAAO,QAAQ,IAAI,KAAK,KAAK,CAAC;AACpC,SAAK,KAAK,IAAI;AACd,YAAQ,IAAI,OAAO,IAAI;AAAA,EACzB;AACA,QAAM,UAAoC,CAAC;AAC3C,aAAW,SAAS,qBAAqB;AACvC,UAAM,OAAO,QAAQ,IAAI,KAAK;AAC9B,QAAI,QAAQ,KAAK,SAAS,GAAG;AAC3B,cAAQ,KAAK;AAAA,QACX;AAAA,QACA,OAAO,qBAAqB,CAAC,EAAE,KAAK;AAAA,QACpC,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO,EAAE,SAAS,QAAQ;AAC5B;AAUO,SAAS,gBAAgB,UAAqB,MAAY,oBAAI,KAAK,GAAkB;AAC1F,QAAM,OAAO,IAAI,IAAI,SAAS,IAAI,CAAC,YAAY,CAAC,QAAQ,IAAI,OAAO,CAAC,CAAC;AACrE,QAAM,aAAa,oBAAI,IAAuB;AAC9C,QAAM,QAAmB,CAAC;AAC1B,aAAW,WAAW,UAAU;AAC9B,UAAM,WAAW,QAAQ;AACzB,QAAI,YAAY,aAAa,QAAQ,MAAM,KAAK,IAAI,QAAQ,GAAG;AAC7D,YAAM,OAAO,WAAW,IAAI,QAAQ,KAAK,CAAC;AAC1C,WAAK,KAAK,OAAO;AACjB,iBAAW,IAAI,UAAU,IAAI;AAAA,IAC/B,OAAO;AACL,YAAM,KAAK,OAAO;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,QAAQ,CAAC,SAAkB,SAAuC;AACtE,UAAM,WAAW,KAAK,IAAI,QAAQ,EAAE,IAChC,CAAC,KACA,WAAW,IAAI,QAAQ,EAAE,KAAK,CAAC,GAC7B,KAAK,sBAAsB,EAC3B,IAAI,CAAC,UAAU,MAAM,OAAO,IAAI,IAAI,IAAI,EAAE,IAAI,QAAQ,EAAE,CAAC,CAAC;AACjE,UAAM,sBAAsB,SAAS,KAAK,CAAC,UAAU,aAAa,KAAK,CAAC;AACxE,WAAO,EAAE,SAAS,UAAU,oBAAoB;AAAA,EAClD;AAEA,QAAM,YAAY,MAAM,IAAI,CAAC,YAAY,MAAM,SAAS,oBAAI,IAAI,CAAC,CAAC;AAClE,QAAM,YAAY,oBAAI,IAAY;AAClC,QAAM,gBAAgB,CAAC,SAAgC;AACrD,QAAI,UAAU,IAAI,KAAK,QAAQ,EAAE,GAAG;AAClC;AAAA,IACF;AACA,cAAU,IAAI,KAAK,QAAQ,EAAE;AAC7B,eAAW,SAAS,KAAK,UAAU;AACjC,oBAAc,KAAK;AAAA,IACrB;AAAA,EACF;AACA,aAAW,QAAQ,WAAW;AAC5B,kBAAc,IAAI;AAAA,EACpB;AACA,aAAW,WAAW,UAAU;AAC9B,QAAI,CAAC,UAAU,IAAI,QAAQ,EAAE,GAAG;AAC9B,gBAAU,KAAK,EAAE,SAAS,UAAU,CAAC,GAAG,qBAAqB,MAAM,CAAC;AACpE,gBAAU,IAAI,QAAQ,EAAE;AAAA,IAC1B;AAAA,EACF;AACA,SAAO,oBAAoB,WAAW,GAAG;AAC3C;AAeA,SAAS,qBAAoC;AAC3C,SAAO;AAAA,IACL,OAAO;AAAA,IACP,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,QAAQ;AAAA,IACR,YAAY;AAAA,EACd;AACF;AAEA,SAAS,iBAAiB,QAAuB,QAA6B;AAC5E,SAAO,SAAS,OAAO;AACvB,SAAO,WAAW,OAAO;AACzB,SAAO,UAAU,OAAO;AACxB,SAAO,WAAW,OAAO;AACzB,SAAO,aAAa,OAAO;AAC3B,SAAO,UAAU,OAAO;AACxB,SAAO,UAAU,OAAO;AACxB,SAAO,gBAAgB,OAAO;AAC9B,SAAO,UAAU,OAAO;AACxB,SAAO,cAAc,OAAO;AAC9B;AAEA,SAAS,cAAc,MAAsC;AAC3D,QAAM,SAAS,KAAK,QAAQ;AAC5B,QAAM,SAAS,0BAA0B,KAAK,OAAO;AACrD,QAAM,SAAwB;AAAA,IAC5B,OAAO;AAAA,IACP,SAAS,WAAW,WAAW,aAAa,WAAW,gBAAgB,IAAI;AAAA,IAC3E,QAAQ,WAAW,WAAW,YAAY,WAAW,sBAAsB,IAAI;AAAA,IAC/E,SAAS,iBAAiB,KAAK,OAAO,IAAI,IAAI;AAAA,IAC9C,WAAW,aAAa,KAAK,OAAO,IAAI,IAAI;AAAA,IAC5C,QAAQ,KAAK,QAAQ,kBAAkB,UAAU,WAAW,IAAI;AAAA,IAChE,QAAQ,WAAW,WAAW,IAAI;AAAA,IAClC,cAAc,WAAW,YAAY,KAAK,QAAQ,SAAS,IAAI;AAAA,IAC/D,QAAQ,KAAK,QAAQ,SAAS,IAAI;AAAA,IAClC,YAAY,KAAK,QAAQ,kBAAkB,IAAI;AAAA,EACjD;AACA,QAAM,QAAQ,KAAK,QAAQ;AAC3B,MAAI,OAAO;AACT,WAAO,SAAS,MAAM;AACtB,WAAO,WAAW,MAAM;AACxB,WAAO,UAAU,MAAM;AACvB,WAAO,WAAW,MAAM,sBAAsB;AAC9C,WAAO,aAAa,MAAM;AAC1B,WAAO,UAAU,MAAM;AACvB,WAAO,UAAU,MAAM;AACvB,WAAO,gBAAgB,MAAM,2BAA2B,MAAM;AAC9D,WAAO,UAAU,MAAM,qBAAqB;AAC5C,WAAO,cAAc,MAAM,8BAA8B;AAAA,EAC3D,OAAO;AACL,eAAW,SAAS,KAAK,SAAU,kBAAiB,QAAQ,cAAc,KAAK,CAAC;AAAA,EAClF;AACA,SAAO;AACT;AAEA,SAAS,8BACP,MACA,UAC0D;AAC1D,MAAI,KAAK,QAAQ,UAAU,CAAC,UAAU;AACpC,WAAO,EAAE,MAAM,MAAM,SAAS,cAAc,IAAI,EAAE;AAAA,EACpD;AAEA,QAAM,UAAU,mBAAmB;AACnC,MAAI,wBAAwB;AAC5B,QAAM,WAA8B,CAAC;AACrC,aAAW,SAAS,KAAK,UAAU;AACjC,UAAM,SAAS,8BAA8B,OAAO,KAAK;AACzD,qBAAiB,SAAS,OAAO,OAAO;AACxC,QAAI,OAAO,KAAM,UAAS,KAAK,OAAO,IAAI;AAAA,QACrC,0BAAyB;AAAA,EAChC;AAEA,QAAM,QAAQ,KAAK,QAAQ;AAC3B,QAAM,UAAU,QACZ;AAAA,IACE,GAAG,KAAK;AAAA,IACR,WAAW;AAAA,MACT,gBAAgB,KAAK,IAAI,GAAG,MAAM,iBAAiB,qBAAqB;AAAA,MACxE,kBAAkB,KAAK,IAAI,GAAG,MAAM,mBAAmB,QAAQ,KAAK;AAAA,MACpE,oBAAoB,KAAK,IAAI,GAAG,MAAM,qBAAqB,QAAQ,OAAO;AAAA,MAC1E,mBAAmB,KAAK,IAAI,GAAG,MAAM,oBAAoB,QAAQ,MAAM;AAAA,MACvE,GAAI,MAAM,uBAAuB,SAC7B,EAAE,oBAAoB,KAAK,IAAI,GAAG,MAAM,qBAAqB,QAAQ,OAAO,EAAE,IAC9E,CAAC;AAAA,MACL,sBAAsB,KAAK,IAAI,GAAG,MAAM,uBAAuB,QAAQ,SAAS;AAAA,MAChF,mBAAmB,KAAK,IAAI,GAAG,MAAM,oBAAoB,QAAQ,MAAM;AAAA,MACvE,mBAAmB,KAAK,IAAI,GAAG,MAAM,oBAAoB,QAAQ,MAAM;AAAA,MACvE,GAAI,MAAM,4BAA4B,SAClC;AAAA,QACE,yBAAyB,KAAK;AAAA,UAC5B;AAAA,UACA,MAAM,0BAA0B,QAAQ;AAAA,QAC1C;AAAA,MACF,IACA,CAAC;AAAA,MACL,GAAI,MAAM,sBAAsB,SAC5B,EAAE,mBAAmB,KAAK,IAAI,GAAG,MAAM,oBAAoB,QAAQ,MAAM,EAAE,IAC3E,CAAC;AAAA,MACL,GAAI,MAAM,+BAA+B,SACrC;AAAA,QACE,4BAA4B,KAAK;AAAA,UAC/B;AAAA,UACA,MAAM,6BAA6B,QAAQ;AAAA,QAC7C;AAAA,MACF,IACA,CAAC;AAAA;AAAA;AAAA,MAGL,GAAI,MAAM,mBAAmB,SACzB;AAAA,QACE,gBACE,MAAM,uBAAuB,QAAQ,YAAY,IAAI,MAAM,iBAAiB;AAAA,MAChF,IACA,CAAC;AAAA,MACL,WAAW,MAAM;AAAA,IACnB;AAAA,EACF,IACA,KAAK;AACT,SAAO;AAAA,IACL,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA,qBAAqB,SAAS,KAAK,CAAC,UAAU,aAAa,KAAK,CAAC;AAAA,IACnE;AAAA,IACA;AAAA,EACF;AACF;AAOO,SAAS,oBACd,MACA,WAAW,OACa;AACxB,SAAO,8BAA8B,MAAM,QAAQ,EAAE;AACvD;AAEA,SAAS,YAAY,QAA0C;AAC7D,SAAO,CAAC,GAAG,OAAO,SAAS,GAAG,OAAO,QAAQ,QAAQ,CAAC,WAAW,OAAO,QAAQ,CAAC;AACnF;AAUO,SAAS,oBAAuC,UAAe,eAA6B;AACjG,SAAO,gBACH,WACA,SAAS,IAAI,CAAC,aAAa,EAAE,GAAG,SAAS,iBAAiB,KAAK,EAAE;AACvE;AAGO,SAAS,wBACd,UACA,MAAY,oBAAI,KAAK,GACrB,UAAgD,CAAC,GAC7B;AACpB,QAAM,WAAW,gBAAgB,UAAU,GAAG;AAC9C,QAAM,QAAQ,YAAY,QAAQ;AAClC,QAAM,YAAY,oBAAI,IAA6B;AACnD,QAAM,QAAQ,CAAC,SAAgC;AAC7C,QAAI,UAAU,IAAI,KAAK,QAAQ,EAAE,EAAG;AACpC,cAAU,IAAI,KAAK,QAAQ,IAAI,IAAI;AACnC,eAAW,SAAS,KAAK,SAAU,OAAM,KAAK;AAAA,EAChD;AACA,aAAW,QAAQ,MAAO,OAAM,IAAI;AAEpC,QAAM,EAAE,QAAQ,eAAe,IAAI,wBAAwB,QAAQ;AACnE,QAAM,SAAS,eAAe,QAAQ,CAAC,YAAY;AACjD,UAAM,eAAe,UAAU,IAAI,QAAQ,EAAE,KAAK;AAAA,MAChD;AAAA,MACA,UAAU,CAAC;AAAA,MACX,qBAAqB;AAAA,IACvB;AACA,UAAM,SAAS,oBAAoB,cAAc,IAAI;AACrD,WAAO,SAAS,CAAC,MAAM,IAAI,CAAC;AAAA,EAC9B,CAAC;AACD,QAAM,gBAAgB,MAAM,QAAQ,CAAC,SAAS;AAC5C,UAAM,SAAS,oBAAoB,IAAI;AACvC,WAAO,SAAS,CAAC,MAAM,IAAI,CAAC;AAAA,EAC9B,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,UAAU;AAAA,MACR,QAAQ,eAAe,QACnB,mBAAmB,aAAa,IAChC,uBAAuB,mBAAmB,aAAa,CAAC;AAAA,MAC5D;AAAA,IACF;AAAA,EACF;AACF;AAGO,SAAS,uBACd,MACA,mBACwB;AACxB,MAAI,CAAC,qBAAqB,KAAK,QAAQ,OAAO,kBAAmB,QAAO;AACxE,aAAW,SAAS,KAAK,UAAU;AACjC,QAAI,MAAM,QAAQ,OAAO,kBAAmB,QAAO;AACnD,UAAM,WAAW,uBAAuB,OAAO,iBAAiB;AAChE,QAAI,SAAU,QAAO;AAAA,EACvB;AACA,SAAO;AACT;AAMO,SAAS,gBACd,OACA,UACA,oBAAmC,MACS;AAC5C,QAAM,OAAmD,CAAC;AAC1D,QAAM,OAAO,CAAC,MAAuB,UAAwB;AAC3D,QAAI,CAAC,KAAK,UAAW,MAAK,KAAK,EAAE,MAAM,MAAM,CAAC;AAC9C,QAAI,KAAK,SAAS,SAAS,KAAK,SAAS,IAAI,KAAK,QAAQ,EAAE,GAAG;AAC7D,iBAAW,SAAS,KAAK,UAAU;AACjC,aAAK,OAAO,QAAQ,CAAC;AAAA,MACvB;AAAA,IACF,OAAO;AACL,YAAM,WAAW,uBAAuB,MAAM,iBAAiB;AAC/D,UAAI,SAAU,MAAK,KAAK,EAAE,MAAM,UAAU,OAAO,QAAQ,EAAE,CAAC;AAAA,IAC9D;AAAA,EACF;AACA,aAAW,QAAQ,MAAO,MAAK,MAAM,CAAC;AACtC,SAAO;AACT;AAEO,SAAS,kBACd,QACA,UACA,oBAAmC,MACS;AAC5C,SAAO,gBAAgB,YAAY,MAAM,GAAG,UAAU,iBAAiB;AACzE;AA0BO,SAAS,oBACd,QACA,UACsB;AACtB,QAAM,QAAQ,CAAC,GAAG,OAAO,SAAS,GAAG,OAAO,QAAQ,QAAQ,CAAC,WAAW,OAAO,QAAQ,CAAC;AACxF,QAAM,YAAY,oBAAI,IAAsC;AAC5D,aAAW,QAAQ,OAAO;AACxB,UAAM,YAAY,KAAK,QAAQ,aAAa;AAC5C,UAAM,QAAQ,cAAc,QAAQ,SAAS,KAAK,CAAC,YAAY,QAAQ,OAAO,SAAS;AACvF,UAAM,MAAM,QAAQ,YAAY;AAChC,UAAM,OAAO,UAAU,IAAI,GAAG,KAAK,CAAC;AACpC,SAAK,KAAK,IAAI;AACd,cAAU,IAAI,KAAK,IAAI;AAAA,EACzB;AACA,aAAW,QAAQ,UAAU,OAAO,GAAG;AACrC,SAAK,KAAK,CAAC,MAAM,UAAU;AACzB,YAAM,WAAW,aAAa,IAAI,IAAI,IAAI,KAAK,QAAQ,kBAAkB,IAAI;AAC7E,YAAM,YAAY,aAAa,KAAK,IAAI,IAAI,MAAM,QAAQ,kBAAkB,IAAI;AAChF,aAAO,WAAW,aAAa,uBAAuB,KAAK,SAAS,MAAM,OAAO;AAAA,IACnF,CAAC;AAAA,EACH;AACA,QAAM,WAAiC,CAAC;AACxC,WAAS;AAAA,IACP,GAAG,SAAS,IAAI,CAAC,aAAa;AAAA,MAC5B,KAAK,QAAQ;AAAA,MACb,WAAW,QAAQ;AAAA,MACnB,MAAM,QAAQ;AAAA,MACd,UAAU,UAAU,IAAI,QAAQ,EAAE,KAAK,CAAC;AAAA,IAC1C,EAAE;AAAA,EACJ;AACA,QAAM,kBAAkB,UAAU,IAAI,IAAI,KAAK,CAAC;AAChD,MAAI,gBAAgB,SAAS,GAAG;AAC9B,aAAS,KAAK,EAAE,KAAK,WAAW,WAAW,MAAM,MAAM,WAAW,UAAU,gBAAgB,CAAC;AAAA,EAC/F;AACA,SAAO;AACT;","names":["counts"]}
|