@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
package/src/hooks/internal.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { observedSessionSequence, type SessionEvent } from "@opengeni/sdk";
|
|
1
|
+
import { isTransientRequestError, observedSessionSequence, type SessionEvent } from "@opengeni/sdk";
|
|
2
2
|
import { useCallback, useEffect, useLayoutEffect, useRef, useState } from "react";
|
|
3
3
|
import type { EmbeddedSessionEventClientLike } from "../client";
|
|
4
4
|
import { normalizeError } from "../lib/error-message";
|
|
@@ -55,16 +55,88 @@ export type AsyncListState<T> = {
|
|
|
55
55
|
refresh: () => Promise<void>;
|
|
56
56
|
};
|
|
57
57
|
|
|
58
|
+
/**
|
|
59
|
+
* How a read hook rides out transient failures (a transport error or a
|
|
60
|
+
* 502/503/504, as during an API rolling deploy). While the failures last less
|
|
61
|
+
* than `quietWindowMs`, the hook keeps its loading state or its last data and
|
|
62
|
+
* retries with backoff; after that it surfaces the error but keeps retrying
|
|
63
|
+
* every `backgroundDelayMs`, and clears the error when a read succeeds.
|
|
64
|
+
* Definitive errors (401, 403, 404, other statuses) surface immediately.
|
|
65
|
+
*/
|
|
66
|
+
export type TransientReadRetryOptions = {
|
|
67
|
+
quietWindowMs?: number | undefined;
|
|
68
|
+
initialDelayMs?: number | undefined;
|
|
69
|
+
maxDelayMs?: number | undefined;
|
|
70
|
+
backgroundDelayMs?: number | undefined;
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
export type TransientReadRetryPolicy = {
|
|
74
|
+
quietWindowMs: number;
|
|
75
|
+
initialDelayMs: number;
|
|
76
|
+
maxDelayMs: number;
|
|
77
|
+
backgroundDelayMs: number;
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
export const DEFAULT_TRANSIENT_READ_RETRY: Readonly<TransientReadRetryPolicy> = Object.freeze({
|
|
81
|
+
quietWindowMs: 20_000,
|
|
82
|
+
initialDelayMs: 1_000,
|
|
83
|
+
maxDelayMs: 4_000,
|
|
84
|
+
backgroundDelayMs: 15_000,
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
type TransientReadStreak = { since: number; attempts: number; surfaced: boolean };
|
|
88
|
+
|
|
89
|
+
function jittered(delayMs: number): number {
|
|
90
|
+
return Math.round(delayMs * (0.8 + Math.random() * 0.4));
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* The decision for one transient read failure: stay quiet and retry soon, or
|
|
95
|
+
* surface the error (once per streak) and keep retrying in the background.
|
|
96
|
+
*/
|
|
97
|
+
export function transientReadRetryStep(
|
|
98
|
+
streak: TransientReadStreak,
|
|
99
|
+
now: number,
|
|
100
|
+
policy: TransientReadRetryPolicy,
|
|
101
|
+
): { quiet: boolean; delayMs: number } {
|
|
102
|
+
streak.attempts += 1;
|
|
103
|
+
const quiet = now - streak.since < policy.quietWindowMs;
|
|
104
|
+
const delayMs = quiet
|
|
105
|
+
? Math.min(policy.maxDelayMs, policy.initialDelayMs * 2 ** (streak.attempts - 1))
|
|
106
|
+
: policy.backgroundDelayMs;
|
|
107
|
+
return { quiet, delayMs: Math.max(0, jittered(delayMs)) };
|
|
108
|
+
}
|
|
109
|
+
|
|
58
110
|
/**
|
|
59
111
|
* Shared fetch + optional polling loop for the list/read hooks. Stale
|
|
60
112
|
* responses (superseded by a newer load or an unmount) are dropped.
|
|
113
|
+
* Transient failures are retried quietly (see {@link TransientReadRetryOptions}).
|
|
61
114
|
*/
|
|
62
115
|
export function usePolledValue<T>(
|
|
63
116
|
load: (signal?: AbortSignal) => Promise<T>,
|
|
64
|
-
options: {
|
|
117
|
+
options: {
|
|
118
|
+
pollIntervalMs?: number | undefined;
|
|
119
|
+
enabled?: boolean | undefined;
|
|
120
|
+
/** Quiet retry of transient failures; on by default, `false` surfaces them at once. */
|
|
121
|
+
transientRetry?: TransientReadRetryOptions | false | undefined;
|
|
122
|
+
} = {},
|
|
65
123
|
): AsyncListState<T> {
|
|
66
124
|
const enabled = options.enabled ?? true;
|
|
67
125
|
const pollIntervalMs = options.pollIntervalMs;
|
|
126
|
+
const transientRetryRef = useRef<TransientReadRetryPolicy | null>(null);
|
|
127
|
+
transientRetryRef.current =
|
|
128
|
+
options.transientRetry === false
|
|
129
|
+
? null
|
|
130
|
+
: {
|
|
131
|
+
quietWindowMs:
|
|
132
|
+
options.transientRetry?.quietWindowMs ?? DEFAULT_TRANSIENT_READ_RETRY.quietWindowMs,
|
|
133
|
+
initialDelayMs:
|
|
134
|
+
options.transientRetry?.initialDelayMs ?? DEFAULT_TRANSIENT_READ_RETRY.initialDelayMs,
|
|
135
|
+
maxDelayMs: options.transientRetry?.maxDelayMs ?? DEFAULT_TRANSIENT_READ_RETRY.maxDelayMs,
|
|
136
|
+
backgroundDelayMs:
|
|
137
|
+
options.transientRetry?.backgroundDelayMs ??
|
|
138
|
+
DEFAULT_TRANSIENT_READ_RETRY.backgroundDelayMs,
|
|
139
|
+
};
|
|
68
140
|
const pageLive = usePageLiveActivity();
|
|
69
141
|
const [data, setData] = useState<T | null>(null);
|
|
70
142
|
const [loading, setLoading] = useState(enabled);
|
|
@@ -77,6 +149,17 @@ export function usePolledValue<T>(
|
|
|
77
149
|
const requestAbortRef = useRef<AbortController | null>(null);
|
|
78
150
|
const inFlightRef = useRef<{ load: typeof load; promise: Promise<void> } | null>(null);
|
|
79
151
|
const trailingRefreshRef = useRef<{ load: typeof load; promise: Promise<void> } | null>(null);
|
|
152
|
+
// The current run of consecutive transient failures, and its pending retry.
|
|
153
|
+
const transientStreakRef = useRef<TransientReadStreak | null>(null);
|
|
154
|
+
const transientRetryTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
155
|
+
// Retries run only while the query is enabled and the page is live.
|
|
156
|
+
const retryLiveRef = useRef(false);
|
|
157
|
+
const cancelTransientRetry = useCallback(() => {
|
|
158
|
+
if (transientRetryTimerRef.current !== null) {
|
|
159
|
+
clearTimeout(transientRetryTimerRef.current);
|
|
160
|
+
transientRetryTimerRef.current = null;
|
|
161
|
+
}
|
|
162
|
+
}, []);
|
|
80
163
|
const [stateIdentity, setStateIdentity] = useState<{ load: typeof load }>(() => ({ load }));
|
|
81
164
|
|
|
82
165
|
// A new loader identity means a new query (different session/workspace/...):
|
|
@@ -107,6 +190,8 @@ export function usePolledValue<T>(
|
|
|
107
190
|
activeLoadRef.current === load &&
|
|
108
191
|
!requestAbort.signal.aborted
|
|
109
192
|
) {
|
|
193
|
+
transientStreakRef.current = null;
|
|
194
|
+
cancelTransientRetry();
|
|
110
195
|
setData(result);
|
|
111
196
|
setError(null);
|
|
112
197
|
setLoading(false);
|
|
@@ -117,8 +202,36 @@ export function usePolledValue<T>(
|
|
|
117
202
|
activeLoadRef.current === load &&
|
|
118
203
|
!requestAbort.signal.aborted
|
|
119
204
|
) {
|
|
120
|
-
|
|
121
|
-
|
|
205
|
+
const policy = transientRetryRef.current;
|
|
206
|
+
if (policy && retryLiveRef.current && isTransientRequestError(cause)) {
|
|
207
|
+
// Keep the loading state or the last data on screen while a
|
|
208
|
+
// deploy or network blip passes; retry, and surface the error
|
|
209
|
+
// only once it outlasts the quiet window.
|
|
210
|
+
const now = Date.now();
|
|
211
|
+
const streak = (transientStreakRef.current ??= {
|
|
212
|
+
since: now,
|
|
213
|
+
attempts: 0,
|
|
214
|
+
surfaced: false,
|
|
215
|
+
});
|
|
216
|
+
const step = transientReadRetryStep(streak, now, policy);
|
|
217
|
+
if (!step.quiet) {
|
|
218
|
+
// One stable error per streak: background retries that fail
|
|
219
|
+
// the same way must not re-announce it.
|
|
220
|
+
if (!streak.surfaced) setError(normalizeError(cause));
|
|
221
|
+
streak.surfaced = true;
|
|
222
|
+
setLoading(false);
|
|
223
|
+
}
|
|
224
|
+
cancelTransientRetry();
|
|
225
|
+
transientRetryTimerRef.current = setTimeout(() => {
|
|
226
|
+
transientRetryTimerRef.current = null;
|
|
227
|
+
if (retryLiveRef.current) void run();
|
|
228
|
+
}, step.delayMs);
|
|
229
|
+
} else {
|
|
230
|
+
transientStreakRef.current = null;
|
|
231
|
+
cancelTransientRetry();
|
|
232
|
+
setError(normalizeError(cause));
|
|
233
|
+
setLoading(false);
|
|
234
|
+
}
|
|
122
235
|
}
|
|
123
236
|
} finally {
|
|
124
237
|
if (requestAbortRef.current === requestAbort) requestAbortRef.current = null;
|
|
@@ -127,7 +240,7 @@ export function usePolledValue<T>(
|
|
|
127
240
|
})();
|
|
128
241
|
inFlightRef.current = { load, promise };
|
|
129
242
|
return promise;
|
|
130
|
-
}, [load]);
|
|
243
|
+
}, [cancelTransientRetry, load]);
|
|
131
244
|
|
|
132
245
|
const refresh = useCallback((): Promise<void> => {
|
|
133
246
|
const existing = inFlightRef.current;
|
|
@@ -146,7 +259,12 @@ export function usePolledValue<T>(
|
|
|
146
259
|
}, [load, run]);
|
|
147
260
|
|
|
148
261
|
useEffect(() => {
|
|
262
|
+
// Every (re)start begins a fresh streak; a pending retry belongs to the
|
|
263
|
+
// previous query or visibility period.
|
|
264
|
+
transientStreakRef.current = null;
|
|
265
|
+
cancelTransientRetry();
|
|
149
266
|
if (!enabled || !pageLive) {
|
|
267
|
+
retryLiveRef.current = false;
|
|
150
268
|
setLoading(false);
|
|
151
269
|
generation.current += 1;
|
|
152
270
|
requestAbortRef.current?.abort();
|
|
@@ -154,6 +272,7 @@ export function usePolledValue<T>(
|
|
|
154
272
|
trailingRefreshRef.current = null;
|
|
155
273
|
return;
|
|
156
274
|
}
|
|
275
|
+
retryLiveRef.current = true;
|
|
157
276
|
setLoading(true);
|
|
158
277
|
let cancelled = false;
|
|
159
278
|
let timer: ReturnType<typeof setTimeout> | null = null;
|
|
@@ -168,6 +287,8 @@ export function usePolledValue<T>(
|
|
|
168
287
|
if (pollIntervalMs === undefined || pollIntervalMs <= 0) {
|
|
169
288
|
return () => {
|
|
170
289
|
cancelled = true;
|
|
290
|
+
retryLiveRef.current = false;
|
|
291
|
+
cancelTransientRetry();
|
|
171
292
|
generation.current += 1;
|
|
172
293
|
requestAbortRef.current?.abort();
|
|
173
294
|
inFlightRef.current = null;
|
|
@@ -177,12 +298,14 @@ export function usePolledValue<T>(
|
|
|
177
298
|
return () => {
|
|
178
299
|
cancelled = true;
|
|
179
300
|
if (timer !== null) clearTimeout(timer);
|
|
301
|
+
retryLiveRef.current = false;
|
|
302
|
+
cancelTransientRetry();
|
|
180
303
|
generation.current += 1;
|
|
181
304
|
requestAbortRef.current?.abort();
|
|
182
305
|
inFlightRef.current = null;
|
|
183
306
|
trailingRefreshRef.current = null;
|
|
184
307
|
};
|
|
185
|
-
}, [run, enabled, pageLive, pollIntervalMs]);
|
|
308
|
+
}, [run, enabled, pageLive, pollIntervalMs, cancelTransientRetry]);
|
|
186
309
|
|
|
187
310
|
const identityMatches = stateIdentity.load === load;
|
|
188
311
|
return {
|
|
@@ -14,6 +14,7 @@ export type ClientConfigFlagsSource = {
|
|
|
14
14
|
archive?: boolean | undefined;
|
|
15
15
|
voiceInput?: ClientVoiceInputConfig | undefined;
|
|
16
16
|
realtimeVoice?: boolean | undefined;
|
|
17
|
+
browserExtension?: { name: string; installUrl: string } | undefined;
|
|
17
18
|
}>;
|
|
18
19
|
};
|
|
19
20
|
|
|
@@ -46,6 +47,11 @@ export type ClientConfigFlags = {
|
|
|
46
47
|
* then or when their `realtimeVoice` prop is `true`.
|
|
47
48
|
*/
|
|
48
49
|
realtimeVoiceOffered: boolean;
|
|
50
|
+
/**
|
|
51
|
+
* The Chrome extension the deployment offers for people's own Chrome, or
|
|
52
|
+
* null until the config loads or when the server doesn't say (Opengeni Browser).
|
|
53
|
+
*/
|
|
54
|
+
browserExtension: { name: string; installUrl: string } | null;
|
|
49
55
|
};
|
|
50
56
|
|
|
51
57
|
const INITIAL_FLAGS: ClientConfigFlags = {
|
|
@@ -60,6 +66,7 @@ const INITIAL_FLAGS: ClientConfigFlags = {
|
|
|
60
66
|
voiceInput: null,
|
|
61
67
|
realtimeVoice: false,
|
|
62
68
|
realtimeVoiceOffered: false,
|
|
69
|
+
browserExtension: null,
|
|
63
70
|
};
|
|
64
71
|
|
|
65
72
|
/** Deployment and session-proxy capabilities from the client config. */
|
|
@@ -89,6 +96,7 @@ export function useClientConfigFlags(
|
|
|
89
96
|
voiceInput: config.voiceInput?.available === true ? config.voiceInput : null,
|
|
90
97
|
realtimeVoice: config.realtimeVoice !== false,
|
|
91
98
|
realtimeVoiceOffered: config.realtimeVoice === true,
|
|
99
|
+
browserExtension: config.browserExtension ?? null,
|
|
92
100
|
});
|
|
93
101
|
}
|
|
94
102
|
},
|
|
@@ -2,6 +2,7 @@ import {
|
|
|
2
2
|
isPresentedSessionToolName,
|
|
3
3
|
isRetryableStreamError,
|
|
4
4
|
isSessionModelResponsePhase,
|
|
5
|
+
isTransientRequestError,
|
|
5
6
|
SESSION_EVENT_COMPAT_EXCLUDED_STEP_TYPES,
|
|
6
7
|
SESSION_EVENT_CONTENT_STEP_TYPES,
|
|
7
8
|
SESSION_EVENT_CONVERSATION_FILTER_VERSION,
|
|
@@ -22,7 +23,11 @@ import type { TimelineItem, TurnStepsItem } from "../timeline/types";
|
|
|
22
23
|
import type { EmbeddedSessionClientLike } from "../client";
|
|
23
24
|
import { normalizeError } from "../lib/error-message";
|
|
24
25
|
import { joinSessionDetailRead, sessionDetailReadMark } from "../lib/session-detail-read";
|
|
25
|
-
import {
|
|
26
|
+
import {
|
|
27
|
+
DEFAULT_TRANSIENT_READ_RETRY,
|
|
28
|
+
transientReadRetryStep,
|
|
29
|
+
usePageLiveActivity,
|
|
30
|
+
} from "./internal";
|
|
26
31
|
import { subscribePageWake } from "./page-wake";
|
|
27
32
|
import { deniesRetainedView, useRetainedSessionView } from "./session-view-cache";
|
|
28
33
|
import { markTurnlessOutputGap } from "./turnless-output-gaps";
|
|
@@ -311,6 +316,13 @@ export function useSessionEvents(
|
|
|
311
316
|
const [presentedPass, setPresentedPass] = useState(0);
|
|
312
317
|
// A return to the live tip from history: catch up without replaying steps.
|
|
313
318
|
const rejoinPendingRef = useRef(false);
|
|
319
|
+
// Consecutive transient failures to open this stream (a deploy or network
|
|
320
|
+
// blip): they restart it quietly before an error is shown.
|
|
321
|
+
const streamTransientStreakRef = useRef<{
|
|
322
|
+
since: number;
|
|
323
|
+
attempts: number;
|
|
324
|
+
surfaced: boolean;
|
|
325
|
+
} | null>(null);
|
|
314
326
|
|
|
315
327
|
const commitStepStores = useCallback((next: TurnStepStores) => {
|
|
316
328
|
stepStoresRef.current = next;
|
|
@@ -659,6 +671,7 @@ export function useSessionEvents(
|
|
|
659
671
|
initialWindowLoadedRef.current = false;
|
|
660
672
|
reconcileAfterPageResumeRef.current = false;
|
|
661
673
|
rejoinPendingRef.current = false;
|
|
674
|
+
streamTransientStreakRef.current = null;
|
|
662
675
|
stepGenerationRef.current += 1;
|
|
663
676
|
stepStoresRef.current = EMPTY_STEP_STORES;
|
|
664
677
|
setStepStores(EMPTY_STEP_STORES);
|
|
@@ -678,6 +691,9 @@ export function useSessionEvents(
|
|
|
678
691
|
const generation = generationRef.current + 1;
|
|
679
692
|
generationRef.current = generation;
|
|
680
693
|
if (!sessionId || !streamEnabled) {
|
|
694
|
+
// A suspended stream starts a fresh transient streak when it resumes: a
|
|
695
|
+
// failure right after a wake must not count the hidden time.
|
|
696
|
+
streamTransientStreakRef.current = null;
|
|
681
697
|
// A page that stayed hidden beyond the live-activity grace deliberately
|
|
682
698
|
// closed its SSE connection. Replaying from the old cursor on return can
|
|
683
699
|
// drip a large background backlog through React in many fast batches and
|
|
@@ -717,6 +733,15 @@ export function useSessionEvents(
|
|
|
717
733
|
navigationIdentityRef.current.streamKey === streamKey &&
|
|
718
734
|
navigationIdentityRef.current.enabled === enabled;
|
|
719
735
|
streamAbortRef.current = controller;
|
|
736
|
+
// A quiet restart or reconciliation retry scheduled by this effect instance.
|
|
737
|
+
let transientRetryTimer: ReturnType<typeof setTimeout> | null = null;
|
|
738
|
+
const scheduleTransientRetry = (delayMs: number, retry: () => void) => {
|
|
739
|
+
if (transientRetryTimer !== null) clearTimeout(transientRetryTimer);
|
|
740
|
+
transientRetryTimer = setTimeout(() => {
|
|
741
|
+
transientRetryTimer = null;
|
|
742
|
+
if (isCurrent()) retry();
|
|
743
|
+
}, delayMs);
|
|
744
|
+
};
|
|
720
745
|
// Batch yielded events into one React update per flush window so a long
|
|
721
746
|
// replay (thousands of events) does not render per event. Project every
|
|
722
747
|
// event before retaining it here and synchronously flush at independent
|
|
@@ -962,6 +987,7 @@ export function useSessionEvents(
|
|
|
962
987
|
skippedStepsThroughRef.current =
|
|
963
988
|
retained.events.length === 0 && window.newestSequence > 0 ? window.newestSequence : null;
|
|
964
989
|
initialWindowLoadedRef.current = true;
|
|
990
|
+
streamTransientStreakRef.current = null;
|
|
965
991
|
setInitialHistoryReady(true);
|
|
966
992
|
setError(null);
|
|
967
993
|
if (status !== undefined) {
|
|
@@ -984,6 +1010,31 @@ export function useSessionEvents(
|
|
|
984
1010
|
liveThroughRef.current = Math.max(liveThroughRef.current, streamResumeSequenceRef.current);
|
|
985
1011
|
};
|
|
986
1012
|
|
|
1013
|
+
// Reconciliation after an open re-reads the API contract and projections.
|
|
1014
|
+
// A transient failure (a reconnect during an API rollout often lands on a
|
|
1015
|
+
// pod that is still starting) retries quietly; the error is shown only
|
|
1016
|
+
// when it is definitive or outlasts the quiet window.
|
|
1017
|
+
const reconcileAfterOpen = (
|
|
1018
|
+
initialOpen: boolean,
|
|
1019
|
+
streak: { since: number; attempts: number; surfaced: boolean } | null = null,
|
|
1020
|
+
) => {
|
|
1021
|
+
void Promise.resolve()
|
|
1022
|
+
.then(() => reconcileSession(sessionId, { initialOpen }))
|
|
1023
|
+
.catch((cause) => {
|
|
1024
|
+
if (!isCurrent()) return;
|
|
1025
|
+
if (isTransientRequestError(cause)) {
|
|
1026
|
+
const now = Date.now();
|
|
1027
|
+
const current = streak ?? { since: now, attempts: 0, surfaced: false };
|
|
1028
|
+
const step = transientReadRetryStep(current, now, DEFAULT_TRANSIENT_READ_RETRY);
|
|
1029
|
+
if (step.quiet) {
|
|
1030
|
+
scheduleTransientRetry(step.delayMs, () => reconcileAfterOpen(initialOpen, current));
|
|
1031
|
+
return;
|
|
1032
|
+
}
|
|
1033
|
+
}
|
|
1034
|
+
setError(normalizeError(cause));
|
|
1035
|
+
});
|
|
1036
|
+
};
|
|
1037
|
+
|
|
987
1038
|
// One bounded rejoin attempt: it is abandoned once no read completes for
|
|
988
1039
|
// REJOIN_STALL_TIMEOUT_MS, and a late result is fenced out of the view
|
|
989
1040
|
// (reads without a signal can only be outwaited). A `strict` attempt
|
|
@@ -1179,16 +1230,13 @@ export function useSessionEvents(
|
|
|
1179
1230
|
const initialOpen = openedStreamKeyRef.current !== streamKey;
|
|
1180
1231
|
openedStreamKeyRef.current = streamKey;
|
|
1181
1232
|
strictFailures = 0;
|
|
1233
|
+
// The outage is over: drop an error a long transient streak surfaced.
|
|
1234
|
+
if (streamTransientStreakRef.current?.surfaced) setError(null);
|
|
1235
|
+
streamTransientStreakRef.current = null;
|
|
1182
1236
|
// Reconciliation repairs projections, but it must not block reading
|
|
1183
1237
|
// the already-open SSE body. Otherwise live events accumulate in the
|
|
1184
1238
|
// browser and appear as one delayed burst after every reconciler ends.
|
|
1185
|
-
|
|
1186
|
-
.then(() => reconcileSession(sessionId, { initialOpen }))
|
|
1187
|
-
.catch((cause) => {
|
|
1188
|
-
if (isCurrent()) {
|
|
1189
|
-
setError(normalizeError(cause));
|
|
1190
|
-
}
|
|
1191
|
-
});
|
|
1239
|
+
reconcileAfterOpen(initialOpen);
|
|
1192
1240
|
},
|
|
1193
1241
|
onStateChange: (state) => {
|
|
1194
1242
|
if (isCurrent()) {
|
|
@@ -1227,7 +1275,32 @@ export function useSessionEvents(
|
|
|
1227
1275
|
} catch (cause) {
|
|
1228
1276
|
if (isCurrent()) {
|
|
1229
1277
|
flush();
|
|
1230
|
-
|
|
1278
|
+
let announce = true;
|
|
1279
|
+
if (isTransientRequestError(cause)) {
|
|
1280
|
+
// The tail read or the stream failed transiently (an API rollout
|
|
1281
|
+
// or a network blip). Restart quietly, keeping the loading state
|
|
1282
|
+
// or the current view, and show the error only if it outlasts the
|
|
1283
|
+
// quiet window. Afterwards keep retrying in the background.
|
|
1284
|
+
const now = Date.now();
|
|
1285
|
+
const streak = (streamTransientStreakRef.current ??= {
|
|
1286
|
+
since: now,
|
|
1287
|
+
attempts: 0,
|
|
1288
|
+
surfaced: false,
|
|
1289
|
+
});
|
|
1290
|
+
const step = transientReadRetryStep(streak, now, DEFAULT_TRANSIENT_READ_RETRY);
|
|
1291
|
+
scheduleTransientRetry(step.delayMs, () => setStreamEpoch((epoch) => epoch + 1));
|
|
1292
|
+
if (step.quiet) {
|
|
1293
|
+
setConnectionState("connecting");
|
|
1294
|
+
return;
|
|
1295
|
+
}
|
|
1296
|
+
// One stable error per streak: background retries that fail the
|
|
1297
|
+
// same way must not re-announce it.
|
|
1298
|
+
announce = !streak.surfaced;
|
|
1299
|
+
streak.surfaced = true;
|
|
1300
|
+
} else {
|
|
1301
|
+
streamTransientStreakRef.current = null;
|
|
1302
|
+
}
|
|
1303
|
+
if (announce) setError(normalizeError(cause));
|
|
1231
1304
|
setConnectionState("error");
|
|
1232
1305
|
// A failed first compact-tail request has no later success path in
|
|
1233
1306
|
// this effect instance. End the loading gate so hosts can render the
|
|
@@ -1239,6 +1312,7 @@ export function useSessionEvents(
|
|
|
1239
1312
|
|
|
1240
1313
|
return () => {
|
|
1241
1314
|
controller.abort();
|
|
1315
|
+
if (transientRetryTimer !== null) clearTimeout(transientRetryTimer);
|
|
1242
1316
|
if (generationRef.current === generation) {
|
|
1243
1317
|
generationRef.current = generation + 1;
|
|
1244
1318
|
}
|
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type {
|
|
2
|
+
Session,
|
|
3
|
+
SessionListEntry,
|
|
4
|
+
SessionListTotals,
|
|
5
|
+
SiteConversationGroup,
|
|
6
|
+
} from "@opengeni/sdk";
|
|
2
7
|
import { useCallback, useEffect, useRef } from "react";
|
|
3
8
|
import { useOpenGeni, type ClientOverride } from "../provider";
|
|
4
9
|
import { usePolledValue } from "./internal";
|
|
@@ -23,6 +28,11 @@ export type UseWorkspaceSessionsOptions = ClientOverride & {
|
|
|
23
28
|
archivedOnly?: boolean | undefined;
|
|
24
29
|
sortBy?: "updatedAt" | "createdAt" | "name" | undefined;
|
|
25
30
|
archiveStatus?: "active" | "archived" | "all" | undefined;
|
|
31
|
+
/**
|
|
32
|
+
* Conversations that run inside a Site: `include` lists them as rows,
|
|
33
|
+
* `group` (root pages) returns them as `siteGroups` instead.
|
|
34
|
+
*/
|
|
35
|
+
siteConversations?: "include" | "group" | undefined;
|
|
26
36
|
/** Refresh interval (ms) for fleet/manager views. Off by default. */
|
|
27
37
|
pollIntervalMs?: number | undefined;
|
|
28
38
|
enabled?: boolean | undefined;
|
|
@@ -41,6 +51,10 @@ export type UseWorkspaceSessionsResult<T extends Session | SessionListEntry = Se
|
|
|
41
51
|
/** True when the server omitted older pins from its bounded pinned section. */
|
|
42
52
|
pinnedTruncated: boolean;
|
|
43
53
|
totals: SessionListTotals | null;
|
|
54
|
+
/** Complete Site rows for a `group` page; null when not requested or unsupported. */
|
|
55
|
+
siteGroups: SiteConversationGroup[] | null;
|
|
56
|
+
/** True when the server omitted Site rows beyond its bound. */
|
|
57
|
+
siteGroupsTruncated: boolean;
|
|
44
58
|
nextCursor: string | null;
|
|
45
59
|
loading: boolean;
|
|
46
60
|
error: Error | null;
|
|
@@ -79,6 +93,7 @@ export function useWorkspaceSessions(
|
|
|
79
93
|
const archivedOnly = options.archivedOnly;
|
|
80
94
|
const sortBy = options.sortBy;
|
|
81
95
|
const archiveStatus = options.archiveStatus;
|
|
96
|
+
const siteConversations = options.siteConversations;
|
|
82
97
|
const enabled = options.enabled ?? true;
|
|
83
98
|
const nextReadRevision = useRef(0);
|
|
84
99
|
const nextReadGeneration = useRef(0);
|
|
@@ -99,6 +114,7 @@ export function useWorkspaceSessions(
|
|
|
99
114
|
archivedOnly ? "archived" : "active",
|
|
100
115
|
sortBy ?? "",
|
|
101
116
|
archiveStatus ?? "",
|
|
117
|
+
siteConversations ?? "",
|
|
102
118
|
].join("\u0000");
|
|
103
119
|
const previousQueryKey = useRef(queryKey);
|
|
104
120
|
const queryKeyTransition = previousQueryKey.current !== queryKey;
|
|
@@ -122,6 +138,7 @@ export function useWorkspaceSessions(
|
|
|
122
138
|
...(archivedOnly ? { archivedOnly: true } : {}),
|
|
123
139
|
...(sortBy ? { sortBy } : {}),
|
|
124
140
|
...(archiveStatus ? { archiveStatus } : {}),
|
|
141
|
+
...(siteConversations ? { siteConversations } : {}),
|
|
125
142
|
signal,
|
|
126
143
|
};
|
|
127
144
|
const page =
|
|
@@ -162,6 +179,7 @@ export function useWorkspaceSessions(
|
|
|
162
179
|
archivedOnly,
|
|
163
180
|
sortBy,
|
|
164
181
|
archiveStatus,
|
|
182
|
+
siteConversations,
|
|
165
183
|
queryKey,
|
|
166
184
|
],
|
|
167
185
|
);
|
|
@@ -183,6 +201,8 @@ export function useWorkspaceSessions(
|
|
|
183
201
|
pinned,
|
|
184
202
|
pinnedTruncated: page?.pinnedTruncated ?? false,
|
|
185
203
|
totals: page?.totals ?? null,
|
|
204
|
+
siteGroups: page?.siteGroups ?? null,
|
|
205
|
+
siteGroupsTruncated: page?.siteGroupsTruncated === true,
|
|
186
206
|
nextCursor: page?.nextCursor ?? null,
|
|
187
207
|
// `usePolledValue` clears the old data and starts the new request in an
|
|
188
208
|
// effect. During that query-key transition render, its old loading flag
|
package/src/messages/en.ts
CHANGED
|
@@ -383,7 +383,7 @@ export const englishMessages = {
|
|
|
383
383
|
"browserViewer.inputResultUnknown": "Input result unknown",
|
|
384
384
|
"browserViewer.inspectThePageBeforeContinuing": "Inspect the page before continuing.",
|
|
385
385
|
"browserViewer.installTheOpengeniBrowserExtension":
|
|
386
|
-
"Install the
|
|
386
|
+
"Install the {extensionName} extension in the profile you want to use.",
|
|
387
387
|
"browserViewer.interactiveBrowserPage": "Interactive browser page",
|
|
388
388
|
"browserViewer.itsPrivateStateIsSaved":
|
|
389
389
|
"Its private state is saved. Opening it creates a fresh, isolated browser process.",
|
|
@@ -3992,8 +3992,8 @@ export const englishMessages = {
|
|
|
3992
3992
|
"timeline.toolStep.shareFile.running": "Sharing a file",
|
|
3993
3993
|
"timeline.toolStep.signIn.done": "Signed in",
|
|
3994
3994
|
"timeline.toolStep.signIn.running": "Signing in",
|
|
3995
|
-
"timeline.toolStep.startHelper.done": "
|
|
3996
|
-
"timeline.toolStep.startHelper.running": "
|
|
3995
|
+
"timeline.toolStep.startHelper.done": "Started a worker",
|
|
3996
|
+
"timeline.toolStep.startHelper.running": "Starting a worker",
|
|
3997
3997
|
"timeline.toolStep.switchComputer.done": "Switched computers",
|
|
3998
3998
|
"timeline.toolStep.switchComputer.running": "Switching computers",
|
|
3999
3999
|
"timeline.toolStep.syncPosts.done": "Synced posts",
|
|
@@ -16,6 +16,10 @@ import { findPickerRow, type PickerModelRow } from "./model-policy";
|
|
|
16
16
|
import { sessionDisplayStatus, type SessionDisplayStatus } from "./session-status-model";
|
|
17
17
|
import { type OpenGeniText } from "./messages/runtime";
|
|
18
18
|
|
|
19
|
+
// Title ranking shared with the web command menu, so chat search on every
|
|
20
|
+
// surface orders matches the same way.
|
|
21
|
+
export { foldForSearch, LOOSE_MATCH_BELOW, rankLabel } from "./app/lib/actions/rank";
|
|
22
|
+
|
|
19
23
|
/** A list row may be a compact page entry or a complete session response. */
|
|
20
24
|
export type SessionListRow = Session | SessionListEntry;
|
|
21
25
|
|
|
@@ -12,7 +12,6 @@ import {
|
|
|
12
12
|
BrainCircuitIcon,
|
|
13
13
|
MessageSquareTextIcon,
|
|
14
14
|
SendIcon,
|
|
15
|
-
WrenchIcon,
|
|
16
15
|
} from "lucide-react";
|
|
17
16
|
import {
|
|
18
17
|
Component,
|
|
@@ -43,6 +42,8 @@ import {
|
|
|
43
42
|
} from "./shared";
|
|
44
43
|
import { invokedToolCall } from "./invoked-tool";
|
|
45
44
|
import { toolDisplayName } from "./tool-display-name";
|
|
45
|
+
import { ToolKindIcon } from "./tool-icon";
|
|
46
|
+
import { genericToolIconKind } from "./tool-presentation";
|
|
46
47
|
import type { ActivityItem, AgentMessageItem, MemoryItem, ToolCallItem, WorkerItem } from "./types";
|
|
47
48
|
import { useOpenGeniText, type OpenGeniText } from "../messages/runtime";
|
|
48
49
|
|
|
@@ -405,7 +406,7 @@ function ToolOutputExactRow({
|
|
|
405
406
|
return (
|
|
406
407
|
<div data-og-tool-output-loading="" aria-busy="true">
|
|
407
408
|
<ActivityDisclosure
|
|
408
|
-
icon={<
|
|
409
|
+
icon={<ToolKindIcon kind={genericToolIconKind(item.name)} className="size-3.5" />}
|
|
409
410
|
title={toolDisplayName(msg, item.name, item.display)}
|
|
410
411
|
preview={msg("timeline.toolRenderers.loadingOutput")}
|
|
411
412
|
expandable={false}
|
|
@@ -2,14 +2,24 @@ import { parseToolArgs } from "./parsers";
|
|
|
2
2
|
import { mcpToolLeaf } from "./tool-display-name";
|
|
3
3
|
import type { ToolCallItem } from "./types";
|
|
4
4
|
|
|
5
|
+
/** The tool a `tool_invoke` call ran, or null for any other call. */
|
|
6
|
+
export function invokedTool(
|
|
7
|
+
name: string,
|
|
8
|
+
rawArguments: unknown,
|
|
9
|
+
): { name: string; arguments: unknown } | null {
|
|
10
|
+
if (mcpToolLeaf(name) !== "tool_invoke") return null;
|
|
11
|
+
const args = parseToolArgs(rawArguments);
|
|
12
|
+
if (typeof args.name !== "string" || !args.name.trim()) return null;
|
|
13
|
+
return { name: args.name, arguments: args.arguments ?? {} };
|
|
14
|
+
}
|
|
15
|
+
|
|
5
16
|
/**
|
|
6
17
|
* A `tool_invoke` call shown as the tool it ran, so the row reads "Run on …"
|
|
7
18
|
* instead of "Tool invoke". Any other call comes back unchanged.
|
|
8
19
|
*/
|
|
9
20
|
export function invokedToolCall(item: ToolCallItem): ToolCallItem {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
if (typeof args.name !== "string" || !args.name.trim()) return item;
|
|
21
|
+
const invoked = invokedTool(item.name, item.arguments);
|
|
22
|
+
if (!invoked) return item;
|
|
13
23
|
const { display: _display, ...rest } = item;
|
|
14
|
-
return { ...rest,
|
|
24
|
+
return { ...rest, ...invoked };
|
|
15
25
|
}
|
|
@@ -33,6 +33,7 @@ import {
|
|
|
33
33
|
tryParseJson,
|
|
34
34
|
} from "../lib/format";
|
|
35
35
|
import { mcpToolLeaf, toolMatchesLeaf } from "./tool-display-name";
|
|
36
|
+
import { invokedTool } from "./invoked-tool";
|
|
36
37
|
import { presentTurnFailureText } from "./compaction-copy";
|
|
37
38
|
import { toolOutputPreviewFact, type ToolOutputReader } from "../hooks/tool-output-reads";
|
|
38
39
|
import type {
|
|
@@ -894,21 +895,25 @@ export function buildTimeline(
|
|
|
894
895
|
// decision behind a duplicate generic "Ask" step.
|
|
895
896
|
break;
|
|
896
897
|
}
|
|
898
|
+
// A worker started or messaged through tool_invoke is the same worker.
|
|
899
|
+
const invoked = invokedTool(name, args);
|
|
900
|
+
const workerName = invoked?.name ?? name;
|
|
901
|
+
const workerArgs = invoked ? invoked.arguments : args;
|
|
897
902
|
if (
|
|
898
|
-
toolMatchesLeaf(
|
|
899
|
-
toolMatchesLeaf(
|
|
903
|
+
toolMatchesLeaf(workerName, WORKER_SPAWN_TOOL) ||
|
|
904
|
+
toolMatchesLeaf(workerName, WORKER_MESSAGE_TOOL)
|
|
900
905
|
) {
|
|
901
|
-
const spawn = toolMatchesLeaf(
|
|
902
|
-
const title = spawn ? workerTitle(
|
|
906
|
+
const spawn = toolMatchesLeaf(workerName, WORKER_SPAWN_TOOL);
|
|
907
|
+
const title = spawn ? workerTitle(workerArgs) : null;
|
|
903
908
|
const item: WorkerItem = {
|
|
904
909
|
kind: "worker",
|
|
905
910
|
id: event.id,
|
|
906
911
|
turnId,
|
|
907
912
|
callId,
|
|
908
913
|
action: spawn ? "spawn" : "message",
|
|
909
|
-
prompt: workerPrompt(
|
|
914
|
+
prompt: workerPrompt(workerArgs),
|
|
910
915
|
...(title ? { title } : {}),
|
|
911
|
-
workerSessionId: extractSessionRef(
|
|
916
|
+
workerSessionId: extractSessionRef(workerArgs),
|
|
912
917
|
failure: null,
|
|
913
918
|
status: "running",
|
|
914
919
|
occurredAt: event.occurredAt,
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { renderActivity } from "./activity-rail";
|
|
2
2
|
import { AnimatePresence, motion, useReducedMotion } from "motion/react";
|
|
3
|
-
import { WrenchIcon } from "lucide-react";
|
|
4
3
|
import { Suspense, useEffect, useState } from "react";
|
|
5
4
|
import { CompactActivityContext } from "./shared";
|
|
6
5
|
import { defaultToolRegistry } from "./tool-renderers";
|
|
7
6
|
import type { ToolRegistry } from "./registry";
|
|
8
7
|
import { toolDisplayName } from "./tool-display-name";
|
|
8
|
+
import { ToolKindIcon } from "./tool-icon";
|
|
9
|
+
import { genericToolIconKind } from "./tool-presentation";
|
|
9
10
|
import { toolStepPhase } from "./tool-steps";
|
|
10
11
|
import type { ActivityItem } from "./types";
|
|
11
12
|
import { rollingActivityItem } from "./work-presentation";
|
|
@@ -36,7 +37,10 @@ export function RollingActivity({
|
|
|
36
37
|
const { item, earlierCount } = selected;
|
|
37
38
|
const fallback = (
|
|
38
39
|
<span className="og-rolling-label">
|
|
39
|
-
<
|
|
40
|
+
<ToolKindIcon
|
|
41
|
+
kind={item.kind === "tool-call" ? genericToolIconKind(item.name) : "wrench"}
|
|
42
|
+
className="size-3.5"
|
|
43
|
+
/>
|
|
40
44
|
<span>
|
|
41
45
|
{item.kind === "tool-call"
|
|
42
46
|
? toolDisplayName(t, item.name, item.display, toolStepPhase(item.status))
|
|
@@ -28,8 +28,8 @@ export function toolMatchesLeaf(wireName: string, leaf: string): boolean {
|
|
|
28
28
|
|
|
29
29
|
/**
|
|
30
30
|
* Readable label for a tool call. Opengeni's own tools read as plain steps in
|
|
31
|
-
* the given phase ("opengeni__session_create" → "
|
|
32
|
-
*
|
|
31
|
+
* the given phase ("opengeni__session_create" → "Starting a worker" while
|
|
32
|
+
* running, "Started a worker" once done; see
|
|
33
33
|
* `tool-steps`). Any other tool title-cases its leaf ("list_issues" → "List
|
|
34
34
|
* issues"). A connector account is named only when the connector has several
|
|
35
35
|
* ("List issues · alice@example.com"); the connector itself shows as its logo.
|