@opengeni/react 6.7.0 → 6.7.1-canary.41759707569001
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 +9 -9
- package/dist/app/components/Composer.js +19 -19
- package/dist/app/components/agent/agent-capability-picker.js +6 -6
- package/dist/app/components/artifacts/artifact-browse-controls.js +2 -2
- package/dist/app/components/artifacts/artifact-library.js +13 -13
- package/dist/app/components/artifacts/artifact-viewer.js +21 -21
- package/dist/app/components/artifacts/chat-interactive-block.js +14 -14
- package/dist/app/components/artifacts/copy-artifact-link.js +2 -2
- package/dist/app/components/artifacts/file-reach-dialog.js +7 -7
- package/dist/app/components/artifacts/inline-chat-image.js +22 -22
- package/dist/app/components/artifacts/retained-file-preview.js +23 -23
- package/dist/app/components/artifacts/retained-text-preview.js +3 -3
- package/dist/app/components/artifacts/site-actions.d.ts +43 -0
- package/dist/app/components/artifacts/site-actions.js +38 -0
- package/dist/app/components/artifacts/site-audience.js +5 -5
- package/dist/app/components/artifacts/site-conversations.js +13 -13
- package/dist/app/components/artifacts/site-data.js +14 -14
- package/dist/app/components/artifacts/site-publishing-page.js +31 -31
- package/dist/app/components/artifacts/site-publishing.js +25 -25
- package/dist/app/components/artifacts/site-settings.js +30 -30
- package/dist/app/components/artifacts/site-version-menu.js +3 -3
- package/dist/app/components/billing-class-mark.js +3 -3
- package/dist/app/components/bots/bot-launch-strip.js +23 -23
- package/dist/app/components/bots/bot-template-dialog.js +30 -30
- package/dist/app/components/bots/bot-template-shortcuts.js +23 -23
- package/dist/app/components/bots/bot-templates-page.js +37 -37
- package/dist/app/components/capabilities/capability-detail-sheet.js +9 -9
- package/dist/app/components/capabilities/capability-logo-source.js +15 -16
- package/dist/app/components/capabilities/connection-ownership-selector.js +4 -4
- package/dist/app/components/capabilities/connector-tool-permissions.js +4 -4
- package/dist/app/components/capabilities/detail-dialog.js +3 -3
- package/dist/app/components/capabilities/native-connect-setup.js +17 -18
- package/dist/app/components/capabilities/native-connect-setup.js.map +1 -1
- package/dist/app/components/capabilities/own-logins-shared-heads-up.js +3 -3
- package/dist/app/components/capabilities/prepared-mcp-setup-card.js +17 -18
- package/dist/app/components/capabilities/session-capability-card.js +55 -56
- package/dist/app/components/capabilities/session-capability-card.js.map +1 -1
- package/dist/app/components/capabilities/session-chrome-card.js +24 -25
- package/dist/app/components/capabilities/session-custom-mcp-card.js +18 -19
- package/dist/app/components/capabilities/session-github-card.js +18 -19
- package/dist/app/components/capabilities/session-machine-card.js +23 -24
- package/dist/app/components/capabilities/session-personal-github-card.js +16 -17
- package/dist/app/components/capabilities/session-plugin-card.js +9 -10
- package/dist/app/components/capabilities/use-connection-accounts.js +2 -2
- package/dist/app/components/command-menu/chat-status.js +19 -19
- package/dist/app/components/command-menu/chat-switcher.js +35 -35
- package/dist/app/components/command-menu/command-menu.js +42 -42
- package/dist/app/components/command-menu/shortcut-sheet.js +11 -11
- package/dist/app/components/composer-capabilities-menu-body.js +4 -4
- package/dist/app/components/composer-mobile-plus-panel.js +10 -10
- package/dist/app/components/composer-mobile-plus.js +3 -3
- package/dist/app/components/credit-required-gate.js +1 -1
- package/dist/app/components/credit-required-prompt.js +4 -4
- package/dist/app/components/credits/checkout-credits-celebration.js +3 -3
- package/dist/app/components/credits/checkout-return.js +3 -3
- package/dist/app/components/credits/credit-refusal-notice.js +2 -2
- package/dist/app/components/desktop/app-shots.js +6 -6
- package/dist/app/components/desktop/computer-use.js +2 -2
- package/dist/app/components/desktop/this-computer.js +5 -5
- package/dist/app/components/feedback.js +5 -5
- package/dist/app/components/github-app-connect-launcher.js +1 -1
- package/dist/app/components/machines/connect-machine-dialog.js +14 -14
- package/dist/app/components/markdown.js +7 -7
- package/dist/app/components/models/models-ui.js +6 -6
- package/dist/app/components/my-things.js +6 -6
- package/dist/app/components/own-where-it-works.js +5 -5
- package/dist/app/components/personal-resource-attachment-surface.js +4 -4
- package/dist/app/components/pickers.js +5 -5
- package/dist/app/components/rail/channel-create-dialog.js +5 -5
- package/dist/app/components/rail/project-glyph.js +23 -23
- package/dist/app/components/rail/project-profile.js +32 -32
- package/dist/app/components/rail/rail-context.js +1 -1
- package/dist/app/components/rail/rail-sections.js +69 -60
- package/dist/app/components/rail/session-header.js +54 -53
- package/dist/app/components/rail/session-list.js +67 -58
- package/dist/app/components/rail/session-row-content.js +4 -4
- package/dist/app/components/rail/session-row-hover-details.js +18 -18
- package/dist/app/components/rail/session-shell.js +86 -77
- package/dist/app/components/rail/site-session-group-heading.js +29 -12
- package/dist/app/components/session/agent-configuration-panel.js +14 -14
- package/dist/app/components/session/artifact-session-page.js +5 -5
- package/dist/app/components/session/banners.js +9 -9
- package/dist/app/components/session/console-new-conversation.js +42 -43
- package/dist/app/components/session/descendant-requests.js +38 -39
- package/dist/app/components/session/descendant-requests.js.map +1 -1
- package/dist/app/components/session/editable-artifacts-workspace.js +27 -27
- package/dist/app/components/session/failed-session-banner.js +9 -9
- package/dist/app/components/session/failure-recovery-boundary.js +3 -3
- package/dist/app/components/session/human-input-delegation-record.js +2 -2
- package/dist/app/components/session/human-input.js +36 -37
- package/dist/app/components/session/inspector.js +45 -46
- package/dist/app/components/session/inspector.js.map +1 -1
- package/dist/app/components/session/message-actions.js +5 -5
- package/dist/app/components/session/message-resource-attachments.js +13 -13
- package/dist/app/components/session/model-recovery-notice.js +3 -3
- package/dist/app/components/session/new-session-settings-menu.js +6 -6
- package/dist/app/components/session/new-session-setup-strip.js +24 -24
- package/dist/app/components/session/sandbox-recovery-actions.js +5 -5
- package/dist/app/components/session/sandbox-switcher.js +8 -8
- package/dist/app/components/session/sandbox-workspace.js +52 -53
- package/dist/app/components/session/search-markdown-highlight.js +8 -8
- package/dist/app/components/session/search-results-view.js +9 -9
- package/dist/app/components/session/session-admin-access.js +5 -5
- package/dist/app/components/session/session-admission-notice.js +4 -4
- package/dist/app/components/session/session-avatar-picker.js +24 -24
- package/dist/app/components/session/session-avatar.js +22 -22
- package/dist/app/components/session/session-machine-access-notice.js +4 -4
- package/dist/app/components/session/session-profile-dialog.js +29 -29
- package/dist/app/components/session/session-profile-editor.js +30 -30
- package/dist/app/components/session/session-retention.js +3 -3
- package/dist/app/components/session/session-search-dialog.js +11 -11
- package/dist/app/components/session/session-tenancy-control.js +4 -4
- package/dist/app/components/session/session-usage-limit-section.js +4 -4
- package/dist/app/components/session/share-chat-dialog.js +7 -7
- package/dist/app/components/session/subagents.js +12 -12
- package/dist/app/components/session/subscription-account-indicator.js +6 -6
- package/dist/app/components/settings/row-select.js +4 -4
- package/dist/app/components/transcription-settings.js +6 -6
- package/dist/app/components/ui/destructive-confirm.js +7 -7
- package/dist/app/components/usage/usage-entry.js +3 -3
- package/dist/app/components/window-bar.d.ts +3 -1
- package/dist/app/components/window-bar.js +13 -11
- package/dist/app/components/workspace-composer-plus.js +20 -21
- package/dist/app/components/workspace-reach.js +4 -4
- package/dist/app/embed/session-app.js +168 -162
- package/dist/app/lib/actions/actions-provider.js +9 -9
- package/dist/app/lib/agent-capabilities.js +3 -3
- package/dist/app/lib/codex-usage-query.js +2 -2
- package/dist/app/lib/composer-connectors.js +16 -17
- package/dist/app/lib/composer-send-blocking.d.ts +135 -1
- package/dist/app/lib/composer-send-blocking.js +30 -3
- package/dist/app/lib/console-site.js +2 -2
- package/dist/app/lib/console-text.js +2 -2
- package/dist/app/lib/copy-link.d.ts +2 -0
- package/dist/app/lib/events.js +15 -15
- package/dist/app/lib/failed-session-copy.js +4 -4
- package/dist/app/lib/model-access-onboarding.js +3 -3
- package/dist/app/lib/model-access.js +2 -2
- package/dist/app/lib/move-chat-to-machine.js +3 -3
- package/dist/app/lib/session-branch-cache.js +12 -12
- package/dist/app/lib/session-composer-readiness.d.ts +2 -2
- package/dist/app/lib/session-create.js +4 -4
- package/dist/app/lib/session-group-pagination.js +12 -12
- package/dist/app/lib/session-hover-facts.js +17 -17
- package/dist/app/lib/session-model.js +2 -2
- package/dist/app/lib/session-rail.js +9 -9
- package/dist/app/lib/session-rename.js +3 -3
- package/dist/app/lib/sessions-group.js +11 -11
- package/dist/app/lib/site-sidebar-bridge.d.ts +24 -0
- package/dist/app/lib/site-tool-consent-dialog.js +10 -11
- package/dist/app/lib/site-tool-consent-dialog.js.map +1 -1
- package/dist/app/lib/site-tool-consent.js +1 -1
- package/dist/app/lib/turn-failure-analytics.js +5 -5
- package/dist/app/lib/use-follow-up-repositories.js +5 -5
- package/dist/app/lib/use-workspace-machines.js +5 -5
- package/dist/app/lib/use-workspace-model-catalog.js +3 -3
- package/dist/app/lib/use-workspace-rigs.js +2 -2
- package/dist/app/lib/workspace-navigation-preference.js +4 -4
- package/dist/app/lib/workspace-scope-context.js +3 -3
- package/dist/app/routes/artifacts.js +70 -70
- package/dist/app/routes/retained-artifact.js +50 -50
- package/dist/app/routes/session.js +98 -99
- package/dist/app/routes/sessions-index-hydration.js +5 -5
- package/dist/app/routes/sessions-index.js +85 -85
- package/dist/app/routes/site-view.js +174 -82
- package/dist/app/routes/site-view.js.map +1 -1
- 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/automations.js +12 -12
- package/dist/{browser-viewer-TC27OCIP.js → browser-viewer-ZHQDVHZ2.js} +5 -5
- package/dist/{chat-interactive-block-RWPQBHVS.js → chat-interactive-block-VSDD6X3M.js} +5 -5
- package/dist/{chunk-5MOJZORA.js → chunk-2EA4IRIP.js} +34 -3
- package/dist/chunk-2EA4IRIP.js.map +1 -0
- package/dist/{chunk-C43KRXGA.js → chunk-2GCHGWNE.js} +3 -3
- package/dist/{chunk-XLH7QY2R.js → chunk-2J77TWGH.js} +3 -3
- package/dist/{chunk-Q3DPEYX4.js → chunk-2LMJXRXK.js} +7 -7
- package/dist/{chunk-77WAKEAH.js → chunk-2OXSB2OL.js} +2 -2
- package/dist/{chunk-H3T7IWNA.js → chunk-2VJOSU4H.js} +2 -2
- package/dist/{chunk-IMDQUHBJ.js → chunk-2ZAQA5GE.js} +6 -6
- package/dist/{chunk-L7YTNTIK.js → chunk-3CDJSKDW.js} +3 -3
- package/dist/{chunk-EWSOC6WF.js → chunk-3DRLCX5V.js} +2 -2
- package/dist/{chunk-JEUPAVYY.js → chunk-3L465FBR.js} +6 -6
- package/dist/{chunk-4SAWSRAA.js → chunk-3LTSLMVL.js} +5 -5
- package/dist/{chunk-5NWEKLDZ.js → chunk-3NNAC43A.js} +2 -2
- package/dist/{chunk-EDI6SJ2N.js → chunk-3OK7Y6ES.js} +2 -2
- package/dist/{chunk-AWKES45Y.js → chunk-3PM3M2Q6.js} +2 -2
- package/dist/{chunk-I7XIZRFD.js → chunk-3PZ3LRPV.js} +3 -3
- package/dist/{chunk-6BCXNDEI.js → chunk-3RGLQG6S.js} +69 -55
- package/dist/chunk-3RGLQG6S.js.map +1 -0
- package/dist/{chunk-2M3J7ZWQ.js → chunk-467WDSOK.js} +2 -2
- package/dist/{chunk-UTIAXH52.js → chunk-477DTTMH.js} +3 -3
- package/dist/{chunk-J5F5HPPW.js → chunk-4BWMAGJJ.js} +3 -3
- package/dist/{chunk-YSJEAAOL.js → chunk-4F3AEJI6.js} +4 -4
- package/dist/{chunk-LHPNABDH.js → chunk-4JXPLTWV.js} +2 -2
- package/dist/{chunk-NUNZS36W.js → chunk-4O2XWOLZ.js} +3 -3
- package/dist/{chunk-BHNSJVBC.js → chunk-4OTNYMJH.js} +5 -5
- package/dist/{chunk-2Z3NQNTM.js → chunk-4POXUODO.js} +15 -15
- package/dist/{chunk-QB2KMIDP.js → chunk-4SJAEPM2.js} +2 -2
- package/dist/{chunk-TAT5USZN.js → chunk-4T3NE262.js} +3 -3
- package/dist/{chunk-6JHU2UBS.js → chunk-4Z5X7PLC.js} +3 -3
- package/dist/{chunk-2STUPWEL.js → chunk-54U6ZBEX.js} +3 -3
- package/dist/{chunk-XXSOHN35.js → chunk-5FLYHX5R.js} +2 -2
- package/dist/{chunk-MIYFS2XN.js → chunk-5MHMCE2G.js} +3 -3
- package/dist/{chunk-YWVI6ZMK.js → chunk-5MIBQ4P5.js} +2 -2
- package/dist/{chunk-HAX4LCR5.js → chunk-5TKTWXAU.js} +3 -3
- package/dist/chunk-6B73WNLR.js +173 -0
- package/dist/chunk-6B73WNLR.js.map +1 -0
- package/dist/{chunk-F2OPHAUN.js → chunk-6HRYJERP.js} +5 -5
- package/dist/{chunk-5O2FCCHZ.js → chunk-6JGB4XGH.js} +3 -3
- package/dist/{chunk-RPVREAU7.js → chunk-736RUNIA.js} +4 -4
- package/dist/{chunk-2KALVELR.js → chunk-74CBR5YE.js} +3 -3
- package/dist/{chunk-5IE76VCY.js → chunk-752WXSDN.js} +2 -2
- package/dist/{chunk-SEO7TICN.js → chunk-76MC7KOE.js} +1 -1
- package/dist/{chunk-OPJJSKUK.js → chunk-77B6UCNK.js} +6 -6
- package/dist/{chunk-ZUA3JMI6.js → chunk-77SYIH6O.js} +2 -2
- package/dist/{chunk-ILDXWY37.js → chunk-7AI4E7PV.js} +2 -2
- package/dist/{chunk-7X6SDK2C.js → chunk-7HESG3ET.js} +3 -3
- package/dist/{chunk-2RG7NIAS.js → chunk-7MY3XB6I.js} +7 -7
- package/dist/{chunk-C372BFOV.js → chunk-7NLF35YL.js} +4 -4
- package/dist/{chunk-IFB3WJ36.js → chunk-7YTR3UFO.js} +4 -4
- package/dist/{chunk-BMICEQZQ.js → chunk-7Z76QP64.js} +3 -3
- package/dist/{chunk-YWIFM7D7.js → chunk-AAS7OWV6.js} +3 -3
- package/dist/{chunk-5QAY6K77.js → chunk-AB5IW227.js} +3 -3
- package/dist/{chunk-ZBIXBQNI.js → chunk-ABJZDRW2.js} +2 -2
- package/dist/{chunk-4DVJ6ONS.js → chunk-AH3DGOTK.js} +2 -2
- package/dist/{chunk-HGKTHF2U.js → chunk-AJBDAVX3.js} +8 -8
- package/dist/{chunk-HD5X76TP.js → chunk-AQQT2FIC.js} +5 -5
- package/dist/chunk-AQQT2FIC.js.map +1 -0
- package/dist/{chunk-SC6RRD2D.js → chunk-ARTEEI2E.js} +11 -2
- package/dist/{chunk-SC6RRD2D.js.map → chunk-ARTEEI2E.js.map} +1 -1
- package/dist/{chunk-IXPTECSC.js → chunk-AVXDIRRW.js} +2 -2
- package/dist/{chunk-QK5EFEUT.js → chunk-BASI553K.js} +4 -4
- package/dist/{chunk-AW2MQB37.js → chunk-BD5FMBO4.js} +2 -2
- package/dist/{chunk-CRU35QQH.js → chunk-BFFNINCC.js} +108 -66
- package/dist/chunk-BFFNINCC.js.map +1 -0
- package/dist/{chunk-OVKYVZMW.js → chunk-BIHGCQXA.js} +2 -2
- package/dist/{chunk-Z4FMAFNH.js → chunk-BQYRZIZ7.js} +2 -2
- package/dist/{chunk-DZWARC4M.js → chunk-BWMIWRUK.js} +3 -3
- package/dist/{chunk-Y4OBB2VN.js → chunk-CV4VVLPZ.js} +2 -2
- package/dist/{chunk-JQL7ZH6C.js → chunk-CXAN2FHF.js} +7 -7
- package/dist/{chunk-3PZ7JZI2.js → chunk-D3PTVN2I.js} +2 -2
- package/dist/{chunk-FPXASDG5.js → chunk-D5TIVCXG.js} +2 -2
- package/dist/{chunk-7W37NS3I.js → chunk-D74Z2N4K.js} +2 -2
- package/dist/{chunk-MNZG4OHU.js → chunk-DCEQCGVN.js} +2 -2
- package/dist/{chunk-ND2BXV3P.js → chunk-DEHLWZSI.js} +4 -4
- package/dist/{chunk-ZTPXACWB.js → chunk-DHIGEK6P.js} +6 -6
- package/dist/{chunk-2YUOVM3G.js → chunk-DIP7YALH.js} +2 -2
- package/dist/{chunk-6PZ7OBYU.js → chunk-DLVIRJGK.js} +4 -4
- package/dist/{chunk-KLEUWIMZ.js → chunk-DQPIEQGP.js} +2 -2
- package/dist/{chunk-T2QX3FDP.js → chunk-DWJ6J3YW.js} +4 -4
- package/dist/{chunk-3CPWWGNK.js → chunk-E5KOWRDU.js} +2 -2
- package/dist/{chunk-6WGRDRMA.js → chunk-EBIVTDEG.js} +2 -2
- package/dist/{chunk-5CPEEAFD.js → chunk-EDDKPIIV.js} +2 -2
- package/dist/{chunk-TX3VECZU.js → chunk-EGKARC53.js} +2 -2
- package/dist/{chunk-JEA3QDX7.js → chunk-EKJHOWTZ.js} +4 -4
- package/dist/{chunk-UVN5TMHU.js → chunk-ESXAECZ3.js} +2 -2
- package/dist/{chunk-3SOIESJM.js → chunk-EWZ2RLNG.js} +2 -2
- package/dist/{chunk-ORJPS5VN.js → chunk-F4GCGN7J.js} +91 -31
- package/dist/chunk-F4GCGN7J.js.map +1 -0
- package/dist/{chunk-NW53H5RW.js → chunk-F7GARVTE.js} +160 -59
- package/dist/chunk-F7GARVTE.js.map +1 -0
- package/dist/{chunk-CMKGILJK.js → chunk-FBA2NXYH.js} +4 -4
- package/dist/{chunk-O6N4ABCA.js → chunk-FER6EVIY.js} +2 -2
- package/dist/{chunk-DF5EAHDN.js → chunk-FLWQJDJ5.js} +5 -5
- package/dist/{chunk-PTAG4PDC.js → chunk-FNXCFIPW.js} +2 -2
- package/dist/chunk-FPSS23S4.js +36 -0
- package/dist/chunk-FPSS23S4.js.map +1 -0
- package/dist/{chunk-BJEJFISW.js → chunk-FSDQQQIA.js} +3 -3
- package/dist/{chunk-FVXBNBHO.js → chunk-FTIC5VXR.js} +6 -6
- package/dist/{chunk-PTF5B7TJ.js → chunk-G5UQBTXY.js} +2 -2
- package/dist/{chunk-4E3ZJRTZ.js → chunk-G6ICCGJ3.js} +2 -2
- package/dist/{chunk-5YKW2K6I.js → chunk-GB5SOTIB.js} +12 -12
- package/dist/{chunk-NRTE7DNV.js → chunk-GIWFLWXG.js} +4 -4
- package/dist/{chunk-MM4FNWI4.js → chunk-GMHIOYB7.js} +4 -4
- package/dist/{chunk-6DK6Z4UN.js → chunk-GOCODNQS.js} +3 -3
- package/dist/{chunk-TPQTRNER.js → chunk-GSCGKJNK.js} +2 -2
- package/dist/{chunk-7VMZGLYI.js → chunk-GTHCHCWW.js} +3 -3
- package/dist/{chunk-SQJIKMN3.js → chunk-GTRAH4FG.js} +2 -2
- package/dist/{chunk-ZYAZUPPV.js → chunk-GU7T2S5N.js} +3 -3
- package/dist/{chunk-JKHKLL5W.js → chunk-H6BX6WOW.js} +3 -3
- package/dist/{chunk-IMZCQBOT.js → chunk-H6MJFMHZ.js} +3 -3
- package/dist/{chunk-HSOXMJOT.js → chunk-HEGV4QMS.js} +2 -2
- package/dist/{chunk-JDTGRRNU.js → chunk-HGS5KMZS.js} +45 -27
- package/dist/chunk-HGS5KMZS.js.map +1 -0
- package/dist/chunk-HROITVQJ.js +85 -0
- package/dist/chunk-HROITVQJ.js.map +1 -0
- package/dist/{chunk-OF4TIKYC.js → chunk-HTMQGS63.js} +17 -9
- package/dist/chunk-HTMQGS63.js.map +1 -0
- package/dist/{chunk-NC7PVOEK.js → chunk-HWVPLFIW.js} +2 -2
- package/dist/{chunk-ECJBYNLJ.js → chunk-ICAMYP5M.js} +2 -2
- package/dist/{chunk-DJAXC5OK.js → chunk-IFSXVU2S.js} +2 -2
- package/dist/{chunk-N6AACDUW.js → chunk-IHLRYWA7.js} +4 -4
- package/dist/{chunk-I4MRDSUF.js → chunk-IJR6VOLU.js} +3 -3
- package/dist/{chunk-YCVD6CI3.js → chunk-IN3VQFKS.js} +2 -2
- package/dist/{chunk-TXLIEOJX.js → chunk-IWKHF2FN.js} +106 -75
- package/dist/chunk-IWKHF2FN.js.map +1 -0
- package/dist/{chunk-MFROMEKA.js → chunk-J2BTILRR.js} +3 -3
- package/dist/{chunk-NCYMNCJO.js → chunk-J2WY42FA.js} +2 -2
- package/dist/{chunk-DGMR6JEJ.js → chunk-J4XSTXZP.js} +2 -2
- package/dist/{chunk-P77WNZDY.js → chunk-JMHEFZOB.js} +2 -2
- package/dist/{chunk-GVN5SZLX.js → chunk-JMI53ZMU.js} +3 -3
- package/dist/{chunk-IDANQPRH.js → chunk-JV3UI7BH.js} +3 -3
- package/dist/{chunk-XEQMZB3C.js → chunk-K4DQS2ML.js} +24 -6
- package/dist/chunk-K4DQS2ML.js.map +1 -0
- package/dist/{chunk-GKVJIDHF.js → chunk-KFNZZ2N6.js} +2 -2
- package/dist/{chunk-I4QEJ62Y.js → chunk-KI46GKMD.js} +7 -7
- package/dist/{chunk-SIRLACNZ.js → chunk-KO3OHHY2.js} +3 -3
- package/dist/{chunk-NULUNM7H.js → chunk-KUE5BOQE.js} +5 -5
- package/dist/{chunk-O3LKCBP5.js → chunk-LIJNVIT3.js} +3 -3
- package/dist/{chunk-JWB44UGJ.js → chunk-LIJPDVYP.js} +2 -2
- package/dist/{chunk-BJFH6JI5.js → chunk-LN4DJOMX.js} +13 -13
- package/dist/{chunk-KYS77RPN.js → chunk-LPKJ77EK.js} +2 -2
- package/dist/{chunk-RMFKVOM7.js → chunk-LQKVNREV.js} +4 -4
- package/dist/{chunk-E7XERZWC.js → chunk-LTJFV2JI.js} +2 -2
- package/dist/{chunk-INXGSG3J.js → chunk-LVDNY5RC.js} +2 -2
- package/dist/{chunk-2INLDVK3.js → chunk-LVELUUK6.js} +2 -2
- package/dist/{chunk-5EWSRZ2Y.js → chunk-M3HGBO2Y.js} +1 -1
- package/dist/{chunk-J3DY5HWQ.js → chunk-M5IQVMLR.js} +4 -4
- package/dist/{chunk-53AGXXZM.js → chunk-MKDFYE2E.js} +2 -2
- package/dist/{chunk-2I7HDP53.js → chunk-MT2R57SF.js} +2 -2
- package/dist/{chunk-Z7Y523PS.js → chunk-MV2CLIO6.js} +6 -6
- package/dist/{chunk-JZ4NLCAP.js → chunk-MZY3VKKM.js} +2 -2
- package/dist/{chunk-YENLNISG.js → chunk-N3FM4BNA.js} +2 -2
- package/dist/{chunk-RQKLF42C.js → chunk-NPGLNXYI.js} +4 -4
- package/dist/{chunk-I5QZJODL.js → chunk-NQ2CPQJF.js} +3 -3
- package/dist/{chunk-6DVCC7QS.js → chunk-OBGOLHCP.js} +164 -43
- package/dist/chunk-OBGOLHCP.js.map +1 -0
- package/dist/{chunk-CUIWCGMA.js → chunk-OCXEY7HE.js} +2 -2
- package/dist/{chunk-KRDR5RJD.js → chunk-OGU73VUN.js} +2 -2
- package/dist/{chunk-YIRVLKAX.js → chunk-OI6VI6SU.js} +9 -9
- package/dist/{chunk-X6KAJI3V.js → chunk-OK7BQMCI.js} +9 -9
- package/dist/chunk-OP2GD6QW.js +166 -0
- package/dist/chunk-OP2GD6QW.js.map +1 -0
- package/dist/{chunk-TUIN4MB7.js → chunk-ORV7EFSL.js} +4 -4
- package/dist/{chunk-3IK6UYO6.js → chunk-OTW25A6I.js} +3 -3
- package/dist/{chunk-NPGISCU6.js → chunk-OWET7EY2.js} +16 -16
- package/dist/{chunk-3ED2U6XE.js → chunk-OYCK4JRS.js} +2 -2
- package/dist/{chunk-YQXTDZSU.js → chunk-OYOFPNLC.js} +4 -4
- package/dist/{chunk-4NQHXYMW.js → chunk-PD7NWM7V.js} +2 -2
- package/dist/{chunk-4YCA2Y73.js → chunk-PF2WU2IL.js} +3 -3
- package/dist/{chunk-Z654FWNU.js → chunk-PLYVGZIN.js} +2 -2
- package/dist/{chunk-MVW6HNPI.js → chunk-PRT4J2DL.js} +2 -2
- package/dist/{chunk-OPWCMA4D.js → chunk-PUUEI4W3.js} +6 -6
- package/dist/{chunk-RLBKLAEY.js → chunk-PVB4YVDP.js} +2 -2
- package/dist/{chunk-NXCMHIKI.js → chunk-PWUSSSSL.js} +2 -2
- package/dist/{chunk-MJUCFQMS.js → chunk-PYB4BFEC.js} +3 -3
- package/dist/{chunk-2FSBSCZJ.js → chunk-PZKHST7A.js} +2 -2
- package/dist/{chunk-QZAAUQRN.js → chunk-Q5EZNBPI.js} +3 -3
- package/dist/{chunk-ZHDFQITM.js → chunk-Q5K2J5GG.js} +2 -2
- package/dist/{chunk-DZXEDSQI.js → chunk-QKBFIJE7.js} +5 -5
- package/dist/{chunk-FZC5N55X.js → chunk-QL5NQ3JX.js} +8 -8
- package/dist/{chunk-7T2ZE3VT.js → chunk-QPQ7R77C.js} +8 -1
- package/dist/chunk-QPQ7R77C.js.map +1 -0
- package/dist/{chunk-OV6QJRT4.js → chunk-QRECBCJM.js} +2 -2
- package/dist/{chunk-3GZA4BUW.js → chunk-QURYQFDN.js} +2 -2
- package/dist/{chunk-I5B5L6Q4.js → chunk-QVZVUROX.js} +1 -1
- package/dist/{chunk-VS7AHPCZ.js → chunk-R33SBMB7.js} +3 -3
- package/dist/{chunk-KCBMFSMS.js → chunk-R4JA5JFI.js} +3 -3
- package/dist/{chunk-HC4JFZVU.js → chunk-R5QAL43H.js} +2 -2
- package/dist/{chunk-QPSGCC5D.js → chunk-RGR57NYY.js} +2 -2
- package/dist/{chunk-XWFAMUZQ.js → chunk-RHXYO4H2.js} +2 -2
- package/dist/{chunk-Y4BB2KS2.js → chunk-RISUROBM.js} +7 -7
- package/dist/{chunk-U3DN4HEY.js → chunk-RMCLFSMX.js} +2 -2
- package/dist/{chunk-YK7756IF.js → chunk-RTZANSSC.js} +3 -3
- package/dist/{chunk-ZEG4VPBL.js → chunk-S27VZ5DO.js} +6 -6
- package/dist/{chunk-54YW6SZZ.js → chunk-SBXSKRFA.js} +3 -3
- package/dist/{chunk-QIOQ2NPQ.js → chunk-SGH7I7OY.js} +2 -2
- package/dist/{chunk-K2A5PXQ5.js → chunk-SJYTQLN3.js} +3 -3
- package/dist/{chunk-X3MWB2QU.js → chunk-SN2WENRP.js} +3 -3
- package/dist/{chunk-OSY5K7L7.js → chunk-SP44O3OU.js} +2 -2
- package/dist/{chunk-OZCBM3UC.js → chunk-SSR4ZX52.js} +2 -2
- package/dist/{chunk-QCSJ4CWE.js → chunk-SXGJL7UT.js} +14 -14
- package/dist/{chunk-NC55IFN3.js → chunk-T67LTMSW.js} +10 -10
- package/dist/{chunk-AXHZYXUV.js → chunk-TDTD66BK.js} +2 -2
- package/dist/{chunk-NGJJJPZZ.js → chunk-TK5FWVZR.js} +3 -3
- package/dist/{chunk-YPWU5KPE.js → chunk-TKQL7EDB.js} +56 -19
- package/dist/chunk-TKQL7EDB.js.map +1 -0
- package/dist/{chunk-2OP6WLGV.js → chunk-TNSJFZ6Q.js} +4 -4
- package/dist/{chunk-O732GAFC.js → chunk-U4LTPFD2.js} +2 -2
- package/dist/{chunk-4DVNUCRR.js → chunk-U5UGM5XD.js} +6 -6
- package/dist/{chunk-UJK53QFL.js → chunk-UBRQ3PQD.js} +2 -2
- package/dist/{chunk-SODC7T6L.js → chunk-UMX6DZME.js} +2 -2
- package/dist/{chunk-YLS6QE5G.js → chunk-UO35OEOX.js} +4 -4
- package/dist/{chunk-VTTAJOQ7.js → chunk-UO3X52YM.js} +2 -2
- package/dist/{chunk-SHHJCL7X.js → chunk-UTRNLNCW.js} +3 -3
- package/dist/{chunk-HEFPPMBQ.js → chunk-UU5FBVRX.js} +2 -2
- package/dist/{chunk-GQXZPKK7.js → chunk-V6UOVHW3.js} +2 -2
- package/dist/{chunk-7TIX2UAR.js → chunk-VCJQQYRE.js} +4 -4
- package/dist/{chunk-6WD2INST.js → chunk-WDASYY4S.js} +7 -7
- package/dist/{chunk-DXBYWSL5.js → chunk-WIFDNUKD.js} +3 -3
- package/dist/{chunk-RT7CJMER.js → chunk-WIXHUBQN.js} +2 -2
- package/dist/{chunk-57AZS3IE.js → chunk-WRMUXZ7C.js} +3 -3
- package/dist/{chunk-CRAOSVHC.js → chunk-WSDBQSPP.js} +2 -2
- package/dist/{chunk-2CLNIEK4.js → chunk-WTSQUCHB.js} +3 -3
- package/dist/{chunk-MIHN76LX.js → chunk-WYGTAQMX.js} +3 -3
- package/dist/{chunk-GAVYGBFI.js → chunk-X2R73NGG.js} +2 -2
- package/dist/{chunk-T7OXJZCX.js → chunk-XOIDUM2H.js} +1 -1
- package/dist/{chunk-XHIQ5I6N.js → chunk-XVLEBB4Y.js} +2 -2
- package/dist/{chunk-T3OWFVMS.js → chunk-Y3XZEKDQ.js} +2 -2
- package/dist/{chunk-ROKQU7WG.js → chunk-YMI27QPF.js} +2 -2
- package/dist/{chunk-U7XM7CB4.js → chunk-YNTLWCF4.js} +4 -4
- package/dist/{chunk-ZQCND77P.js → chunk-YRYF76OE.js} +2 -2
- package/dist/{chunk-2BDT3UZQ.js → chunk-ZAX4XQLN.js} +3 -3
- package/dist/{chunk-DXR5PDFP.js → chunk-ZBHGNE2J.js} +3 -3
- package/dist/{chunk-KODELWYT.js → chunk-ZF6ZS77B.js} +3 -3
- package/dist/{chunk-KUDGXAF7.js → chunk-ZM5YP5NJ.js} +10 -10
- package/dist/{chunk-I7ITSXSJ.js → chunk-ZR5EKJT6.js} +2 -2
- package/dist/{chunk-IZXHMZQ6.js → chunk-ZW5YTIH3.js} +4 -4
- package/dist/components/artifacts/artifact-sandbox.d.ts +6 -1
- package/dist/components/artifacts/site-view.d.ts +4 -2
- package/dist/components/timeline-anchor.d.ts +8 -3
- package/dist/components/timeline-reading-progress.d.ts +1 -1
- package/dist/components/timeline-settlement.d.ts +1 -1
- package/dist/composer-messages.js +2 -2
- package/dist/composer.js +9 -9
- package/dist/{computer-viewer-TDDO25AV.js → computer-viewer-5LKRCEVQ.js} +5 -5
- package/dist/connect.js +14 -15
- package/dist/desktop-dictation.js +7 -7
- package/dist/desktop.js +2 -2
- package/dist/editor.js +2 -2
- package/dist/{embedded-new-voice-2G3VLPVQ.js → embedded-new-voice-GHJRY3YL.js} +5 -5
- package/dist/{embedded-voice-T5IWOWGD.js → embedded-voice-ASQXBSTX.js} +5 -5
- package/dist/{fleet-decision-row-WM64KXP3.js → fleet-decision-row-U7LDVBEM.js} +2 -2
- package/dist/in-chat-connect-model.js +6 -6
- package/dist/index.js +53 -54
- package/dist/interaction.js +6 -6
- package/dist/{latest-question-OX56OVQ5.js → latest-question-RNVF262Q.js} +5 -5
- package/dist/lib/format.d.ts +10 -0
- package/dist/machines.js +4 -4
- package/dist/meetings-recorder.js +1 -1
- package/dist/meetings.js +24 -24
- package/dist/messages/en.d.ts +7 -0
- package/dist/messages.js +1 -1
- package/dist/{model-policy-picker-menu-SMC6J6QN.js → model-policy-picker-menu-E6XKMFTA.js} +4 -4
- package/dist/{payment-page-card-G4U63KUV.js → payment-page-card-DJDKV2LW.js} +6 -5
- package/dist/{payment-page-card-G4U63KUV.js.map → payment-page-card-DJDKV2LW.js.map} +1 -1
- package/dist/{platform-activity-row-BUZGZAKZ.js → platform-activity-row-MSDCSMET.js} +17 -7
- package/dist/platform-activity-row-MSDCSMET.js.map +1 -0
- package/dist/{queue-surface-implementation-4KUZ4PJV.js → queue-surface-implementation-GUAIG6TK.js} +5 -5
- package/dist/realtime.js +4 -4
- package/dist/{recorder-host-WF2RRR56.js → recorder-host-2MYDJPQW.js} +4 -4
- package/dist/recordings.js +3 -3
- package/dist/{sandbox-files-ESDMOFSD.js → sandbox-files-W5W2LW4K.js} +6 -6
- package/dist/session-app.js +168 -162
- package/dist/{session-connect-cards-Q53KMMYY.js → session-connect-cards-TUY62MVP.js} +10 -11
- package/dist/session-list-model.js +2 -2
- package/dist/{session-realtime-CF3I35WJ.js → session-realtime-SDTKFFIR.js} +3 -3
- package/dist/session-realtime-SDTKFFIR.js.map +1 -0
- package/dist/session-realtime.js +2 -2
- package/dist/session-ui.js +36 -37
- package/dist/session.js +9 -9
- package/dist/sites.js +2 -2
- package/dist/terminal.js +2 -2
- package/dist/this-computer.js +3 -3
- package/dist/timeline/shared.d.ts +2 -0
- package/dist/{timeline-annotation-markers-CJK4RYZ4.js → timeline-annotation-markers-FNILLWNU.js} +2 -2
- package/dist/{timeline-annotation-selection-67GF5H26.js → timeline-annotation-selection-MBCIDO2Q.js} +2 -2
- package/dist/{timeline-annotations-dialog-ONJPQDJQ.js → timeline-annotations-dialog-JPNKLOTE.js} +3 -3
- package/dist/timeline-model.js +6 -6
- package/dist/ui/access-list.js +6 -6
- package/dist/ui/cadence-picker.js +4 -4
- package/dist/ui/choice-cards.js +3 -3
- package/dist/ui/confirm-dialog.js +4 -4
- package/dist/ui/copy-field.js +3 -3
- package/dist/ui/detail-page.js +5 -5
- package/dist/ui/detail-sheet.js +4 -4
- package/dist/ui/dialog.js +2 -2
- package/dist/ui/disclosure.js +5 -5
- package/dist/ui/email-chips-input.js +3 -3
- package/dist/ui/field.js +2 -2
- package/dist/ui/flush-form-page.js +4 -4
- package/dist/ui/form-dialog.js +3 -3
- package/dist/ui/list-row.js +3 -3
- package/dist/ui/page-header.js +2 -2
- package/dist/ui/relative-time.js +2 -2
- package/dist/ui/revision-history.js +4 -4
- package/dist/ui/role-select.js +6 -6
- package/dist/ui/select-menu.js +3 -3
- package/dist/ui/sheet.js +2 -2
- package/dist/ui/usage-meter.js +3 -3
- package/dist/ui/window-bar-title.d.ts +7 -3
- package/dist/ui/window-bar-title.js +1 -1
- package/dist/usage.js +2 -2
- package/dist/workbench.js +4 -4
- package/package.json +6 -5
- package/src/app/components/artifacts/site-actions.tsx +105 -0
- package/src/app/components/rail/session-header-copy.test.tsx +172 -0
- package/src/app/components/rail/session-header.tsx +68 -12
- package/src/app/components/rail/session-list.tsx +20 -0
- package/src/app/components/rail/site-session-group-heading.test.tsx +210 -0
- package/src/app/components/rail/site-session-group-heading.tsx +119 -60
- package/src/app/components/session/failed-session-actions.test.tsx +4 -0
- package/src/app/components/window-bar.tsx +63 -15
- package/src/app/lib/composer-send-blocking.tsx +312 -1
- package/src/app/lib/copy-link.ts +10 -0
- package/src/app/lib/session-composer-readiness.ts +4 -3
- package/src/app/lib/site-sidebar-bridge.test.tsx +67 -0
- package/src/app/lib/site-sidebar-bridge.ts +57 -0
- package/src/app/routes/session.tsx +45 -12
- package/src/app/routes/sessions-index.tsx +164 -105
- package/src/app/routes/site-view.test.tsx +74 -6
- package/src/app/routes/site-view.tsx +135 -14
- package/src/components/approval-surface.tsx +78 -3
- package/src/components/artifacts/artifact-sandbox.tsx +27 -2
- package/src/components/artifacts/site-view.tsx +13 -1
- package/src/components/message-timeline.tsx +25 -52
- package/src/components/session-capability-frame.tsx +2 -30
- package/src/components/timeline-anchor.tsx +19 -14
- package/src/components/timeline-reading-progress.ts +1 -2
- package/src/components/timeline-settlement.ts +3 -3
- package/src/lib/format.ts +46 -1
- package/src/messages/en.ts +11 -0
- package/src/timeline/platform-activity-row.tsx +20 -8
- package/src/timeline/shared.tsx +203 -32
- package/src/ui/window-bar-title.test.tsx +37 -0
- package/src/ui/window-bar-title.tsx +13 -6
- package/styles/compiled.css +5 -0
- package/dist/chunk-5MOJZORA.js.map +0 -1
- package/dist/chunk-6BCXNDEI.js.map +0 -1
- package/dist/chunk-6DVCC7QS.js.map +0 -1
- package/dist/chunk-7T2ZE3VT.js.map +0 -1
- package/dist/chunk-AFRGP2VP.js +0 -17
- package/dist/chunk-AFRGP2VP.js.map +0 -1
- package/dist/chunk-CRU35QQH.js.map +0 -1
- package/dist/chunk-FO4LYKJL.js +0 -197
- package/dist/chunk-FO4LYKJL.js.map +0 -1
- package/dist/chunk-HD5X76TP.js.map +0 -1
- package/dist/chunk-JDTGRRNU.js.map +0 -1
- package/dist/chunk-NW53H5RW.js.map +0 -1
- package/dist/chunk-OF4TIKYC.js.map +0 -1
- package/dist/chunk-ORJPS5VN.js.map +0 -1
- package/dist/chunk-TXLIEOJX.js.map +0 -1
- package/dist/chunk-VBUVBHFJ.js +0 -16
- package/dist/chunk-VBUVBHFJ.js.map +0 -1
- package/dist/chunk-XEQMZB3C.js.map +0 -1
- package/dist/chunk-YPWU5KPE.js.map +0 -1
- package/dist/components/timeline-answer-follow.d.ts +0 -8
- package/dist/platform-activity-row-BUZGZAKZ.js.map +0 -1
- package/src/components/timeline-answer-follow.ts +0 -15
- /package/dist/{browser-viewer-TC27OCIP.js.map → app/components/artifacts/site-actions.js.map} +0 -0
- /package/dist/{chat-interactive-block-RWPQBHVS.js.map → browser-viewer-ZHQDVHZ2.js.map} +0 -0
- /package/dist/{computer-viewer-TDDO25AV.js.map → chat-interactive-block-VSDD6X3M.js.map} +0 -0
- /package/dist/{chunk-C43KRXGA.js.map → chunk-2GCHGWNE.js.map} +0 -0
- /package/dist/{chunk-XLH7QY2R.js.map → chunk-2J77TWGH.js.map} +0 -0
- /package/dist/{chunk-Q3DPEYX4.js.map → chunk-2LMJXRXK.js.map} +0 -0
- /package/dist/{chunk-77WAKEAH.js.map → chunk-2OXSB2OL.js.map} +0 -0
- /package/dist/{chunk-H3T7IWNA.js.map → chunk-2VJOSU4H.js.map} +0 -0
- /package/dist/{chunk-IMDQUHBJ.js.map → chunk-2ZAQA5GE.js.map} +0 -0
- /package/dist/{chunk-L7YTNTIK.js.map → chunk-3CDJSKDW.js.map} +0 -0
- /package/dist/{chunk-EWSOC6WF.js.map → chunk-3DRLCX5V.js.map} +0 -0
- /package/dist/{chunk-JEUPAVYY.js.map → chunk-3L465FBR.js.map} +0 -0
- /package/dist/{chunk-4SAWSRAA.js.map → chunk-3LTSLMVL.js.map} +0 -0
- /package/dist/{chunk-5NWEKLDZ.js.map → chunk-3NNAC43A.js.map} +0 -0
- /package/dist/{chunk-EDI6SJ2N.js.map → chunk-3OK7Y6ES.js.map} +0 -0
- /package/dist/{chunk-AWKES45Y.js.map → chunk-3PM3M2Q6.js.map} +0 -0
- /package/dist/{chunk-I7XIZRFD.js.map → chunk-3PZ3LRPV.js.map} +0 -0
- /package/dist/{chunk-2M3J7ZWQ.js.map → chunk-467WDSOK.js.map} +0 -0
- /package/dist/{chunk-UTIAXH52.js.map → chunk-477DTTMH.js.map} +0 -0
- /package/dist/{chunk-J5F5HPPW.js.map → chunk-4BWMAGJJ.js.map} +0 -0
- /package/dist/{chunk-YSJEAAOL.js.map → chunk-4F3AEJI6.js.map} +0 -0
- /package/dist/{chunk-LHPNABDH.js.map → chunk-4JXPLTWV.js.map} +0 -0
- /package/dist/{chunk-NUNZS36W.js.map → chunk-4O2XWOLZ.js.map} +0 -0
- /package/dist/{chunk-BHNSJVBC.js.map → chunk-4OTNYMJH.js.map} +0 -0
- /package/dist/{chunk-2Z3NQNTM.js.map → chunk-4POXUODO.js.map} +0 -0
- /package/dist/{chunk-QB2KMIDP.js.map → chunk-4SJAEPM2.js.map} +0 -0
- /package/dist/{chunk-TAT5USZN.js.map → chunk-4T3NE262.js.map} +0 -0
- /package/dist/{chunk-6JHU2UBS.js.map → chunk-4Z5X7PLC.js.map} +0 -0
- /package/dist/{chunk-2STUPWEL.js.map → chunk-54U6ZBEX.js.map} +0 -0
- /package/dist/{chunk-XXSOHN35.js.map → chunk-5FLYHX5R.js.map} +0 -0
- /package/dist/{chunk-MIYFS2XN.js.map → chunk-5MHMCE2G.js.map} +0 -0
- /package/dist/{chunk-YWVI6ZMK.js.map → chunk-5MIBQ4P5.js.map} +0 -0
- /package/dist/{chunk-HAX4LCR5.js.map → chunk-5TKTWXAU.js.map} +0 -0
- /package/dist/{chunk-F2OPHAUN.js.map → chunk-6HRYJERP.js.map} +0 -0
- /package/dist/{chunk-5O2FCCHZ.js.map → chunk-6JGB4XGH.js.map} +0 -0
- /package/dist/{chunk-RPVREAU7.js.map → chunk-736RUNIA.js.map} +0 -0
- /package/dist/{chunk-2KALVELR.js.map → chunk-74CBR5YE.js.map} +0 -0
- /package/dist/{chunk-5IE76VCY.js.map → chunk-752WXSDN.js.map} +0 -0
- /package/dist/{chunk-SEO7TICN.js.map → chunk-76MC7KOE.js.map} +0 -0
- /package/dist/{chunk-OPJJSKUK.js.map → chunk-77B6UCNK.js.map} +0 -0
- /package/dist/{chunk-ZUA3JMI6.js.map → chunk-77SYIH6O.js.map} +0 -0
- /package/dist/{chunk-ILDXWY37.js.map → chunk-7AI4E7PV.js.map} +0 -0
- /package/dist/{chunk-7X6SDK2C.js.map → chunk-7HESG3ET.js.map} +0 -0
- /package/dist/{chunk-2RG7NIAS.js.map → chunk-7MY3XB6I.js.map} +0 -0
- /package/dist/{chunk-C372BFOV.js.map → chunk-7NLF35YL.js.map} +0 -0
- /package/dist/{chunk-IFB3WJ36.js.map → chunk-7YTR3UFO.js.map} +0 -0
- /package/dist/{chunk-BMICEQZQ.js.map → chunk-7Z76QP64.js.map} +0 -0
- /package/dist/{chunk-YWIFM7D7.js.map → chunk-AAS7OWV6.js.map} +0 -0
- /package/dist/{chunk-5QAY6K77.js.map → chunk-AB5IW227.js.map} +0 -0
- /package/dist/{chunk-ZBIXBQNI.js.map → chunk-ABJZDRW2.js.map} +0 -0
- /package/dist/{chunk-4DVJ6ONS.js.map → chunk-AH3DGOTK.js.map} +0 -0
- /package/dist/{chunk-HGKTHF2U.js.map → chunk-AJBDAVX3.js.map} +0 -0
- /package/dist/{chunk-IXPTECSC.js.map → chunk-AVXDIRRW.js.map} +0 -0
- /package/dist/{chunk-QK5EFEUT.js.map → chunk-BASI553K.js.map} +0 -0
- /package/dist/{chunk-AW2MQB37.js.map → chunk-BD5FMBO4.js.map} +0 -0
- /package/dist/{chunk-OVKYVZMW.js.map → chunk-BIHGCQXA.js.map} +0 -0
- /package/dist/{chunk-Z4FMAFNH.js.map → chunk-BQYRZIZ7.js.map} +0 -0
- /package/dist/{chunk-DZWARC4M.js.map → chunk-BWMIWRUK.js.map} +0 -0
- /package/dist/{chunk-Y4OBB2VN.js.map → chunk-CV4VVLPZ.js.map} +0 -0
- /package/dist/{chunk-JQL7ZH6C.js.map → chunk-CXAN2FHF.js.map} +0 -0
- /package/dist/{chunk-3PZ7JZI2.js.map → chunk-D3PTVN2I.js.map} +0 -0
- /package/dist/{chunk-FPXASDG5.js.map → chunk-D5TIVCXG.js.map} +0 -0
- /package/dist/{chunk-7W37NS3I.js.map → chunk-D74Z2N4K.js.map} +0 -0
- /package/dist/{chunk-MNZG4OHU.js.map → chunk-DCEQCGVN.js.map} +0 -0
- /package/dist/{chunk-ND2BXV3P.js.map → chunk-DEHLWZSI.js.map} +0 -0
- /package/dist/{chunk-ZTPXACWB.js.map → chunk-DHIGEK6P.js.map} +0 -0
- /package/dist/{chunk-2YUOVM3G.js.map → chunk-DIP7YALH.js.map} +0 -0
- /package/dist/{chunk-6PZ7OBYU.js.map → chunk-DLVIRJGK.js.map} +0 -0
- /package/dist/{chunk-KLEUWIMZ.js.map → chunk-DQPIEQGP.js.map} +0 -0
- /package/dist/{chunk-T2QX3FDP.js.map → chunk-DWJ6J3YW.js.map} +0 -0
- /package/dist/{chunk-3CPWWGNK.js.map → chunk-E5KOWRDU.js.map} +0 -0
- /package/dist/{chunk-6WGRDRMA.js.map → chunk-EBIVTDEG.js.map} +0 -0
- /package/dist/{chunk-5CPEEAFD.js.map → chunk-EDDKPIIV.js.map} +0 -0
- /package/dist/{chunk-TX3VECZU.js.map → chunk-EGKARC53.js.map} +0 -0
- /package/dist/{chunk-JEA3QDX7.js.map → chunk-EKJHOWTZ.js.map} +0 -0
- /package/dist/{chunk-UVN5TMHU.js.map → chunk-ESXAECZ3.js.map} +0 -0
- /package/dist/{chunk-3SOIESJM.js.map → chunk-EWZ2RLNG.js.map} +0 -0
- /package/dist/{chunk-CMKGILJK.js.map → chunk-FBA2NXYH.js.map} +0 -0
- /package/dist/{chunk-O6N4ABCA.js.map → chunk-FER6EVIY.js.map} +0 -0
- /package/dist/{chunk-DF5EAHDN.js.map → chunk-FLWQJDJ5.js.map} +0 -0
- /package/dist/{chunk-PTAG4PDC.js.map → chunk-FNXCFIPW.js.map} +0 -0
- /package/dist/{chunk-BJEJFISW.js.map → chunk-FSDQQQIA.js.map} +0 -0
- /package/dist/{chunk-FVXBNBHO.js.map → chunk-FTIC5VXR.js.map} +0 -0
- /package/dist/{chunk-PTF5B7TJ.js.map → chunk-G5UQBTXY.js.map} +0 -0
- /package/dist/{chunk-4E3ZJRTZ.js.map → chunk-G6ICCGJ3.js.map} +0 -0
- /package/dist/{chunk-5YKW2K6I.js.map → chunk-GB5SOTIB.js.map} +0 -0
- /package/dist/{chunk-NRTE7DNV.js.map → chunk-GIWFLWXG.js.map} +0 -0
- /package/dist/{chunk-MM4FNWI4.js.map → chunk-GMHIOYB7.js.map} +0 -0
- /package/dist/{chunk-6DK6Z4UN.js.map → chunk-GOCODNQS.js.map} +0 -0
- /package/dist/{chunk-TPQTRNER.js.map → chunk-GSCGKJNK.js.map} +0 -0
- /package/dist/{chunk-7VMZGLYI.js.map → chunk-GTHCHCWW.js.map} +0 -0
- /package/dist/{chunk-SQJIKMN3.js.map → chunk-GTRAH4FG.js.map} +0 -0
- /package/dist/{chunk-ZYAZUPPV.js.map → chunk-GU7T2S5N.js.map} +0 -0
- /package/dist/{chunk-JKHKLL5W.js.map → chunk-H6BX6WOW.js.map} +0 -0
- /package/dist/{chunk-IMZCQBOT.js.map → chunk-H6MJFMHZ.js.map} +0 -0
- /package/dist/{chunk-HSOXMJOT.js.map → chunk-HEGV4QMS.js.map} +0 -0
- /package/dist/{chunk-NC7PVOEK.js.map → chunk-HWVPLFIW.js.map} +0 -0
- /package/dist/{chunk-ECJBYNLJ.js.map → chunk-ICAMYP5M.js.map} +0 -0
- /package/dist/{chunk-DJAXC5OK.js.map → chunk-IFSXVU2S.js.map} +0 -0
- /package/dist/{chunk-N6AACDUW.js.map → chunk-IHLRYWA7.js.map} +0 -0
- /package/dist/{chunk-I4MRDSUF.js.map → chunk-IJR6VOLU.js.map} +0 -0
- /package/dist/{chunk-YCVD6CI3.js.map → chunk-IN3VQFKS.js.map} +0 -0
- /package/dist/{chunk-MFROMEKA.js.map → chunk-J2BTILRR.js.map} +0 -0
- /package/dist/{chunk-NCYMNCJO.js.map → chunk-J2WY42FA.js.map} +0 -0
- /package/dist/{chunk-DGMR6JEJ.js.map → chunk-J4XSTXZP.js.map} +0 -0
- /package/dist/{chunk-P77WNZDY.js.map → chunk-JMHEFZOB.js.map} +0 -0
- /package/dist/{chunk-GVN5SZLX.js.map → chunk-JMI53ZMU.js.map} +0 -0
- /package/dist/{chunk-IDANQPRH.js.map → chunk-JV3UI7BH.js.map} +0 -0
- /package/dist/{chunk-GKVJIDHF.js.map → chunk-KFNZZ2N6.js.map} +0 -0
- /package/dist/{chunk-I4QEJ62Y.js.map → chunk-KI46GKMD.js.map} +0 -0
- /package/dist/{chunk-SIRLACNZ.js.map → chunk-KO3OHHY2.js.map} +0 -0
- /package/dist/{chunk-NULUNM7H.js.map → chunk-KUE5BOQE.js.map} +0 -0
- /package/dist/{chunk-O3LKCBP5.js.map → chunk-LIJNVIT3.js.map} +0 -0
- /package/dist/{chunk-JWB44UGJ.js.map → chunk-LIJPDVYP.js.map} +0 -0
- /package/dist/{chunk-BJFH6JI5.js.map → chunk-LN4DJOMX.js.map} +0 -0
- /package/dist/{chunk-KYS77RPN.js.map → chunk-LPKJ77EK.js.map} +0 -0
- /package/dist/{chunk-RMFKVOM7.js.map → chunk-LQKVNREV.js.map} +0 -0
- /package/dist/{chunk-E7XERZWC.js.map → chunk-LTJFV2JI.js.map} +0 -0
- /package/dist/{chunk-INXGSG3J.js.map → chunk-LVDNY5RC.js.map} +0 -0
- /package/dist/{chunk-2INLDVK3.js.map → chunk-LVELUUK6.js.map} +0 -0
- /package/dist/{chunk-5EWSRZ2Y.js.map → chunk-M3HGBO2Y.js.map} +0 -0
- /package/dist/{chunk-J3DY5HWQ.js.map → chunk-M5IQVMLR.js.map} +0 -0
- /package/dist/{chunk-53AGXXZM.js.map → chunk-MKDFYE2E.js.map} +0 -0
- /package/dist/{chunk-2I7HDP53.js.map → chunk-MT2R57SF.js.map} +0 -0
- /package/dist/{chunk-Z7Y523PS.js.map → chunk-MV2CLIO6.js.map} +0 -0
- /package/dist/{chunk-JZ4NLCAP.js.map → chunk-MZY3VKKM.js.map} +0 -0
- /package/dist/{chunk-YENLNISG.js.map → chunk-N3FM4BNA.js.map} +0 -0
- /package/dist/{chunk-RQKLF42C.js.map → chunk-NPGLNXYI.js.map} +0 -0
- /package/dist/{chunk-I5QZJODL.js.map → chunk-NQ2CPQJF.js.map} +0 -0
- /package/dist/{chunk-CUIWCGMA.js.map → chunk-OCXEY7HE.js.map} +0 -0
- /package/dist/{chunk-KRDR5RJD.js.map → chunk-OGU73VUN.js.map} +0 -0
- /package/dist/{chunk-YIRVLKAX.js.map → chunk-OI6VI6SU.js.map} +0 -0
- /package/dist/{chunk-X6KAJI3V.js.map → chunk-OK7BQMCI.js.map} +0 -0
- /package/dist/{chunk-TUIN4MB7.js.map → chunk-ORV7EFSL.js.map} +0 -0
- /package/dist/{chunk-3IK6UYO6.js.map → chunk-OTW25A6I.js.map} +0 -0
- /package/dist/{chunk-NPGISCU6.js.map → chunk-OWET7EY2.js.map} +0 -0
- /package/dist/{chunk-3ED2U6XE.js.map → chunk-OYCK4JRS.js.map} +0 -0
- /package/dist/{chunk-YQXTDZSU.js.map → chunk-OYOFPNLC.js.map} +0 -0
- /package/dist/{chunk-4NQHXYMW.js.map → chunk-PD7NWM7V.js.map} +0 -0
- /package/dist/{chunk-4YCA2Y73.js.map → chunk-PF2WU2IL.js.map} +0 -0
- /package/dist/{chunk-Z654FWNU.js.map → chunk-PLYVGZIN.js.map} +0 -0
- /package/dist/{chunk-MVW6HNPI.js.map → chunk-PRT4J2DL.js.map} +0 -0
- /package/dist/{chunk-OPWCMA4D.js.map → chunk-PUUEI4W3.js.map} +0 -0
- /package/dist/{chunk-RLBKLAEY.js.map → chunk-PVB4YVDP.js.map} +0 -0
- /package/dist/{chunk-NXCMHIKI.js.map → chunk-PWUSSSSL.js.map} +0 -0
- /package/dist/{chunk-MJUCFQMS.js.map → chunk-PYB4BFEC.js.map} +0 -0
- /package/dist/{chunk-2FSBSCZJ.js.map → chunk-PZKHST7A.js.map} +0 -0
- /package/dist/{chunk-QZAAUQRN.js.map → chunk-Q5EZNBPI.js.map} +0 -0
- /package/dist/{chunk-ZHDFQITM.js.map → chunk-Q5K2J5GG.js.map} +0 -0
- /package/dist/{chunk-DZXEDSQI.js.map → chunk-QKBFIJE7.js.map} +0 -0
- /package/dist/{chunk-FZC5N55X.js.map → chunk-QL5NQ3JX.js.map} +0 -0
- /package/dist/{chunk-OV6QJRT4.js.map → chunk-QRECBCJM.js.map} +0 -0
- /package/dist/{chunk-3GZA4BUW.js.map → chunk-QURYQFDN.js.map} +0 -0
- /package/dist/{chunk-I5B5L6Q4.js.map → chunk-QVZVUROX.js.map} +0 -0
- /package/dist/{chunk-VS7AHPCZ.js.map → chunk-R33SBMB7.js.map} +0 -0
- /package/dist/{chunk-KCBMFSMS.js.map → chunk-R4JA5JFI.js.map} +0 -0
- /package/dist/{chunk-HC4JFZVU.js.map → chunk-R5QAL43H.js.map} +0 -0
- /package/dist/{chunk-QPSGCC5D.js.map → chunk-RGR57NYY.js.map} +0 -0
- /package/dist/{chunk-XWFAMUZQ.js.map → chunk-RHXYO4H2.js.map} +0 -0
- /package/dist/{chunk-Y4BB2KS2.js.map → chunk-RISUROBM.js.map} +0 -0
- /package/dist/{chunk-U3DN4HEY.js.map → chunk-RMCLFSMX.js.map} +0 -0
- /package/dist/{chunk-YK7756IF.js.map → chunk-RTZANSSC.js.map} +0 -0
- /package/dist/{chunk-ZEG4VPBL.js.map → chunk-S27VZ5DO.js.map} +0 -0
- /package/dist/{chunk-54YW6SZZ.js.map → chunk-SBXSKRFA.js.map} +0 -0
- /package/dist/{chunk-QIOQ2NPQ.js.map → chunk-SGH7I7OY.js.map} +0 -0
- /package/dist/{chunk-K2A5PXQ5.js.map → chunk-SJYTQLN3.js.map} +0 -0
- /package/dist/{chunk-X3MWB2QU.js.map → chunk-SN2WENRP.js.map} +0 -0
- /package/dist/{chunk-OSY5K7L7.js.map → chunk-SP44O3OU.js.map} +0 -0
- /package/dist/{chunk-OZCBM3UC.js.map → chunk-SSR4ZX52.js.map} +0 -0
- /package/dist/{chunk-QCSJ4CWE.js.map → chunk-SXGJL7UT.js.map} +0 -0
- /package/dist/{chunk-NC55IFN3.js.map → chunk-T67LTMSW.js.map} +0 -0
- /package/dist/{chunk-AXHZYXUV.js.map → chunk-TDTD66BK.js.map} +0 -0
- /package/dist/{chunk-NGJJJPZZ.js.map → chunk-TK5FWVZR.js.map} +0 -0
- /package/dist/{chunk-2OP6WLGV.js.map → chunk-TNSJFZ6Q.js.map} +0 -0
- /package/dist/{chunk-O732GAFC.js.map → chunk-U4LTPFD2.js.map} +0 -0
- /package/dist/{chunk-4DVNUCRR.js.map → chunk-U5UGM5XD.js.map} +0 -0
- /package/dist/{chunk-UJK53QFL.js.map → chunk-UBRQ3PQD.js.map} +0 -0
- /package/dist/{chunk-SODC7T6L.js.map → chunk-UMX6DZME.js.map} +0 -0
- /package/dist/{chunk-YLS6QE5G.js.map → chunk-UO35OEOX.js.map} +0 -0
- /package/dist/{chunk-VTTAJOQ7.js.map → chunk-UO3X52YM.js.map} +0 -0
- /package/dist/{chunk-SHHJCL7X.js.map → chunk-UTRNLNCW.js.map} +0 -0
- /package/dist/{chunk-HEFPPMBQ.js.map → chunk-UU5FBVRX.js.map} +0 -0
- /package/dist/{chunk-GQXZPKK7.js.map → chunk-V6UOVHW3.js.map} +0 -0
- /package/dist/{chunk-7TIX2UAR.js.map → chunk-VCJQQYRE.js.map} +0 -0
- /package/dist/{chunk-6WD2INST.js.map → chunk-WDASYY4S.js.map} +0 -0
- /package/dist/{chunk-DXBYWSL5.js.map → chunk-WIFDNUKD.js.map} +0 -0
- /package/dist/{chunk-RT7CJMER.js.map → chunk-WIXHUBQN.js.map} +0 -0
- /package/dist/{chunk-57AZS3IE.js.map → chunk-WRMUXZ7C.js.map} +0 -0
- /package/dist/{chunk-CRAOSVHC.js.map → chunk-WSDBQSPP.js.map} +0 -0
- /package/dist/{chunk-2CLNIEK4.js.map → chunk-WTSQUCHB.js.map} +0 -0
- /package/dist/{chunk-MIHN76LX.js.map → chunk-WYGTAQMX.js.map} +0 -0
- /package/dist/{chunk-GAVYGBFI.js.map → chunk-X2R73NGG.js.map} +0 -0
- /package/dist/{chunk-T7OXJZCX.js.map → chunk-XOIDUM2H.js.map} +0 -0
- /package/dist/{chunk-XHIQ5I6N.js.map → chunk-XVLEBB4Y.js.map} +0 -0
- /package/dist/{chunk-T3OWFVMS.js.map → chunk-Y3XZEKDQ.js.map} +0 -0
- /package/dist/{chunk-ROKQU7WG.js.map → chunk-YMI27QPF.js.map} +0 -0
- /package/dist/{chunk-U7XM7CB4.js.map → chunk-YNTLWCF4.js.map} +0 -0
- /package/dist/{chunk-ZQCND77P.js.map → chunk-YRYF76OE.js.map} +0 -0
- /package/dist/{chunk-2BDT3UZQ.js.map → chunk-ZAX4XQLN.js.map} +0 -0
- /package/dist/{chunk-DXR5PDFP.js.map → chunk-ZBHGNE2J.js.map} +0 -0
- /package/dist/{chunk-KODELWYT.js.map → chunk-ZF6ZS77B.js.map} +0 -0
- /package/dist/{chunk-KUDGXAF7.js.map → chunk-ZM5YP5NJ.js.map} +0 -0
- /package/dist/{chunk-I7ITSXSJ.js.map → chunk-ZR5EKJT6.js.map} +0 -0
- /package/dist/{chunk-IZXHMZQ6.js.map → chunk-ZW5YTIH3.js.map} +0 -0
- /package/dist/{embedded-new-voice-2G3VLPVQ.js.map → computer-viewer-5LKRCEVQ.js.map} +0 -0
- /package/dist/{embedded-voice-T5IWOWGD.js.map → embedded-new-voice-GHJRY3YL.js.map} +0 -0
- /package/dist/{model-policy-picker-menu-SMC6J6QN.js.map → embedded-voice-ASQXBSTX.js.map} +0 -0
- /package/dist/{fleet-decision-row-WM64KXP3.js.map → fleet-decision-row-U7LDVBEM.js.map} +0 -0
- /package/dist/{latest-question-OX56OVQ5.js.map → latest-question-RNVF262Q.js.map} +0 -0
- /package/dist/{sandbox-files-ESDMOFSD.js.map → model-policy-picker-menu-E6XKMFTA.js.map} +0 -0
- /package/dist/{queue-surface-implementation-4KUZ4PJV.js.map → queue-surface-implementation-GUAIG6TK.js.map} +0 -0
- /package/dist/{recorder-host-WF2RRR56.js.map → recorder-host-2MYDJPQW.js.map} +0 -0
- /package/dist/{session-connect-cards-Q53KMMYY.js.map → sandbox-files-W5W2LW4K.js.map} +0 -0
- /package/dist/{session-realtime-CF3I35WJ.js.map → session-connect-cards-TUY62MVP.js.map} +0 -0
- /package/dist/{timeline-annotation-markers-CJK4RYZ4.js.map → timeline-annotation-markers-FNILLWNU.js.map} +0 -0
- /package/dist/{timeline-annotation-selection-67GF5H26.js.map → timeline-annotation-selection-MBCIDO2Q.js.map} +0 -0
- /package/dist/{timeline-annotations-dialog-ONJPQDJQ.js.map → timeline-annotations-dialog-JPNKLOTE.js.map} +0 -0
|
@@ -9,26 +9,31 @@ type Anchor = {
|
|
|
9
9
|
};
|
|
10
10
|
export type TimelineAnchor = Anchor[];
|
|
11
11
|
|
|
12
|
+
/**
|
|
13
|
+
* A text selection inside the timeline. Content must not move beneath it, so it
|
|
14
|
+
* is the one non-scroll signal that hands the view to the reader.
|
|
15
|
+
*/
|
|
16
|
+
export function timelineHasSelection(scroller: HTMLElement | null): boolean {
|
|
17
|
+
if (!scroller) return false;
|
|
18
|
+
const selection = scroller.ownerDocument.getSelection();
|
|
19
|
+
return Boolean(
|
|
20
|
+
selection &&
|
|
21
|
+
!selection.isCollapsed &&
|
|
22
|
+
(scroller.contains(selection.anchorNode) || scroller.contains(selection.focusNode)),
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
|
|
12
26
|
/**
|
|
13
27
|
* Read ownership synchronously: selectionchange may follow the next React commit.
|
|
14
|
-
* Focus
|
|
15
|
-
*
|
|
28
|
+
* Focus inside the timeline protects the focused content from settlement
|
|
29
|
+
* compaction and motion; it never decides bottom-follow (see message-timeline).
|
|
16
30
|
*/
|
|
17
|
-
export function timelineHasReader(
|
|
18
|
-
scroller: HTMLElement | null,
|
|
19
|
-
answeredCard: HTMLElement | null = null,
|
|
20
|
-
): boolean {
|
|
31
|
+
export function timelineHasReader(scroller: HTMLElement | null): boolean {
|
|
21
32
|
if (!scroller) return false;
|
|
22
33
|
const focused = scroller.ownerDocument.activeElement;
|
|
23
|
-
const selection = scroller.ownerDocument.getSelection();
|
|
24
34
|
return Boolean(
|
|
25
|
-
(focused &&
|
|
26
|
-
|
|
27
|
-
scroller.contains(focused) &&
|
|
28
|
-
!answeredCard?.contains(focused)) ||
|
|
29
|
-
(selection &&
|
|
30
|
-
!selection.isCollapsed &&
|
|
31
|
-
(scroller.contains(selection.anchorNode) || scroller.contains(selection.focusNode))),
|
|
35
|
+
(focused && focused !== scroller && scroller.contains(focused)) ||
|
|
36
|
+
timelineHasSelection(scroller),
|
|
32
37
|
);
|
|
33
38
|
}
|
|
34
39
|
|
|
@@ -12,9 +12,8 @@ export function useReadingProgress(
|
|
|
12
12
|
projected: TimelineGroup[],
|
|
13
13
|
pinned: boolean,
|
|
14
14
|
scroller: HTMLElement | null,
|
|
15
|
-
answeredCard: HTMLElement | null = null,
|
|
16
15
|
) {
|
|
17
|
-
const following = pinned && !timelineHasReader(scroller
|
|
16
|
+
const following = pinned && !timelineHasReader(scroller);
|
|
18
17
|
const previous = useRef<TimelineGroup[]>([]);
|
|
19
18
|
const [released, setReleased] = useState<ReadonlySet<string>>(() => new Set());
|
|
20
19
|
const groups = useMemo(() => {
|
|
@@ -7,11 +7,11 @@ export type TimelineSettlement = { element: HTMLElement; top: number };
|
|
|
7
7
|
export function captureTimelineSettlement(
|
|
8
8
|
scroller: HTMLElement,
|
|
9
9
|
groups: readonly { key: string; group: TimelineGroup }[],
|
|
10
|
-
answeredCard: HTMLElement | null = null,
|
|
11
10
|
): TimelineSettlement | null {
|
|
12
11
|
// Selectionchange can arrive after this commit. Inspect ownership directly
|
|
13
|
-
// as well as the caller's pin latch so that race cannot move selected text
|
|
14
|
-
|
|
12
|
+
// as well as the caller's pin latch so that race cannot move selected text
|
|
13
|
+
// or a focused control.
|
|
14
|
+
if (timelineHasReader(scroller)) return null;
|
|
15
15
|
const live = Array.from(
|
|
16
16
|
scroller.querySelectorAll(
|
|
17
17
|
'[data-og-exchange-status="working"], [data-og-exchange-status="waiting"]',
|
package/src/lib/format.ts
CHANGED
|
@@ -291,6 +291,44 @@ export function isConnectionAccountSubmissionError(error: unknown): boolean {
|
|
|
291
291
|
/** `details.code` the API sets on a 422 for a model missing from the live catalog. */
|
|
292
292
|
export const MODEL_UNAVAILABLE_DETAIL_CODE = "model_unavailable";
|
|
293
293
|
|
|
294
|
+
/** `details.code` the API sets on a 422 for a model the workspace's policy refuses. */
|
|
295
|
+
export const MODEL_POLICY_DETAIL_CODE = "model_policy";
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* The reason a refused new chat gives. The refusals a person can hit (a model
|
|
299
|
+
* that isn't available to them, the workspace's model policy, a speed the
|
|
300
|
+
* model can't run) are typed by `details.code` and worded here; any other
|
|
301
|
+
* session create refusal shows the server's own reason, which still says more
|
|
302
|
+
* than the generic "check your input".
|
|
303
|
+
*/
|
|
304
|
+
export function sessionCreateRefusalMessage(t: OpenGeniText, error: Error): string | null {
|
|
305
|
+
if (!(error instanceof OpenGeniApiError) || error.status !== 422) return null;
|
|
306
|
+
const detailCode = error.details?.code;
|
|
307
|
+
if (detailCode === "UNSUPPORTED_LATENCY_MODE") {
|
|
308
|
+
return t("lib.format.speedUnavailable");
|
|
309
|
+
}
|
|
310
|
+
if (error.code !== "SESSION_CREATE_REJECTED") return null;
|
|
311
|
+
if (detailCode === MODEL_UNAVAILABLE_DETAIL_CODE) {
|
|
312
|
+
return t("lib.format.newChatModelUnavailable");
|
|
313
|
+
}
|
|
314
|
+
if (detailCode === MODEL_POLICY_DETAIL_CODE) {
|
|
315
|
+
return error.details?.reason === "credits"
|
|
316
|
+
? t("lib.format.modelPolicyCredits")
|
|
317
|
+
: t("lib.format.modelPolicyRefused");
|
|
318
|
+
}
|
|
319
|
+
let message: unknown;
|
|
320
|
+
try {
|
|
321
|
+
message = (JSON.parse(error.body) as { message?: unknown } | null)?.message;
|
|
322
|
+
} catch {
|
|
323
|
+
return null;
|
|
324
|
+
}
|
|
325
|
+
if (typeof message !== "string") return null;
|
|
326
|
+
const text = message.trim().slice(0, 300);
|
|
327
|
+
if (!text) return null;
|
|
328
|
+
const sentence = text.charAt(0).toUpperCase() + text.slice(1);
|
|
329
|
+
return /[.!?]$/.test(sentence) ? sentence : `${sentence}.`;
|
|
330
|
+
}
|
|
331
|
+
|
|
294
332
|
/**
|
|
295
333
|
* A fresh Send or Steer refused because the task's own usage limit is reached.
|
|
296
334
|
* The draft is kept and an unchanged retry is never offered. The one current
|
|
@@ -376,9 +414,14 @@ export function composerSubmissionErrorMessage(
|
|
|
376
414
|
}
|
|
377
415
|
if (error instanceof ComposerStateError) return error.message;
|
|
378
416
|
if (error instanceof OpenGeniApiError && error.outcomeUnknown) return formatErrorMessage(error);
|
|
379
|
-
if (isModelUnavailableSubmissionError(error))
|
|
417
|
+
if (isModelUnavailableSubmissionError(error)) {
|
|
418
|
+
// A refused new chat has no chat yet whose model is "no longer available".
|
|
419
|
+
return sessionCreateRefusalMessage(t, error) ?? t("lib.format.modelUnavailable");
|
|
420
|
+
}
|
|
380
421
|
if (isConnectionAccountSubmissionError(error)) return t("lib.format.accountUnavailable");
|
|
381
422
|
if (isSessionUsageLimitSubmissionError(error)) return t("lib.format.sessionUsageLimitReached");
|
|
423
|
+
const createRefusal = sessionCreateRefusalMessage(t, error);
|
|
424
|
+
if (createRefusal) return createRefusal;
|
|
382
425
|
const siteRefusal = siteRefusalCode(error);
|
|
383
426
|
if (siteRefusal) return COMPOSER_SITE_REFUSAL_MESSAGES(t)[siteRefusal]!;
|
|
384
427
|
if (error instanceof OpenGeniApiError && error.code === "allowance_exhausted") {
|
|
@@ -413,6 +456,8 @@ export function composerSubmissionCanRetry(error: Error): boolean {
|
|
|
413
456
|
return !(
|
|
414
457
|
isComposerCreditRefusal(error) ||
|
|
415
458
|
isModelUnavailableSubmissionError(error) ||
|
|
459
|
+
// The policy refuses the same model again until someone changes it.
|
|
460
|
+
(error instanceof OpenGeniApiError && error.details?.code === MODEL_POLICY_DETAIL_CODE) ||
|
|
416
461
|
isConnectionAccountSubmissionError(error) ||
|
|
417
462
|
isSessionUsageLimitSubmissionError(error) ||
|
|
418
463
|
(error instanceof OpenGeniApiError && error.code === "allowance_exhausted") ||
|
package/src/messages/en.ts
CHANGED
|
@@ -34,6 +34,8 @@ export const englishMessages = {
|
|
|
34
34
|
"approvalSurface.sendingAnswer": "Sending answer…",
|
|
35
35
|
/** Above an MCP server's question in the middle of a tool call, e.g. "Linear asks". */
|
|
36
36
|
"approvalSurface.serverAsks": "{server} asks",
|
|
37
|
+
/** A waiting action whose review offers no decision yet; a Try again button follows. */
|
|
38
|
+
"approvalSurface.thisActionCanTBeDecided": "This action can't be decided yet.",
|
|
37
39
|
"approvalSurface.tryAgain": "Try again",
|
|
38
40
|
"approvalSurface.viewFullDetails": "View full details",
|
|
39
41
|
"approvalSurface.youDonTHaveAccess":
|
|
@@ -2104,7 +2106,15 @@ export const englishMessages = {
|
|
|
2104
2106
|
"A selected connector account is unavailable. Review accounts in + → Connectors, then edit and send your saved message.",
|
|
2105
2107
|
"lib.format.modelUnavailable":
|
|
2106
2108
|
"This chat's model is no longer available. Choose another model to continue. Your message is saved.",
|
|
2109
|
+
"lib.format.newChatModelUnavailable":
|
|
2110
|
+
"This model isn't available to you. Choose another model. Your message is saved.",
|
|
2111
|
+
"lib.format.modelPolicyCredits":
|
|
2112
|
+
"This model uses credits, which are off in this workspace. Choose a model paid by a subscription or API key. Your message is saved.",
|
|
2113
|
+
"lib.format.modelPolicyRefused":
|
|
2114
|
+
"This workspace's model policy doesn't allow this model. Choose another model. Your message is saved.",
|
|
2107
2115
|
"lib.format.now": "now",
|
|
2116
|
+
"lib.format.speedUnavailable":
|
|
2117
|
+
"This model can't run at the selected speed. Choose another speed. Your message is saved.",
|
|
2108
2118
|
"lib.format.outOfCreditsThisWorkspace":
|
|
2109
2119
|
"There aren't enough credits for this model. Add credits, or choose another model. The conversation is preserved.",
|
|
2110
2120
|
"lib.format.providerBlockedRequest": "The model provider blocked this request.",
|
|
@@ -5562,6 +5572,7 @@ export const englishMessages = {
|
|
|
5562
5572
|
"timeline.screenshotLightbox.zoomOut": "Zoom out",
|
|
5563
5573
|
"timeline.shared.bytesOmitted_one": "{bytes} byte omitted",
|
|
5564
5574
|
"timeline.shared.bytesOmitted_other": "{bytes} bytes omitted",
|
|
5575
|
+
"timeline.shared.copyStep": "Copy step",
|
|
5565
5576
|
"timeline.shared.expandScreenshot": "Expand screenshot",
|
|
5566
5577
|
"timeline.shared.fullEvidence": "full evidence",
|
|
5567
5578
|
"timeline.shared.imageUnavailable": "image unavailable",
|
|
@@ -89,26 +89,38 @@ export default function PlatformActivityRow({
|
|
|
89
89
|
// A failed step's recorded error is diagnostic detail: behind the row, never
|
|
90
90
|
// its title, and absent where the host hides raw technical detail.
|
|
91
91
|
const detail = failed && !plainDetails ? item.detail : undefined;
|
|
92
|
+
const note =
|
|
93
|
+
item.phase === "model_preparation"
|
|
94
|
+
? msg("timeline.platformActivityRow.includesOverlappingSandboxStartupCustom")
|
|
95
|
+
: undefined;
|
|
92
96
|
return j(ActivityDisclosure, {
|
|
93
97
|
icon: j(BotIcon, { className: "size-3.5" }),
|
|
94
98
|
iconTone: failed ? "failed" : running ? "running" : "muted",
|
|
95
99
|
title: item.blockedReason
|
|
96
100
|
? STARTUP_WAIT_TITLES(msg)[item.blockedReason]
|
|
97
101
|
: startupPhaseTitle(msg, item.phase, item.status, item.outcome),
|
|
98
|
-
preview:
|
|
99
|
-
item.phase === "model_preparation"
|
|
100
|
-
? msg("timeline.platformActivityRow.includesOverlappingSandboxStartupCustom")
|
|
101
|
-
: undefined,
|
|
102
|
+
preview: note,
|
|
102
103
|
running,
|
|
103
104
|
failed,
|
|
104
105
|
cancelled: item.status === "cancelled",
|
|
105
106
|
chip: duration ? { tone: failed ? "bad" : "muted", text: duration } : undefined,
|
|
106
107
|
expandable: Boolean(detail),
|
|
107
108
|
children: detail
|
|
108
|
-
?
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
109
|
+
? [
|
|
110
|
+
// Open, the note leaves the row; it stays readable above the details.
|
|
111
|
+
note
|
|
112
|
+
? j(
|
|
113
|
+
"p",
|
|
114
|
+
{ className: "text-og-sm leading-5 text-og-fg-subtle", children: note },
|
|
115
|
+
"note",
|
|
116
|
+
)
|
|
117
|
+
: null,
|
|
118
|
+
j(
|
|
119
|
+
PayloadBlock,
|
|
120
|
+
{ label: msg("timeline.platformActivityRow.details"), value: detail },
|
|
121
|
+
"detail",
|
|
122
|
+
),
|
|
123
|
+
]
|
|
112
124
|
: undefined,
|
|
113
125
|
});
|
|
114
126
|
}
|
package/src/timeline/shared.tsx
CHANGED
|
@@ -1,8 +1,20 @@
|
|
|
1
|
-
import { CameraIcon, CameraOffIcon, ChevronRightIcon } from "lucide-react";
|
|
1
|
+
import { CameraIcon, CameraOffIcon, CheckIcon, ChevronRightIcon, CopyIcon } from "lucide-react";
|
|
2
2
|
import { useToolDetails } from "./tool-details";
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
createContext,
|
|
5
|
+
useContext,
|
|
6
|
+
useEffect,
|
|
7
|
+
useLayoutEffect,
|
|
8
|
+
useRef,
|
|
9
|
+
useState,
|
|
10
|
+
type KeyboardEvent,
|
|
11
|
+
type MouseEvent,
|
|
12
|
+
type ReactNode,
|
|
13
|
+
type RefObject,
|
|
14
|
+
} from "react";
|
|
4
15
|
import { useTimelineSearchReveal } from "../components/timeline-search";
|
|
5
16
|
import { cn } from "../lib/cn";
|
|
17
|
+
import { copyTextToClipboard } from "../lib/clipboard";
|
|
6
18
|
import { stringifyPayload } from "../lib/format";
|
|
7
19
|
import { redactPayload } from "./credential-redaction";
|
|
8
20
|
import { SecretRefText } from "../components/secret-ref-chip";
|
|
@@ -197,6 +209,19 @@ export function ActivityDisclosure({
|
|
|
197
209
|
useEffect(() => {
|
|
198
210
|
if (open && outputPending && !compact) loadOutput?.();
|
|
199
211
|
}, [open, outputPending, loadOutput, compact]);
|
|
212
|
+
const titleRef = useRef<HTMLSpanElement>(null);
|
|
213
|
+
const previewRef = useRef<HTMLSpanElement>(null);
|
|
214
|
+
const bodyRef = useRef<HTMLDivElement>(null);
|
|
215
|
+
const childBody = expandable && (children != null || truncation != null);
|
|
216
|
+
// A step with nothing behind it still opens when its one line is cut off,
|
|
217
|
+
// so its whole title and note can be read (and copied).
|
|
218
|
+
const clipped = useClippedLine(
|
|
219
|
+
titleRef,
|
|
220
|
+
previewRef,
|
|
221
|
+
!compact && !childBody && !media,
|
|
222
|
+
open,
|
|
223
|
+
`${typeof title === "string" ? title : ""}\u0000${typeof preview === "string" ? preview : ""}`,
|
|
224
|
+
);
|
|
200
225
|
if (compact)
|
|
201
226
|
return (
|
|
202
227
|
<span className="og-rolling-label">
|
|
@@ -211,7 +236,8 @@ export function ActivityDisclosure({
|
|
|
211
236
|
</ShimmerText>
|
|
212
237
|
</span>
|
|
213
238
|
);
|
|
214
|
-
const hasBody =
|
|
239
|
+
const hasBody = childBody || clipped;
|
|
240
|
+
const expanded = open && hasBody;
|
|
215
241
|
|
|
216
242
|
// The preview is detail-on-demand: it is suppressed once the row is open so a
|
|
217
243
|
// path/stat shown in the body never also sits in the collapsed row.
|
|
@@ -256,22 +282,31 @@ export function ActivityDisclosure({
|
|
|
256
282
|
className={cn("og-command-reel", running && "og-command-reel-running")}
|
|
257
283
|
>
|
|
258
284
|
<span
|
|
285
|
+
ref={titleRef}
|
|
259
286
|
className={cn(
|
|
260
|
-
"min-w-0 shrink
|
|
287
|
+
"min-w-0 shrink text-og-base font-medium",
|
|
288
|
+
// Open, the whole title shows; closed, it keeps to one line.
|
|
289
|
+
expanded ? "whitespace-normal [overflow-wrap:anywhere]" : "truncate",
|
|
261
290
|
titleMono && "font-og-mono text-og-sm font-normal",
|
|
262
291
|
)}
|
|
263
292
|
>
|
|
264
293
|
{title}
|
|
265
294
|
</span>
|
|
266
295
|
{previewVisible && !media ? (
|
|
267
|
-
<span className="min-w-0 flex-1 truncate text-og-sm text-og-fg-subtle">
|
|
296
|
+
<span ref={previewRef} className="min-w-0 flex-1 truncate text-og-sm text-og-fg-subtle">
|
|
297
|
+
{preview}
|
|
298
|
+
</span>
|
|
268
299
|
) : (
|
|
269
300
|
<span className="flex-1" />
|
|
270
301
|
)}
|
|
271
302
|
</ShimmerText>
|
|
272
303
|
{/* The right gutter carries at most ONE signal: the media thumbnail, else a
|
|
273
|
-
terse settle chip (hidden once expanded — the body owns the detail)
|
|
274
|
-
|
|
304
|
+
terse settle chip (hidden once expanded — the body owns the detail);
|
|
305
|
+
an open step keeps it for Copy, which sits beside the row (a button
|
|
306
|
+
inside the row's own button role would be hidden from AT). */}
|
|
307
|
+
{expanded ? (
|
|
308
|
+
<span aria-hidden="true" className="ml-auto size-6 shrink-0 pointer-coarse:size-11" />
|
|
309
|
+
) : media && !open ? (
|
|
275
310
|
<span className="ml-auto flex shrink-0 items-center gap-2 pl-2">{media}</span>
|
|
276
311
|
) : chip && !open ? (
|
|
277
312
|
<span className="ml-auto shrink-0 pl-2">
|
|
@@ -285,43 +320,67 @@ export function ActivityDisclosure({
|
|
|
285
320
|
// settled state regardless of whether the chip slot is occupied by media.
|
|
286
321
|
const dataStatus = cancelled ? "cancelled" : failed ? "failed" : undefined;
|
|
287
322
|
|
|
288
|
-
if (!hasBody) {
|
|
289
|
-
return (
|
|
290
|
-
<div className={cn(rowClass, "cursor-default")} data-status={dataStatus}>
|
|
291
|
-
{inner}
|
|
292
|
-
</div>
|
|
293
|
-
);
|
|
294
|
-
}
|
|
295
|
-
|
|
296
323
|
// Native disclosure (not radix-ui Collapsible): importing `radix-ui` from the
|
|
297
324
|
// timeline registry pulls Popper into the session share-graph and crashes
|
|
298
325
|
// lazy workspace settings (`createPopperScope is not a function`).
|
|
326
|
+
//
|
|
327
|
+
// One DOM shape whether or not the row opens, so a row that becomes
|
|
328
|
+
// expandable (its line got cut off) keeps the same title and note nodes,
|
|
329
|
+
// which the clipping measurement goes on observing.
|
|
299
330
|
return (
|
|
300
|
-
<div>
|
|
331
|
+
<div className="relative">
|
|
301
332
|
<div
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
333
|
+
{...(hasBody
|
|
334
|
+
? {
|
|
335
|
+
role: "button",
|
|
336
|
+
tabIndex: 0,
|
|
337
|
+
"aria-expanded": open,
|
|
338
|
+
"data-state": open ? "open" : "closed",
|
|
339
|
+
onClick: (event: MouseEvent<HTMLDivElement>) => {
|
|
340
|
+
// Selecting the row's text to copy it leaves the row as it is.
|
|
341
|
+
if (hasTextSelectionIn(event.currentTarget)) return;
|
|
342
|
+
setOpen((prev) => !prev);
|
|
343
|
+
},
|
|
344
|
+
onKeyDown: (event: KeyboardEvent<HTMLDivElement>) => {
|
|
345
|
+
if (event.target !== event.currentTarget) return;
|
|
346
|
+
if (event.key === "Enter" || event.key === " ") {
|
|
347
|
+
event.preventDefault();
|
|
348
|
+
setOpen((prev) => !prev);
|
|
349
|
+
}
|
|
350
|
+
},
|
|
351
|
+
}
|
|
352
|
+
: {})}
|
|
313
353
|
data-status={dataStatus}
|
|
314
354
|
className={cn(
|
|
315
355
|
rowClass,
|
|
316
|
-
|
|
317
|
-
|
|
356
|
+
hasBody
|
|
357
|
+
? [
|
|
358
|
+
"cursor-pointer outline-hidden hover:bg-og-surface-1 hover:text-og-fg",
|
|
359
|
+
"focus-visible:ring-2 focus-visible:ring-og-accent focus-visible:ring-offset-0",
|
|
360
|
+
]
|
|
361
|
+
: "cursor-default",
|
|
318
362
|
)}
|
|
319
363
|
>
|
|
320
364
|
{inner}
|
|
321
365
|
</div>
|
|
322
|
-
{
|
|
323
|
-
<
|
|
324
|
-
{
|
|
366
|
+
{expanded ? (
|
|
367
|
+
<span className="absolute right-1.5 top-1.5 pointer-coarse:top-2.5">
|
|
368
|
+
<StepCopyButton titleRef={titleRef} bodyRef={bodyRef} />
|
|
369
|
+
</span>
|
|
370
|
+
) : null}
|
|
371
|
+
{expanded ? (
|
|
372
|
+
<div
|
|
373
|
+
ref={bodyRef}
|
|
374
|
+
className="mb-2 ml-7 mt-1.5 flex flex-col gap-2 overflow-hidden animate-og-expand empty:hidden"
|
|
375
|
+
>
|
|
376
|
+
{!childBody ? (
|
|
377
|
+
// A step without details: its note, in full.
|
|
378
|
+
preview != null && !media ? (
|
|
379
|
+
<div className="whitespace-pre-wrap text-og-sm leading-5 text-og-fg-subtle [overflow-wrap:anywhere]">
|
|
380
|
+
{preview}
|
|
381
|
+
</div>
|
|
382
|
+
) : null
|
|
383
|
+
) : outputPreview && loadOutput && outputPreview.state !== "error" ? (
|
|
325
384
|
// Never show a preview's body as if it were the whole output.
|
|
326
385
|
<div
|
|
327
386
|
data-og-tool-output-loading=""
|
|
@@ -347,6 +406,118 @@ export function ActivityDisclosure({
|
|
|
347
406
|
);
|
|
348
407
|
}
|
|
349
408
|
|
|
409
|
+
/**
|
|
410
|
+
* Whether a closed row's one line (its title or note) is cut off. Measured
|
|
411
|
+
* only while `enabled` and kept while the row is open (when the line wraps),
|
|
412
|
+
* so opening a clipped row never takes its body away.
|
|
413
|
+
*/
|
|
414
|
+
function useClippedLine(
|
|
415
|
+
titleRef: RefObject<HTMLElement | null>,
|
|
416
|
+
previewRef: RefObject<HTMLElement | null>,
|
|
417
|
+
enabled: boolean,
|
|
418
|
+
open: boolean,
|
|
419
|
+
contentKey: string,
|
|
420
|
+
): boolean {
|
|
421
|
+
const [clipped, setClipped] = useState(false);
|
|
422
|
+
const holding = open && clipped;
|
|
423
|
+
useIsomorphicLayoutEffect(() => {
|
|
424
|
+
if (!enabled || holding) return;
|
|
425
|
+
const measure = () => {
|
|
426
|
+
const cut = [titleRef.current, previewRef.current].some(
|
|
427
|
+
(element) => element != null && element.scrollWidth > element.clientWidth + 1,
|
|
428
|
+
);
|
|
429
|
+
setClipped((current) => (current === cut ? current : cut));
|
|
430
|
+
};
|
|
431
|
+
measure();
|
|
432
|
+
if (typeof ResizeObserver === "undefined") return;
|
|
433
|
+
const observer = new ResizeObserver(measure);
|
|
434
|
+
for (const element of [titleRef.current, previewRef.current]) {
|
|
435
|
+
if (element) observer.observe(element);
|
|
436
|
+
}
|
|
437
|
+
return () => observer.disconnect();
|
|
438
|
+
}, [enabled, holding, open, contentKey, titleRef, previewRef]);
|
|
439
|
+
return enabled && clipped;
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
const useIsomorphicLayoutEffect = typeof window === "undefined" ? useEffect : useLayoutEffect;
|
|
443
|
+
|
|
444
|
+
/** A drag-selection inside the row, which a click must not turn into a toggle. */
|
|
445
|
+
function hasTextSelectionIn(element: HTMLElement): boolean {
|
|
446
|
+
const selection = typeof window === "undefined" ? null : window.getSelection();
|
|
447
|
+
if (!selection || selection.isCollapsed || selection.toString().trim() === "") return false;
|
|
448
|
+
return element.contains(selection.anchorNode) || element.contains(selection.focusNode);
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
function readableText(element: HTMLElement | null): string {
|
|
452
|
+
if (!element) return "";
|
|
453
|
+
// innerText keeps line breaks between blocks where the DOM supports it.
|
|
454
|
+
const text = typeof element.innerText === "string" ? element.innerText : element.textContent;
|
|
455
|
+
return (text ?? "").trim();
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
/** The step's whole text as shown: its title, then what opened below it. */
|
|
459
|
+
export function activityStepText(title: HTMLElement | null, body: HTMLElement | null): string {
|
|
460
|
+
return [readableText(title), readableText(body)].filter(Boolean).join("\n\n");
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
const STEP_COPIED_MS = 1600;
|
|
464
|
+
|
|
465
|
+
/**
|
|
466
|
+
* Copy for an open step, in the gutter its chip leaves. A plain icon button
|
|
467
|
+
* (no tooltip layer: the timeline registry stays free of Popper).
|
|
468
|
+
*/
|
|
469
|
+
function StepCopyButton({
|
|
470
|
+
titleRef,
|
|
471
|
+
bodyRef,
|
|
472
|
+
}: {
|
|
473
|
+
titleRef: RefObject<HTMLElement | null>;
|
|
474
|
+
bodyRef: RefObject<HTMLElement | null>;
|
|
475
|
+
}) {
|
|
476
|
+
const t = useOpenGeniText();
|
|
477
|
+
const [copied, setCopied] = useState(false);
|
|
478
|
+
const timer = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
479
|
+
useEffect(
|
|
480
|
+
() => () => {
|
|
481
|
+
if (timer.current !== null) clearTimeout(timer.current);
|
|
482
|
+
},
|
|
483
|
+
[],
|
|
484
|
+
);
|
|
485
|
+
const label = copied ? t("copyButton.copied") : t("timeline.shared.copyStep");
|
|
486
|
+
return (
|
|
487
|
+
<button
|
|
488
|
+
type="button"
|
|
489
|
+
data-og-copy-step=""
|
|
490
|
+
data-state={copied ? "copied" : "idle"}
|
|
491
|
+
aria-label={label}
|
|
492
|
+
title={label}
|
|
493
|
+
onClick={(event) => {
|
|
494
|
+
event.stopPropagation();
|
|
495
|
+
void copyTextToClipboard(activityStepText(titleRef.current, bodyRef.current)).then((ok) => {
|
|
496
|
+
if (!ok) return;
|
|
497
|
+
setCopied(true);
|
|
498
|
+
if (timer.current !== null) clearTimeout(timer.current);
|
|
499
|
+
timer.current = setTimeout(() => {
|
|
500
|
+
timer.current = null;
|
|
501
|
+
setCopied(false);
|
|
502
|
+
}, STEP_COPIED_MS);
|
|
503
|
+
});
|
|
504
|
+
}}
|
|
505
|
+
className={cn(
|
|
506
|
+
"inline-flex size-6 items-center justify-center rounded-og-sm text-og-fg-subtle pointer-coarse:size-11",
|
|
507
|
+
"transition-colors duration-150 hover:bg-og-surface-2/80 hover:text-og-fg",
|
|
508
|
+
"focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent/40",
|
|
509
|
+
copied && "text-og-accent",
|
|
510
|
+
)}
|
|
511
|
+
>
|
|
512
|
+
{copied ? (
|
|
513
|
+
<CheckIcon className="size-3.5" aria-hidden />
|
|
514
|
+
) : (
|
|
515
|
+
<CopyIcon className="size-3.5" aria-hidden />
|
|
516
|
+
)}
|
|
517
|
+
</button>
|
|
518
|
+
);
|
|
519
|
+
}
|
|
520
|
+
|
|
350
521
|
/** Says the body below is a preview, with Retry when the exact read failed. */
|
|
351
522
|
function ToolOutputPreviewNotice({ preview }: { preview: ToolOutputPreview }) {
|
|
352
523
|
const t = useOpenGeniText();
|
|
@@ -175,3 +175,40 @@ test("inside the hidden page, dialogs never take the bar and pages outside the b
|
|
|
175
175
|
expect(view.bar()).toBe("Capabilities");
|
|
176
176
|
});
|
|
177
177
|
});
|
|
178
|
+
|
|
179
|
+
function CopyableHeader({ title, fallback = false }: { title: string; fallback?: boolean }) {
|
|
180
|
+
titles.useWindowBarTitle(title, fallback, { copyable: true });
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
test("only a copyable title (a Site's) leaves the drag region for its Copy title menu", async () => {
|
|
185
|
+
const copyable = () =>
|
|
186
|
+
document
|
|
187
|
+
.querySelector("[data-window-bar-title-text]")
|
|
188
|
+
?.className.includes("[-webkit-app-region:no-drag]") ?? null;
|
|
189
|
+
await mount(
|
|
190
|
+
<windowBar.WindowBarPageTitle enabled>
|
|
191
|
+
<Header title="Settings" />
|
|
192
|
+
</windowBar.WindowBarPageTitle>,
|
|
193
|
+
async (view) => {
|
|
194
|
+
expect(view.bar()).toBe("Settings");
|
|
195
|
+
expect(copyable()).toBe(false);
|
|
196
|
+
await view.render(
|
|
197
|
+
<windowBar.WindowBarPageTitle enabled>
|
|
198
|
+
<CopyableHeader title="Opengeni usage" />
|
|
199
|
+
</windowBar.WindowBarPageTitle>,
|
|
200
|
+
);
|
|
201
|
+
expect(view.bar()).toBe("Opengeni usage");
|
|
202
|
+
expect(copyable()).toBe(true);
|
|
203
|
+
// A page opened in front (the publish form) takes the bar, and drags it.
|
|
204
|
+
await view.render(
|
|
205
|
+
<windowBar.WindowBarPageTitle enabled>
|
|
206
|
+
<CopyableHeader title="Opengeni usage" fallback />
|
|
207
|
+
<Header title="Publish to web" />
|
|
208
|
+
</windowBar.WindowBarPageTitle>,
|
|
209
|
+
);
|
|
210
|
+
expect(view.bar()).toBe("Publish to web");
|
|
211
|
+
expect(copyable()).toBe(false);
|
|
212
|
+
},
|
|
213
|
+
);
|
|
214
|
+
});
|
|
@@ -12,9 +12,11 @@ import { createContext, useContext, useId, useLayoutEffect, useMemo, type ReactN
|
|
|
12
12
|
export const PageHeaderWindowBarContext = createContext<{
|
|
13
13
|
/**
|
|
14
14
|
* A header's title, or null while it has none to show; keeps its place. A
|
|
15
|
-
* fallback claim shows only while no other header has a title.
|
|
15
|
+
* fallback claim shows only while no other header has a title. A copyable
|
|
16
|
+
* title (a Site's) can be right-clicked in the bar to copy it; others stay
|
|
17
|
+
* part of the bar's drag region.
|
|
16
18
|
*/
|
|
17
|
-
set(id: string, title: string | null, fallback?: boolean): void;
|
|
19
|
+
set(id: string, title: string | null, fallback?: boolean, copyable?: boolean): void;
|
|
18
20
|
release(id: string): void;
|
|
19
21
|
/** The header whose title the bar shows. */
|
|
20
22
|
owner: string | null;
|
|
@@ -42,7 +44,8 @@ export function WindowBarTitleBoundary({
|
|
|
42
44
|
fallback && enclosing
|
|
43
45
|
? {
|
|
44
46
|
...enclosing,
|
|
45
|
-
set: (id: string, title: string | null
|
|
47
|
+
set: (id: string, title: string | null, _fallback?: boolean, copyable?: boolean) =>
|
|
48
|
+
enclosing.set(id, title, true, copyable),
|
|
46
49
|
}
|
|
47
50
|
: null,
|
|
48
51
|
[fallback, enclosing],
|
|
@@ -61,15 +64,19 @@ export function WindowBarTitleBoundary({
|
|
|
61
64
|
* only until that page names it. Inside a fallback boundary every claim is a
|
|
62
65
|
* fallback already, so there the first one keeps the bar.
|
|
63
66
|
*/
|
|
64
|
-
export function useWindowBarTitle(
|
|
67
|
+
export function useWindowBarTitle(
|
|
68
|
+
title: ReactNode,
|
|
69
|
+
fallback = false,
|
|
70
|
+
{ copyable = false }: { copyable?: boolean } = {},
|
|
71
|
+
): boolean {
|
|
65
72
|
const windowBar = useContext(PageHeaderWindowBarContext);
|
|
66
73
|
const id = useId();
|
|
67
74
|
const text = typeof title === "string" ? title : null;
|
|
68
75
|
const set = windowBar?.set;
|
|
69
76
|
const release = windowBar?.release;
|
|
70
77
|
useIsomorphicLayoutEffect(() => {
|
|
71
|
-
set?.(id, text || null, fallback);
|
|
72
|
-
}, [id, set, text, fallback]);
|
|
78
|
+
set?.(id, text || null, fallback, copyable);
|
|
79
|
+
}, [id, set, text, fallback, copyable]);
|
|
73
80
|
useIsomorphicLayoutEffect(() => () => release?.(id), [id, release]);
|
|
74
81
|
return windowBar?.owner === id;
|
|
75
82
|
}
|
package/styles/compiled.css
CHANGED
|
@@ -11480,6 +11480,11 @@
|
|
|
11480
11480
|
position: static;
|
|
11481
11481
|
}
|
|
11482
11482
|
}
|
|
11483
|
+
:where(.og-root).pointer-coarse\:top-2\.5,:where(.og-root) .pointer-coarse\:top-2\.5 {
|
|
11484
|
+
@media (pointer: coarse) {
|
|
11485
|
+
top: calc(var(--spacing) * 2.5);
|
|
11486
|
+
}
|
|
11487
|
+
}
|
|
11483
11488
|
:where(.og-root).pointer-coarse\:top-13,:where(.og-root) .pointer-coarse\:top-13 {
|
|
11484
11489
|
@media (pointer: coarse) {
|
|
11485
11490
|
top: calc(var(--spacing) * 13);
|