@opengeni/react 6.7.0 → 6.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app/app-state.js +9 -9
- package/dist/app/components/Composer.js +20 -20
- 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 +14 -15
- 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 +16 -17
- 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 +16 -17
- package/dist/app/components/capabilities/session-capability-card.js +49 -50
- 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 +17 -18
- package/dist/app/components/capabilities/session-github-card.js +17 -18
- package/dist/app/components/capabilities/session-machine-card.js +23 -24
- package/dist/app/components/capabilities/session-personal-github-card.js +15 -16
- 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 +70 -61
- package/dist/app/components/rail/session-header.js +54 -53
- package/dist/app/components/rail/session-list.js +68 -59
- 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 +89 -80
- 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 +43 -44
- package/dist/app/components/session/descendant-requests.js +39 -40
- 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 +37 -38
- package/dist/app/components/session/inspector.js +47 -48
- 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 +19 -20
- package/dist/app/components/workspace-reach.js +4 -4
- package/dist/app/embed/session-app.js +173 -167
- 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 +15 -16
- 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 +9 -10
- 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 +69 -69
- package/dist/app/routes/retained-artifact.js +48 -48
- package/dist/app/routes/session.js +100 -101
- 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 +177 -85
- 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-77WAKEAH.js → chunk-2OXSB2OL.js} +2 -2
- package/dist/{chunk-H3T7IWNA.js → chunk-2VJOSU4H.js} +2 -2
- package/dist/{chunk-N6AACDUW.js → chunk-34NV52R3.js} +4 -4
- 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-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-AW2MQB37.js → chunk-44JWVYJB.js} +2 -2
- 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-RQKLF42C.js → chunk-4K64EKM7.js} +4 -4
- package/dist/{chunk-NUNZS36W.js → chunk-4O2XWOLZ.js} +3 -3
- package/dist/{chunk-QB2KMIDP.js → chunk-4SJAEPM2.js} +2 -2
- 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-6B73WNLR.js +173 -0
- package/dist/chunk-6B73WNLR.js.map +1 -0
- package/dist/{chunk-5O2FCCHZ.js → chunk-6QK65ZWM.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-OPJJSKUK.js → chunk-77B6UCNK.js} +6 -6
- package/dist/{chunk-SEO7TICN.js → chunk-77BHKC43.js} +1 -1
- package/dist/{chunk-ZUA3JMI6.js → chunk-77SYIH6O.js} +2 -2
- package/dist/{chunk-ILDXWY37.js → chunk-7AI4E7PV.js} +2 -2
- 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-5YKW2K6I.js → chunk-AJDGP2N4.js} +20 -20
- 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-CRU35QQH.js → chunk-BFFNINCC.js} +108 -66
- package/dist/chunk-BFFNINCC.js.map +1 -0
- package/dist/{chunk-Z4FMAFNH.js → chunk-BQYRZIZ7.js} +2 -2
- package/dist/{chunk-DZXEDSQI.js → chunk-CEMSIU4Z.js} +5 -5
- package/dist/{chunk-FZC5N55X.js → chunk-CH4UQ4NO.js} +5 -5
- package/dist/{chunk-7X6SDK2C.js → chunk-CHU3RDV4.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-F2OPHAUN.js → chunk-CYDXCILL.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-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-KUDGXAF7.js → chunk-EBTUPRRQ.js} +10 -10
- 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-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-PTF5B7TJ.js → chunk-G5UQBTXY.js} +2 -2
- package/dist/{chunk-4E3ZJRTZ.js → chunk-G6ICCGJ3.js} +2 -2
- 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-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-IMDQUHBJ.js → chunk-HYEIA25Y.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-I4MRDSUF.js → chunk-IJR6VOLU.js} +3 -3
- package/dist/{chunk-YCVD6CI3.js → chunk-IN3VQFKS.js} +2 -2
- package/dist/{chunk-BJFH6JI5.js → chunk-IZXYFWA4.js} +13 -13
- 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-ZTPXACWB.js → chunk-JKL5S7UQ.js} +6 -6
- package/dist/{chunk-P77WNZDY.js → chunk-JMHEFZOB.js} +2 -2
- package/dist/{chunk-IDANQPRH.js → chunk-JV3UI7BH.js} +3 -3
- package/dist/{chunk-NW53H5RW.js → chunk-JV5ULONH.js} +166 -65
- package/dist/chunk-JV5ULONH.js.map +1 -0
- package/dist/{chunk-FVXBNBHO.js → chunk-K3D7IQQP.js} +6 -6
- 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-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-TAT5USZN.js → chunk-M3FDGRB4.js} +3 -3
- 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-4SAWSRAA.js → chunk-MRECRNVU.js} +5 -5
- 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-DZWARC4M.js → chunk-NFCS5WYC.js} +3 -3
- 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-VTTAJOQ7.js → chunk-OCXTTKVA.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-BHNSJVBC.js → chunk-OJWDNNW3.js} +5 -5
- package/dist/{chunk-X6KAJI3V.js → chunk-OK7BQMCI.js} +9 -9
- package/dist/{chunk-I5B5L6Q4.js → chunk-OOOSGPJL.js} +1 -1
- 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-JDTGRRNU.js → chunk-OSJ366KR.js} +49 -31
- package/dist/chunk-OSJ366KR.js.map +1 -0
- package/dist/{chunk-3IK6UYO6.js → chunk-OTW25A6I.js} +3 -3
- package/dist/{chunk-NPGISCU6.js → chunk-OWET7EY2.js} +16 -16
- package/dist/{chunk-CRAOSVHC.js → chunk-OXQ2SXVC.js} +2 -2
- 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-TXLIEOJX.js → chunk-PSM3CU7N.js} +111 -80
- package/dist/chunk-PSM3CU7N.js.map +1 -0
- 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-7T2ZE3VT.js → chunk-QPQ7R77C.js} +8 -1
- package/dist/chunk-QPQ7R77C.js.map +1 -0
- package/dist/{chunk-6BCXNDEI.js → chunk-QQIZMVAJ.js} +74 -60
- package/dist/chunk-QQIZMVAJ.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-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-HAX4LCR5.js → chunk-SFIXTOOJ.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-2Z3NQNTM.js → chunk-SK5S2PCK.js} +15 -15
- 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-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-GVN5SZLX.js → chunk-VATYK3JQ.js} +3 -3
- 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-2CLNIEK4.js → chunk-WTSQUCHB.js} +3 -3
- package/dist/{chunk-OVKYVZMW.js → chunk-WXF2RTS4.js} +2 -2
- package/dist/{chunk-MIHN76LX.js → chunk-WYGTAQMX.js} +3 -3
- package/dist/{chunk-2RG7NIAS.js → chunk-X2QJXDE4.js} +10 -10
- package/dist/{chunk-GAVYGBFI.js → chunk-XMBOLFFS.js} +2 -2
- package/dist/{chunk-T7OXJZCX.js → chunk-XOIDUM2H.js} +1 -1
- package/dist/{chunk-ORJPS5VN.js → chunk-XUOYNJPB.js} +97 -37
- package/dist/chunk-XUOYNJPB.js.map +1 -0
- package/dist/{chunk-XHIQ5I6N.js → chunk-XVLEBB4Y.js} +2 -2
- package/dist/{chunk-Q3DPEYX4.js → chunk-XZCCEKPW.js} +7 -7
- package/dist/{chunk-T3OWFVMS.js → chunk-Y3XZEKDQ.js} +2 -2
- package/dist/{chunk-KODELWYT.js → chunk-YJSCLGAW.js} +3 -3
- 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-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 +10 -10
- package/dist/{computer-viewer-TDDO25AV.js → computer-viewer-5LKRCEVQ.js} +5 -5
- package/dist/connect.js +13 -14
- 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 +5 -5
- package/dist/index.js +62 -63
- 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 +173 -167
- package/dist/{session-connect-cards-Q53KMMYY.js → session-connect-cards-HPH7JOZP.js} +9 -10
- 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 +37 -38
- 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 +4 -4
- 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-77WAKEAH.js.map → chunk-2OXSB2OL.js.map} +0 -0
- /package/dist/{chunk-H3T7IWNA.js.map → chunk-2VJOSU4H.js.map} +0 -0
- /package/dist/{chunk-N6AACDUW.js.map → chunk-34NV52R3.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-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-AW2MQB37.js.map → chunk-44JWVYJB.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-RQKLF42C.js.map → chunk-4K64EKM7.js.map} +0 -0
- /package/dist/{chunk-NUNZS36W.js.map → chunk-4O2XWOLZ.js.map} +0 -0
- /package/dist/{chunk-QB2KMIDP.js.map → chunk-4SJAEPM2.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-5O2FCCHZ.js.map → chunk-6QK65ZWM.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-OPJJSKUK.js.map → chunk-77B6UCNK.js.map} +0 -0
- /package/dist/{chunk-SEO7TICN.js.map → chunk-77BHKC43.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-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-5YKW2K6I.js.map → chunk-AJDGP2N4.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-Z4FMAFNH.js.map → chunk-BQYRZIZ7.js.map} +0 -0
- /package/dist/{chunk-DZXEDSQI.js.map → chunk-CEMSIU4Z.js.map} +0 -0
- /package/dist/{chunk-FZC5N55X.js.map → chunk-CH4UQ4NO.js.map} +0 -0
- /package/dist/{chunk-7X6SDK2C.js.map → chunk-CHU3RDV4.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-F2OPHAUN.js.map → chunk-CYDXCILL.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-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-KUDGXAF7.js.map → chunk-EBTUPRRQ.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-PTF5B7TJ.js.map → chunk-G5UQBTXY.js.map} +0 -0
- /package/dist/{chunk-4E3ZJRTZ.js.map → chunk-G6ICCGJ3.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-IMDQUHBJ.js.map → chunk-HYEIA25Y.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-I4MRDSUF.js.map → chunk-IJR6VOLU.js.map} +0 -0
- /package/dist/{chunk-YCVD6CI3.js.map → chunk-IN3VQFKS.js.map} +0 -0
- /package/dist/{chunk-BJFH6JI5.js.map → chunk-IZXYFWA4.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-ZTPXACWB.js.map → chunk-JKL5S7UQ.js.map} +0 -0
- /package/dist/{chunk-P77WNZDY.js.map → chunk-JMHEFZOB.js.map} +0 -0
- /package/dist/{chunk-IDANQPRH.js.map → chunk-JV3UI7BH.js.map} +0 -0
- /package/dist/{chunk-FVXBNBHO.js.map → chunk-K3D7IQQP.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-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-TAT5USZN.js.map → chunk-M3FDGRB4.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-4SAWSRAA.js.map → chunk-MRECRNVU.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-DZWARC4M.js.map → chunk-NFCS5WYC.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-VTTAJOQ7.js.map → chunk-OCXTTKVA.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-BHNSJVBC.js.map → chunk-OJWDNNW3.js.map} +0 -0
- /package/dist/{chunk-X6KAJI3V.js.map → chunk-OK7BQMCI.js.map} +0 -0
- /package/dist/{chunk-I5B5L6Q4.js.map → chunk-OOOSGPJL.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-CRAOSVHC.js.map → chunk-OXQ2SXVC.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-OV6QJRT4.js.map → chunk-QRECBCJM.js.map} +0 -0
- /package/dist/{chunk-3GZA4BUW.js.map → chunk-QURYQFDN.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-HAX4LCR5.js.map → chunk-SFIXTOOJ.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-2Z3NQNTM.js.map → chunk-SK5S2PCK.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-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-GVN5SZLX.js.map → chunk-VATYK3JQ.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-2CLNIEK4.js.map → chunk-WTSQUCHB.js.map} +0 -0
- /package/dist/{chunk-OVKYVZMW.js.map → chunk-WXF2RTS4.js.map} +0 -0
- /package/dist/{chunk-MIHN76LX.js.map → chunk-WYGTAQMX.js.map} +0 -0
- /package/dist/{chunk-2RG7NIAS.js.map → chunk-X2QJXDE4.js.map} +0 -0
- /package/dist/{chunk-GAVYGBFI.js.map → chunk-XMBOLFFS.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-Q3DPEYX4.js.map → chunk-XZCCEKPW.js.map} +0 -0
- /package/dist/{chunk-T3OWFVMS.js.map → chunk-Y3XZEKDQ.js.map} +0 -0
- /package/dist/{chunk-KODELWYT.js.map → chunk-YJSCLGAW.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-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-HPH7JOZP.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
|
@@ -51,6 +51,11 @@ import {
|
|
|
51
51
|
failureFallbackReason,
|
|
52
52
|
} from "../lib/failed-session-copy";
|
|
53
53
|
import { coveredModelChoice, creditRefusalGap, freeCreditGap } from "../lib/free-credit-gap";
|
|
54
|
+
import {
|
|
55
|
+
pickerPolicyRunnable,
|
|
56
|
+
ComposerSendBlockerNotice,
|
|
57
|
+
composerSendBlockerNotice,
|
|
58
|
+
} from "../lib/composer-send-blocking";
|
|
54
59
|
import { ChatPaymentPages } from "../components/chat-payment-pages";
|
|
55
60
|
import { creditRefusalRecord, type CreditRefusalRecord } from "../lib/model-access";
|
|
56
61
|
import { timelineShowsFailure } from "../lib/timeline-failure-owner";
|
|
@@ -257,11 +262,7 @@ import {
|
|
|
257
262
|
type ComposerLaunchSearch,
|
|
258
263
|
} from "../lib/composer-launch";
|
|
259
264
|
import { connectableSubscriptions, isDeploymentFreeModel } from "../lib/deployment-free-model";
|
|
260
|
-
import {
|
|
261
|
-
effortOptionsForModel,
|
|
262
|
-
findPickerRow,
|
|
263
|
-
runnableLatencyModesForModel,
|
|
264
|
-
} from "../lib/model-policy";
|
|
265
|
+
import { findPickerRow } from "../lib/model-policy";
|
|
265
266
|
import { sessionTimelineEmptyStateCopy } from "../lib/session-empty-state";
|
|
266
267
|
import {
|
|
267
268
|
isCodexUsageLimitFailure,
|
|
@@ -2936,7 +2937,14 @@ function SessionChatPane(props: {
|
|
|
2936
2937
|
personalAttachment.loading ||
|
|
2937
2938
|
personalAttachment.refreshing ||
|
|
2938
2939
|
connectionAccounts.loading,
|
|
2939
|
-
loadFailed:
|
|
2940
|
+
loadFailed:
|
|
2941
|
+
connectionAccounts.error === null
|
|
2942
|
+
? false
|
|
2943
|
+
: connectionAccounts.accessDenied
|
|
2944
|
+
? "denied"
|
|
2945
|
+
: connectionAccounts.unavailable
|
|
2946
|
+
? "updating"
|
|
2947
|
+
: "failed",
|
|
2940
2948
|
};
|
|
2941
2949
|
const composerSendBlocker = () => sendGate.blocker(sendState);
|
|
2942
2950
|
const workspaceAccountId = context.workspaces.find(
|
|
@@ -3166,12 +3174,7 @@ function SessionChatPane(props: {
|
|
|
3166
3174
|
composerPolicy.reasoningEffort === props.session.reasoningEffort &&
|
|
3167
3175
|
composerPolicy.latencyMode === props.session.latencyMode,
|
|
3168
3176
|
);
|
|
3169
|
-
const catalogComboValid =
|
|
3170
|
-
selectedPolicyRow?.selectable &&
|
|
3171
|
-
effortOptionsForModel(selectedPolicyRow.catalog).includes(reasoningEffort) &&
|
|
3172
|
-
(latencyMode === "standard" ||
|
|
3173
|
-
runnableLatencyModesForModel(selectedPolicyRow.catalog).includes(latencyMode)),
|
|
3174
|
-
);
|
|
3177
|
+
const catalogComboValid = pickerPolicyRunnable(selectedPolicyRow, reasoningEffort, latencyMode);
|
|
3175
3178
|
// A model the catalog no longer lists (retired or removed) is refused by the
|
|
3176
3179
|
// API, so the frozen session policy stops counting as sendable for it.
|
|
3177
3180
|
const refusedSessionModel =
|
|
@@ -3272,6 +3275,34 @@ function SessionChatPane(props: {
|
|
|
3272
3275
|
/>
|
|
3273
3276
|
) : null;
|
|
3274
3277
|
|
|
3278
|
+
// Send's blocker as one visible line, unless the composer is still
|
|
3279
|
+
// preparing or the unavailable-model notice or picker already explains it.
|
|
3280
|
+
const sendBlocker = composerSendBlocker();
|
|
3281
|
+
const visibleSendBlocker =
|
|
3282
|
+
terminal || composerDelivery.preparing
|
|
3283
|
+
? null
|
|
3284
|
+
: sendBlocker === "policy" && (unavailableModelNotice || noRunnableModel || !composerPolicy)
|
|
3285
|
+
? null
|
|
3286
|
+
: sendBlocker === "policy" && selectedPolicyRow?.selectable !== true
|
|
3287
|
+
? "model_unavailable"
|
|
3288
|
+
: sendBlocker;
|
|
3289
|
+
const sendBlockerNotice = composerSendBlockerNotice(visibleSendBlocker) ? (
|
|
3290
|
+
<ComposerSendBlockerNotice
|
|
3291
|
+
blocker={visibleSendBlocker}
|
|
3292
|
+
className="px-2 pt-2"
|
|
3293
|
+
// While the picker is locked (sending, draft loading) the fix can't
|
|
3294
|
+
// apply, so the line shows no action rather than one that does nothing.
|
|
3295
|
+
onAction={
|
|
3296
|
+
modelPickerDisabled && visibleSendBlocker === "policy"
|
|
3297
|
+
? undefined
|
|
3298
|
+
: (action) => {
|
|
3299
|
+
if (action === "fix_model_settings") chooseCoveredModel(model);
|
|
3300
|
+
else if (visibleSendBlocker === "accounts") void connectionAccounts.refresh();
|
|
3301
|
+
}
|
|
3302
|
+
}
|
|
3303
|
+
/>
|
|
3304
|
+
) : null;
|
|
3305
|
+
|
|
3275
3306
|
useEffect(() => {
|
|
3276
3307
|
if (
|
|
3277
3308
|
!launchKey ||
|
|
@@ -4491,6 +4522,7 @@ function SessionChatPane(props: {
|
|
|
4491
4522
|
modelSwitchHeadsUp ||
|
|
4492
4523
|
usageLimitNotice ||
|
|
4493
4524
|
creditRefusalNotice ||
|
|
4525
|
+
sendBlockerNotice ||
|
|
4494
4526
|
showMachineAccess ? (
|
|
4495
4527
|
<>
|
|
4496
4528
|
{!sessionAdmissionNeedsDifferentMachine(
|
|
@@ -4520,6 +4552,7 @@ function SessionChatPane(props: {
|
|
|
4520
4552
|
<div className="px-2 pt-2">{creditRefusalNotice}</div>
|
|
4521
4553
|
) : null}
|
|
4522
4554
|
{ownLoginsHeadsUp}
|
|
4555
|
+
{sendBlockerNotice}
|
|
4523
4556
|
</>
|
|
4524
4557
|
) : null
|
|
4525
4558
|
}
|
|
@@ -110,7 +110,26 @@ import { sessionDisplayTitle } from "../lib/session-rename";
|
|
|
110
110
|
import { Notice } from "../../ui/notice";
|
|
111
111
|
import { CreditRefusalNotice } from "../components/credits/credit-refusal-notice";
|
|
112
112
|
import { coveredModelChoice, creditRefusalGap, freeCreditGap } from "../lib/free-credit-gap";
|
|
113
|
-
import {
|
|
113
|
+
import {
|
|
114
|
+
pickerPolicyRunnable,
|
|
115
|
+
ComposerSendBlockerNotice,
|
|
116
|
+
composerSendBlockerIsLoading,
|
|
117
|
+
composerSendBlockerNotice,
|
|
118
|
+
getNewSessionSendBlocker,
|
|
119
|
+
NewSessionCreateFailureNotice,
|
|
120
|
+
newSessionCreateFailureRecord,
|
|
121
|
+
newSessionSendSignature,
|
|
122
|
+
newSessionStartBlockerReason,
|
|
123
|
+
visibleNewSessionCreateFailure,
|
|
124
|
+
type NewSessionCreateFailure,
|
|
125
|
+
type NewSessionSendState,
|
|
126
|
+
} from "../lib/composer-send-blocking";
|
|
127
|
+
import {
|
|
128
|
+
creditRefusalRecord,
|
|
129
|
+
isPaymentRequiredError,
|
|
130
|
+
type CreditRefusalRecord,
|
|
131
|
+
} from "../lib/model-access";
|
|
132
|
+
import { composerSubmissionErrorMessage } from "../../lib/format";
|
|
114
133
|
import { isTransientServiceFailure, OPENGENI_UPDATING_NOTICE } from "../lib/transient-retry";
|
|
115
134
|
import { useConnectionAccounts } from "../components/capabilities/use-connection-accounts";
|
|
116
135
|
import { StatusDot } from "../../ui/status-dot";
|
|
@@ -134,13 +153,7 @@ import {
|
|
|
134
153
|
isMachineComputeSelectable,
|
|
135
154
|
resolveSelectableMachineSandboxId,
|
|
136
155
|
} from "../lib/machine-selectability";
|
|
137
|
-
import {
|
|
138
|
-
effortOptionsForModel,
|
|
139
|
-
findPickerRow,
|
|
140
|
-
modelUsesCredits,
|
|
141
|
-
runnableLatencyModesForModel,
|
|
142
|
-
type PickerModelRow,
|
|
143
|
-
} from "../lib/model-policy";
|
|
156
|
+
import { findPickerRow, modelUsesCredits, type PickerModelRow } from "../lib/model-policy";
|
|
144
157
|
import { isPersonalWorkspace } from "../lib/managed-self-context";
|
|
145
158
|
import { attachManualRepository } from "../lib/manual-repositories";
|
|
146
159
|
import { hasAccountPermission, hasWorkspacePermission } from "../lib/permissions";
|
|
@@ -688,6 +701,7 @@ function SessionsIndexRouteContent({
|
|
|
688
701
|
const [createCreditRefusal, setCreateCreditRefusal] = useState<CreditRefusalRecord<{
|
|
689
702
|
workspaceId: string;
|
|
690
703
|
}> | null>(null);
|
|
704
|
+
const [createFailure, setCreateFailure] = useState<NewSessionCreateFailure | null>(null);
|
|
691
705
|
const [createdSessionAuthority, setCreatedSessionAuthority] =
|
|
692
706
|
useState<CreatedSessionRouteAuthority | null>(null);
|
|
693
707
|
const composerRegionRef = useRef<HTMLDivElement | null>(null);
|
|
@@ -1079,6 +1093,33 @@ function SessionsIndexRouteContent({
|
|
|
1079
1093
|
void modelCatalog.refresh();
|
|
1080
1094
|
return true;
|
|
1081
1095
|
};
|
|
1096
|
+
// What this Send carries; a refused start stays visible until it changes.
|
|
1097
|
+
const sendSignature = newSessionSendSignature({
|
|
1098
|
+
text: message,
|
|
1099
|
+
model: context.model,
|
|
1100
|
+
reasoningEffort: context.reasoningEffort,
|
|
1101
|
+
latencyMode: context.latencyMode,
|
|
1102
|
+
});
|
|
1103
|
+
const createFailureMessage = visibleNewSessionCreateFailure(createFailure, {
|
|
1104
|
+
workspaceId,
|
|
1105
|
+
signature: sendSignature,
|
|
1106
|
+
});
|
|
1107
|
+
const currentSendSignature = useLatestCallback(() => sendSignature);
|
|
1108
|
+
// Any other refused start is shown under the composer instead of a toast:
|
|
1109
|
+
// the chat was never created, so nothing else would say why.
|
|
1110
|
+
const noteCreateFailure = (error: Error, sentSignature: string): boolean => {
|
|
1111
|
+
// A payment refusal keeps its own dialog.
|
|
1112
|
+
if (isPaymentRequiredError(error)) return false;
|
|
1113
|
+
const failure = newSessionCreateFailureRecord({
|
|
1114
|
+
workspaceId,
|
|
1115
|
+
sent: sentSignature,
|
|
1116
|
+
current: currentSendSignature(),
|
|
1117
|
+
message: composerSubmissionErrorMessage(t, error),
|
|
1118
|
+
});
|
|
1119
|
+
if (!failure) return false;
|
|
1120
|
+
setCreateFailure(failure);
|
|
1121
|
+
return true;
|
|
1122
|
+
};
|
|
1082
1123
|
const chooseCoveredModel = (id: string) => {
|
|
1083
1124
|
const row = findPickerRow(modelCatalog.rows, id);
|
|
1084
1125
|
const choice = row
|
|
@@ -1090,11 +1131,10 @@ function SessionsIndexRouteContent({
|
|
|
1090
1131
|
context.setReasoningEffort(choice.effort);
|
|
1091
1132
|
if (choice.latencyMode !== null) context.setLatencyMode(choice.latencyMode);
|
|
1092
1133
|
};
|
|
1093
|
-
const newSessionPolicyValid =
|
|
1094
|
-
selectedPolicyRow
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
runnableLatencyModesForModel(selectedPolicyRow.catalog).includes(context.latencyMode)),
|
|
1134
|
+
const newSessionPolicyValid = pickerPolicyRunnable(
|
|
1135
|
+
selectedPolicyRow,
|
|
1136
|
+
context.reasoningEffort,
|
|
1137
|
+
context.latencyMode,
|
|
1098
1138
|
);
|
|
1099
1139
|
const noRunnableModel =
|
|
1100
1140
|
!modelCatalog.loading &&
|
|
@@ -1132,34 +1172,63 @@ function SessionsIndexRouteContent({
|
|
|
1132
1172
|
if (!next) return;
|
|
1133
1173
|
setModel(next.id);
|
|
1134
1174
|
setReasoningEffort(next.effort);
|
|
1175
|
+
// The replacement keeps the speed only where it runs it (a Free ChatGPT
|
|
1176
|
+
// plan's GPT-6 Luna has no Ultrafast), so the swap never leaves a choice
|
|
1177
|
+
// that cannot send.
|
|
1178
|
+
const row = findPickerRow(modelCatalog.rows, next.id);
|
|
1179
|
+
const fitted = row ? coveredModelChoice(row, next.effort, context.latencyMode) : null;
|
|
1180
|
+
if (fitted?.latencyMode) setLatencyMode(fitted.latencyMode);
|
|
1135
1181
|
// An automatic replacement is not the person's choice.
|
|
1136
1182
|
setModelProvided((current) => (current === undefined ? current : false));
|
|
1137
|
-
}, [
|
|
1183
|
+
}, [
|
|
1184
|
+
context.latencyMode,
|
|
1185
|
+
modelCatalog.rows,
|
|
1186
|
+
pendingFallbackModel,
|
|
1187
|
+
setLatencyMode,
|
|
1188
|
+
setModel,
|
|
1189
|
+
setReasoningEffort,
|
|
1190
|
+
]);
|
|
1138
1191
|
const codexConnected = modelCatalog.models.some(
|
|
1139
1192
|
(candidate) =>
|
|
1140
1193
|
candidate.provider === "codex-subscription" &&
|
|
1141
1194
|
candidate.credentialReadiness.status === "ready",
|
|
1142
1195
|
);
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1196
|
+
// Send's one guard: its enabled state, the early-Send hold, the guard Send
|
|
1197
|
+
// runs and the visible line below the composer all read it.
|
|
1198
|
+
const sendState: NewSessionSendState = {
|
|
1199
|
+
created: createdSessionAuthority !== null,
|
|
1200
|
+
draftLoading: newSessionDraft.loading,
|
|
1201
|
+
catalogLoading: modelCatalog.loading,
|
|
1202
|
+
catalogFailed: Boolean(modelCatalog.error),
|
|
1203
|
+
replacingModel: pendingFallbackModel !== null,
|
|
1204
|
+
policyValid: newSessionPolicyValid,
|
|
1205
|
+
anyModelSelectable: modelCatalog.rows.some((row) => row.selectable),
|
|
1206
|
+
selectedModelNotConnected: Boolean(
|
|
1207
|
+
selectedPolicyRow &&
|
|
1208
|
+
selectedPolicyRow.billingClass !== "opengeni_credits" &&
|
|
1209
|
+
selectedPolicyRow.catalog.credentialReadiness.status !== "ready",
|
|
1210
|
+
),
|
|
1211
|
+
selectedModelSelectable: selectedPolicyRow?.selectable === true,
|
|
1212
|
+
// Null capabilities only mean the request is still in flight.
|
|
1213
|
+
privateSessionLoading:
|
|
1214
|
+
tenancyCapabilities === null && (personalWorkspace || draft.visibility === "private"),
|
|
1215
|
+
privateSessionUnavailable: privateCreateUnavailable,
|
|
1216
|
+
toolsLoading: !context.workspaceMcpCatalogReady || personalResourceCatalogRefreshPending,
|
|
1217
|
+
accountsLoading: connectionAccounts.loading,
|
|
1218
|
+
accountsFailed: connectionAccounts.error !== null,
|
|
1219
|
+
accountChoice: connectionAccounts.requiresAccountChoice,
|
|
1220
|
+
resourcesLoading:
|
|
1221
|
+
fixedResourceCatalogEnabled && (rigs.loading || !personalResourceEligibilitySettled),
|
|
1222
|
+
resourcesResolved: fixedResourceSelection.selectionResolved,
|
|
1223
|
+
uploadPending: attachments.hasUnresolved,
|
|
1224
|
+
computeLoading: draft.compute.kind === "machine" && fleet.loading,
|
|
1225
|
+
computeReady,
|
|
1226
|
+
};
|
|
1227
|
+
const sendBlocker = getNewSessionSendBlocker(sendState);
|
|
1228
|
+
// Voice skips the connected-tool accounts; its control and URL launch read
|
|
1229
|
+
// the same guard so a voice start can't be dropped silently either.
|
|
1230
|
+
const voiceSendBlocker = getNewSessionSendBlocker({ ...sendState, voice: true });
|
|
1231
|
+
const startBlocker = newSessionStartBlockerReason(sendBlocker);
|
|
1163
1232
|
useEffect(() => {
|
|
1164
1233
|
const record = () => {
|
|
1165
1234
|
if (startBlocker)
|
|
@@ -1202,20 +1271,9 @@ function SessionsIndexRouteContent({
|
|
|
1202
1271
|
: attachments.readyResources.length > 0
|
|
1203
1272
|
? FILE_ONLY_MESSAGE_TEXT(t)
|
|
1204
1273
|
: "";
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
newSessionDraft.loading ||
|
|
1209
|
-
!newSessionPolicyValid ||
|
|
1210
|
-
privateCreateUnavailable ||
|
|
1211
|
-
personalResourceCatalogRefreshPending ||
|
|
1212
|
-
(!realtimeModel &&
|
|
1213
|
-
createdSessionAuthority === null &&
|
|
1214
|
-
(connectionAccounts.loading ||
|
|
1215
|
-
connectionAccounts.error !== null ||
|
|
1216
|
-
connectionAccounts.requiresAccountChoice)) ||
|
|
1217
|
-
(createdSessionAuthority === null && !fixedResourceSelection.selectionResolved)
|
|
1218
|
-
)
|
|
1274
|
+
// The same guard as Send's enabled state and the visible line, so a
|
|
1275
|
+
// Send that runs here was shown as available and a refusal is explained.
|
|
1276
|
+
if (busy || getNewSessionSendBlocker({ ...sendState, voice: realtimeModel !== null }))
|
|
1219
1277
|
return false;
|
|
1220
1278
|
if (createdSessionAuthority === null) {
|
|
1221
1279
|
const unavailable = unavailableSessionMcpServerIds(
|
|
@@ -1243,12 +1301,7 @@ function SessionsIndexRouteContent({
|
|
|
1243
1301
|
});
|
|
1244
1302
|
return false;
|
|
1245
1303
|
}
|
|
1246
|
-
if (
|
|
1247
|
-
createdSessionAuthority === null &&
|
|
1248
|
-
((!text && !realtimeModel) || attachments.hasUnresolved || !computeReady)
|
|
1249
|
-
) {
|
|
1250
|
-
return false;
|
|
1251
|
-
}
|
|
1304
|
+
if (createdSessionAuthority === null && !text && !realtimeModel) return false;
|
|
1252
1305
|
// A chosen limit must be a valid amount; an older server never gets one.
|
|
1253
1306
|
const usageLimit =
|
|
1254
1307
|
usageLimitCapability === "enabled" ? parseSessionUsageLimitDraft(usageLimitDraft) : null;
|
|
@@ -1263,6 +1316,13 @@ function SessionsIndexRouteContent({
|
|
|
1263
1316
|
const model = policy?.model ?? persistedValue.model;
|
|
1264
1317
|
const reasoningEffort = policy?.effort ?? persistedValue.reasoningEffort;
|
|
1265
1318
|
const latencyMode = policy?.latency ?? persistedValue.latencyMode;
|
|
1319
|
+
// What this request carries, so its refusal is matched to the composer.
|
|
1320
|
+
const sentSignature = newSessionSendSignature({
|
|
1321
|
+
text: persistedValue.text,
|
|
1322
|
+
model,
|
|
1323
|
+
reasoningEffort,
|
|
1324
|
+
latencyMode,
|
|
1325
|
+
});
|
|
1266
1326
|
// One Send always refers to one visible snapshot, even if a sibling edit
|
|
1267
1327
|
// forces a draft save or create retry while the user continues typing.
|
|
1268
1328
|
const visibleSignature = stableJson(persistedValue);
|
|
@@ -1347,7 +1407,8 @@ function SessionsIndexRouteContent({
|
|
|
1347
1407
|
return (
|
|
1348
1408
|
draftConflict ||
|
|
1349
1409
|
newSessionDraft.reportUnavailable(error) ||
|
|
1350
|
-
noteCreditRefusal(error, request)
|
|
1410
|
+
noteCreditRefusal(error, request) ||
|
|
1411
|
+
noteCreateFailure(error, sentSignature)
|
|
1351
1412
|
);
|
|
1352
1413
|
},
|
|
1353
1414
|
},
|
|
@@ -1359,6 +1420,7 @@ function SessionsIndexRouteContent({
|
|
|
1359
1420
|
}
|
|
1360
1421
|
setUsageLimitDraft(NO_SESSION_USAGE_LIMIT);
|
|
1361
1422
|
setCreateCreditRefusal(null);
|
|
1423
|
+
setCreateFailure(null);
|
|
1362
1424
|
setUsageLimitSendBlocked(false);
|
|
1363
1425
|
return {
|
|
1364
1426
|
sessionId: created.id,
|
|
@@ -1428,7 +1490,8 @@ function SessionsIndexRouteContent({
|
|
|
1428
1490
|
return (
|
|
1429
1491
|
draftConflict ||
|
|
1430
1492
|
newSessionDraft.reportUnavailable(error) ||
|
|
1431
|
-
noteCreditRefusal(error, request)
|
|
1493
|
+
noteCreditRefusal(error, request) ||
|
|
1494
|
+
noteCreateFailure(error, sentSignature)
|
|
1432
1495
|
);
|
|
1433
1496
|
},
|
|
1434
1497
|
},
|
|
@@ -1441,6 +1504,7 @@ function SessionsIndexRouteContent({
|
|
|
1441
1504
|
// The limit belongs to the chat just created; the next starts with none.
|
|
1442
1505
|
setUsageLimitDraft(NO_SESSION_USAGE_LIMIT);
|
|
1443
1506
|
setCreateCreditRefusal(null);
|
|
1507
|
+
setCreateFailure(null);
|
|
1444
1508
|
setUsageLimitSendBlocked(false);
|
|
1445
1509
|
return {
|
|
1446
1510
|
sessionId: created.id,
|
|
@@ -1662,15 +1726,7 @@ function SessionsIndexRouteContent({
|
|
|
1662
1726
|
});
|
|
1663
1727
|
return;
|
|
1664
1728
|
}
|
|
1665
|
-
if (
|
|
1666
|
-
busy ||
|
|
1667
|
-
!computeReady ||
|
|
1668
|
-
!newSessionPolicyValid ||
|
|
1669
|
-
!context.workspaceMcpCatalogReady ||
|
|
1670
|
-
attachments.hasUnresolved
|
|
1671
|
-
) {
|
|
1672
|
-
return;
|
|
1673
|
-
}
|
|
1729
|
+
if (busy || voiceSendBlocker !== null) return;
|
|
1674
1730
|
handledLaunchKeyRef.current = launchKey;
|
|
1675
1731
|
void submitNewSession(launchRealtime, {
|
|
1676
1732
|
model: launchModel,
|
|
@@ -1680,10 +1736,7 @@ function SessionsIndexRouteContent({
|
|
|
1680
1736
|
if (!ok) handledLaunchKeyRef.current = null;
|
|
1681
1737
|
});
|
|
1682
1738
|
}, [
|
|
1683
|
-
attachments.hasUnresolved,
|
|
1684
1739
|
busy,
|
|
1685
|
-
computeReady,
|
|
1686
|
-
context.workspaceMcpCatalogReady,
|
|
1687
1740
|
launchEffort,
|
|
1688
1741
|
launchFollowDefault,
|
|
1689
1742
|
launchLatency,
|
|
@@ -1695,11 +1748,11 @@ function SessionsIndexRouteContent({
|
|
|
1695
1748
|
launch.channelId,
|
|
1696
1749
|
navigate,
|
|
1697
1750
|
newSessionDraft.loading,
|
|
1698
|
-
newSessionPolicyValid,
|
|
1699
1751
|
setLatencyMode,
|
|
1700
1752
|
setModel,
|
|
1701
1753
|
setReasoningEffort,
|
|
1702
1754
|
submitNewSession,
|
|
1755
|
+
voiceSendBlocker,
|
|
1703
1756
|
workspaceId,
|
|
1704
1757
|
]);
|
|
1705
1758
|
|
|
@@ -1721,26 +1774,11 @@ function SessionsIndexRouteContent({
|
|
|
1721
1774
|
message.trim().length > 0 ||
|
|
1722
1775
|
attachments.readyResources.length > 0) &&
|
|
1723
1776
|
!busy &&
|
|
1724
|
-
|
|
1725
|
-
newSessionPolicyValid &&
|
|
1726
|
-
!personalResourceCatalogRefreshPending &&
|
|
1727
|
-
(createdSessionAuthority !== null ||
|
|
1728
|
-
(!connectionAccounts.loading &&
|
|
1729
|
-
connectionAccounts.error === null &&
|
|
1730
|
-
!connectionAccounts.requiresAccountChoice)) &&
|
|
1731
|
-
(createdSessionAuthority !== null || fixedResourceSelection.selectionResolved) &&
|
|
1732
|
-
(createdSessionAuthority !== null || (!attachments.hasUnresolved && computeReady)),
|
|
1777
|
+
sendBlocker === null,
|
|
1733
1778
|
// What Send needs right after the page opens is still loading: an early
|
|
1734
|
-
// Send waits for it instead of doing nothing.
|
|
1735
|
-
|
|
1736
|
-
|
|
1737
|
-
newSessionDraft.loading ||
|
|
1738
|
-
pendingFallbackModel !== null ||
|
|
1739
|
-
personalResourceCatalogRefreshPending ||
|
|
1740
|
-
(createdSessionAuthority === null &&
|
|
1741
|
-
(connectionAccounts.loading ||
|
|
1742
|
-
(fixedResourceCatalogEnabled && (rigs.loading || !personalResourceEligibilitySettled)) ||
|
|
1743
|
-
(draft.compute.kind === "machine" && fleet.loading))),
|
|
1779
|
+
// Send waits for it instead of doing nothing. Any other blocker shows its
|
|
1780
|
+
// line below the composer.
|
|
1781
|
+
preparing: composerSendBlockerIsLoading(sendBlocker),
|
|
1744
1782
|
pause: async () => {},
|
|
1745
1783
|
pausing: false,
|
|
1746
1784
|
resume: async () => {},
|
|
@@ -2166,27 +2204,22 @@ function SessionsIndexRouteContent({
|
|
|
2166
2204
|
: voiceSelection.loadState
|
|
2167
2205
|
}
|
|
2168
2206
|
modelMenu="split"
|
|
2169
|
-
disabled={
|
|
2170
|
-
busy ||
|
|
2171
|
-
newSessionDraft.loading ||
|
|
2172
|
-
attachments.hasUnresolved ||
|
|
2173
|
-
!newSessionPolicyValid ||
|
|
2174
|
-
!computeReady ||
|
|
2175
|
-
personalMachineSelected ||
|
|
2176
|
-
!context.workspaceMcpCatalogReady
|
|
2177
|
-
}
|
|
2207
|
+
disabled={busy || voiceSendBlocker !== null || personalMachineSelected}
|
|
2178
2208
|
disabledReason={
|
|
2179
|
-
|
|
2209
|
+
voiceSendBlocker === "upload"
|
|
2180
2210
|
? "Wait for attachments to finish before starting voice."
|
|
2181
|
-
:
|
|
2211
|
+
: voiceSendBlocker === "policy"
|
|
2182
2212
|
? "Choose supported model settings before starting voice."
|
|
2183
|
-
:
|
|
2213
|
+
: voiceSendBlocker === "compute"
|
|
2184
2214
|
? "Choose where this session should run first."
|
|
2185
|
-
:
|
|
2186
|
-
|
|
2187
|
-
|
|
2188
|
-
|
|
2189
|
-
|
|
2215
|
+
: voiceSendBlocker !== null &&
|
|
2216
|
+
composerSendBlockerIsLoading(voiceSendBlocker)
|
|
2217
|
+
? "Wait for the chat to finish loading."
|
|
2218
|
+
: voiceSendBlocker !== null
|
|
2219
|
+
? (composerSendBlockerNotice(voiceSendBlocker)?.message ?? null)
|
|
2220
|
+
: personalMachineSelected
|
|
2221
|
+
? "Start with a message so personal machine access can attach to an accepted turn."
|
|
2222
|
+
: null
|
|
2190
2223
|
}
|
|
2191
2224
|
onStart={async (model) => await submitNewSession(model)}
|
|
2192
2225
|
/>
|
|
@@ -2241,6 +2274,29 @@ function SessionsIndexRouteContent({
|
|
|
2241
2274
|
</div>
|
|
2242
2275
|
) : null}
|
|
2243
2276
|
|
|
2277
|
+
{/* A refused start, until the person changes what they send. */}
|
|
2278
|
+
<NewSessionCreateFailureNotice
|
|
2279
|
+
message={createFailureMessage}
|
|
2280
|
+
onDismiss={() => setCreateFailure(null)}
|
|
2281
|
+
className="mt-3"
|
|
2282
|
+
/>
|
|
2283
|
+
|
|
2284
|
+
{/* Send's blocker, when no other surface already explains it. */}
|
|
2285
|
+
<ComposerSendBlockerNotice
|
|
2286
|
+
blocker={sendBlocker}
|
|
2287
|
+
explained={
|
|
2288
|
+
fixedResourceCatalogError
|
|
2289
|
+
? [...NEW_SESSION_EXPLAINED_BLOCKERS, "resources"]
|
|
2290
|
+
: NEW_SESSION_EXPLAINED_BLOCKERS
|
|
2291
|
+
}
|
|
2292
|
+
className="mt-3"
|
|
2293
|
+
onAction={(action) => {
|
|
2294
|
+
if (action === "fix_model_settings") chooseCoveredModel(context.model);
|
|
2295
|
+
else if (sendBlocker === "model_catalog") void modelCatalog.refresh();
|
|
2296
|
+
else if (sendBlocker === "accounts") void connectionAccounts.refresh();
|
|
2297
|
+
}}
|
|
2298
|
+
/>
|
|
2299
|
+
|
|
2244
2300
|
{/* Accounts load quietly with the composer: only a problem shows here,
|
|
2245
2301
|
never a loading line behind an open menu. */}
|
|
2246
2302
|
{accountsFailure || connectionAccounts.accountChoiceMessage ? (
|
|
@@ -2501,6 +2557,9 @@ function RecentSessionRow({
|
|
|
2501
2557
|
);
|
|
2502
2558
|
}
|
|
2503
2559
|
|
|
2560
|
+
/** The accounts notice below the new-chat composer explains these itself. */
|
|
2561
|
+
const NEW_SESSION_EXPLAINED_BLOCKERS = ["accounts", "account_choice"] as const;
|
|
2562
|
+
|
|
2504
2563
|
/** Keep model policy adjacent to voice/send in the bottom action row. */
|
|
2505
2564
|
function SessionModelControl({
|
|
2506
2565
|
hasImageAttachments,
|
|
@@ -1007,6 +1007,12 @@ test("Edit with Opengeni on a Site already open starts a new conversation once",
|
|
|
1007
1007
|
|
|
1008
1008
|
const publicationSlot = (container: HTMLElement) =>
|
|
1009
1009
|
container.querySelector<HTMLElement>("[data-live-status-slot]")!;
|
|
1010
|
+
/** The publication control's own text, without the Site's "…" menu beside it. */
|
|
1011
|
+
const publicationText = (container: HTMLElement) => {
|
|
1012
|
+
const slot = publicationSlot(container).cloneNode(true) as HTMLElement;
|
|
1013
|
+
for (const menu of slot.querySelectorAll("[data-site-actions-root]")) menu.remove();
|
|
1014
|
+
return slot.textContent;
|
|
1015
|
+
};
|
|
1010
1016
|
const siteHidden = (container: HTMLElement) =>
|
|
1011
1017
|
container.querySelector("[data-site-view]")!.parentElement!.classList.contains("hidden");
|
|
1012
1018
|
|
|
@@ -1015,7 +1021,7 @@ test("an unpublished Site offers Publish, which opens its publish form beside th
|
|
|
1015
1021
|
permissions = ["sessions:create", "artifacts:publish"];
|
|
1016
1022
|
publicationLink = notPublished;
|
|
1017
1023
|
const { container } = await render();
|
|
1018
|
-
expect(
|
|
1024
|
+
expect(publicationText(container)).toBe("Publish");
|
|
1019
1025
|
expect(container.querySelector("[data-publish-page]")).toBeNull();
|
|
1020
1026
|
|
|
1021
1027
|
await act(async () => button(container, "Publish")!.click());
|
|
@@ -1048,8 +1054,8 @@ test("an unpublished Site offers Publish, which opens its publish form beside th
|
|
|
1048
1054
|
expect(container.querySelector("[data-publish-page]")).toBeNull();
|
|
1049
1055
|
expect(siteHidden(container)).toBe(false);
|
|
1050
1056
|
expect(publications).toHaveLength(1);
|
|
1051
|
-
expect(
|
|
1052
|
-
expect(
|
|
1057
|
+
expect(publicationText(container)).toContain("Published");
|
|
1058
|
+
expect(publicationText(container)).toContain("usage-4k9x.sites.example");
|
|
1053
1059
|
// Focus goes back to the control that opened the form.
|
|
1054
1060
|
expect(document.activeElement?.getAttribute("data-site-publication")).toBe("published");
|
|
1055
1061
|
});
|
|
@@ -1117,12 +1123,12 @@ test("people who can't publish see Published and its address, with no Publish or
|
|
|
1117
1123
|
conversations = [];
|
|
1118
1124
|
publicationLink = async () => published;
|
|
1119
1125
|
const { container } = await render();
|
|
1120
|
-
expect(
|
|
1126
|
+
expect(publicationText(container)).toContain("Published");
|
|
1121
1127
|
expect(button(container, "Publishing settings")).toBeUndefined();
|
|
1122
1128
|
act(() => root?.unmount());
|
|
1123
1129
|
publicationLink = notPublished;
|
|
1124
1130
|
const next = await render();
|
|
1125
|
-
expect(
|
|
1131
|
+
expect(publicationText(next.container)).toBe("");
|
|
1126
1132
|
expect(managementArgs).toHaveLength(0);
|
|
1127
1133
|
});
|
|
1128
1134
|
|
|
@@ -1132,7 +1138,7 @@ test("the header never says Live, also where publishing isn't available", async
|
|
|
1132
1138
|
const { container } = await render();
|
|
1133
1139
|
// A replacement is always given, so the frame's plain "Live" never shows.
|
|
1134
1140
|
expect(siteViewProps.at(-1)!.liveStatus).toBeDefined();
|
|
1135
|
-
expect(
|
|
1141
|
+
expect(publicationText(container)).toBe("");
|
|
1136
1142
|
});
|
|
1137
1143
|
|
|
1138
1144
|
const menuItem = (container: HTMLElement, text: string) =>
|
|
@@ -1272,3 +1278,65 @@ test("with the chat hidden, or no chat to take files, the Site keeps its drops",
|
|
|
1272
1278
|
await act(async () => void fireFileDrag(document.body, "dragenter", [shot]));
|
|
1273
1279
|
expect(cover(empty.container)).toBeNull();
|
|
1274
1280
|
});
|
|
1281
|
+
|
|
1282
|
+
const siteActions = (container: HTMLElement) =>
|
|
1283
|
+
[
|
|
1284
|
+
...container.querySelectorAll<HTMLElement>(
|
|
1285
|
+
"[data-site-actions-root] [role='menuitem'], [data-site-actions-root] a",
|
|
1286
|
+
),
|
|
1287
|
+
].map((item) => item.textContent);
|
|
1288
|
+
|
|
1289
|
+
test("the Site's own menu copies its title, duplicates it and opens its details", async () => {
|
|
1290
|
+
permissions = ["sessions:create", "artifacts:publish"];
|
|
1291
|
+
conversations = [conversation(1, "Time filters across all graphs", 2)];
|
|
1292
|
+
const { container } = await render();
|
|
1293
|
+
expect(container.querySelector("[data-site-actions-menu]")?.getAttribute("aria-label")).toBe(
|
|
1294
|
+
"More Site actions",
|
|
1295
|
+
);
|
|
1296
|
+
// Without a sidebar listing the Site, its Pin and Archive have nowhere to act.
|
|
1297
|
+
expect(siteActions(container)).toEqual(["Copy title", "Duplicate", "Site details"]);
|
|
1298
|
+
// The chat's menu keeps to the chat.
|
|
1299
|
+
const chatMenu = [...container.querySelectorAll("[role='menu']")].filter(
|
|
1300
|
+
(menu) => !menu.closest("[data-site-actions-root]"),
|
|
1301
|
+
);
|
|
1302
|
+
for (const menu of chatMenu) expect(menu.textContent).not.toContain("Site details");
|
|
1303
|
+
});
|
|
1304
|
+
|
|
1305
|
+
test("people who can't publish get no Duplicate in the Site's menu", async () => {
|
|
1306
|
+
permissions = ["sessions:create"];
|
|
1307
|
+
const { container } = await render();
|
|
1308
|
+
expect(siteActions(container)).toEqual(["Copy title", "Site details"]);
|
|
1309
|
+
});
|
|
1310
|
+
|
|
1311
|
+
test("the Site's menu pins and archives through the sidebar's own actions", async () => {
|
|
1312
|
+
const { publishSiteSidebarBridge } = await import("../lib/site-sidebar-bridge");
|
|
1313
|
+
const pins: [string, boolean][] = [];
|
|
1314
|
+
const archived: string[] = [];
|
|
1315
|
+
const withdraw = publishSiteSidebarBridge({
|
|
1316
|
+
workspaceId,
|
|
1317
|
+
pinnedSiteIds: new Set([siteId]),
|
|
1318
|
+
pin: (origin, pinned) => void pins.push([origin.siteId, pinned]),
|
|
1319
|
+
archive: (origin) => void archived.push(origin.siteId),
|
|
1320
|
+
});
|
|
1321
|
+
try {
|
|
1322
|
+
const { container } = await render();
|
|
1323
|
+
expect(siteActions(container)).toEqual(["Copy title", "Unpin", "Site details", "Archive"]);
|
|
1324
|
+
await act(async () => button(container, "Unpin")!.click());
|
|
1325
|
+
await act(async () => button(container, "Archive")!.click());
|
|
1326
|
+
expect(pins).toEqual([[siteId, false]]);
|
|
1327
|
+
expect(archived).toEqual([siteId]);
|
|
1328
|
+
} finally {
|
|
1329
|
+
act(() => withdraw());
|
|
1330
|
+
}
|
|
1331
|
+
});
|
|
1332
|
+
|
|
1333
|
+
test("a Site with nothing published yet offers no Duplicate", async () => {
|
|
1334
|
+
permissions = ["sessions:create", "artifacts:publish"];
|
|
1335
|
+
siteDetails = async () => ({
|
|
1336
|
+
artifact: { title: "Opengeni usage", status: "active", currentVersion: null },
|
|
1337
|
+
versions: [],
|
|
1338
|
+
events: [],
|
|
1339
|
+
});
|
|
1340
|
+
const { container } = await render();
|
|
1341
|
+
expect(siteActions(container)).toEqual(["Copy title", "Site details"]);
|
|
1342
|
+
});
|