@opengeni/react 6.5.2-canary.41607687019001 → 6.7.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.d.ts +4 -0
- package/dist/app/app-state.js +19 -14
- package/dist/app/components/Composer.js +25 -23
- package/dist/app/components/agent/agent-capability-picker.js +10 -8
- package/dist/app/components/artifacts/artifact-browse-controls.js +4 -4
- package/dist/app/components/artifacts/artifact-library.js +21 -19
- package/dist/app/components/artifacts/artifact-page-chrome.js +3 -3
- package/dist/app/components/artifacts/artifact-viewer.js +23 -22
- package/dist/app/components/artifacts/artifact-viewer.js.map +1 -1
- package/dist/app/components/artifacts/chat-interactive-block.js +12 -12
- package/dist/app/components/artifacts/copy-artifact-link.js +7 -5
- package/dist/app/components/artifacts/file-reach-dialog.js +11 -9
- package/dist/app/components/artifacts/inline-chat-image.js +18 -18
- package/dist/app/components/artifacts/retained-file-preview.js +24 -23
- package/dist/app/components/artifacts/retained-text-preview.js +3 -3
- package/dist/app/components/artifacts/site-audience.js +6 -5
- package/dist/app/components/artifacts/site-conversations.js +16 -14
- package/dist/app/components/artifacts/site-data.js +18 -16
- package/dist/app/components/artifacts/site-public-link.js +3 -2
- package/dist/app/components/artifacts/site-publishing-page.js +39 -37
- package/dist/app/components/artifacts/site-publishing.js +34 -32
- package/dist/app/components/artifacts/site-settings.js +38 -36
- package/dist/app/components/artifacts/site-version-menu.js +8 -7
- package/dist/app/components/billing-class-mark.js +3 -3
- package/dist/app/components/bots/bot-launch-strip.js +17 -17
- package/dist/app/components/bots/bot-template-dialog.js +30 -28
- package/dist/app/components/bots/bot-template-shortcuts.js +19 -19
- package/dist/app/components/bots/bot-templates-page.js +38 -36
- package/dist/app/components/bots/bot-templates-page.js.map +1 -1
- package/dist/app/components/capabilities/capability-detail-sheet.js +13 -11
- package/dist/app/components/capabilities/capability-logo-source.js +13 -13
- package/dist/app/components/capabilities/capability-logo.js +4 -3
- package/dist/app/components/capabilities/connector-tool-permissions.js +8 -6
- package/dist/app/components/capabilities/native-connect-setup.js +14 -14
- package/dist/app/components/capabilities/own-logins-shared-heads-up.js +7 -6
- package/dist/app/components/capabilities/perform-capability-action.js +7 -6
- package/dist/app/components/capabilities/prepared-mcp-setup-card.js +17 -17
- package/dist/app/components/capabilities/session-capability-card.js +72 -70
- package/dist/app/components/capabilities/session-capability-card.js.map +1 -1
- package/dist/app/components/capabilities/session-chrome-card.js +28 -26
- package/dist/app/components/capabilities/session-connection-accounts.js +4 -3
- package/dist/app/components/capabilities/session-custom-mcp-card.js +20 -19
- package/dist/app/components/capabilities/session-github-card.js +22 -20
- package/dist/app/components/capabilities/session-machine-card.js +27 -25
- package/dist/app/components/capabilities/session-personal-github-card.js +16 -16
- package/dist/app/components/capabilities/session-plugin-card.js +10 -9
- package/dist/app/components/capabilities/use-capabilities-catalog.js +4 -3
- package/dist/app/components/capabilities/use-connection-accounts.js +5 -4
- package/dist/app/components/command-menu/chat-status.js +15 -13
- package/dist/app/components/command-menu/chat-switcher.js +35 -33
- package/dist/app/components/command-menu/chat-switcher.js.map +1 -1
- package/dist/app/components/command-menu/command-menu.js +53 -50
- package/dist/app/components/command-menu/command-menu.js.map +1 -1
- package/dist/app/components/command-menu/shortcut-sheet.js +18 -16
- package/dist/app/components/command-menu/shortcut-sheet.js.map +1 -1
- package/dist/app/components/common.js +4 -3
- package/dist/app/components/composer-capabilities-menu-body.js +4 -4
- package/dist/app/components/composer-mobile-plus-panel.js +8 -8
- package/dist/app/components/composer-mobile-plus.js +1 -1
- package/dist/app/components/credit-required-gate.js +3 -3
- package/dist/app/components/credit-required-prompt.js +10 -8
- package/dist/app/components/credit-required-prompt.js.map +1 -1
- package/dist/app/components/credits/checkout-credits-celebration.js +3 -2
- package/dist/app/components/credits/checkout-return.js +3 -2
- package/dist/app/components/credits/checkout-return.js.map +1 -1
- package/dist/app/components/credits/coupon-redeem.js +5 -4
- package/dist/app/components/credits/credit-refusal-notice.js +7 -5
- package/dist/app/components/cross-slot-deep-link-recovery.js +5 -4
- package/dist/app/components/desktop/app-shots.js +13 -11
- package/dist/app/components/desktop/computer-use.js +6 -4
- package/dist/app/components/desktop/this-computer.js +9 -7
- package/dist/app/components/feedback.js +5 -4
- package/dist/app/components/follow-up-repository-menu-body.js +8 -6
- package/dist/app/components/follow-up-repository-menu-body.js.map +1 -1
- package/dist/app/components/follow-up-repository-picker.js +1 -1
- package/dist/app/components/github-app-connect-launcher.js +5 -4
- package/dist/app/components/in-app-help-link.js +3 -3
- package/dist/app/components/knowledge/agent-learning-settings.js +3 -2
- package/dist/app/components/knowledge/agent-learning-settings.js.map +1 -1
- package/dist/app/components/machines/connect-machine-dialog.js +18 -16
- package/dist/app/components/manual-repository-editor.js +3 -2
- package/dist/app/components/markdown.js +6 -6
- package/dist/app/components/models/models-ui.js +12 -10
- package/dist/app/components/my-things.js +12 -10
- package/dist/app/components/my-things.js.map +1 -1
- package/dist/app/components/new-session-starters.js +3 -3
- package/dist/app/components/own-where-it-works.js +9 -7
- 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 +7 -5
- package/dist/app/components/rail/project-glyph.js +17 -17
- package/dist/app/components/rail/project-profile.js +31 -29
- package/dist/app/components/rail/rail-context.js +3 -3
- package/dist/app/components/rail/rail-sections.js +68 -66
- package/dist/app/components/rail/session-header.js +59 -57
- package/dist/app/components/rail/session-list.js +66 -64
- package/dist/app/components/rail/session-row-content.js +4 -4
- package/dist/app/components/rail/session-row-hover-details.js +14 -12
- package/dist/app/components/rail/session-shell.js +90 -88
- package/dist/app/components/rail/site-session-group-heading.js +8 -8
- package/dist/app/components/repository-picker.js +8 -6
- package/dist/app/components/secrets/session-secrets-panel.js +4 -3
- package/dist/app/components/secrets/vault-model.js +3 -2
- package/dist/app/components/session/agent-configuration-panel.js +25 -23
- package/dist/app/components/session/agent-configuration-panel.js.map +1 -1
- package/dist/app/components/session/artifact-link-boundary.js +3 -3
- package/dist/app/components/session/artifact-session-page.js +11 -9
- package/dist/app/components/session/banners.js +8 -8
- package/dist/app/components/session/codex-usage-notice.js +5 -3
- package/dist/app/components/session/console-new-conversation.js +42 -40
- package/dist/app/components/session/context-text-reader.js +3 -2
- package/dist/app/components/session/descendant-requests.js +39 -37
- package/dist/app/components/session/descendant-requests.js.map +1 -1
- package/dist/app/components/session/editable-artifacts-workspace.js +36 -34
- package/dist/app/components/session/editable-artifacts-workspace.js.map +1 -1
- package/dist/app/components/session/failed-session-banner.js +13 -11
- package/dist/app/components/session/failed-session-banner.js.map +1 -1
- package/dist/app/components/session/failure-recovery-boundary.js +3 -3
- package/dist/app/components/session/human-input-delegation-record.js +2 -2
- package/dist/app/components/session/human-input.js +33 -31
- package/dist/app/components/session/inspector.js +57 -55
- package/dist/app/components/session/inspector.js.map +1 -1
- package/dist/app/components/session/message-actions.js +5 -4
- package/dist/app/components/session/message-actions.js.map +1 -1
- package/dist/app/components/session/message-resource-attachments.js +12 -11
- package/dist/app/components/session/message-resource-attachments.js.map +1 -1
- package/dist/app/components/session/model-context-inspector.js +6 -4
- package/dist/app/components/session/model-recovery-notice.js +3 -3
- package/dist/app/components/session/new-session-settings-menu.js +11 -9
- package/dist/app/components/session/new-session-setup-strip.js +18 -18
- package/dist/app/components/session/sandbox-recovery-actions.js +3 -3
- package/dist/app/components/session/sandbox-switcher.js +10 -9
- package/dist/app/components/session/sandbox-workspace.js +47 -46
- package/dist/app/components/session/search-markdown-highlight.js +7 -7
- package/dist/app/components/session/search-results-view.js +8 -8
- package/dist/app/components/session/session-admin-access.js +13 -11
- package/dist/app/components/session/session-admission-notice.js +7 -5
- package/dist/app/components/session/session-avatar-picker.js +22 -20
- package/dist/app/components/session/session-avatar.js +16 -16
- package/dist/app/components/session/session-machine-access-notice.js +7 -5
- package/dist/app/components/session/session-profile-dialog.js +29 -27
- package/dist/app/components/session/session-profile-editor.js +30 -28
- package/dist/app/components/session/session-retention.js +10 -8
- package/dist/app/components/session/session-search-dialog.js +10 -10
- package/dist/app/components/session/session-skill-reviews.js +2 -1
- package/dist/app/components/session/session-skill-reviews.js.map +1 -1
- package/dist/app/components/session/session-tenancy-control.js +13 -11
- package/dist/app/components/session/session-tenancy-control.js.map +1 -1
- package/dist/app/components/session/session-unattended-setting.js +7 -5
- package/dist/app/components/session/session-usage-limit-section.js +11 -9
- package/dist/app/components/session/share-chat-dialog.js +9 -7
- package/dist/app/components/session/site-origin-link.js +3 -3
- package/dist/app/components/session/subagents.js +8 -8
- package/dist/app/components/session/subscription-account-indicator.js +6 -6
- package/dist/app/components/session-connectors-menu-body.js +4 -3
- package/dist/app/components/session-connectors-menu-body.js.map +1 -1
- package/dist/app/components/settings/row-select.js +7 -5
- package/dist/app/components/toaster.js +3 -2
- package/dist/app/components/transcription-settings.js +11 -9
- package/dist/app/components/ui/destructive-confirm.js +11 -9
- package/dist/app/components/usage/usage-entry.js +5 -5
- package/dist/app/components/window-bar.js +16 -14
- package/dist/app/components/workspace-composer-plus.js +22 -21
- package/dist/app/components/workspace-reach.js +6 -4
- package/dist/app/components/workspace-tenant-boundary.js +5 -4
- package/dist/app/embed/memory-navigation.js +3 -3
- package/dist/app/embed/session-app.js +211 -209
- package/dist/app/lib/actions/actions-provider.js +15 -13
- package/dist/app/lib/agent-capabilities.js +3 -3
- package/dist/app/lib/app-surfaces.js +7 -6
- package/dist/app/lib/archive-session.d.ts +9 -4
- package/dist/app/lib/archive-session.js +4 -2
- package/dist/app/lib/bot-templates.js +3 -2
- package/dist/app/lib/capabilities.js +3 -2
- package/dist/app/lib/codex-usage-query.js +2 -2
- package/dist/app/lib/composer-connectors.js +17 -16
- package/dist/app/lib/console-site.js +2 -2
- package/dist/app/lib/console-text.js +2 -2
- package/dist/app/lib/events.js +9 -9
- package/dist/app/lib/failed-session-copy.js +3 -3
- package/dist/app/lib/inbox.js +4 -2
- package/dist/app/lib/model-access-onboarding.js +3 -3
- package/dist/app/lib/move-chat-to-machine.js +3 -3
- package/dist/app/lib/navigation.js +2 -2
- package/dist/app/lib/session-branch-cache.js +6 -6
- package/dist/app/lib/session-create.js +4 -4
- package/dist/app/lib/session-group-pagination.js +6 -6
- package/dist/app/lib/session-hover-facts.js +13 -11
- package/dist/app/lib/session-model.js +2 -2
- package/dist/app/lib/session-rail.js +3 -3
- package/dist/app/lib/session-rename.js +3 -3
- package/dist/app/lib/session-restart-operation-controller.js +4 -3
- package/dist/app/lib/session-tenancy.js +3 -2
- package/dist/app/lib/session-usage-limit.js +3 -2
- package/dist/app/lib/sessions-group.js +5 -5
- package/dist/app/lib/site-publishing.js +3 -2
- package/dist/app/lib/site-tool-consent-dialog.js +9 -7
- 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/subscription-plans.js +3 -2
- package/dist/app/lib/toast.js +2 -1
- package/dist/app/lib/turn-failure-analytics.js +4 -4
- package/dist/app/lib/use-duplicate-site.js +6 -5
- package/dist/app/lib/use-follow-up-repositories.js +6 -5
- package/dist/app/lib/use-workspace-integrations.js +4 -3
- package/dist/app/lib/use-workspace-machines.js +4 -4
- package/dist/app/lib/use-workspace-model-catalog.js +5 -4
- 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 +67 -66
- package/dist/app/routes/artifacts.js.map +1 -1
- package/dist/app/routes/retained-artifact.js +42 -40
- package/dist/app/routes/retained-artifact.js.map +1 -1
- package/dist/app/routes/session-unavailable.js +8 -7
- package/dist/app/routes/session.js +119 -117
- package/dist/app/routes/sessions-index-hydration.js +5 -5
- package/dist/app/routes/sessions-index.js +104 -102
- package/dist/app/routes/site-view.js +67 -65
- 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 +10 -10
- package/dist/automations.js +17 -15
- package/dist/automations.js.map +1 -1
- package/dist/browser-viewer-TC27OCIP.js +23 -0
- package/dist/chat-interactive-block-RWPQBHVS.js +18 -0
- package/dist/chunk-2BDT3UZQ.js +229 -0
- package/dist/chunk-2CLNIEK4.js +373 -0
- package/dist/chunk-2FSBSCZJ.js +451 -0
- package/dist/chunk-2I7HDP53.js +199 -0
- package/dist/chunk-2INLDVK3.js +15 -0
- package/dist/chunk-2KALVELR.js +126 -0
- package/dist/chunk-2M3J7ZWQ.js +418 -0
- package/dist/chunk-2OP6WLGV.js +708 -0
- package/dist/chunk-2RG7NIAS.js +2936 -0
- package/dist/chunk-2STUPWEL.js +135 -0
- package/dist/chunk-2YUOVM3G.js +271 -0
- package/dist/chunk-2Z3NQNTM.js +3670 -0
- package/dist/chunk-3CPWWGNK.js +920 -0
- package/dist/chunk-3ED2U6XE.js +37 -0
- package/dist/chunk-3GZA4BUW.js +216 -0
- package/dist/chunk-3IK6UYO6.js +1022 -0
- package/dist/chunk-3PZ7JZI2.js +431 -0
- package/dist/chunk-4DVJ6ONS.js +50 -0
- package/dist/chunk-4DVNUCRR.js +2386 -0
- package/dist/chunk-4DVNUCRR.js.map +1 -0
- package/dist/chunk-4E3ZJRTZ.js +41 -0
- package/dist/chunk-4SAWSRAA.js +141 -0
- package/dist/chunk-53AGXXZM.js +307 -0
- package/dist/chunk-54YW6SZZ.js +818 -0
- package/dist/chunk-57AZS3IE.js +2317 -0
- package/dist/chunk-5CPEEAFD.js +143 -0
- package/dist/chunk-5EWSRZ2Y.js +340 -0
- package/dist/chunk-5IE76VCY.js +387 -0
- package/dist/chunk-5NWEKLDZ.js +170 -0
- package/dist/chunk-5O2FCCHZ.js +198 -0
- package/dist/chunk-5QAY6K77.js +399 -0
- package/dist/chunk-5YKW2K6I.js +625 -0
- package/dist/chunk-5YKW2K6I.js.map +1 -0
- package/dist/chunk-6BCXNDEI.js +4116 -0
- package/dist/chunk-6BCXNDEI.js.map +1 -0
- package/dist/chunk-6DK6Z4UN.js +2599 -0
- package/dist/chunk-6DVCC7QS.js +702 -0
- package/dist/chunk-6JHU2UBS.js +2058 -0
- package/dist/chunk-6PZ7OBYU.js +490 -0
- package/dist/chunk-6WD2INST.js +539 -0
- package/dist/chunk-6WD2INST.js.map +1 -0
- package/dist/chunk-6WGRDRMA.js +163 -0
- package/dist/chunk-77WAKEAH.js +186 -0
- package/dist/chunk-7T2ZE3VT.js +5558 -0
- package/dist/chunk-7T2ZE3VT.js.map +1 -0
- package/dist/chunk-7TDO3CUM.js +393 -0
- package/dist/chunk-7TIX2UAR.js +247 -0
- package/dist/chunk-7V5REBCP.js +148 -0
- package/dist/chunk-7VMZGLYI.js +339 -0
- package/dist/chunk-7W37NS3I.js +236 -0
- package/dist/chunk-7X6SDK2C.js +111 -0
- package/dist/chunk-7ZNUHRP5.js +95 -0
- package/dist/chunk-A36PZALD.js +84 -0
- package/dist/chunk-AUI6VA63.js +107 -0
- package/dist/chunk-AW2MQB37.js +24 -0
- package/dist/chunk-AWKES45Y.js +198 -0
- package/dist/chunk-AXHZYXUV.js +132 -0
- package/dist/chunk-BHNSJVBC.js +129 -0
- package/dist/chunk-BJEJFISW.js +50 -0
- package/dist/chunk-BJFH6JI5.js +422 -0
- package/dist/chunk-BMICEQZQ.js +960 -0
- package/dist/chunk-BTLBYBLU.js +29 -0
- package/dist/chunk-BXBDYNRP.js +89 -0
- package/dist/chunk-C372BFOV.js +357 -0
- package/dist/chunk-C43KRXGA.js +234 -0
- package/dist/chunk-C43KRXGA.js.map +1 -0
- package/dist/chunk-CMKGILJK.js +4824 -0
- package/dist/chunk-CRAOSVHC.js +50 -0
- package/dist/chunk-CRU35QQH.js +281 -0
- package/dist/chunk-CUIWCGMA.js +172 -0
- package/dist/chunk-D5TWNFFE.js +38 -0
- package/dist/chunk-DF5EAHDN.js +4461 -0
- package/dist/chunk-DJAXC5OK.js +56 -0
- package/dist/chunk-DXBYWSL5.js +3550 -0
- package/dist/chunk-DXR5PDFP.js +84 -0
- package/dist/chunk-DZWARC4M.js +267 -0
- package/dist/chunk-DZXEDSQI.js +106 -0
- package/dist/chunk-E7XERZWC.js +48 -0
- package/dist/chunk-ECJBYNLJ.js +79 -0
- package/dist/chunk-EDI6SJ2N.js +43 -0
- package/dist/chunk-EWSOC6WF.js +114 -0
- package/dist/chunk-F2OPHAUN.js +103 -0
- package/dist/chunk-F4ISQGGM.js +81 -0
- package/dist/chunk-FO4LYKJL.js +197 -0
- package/dist/chunk-FPXASDG5.js +73 -0
- package/dist/chunk-FSOQDUCG.js +117 -0
- package/dist/chunk-FSOQDUCG.js.map +1 -0
- package/dist/chunk-FVXBNBHO.js +157 -0
- package/dist/chunk-FYWT2O76.js +34 -0
- package/dist/chunk-FYWT2O76.js.map +1 -0
- package/dist/chunk-FZC5N55X.js +981 -0
- package/dist/chunk-GAVYGBFI.js +99 -0
- package/dist/chunk-GFIMOUDT.js +846 -0
- package/dist/chunk-GFIMOUDT.js.map +1 -0
- package/dist/chunk-GKVJIDHF.js +33 -0
- package/dist/chunk-GVN5SZLX.js +212 -0
- package/dist/chunk-H3T7IWNA.js +134 -0
- package/dist/chunk-HAX4LCR5.js +261 -0
- package/dist/chunk-HC4JFZVU.js +121 -0
- package/dist/chunk-HEFPPMBQ.js +581 -0
- package/dist/chunk-HGKTHF2U.js +1356 -0
- package/dist/chunk-HGKTHF2U.js.map +1 -0
- package/dist/chunk-HNLR7Q4Z.js +83 -0
- package/dist/chunk-HSOXMJOT.js +12 -0
- package/dist/chunk-I4MRDSUF.js +281 -0
- package/dist/chunk-I4QEJ62Y.js +202 -0
- package/dist/chunk-I5B5L6Q4.js +56 -0
- package/dist/chunk-I5QZJODL.js +264 -0
- package/dist/chunk-I7ITSXSJ.js +603 -0
- package/dist/chunk-I7XIZRFD.js +390 -0
- package/dist/chunk-IDANQPRH.js +82 -0
- package/dist/chunk-IFB3WJ36.js +212 -0
- package/dist/chunk-IHTAKKTK.js +264 -0
- package/dist/chunk-IKXNLWAL.js +205 -0
- package/dist/chunk-IKXNLWAL.js.map +1 -0
- package/dist/chunk-ILDXWY37.js +173 -0
- package/dist/chunk-IMDQUHBJ.js +570 -0
- package/dist/chunk-IMZCQBOT.js +119 -0
- package/dist/chunk-IXPTECSC.js +403 -0
- package/dist/chunk-J255A3N5.js +71 -0
- package/dist/chunk-J5F5HPPW.js +141 -0
- package/dist/chunk-JDTGRRNU.js +5045 -0
- package/dist/chunk-JDTGRRNU.js.map +1 -0
- package/dist/chunk-JEA3QDX7.js +2469 -0
- package/dist/chunk-JEUPAVYY.js +156 -0
- package/dist/chunk-JKHKLL5W.js +194 -0
- package/dist/chunk-JQL7ZH6C.js +650 -0
- package/dist/chunk-JWB44UGJ.js +57 -0
- package/dist/chunk-JZ4NLCAP.js +333 -0
- package/dist/chunk-K2A5PXQ5.js +412 -0
- package/dist/chunk-K56XV3C3.js +623 -0
- package/dist/chunk-K6GAXXVA.js +23 -0
- package/dist/chunk-KCBMFSMS.js +199 -0
- package/dist/chunk-KF2FV3ZJ.js +268 -0
- package/dist/chunk-KJD65EJP.js +278 -0
- package/dist/chunk-KLEUWIMZ.js +386 -0
- package/dist/chunk-KODELWYT.js +309 -0
- package/dist/chunk-KRDR5RJD.js +83 -0
- package/dist/chunk-KUDGXAF7.js +914 -0
- package/dist/chunk-KY2R73CG.js +171 -0
- package/dist/chunk-KY2R73CG.js.map +1 -0
- package/dist/chunk-KYS77RPN.js +85 -0
- package/dist/chunk-L7YTNTIK.js +368 -0
- package/dist/chunk-LHPNABDH.js +686 -0
- package/dist/chunk-MFROMEKA.js +401 -0
- package/dist/chunk-MIHN76LX.js +2656 -0
- package/dist/chunk-MIYFS2XN.js +42 -0
- package/dist/chunk-MJUCFQMS.js +65 -0
- package/dist/chunk-MM4FNWI4.js +3064 -0
- package/dist/chunk-MNZG4OHU.js +790 -0
- package/dist/chunk-MVW6HNPI.js +250 -0
- package/dist/chunk-MVW6HNPI.js.map +1 -0
- package/dist/chunk-N6AACDUW.js +200 -0
- package/dist/chunk-NC55IFN3.js +781 -0
- package/dist/chunk-NC7PVOEK.js +98 -0
- package/dist/chunk-NCYMNCJO.js +70 -0
- package/dist/chunk-ND2BXV3P.js +259 -0
- package/dist/chunk-NDBTFUO6.js +272 -0
- package/dist/chunk-NDQJZ7HF.js +206 -0
- package/dist/chunk-NGJJJPZZ.js +162 -0
- package/dist/chunk-NJTSNNE7.js +251 -0
- package/dist/chunk-NPGISCU6.js +4159 -0
- package/dist/chunk-NPGISCU6.js.map +1 -0
- package/dist/chunk-NRTE7DNV.js +1270 -0
- package/dist/chunk-NULUNM7H.js +290 -0
- package/dist/chunk-NUNZS36W.js +227 -0
- package/dist/chunk-NW53H5RW.js +2424 -0
- package/dist/chunk-NXCMHIKI.js +263 -0
- package/dist/chunk-O3LKCBP5.js +159 -0
- package/dist/chunk-O4EA4F3W.js +103 -0
- package/dist/chunk-O4EA4F3W.js.map +1 -0
- package/dist/chunk-O4OOG3D6.js +116 -0
- package/dist/chunk-O4OOG3D6.js.map +1 -0
- package/dist/chunk-O6N4ABCA.js +376 -0
- package/dist/chunk-O732GAFC.js +112 -0
- package/dist/chunk-OF4TIKYC.js +690 -0
- package/dist/chunk-OMPVOMPP.js +70 -0
- package/dist/chunk-OPJJSKUK.js +118 -0
- package/dist/chunk-OPWCMA4D.js +196 -0
- package/dist/chunk-ORJPS5VN.js +1193 -0
- package/dist/chunk-OSY5K7L7.js +187 -0
- package/dist/chunk-OV6QJRT4.js +45 -0
- package/dist/chunk-OVKYVZMW.js +108 -0
- package/dist/chunk-OZCBM3UC.js +171 -0
- package/dist/chunk-P3A2EINJ.js +61 -0
- package/dist/chunk-PTAG4PDC.js +27 -0
- package/dist/chunk-PTF5B7TJ.js +298 -0
- package/dist/chunk-Q3DPEYX4.js +848 -0
- package/dist/chunk-Q6CGOPJD.js +215 -0
- package/dist/chunk-Q6CGOPJD.js.map +1 -0
- package/dist/chunk-QB2KMIDP.js +100 -0
- package/dist/chunk-QCSJ4CWE.js +1067 -0
- package/dist/chunk-QIOQ2NPQ.js +414 -0
- package/dist/chunk-QK5EFEUT.js +353 -0
- package/dist/chunk-QPQBLYQJ.js +41 -0
- package/dist/chunk-QPSGCC5D.js +184 -0
- package/dist/chunk-QZAAUQRN.js +474 -0
- package/dist/chunk-QZM6YDJW.js +489 -0
- package/dist/chunk-QZM6YDJW.js.map +1 -0
- package/dist/chunk-RGBI63KJ.js +188 -0
- package/dist/chunk-RLBKLAEY.js +138 -0
- package/dist/chunk-RMFKVOM7.js +304 -0
- package/dist/chunk-ROKQU7WG.js +258 -0
- package/dist/chunk-RPVREAU7.js +251 -0
- package/dist/chunk-RQKLF42C.js +723 -0
- package/dist/chunk-SC6RRD2D.js +38 -0
- package/dist/chunk-SC6RRD2D.js.map +1 -0
- package/dist/chunk-SEO7TICN.js +94 -0
- package/dist/chunk-SHHJCL7X.js +432 -0
- package/dist/chunk-SIRLACNZ.js +114 -0
- package/dist/chunk-SKPHMYAA.js +237 -0
- package/dist/chunk-SODC7T6L.js +1583 -0
- package/dist/chunk-SQJIKMN3.js +366 -0
- package/dist/chunk-SVINDKVW.js +26 -0
- package/dist/chunk-SYCDHPZF.js +335 -0
- package/dist/chunk-T2QX3FDP.js +133 -0
- package/dist/chunk-T3OWFVMS.js +1187 -0
- package/dist/chunk-T6XI5FLY.js +61 -0
- package/dist/chunk-T7OXJZCX.js +62 -0
- package/dist/chunk-TAT5USZN.js +353 -0
- package/dist/chunk-TPQTRNER.js +172 -0
- package/dist/chunk-TUIN4MB7.js +266 -0
- package/dist/chunk-TX3VECZU.js +71 -0
- package/dist/chunk-TXLIEOJX.js +9624 -0
- package/dist/chunk-U3DN4HEY.js +27 -0
- package/dist/chunk-U7XM7CB4.js +191 -0
- package/dist/chunk-UJK53QFL.js +140 -0
- package/dist/chunk-UMTXA2TH.js +319 -0
- package/dist/chunk-UPDSXFK5.js +199 -0
- package/dist/chunk-UTIAXH52.js +269 -0
- package/dist/chunk-UVN5TMHU.js +1184 -0
- package/dist/chunk-V4Z4B2E3.js +52 -0
- package/dist/chunk-V4Z4B2E3.js.map +1 -0
- package/dist/chunk-VGYXW3VG.js +246 -0
- package/dist/chunk-VS7AHPCZ.js +255 -0
- package/dist/chunk-VTTAJOQ7.js +121 -0
- package/dist/chunk-VWPOLUAO.js +99 -0
- package/dist/chunk-X3MWB2QU.js +3851 -0
- package/dist/chunk-X6KAJI3V.js +211 -0
- package/dist/chunk-XBLRHV5R.js +50 -0
- package/dist/chunk-XDFP2LMW.js +605 -0
- package/dist/chunk-XEQMZB3C.js +525 -0
- package/dist/chunk-XEYLT5VA.js +223 -0
- package/dist/chunk-XHIQ5I6N.js +918 -0
- package/dist/chunk-XLH7QY2R.js +378 -0
- package/dist/chunk-XWFAMUZQ.js +113 -0
- package/dist/chunk-Y4BB2KS2.js +294 -0
- package/dist/chunk-Y4BB2KS2.js.map +1 -0
- package/dist/chunk-Y4OBB2VN.js +84 -0
- package/dist/chunk-YCVD6CI3.js +234 -0
- package/dist/chunk-YENLNISG.js +270 -0
- package/dist/chunk-YIRVLKAX.js +351 -0
- package/dist/chunk-YL73CVNK.js +390 -0
- package/dist/chunk-YLS6QE5G.js +288 -0
- package/dist/chunk-YNF2OC54.js +366 -0
- package/dist/chunk-YNF2OC54.js.map +1 -0
- package/dist/chunk-YPWU5KPE.js +147 -0
- package/dist/chunk-YQXTDZSU.js +2984 -0
- package/dist/chunk-YSJEAAOL.js +178 -0
- package/dist/chunk-YWIFM7D7.js +499 -0
- package/dist/chunk-YWVI6ZMK.js +103 -0
- package/dist/chunk-Z4FMAFNH.js +847 -0
- package/dist/chunk-Z654FWNU.js +136 -0
- package/dist/chunk-Z7Y523PS.js +130 -0
- package/dist/chunk-ZD67RM6G.js +60 -0
- package/dist/chunk-ZEG4VPBL.js +187 -0
- package/dist/chunk-ZHDFQITM.js +283 -0
- package/dist/chunk-ZHDFQITM.js.map +1 -0
- package/dist/chunk-ZLYCOBHW.js +75 -0
- package/dist/chunk-ZNJ5MTXV.js +89 -0
- package/dist/chunk-ZSGY3H53.js +155 -0
- package/dist/chunk-ZTPXACWB.js +1788 -0
- package/dist/chunk-ZUA3JMI6.js +107 -0
- package/dist/chunk-ZYAZUPPV.js +559 -0
- package/dist/composer.js +8 -8
- package/dist/computer-viewer-TDDO25AV.js +21 -0
- package/dist/connect.js +12 -12
- package/dist/desktop-dictation.js +12 -10
- package/dist/desktop-dictation.js.map +1 -1
- package/dist/desktop.js +2 -2
- package/dist/editor.js +2 -2
- package/dist/embedded-new-voice-2G3VLPVQ.js +24 -0
- package/dist/embedded-voice-T5IWOWGD.js +24 -0
- package/dist/fleet-decision-row-WM64KXP3.js +361 -0
- package/dist/in-chat-connect-model.js +5 -5
- package/dist/index.js +51 -51
- package/dist/interaction.js +5 -5
- package/dist/machines.js +3 -3
- package/dist/meetings-recorder.js +1 -1
- package/dist/meetings.js +40 -32
- package/dist/meetings.js.map +1 -1
- package/dist/messages/en.d.ts +3 -0
- package/dist/messages.js +1 -1
- package/dist/model-policy-picker-menu-SMC6J6QN.js +22 -0
- package/dist/payment-page-card-G4U63KUV.js +223 -0
- package/dist/platform-activity-row-BUZGZAKZ.js +128 -0
- package/dist/queue-surface-implementation-4KUZ4PJV.js +908 -0
- package/dist/realtime.js +4 -4
- package/dist/recorder-host-WF2RRR56.js +69 -0
- package/dist/recorder-host-WF2RRR56.js.map +1 -0
- package/dist/recordings.js +3 -3
- package/dist/sandbox-files-ESDMOFSD.js +27 -0
- package/dist/session-app.js +211 -209
- package/dist/session-connect-cards-Q53KMMYY.js +25 -0
- package/dist/session-list-model.js +2 -2
- package/dist/session-realtime-CF3I35WJ.js +30 -0
- package/dist/session-realtime.js +2 -2
- package/dist/session-ui.js +33 -31
- package/dist/session.js +5 -5
- package/dist/sites.js +2 -2
- package/dist/terminal.js +2 -2
- package/dist/this-computer.js +3 -3
- package/dist/timeline-annotation-markers-CJK4RYZ4.js +157 -0
- package/dist/timeline-annotation-selection-67GF5H26.js +208 -0
- package/dist/timeline-annotations-dialog-ONJPQDJQ.js +283 -0
- package/dist/ui/access-list.js +11 -9
- package/dist/ui/access-list.js.map +1 -1
- package/dist/ui/api-error.d.ts +6 -3
- package/dist/ui/api-error.js +2 -1
- package/dist/ui/cadence-picker.js +6 -4
- package/dist/ui/choice-cards.js +5 -3
- package/dist/ui/confirm-dialog.js +2 -2
- package/dist/ui/copy-field.js +5 -3
- package/dist/ui/detail-page.js +2 -2
- package/dist/ui/detail-sheet.js +2 -2
- package/dist/ui/diff-view.js +4 -3
- package/dist/ui/disclosure.js +3 -3
- package/dist/ui/email-chips-input.js +5 -3
- package/dist/ui/error-message.js +2 -1
- package/dist/ui/error-reference.d.ts +15 -0
- package/dist/ui/error-text.d.ts +10 -0
- package/dist/ui/error-text.js +9 -0
- package/dist/ui/error-text.js.map +1 -0
- package/dist/ui/field.js +4 -2
- package/dist/ui/flush-form-page.js +8 -6
- package/dist/ui/form-dialog.js +7 -5
- package/dist/ui/list-row.js +3 -3
- package/dist/ui/load-failure.js +3 -2
- package/dist/ui/load-failure.js.map +1 -1
- package/dist/ui/notice.js +3 -1
- package/dist/ui/relative-time.js +2 -2
- package/dist/ui/revision-history.js +9 -7
- package/dist/ui/revision-history.js.map +1 -1
- package/dist/ui/role-select.js +10 -8
- package/dist/ui/segmented-control.js +4 -2
- package/dist/ui/select-menu.js +5 -3
- package/dist/ui/setting-row.js +3 -1
- package/dist/ui/switch.js +4 -2
- package/dist/ui/usage-meter.js +3 -3
- package/dist/ui/word-list-row.js +4 -2
- package/dist/usage.js +2 -2
- package/dist/workbench.js +4 -4
- package/package.json +5 -6
- package/src/app/app-state.tsx +126 -14
- package/src/app/components/artifacts/site-data.tsx +2 -2
- package/src/app/components/artifacts/site-settings.tsx +2 -2
- package/src/app/components/rail/session-list.tsx +7 -8
- package/src/app/components/rail/session-shell.tsx +3 -3
- package/src/app/components/repository-picker.tsx +8 -1
- package/src/app/components/session/model-context-inspector.tsx +2 -1
- package/src/app/components/session/session-admin-access.tsx +2 -2
- package/src/app/lib/actions/chat-operations.ts +4 -4
- package/src/app/lib/archive-session.test.tsx +265 -2
- package/src/app/lib/archive-session.tsx +175 -9
- package/src/app/lib/copy-link.ts +2 -2
- package/src/app/lib/inbox.tsx +2 -2
- package/src/app/lib/session-failure-toasts.ts +3 -2
- package/src/app/lib/toast.test.tsx +215 -0
- package/src/app/lib/toast.tsx +67 -2
- package/src/app/personal-github-reconnect.test.tsx +356 -0
- package/src/app/routes/artifacts.tsx +1 -2
- package/src/components/tool-action-review.tsx +14 -1
- package/src/meetings/delete-meeting-dialog.tsx +2 -1
- package/src/meetings/meeting-ask.tsx +2 -1
- package/src/meetings/meeting-detail-page.tsx +2 -1
- package/src/meetings/meeting-notes.tsx +2 -1
- package/src/meetings/meeting-settings.tsx +4 -1
- package/src/meetings/meeting-transcript.tsx +4 -1
- package/src/meetings/recorder-context.tsx +10 -0
- package/src/meetings/recorder-host.test.tsx +60 -2
- package/src/meetings/recorder-host.tsx +16 -3
- package/src/meetings/recorder-panel.tsx +2 -1
- package/src/meetings/recorder-workspace.test.tsx +26 -1
- package/src/messages/en.ts +6 -0
- package/src/ui/api-error.test.ts +29 -5
- package/src/ui/api-error.tsx +10 -4
- package/src/ui/error-message.tsx +8 -0
- package/src/ui/error-reference.test.ts +54 -0
- package/src/ui/error-reference.ts +51 -0
- package/src/ui/error-text.test.tsx +66 -0
- package/src/ui/error-text.tsx +49 -0
- package/src/ui/field.tsx +4 -1
- package/src/ui/notice.tsx +7 -2
- package/src/ui/setting-row.tsx +4 -1
- package/styles/app.css +12 -0
- package/styles/compiled.css +9 -0
- package/dist/browser-viewer-NOP5EAUO.js +0 -23
- package/dist/chat-interactive-block-G7O44JHR.js +0 -18
- package/dist/chunk-26RWVLRD.js +0 -135
- package/dist/chunk-2AHTY7OT.js +0 -247
- package/dist/chunk-2GDNWKSC.js +0 -3670
- package/dist/chunk-2JENKGCE.js +0 -339
- package/dist/chunk-2KYQC4T5.js +0 -155
- package/dist/chunk-2RREGDQH.js +0 -708
- package/dist/chunk-2T7DX6KR.js +0 -353
- package/dist/chunk-2VB2O4FQ.js +0 -920
- package/dist/chunk-2VTTKH23.js +0 -94
- package/dist/chunk-2XNG2KNT.js +0 -172
- package/dist/chunk-2YC6JQRO.js +0 -399
- package/dist/chunk-2ZVRJRXC.js +0 -27
- package/dist/chunk-35737UT4.js +0 -162
- package/dist/chunk-366XZ4PM.js +0 -41
- package/dist/chunk-36MIDGAH.js +0 -199
- package/dist/chunk-3FD76LXM.js +0 -212
- package/dist/chunk-3OVIXY4O.js +0 -213
- package/dist/chunk-3OVIXY4O.js.map +0 -1
- package/dist/chunk-3QNRBEYH.js +0 -432
- package/dist/chunk-3QX55WLC.js +0 -15
- package/dist/chunk-3USJPT2S.js +0 -1022
- package/dist/chunk-42CMQ5VR.js +0 -251
- package/dist/chunk-4LPOWQJY.js +0 -42
- package/dist/chunk-4NBTZRKT.js +0 -79
- package/dist/chunk-4OXI6HCV.js +0 -118
- package/dist/chunk-4SZZAFYQ.js +0 -2317
- package/dist/chunk-4TQL3WP2.js +0 -140
- package/dist/chunk-4Y6BK7IU.js +0 -196
- package/dist/chunk-4YD7YZC5.js +0 -373
- package/dist/chunk-5DTST3TP.js +0 -81
- package/dist/chunk-5FH5LQVS.js +0 -130
- package/dist/chunk-5KWMYPJV.js +0 -847
- package/dist/chunk-5MUJDC6C.js +0 -84
- package/dist/chunk-5QM2WPKV.js +0 -41
- package/dist/chunk-5WUN7XPD.js +0 -1184
- package/dist/chunk-64PO2WXU.js +0 -1067
- package/dist/chunk-6AHATAAY.js +0 -431
- package/dist/chunk-6ED2YWBT.js +0 -56
- package/dist/chunk-6GXVYAGR.js +0 -170
- package/dist/chunk-6H4SJBPE.js +0 -85
- package/dist/chunk-6MT3HHUB.js +0 -84
- package/dist/chunk-6UHCBH4G.js +0 -198
- package/dist/chunk-6WLX3NR3.js +0 -198
- package/dist/chunk-73NXYYWE.js +0 -112
- package/dist/chunk-76ERNKIZ.js +0 -603
- package/dist/chunk-776QZ573.js +0 -57
- package/dist/chunk-7BYWOFVH.js +0 -171
- package/dist/chunk-7O5CGGIQ.js +0 -108
- package/dist/chunk-7QOHRZ67.js +0 -251
- package/dist/chunk-7WIDB4PL.js +0 -2058
- package/dist/chunk-7WKP3DYJ.js +0 -37
- package/dist/chunk-7XOVTPDI.js +0 -227
- package/dist/chunk-AB5MBIXY.js +0 -281
- package/dist/chunk-ADNMXBCX.js +0 -1193
- package/dist/chunk-AFBJTUFK.js +0 -202
- package/dist/chunk-ALVRWCXE.js +0 -61
- package/dist/chunk-AOHU6O3M.js +0 -247
- package/dist/chunk-AOHU6O3M.js.map +0 -1
- package/dist/chunk-APW4T4SW.js +0 -270
- package/dist/chunk-AXBSYWKX.js +0 -2656
- package/dist/chunk-B2I5ZW35.js +0 -422
- package/dist/chunk-B3LMRTRF.js +0 -223
- package/dist/chunk-BE2XENG2.js +0 -292
- package/dist/chunk-BE2XENG2.js.map +0 -1
- package/dist/chunk-BF4SADKX.js +0 -29
- package/dist/chunk-BKP43KK4.js +0 -1788
- package/dist/chunk-BM3NEZ6X.js +0 -781
- package/dist/chunk-BT3BAGB5.js +0 -216
- package/dist/chunk-BTSYDIVJ.js +0 -357
- package/dist/chunk-BUBNGKWG.js +0 -70
- package/dist/chunk-BVUJV5WR.js +0 -126
- package/dist/chunk-BZO5ZMUP.js +0 -27
- package/dist/chunk-C3HUF3M2.js +0 -157
- package/dist/chunk-C5QCAOES.js +0 -264
- package/dist/chunk-CGK6ALQU.js +0 -159
- package/dist/chunk-CPYGO76Q.js +0 -335
- package/dist/chunk-CQH4FWYA.js +0 -490
- package/dist/chunk-CZP5QXNB.js +0 -234
- package/dist/chunk-D2TOWEYH.js +0 -266
- package/dist/chunk-D6L4GHRH.js +0 -340
- package/dist/chunk-DKT3N37I.js +0 -50
- package/dist/chunk-DMMJIFKA.js +0 -84
- package/dist/chunk-DO74DQC7.js +0 -26
- package/dist/chunk-DOFJZ2JU.js +0 -83
- package/dist/chunk-DSXVY5WZ.js +0 -119
- package/dist/chunk-E337C2VK.js +0 -82
- package/dist/chunk-E6NRSRBE.js +0 -114
- package/dist/chunk-E6SQKHAU.js +0 -114
- package/dist/chunk-E7UIVD7F.js +0 -236
- package/dist/chunk-EGBII4CP.js +0 -229
- package/dist/chunk-EILSAQVJ.js +0 -200
- package/dist/chunk-ELL6HSYR.js +0 -307
- package/dist/chunk-EUBGLFFR.js +0 -73
- package/dist/chunk-EW6RNWSH.js +0 -212
- package/dist/chunk-EYUT5Y6V.js +0 -2599
- package/dist/chunk-F7U3QPZ3.js +0 -304
- package/dist/chunk-FBTJKSTM.js +0 -1270
- package/dist/chunk-FC2FTSK3.js +0 -2424
- package/dist/chunk-FOGNA3BU.js +0 -148
- package/dist/chunk-FQFKHNC7.js +0 -650
- package/dist/chunk-FTCHM755.js +0 -50
- package/dist/chunk-FXSHP4JZ.js +0 -3550
- package/dist/chunk-G6ZZC543.js +0 -818
- package/dist/chunk-G7FU6PUA.js +0 -100
- package/dist/chunk-GA4YEAMX.js +0 -3851
- package/dist/chunk-GE33BGB7.js +0 -12
- package/dist/chunk-GQ67HSJY.js +0 -570
- package/dist/chunk-GXXZ3WAK.js +0 -106
- package/dist/chunk-H2TCRX3H.js +0 -237
- package/dist/chunk-HLL4PBO7.js +0 -60
- package/dist/chunk-HLOEPV5C.js +0 -259
- package/dist/chunk-HUAGBS4O.js +0 -56
- package/dist/chunk-I36GSRUJ.js +0 -211
- package/dist/chunk-I6VBHT7S.js +0 -261
- package/dist/chunk-ICNNNOXE.js +0 -333
- package/dist/chunk-ICX64J4U.js +0 -172
- package/dist/chunk-ID36Y46W.js +0 -5046
- package/dist/chunk-ID36Y46W.js.map +0 -1
- package/dist/chunk-IGVVXLKJ.js +0 -559
- package/dist/chunk-IKJLSBUI.js +0 -2984
- package/dist/chunk-IKMUFDVS.js +0 -50
- package/dist/chunk-IKUNOX7F.js +0 -255
- package/dist/chunk-ILKDYBON.js +0 -288
- package/dist/chunk-IVYJX3OY.js +0 -187
- package/dist/chunk-JCY4CMDH.js +0 -107
- package/dist/chunk-JJZPLGIP.js +0 -474
- package/dist/chunk-JW33RV4V.js +0 -143
- package/dist/chunk-JWPA6ZPZ.js +0 -351
- package/dist/chunk-JZ4QXS6D.js +0 -50
- package/dist/chunk-K42OUZQ3.js +0 -386
- package/dist/chunk-K5TOVX5A.js +0 -206
- package/dist/chunk-K63HGHZX.js +0 -99
- package/dist/chunk-K6R5T44I.js +0 -75
- package/dist/chunk-KHJ5PXFM.js +0 -914
- package/dist/chunk-KJZRQ55O.js +0 -2319
- package/dist/chunk-KJZRQ55O.js.map +0 -1
- package/dist/chunk-KKI55ZMW.js +0 -65
- package/dist/chunk-KRPLAAFP.js +0 -199
- package/dist/chunk-KVFEZDBO.js +0 -134
- package/dist/chunk-L4I665WK.js +0 -45
- package/dist/chunk-L4OF77LE.js +0 -110
- package/dist/chunk-L4OF77LE.js.map +0 -1
- package/dist/chunk-LA5T52RM.js +0 -70
- package/dist/chunk-LM2W5YAT.js +0 -401
- package/dist/chunk-LQ62ECE6.js +0 -390
- package/dist/chunk-LQDUHU3Y.js +0 -71
- package/dist/chunk-LRJIYTZW.js +0 -4157
- package/dist/chunk-LRJIYTZW.js.map +0 -1
- package/dist/chunk-LRN6GYAZ.js +0 -138
- package/dist/chunk-M4SDVTKJ.js +0 -790
- package/dist/chunk-MA6O7CM6.js +0 -99
- package/dist/chunk-MBIBB6GI.js +0 -197
- package/dist/chunk-MF3ZFB4H.js +0 -199
- package/dist/chunk-MJJGJMYJ.js +0 -98
- package/dist/chunk-MLJADQFI.js +0 -4824
- package/dist/chunk-MQG7RV3B.js +0 -62
- package/dist/chunk-MTTGSQA5.js +0 -186
- package/dist/chunk-MW7Y3T55.js +0 -525
- package/dist/chunk-MYUFMVCH.js +0 -121
- package/dist/chunk-N3OARGH2.js +0 -61
- package/dist/chunk-NB2HMRT2.js +0 -353
- package/dist/chunk-NFDFYWMV.js +0 -141
- package/dist/chunk-NWGNFN3N.js +0 -1187
- package/dist/chunk-NWJRPDIO.js +0 -840
- package/dist/chunk-NWJRPDIO.js.map +0 -1
- package/dist/chunk-NXWBBZJV.js +0 -267
- package/dist/chunk-NY2QWROL.js +0 -71
- package/dist/chunk-O2IOPP3R.js +0 -848
- package/dist/chunk-O2UWH5RG.js +0 -141
- package/dist/chunk-O5YWDLYF.js +0 -393
- package/dist/chunk-OBMCZO7E.js +0 -121
- package/dist/chunk-OD3DCCCB.js +0 -132
- package/dist/chunk-OMH7R6I3.js +0 -390
- package/dist/chunk-OSA5EQG5.js +0 -113
- package/dist/chunk-OSJ3MUTZ.js +0 -2936
- package/dist/chunk-OWAYJ2OV.js +0 -368
- package/dist/chunk-OYXBFSGK.js +0 -269
- package/dist/chunk-PC2EBA5G.js +0 -4116
- package/dist/chunk-PC2EBA5G.js.map +0 -1
- package/dist/chunk-PC2MVXIP.js +0 -363
- package/dist/chunk-PC2MVXIP.js.map +0 -1
- package/dist/chunk-PENGLDR5.js +0 -309
- package/dist/chunk-PSMAWRPL.js +0 -191
- package/dist/chunk-PW4IMTYR.js +0 -702
- package/dist/chunk-PW54V7T5.js +0 -387
- package/dist/chunk-Q2EXYSMO.js +0 -24
- package/dist/chunk-Q2XJK5I4.js +0 -51
- package/dist/chunk-Q2XJK5I4.js.map +0 -1
- package/dist/chunk-Q4EFRI6X.js +0 -258
- package/dist/chunk-Q52CXW6C.js +0 -48
- package/dist/chunk-Q6XQ2R37.js +0 -184
- package/dist/chunk-QAJ53XBW.js +0 -23
- package/dist/chunk-QDTKECT4.js +0 -129
- package/dist/chunk-QE3ZFGI3.js +0 -43
- package/dist/chunk-QHHSUR2Y.js +0 -298
- package/dist/chunk-QHNVNR7B.js +0 -173
- package/dist/chunk-QIK2Q6N5.js +0 -376
- package/dist/chunk-QWL4L366.js +0 -38
- package/dist/chunk-R3J2PTVQ.js +0 -690
- package/dist/chunk-RBRX5ZS3.js +0 -319
- package/dist/chunk-REX6JIC7.js +0 -33
- package/dist/chunk-RGZ7EEC3.js +0 -537
- package/dist/chunk-RGZ7EEC3.js.map +0 -1
- package/dist/chunk-RIPS7GFR.js +0 -960
- package/dist/chunk-RTBZNFNV.js +0 -1354
- package/dist/chunk-RTBZNFNV.js.map +0 -1
- package/dist/chunk-SKMNW4SW.js +0 -187
- package/dist/chunk-SRFARKXC.js +0 -623
- package/dist/chunk-SWIHWCTW.js +0 -4461
- package/dist/chunk-TA5CFTO4.js +0 -103
- package/dist/chunk-TF4ZVJLI.js +0 -156
- package/dist/chunk-TG7DADJR.js +0 -9624
- package/dist/chunk-TI4R2ZD5.js +0 -623
- package/dist/chunk-TI4R2ZD5.js.map +0 -1
- package/dist/chunk-TNKWOUWP.js +0 -412
- package/dist/chunk-TNUSPXPW.js +0 -5555
- package/dist/chunk-TNUSPXPW.js.map +0 -1
- package/dist/chunk-TNYFHKVV.js +0 -366
- package/dist/chunk-TPMZBOFH.js +0 -178
- package/dist/chunk-TW3LKRJF.js +0 -263
- package/dist/chunk-TZAO65I4.js +0 -83
- package/dist/chunk-U5EFEMYU.js +0 -89
- package/dist/chunk-U6M4LS3M.js +0 -378
- package/dist/chunk-UI4HI5QK.js +0 -918
- package/dist/chunk-UJDOWCQ3.js +0 -272
- package/dist/chunk-UJUQ2QOX.js +0 -581
- package/dist/chunk-UQ3IM6FY.js +0 -133
- package/dist/chunk-UYE47LO6.js +0 -246
- package/dist/chunk-VADHIT26.js +0 -89
- package/dist/chunk-VFQ3H6CO.js +0 -163
- package/dist/chunk-VGUN6VB2.js +0 -188
- package/dist/chunk-VGWWEVSD.js +0 -723
- package/dist/chunk-VIEFJ2DM.js +0 -2469
- package/dist/chunk-VLXM36VS.js +0 -268
- package/dist/chunk-W3BFRR2G.js +0 -499
- package/dist/chunk-W5MPXR3A.js +0 -981
- package/dist/chunk-W5OWKVZG.js +0 -136
- package/dist/chunk-W6FRORMX.js +0 -486
- package/dist/chunk-W6FRORMX.js.map +0 -1
- package/dist/chunk-W7XROSZO.js +0 -232
- package/dist/chunk-W7XROSZO.js.map +0 -1
- package/dist/chunk-WEZ5PXZP.js +0 -403
- package/dist/chunk-WHWUWN2X.js +0 -197
- package/dist/chunk-WHWUWN2X.js.map +0 -1
- package/dist/chunk-WLEDGIVS.js +0 -114
- package/dist/chunk-WLEDGIVS.js.map +0 -1
- package/dist/chunk-WNDAKLHG.js +0 -281
- package/dist/chunk-WTJ4PLMU.js +0 -103
- package/dist/chunk-WV2KPJUW.js +0 -107
- package/dist/chunk-X3VY5EGY.js +0 -277
- package/dist/chunk-X3VY5EGY.js.map +0 -1
- package/dist/chunk-XDBYWVCW.js +0 -418
- package/dist/chunk-XF7MA4U5.js +0 -36
- package/dist/chunk-XF7MA4U5.js.map +0 -1
- package/dist/chunk-XOSQP3YA.js +0 -605
- package/dist/chunk-XYBV4ZJQ.js +0 -271
- package/dist/chunk-YBKVGLQR.js +0 -147
- package/dist/chunk-YDCUBUWH.js +0 -1583
- package/dist/chunk-YG6NARQY.js +0 -51
- package/dist/chunk-YG6NARQY.js.map +0 -1
- package/dist/chunk-YSVD5HI4.js +0 -278
- package/dist/chunk-YT3WGNG6.js +0 -290
- package/dist/chunk-YYICQDK4.js +0 -414
- package/dist/chunk-YYLMZLI6.js +0 -686
- package/dist/chunk-ZAMTKG5U.js +0 -95
- package/dist/chunk-ZDLYSXKN.js +0 -111
- package/dist/chunk-ZG447FSS.js +0 -194
- package/dist/chunk-ZIT5KD4Q.js +0 -264
- package/dist/chunk-ZUDOVDKR.js +0 -3064
- package/dist/chunk-ZW2ECJ3A.js +0 -451
- package/dist/computer-viewer-LPZ763KF.js +0 -21
- package/dist/embedded-new-voice-YVMKSLKJ.js +0 -24
- package/dist/embedded-voice-BJPQFXSU.js +0 -24
- package/dist/fleet-decision-row-AA4H5CDT.js +0 -361
- package/dist/model-policy-picker-menu-HSMWVO4P.js +0 -22
- package/dist/payment-page-card-3LTSFJGN.js +0 -223
- package/dist/platform-activity-row-5VYV6TX4.js +0 -128
- package/dist/queue-surface-implementation-NXHZUKD2.js +0 -908
- package/dist/recorder-host-ZKRWTDBM.js +0 -57
- package/dist/recorder-host-ZKRWTDBM.js.map +0 -1
- package/dist/sandbox-files-YCMLQUFU.js +0 -27
- package/dist/session-connect-cards-KSQLMRM5.js +0 -25
- package/dist/session-realtime-ZR6JLG3Y.js +0 -30
- package/dist/timeline-annotation-markers-YAHDPWVG.js +0 -157
- package/dist/timeline-annotation-selection-KHXNCEJP.js +0 -208
- package/dist/timeline-annotations-dialog-Y4XD3N7B.js +0 -283
- /package/dist/{browser-viewer-NOP5EAUO.js.map → browser-viewer-TC27OCIP.js.map} +0 -0
- /package/dist/{chat-interactive-block-G7O44JHR.js.map → chat-interactive-block-RWPQBHVS.js.map} +0 -0
- /package/dist/{chunk-EGBII4CP.js.map → chunk-2BDT3UZQ.js.map} +0 -0
- /package/dist/{chunk-4YD7YZC5.js.map → chunk-2CLNIEK4.js.map} +0 -0
- /package/dist/{chunk-ZW2ECJ3A.js.map → chunk-2FSBSCZJ.js.map} +0 -0
- /package/dist/{chunk-KRPLAAFP.js.map → chunk-2I7HDP53.js.map} +0 -0
- /package/dist/{chunk-3QX55WLC.js.map → chunk-2INLDVK3.js.map} +0 -0
- /package/dist/{chunk-BVUJV5WR.js.map → chunk-2KALVELR.js.map} +0 -0
- /package/dist/{chunk-XDBYWVCW.js.map → chunk-2M3J7ZWQ.js.map} +0 -0
- /package/dist/{chunk-2RREGDQH.js.map → chunk-2OP6WLGV.js.map} +0 -0
- /package/dist/{chunk-OSJ3MUTZ.js.map → chunk-2RG7NIAS.js.map} +0 -0
- /package/dist/{chunk-26RWVLRD.js.map → chunk-2STUPWEL.js.map} +0 -0
- /package/dist/{chunk-XYBV4ZJQ.js.map → chunk-2YUOVM3G.js.map} +0 -0
- /package/dist/{chunk-2GDNWKSC.js.map → chunk-2Z3NQNTM.js.map} +0 -0
- /package/dist/{chunk-2VB2O4FQ.js.map → chunk-3CPWWGNK.js.map} +0 -0
- /package/dist/{chunk-7WKP3DYJ.js.map → chunk-3ED2U6XE.js.map} +0 -0
- /package/dist/{chunk-BT3BAGB5.js.map → chunk-3GZA4BUW.js.map} +0 -0
- /package/dist/{chunk-3USJPT2S.js.map → chunk-3IK6UYO6.js.map} +0 -0
- /package/dist/{chunk-6AHATAAY.js.map → chunk-3PZ7JZI2.js.map} +0 -0
- /package/dist/{chunk-JZ4QXS6D.js.map → chunk-4DVJ6ONS.js.map} +0 -0
- /package/dist/{chunk-5QM2WPKV.js.map → chunk-4E3ZJRTZ.js.map} +0 -0
- /package/dist/{chunk-NFDFYWMV.js.map → chunk-4SAWSRAA.js.map} +0 -0
- /package/dist/{chunk-ELL6HSYR.js.map → chunk-53AGXXZM.js.map} +0 -0
- /package/dist/{chunk-G6ZZC543.js.map → chunk-54YW6SZZ.js.map} +0 -0
- /package/dist/{chunk-4SZZAFYQ.js.map → chunk-57AZS3IE.js.map} +0 -0
- /package/dist/{chunk-JW33RV4V.js.map → chunk-5CPEEAFD.js.map} +0 -0
- /package/dist/{chunk-D6L4GHRH.js.map → chunk-5EWSRZ2Y.js.map} +0 -0
- /package/dist/{chunk-PW54V7T5.js.map → chunk-5IE76VCY.js.map} +0 -0
- /package/dist/{chunk-6GXVYAGR.js.map → chunk-5NWEKLDZ.js.map} +0 -0
- /package/dist/{chunk-6UHCBH4G.js.map → chunk-5O2FCCHZ.js.map} +0 -0
- /package/dist/{chunk-2YC6JQRO.js.map → chunk-5QAY6K77.js.map} +0 -0
- /package/dist/{chunk-EYUT5Y6V.js.map → chunk-6DK6Z4UN.js.map} +0 -0
- /package/dist/{chunk-PW4IMTYR.js.map → chunk-6DVCC7QS.js.map} +0 -0
- /package/dist/{chunk-7WIDB4PL.js.map → chunk-6JHU2UBS.js.map} +0 -0
- /package/dist/{chunk-CQH4FWYA.js.map → chunk-6PZ7OBYU.js.map} +0 -0
- /package/dist/{chunk-VFQ3H6CO.js.map → chunk-6WGRDRMA.js.map} +0 -0
- /package/dist/{chunk-MTTGSQA5.js.map → chunk-77WAKEAH.js.map} +0 -0
- /package/dist/{chunk-O5YWDLYF.js.map → chunk-7TDO3CUM.js.map} +0 -0
- /package/dist/{chunk-2AHTY7OT.js.map → chunk-7TIX2UAR.js.map} +0 -0
- /package/dist/{chunk-FOGNA3BU.js.map → chunk-7V5REBCP.js.map} +0 -0
- /package/dist/{chunk-2JENKGCE.js.map → chunk-7VMZGLYI.js.map} +0 -0
- /package/dist/{chunk-E7UIVD7F.js.map → chunk-7W37NS3I.js.map} +0 -0
- /package/dist/{chunk-ZDLYSXKN.js.map → chunk-7X6SDK2C.js.map} +0 -0
- /package/dist/{chunk-ZAMTKG5U.js.map → chunk-7ZNUHRP5.js.map} +0 -0
- /package/dist/{chunk-DMMJIFKA.js.map → chunk-A36PZALD.js.map} +0 -0
- /package/dist/{chunk-WV2KPJUW.js.map → chunk-AUI6VA63.js.map} +0 -0
- /package/dist/{chunk-Q2EXYSMO.js.map → chunk-AW2MQB37.js.map} +0 -0
- /package/dist/{chunk-6WLX3NR3.js.map → chunk-AWKES45Y.js.map} +0 -0
- /package/dist/{chunk-OD3DCCCB.js.map → chunk-AXHZYXUV.js.map} +0 -0
- /package/dist/{chunk-QDTKECT4.js.map → chunk-BHNSJVBC.js.map} +0 -0
- /package/dist/{chunk-FTCHM755.js.map → chunk-BJEJFISW.js.map} +0 -0
- /package/dist/{chunk-B2I5ZW35.js.map → chunk-BJFH6JI5.js.map} +0 -0
- /package/dist/{chunk-RIPS7GFR.js.map → chunk-BMICEQZQ.js.map} +0 -0
- /package/dist/{chunk-BF4SADKX.js.map → chunk-BTLBYBLU.js.map} +0 -0
- /package/dist/{chunk-U5EFEMYU.js.map → chunk-BXBDYNRP.js.map} +0 -0
- /package/dist/{chunk-BTSYDIVJ.js.map → chunk-C372BFOV.js.map} +0 -0
- /package/dist/{chunk-MLJADQFI.js.map → chunk-CMKGILJK.js.map} +0 -0
- /package/dist/{chunk-DKT3N37I.js.map → chunk-CRAOSVHC.js.map} +0 -0
- /package/dist/{chunk-WNDAKLHG.js.map → chunk-CRU35QQH.js.map} +0 -0
- /package/dist/{chunk-2XNG2KNT.js.map → chunk-CUIWCGMA.js.map} +0 -0
- /package/dist/{chunk-QWL4L366.js.map → chunk-D5TWNFFE.js.map} +0 -0
- /package/dist/{chunk-SWIHWCTW.js.map → chunk-DF5EAHDN.js.map} +0 -0
- /package/dist/{chunk-HUAGBS4O.js.map → chunk-DJAXC5OK.js.map} +0 -0
- /package/dist/{chunk-FXSHP4JZ.js.map → chunk-DXBYWSL5.js.map} +0 -0
- /package/dist/{chunk-5MUJDC6C.js.map → chunk-DXR5PDFP.js.map} +0 -0
- /package/dist/{chunk-NXWBBZJV.js.map → chunk-DZWARC4M.js.map} +0 -0
- /package/dist/{chunk-GXXZ3WAK.js.map → chunk-DZXEDSQI.js.map} +0 -0
- /package/dist/{chunk-Q52CXW6C.js.map → chunk-E7XERZWC.js.map} +0 -0
- /package/dist/{chunk-4NBTZRKT.js.map → chunk-ECJBYNLJ.js.map} +0 -0
- /package/dist/{chunk-QE3ZFGI3.js.map → chunk-EDI6SJ2N.js.map} +0 -0
- /package/dist/{chunk-E6NRSRBE.js.map → chunk-EWSOC6WF.js.map} +0 -0
- /package/dist/{chunk-TA5CFTO4.js.map → chunk-F2OPHAUN.js.map} +0 -0
- /package/dist/{chunk-5DTST3TP.js.map → chunk-F4ISQGGM.js.map} +0 -0
- /package/dist/{chunk-MBIBB6GI.js.map → chunk-FO4LYKJL.js.map} +0 -0
- /package/dist/{chunk-EUBGLFFR.js.map → chunk-FPXASDG5.js.map} +0 -0
- /package/dist/{chunk-C3HUF3M2.js.map → chunk-FVXBNBHO.js.map} +0 -0
- /package/dist/{chunk-W5MPXR3A.js.map → chunk-FZC5N55X.js.map} +0 -0
- /package/dist/{chunk-MA6O7CM6.js.map → chunk-GAVYGBFI.js.map} +0 -0
- /package/dist/{chunk-REX6JIC7.js.map → chunk-GKVJIDHF.js.map} +0 -0
- /package/dist/{chunk-EW6RNWSH.js.map → chunk-GVN5SZLX.js.map} +0 -0
- /package/dist/{chunk-KVFEZDBO.js.map → chunk-H3T7IWNA.js.map} +0 -0
- /package/dist/{chunk-I6VBHT7S.js.map → chunk-HAX4LCR5.js.map} +0 -0
- /package/dist/{chunk-OBMCZO7E.js.map → chunk-HC4JFZVU.js.map} +0 -0
- /package/dist/{chunk-UJUQ2QOX.js.map → chunk-HEFPPMBQ.js.map} +0 -0
- /package/dist/{chunk-DOFJZ2JU.js.map → chunk-HNLR7Q4Z.js.map} +0 -0
- /package/dist/{chunk-GE33BGB7.js.map → chunk-HSOXMJOT.js.map} +0 -0
- /package/dist/{chunk-AB5MBIXY.js.map → chunk-I4MRDSUF.js.map} +0 -0
- /package/dist/{chunk-AFBJTUFK.js.map → chunk-I4QEJ62Y.js.map} +0 -0
- /package/dist/{chunk-6ED2YWBT.js.map → chunk-I5B5L6Q4.js.map} +0 -0
- /package/dist/{chunk-C5QCAOES.js.map → chunk-I5QZJODL.js.map} +0 -0
- /package/dist/{chunk-76ERNKIZ.js.map → chunk-I7ITSXSJ.js.map} +0 -0
- /package/dist/{chunk-OMH7R6I3.js.map → chunk-I7XIZRFD.js.map} +0 -0
- /package/dist/{chunk-E337C2VK.js.map → chunk-IDANQPRH.js.map} +0 -0
- /package/dist/{chunk-3FD76LXM.js.map → chunk-IFB3WJ36.js.map} +0 -0
- /package/dist/{chunk-ZIT5KD4Q.js.map → chunk-IHTAKKTK.js.map} +0 -0
- /package/dist/{chunk-QHNVNR7B.js.map → chunk-ILDXWY37.js.map} +0 -0
- /package/dist/{chunk-GQ67HSJY.js.map → chunk-IMDQUHBJ.js.map} +0 -0
- /package/dist/{chunk-DSXVY5WZ.js.map → chunk-IMZCQBOT.js.map} +0 -0
- /package/dist/{chunk-WEZ5PXZP.js.map → chunk-IXPTECSC.js.map} +0 -0
- /package/dist/{chunk-NY2QWROL.js.map → chunk-J255A3N5.js.map} +0 -0
- /package/dist/{chunk-O2UWH5RG.js.map → chunk-J5F5HPPW.js.map} +0 -0
- /package/dist/{chunk-VIEFJ2DM.js.map → chunk-JEA3QDX7.js.map} +0 -0
- /package/dist/{chunk-TF4ZVJLI.js.map → chunk-JEUPAVYY.js.map} +0 -0
- /package/dist/{chunk-ZG447FSS.js.map → chunk-JKHKLL5W.js.map} +0 -0
- /package/dist/{chunk-FQFKHNC7.js.map → chunk-JQL7ZH6C.js.map} +0 -0
- /package/dist/{chunk-776QZ573.js.map → chunk-JWB44UGJ.js.map} +0 -0
- /package/dist/{chunk-ICNNNOXE.js.map → chunk-JZ4NLCAP.js.map} +0 -0
- /package/dist/{chunk-TNKWOUWP.js.map → chunk-K2A5PXQ5.js.map} +0 -0
- /package/dist/{chunk-SRFARKXC.js.map → chunk-K56XV3C3.js.map} +0 -0
- /package/dist/{chunk-QAJ53XBW.js.map → chunk-K6GAXXVA.js.map} +0 -0
- /package/dist/{chunk-MF3ZFB4H.js.map → chunk-KCBMFSMS.js.map} +0 -0
- /package/dist/{chunk-VLXM36VS.js.map → chunk-KF2FV3ZJ.js.map} +0 -0
- /package/dist/{chunk-YSVD5HI4.js.map → chunk-KJD65EJP.js.map} +0 -0
- /package/dist/{chunk-K42OUZQ3.js.map → chunk-KLEUWIMZ.js.map} +0 -0
- /package/dist/{chunk-PENGLDR5.js.map → chunk-KODELWYT.js.map} +0 -0
- /package/dist/{chunk-TZAO65I4.js.map → chunk-KRDR5RJD.js.map} +0 -0
- /package/dist/{chunk-KHJ5PXFM.js.map → chunk-KUDGXAF7.js.map} +0 -0
- /package/dist/{chunk-6H4SJBPE.js.map → chunk-KYS77RPN.js.map} +0 -0
- /package/dist/{chunk-OWAYJ2OV.js.map → chunk-L7YTNTIK.js.map} +0 -0
- /package/dist/{chunk-YYLMZLI6.js.map → chunk-LHPNABDH.js.map} +0 -0
- /package/dist/{chunk-LM2W5YAT.js.map → chunk-MFROMEKA.js.map} +0 -0
- /package/dist/{chunk-AXBSYWKX.js.map → chunk-MIHN76LX.js.map} +0 -0
- /package/dist/{chunk-4LPOWQJY.js.map → chunk-MIYFS2XN.js.map} +0 -0
- /package/dist/{chunk-KKI55ZMW.js.map → chunk-MJUCFQMS.js.map} +0 -0
- /package/dist/{chunk-ZUDOVDKR.js.map → chunk-MM4FNWI4.js.map} +0 -0
- /package/dist/{chunk-M4SDVTKJ.js.map → chunk-MNZG4OHU.js.map} +0 -0
- /package/dist/{chunk-EILSAQVJ.js.map → chunk-N6AACDUW.js.map} +0 -0
- /package/dist/{chunk-BM3NEZ6X.js.map → chunk-NC55IFN3.js.map} +0 -0
- /package/dist/{chunk-MJJGJMYJ.js.map → chunk-NC7PVOEK.js.map} +0 -0
- /package/dist/{chunk-LA5T52RM.js.map → chunk-NCYMNCJO.js.map} +0 -0
- /package/dist/{chunk-HLOEPV5C.js.map → chunk-ND2BXV3P.js.map} +0 -0
- /package/dist/{chunk-UJDOWCQ3.js.map → chunk-NDBTFUO6.js.map} +0 -0
- /package/dist/{chunk-K5TOVX5A.js.map → chunk-NDQJZ7HF.js.map} +0 -0
- /package/dist/{chunk-35737UT4.js.map → chunk-NGJJJPZZ.js.map} +0 -0
- /package/dist/{chunk-42CMQ5VR.js.map → chunk-NJTSNNE7.js.map} +0 -0
- /package/dist/{chunk-FBTJKSTM.js.map → chunk-NRTE7DNV.js.map} +0 -0
- /package/dist/{chunk-YT3WGNG6.js.map → chunk-NULUNM7H.js.map} +0 -0
- /package/dist/{chunk-7XOVTPDI.js.map → chunk-NUNZS36W.js.map} +0 -0
- /package/dist/{chunk-FC2FTSK3.js.map → chunk-NW53H5RW.js.map} +0 -0
- /package/dist/{chunk-TW3LKRJF.js.map → chunk-NXCMHIKI.js.map} +0 -0
- /package/dist/{chunk-CGK6ALQU.js.map → chunk-O3LKCBP5.js.map} +0 -0
- /package/dist/{chunk-QIK2Q6N5.js.map → chunk-O6N4ABCA.js.map} +0 -0
- /package/dist/{chunk-73NXYYWE.js.map → chunk-O732GAFC.js.map} +0 -0
- /package/dist/{chunk-R3J2PTVQ.js.map → chunk-OF4TIKYC.js.map} +0 -0
- /package/dist/{chunk-BUBNGKWG.js.map → chunk-OMPVOMPP.js.map} +0 -0
- /package/dist/{chunk-4OXI6HCV.js.map → chunk-OPJJSKUK.js.map} +0 -0
- /package/dist/{chunk-4Y6BK7IU.js.map → chunk-OPWCMA4D.js.map} +0 -0
- /package/dist/{chunk-ADNMXBCX.js.map → chunk-ORJPS5VN.js.map} +0 -0
- /package/dist/{chunk-SKMNW4SW.js.map → chunk-OSY5K7L7.js.map} +0 -0
- /package/dist/{chunk-L4I665WK.js.map → chunk-OV6QJRT4.js.map} +0 -0
- /package/dist/{chunk-7O5CGGIQ.js.map → chunk-OVKYVZMW.js.map} +0 -0
- /package/dist/{chunk-7BYWOFVH.js.map → chunk-OZCBM3UC.js.map} +0 -0
- /package/dist/{chunk-ALVRWCXE.js.map → chunk-P3A2EINJ.js.map} +0 -0
- /package/dist/{chunk-BZO5ZMUP.js.map → chunk-PTAG4PDC.js.map} +0 -0
- /package/dist/{chunk-QHHSUR2Y.js.map → chunk-PTF5B7TJ.js.map} +0 -0
- /package/dist/{chunk-O2IOPP3R.js.map → chunk-Q3DPEYX4.js.map} +0 -0
- /package/dist/{chunk-G7FU6PUA.js.map → chunk-QB2KMIDP.js.map} +0 -0
- /package/dist/{chunk-64PO2WXU.js.map → chunk-QCSJ4CWE.js.map} +0 -0
- /package/dist/{chunk-YYICQDK4.js.map → chunk-QIOQ2NPQ.js.map} +0 -0
- /package/dist/{chunk-NB2HMRT2.js.map → chunk-QK5EFEUT.js.map} +0 -0
- /package/dist/{chunk-366XZ4PM.js.map → chunk-QPQBLYQJ.js.map} +0 -0
- /package/dist/{chunk-Q6XQ2R37.js.map → chunk-QPSGCC5D.js.map} +0 -0
- /package/dist/{chunk-JJZPLGIP.js.map → chunk-QZAAUQRN.js.map} +0 -0
- /package/dist/{chunk-VGUN6VB2.js.map → chunk-RGBI63KJ.js.map} +0 -0
- /package/dist/{chunk-LRN6GYAZ.js.map → chunk-RLBKLAEY.js.map} +0 -0
- /package/dist/{chunk-F7U3QPZ3.js.map → chunk-RMFKVOM7.js.map} +0 -0
- /package/dist/{chunk-Q4EFRI6X.js.map → chunk-ROKQU7WG.js.map} +0 -0
- /package/dist/{chunk-7QOHRZ67.js.map → chunk-RPVREAU7.js.map} +0 -0
- /package/dist/{chunk-VGWWEVSD.js.map → chunk-RQKLF42C.js.map} +0 -0
- /package/dist/{chunk-2VTTKH23.js.map → chunk-SEO7TICN.js.map} +0 -0
- /package/dist/{chunk-3QNRBEYH.js.map → chunk-SHHJCL7X.js.map} +0 -0
- /package/dist/{chunk-E6SQKHAU.js.map → chunk-SIRLACNZ.js.map} +0 -0
- /package/dist/{chunk-H2TCRX3H.js.map → chunk-SKPHMYAA.js.map} +0 -0
- /package/dist/{chunk-YDCUBUWH.js.map → chunk-SODC7T6L.js.map} +0 -0
- /package/dist/{chunk-TNYFHKVV.js.map → chunk-SQJIKMN3.js.map} +0 -0
- /package/dist/{chunk-DO74DQC7.js.map → chunk-SVINDKVW.js.map} +0 -0
- /package/dist/{chunk-CPYGO76Q.js.map → chunk-SYCDHPZF.js.map} +0 -0
- /package/dist/{chunk-UQ3IM6FY.js.map → chunk-T2QX3FDP.js.map} +0 -0
- /package/dist/{chunk-NWGNFN3N.js.map → chunk-T3OWFVMS.js.map} +0 -0
- /package/dist/{chunk-N3OARGH2.js.map → chunk-T6XI5FLY.js.map} +0 -0
- /package/dist/{chunk-MQG7RV3B.js.map → chunk-T7OXJZCX.js.map} +0 -0
- /package/dist/{chunk-2T7DX6KR.js.map → chunk-TAT5USZN.js.map} +0 -0
- /package/dist/{chunk-ICX64J4U.js.map → chunk-TPQTRNER.js.map} +0 -0
- /package/dist/{chunk-D2TOWEYH.js.map → chunk-TUIN4MB7.js.map} +0 -0
- /package/dist/{chunk-LQDUHU3Y.js.map → chunk-TX3VECZU.js.map} +0 -0
- /package/dist/{chunk-TG7DADJR.js.map → chunk-TXLIEOJX.js.map} +0 -0
- /package/dist/{chunk-2ZVRJRXC.js.map → chunk-U3DN4HEY.js.map} +0 -0
- /package/dist/{chunk-PSMAWRPL.js.map → chunk-U7XM7CB4.js.map} +0 -0
- /package/dist/{chunk-4TQL3WP2.js.map → chunk-UJK53QFL.js.map} +0 -0
- /package/dist/{chunk-RBRX5ZS3.js.map → chunk-UMTXA2TH.js.map} +0 -0
- /package/dist/{chunk-36MIDGAH.js.map → chunk-UPDSXFK5.js.map} +0 -0
- /package/dist/{chunk-OYXBFSGK.js.map → chunk-UTIAXH52.js.map} +0 -0
- /package/dist/{chunk-5WUN7XPD.js.map → chunk-UVN5TMHU.js.map} +0 -0
- /package/dist/{chunk-UYE47LO6.js.map → chunk-VGYXW3VG.js.map} +0 -0
- /package/dist/{chunk-IKUNOX7F.js.map → chunk-VS7AHPCZ.js.map} +0 -0
- /package/dist/{chunk-MYUFMVCH.js.map → chunk-VTTAJOQ7.js.map} +0 -0
- /package/dist/{chunk-K63HGHZX.js.map → chunk-VWPOLUAO.js.map} +0 -0
- /package/dist/{chunk-GA4YEAMX.js.map → chunk-X3MWB2QU.js.map} +0 -0
- /package/dist/{chunk-I36GSRUJ.js.map → chunk-X6KAJI3V.js.map} +0 -0
- /package/dist/{chunk-IKMUFDVS.js.map → chunk-XBLRHV5R.js.map} +0 -0
- /package/dist/{chunk-XOSQP3YA.js.map → chunk-XDFP2LMW.js.map} +0 -0
- /package/dist/{chunk-MW7Y3T55.js.map → chunk-XEQMZB3C.js.map} +0 -0
- /package/dist/{chunk-B3LMRTRF.js.map → chunk-XEYLT5VA.js.map} +0 -0
- /package/dist/{chunk-UI4HI5QK.js.map → chunk-XHIQ5I6N.js.map} +0 -0
- /package/dist/{chunk-U6M4LS3M.js.map → chunk-XLH7QY2R.js.map} +0 -0
- /package/dist/{chunk-OSA5EQG5.js.map → chunk-XWFAMUZQ.js.map} +0 -0
- /package/dist/{chunk-6MT3HHUB.js.map → chunk-Y4OBB2VN.js.map} +0 -0
- /package/dist/{chunk-CZP5QXNB.js.map → chunk-YCVD6CI3.js.map} +0 -0
- /package/dist/{chunk-APW4T4SW.js.map → chunk-YENLNISG.js.map} +0 -0
- /package/dist/{chunk-JWPA6ZPZ.js.map → chunk-YIRVLKAX.js.map} +0 -0
- /package/dist/{chunk-LQ62ECE6.js.map → chunk-YL73CVNK.js.map} +0 -0
- /package/dist/{chunk-ILKDYBON.js.map → chunk-YLS6QE5G.js.map} +0 -0
- /package/dist/{chunk-YBKVGLQR.js.map → chunk-YPWU5KPE.js.map} +0 -0
- /package/dist/{chunk-IKJLSBUI.js.map → chunk-YQXTDZSU.js.map} +0 -0
- /package/dist/{chunk-TPMZBOFH.js.map → chunk-YSJEAAOL.js.map} +0 -0
- /package/dist/{chunk-W3BFRR2G.js.map → chunk-YWIFM7D7.js.map} +0 -0
- /package/dist/{chunk-WTJ4PLMU.js.map → chunk-YWVI6ZMK.js.map} +0 -0
- /package/dist/{chunk-5KWMYPJV.js.map → chunk-Z4FMAFNH.js.map} +0 -0
- /package/dist/{chunk-W5OWKVZG.js.map → chunk-Z654FWNU.js.map} +0 -0
- /package/dist/{chunk-5FH5LQVS.js.map → chunk-Z7Y523PS.js.map} +0 -0
- /package/dist/{chunk-HLL4PBO7.js.map → chunk-ZD67RM6G.js.map} +0 -0
- /package/dist/{chunk-IVYJX3OY.js.map → chunk-ZEG4VPBL.js.map} +0 -0
- /package/dist/{chunk-K6R5T44I.js.map → chunk-ZLYCOBHW.js.map} +0 -0
- /package/dist/{chunk-VADHIT26.js.map → chunk-ZNJ5MTXV.js.map} +0 -0
- /package/dist/{chunk-2KYQC4T5.js.map → chunk-ZSGY3H53.js.map} +0 -0
- /package/dist/{chunk-BKP43KK4.js.map → chunk-ZTPXACWB.js.map} +0 -0
- /package/dist/{chunk-JCY4CMDH.js.map → chunk-ZUA3JMI6.js.map} +0 -0
- /package/dist/{chunk-IGVVXLKJ.js.map → chunk-ZYAZUPPV.js.map} +0 -0
- /package/dist/{computer-viewer-LPZ763KF.js.map → computer-viewer-TDDO25AV.js.map} +0 -0
- /package/dist/{embedded-new-voice-YVMKSLKJ.js.map → embedded-new-voice-2G3VLPVQ.js.map} +0 -0
- /package/dist/{embedded-voice-BJPQFXSU.js.map → embedded-voice-T5IWOWGD.js.map} +0 -0
- /package/dist/{fleet-decision-row-AA4H5CDT.js.map → fleet-decision-row-WM64KXP3.js.map} +0 -0
- /package/dist/{model-policy-picker-menu-HSMWVO4P.js.map → model-policy-picker-menu-SMC6J6QN.js.map} +0 -0
- /package/dist/{payment-page-card-3LTSFJGN.js.map → payment-page-card-G4U63KUV.js.map} +0 -0
- /package/dist/{platform-activity-row-5VYV6TX4.js.map → platform-activity-row-BUZGZAKZ.js.map} +0 -0
- /package/dist/{queue-surface-implementation-NXHZUKD2.js.map → queue-surface-implementation-4KUZ4PJV.js.map} +0 -0
- /package/dist/{sandbox-files-YCMLQUFU.js.map → sandbox-files-ESDMOFSD.js.map} +0 -0
- /package/dist/{session-connect-cards-KSQLMRM5.js.map → session-connect-cards-Q53KMMYY.js.map} +0 -0
- /package/dist/{session-realtime-ZR6JLG3Y.js.map → session-realtime-CF3I35WJ.js.map} +0 -0
- /package/dist/{timeline-annotation-markers-YAHDPWVG.js.map → timeline-annotation-markers-CJK4RYZ4.js.map} +0 -0
- /package/dist/{timeline-annotation-selection-KHXNCEJP.js.map → timeline-annotation-selection-67GF5H26.js.map} +0 -0
- /package/dist/{timeline-annotations-dialog-Y4XD3N7B.js.map → timeline-annotations-dialog-ONJPQDJQ.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/app/routes/session.tsx","../src/app/routes/session-capability-oauth-return.ts","../src/app/lib/session-composer-readiness.ts","../src/app/lib/use-descendant-requests-refresh.ts","../src/app/lib/session-failure-toasts.ts","../src/app/lib/session-route-placement.ts","../src/app/lib/find-shortcut.ts","../src/app/lib/codex-model-switch.ts"],"sourcesContent":["import { t } from \"../lib/console-text\";\nimport { Fragment } from \"react\";\nimport {\n createSessionRetainedScreenshotLoader,\n createWorkspaceRetainedArtifactLoader,\n createWorkspaceRetainedVideoLoader,\n} from \"../../timeline\";\nimport { isModelUnavailableSubmissionError, type CreditRefusalKind } from \"../../lib/format\";\nimport { inertProps } from \"../../lib/inert\";\nimport { retainedImageId } from \"../../components/markdown\";\nimport { LazyPart } from \"../../components/lazy-part\";\nimport { useConnectionAccounts } from \"../components/capabilities/use-connection-accounts\";\nimport {\n stopOwnLoginsHere,\n turnOnOwnLoginsHere,\n} from \"../components/capabilities/own-login-turned-on\";\nimport {\n OwnLoginsSharedHeadsUp,\n ownLoginsInUse,\n} from \"../components/capabilities/own-logins-shared-heads-up\";\nimport { sessionAuthRecommendation } from \"../../session-auth-recommendation\";\nimport { completeSessionCapabilityOAuth } from \"../components/capabilities/attach-session-capability\";\nimport { finishMcpCapabilityOAuthReturn } from \"./session-capability-oauth-return\";\nimport { loadSessionFeedback } from \"../../session-feedback-model\";\nimport {\n browserInteractiveAnswerStore,\n InteractiveAnswerProvider,\n} from \"../../interactive-answer-model\";\nimport { turnRatingsFromFeedback } from \"../../session-feedback-model\";\nimport { PersonalResourceAttachmentSurface } from \"../components/personal-resource-attachment-surface\";\nimport { useReadSessionInbox } from \"../lib/inbox\";\nimport { useWorkspaceMachines } from \"../lib/use-workspace-machines\";\nimport {\n useSessionComposerDelivery,\n useSessionSendGate,\n type SessionSendState,\n} from \"../lib/session-composer-readiness\";\nimport { isEditableArtifactKind } from \"../lib/artifact-catalog\";\nimport type { NativeConnectRequest } from \"../components/capabilities/native-connect-setup\";\nimport { FailureRecoveryBoundary } from \"../components/session/failure-recovery-boundary\";\nimport { useMessageSenderRenderer } from \"../components/session/message-senders\";\nimport {\n createFailedSessionRetry,\n type FailedSessionRetryInput,\n} from \"../lib/failed-session-retry\";\nimport { useSessionStartupTimeline } from \"../../lib/session-startup-timeline\";\nimport { useComposerWithStreamState } from \"../../lib/use-calm-service-failure\";\nimport {\n chatComposerPlaceholder,\n failedSessionCopy,\n failureFallbackReason,\n} from \"../lib/failed-session-copy\";\nimport { coveredModelChoice, creditRefusalGap, freeCreditGap } from \"../lib/free-credit-gap\";\nimport { ChatPaymentPages } from \"../components/chat-payment-pages\";\nimport { creditRefusalRecord, type CreditRefusalRecord } from \"../lib/model-access\";\nimport { timelineShowsFailure } from \"../lib/timeline-failure-owner\";\nimport { sessionDisplayTitle } from \"../lib/session-rename\";\nimport { waitingDescendants } from \"../lib/descendant-requests\";\nimport {\n useDescendantRequestsRefresh,\n useLineagePollInterval,\n} from \"../lib/use-descendant-requests-refresh\";\nimport { useStreamHealthTelemetry } from \"../lib/stream-health\";\nimport { markIntegrationConnectRedirect } from \"../lib/integration-connect-redirect\";\nimport { noteTurnFailureAction } from \"../lib/turn-failure-actions\";\nimport { observeSessionTurnEvents } from \"../lib/analytics-observer\";\nimport { needsSandboxRecoveryCheck } from \"../lib/sandbox-failure\";\nimport {\n admissionRecheckControl,\n admissionControlNeedsRefresh,\n recheckSessionAdmission,\n SessionAdmissionNotice,\n} from \"../components/session/session-admission-notice\";\nimport {\n sessionAdmissionNeedsDifferentMachine,\n sessionAdmissionReason,\n} from \"../../session-admission-model\";\nimport {\n connectorSelectionUpdate,\n followWorkspaceConnectorPolicy,\n sessionConnectorPolicyIsCustomized,\n} from \"../lib/composer-connectors\";\n// The session view — live timeline plus one compact prompt queue above the\n// composer. Enter queues and Cmd/Ctrl+Enter steers; failed sessions stay\n// honest (reason + retry history) and revivable from the same composer.\nimport { LightboxProvider } from \"../../timeline\";\nimport { connectorLogo, connectorLogoIndex } from \"../../timeline/connector-logo-index\";\nimport {\n promptSendDestination,\n sessionAdmissionBlocked,\n sessionDisplayStatus,\n sessionTurnKeepsRunControl,\n} from \"../../session-status-model\";\nimport { useSessionSecrets } from \"../../hooks/use-vaults\";\nimport { useQueuedPromptRecall } from \"../../hooks/use-queued-prompt-recall\";\nimport type { WorkspaceTab } from \"../../components/workspace-dock\";\nimport {\n SessionSecretsMenuBody,\n sessionSecretsSummary,\n} from \"../components/secrets/session-secrets-panel\";\nimport { MACHINES_SESSION_POLL_MS } from \"../../machines\";\nimport {\n ApprovalSurface,\n ToolActionReviewDetails,\n MessageTimeline,\n ToolReviewHistoryProvider,\n SessionChrome,\n KnowledgeActivityProvider,\n LearningRefusalActionsProvider,\n OpenGeniLinkProvider,\n type LearningRefusalPlace,\n type TimelineSearchTarget,\n} from \"../../session-ui\";\nimport type { SessionSearchRoute } from \"../lib/session-search-route\";\nimport { OPEN_CONVERSATION_FIND_EVENT } from \"../lib/conversation-find-event\";\nimport {\n OPEN_SESSION_USAGE_LIMIT_EVENT,\n goalPausedAtUsageLimit,\n lineageHasRunningSession,\n sessionUsageLimitCapability,\n usageLimitRefusalFromState,\n useSessionUsageLimit,\n} from \"../lib/session-usage-limit\";\nimport { SessionUsageLimitNotice } from \"../../usage\";\nimport { isSessionUsageLimitSubmissionError } from \"../../lib/format\";\nimport { OpenGeniSessionUsageLimitReachedError } from \"@opengeni/sdk/browser\";\nimport { SESSION_USAGE_LIMIT_GOAL_PAUSED_REASON } from \"@opengeni/sdk/session-usage-limits\";\nimport { expireArtifactCatalog } from \"../lib/artifact-catalog-cache\";\nimport { useArtifactCatalogMutationInvalidation } from \"../lib/use-artifact-catalog-mutation-invalidation\";\nimport {\n creditExhaustedFromEvents,\n creditRefusalFromEvents,\n conversationTimeline,\n approvalsDecidable,\n projectPendingApprovals,\n useComposer,\n useFileAttachments,\n useGoal,\n useHumanInputRequests,\n useSession,\n useSessionEvents,\n useSessionLineage,\n useTurnQueue,\n type AgentMessageItem,\n type AuthNeededItem,\n type PendingApproval,\n type OlderHistoryLoader,\n type TimelineItem,\n type UserMessageItem,\n} from \"../../session\";\nimport { sessionAgentsSignal } from \"../../session-agents-model\";\nimport { useNavigate, usePage, useRouterState } from \"../lib/navigation\";\nimport {\n BotIcon,\n BugIcon,\n Loader2Icon,\n MenuIcon,\n MessagesSquareIcon,\n PanelsTopLeftIcon,\n} from \"lucide-react\";\nimport {\n createElement,\n lazy,\n Suspense,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { toast } from \"../lib/toast\";\n\nimport { useAppApi } from \"../lib/app-api\";\nimport { useSessionFailureToasts } from \"../lib/session-failure-toasts\";\nimport { apiErrorFacts, userErrorText } from \"../../ui/api-error\";\nimport { ConsoleComposer } from \"../components/Composer\";\nimport { CONSOLE_TIMELINE_ALLOWANCE_LABELS } from \"../lib/allowance-labels\";\nimport { WorkspaceComposerPlus as ComposerMobilePlus } from \"../components/workspace-composer-plus\";\nimport {\n SessionRunsOnMenuBody,\n SessionMachinePickerAction,\n useSessionRunsOn,\n} from \"../components/session/sandbox-switcher\";\nimport {\n currentSessionMachineAccess,\n SessionMachineAccessNotice,\n} from \"../components/session/session-machine-access-notice\";\nimport { LoadingPanel, ProblemPanel } from \"../components/common\";\nimport { useHostMessageContext, useReportSessionState } from \"../lib/app-host\";\nimport { useSessionUiFeature } from \"../lib/session-ui-features\";\nimport { useSessionOpening } from \"../lib/session-opening\";\nimport { creationHandoffReconciled } from \"../lib/session-creation-handoff\";\nimport { FollowUpRepositoryMenuBody } from \"../components/follow-up-repository-picker\";\nimport { MarkdownText } from \"../components/markdown\";\nimport { ModelPicker, type SessionToolSelection } from \"../components/pickers\";\nimport {\n TerminalSessionArchive,\n TerminalSessionBanner,\n UserMessageBody,\n} from \"../components/session/banners\";\nimport { HumanInputDelegationRecord } from \"../components/session/human-input-delegation-record\";\nimport {\n ReadOnlySessionNotice,\n sessionReadOnlyArchive,\n} from \"../components/session/session-retention\";\nimport { useRail } from \"../components/rail/rail-context\";\nimport { sessionComputeLabel } from \"../../sandbox-label-model\";\nimport { useBackgroundAttentionTitle } from \"../lib/background-attention-title\";\nimport { ChatViewportFileDropTarget } from \"../components/session/chat-viewport-file-drop-target\";\nimport { sessionInputWait } from \"../lib/session-rail\";\nimport { SessionWorkspace } from \"../components/session/sandbox-workspace\";\nimport { ArtifactLinkBoundary } from \"../components/session/artifact-link-boundary\";\nimport { Button } from \"../../ui/button\";\nimport { EmptyState } from \"../../ui/empty-state\";\nimport {\n createSessionEventFeedStore,\n useAppContext,\n type SessionCreationHandoff,\n} from \"../app-context\";\nimport { useLiveSessionEvents } from \"../../hooks/use-live-session-events\";\nimport {\n sessionRouteAppState,\n sessionRouteCreationHandoff,\n type SessionRoutePlacement,\n} from \"../lib/session-route-placement\";\nimport { SessionStartupProvider } from \"../../lib/session-startup\";\nimport { useFindShortcut } from \"../lib/find-shortcut\";\nimport type { InitialComposerDraft } from \"../../hooks/use-composer\";\nimport { cn } from \"../lib/utils\";\nimport { useBrowserAccountBridgeBlocker } from \"../lib/browser-account-bridge\";\nimport type {\n SessionEditableArtifactSummary,\n SessionEditableArtifactsStatus,\n} from \"../components/session/editable-artifacts-workspace\";\nimport { startMcpOAuthWithTimeout } from \"../lib/mcp-oauth\";\nimport { useSessionRouteMemory } from \"../lib/last-session-memory\";\nimport {\n canConnectWorkspaceMcpFromChat,\n hasAccountPermission,\n hasWorkspacePermission,\n} from \"../lib/permissions\";\nimport { secretSaveTargets } from \"../lib/secrets-ui\";\nimport { chatLearningScope } from \"../lib/chat-learning-scope\";\nimport { currentModelRecovery } from \"../lib/model-recovery\";\nimport { ModelRecoveryNotice } from \"../components/session/model-recovery-notice\";\nimport { isPersonalWorkspace } from \"../lib/managed-self-context\";\nimport {\n isTerminalSessionStatus,\n projectSessionTimeline,\n summarizeSessionFailure,\n} from \"../lib/events\";\nimport {\n EMPTY_COMPOSER_LAUNCH,\n composerLaunchSearchAfterPolicyApply,\n composerLaunchSearchKey,\n type ComposerLaunchSearch,\n} from \"../lib/composer-launch\";\nimport { connectableSubscriptions, isDeploymentFreeModel } from \"../lib/deployment-free-model\";\nimport {\n effortOptionsForModel,\n findPickerRow,\n runnableLatencyModesForModel,\n} from \"../lib/model-policy\";\nimport { sessionTimelineEmptyStateCopy } from \"../lib/session-empty-state\";\nimport {\n isCodexUsageLimitFailure,\n latestTurnFailedOnUsageLimit,\n sessionModelMissingFromCatalog,\n unavailableModelName,\n unavailableModelReplacement,\n} from \"../lib/unavailable-session-model\";\nimport { UnavailableModelNotice } from \"../components/session/unavailable-model-notice\";\nimport {\n CodexUsageNotice,\n ModelSwitchHeadsUp,\n type CodexUsageChoice,\n} from \"../components/session/codex-usage-notice\";\nimport { isCodexProductModel } from \"../lib/session-model\";\nimport { useCodexUsageModelSwitch } from \"../lib/use-codex-usage-model-switch\";\nimport {\n CONTEXT_CHECKPOINT_EVENT_TYPES,\n codexUsageContinueAtResetAction,\n codexUsageContinuesAtReset,\n codexUsageNoticeApplies,\n codexUsageResetText,\n codexUsageResetsAt,\n codexWaitIsUsageLimit,\n latestCheckpointIsCompaction,\n modelSwitchHeadsUpText,\n needsModelSwitchHeadsUp,\n} from \"../lib/codex-model-switch\";\nimport {\n consumeSessionComposerFocusIntent,\n FOCUS_SESSION_COMPOSER_EVENT,\n focusSessionComposerWhenReady,\n sessionComposerFocusIntentIsEligible,\n type SessionComposerFocusIntent,\n} from \"../lib/session-focus\";\nimport {\n applySessionAttentionProjection,\n updateLocalSessionDeliveryAttention,\n notifySessionAttentionChanged,\n sessionAttentionReadThroughSequence,\n sessionReadProjectionKey,\n shouldAcknowledgeActiveSession,\n shouldProjectActiveSessionRead,\n} from \"../lib/session-attention\";\nimport {\n mergeSessionContextProjection,\n mergeSessionDetailReadProjection,\n} from \"../lib/session-pins\";\nimport {\n readSessionDockNavigation,\n sessionDockLayoutStorageId,\n updateSessionDockNavigation,\n} from \"../lib/session-dock-preferences\";\nimport { useWorkspaceAppLinkResolver } from \"../lib/session-artifact-navigation\";\nimport {\n clientFirstPartyMcpToolPolicy,\n firstPartySessionToolOptionsFor,\n sessionPolicyPickerIds,\n} from \"../lib/session-tools\";\nimport { resolveWorkspaceBusySend, stableJson } from \"@opengeni/contracts\";\nimport { connectProviderAcceptsRequestedScopes } from \"@opengeni/contracts/connect\";\nimport { useFollowUpRepositories } from \"../lib/use-follow-up-repositories\";\nimport type { ChatSendContext } from \"../components/capabilities/session-github-repositories\";\nimport { githubAppConnectRequest } from \"../lib/github-app-connect\";\nimport {\n clearGitHubInstallRequest,\n recordGitHubInstallRequest,\n} from \"../lib/github-install-request\";\nimport {\n useFixedRigScope,\n usePersonalResourceAttachment,\n} from \"../lib/use-personal-resource-attachment\";\nimport { personalMachineUseIntent } from \"../lib/personal-resource-attachments\";\nimport { isPersonalMachine, moveChatToMachine } from \"../lib/move-chat-to-machine\";\nimport type { MachineView } from \"../../machines\";\nimport { useWorkspaceModelCatalog } from \"../lib/use-workspace-model-catalog\";\nimport type {\n McpElicitationAnswer,\n LineageNode,\n SessionRealtimeModel,\n UpdateSessionToolPolicyRequest,\n} from \"@opengeni/sdk\";\nimport type { ConnectionMetadata, Session, SessionEvent } from \"../types\";\nimport { useUiEventTarget } from \"../lib/ui-events\";\nimport { FORK_CURRENT_CHAT_EVENT } from \"../lib/actions/events\";\nimport { usePortalContainer } from \"../../ui/portal-container\";\nimport { sessionHasPendingWake, withLineageAutomationFacts } from \"../../session-list-model\";\n\nconst InlineChatArtifact = lazy(() =>\n import(\"../components/artifacts/retained-file-preview\").then((module) => ({\n default: module.InlineChatArtifact,\n })),\n);\nconst ChatInteractiveBlock = lazy(() =>\n import(\"../components/artifacts/chat-interactive-block\").then((module) => ({\n default: module.ChatInteractiveBlock,\n })),\n);\n\nconst HumanInputSurface = lazy(() => import(\"../components/session/human-input\"));\nconst DescendantRequests = lazy(() => import(\"../components/session/descendant-requests\"));\nconst SessionSkillReviews = lazy(() =>\n import(\"../components/session/session-skill-reviews\").then((module) => ({\n default: module.SessionSkillReviews,\n })),\n);\nconst SessionCommands = lazy(() =>\n import(\"../../session-ui\").then((module) => ({ default: module.SessionCommands })),\n);\n\nconst SessionCapabilityCard = lazy(async () => ({\n default: (await import(\"../components/capabilities/session-capability-card\"))\n .SessionCapabilityCard,\n}));\n\nconst NativeConnectSetup = lazy(() =>\n import(\"../components/capabilities/native-connect-setup\").then((module) => ({\n default: module.NativeConnectSetup,\n })),\n);\n\nconst MessageForkDialog = lazy(() =>\n import(\"../components/session/session-tenancy-control\").then((module) => ({\n default: module.SessionTenancyRouteControl,\n })),\n);\n\nconst MessageActions = lazy(() => import(\"../components/session/message-actions\"));\nconst ConversationFind = lazy(() => import(\"../components/session/conversation-find\"));\nconst EMPTY_SEARCH_TARGET: SessionSearchRoute = {};\n\nconst SubagentTree = lazy(() =>\n import(\"../components/session/subagents\").then((module) => ({ default: module.SubagentTree })),\n);\n\nconst LazyFailedSessionBanner = lazy(() =>\n import(\"../components/session/failed-session-banner\").then((module) => ({\n default: module.FailedSessionBanner,\n })),\n);\n\n// Only a refused Send shows it, so it stays out of the direct session bundle.\nconst LazyCreditRefusalNotice = lazy(() =>\n import(\"../components/credits/credit-refusal-notice\").then((module) => ({\n default: module.CreditRefusalNotice,\n })),\n);\n// Add credits from the chat opens checkout here; paying returns to this chat.\nconst LazyCreditTopupPrompt = lazy(() =>\n import(\"../components/credit-required-prompt\").then((module) => ({\n default: module.CreditRequiredPrompt,\n })),\n);\n\nconst LazyAgentConfigurationPanel = lazy(() =>\n import(\"../components/session/agent-configuration-panel\").then(({ AgentConfigurationPanel }) => ({\n default: AgentConfigurationPanel,\n })),\n);\nconst LazySessionInspector = lazy(() =>\n import(\"../components/session/inspector\").then(({ SessionInspector }) => ({\n default: SessionInspector,\n })),\n);\n\nconst LazySessionEditableArtifactsWorkspace = lazy(() =>\n import(\"../components/session/editable-artifacts-workspace\").then(\n ({ SessionEditableArtifactsWorkspace }) => ({\n default: SessionEditableArtifactsWorkspace,\n }),\n ),\n);\n\nconst LazyCodexRealtimeControl = lazy(() =>\n import(\"../../realtime\").then(({ SessionRealtimeControl }) => ({\n default: SessionRealtimeControl,\n })),\n);\n\nconst LazySessionRouteAuxiliary = lazy(\n () => import(\"../components/session/session-tenancy-control\"),\n);\n\nexport function SessionRoute({\n workspaceId,\n sessionId,\n launch = EMPTY_COMPOSER_LAUNCH,\n realtimeAutostartModel,\n searchTarget = EMPTY_SEARCH_TARGET,\n placement = \"page\",\n onEvent,\n messageContext,\n creationHandoff: givenCreationHandoff,\n initialDraft,\n onNewSession,\n onRealtimeAutostartConsumed,\n}: {\n workspaceId: string;\n sessionId: string;\n launch?: ComposerLaunchSearch | undefined;\n realtimeAutostartModel?: SessionRealtimeModel | undefined;\n searchTarget?: SessionSearchRoute | undefined;\n /**\n * `panel`: this chat sits beside another view (the Site view) in a narrow\n * panel, so it uses narrower gutters and is not remembered as the last\n * session route. Whatever else differs is the host's: it turns off the\n * session panel with `SessionUiFeaturesOff` and passes the callbacks below.\n */\n placement?: SessionRoutePlacement | undefined;\n /** Each event newer than the loaded history, in order. */\n onEvent?: ((event: SessionEvent) => void) | undefined;\n /** The host view's per-message model context, read at send time. */\n messageContext?: (() => string | undefined) | undefined;\n /** A conversation the host view just created, shown at once with its first prompt. */\n creationHandoff?: SessionCreationHandoff | null | undefined;\n /** What the person typed in the host view's new-chat composer while it was created. */\n initialDraft?: InitialComposerDraft | undefined;\n /** Start a new chat; defaults to the new-chat page. */\n onNewSession?: (() => void) | undefined;\n /** The voice call a new chat asked for has started; defaults to dropping it from the address. */\n onRealtimeAutostartConsumed?: (() => void) | undefined;\n}) {\n const uiEvents = useUiEventTarget(\"document\");\n const dockEnabled = useSessionUiFeature(\"dock\");\n useReadSessionInbox(sessionId);\n const context = useAppContext();\n const routed = placement === \"page\";\n const rail = useRail();\n const navigate = useNavigate();\n const page = usePage();\n const consumeRealtimeAutostart = useCallback(() => {\n if (onRealtimeAutostartConsumed) {\n onRealtimeAutostartConsumed();\n return;\n }\n void navigate({\n to: \"/workspaces/$workspaceId/sessions/$sessionId\",\n params: { workspaceId, sessionId },\n search: {},\n replace: true,\n });\n }, [navigate, onRealtimeAutostartConsumed, sessionId, workspaceId]);\n // The session-search origin only labels the navigation that opened the find\n // bar. Drop it once the bar closes so a reload or shared link starts plain.\n const hasSearchOrigin = searchTarget.searchOrigin === \"session-search\";\n const consumeSearchOrigin = useCallback(() => {\n if (!hasSearchOrigin) return;\n void navigate({\n to: \"/workspaces/$workspaceId/sessions/$sessionId\",\n params: { workspaceId, sessionId },\n search: ({ searchOrigin: _searchOrigin, ...rest }) => rest,\n replace: true,\n });\n }, [hasSearchOrigin, navigate, sessionId, workspaceId]);\n\n // Session record + live event log via @opengeni/react. Fresh opens load a\n // bounded tail, then stream live events with resume-by-sequence.\n const {\n events,\n timeline: eventTimeline,\n sessionStatus,\n sessionStatusSequence,\n connectionState,\n initialLoading,\n initialHistoryReady,\n hasOlder,\n loadingOlder,\n loadOlder,\n hasNewer,\n loadingNewer,\n loadNewer,\n loadingOldest,\n loadOldest,\n jumpToLatest,\n jumpToSequence,\n error: streamError,\n } = useSessionEvents(sessionId);\n // Consented funnel telemetry: a session this page started reached its first\n // completed turn. Only event types are inspected.\n useEffect(() => observeSessionTurnEvents(sessionId, events), [events, sessionId]);\n useLiveSessionEvents(sessionId, events, initialHistoryReady, onEvent);\n // The embedding host follows the open chat from this stream.\n // A chat in a panel beside another view isn't the page's open chat.\n useReportSessionState({ sessionId, status: sessionStatus, events, initialLoading }, routed);\n const sessionDetailReadOwner = useRef<object>({});\n const beginSessionDetailRead = useCallback(\n () =>\n context.sessionChannelProjectionAuthority.beginDetailRead(sessionDetailReadOwner.current, {\n id: sessionId,\n workspaceId,\n }),\n [context.sessionChannelProjectionAuthority, sessionId, workspaceId],\n );\n const {\n session: fetchedSession,\n error: loadError,\n readRevision: sessionReadRevision,\n readGeneration: sessionReadGeneration,\n refresh: refreshSession,\n } = useSession(sessionId, {\n events,\n beginRead: beginSessionDetailRead,\n });\n // \"Back to sessions\" from Settings reopens this session (see last-session-memory).\n const restoredSessionId = useRouterState({\n select: (state) => state.location.state.restoredSessionId,\n });\n const leaveRestoredSession = useCallback(() => {\n void navigate({\n to: \"/workspaces/$workspaceId/sessions\",\n params: { workspaceId },\n replace: true,\n });\n }, [navigate, workspaceId]);\n const leavingRestoredSession = useSessionRouteMemory({\n subjectId: context.accessContext.subjectId,\n workspaceId,\n sessionId,\n openedSessionId: fetchedSession?.id ?? null,\n loadError,\n restoredSessionId,\n leave: leaveRestoredSession,\n enabled: routed,\n });\n useEffect(\n () => () =>\n context.sessionChannelProjectionAuthority.finishDetailReads(sessionDetailReadOwner.current),\n [context.sessionChannelProjectionAuthority, sessionId, workspaceId],\n );\n useEffect(() => {\n if (loadError) {\n context.sessionChannelProjectionAuthority.finishDetailReads(sessionDetailReadOwner.current);\n }\n }, [context.sessionChannelProjectionAuthority, loadError]);\n const creationHandoff = sessionRouteCreationHandoff({\n sessionId,\n given: givenCreationHandoff,\n app: context.sessionCreationHandoff,\n appSession: context.session,\n routed,\n });\n const pendingCreationHandoff = creationHandoffReconciled(creationHandoff, events)\n ? null\n : creationHandoff;\n // Queue + goal share the timeline's event stream — one SSE connection total.\n const queue = useTurnQueue(sessionId, { events });\n const goal = useGoal(sessionId, { events });\n const humanInput = useHumanInputRequests(sessionId, { events });\n const sessionSeed = fetchedSession ?? creationHandoff?.session ?? null;\n const session = useMemo(\n () =>\n sessionSeed\n ? {\n ...sessionSeed,\n // Old idle events must not overwrite a fresh queued/claimed detail read.\n status:\n (sessionStatusSequence ?? 0) > sessionSeed.lastSequence\n ? (sessionStatus ?? sessionSeed.status)\n : sessionSeed.status,\n effectiveControl: queue.effectiveControl ?? sessionSeed.effectiveControl,\n }\n : null,\n [queue.effectiveControl, sessionSeed, sessionStatus, sessionStatusSequence],\n );\n // Background-tab cue: mark the title when this open session settles for the user.\n useBackgroundAttentionTitle(sessionId, session?.status ?? null);\n // Dispatch retries update their durable ledger without timeline events. Read\n // that evidence only while this visible session is queued, with no overlapping\n // requests, so a moving retry schedule cannot masquerade as active execution.\n const waitingForDispatch =\n session?.status === \"queued\" &&\n session.activeTurnId === null &&\n session.effectiveControl.state === \"active\";\n useEffect(() => {\n if (!waitingForDispatch) return;\n let stopped = false;\n let timer: ReturnType<typeof setTimeout>;\n const refresh = async () => {\n try {\n if (document.visibilityState === \"visible\") await refreshSession();\n } finally {\n if (!stopped) timer = setTimeout(() => void refresh(), 15_000);\n }\n };\n timer = setTimeout(() => void refresh(), 15_000);\n return () => {\n stopped = true;\n clearTimeout(timer);\n };\n }, [waitingForDispatch, sessionId, refreshSession]);\n // /clear-view: a LOCAL, this-device-only collapse of the transcript. It hides\n // every event at or before the sequence seen when the operator ran it; the\n // server log is untouched and newer events (higher sequence) keep streaming\n // in. Reset when the session identity changes so a new session starts clean.\n // null = never cleared (distinct from \"cleared at sequence 0\"): clearing an\n // empty stream still latches, so the initial-message fallback is suppressed\n // and any later events stay hidden up to the cleared sequence.\n const [viewClearedAfter, setViewClearedAfter] = useState<number | null>(null);\n useEffect(() => {\n setViewClearedAfter(null);\n }, [sessionId]);\n const clearView = useCallback(() => {\n const latestSequence = events.reduce((max, event) => Math.max(max, event.sequence), 0);\n setViewClearedAfter(latestSequence);\n }, [events]);\n const visibleEvents = useMemo(\n () =>\n viewClearedAfter !== null\n ? events.filter((event) => event.sequence > viewClearedAfter)\n : events,\n [events, viewClearedAfter],\n );\n const { opened, hasObservedHistory } = useSessionOpening(\n `${workspaceId}:${sessionId}`,\n Boolean(session && (initialHistoryReady || pendingCreationHandoff)),\n events.length > 0,\n );\n const timeline = useMemo(() => {\n if (!session) {\n return [];\n }\n // While the tail window is still being fetched, render nothing rather than\n // projectSessionTimeline's initial-message fallback — on a large session\n // that fallback painted the GENESIS message at the top for the whole fetch\n // (user-reported). The fallback is only for genuinely-empty NEW sessions,\n // i.e. after the load settles with no events. Once real history was seen,\n // clearing the window for a reload (including failure) is never genesis.\n if (\n (!opened || initialLoading || hasObservedHistory) &&\n visibleEvents.length === 0 &&\n !pendingCreationHandoff\n ) {\n return [];\n }\n const projected = projectSessionTimeline(\n session,\n visibleEvents,\n pendingCreationHandoff?.clientEventId,\n viewClearedAfter === null ? eventTimeline : undefined,\n );\n // projectSessionTimeline falls back to the session's initial message when\n // the projection is empty; after a clear-view that fallback would resurrect\n // the very first message, so suppress it once the view has been cleared.\n return viewClearedAfter !== null && visibleEvents.length === 0 ? [] : projected;\n }, [\n pendingCreationHandoff,\n session,\n visibleEvents,\n viewClearedAfter,\n opened,\n initialLoading,\n hasObservedHistory,\n eventTimeline,\n ]);\n // Only approvals still awaiting a decision: the durable log replays every\n // historical `session.requiresAction`, so subtract decisions and finished\n // turns instead of rendering decided approvals as live buttons forever.\n const approvals = useMemo(() => projectPendingApprovals(events), [events]);\n // Credit death is sneaky: the engine can end the turn as a NOMINALLY\n // completed one (segmentLimit budget_exhausted), leaving the session idle and\n // healthy-looking. Track the terminal credit state from the last turn-end so\n // the banner shows for idle-but-broke sessions too, not only failed ones.\n const creditExhausted = useMemo(() => creditExhaustedFromEvents(events), [events]);\n // The one fix (own-key fee or API use) that stop names, from the same turn end.\n const creditRefusal = useMemo(() => creditRefusalFromEvents(events), [events]);\n const failure = useMemo(\n () =>\n session && (session.status === \"failed\" || creditExhausted)\n ? summarizeSessionFailure(\n events,\n session.status,\n session.failureDiagnostics,\n session.lastSequence,\n )\n : null,\n [events, session, creditExhausted],\n );\n\n // Keep the workspace header (title, status badge, connection pill) in sync.\n // A chat in a panel beside another view (the Site view) isn't the page's\n // open chat: the header, the sidebar's projections and the command menu\n // keep following the page, so it keeps its state to itself.\n const [panelEventFeed] = useState(createSessionEventFeedStore);\n const { client, captureWorkspaceInvocation, ownsWorkspaceInvocation } = context;\n const {\n setSession: setContextSession,\n setConnectionState: setContextConnectionState,\n sessionEventFeedStore,\n } = sessionRouteAppState(placement, context, panelEventFeed);\n const acknowledgedProjectionRef = useRef<string | null>(null);\n const confirmedProjectionRef = useRef<string | null>(null);\n const retriedProjectionRef = useRef<string | null>(null);\n const [foreground, setForeground] = useState(() => ({\n documentVisible: document.visibilityState === \"visible\",\n windowFocused: document.hasFocus(),\n }));\n const [attentionRetryRevision, setAttentionRetryRevision] = useState(0);\n const reconciledSessionRead = useRef<{\n sessionId: string;\n revision: number;\n } | null>(null);\n useEffect(() => {\n if (!fetchedSession || sessionReadRevision === 0) return;\n if (\n reconciledSessionRead.current?.sessionId === sessionId &&\n reconciledSessionRead.current.revision === sessionReadRevision\n ) {\n return;\n }\n reconciledSessionRead.current = {\n sessionId,\n revision: sessionReadRevision,\n };\n const accepted = context.sessionChannelProjectionAuthority.recordRead(\n fetchedSession,\n sessionReadGeneration,\n );\n setContextSession((current) =>\n mergeSessionDetailReadProjection(\n current,\n fetchedSession,\n context.sessionChannelProjectionAuthority,\n sessionReadGeneration,\n accepted,\n ),\n );\n }, [\n context.sessionChannelProjectionAuthority,\n fetchedSession,\n sessionId,\n sessionReadGeneration,\n sessionReadRevision,\n setContextSession,\n ]);\n useEffect(() => {\n setContextSession((current) =>\n mergeSessionContextProjection(\n current,\n session,\n context.sessionChannelProjectionAuthority,\n \"live\",\n ),\n );\n }, [context.sessionChannelProjectionAuthority, session, setContextSession]);\n useEffect(() => {\n const reconcileForeground = () => {\n setForeground({\n documentVisible: document.visibilityState === \"visible\",\n windowFocused: document.hasFocus(),\n });\n };\n window.addEventListener(\"focus\", reconcileForeground);\n window.addEventListener(\"blur\", reconcileForeground);\n document.addEventListener(\"visibilitychange\", reconcileForeground);\n return () => {\n window.removeEventListener(\"focus\", reconcileForeground);\n window.removeEventListener(\"blur\", reconcileForeground);\n document.removeEventListener(\"visibilitychange\", reconcileForeground);\n };\n }, []);\n const projectSessionAttention = useCallback(\n (projection: Parameters<typeof notifySessionAttentionChanged>[0]) => {\n notifySessionAttentionChanged(projection);\n setContextSession((current) =>\n current?.id === projection.id\n ? applySessionAttentionProjection(current, projection)\n : current,\n );\n },\n [setContextSession],\n );\n // Raw token/progress batches do not create unread attention. Acknowledge\n // completed output or an actionable boundary, rather than every stream flush.\n const attentionThroughSequence = useMemo(\n () => sessionAttentionReadThroughSequence(events),\n [events],\n );\n const readThroughSequence = Math.max(session?.lastSequence ?? 0, attentionThroughSequence);\n const activeReadProjectionKey = session\n ? sessionReadProjectionKey(session.id, readThroughSequence)\n : null;\n const routeUnreadProjection = useMemo(\n () =>\n session\n ? {\n ...session,\n unread: session.unread || readThroughSequence > session.lastSequence,\n }\n : null,\n [readThroughSequence, session],\n );\n useLayoutEffect(() => {\n if (!session || !activeReadProjectionKey) return;\n if (\n confirmedProjectionRef.current === activeReadProjectionKey ||\n !shouldProjectActiveSessionRead({\n activeSessionId: sessionId,\n workspaceId,\n session: routeUnreadProjection,\n ...foreground,\n })\n ) {\n return;\n }\n\n const optimisticProjection = {\n id: session.id,\n workspaceId: session.workspaceId,\n unread: false,\n ...(session.attentionVersion !== undefined\n ? { attentionVersion: session.attentionVersion }\n : {}),\n lastSequence: readThroughSequence,\n };\n projectSessionAttention(optimisticProjection);\n }, [\n activeReadProjectionKey,\n foreground,\n projectSessionAttention,\n readThroughSequence,\n routeUnreadProjection,\n session,\n sessionId,\n workspaceId,\n ]);\n const acknowledgementSessionId = session?.id ?? null;\n const acknowledgementEligible = shouldAcknowledgeActiveSession({\n activeSessionId: sessionId,\n workspaceId,\n session: routeUnreadProjection,\n ...foreground,\n });\n // Same-value list/focus projections must not invalidate an in-flight retry.\n useEffect(() => {\n const projectionKey = activeReadProjectionKey;\n if (\n !acknowledgementSessionId ||\n !projectionKey ||\n acknowledgedProjectionRef.current === projectionKey ||\n !acknowledgementEligible\n ) {\n return;\n }\n let active = true;\n const acceptedTransition = captureWorkspaceInvocation(workspaceId);\n if (!acceptedTransition) return;\n acknowledgedProjectionRef.current = projectionKey;\n void client\n .updateSessionAttention(workspaceId, acknowledgementSessionId, {\n unread: false,\n acknowledgedThroughSequence: readThroughSequence,\n })\n .then((updated) => {\n if (!ownsWorkspaceInvocation(workspaceId, acceptedTransition)) return;\n confirmedProjectionRef.current = projectionKey;\n // The rail owns separately polled page objects. Keep this exact\n // frontier result there so a stale list poll cannot resurrect or\n // prematurely clear the unread dot.\n projectSessionAttention(updated);\n })\n .catch(() => {\n // Retry one transient failure for this exact frontier. Keeping the\n // receipt after the second failure prevents a permanent 4xx/5xx from\n // becoming an unbounded request and log loop.\n if (\n active &&\n ownsWorkspaceInvocation(workspaceId, acceptedTransition) &&\n acknowledgedProjectionRef.current === projectionKey &&\n retriedProjectionRef.current !== projectionKey\n ) {\n retriedProjectionRef.current = projectionKey;\n acknowledgedProjectionRef.current = null;\n setAttentionRetryRevision((revision) => revision + 1);\n return;\n }\n // A transient failure must never resurrect a dot the user already\n // cleared. Release the attempt receipt so a later focus/navigation\n // can retry this exact frontier; a reload still reads durable truth\n // if both attempts failed.\n if (acknowledgedProjectionRef.current === projectionKey) {\n acknowledgedProjectionRef.current = null;\n }\n });\n return () => {\n active = false;\n };\n }, [\n acknowledgementEligible,\n acknowledgementSessionId,\n attentionRetryRevision,\n activeReadProjectionKey,\n captureWorkspaceInvocation,\n client,\n ownsWorkspaceInvocation,\n projectSessionAttention,\n readThroughSequence,\n workspaceId,\n ]);\n useEffect(() => {\n setContextConnectionState(connectionState);\n }, [connectionState, setContextConnectionState]);\n // Content-free operational signal; see lib/stream-health.ts.\n useStreamHealthTelemetry(\"session\", connectionState);\n useEffect(() => {\n sessionEventFeedStore.set({ sessionId, events });\n }, [events, sessionId, sessionEventFeedStore]);\n useEffect(\n () => () => {\n setContextSession(null);\n setContextConnectionState(\"idle\");\n if (sessionEventFeedStore.getSnapshot()?.sessionId === sessionId) {\n sessionEventFeedStore.set(null);\n }\n },\n [sessionId, sessionEventFeedStore, setContextConnectionState, setContextSession],\n );\n useSessionFailureToasts(loadError, streamError);\n // A reconnect OAuth round-trip lands back here (the reconnect card set\n // returnPath to this session). The connection is refreshed server-side, but\n // the original tool call was settled as an error and is never replayed. Strip\n // the params and tell the user to start a new turn.\n const oauthReturnHandled = useRef(false);\n const capabilityClient = context.client;\n const capabilityCatalog = context.workspaceCapabilityCatalog;\n const capabilityCatalogReady = context.workspaceMcpCatalogReady;\n const refreshCapabilityCatalog = context.refreshWorkspaceMcpServers;\n useEffect(() => {\n if (oauthReturnHandled.current || !capabilityCatalogReady) {\n return;\n }\n const params = page.readQuery();\n const outcome = params.get(\"integration_oauth\");\n if (!outcome) {\n return;\n }\n oauthReturnHandled.current = true;\n page.replaceQuery(new URLSearchParams());\n const capabilityId = params.get(\"capability_auth\");\n if (outcome !== \"success\") {\n // The failure copy loads only on this path, keeping it out of the route.\n void import(\"../lib/oauth-callback-messages\").then(({ mcpOAuthCallbackFailureMessage }) =>\n toast.error(\"Reconnect failed\", {\n description: mcpOAuthCallbackFailureMessage(params.get(\"stage\"), params.get(\"reason\")),\n }),\n );\n return;\n }\n if (!capabilityId) {\n toast.success(\"Connection restored\", {\n description: \"The earlier tool call wasn't replayed. Send a new message to try again.\",\n });\n return;\n }\n void (async () => {\n const finished = await finishMcpCapabilityOAuthReturn({\n client: capabilityClient,\n workspaceId,\n sessionId,\n capabilityId,\n params,\n catalog: capabilityCatalog,\n refreshCatalog: refreshCapabilityCatalog,\n });\n toast.success(`${finished.name} connected`, {\n description: finished.needsPersonalReview\n ? \"Review its connection card to allow your personal account in this conversation.\"\n : \"It is available to new tool calls in this session.\",\n });\n })().catch((error) => {\n toast.error(\"Connection succeeded, but setup needs attention\", {\n description: userErrorText(error),\n });\n });\n }, [\n page,\n capabilityCatalog,\n capabilityCatalogReady,\n capabilityClient,\n refreshCapabilityCatalog,\n workspaceId,\n sessionId,\n ]);\n\n const nativeReturnHandled = useRef(false);\n useEffect(() => {\n if (nativeReturnHandled.current || !capabilityCatalogReady) return;\n const params = page.readQuery();\n const social = params.get(\"social_oauth\");\n const fiken = params.get(\"fiken\");\n if (!social && !fiken) return;\n nativeReturnHandled.current = true;\n page.replaceQuery(new URLSearchParams());\n if (social === \"success\" || fiken === \"connected\") {\n const capabilityId = params.get(\"capability_auth\");\n void (async () => {\n await refreshCapabilityCatalog(workspaceId);\n await completeSessionCapabilityOAuth(\n t,\n capabilityClient,\n workspaceId,\n sessionId,\n capabilityId,\n );\n toast.success(\"Connection setup completed\", {\n description: \"It is available to new tool calls in this session.\",\n });\n })().catch((error) =>\n toast.error(\"Connection authorized, but setup needs attention\", {\n description: userErrorText(error),\n }),\n );\n } else {\n toast.error(\"Connection wasn't completed\", {\n description: \"You can retry from the connection card.\",\n });\n }\n }, [\n page,\n capabilityCatalogReady,\n capabilityClient,\n refreshCapabilityCatalog,\n workspaceId,\n sessionId,\n ]);\n\n const githubReturnHandled = useRef(false);\n useEffect(() => {\n if (githubReturnHandled.current) return;\n const params = page.readQuery();\n const outcome = params.get(\"github\");\n if (outcome !== \"connected\" && outcome !== \"requested\") return;\n githubReturnHandled.current = true;\n page.replaceQuery(new URLSearchParams());\n if (outcome === \"requested\") {\n // A non-owner asked their GitHub organization owners to approve the app.\n recordGitHubInstallRequest(workspaceId);\n toast.success(\"Request sent to your GitHub organization owners\", {\n description:\n \"After an owner approves, an owner of the organization connects it here. Your GitHub card updates on its own.\",\n });\n return;\n }\n clearGitHubInstallRequest(workspaceId);\n toast.success(\"GitHub connected\", {\n description: \"Repository access is now available to new tool calls in this session.\",\n });\n }, [page, workspaceId]);\n\n // Start the recovery flow for a lapsed connection surfaced inline in the\n // timeline. OAuth connections reconnect in place (reuse the connectionId) and\n // return to this session; api-key ones can't OAuth, so hand off to credential\n // re-entry on the capabilities sheet for that provider. Throwing bubbles a\n // calm inline error on the reconnect card.\n const reconnectTransport = useMemo(() => context.client.connectTransport(), [context.client]);\n const [reconnectRequest, setReconnectRequest] = useState<NativeConnectRequest | null>(null);\n // The account whose card in this chat opened each reconnect: once it is\n // done, the agent continues the request that stopped, as after a first\n // setup. Kept per request, since a reconnect can finish after its dialog\n // closed and another one opened.\n const reconnectCardConnections = useRef(new WeakMap<NativeConnectRequest, string>());\n // Workspace GitHub App setup from the follow-up repository menu uses this\n // route-level Connect dialog: the menu closes when GitHub's authorization\n // popup takes focus, which would unmount a dialog hosted inside it.\n const connectGitHubApp = useCallback(() => {\n setReconnectRequest(githubAppConnectRequest(workspaceId, reconnectTransport, page.href()));\n }, [page, reconnectTransport, workspaceId]);\n const connectPersonalGitHub = context.connectPersonalGitHub;\n const reconnectPersonalGitHub = context.reconnectPersonalGitHub;\n const personalGitHubConnection = context.personalGitHubStatus?.connection ?? null;\n // An existing connection that needs reauthorization reconnects; otherwise connect.\n const personalGitHubNeedsReconnect =\n personalGitHubConnection !== null &&\n personalGitHubConnection.status !== \"active\" &&\n personalGitHubConnection.status !== \"revoked\";\n const onReconnect = useCallback(\n async (item: AuthNeededItem) => {\n if (item.authoritySource === \"host\") {\n if (!item.authorizationUrl) {\n throw new Error(\n \"This connection is managed by the embedding host and has no recovery link.\",\n );\n }\n page.assign(item.authorizationUrl);\n return;\n }\n if (item.connectionId) {\n const { findConnectRecoveryAccount } = await import(\"@opengeni/connect\");\n const account = findConnectRecoveryAccount(\n await reconnectTransport.accounts(workspaceId),\n item.connectionId,\n );\n if (account) {\n const request: NativeConnectRequest = {\n scope: { workspaceId, transport: reconnectTransport },\n providerId: account.providerId,\n ownership: account.ownership,\n reconnectAccountId: account.id,\n // A tool needed more access than the account was connected with:\n // the reconnect asks the provider for exactly that (incremental consent).\n // Other providers keep their fixed permission set.\n ...(item.reason === \"insufficient_scope\" &&\n item.scopes.length > 0 &&\n connectProviderAcceptsRequestedScopes(account.providerId)\n ? { requestedScopes: [...item.scopes] }\n : {}),\n displayName: account.label,\n returnUrl: page.href(),\n idempotencyKey: crypto.randomUUID(),\n };\n reconnectCardConnections.current.set(request, item.connectionId);\n setReconnectRequest(request);\n return;\n }\n }\n if (item.capability) {\n const returnPath = `${new URL(page.href()).pathname}?capability_auth=${encodeURIComponent(item.capability.id)}`;\n if (item.capability.id === \"api:github-app\") {\n const status = await context.client.getGitHubApp(workspaceId, {\n returnPath,\n });\n if (status.status === \"bound\") {\n toast.success(\"GitHub is already connected\");\n return;\n }\n if (!status.linkUrl) {\n throw new Error(\n status.configured\n ? \"Your account cannot manage this workspace's GitHub connection.\"\n : \"GitHub is not configured on this deployment.\",\n );\n }\n await markIntegrationConnectRedirect(\"github\", \"app_install\");\n page.assign(status.linkUrl);\n return;\n }\n if (item.capability.id === \"api:github-personal\") {\n await (personalGitHubNeedsReconnect ? reconnectPersonalGitHub : connectPersonalGitHub)(\n workspaceId,\n );\n return;\n }\n if (item.capability.id === \"mcp:codex_apps\") {\n page.assign(`/workspaces/${encodeURIComponent(workspaceId)}/settings`);\n return;\n }\n const catalogItem = context.workspaceCapabilityCatalog.find(\n (candidate) => candidate.id === item.capability?.id,\n );\n const canInstall = canConnectWorkspaceMcpFromChat(\n context.accessContext,\n workspaceId,\n catalogItem,\n context.workspaceMemberIntegrationSetup,\n );\n const mcpUrl = catalogItem?.mcpUrl ?? catalogItem?.endpointUrl ?? null;\n if (\n canInstall &&\n catalogItem?.kind === \"mcp\" &&\n catalogItem.authKind === \"oauth2\" &&\n mcpUrl\n ) {\n const response = await startMcpOAuthWithTimeout(context.client, workspaceId, {\n mcpUrl,\n ...(catalogItem.providerDomain ? { providerDomain: catalogItem.providerDomain } : {}),\n ownership: \"workspace\",\n returnPath,\n });\n if (!response.authorizationUrl) {\n throw new Error(\"The provider did not return an authorization link.\");\n }\n await markIntegrationConnectRedirect({ domain: mcpUrl }, \"oauth\");\n page.assign(response.authorizationUrl);\n return;\n }\n page.assign(\n `/workspaces/${encodeURIComponent(workspaceId)}/capabilities?suggested_capability=${encodeURIComponent(item.capability.id)}`,\n );\n return;\n }\n if (item.serverId === \"codex_apps\") {\n // Codex Apps is authorized by the designated workspace subscription,\n // not by the generic connection broker. Send the user to the existing\n // Codex subscription control instead of starting a meaningless OAuth\n // flow for chatgpt.com.\n page.assign(`/workspaces/${encodeURIComponent(workspaceId)}/settings`);\n return;\n }\n const connections = await context.client\n .listConnections(workspaceId)\n .catch(() => [] as ConnectionMetadata[]);\n const connection = item.connectionId\n ? (connections.find((candidate) => candidate.id === item.connectionId) ?? null)\n : null;\n if (connection?.kind === \"api_key\") {\n page.assign(\n `/workspaces/${encodeURIComponent(workspaceId)}/capabilities?reconnect_domain=${encodeURIComponent(item.providerDomain)}`,\n );\n return;\n }\n const pageUrl = new URL(page.href());\n const returnPath = `${pageUrl.pathname}${pageUrl.search}`;\n const response = await context.client.startConnectionOAuth(workspaceId, {\n providerDomain: item.providerDomain,\n ...(item.connectionId ? { connectionId: item.connectionId } : {}),\n ...(item.resource ? { resource: item.resource } : {}),\n returnPath,\n });\n if (!response.authorizationUrl) {\n throw new Error(\"The provider did not return an authorization link.\");\n }\n await markIntegrationConnectRedirect({ domain: item.providerDomain }, \"oauth\");\n page.assign(response.authorizationUrl);\n },\n [\n page,\n context.accessContext,\n context.client,\n connectPersonalGitHub,\n reconnectPersonalGitHub,\n personalGitHubNeedsReconnect,\n context.workspaceCapabilityCatalog,\n context.workspaceMemberIntegrationSetup,\n workspaceId,\n reconnectTransport,\n ],\n );\n\n // The workspace shell already needs the capability catalog for session tool\n // policy. Reuse that authoritative read for timeline logos instead of\n // downloading the same large catalog again from the session route.\n const providerLogos = useMemo(\n () =>\n connectorLogoIndex(context.workspaceCapabilityCatalog, (path) =>\n context.client.catalogAssetUrl(path ?? null),\n ),\n [context.client, context.workspaceCapabilityCatalog],\n );\n const resolveProviderLogo = useCallback(\n (domain: string) => connectorLogo(providerLogos, domain),\n [providerLogos],\n );\n // One lineage read feeds the single composer-anchored agents surface. Events\n // refresh it instantly on spawn/worker-completion, list hints on child-side\n // status changes, and a poll (faster when hints are unavailable) ensures the\n // pill's \"running\" count doesn't go stale on CHILD-side status changes that\n // emit no event on this parent's feed. Must sit above the loading/error\n // early-returns — it's a hook, so it has to run unconditionally on every render.\n const lineagePoll = useLineagePollInterval(workspaceId);\n const lineage = useSessionLineage(sessionId, {\n events,\n pollIntervalMs: lineagePoll.pollIntervalMs,\n });\n const agentNodes = useMemo(() => lineage.lineage?.children ?? [], [lineage.lineage]);\n const observeLineageTree = lineagePoll.observeTree;\n useEffect(() => observeLineageTree(agentNodes), [agentNodes, observeLineageTree]);\n // Sub-sessions waiting on the person surface on this page: list hints that\n // name one, and this agent answering one, re-read the tree.\n const descendantRefreshSignal = useDescendantRequestsRefresh({\n client: context.client,\n workspaceId,\n sessionId,\n events,\n nodes: agentNodes,\n refreshLineage: lineage.refresh,\n });\n // The same lineage read names the agents the timeline spawns, messages, and\n // hears from (parent and descendants), following renames.\n const lineageTitles = useMemo(() => {\n const titles = new Map<string, string>();\n for (const ancestor of lineage.lineage?.ancestors ?? []) {\n titles.set(ancestor.id, sessionDisplayTitle(ancestor));\n }\n const visit = (nodes: readonly LineageNode[]) => {\n for (const node of nodes) {\n titles.set(node.session.id, sessionDisplayTitle(node.session));\n visit(node.children);\n }\n };\n visit(lineage.lineage?.children ?? []);\n return titles;\n }, [lineage.lineage]);\n const resolveSessionTitle = useCallback(\n (agentSessionId: string) => lineageTitles.get(agentSessionId) ?? null,\n [lineageTitles],\n );\n const sandboxFileRequestSeq = useRef(0);\n const [sandboxFileRequest, setSandboxFileRequest] = useState<{\n path: string;\n line?: number | undefined;\n requestId: number;\n } | null>(null);\n useEffect(() => {\n setSandboxFileRequest(null);\n }, [sessionId]);\n const setInspectorOpen = context.setInspectorOpen;\n // Composer + > Chat settings opens the dock's Agent tab at its Agent learning;\n // the header menu and the usage limit notice open it at Usage limit.\n const agentSettingsRequestSeq = useRef(0);\n const [agentSettingsRequest, setAgentSettingsRequest] = useState<{\n sessionId: string;\n requestId: number;\n target: \"learning\" | \"usage-limit\";\n } | null>(null);\n const openAgentSettings = useCallback(() => {\n setAgentSettingsRequest({\n sessionId,\n requestId: ++agentSettingsRequestSeq.current,\n target: \"learning\",\n });\n setInspectorOpen(true);\n }, [sessionId, setInspectorOpen]);\n const openUsageLimit = useCallback(() => {\n setAgentSettingsRequest({\n sessionId,\n requestId: ++agentSettingsRequestSeq.current,\n target: \"usage-limit\",\n });\n setInspectorOpen(true);\n }, [sessionId, setInspectorOpen]);\n useEffect(() => {\n uiEvents.addEventListener(OPEN_SESSION_USAGE_LIMIT_EVENT, openUsageLimit);\n return () => uiEvents.removeEventListener(OPEN_SESSION_USAGE_LIMIT_EVENT, openUsageLimit);\n }, [openUsageLimit, uiEvents]);\n const openSandboxFile = useCallback(\n (path: string, line?: number) => {\n setSandboxFileRequest({\n path,\n line,\n requestId: ++sandboxFileRequestSeq.current,\n });\n setInspectorOpen(true);\n },\n [setInspectorOpen],\n );\n\n // Keep the same pending canvas through detail and the first history read.\n // A freshly sent creation handoff already has visible conversation truth.\n // Never paint the genesis message or mount a second loading treatment first.\n if (!session || !opened) {\n if (leavingRestoredSession) return <LoadingPanel />;\n if (!session && loadError) {\n return (\n <Suspense fallback={<LoadingPanel />}>\n <LazySessionRouteAuxiliary\n workspaceId={workspaceId}\n sessionId={sessionId}\n loadError={loadError}\n onRetry={() => void refreshSession()}\n />\n </Suspense>\n );\n }\n return (\n <div className=\"flex min-h-0 w-full min-w-0 flex-1 overflow-hidden\">\n <SessionDock\n workspaceId={workspaceId}\n sessionId={sessionId}\n session={null}\n events={events}\n connectionState={connectionState}\n primary={\n session && streamError && !initialLoading ? (\n <ProblemPanel\n title=\"Conversation couldn't be loaded\"\n description=\"Your saved messages are unchanged. Try loading them again.\"\n action={\n <Button variant=\"outline\" onClick={() => void jumpToLatest()}>\n Retry conversation\n </Button>\n }\n />\n ) : (\n <LoadingPanel />\n )\n }\n onReloadSession={refreshSession}\n dockCollapsed={!context.inspectorOpen}\n onDockCollapsedChange={(collapsed) => context.setInspectorOpen(!collapsed)}\n openFileRequest={sandboxFileRequest}\n onOpenNavigation={() => {\n context.setInspectorOpen(false);\n rail.setDrawerOpen(true);\n }}\n />\n </div>\n );\n }\n\n const chatPane = (\n <SessionChatPane\n key={session.id}\n session={session}\n admissionSessionControl={sessionSeed?.effectiveControl ?? session.effectiveControl}\n events={events}\n timeline={timeline}\n searchTarget={searchTarget}\n onJumpToSequence={jumpToSequence}\n initialLoading={initialLoading}\n historyReloadFailed={hasObservedHistory && events.length === 0 && !!streamError}\n launch={launch}\n realtimeAutostartModel={realtimeAutostartModel}\n onRealtimeAutostartConsumed={consumeRealtimeAutostart}\n onSearchOriginConsumed={consumeSearchOrigin}\n placement={placement}\n messageContext={messageContext}\n initialDraft={initialDraft}\n approvals={approvals}\n humanInput={humanInput}\n failure={failure}\n creditExhausted={creditExhausted}\n creditRefusal={creditRefusal}\n goal={goal}\n queue={queue}\n agentNodes={agentNodes}\n pendingWake={sessionHasPendingWake(withLineageAutomationFacts(session, lineage.lineage))}\n descendantRefreshSignal={descendantRefreshSignal}\n onDescendantResolved={() => void lineage.refresh()}\n hasOlder={hasOlder}\n loadingOlder={loadingOlder}\n onLoadOlder={loadOlder}\n hasNewer={hasNewer}\n loadingNewer={loadingNewer}\n onLoadNewer={loadNewer}\n loadingOldest={loadingOldest}\n onJumpToStart={loadOldest}\n onJumpToLatest={jumpToLatest}\n onClearView={clearView}\n resolveSessionTitle={resolveSessionTitle}\n onOpenSession={(nextSessionId) =>\n void navigate({\n to: \"/workspaces/$workspaceId/sessions/$sessionId\",\n params: { workspaceId, sessionId: nextSessionId },\n })\n }\n onMemoryClick={(memoryId) =>\n void navigate({\n to: \"/workspaces/$workspaceId/memory\",\n params: { workspaceId },\n search: { memory: memoryId },\n })\n }\n onLearningRefusalOpen={(place) => {\n switch (place.kind) {\n case \"skill\":\n // The Skills page opens one Skill from its raw `open` parameter.\n void navigate({\n href: `/workspaces/${encodeURIComponent(workspaceId)}/plugins?section=skills&open=${encodeURIComponent(`skill:${place.skillId}`)}`,\n });\n return;\n case \"skills\":\n void navigate({\n to: \"/workspaces/$workspaceId/plugins\",\n params: { workspaceId },\n search: { section: \"skills\" },\n });\n return;\n case \"instructions\":\n void navigate({\n to: \"/workspaces/$workspaceId/state\",\n params: { workspaceId },\n search: { view: \"instructions\" },\n });\n return;\n case \"knowledge\":\n void navigate({ to: \"/workspaces/$workspaceId/state\", params: { workspaceId } });\n return;\n case \"learning-settings\":\n void navigate({\n to: \"/workspaces/$workspaceId/settings\",\n params: { workspaceId },\n search: { section: \"learning\" },\n });\n }\n }}\n onNewSession={\n onNewSession ??\n (() =>\n void navigate({\n to: \"/workspaces/$workspaceId/sessions\",\n params: { workspaceId },\n }))\n }\n onContinueInNewSession={() =>\n void navigate({\n to: \"/workspaces/$workspaceId/sessions\",\n params: { workspaceId },\n search: { continueSessionId: sessionId },\n })\n }\n onApprove={(approvalId, answer) => approve(approvalId, \"approve\", answer)}\n onReject={(approvalId) => approve(approvalId, \"reject\")}\n onReconnect={onReconnect}\n onConnectGitHubApp={connectGitHubApp}\n resolveProviderLogo={resolveProviderLogo}\n onReloadSession={refreshSession}\n // A file link opens the session panel's Files tab; without the panel it is plain text.\n onOpenSandboxFile={dockEnabled ? openSandboxFile : undefined}\n // Both open the session panel's Agent tab; without the panel, neither shows.\n onOpenAgentSettings={dockEnabled ? openAgentSettings : undefined}\n onOpenUsageLimit={dockEnabled ? openUsageLimit : undefined}\n connectionState={connectionState}\n />\n );\n\n const routeView = (\n <div className=\"flex min-h-0 w-full min-w-0 flex-1 overflow-hidden\">\n {reconnectRequest && (\n <LazyPart fallback={<LoadingPanel label=\"Opening connection setup\" />}>\n <NativeConnectSetup\n transport={reconnectTransport}\n workspaceId={workspaceId}\n request={reconnectRequest}\n onClose={() => setReconnectRequest(null)}\n onComplete={() => {\n // Setup can finish after its dialog closed: leave a newer one open.\n setReconnectRequest((current) => (current === reconnectRequest ? null : current));\n if (reconnectRequest.providerId === \"github-app\") {\n toast.success(\"GitHub connected\");\n void context.refreshGitHub(workspaceId, undefined, {\n sync: true,\n userInitiated: true,\n });\n return;\n }\n // Same continuation as after a first setup from a card: the\n // server checks the account now has what its card asked for,\n // wakes the agent at most once per card, and not at all once\n // the person has written since. Never fails the finished setup.\n const connectionId = reconnectCardConnections.current.get(reconnectRequest);\n if (connectionId)\n void Promise.resolve()\n .then(() =>\n context.client.continueAfterCapabilitySetup(workspaceId, sessionId, {\n connectionId,\n }),\n )\n .catch(() => undefined);\n toast.success(\"Connection updated\", {\n description: \"New tool calls can use the updated connection.\",\n });\n }}\n />\n </LazyPart>\n )}\n <SessionDock\n workspaceId={workspaceId}\n sessionId={sessionId}\n session={session}\n events={events}\n connectionState={connectionState}\n primary={\n <ChatPaymentPages\n accountId={\n session?.accountId ??\n context.workspaces.find((candidate) => candidate.id === workspaceId)?.accountId\n }\n >\n {chatPane}\n </ChatPaymentPages>\n }\n onReloadSession={refreshSession}\n dockCollapsed={!context.inspectorOpen}\n onDockCollapsedChange={(collapsed) => context.setInspectorOpen(!collapsed)}\n openFileRequest={sandboxFileRequest}\n openAgentSettingsRequest={\n agentSettingsRequest?.sessionId === sessionId ? agentSettingsRequest : null\n }\n onOpenNavigation={() => {\n context.setInspectorOpen(false);\n rail.setDrawerOpen(true);\n }}\n />\n </div>\n );\n // The shell times the page's open chat; a panel chat times its own start, so\n // its \"starting\" and \"retrying\" rows show too.\n return routed ? (\n routeView\n ) : (\n <SessionStartupProvider session={session}>{routeView}</SessionStartupProvider>\n );\n\n async function approve(\n approvalId: string,\n decision: \"approve\" | \"reject\",\n answer?: McpElicitationAnswer,\n ) {\n try {\n await context.client.sendApprovalDecision(workspaceId, sessionId, {\n approvalId,\n decision,\n ...answer,\n });\n } catch (error) {\n toast.error(\"Couldn't submit the decision\", {\n description: userErrorText(error),\n });\n throw error instanceof Error ? error : new Error(String(error));\n }\n }\n}\n\n/** The embedding page's and the host view's per-message context, as a send extra. */\nfunction withHostMessageContext(\n ...sources: ReadonlyArray<(() => string | undefined) | undefined>\n): {\n modelContext?: string;\n} {\n const value = sources\n .map((source) => source?.())\n .filter((part): part is string => Boolean(part))\n .join(\"\\n\\n\");\n return value ? { modelContext: value } : {};\n}\n\n/** The latest agent-settings change, and whether a turn has started since. */\nfunction lastAgentChange(events: readonly SessionEvent[]): { at: string; pending: boolean } | null {\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const event = events[index]!;\n if (event.type !== \"session.agent.updated\") continue;\n const pending = !events.slice(index + 1).some((later) => later.type === \"turn.started\");\n return { at: event.occurredAt, pending };\n }\n return null;\n}\n\n/**\n * The resizable Workspace dock: chat on the left, a collapsible/maximizable dock\n * on the right with the capability-gated sandbox surfaces (Files |\n * Terminal | Desktop) + Debug. Replaces the old fixed 390px aside.\n */\ntype SessionDockProps = {\n workspaceId: string;\n sessionId: string;\n session: Session | null;\n events: SessionEvent[];\n connectionState: ReturnType<typeof useSessionEvents>[\"connectionState\"];\n primary: React.ReactNode;\n onReloadSession: () => Promise<void>;\n dockCollapsed: boolean;\n onDockCollapsedChange: (collapsed: boolean) => void;\n onOpenNavigation: () => void;\n openFileRequest?:\n | {\n path: string;\n line?: number | null | undefined;\n requestId: number;\n }\n | null\n | undefined;\n /** Open the Agent tab at Agent learning or Usage limit. A new requestId reopens it. */\n openAgentSettingsRequest?:\n | { requestId: number; target: \"learning\" | \"usage-limit\" }\n | null\n | undefined;\n};\n\n/** The chat with the session panel beside it, or the chat alone when the surface has no panel. */\nfunction SessionDock(props: SessionDockProps) {\n if (!useSessionUiFeature(\"dock\")) {\n return (\n <div className=\"flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden\">{props.primary}</div>\n );\n }\n return <SessionDockPanel {...props} />;\n}\n\nfunction SessionDockPanel(props: SessionDockProps) {\n const context = useAppContext();\n // One request sequence for every tab the host opens (an artifact, the Agent\n // tab): the dock ignores a requestId it has already handled.\n const tabRequestSeq = useRef(0);\n const [tabRequest, setTabRequest] = useState<{\n sessionId: string;\n tab: string;\n requestId: number;\n } | null>(null);\n const agentSettingsRequestId = props.openAgentSettingsRequest?.requestId ?? null;\n const agentSettingsTarget = props.openAgentSettingsRequest?.target ?? \"learning\";\n const [agentLearningFocus, setAgentLearningFocus] = useState(0);\n const [usageLimitFocus, setUsageLimitFocus] = useState(0);\n useEffect(() => {\n if (agentSettingsRequestId === null) return;\n setTabRequest({\n sessionId: props.sessionId,\n tab: \"agent\",\n requestId: ++tabRequestSeq.current,\n });\n if (agentSettingsTarget === \"usage-limit\") setUsageLimitFocus((value) => value + 1);\n else setAgentLearningFocus((value) => value + 1);\n // oxlint-disable-next-line react-hooks/exhaustive-deps -- the target travels with its request\n }, [agentSettingsRequestId, props.sessionId]);\n const goalPausedAtLimit = useMemo(() => goalPausedAtUsageLimit(props.events), [props.events]);\n const currentTabRequest = tabRequest?.sessionId === props.sessionId ? tabRequest : null;\n const dockLayoutStorageId = sessionDockLayoutStorageId(\n context.accessContext.subjectId,\n props.sessionId,\n );\n const dockNavigation = useMemo(\n () => readSessionDockNavigation(dockLayoutStorageId),\n [dockLayoutStorageId],\n );\n const rememberArtifact = useCallback(\n (artifactId: string | null) => updateSessionDockNavigation(dockLayoutStorageId, { artifactId }),\n [dockLayoutStorageId],\n );\n // The workbench (Changes | Files | Terminal | Desktop + machine chip) lives in\n // the package now; the app injects durable artifacts and Debug around it.\n // Heavy editor/runtime code stays lazy until the user opens the tab.\n // Tool output may have published a file or Site, here or in a sub-session;\n // the end of a turn settles everything. Either re-reads the chat's artifacts.\n const artifactRefreshSequence = useMemo(() => {\n for (let index = props.events.length - 1; index >= 0; index -= 1) {\n const event = props.events[index];\n if (\n event &&\n (event.type === \"agent.toolCall.output\" ||\n event.type === \"turn.completed\" ||\n event.type === \"turn.failed\" ||\n event.type === \"turn.cancelled\")\n ) {\n return event.sequence;\n }\n }\n return 0;\n }, [props.events]);\n // Let the Artifacts page show its cached rows on the next visit but refetch them.\n useEffect(() => {\n if (artifactRefreshSequence) expireArtifactCatalog(context.client, props.workspaceId);\n }, [artifactRefreshSequence, context.client, props.workspaceId]);\n const artifactState = useSessionEditableArtifactSummaries({\n workspaceId: props.workspaceId,\n sessionId: props.sessionId,\n refreshSequence: artifactRefreshSequence,\n });\n const expireAfterArtifactMutation = useArtifactCatalogMutationInvalidation(\n context.client,\n props.workspaceId,\n expireArtifactCatalog,\n );\n const [artifactRequest, setArtifactRequest] = useState<{\n sessionId: string;\n artifactId: string;\n artifactKind?: SessionEditableArtifactSummary[\"modality\"] | undefined;\n requestId: number;\n tab: string;\n } | null>(null);\n const currentArtifactRequest =\n artifactRequest?.sessionId === props.sessionId ? artifactRequest : null;\n const artifactTabRequestId = currentArtifactRequest?.requestId ?? null;\n useEffect(() => {\n if (artifactTabRequestId === null) return;\n setTabRequest({\n sessionId: props.sessionId,\n tab: \"artifacts\",\n requestId: ++tabRequestSeq.current,\n });\n }, [artifactTabRequestId, props.sessionId]);\n const artifactSummaries = [...artifactState.artifacts];\n // A just-published artifact may be linked before discovery refresh completes, or\n // belong to another session in this workspace. The viewer still authorizes its read.\n if (\n currentArtifactRequest &&\n !artifactSummaries.some(\n (item) =>\n item.id === currentArtifactRequest.artifactId &&\n (!currentArtifactRequest.artifactKind ||\n item.modality === currentArtifactRequest.artifactKind ||\n (currentArtifactRequest.artifactKind === \"file\" && item.modality === \"image\")),\n )\n ) {\n artifactSummaries.push({\n id: currentArtifactRequest.artifactId,\n modality: currentArtifactRequest.artifactKind ?? \"site\",\n title:\n currentArtifactRequest.artifactKind === \"image\"\n ? \"Image\"\n : currentArtifactRequest.artifactKind === \"file\"\n ? \"File\"\n : \"Site\",\n });\n }\n const trailingTabs: WorkspaceTab[] = [\n {\n id: \"artifacts\",\n label: \"Artifacts\",\n icon: <PanelsTopLeftIcon />,\n ...(artifactSummaries.length > 0\n ? {\n badge: (\n <span className=\"rounded-og-xs bg-og-accent-soft px-1 text-og-xs text-og-fg-muted\">\n {artifactSummaries.length}\n </span>\n ),\n }\n : {}),\n content: (\n <LazyPart fallback={<LoadingPanel label=\"Opening artifact\" />}>\n <LazySessionEditableArtifactsWorkspace\n key={props.sessionId}\n workspaceId={props.workspaceId}\n sessionId={props.sessionId}\n artifacts={artifactSummaries}\n status={artifactState.status}\n onRetry={artifactState.retry}\n initialSelectedArtifactId={dockNavigation.artifactId}\n openArtifactRequest={currentArtifactRequest}\n onSelectedArtifactIdChange={rememberArtifact}\n onPin={\n hasWorkspacePermission(context.accessContext, props.workspaceId, \"artifacts:publish\")\n ? async (item, pinned) => {\n await context.client.updateArtifactPin(\n props.workspaceId,\n item.kind,\n item.id,\n pinned,\n );\n artifactState.applyPin(item.kind, item.id, pinned);\n expireAfterArtifactMutation();\n artifactState.retry();\n }\n : undefined\n }\n />\n </LazyPart>\n ),\n },\n ];\n if (props.session) {\n trailingTabs.push({\n id: \"agent\",\n label: \"Agent\",\n icon: <BotIcon />,\n content: (\n <LazyPart fallback={<LoadingPanel label=\"Opening agent settings\" />}>\n <LazyAgentConfigurationPanel\n key={props.session.id}\n session={props.session}\n lastChange={lastAgentChange(props.events)}\n onReloadSession={props.onReloadSession}\n learningFocusRequest={agentLearningFocus}\n usageLimitFocusRequest={usageLimitFocus}\n goalPausedAtUsageLimit={goalPausedAtLimit}\n />\n </LazyPart>\n ),\n });\n }\n if (props.session) {\n trailingTabs.push({\n id: \"debug\",\n label: \"Debug\",\n icon: <BugIcon />,\n content: (\n <LazyPart fallback={<LoadingPanel label=\"Opening debug inspector\" />}>\n <LazySessionInspector\n session={props.session}\n events={props.events}\n connectionState={props.connectionState}\n onReloadSession={props.onReloadSession}\n />\n </LazyPart>\n ),\n });\n }\n\n return (\n <SessionWorkspace\n workspaceId={props.workspaceId}\n sessionId={props.sessionId}\n preferenceOwnerId={context.accessContext.subjectId}\n events={props.events}\n primary={\n <ArtifactLinkBoundary\n workspaceId={props.workspaceId}\n onOpen={(target) => {\n // Editable artifacts require their discovered modality; unlisted editor\n // links retain the normal full-page destination.\n if (\n target.editable &&\n !artifactSummaries.some(\n (item) => item.id === target.id && isEditableArtifactKind(item.modality),\n )\n )\n return false;\n setArtifactRequest((previous) => ({\n sessionId: props.sessionId,\n artifactId: target.id,\n artifactKind:\n target.kind === \"file\"\n ? (artifactSummaries.find(\n (item) =>\n item.id === target.id &&\n (item.modality === \"file\" || item.modality === \"image\"),\n )?.modality ?? \"file\")\n : target.editable\n ? artifactSummaries.find(\n (item) => item.id === target.id && isEditableArtifactKind(item.modality),\n )?.modality\n : \"site\",\n requestId: (previous?.requestId ?? 0) + 1,\n tab: \"artifacts\",\n }));\n return true;\n }}\n >\n {props.primary}\n </ArtifactLinkBoundary>\n }\n openTabRequest={currentTabRequest}\n trailingTabs={trailingTabs}\n collapsed={props.dockCollapsed}\n onCollapsedChange={props.onDockCollapsedChange}\n {...(props.openFileRequest ? { openFileRequest: props.openFileRequest } : {})}\n mobileLeadingControl={\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label=\"Open navigation\"\n onClick={props.onOpenNavigation}\n className=\"size-11\"\n >\n <MenuIcon className=\"size-4\" />\n </Button>\n }\n />\n );\n}\n\nfunction useSessionEditableArtifactSummaries(input: {\n workspaceId: string;\n sessionId: string;\n refreshSequence: number;\n}): Readonly<{\n artifacts: readonly SessionEditableArtifactSummary[];\n status: SessionEditableArtifactsStatus;\n retry: () => void;\n applyPin: (kind: SessionEditableArtifactSummary[\"modality\"], id: string, pinned: boolean) => void;\n}> {\n const context = useAppContext();\n const authorityKey = `${input.workspaceId}:${input.sessionId}:${context.accessKeyVersion}`;\n const [retrySequence, setRetrySequence] = useState(0);\n // One discovery at a time per view. A refresh asked for while one is in\n // flight runs once after it, so a busy chat never stacks overlapping reads.\n const discovery = useRef<{\n key: string;\n client: typeof context.client;\n retrySequence: number;\n running: boolean;\n again: boolean;\n } | null>(null);\n const [loaded, setLoaded] = useState<{\n key: string;\n client: typeof context.client;\n status: SessionEditableArtifactsStatus;\n artifacts: readonly SessionEditableArtifactSummary[];\n } | null>(null);\n\n useEffect(\n () => () => {\n discovery.current = null;\n },\n [],\n );\n\n useEffect(() => {\n if (\n discovery.current?.key !== authorityKey ||\n discovery.current.client !== context.client ||\n discovery.current.retrySequence !== retrySequence\n )\n discovery.current = {\n key: authorityKey,\n client: context.client,\n retrySequence,\n running: false,\n again: false,\n };\n const run = discovery.current;\n setLoaded((previous) =>\n previous?.key === authorityKey &&\n previous.client === context.client &&\n previous.status === \"ready\"\n ? previous\n : {\n key: authorityKey,\n client: context.client,\n status: \"loading\",\n artifacts:\n previous?.key === authorityKey && previous.client === context.client\n ? previous.artifacts\n : [],\n },\n );\n if (run.running) {\n run.again = true;\n return;\n }\n const workspaceId = input.workspaceId;\n const sessionId = input.sessionId;\n const client = context.client;\n // The stale-result fence is sufficient for this bounded metadata GET.\n // Aborting Chrome fetch during React StrictMode cleanup surfaced an\n // unhandled AbortError from the SDK/fetch boundary on every mount.\n const live = () => discovery.current === run;\n const previousArtifacts = (previous: typeof loaded) =>\n previous?.key === authorityKey && previous.client === client ? previous.artifacts : [];\n const start = () => {\n run.running = true;\n run.again = false;\n void import(\"../lib/session-artifact-discovery\")\n .then(async ({ discoverSessionArtifacts }) => {\n const reconcile = await discoverSessionArtifacts(workspaceId, sessionId, live, client);\n if (live())\n setLoaded((previous) => ({\n key: authorityKey,\n client,\n ...reconcile(previousArtifacts(previous)),\n }));\n })\n .catch(() => {\n if (!live()) return;\n setLoaded((previous) => ({\n key: authorityKey,\n client,\n status: \"error\",\n artifacts: previousArtifacts(previous),\n }));\n })\n .finally(() => {\n run.running = false;\n if (run.again && live()) start();\n });\n };\n start();\n }, [\n authorityKey,\n context.client,\n input.refreshSequence,\n input.sessionId,\n input.workspaceId,\n retrySequence,\n ]);\n\n const retry = useCallback(() => setRetrySequence((value) => value + 1), []);\n const applyPin = useCallback(\n (kind: SessionEditableArtifactSummary[\"modality\"], id: string, pinned: boolean) => {\n setLoaded((previous) => {\n if (previous?.key !== authorityKey || previous.client !== context.client) return previous;\n return {\n ...previous,\n artifacts: previous.artifacts.map((artifact) =>\n artifact.modality === kind && artifact.id === id && artifact.catalogItem\n ? { ...artifact, catalogItem: { ...artifact.catalogItem, pinned } }\n : artifact,\n ),\n };\n });\n },\n [authorityKey, context.client],\n );\n return loaded?.key === authorityKey && loaded.client === context.client\n ? { artifacts: loaded.artifacts, status: loaded.status, retry, applyPin }\n : { artifacts: [], status: \"loading\", retry, applyPin };\n}\n\n/** One decision per approval and question round: a new round under the same id is new. */\nfunction approvalDecisionKey(approval: PendingApproval): string {\n return `${approval.id}\\u0000${approval.elicitation?.round ?? \"\"}`;\n}\n\nfunction SessionChatPane(props: {\n session: Session;\n /** A narrow panel beside another view gets narrower gutters. */\n placement: SessionRoutePlacement;\n /** The host view's per-message model context, beside the embedding host's. */\n messageContext: (() => string | undefined) | undefined;\n /** What the person typed while the host view created this chat. */\n initialDraft: InitialComposerDraft | undefined;\n /** Keep the raw detail snapshot: the general route projection prefers queue control. */\n admissionSessionControl: Session[\"effectiveControl\"];\n events: SessionEvent[];\n timeline: TimelineItem[];\n searchTarget: SessionSearchRoute;\n onJumpToSequence: (sequence: number, options?: { signal?: AbortSignal }) => Promise<boolean>;\n initialLoading: boolean;\n historyReloadFailed: boolean;\n launch?: ComposerLaunchSearch | undefined;\n realtimeAutostartModel?: SessionRealtimeModel | undefined;\n onRealtimeAutostartConsumed: () => void;\n onSearchOriginConsumed: () => void;\n approvals: PendingApproval[];\n humanInput: ReturnType<typeof useHumanInputRequests>;\n failure: ReturnType<typeof summarizeSessionFailure> | null;\n /** The last turn ended budget_exhausted — the workspace is out of credits. */\n creditExhausted: boolean;\n /** The one-fix refusal (own-key fee or API use) the last turn ended on, if any. */\n creditRefusal: CreditRefusalKind | null;\n goal: ReturnType<typeof useGoal>;\n queue: ReturnType<typeof useTurnQueue>;\n /** Spawned-worker lineage children — feeds SessionChrome agents segment. */\n agentNodes: LineageNode[];\n /** Something will wake this session on its own (a timed wait or an automation). */\n pendingWake: boolean;\n /** Bumped when a sub-session in this tree changed; open request cards re-read. */\n descendantRefreshSignal: number;\n /** A sub-session's request was settled from this page: re-read the tree. */\n onDescendantResolved: () => void;\n hasOlder: boolean;\n loadingOlder: boolean;\n onLoadOlder: OlderHistoryLoader;\n hasNewer: boolean;\n loadingNewer: boolean;\n onLoadNewer: () => Promise<boolean>;\n loadingOldest: boolean;\n onJumpToStart: () => Promise<boolean>;\n onJumpToLatest: () => Promise<void>;\n /** Reset the local timeline view (the /clear-view command target). */\n onClearView: () => void;\n onOpenSession: (sessionId: string) => void;\n /** Current titles for the agents this session spawns, messages, and hears from. */\n resolveSessionTitle: (sessionId: string) => string | null;\n /** Deep-link a timeline memory step to its first-class workspace Memory record. */\n onMemoryClick: (memoryId: string) => void;\n /** Opens where a person can make a refused Skill, instruction, or Knowledge change. */\n onLearningRefusalOpen: (place: LearningRefusalPlace) => void;\n onNewSession: () => void;\n /** Starts a new chat that continues this archived chat's work. */\n onContinueInNewSession: () => void;\n onApprove: (approvalId: string, answer?: McpElicitationAnswer) => Promise<void>;\n onReject: (approvalId: string) => Promise<void>;\n onReconnect: (item: AuthNeededItem) => void | Promise<void>;\n /** Opens workspace GitHub App setup in the route-level Connect dialog. */\n onConnectGitHubApp: () => void;\n resolveProviderLogo: (providerDomain: string) => string | null;\n onReloadSession: () => Promise<void>;\n onOpenSandboxFile: ((path: string, line?: number) => void) | undefined;\n /** Composer + > Chat settings: open this chat's Agent tab. */\n onOpenAgentSettings: (() => void) | undefined;\n /** The usage limit notice's Change limit: open the Agent tab at Usage limit. */\n onOpenUsageLimit: (() => void) | undefined;\n connectionState: ReturnType<typeof useSessionEvents>[\"connectionState\"];\n}) {\n const findEvents = useUiEventTarget(\"document\");\n const portalContainer = usePortalContainer();\n // A chat in a panel beside another view takes the find shortcut only while\n // focus is inside it, so the view (or the browser) keeps its own find.\n const [panelRoot, setPanelRoot] = useState<HTMLDivElement | null>(null);\n const context = useAppContext();\n const api = useAppApi();\n const page = usePage();\n const navigate = useNavigate();\n // `session:` chat links in agent text open the chat here; ⌘/Ctrl-click opens its page.\n const openSession = useCallback(\n (workspaceId: string, sessionId: string) =>\n void navigate({\n to: \"/workspaces/$workspaceId/sessions/$sessionId\",\n params: { workspaceId, sessionId },\n }),\n [navigate],\n );\n const resolveLink = useWorkspaceAppLinkResolver(props.session.workspaceId, openSession);\n const hostMessageContext = useHostMessageContext();\n const gutter = props.placement === \"panel\" ? \"px-3\" : \"px-4 sm:px-6\";\n // Live voice starts only from the current build: a tab opened before a\n // deploy reloads onto it once and resumes voice via `?realtime=`.\n const realtimeClient = useMemo(\n () => api.voiceRealtimeClient(context.client, () => page.href()),\n [api, context.client, page],\n );\n // Opened on a moment (an inbox item, a notification): when it is older than\n // the loaded tail, load the window around it; the timeline then lands on it.\n const momentSequence = props.searchTarget.find ? undefined : props.searchTarget.at;\n const loadedMoment = useRef<number | null>(null);\n const { onJumpToSequence, initialLoading: historyLoading } = props;\n const firstLoadedSequence = props.events[0]?.sequence;\n useEffect(() => {\n if (!momentSequence || historyLoading || loadedMoment.current === momentSequence) return;\n loadedMoment.current = momentSequence;\n if (firstLoadedSequence !== undefined && firstLoadedSequence > momentSequence) {\n void onJumpToSequence(momentSequence);\n }\n }, [momentSequence, historyLoading, firstLoadedSequence, onJumpToSequence]);\n const [findOpen, setFindOpen] = useState(!!props.searchTarget.find);\n const [findMounted, setFindMounted] = useState(!!props.searchTarget.find);\n const [findFocusRevision, setFindFocusRevision] = useState(0);\n const [activeSearchTarget, setActiveSearchTarget] = useState<TimelineSearchTarget | null>(null);\n // Find opens from the session header (or Ctrl/Cmd+F); closing returns focus\n // to whatever opened it.\n const findReturnFocus = useRef<HTMLElement | null>(null);\n const openFind = useCallback(() => {\n const active = document.activeElement;\n if (active instanceof HTMLElement && active !== document.body) findReturnFocus.current = active;\n setFindMounted(true);\n setFindOpen(true);\n setFindFocusRevision((value) => value + 1);\n }, []);\n // The back link follows the URL's session-search origin, which closing the\n // bar removes, so Ctrl/Cmd+F and the Find button then open a plain bar.\n const { onSearchOriginConsumed } = props;\n const closeFind = useCallback(() => {\n setFindOpen(false);\n setActiveSearchTarget(null);\n onSearchOriginConsumed();\n requestAnimationFrame(() => {\n // Back to whatever opened Find, else the header's Find button when shown.\n const opener = findReturnFocus.current;\n findReturnFocus.current = null;\n const trigger = document.querySelector<HTMLElement>(\"[data-conversation-find-trigger]\");\n const target = opener?.isConnected\n ? opener\n : trigger && trigger.getClientRects().length > 0\n ? trigger\n : null;\n target?.focus({ preventScroll: true });\n });\n }, [onSearchOriginConsumed]);\n useEffect(() => {\n findEvents.addEventListener(OPEN_CONVERSATION_FIND_EVENT, openFind);\n return () => findEvents.removeEventListener(OPEN_CONVERSATION_FIND_EVENT, openFind);\n }, [findEvents, openFind]);\n useEffect(() => {\n if (props.searchTarget.find) openFind();\n }, [\n props.searchTarget.find,\n props.searchTarget.matchSequence,\n props.searchTarget.matchOffset,\n openFind,\n ]);\n useFindShortcut(\n props.placement === \"panel\" ? { scope: panelRoot } : { scope: portalContainer ?? window },\n openFind,\n );\n const fundingRevision = useMemo(() => {\n for (let index = props.events.length - 1; index >= 0; index -= 1) {\n const event = props.events[index]!;\n if (event.type === \"agent.model.usage\") return event.sequence;\n }\n return 0;\n }, [props.events]);\n const modelCatalog = useWorkspaceModelCatalog(\n props.session.workspaceId,\n `${props.session.id}:${props.session.status}:${fundingRevision}`,\n );\n const fleet = useWorkspaceMachines({\n sessionId: props.session.id,\n pollIntervalMs: MACHINES_SESSION_POLL_MS,\n });\n const computeLabel = sessionComputeLabel(t, fleet.machines);\n const loadRetainedScreenshot = useMemo(\n () =>\n createSessionRetainedScreenshotLoader(\n context.client,\n props.session.workspaceId,\n props.session.id,\n ),\n [context.client, props.session.id, props.session.workspaceId],\n );\n const loadRetainedArtifact = useMemo(\n () => createWorkspaceRetainedArtifactLoader(context.client, props.session.workspaceId),\n [context.client, props.session.workspaceId],\n );\n const loadVideoArtifactPlayback = useMemo(\n () => createWorkspaceRetainedVideoLoader(context.client, props.session.workspaceId),\n [context.client, props.session.workspaceId],\n );\n const cancelled = isTerminalSessionStatus(props.session.status);\n // Archived (moving to or in long-term storage): readable, not continuable.\n const readOnlyArchive = sessionReadOnlyArchive(props.session);\n const terminal = cancelled || readOnlyArchive !== null;\n const answerStore = useMemo(() => browserInteractiveAnswerStore(), []);\n const composerRegionRef = useRef<HTMLDivElement | null>(null);\n const [composerFocusSignal, setComposerFocusSignal] = useState(0);\n const focusEvents = useUiEventTarget(\"window\");\n const [modelPickerSession, setModelPickerSession] = useState<string | null>(null);\n // The API's authoritative \"model is not available\" refusal for this session,\n // which also covers connection-owned models the catalog cannot judge.\n const [refusedModel, setRefusedModel] = useState<{ sessionId: string; model: string } | null>(\n null,\n );\n // The API's credit refusal of a Send: no remaining credit pays for that model.\n // It stays above the composer until a message is accepted or it is dismissed.\n const [creditRefusal, setCreditRefusal] = useState<CreditRefusalRecord<{\n sessionId: string;\n }> | null>(null);\n useEffect(() => {\n const onFocusRequest = (event: Event) => {\n const detail = (event as CustomEvent<SessionComposerFocusIntent>).detail;\n if (\n detail?.workspaceId === props.session.workspaceId &&\n detail.sessionId === props.session.id\n ) {\n setComposerFocusSignal(detail.nonce);\n }\n };\n focusEvents.addEventListener(FOCUS_SESSION_COMPOSER_EVENT, onFocusRequest);\n return () => focusEvents.removeEventListener(FOCUS_SESSION_COMPOSER_EVENT, onFocusRequest);\n }, [focusEvents, props.session.id, props.session.workspaceId]);\n // Opening a chat (a sidebar click, ⌘K, Control+Tab, a link or a reload)\n // puts the cursor in its composer, since typing is what comes next. Without\n // an explicit intent, only the first effect run for a chat may do this, and\n // only while nothing else has focus.\n const loadFocusSessionRef = useRef<string | null>(null);\n // The wait outlives effect re-runs (status, approvals) but not the chat.\n const composerFocusWaitRef = useRef<{ sessionId: string; cancel: () => void } | null>(null);\n useEffect(\n () => () => {\n composerFocusWaitRef.current?.cancel();\n composerFocusWaitRef.current = null;\n },\n [],\n );\n useEffect(() => {\n if (\n composerFocusWaitRef.current &&\n composerFocusWaitRef.current.sessionId !== props.session.id\n ) {\n composerFocusWaitRef.current.cancel();\n composerFocusWaitRef.current = null;\n }\n const intent = consumeSessionComposerFocusIntent(\n focusEvents,\n props.session.workspaceId,\n props.session.id,\n );\n const firstRunForChat = loadFocusSessionRef.current !== props.session.id;\n loadFocusSessionRef.current = props.session.id;\n const source = intent?.source ?? (firstRunForChat ? \"load\" : null);\n if (!source) return;\n if (\n !sessionComposerFocusIntentIsEligible({\n viewportWidth: globalThis.innerWidth,\n coarsePointer: globalThis.matchMedia?.(\"(pointer: coarse)\").matches ?? false,\n terminal,\n requiresAction: props.session.status === \"requires_action\",\n pendingHumanInput: props.humanInput.requests.length > 0,\n pendingApproval: props.approvals.length > 0,\n })\n ) {\n return;\n }\n composerFocusWaitRef.current?.cancel();\n composerFocusWaitRef.current = {\n sessionId: props.session.id,\n cancel: focusSessionComposerWhenReady({\n textarea: () => composerRegionRef.current?.querySelector(\"textarea\"),\n sessionId: props.session.id,\n source,\n }),\n };\n }, [\n composerFocusSignal,\n focusEvents,\n props.approvals.length,\n props.humanInput.requests.length,\n props.session.id,\n props.session.status,\n props.session.workspaceId,\n terminal,\n ]);\n const agentsSignal = useMemo(() => sessionAgentsSignal(t, props.agentNodes), [props.agentNodes]);\n // Sub-sessions resuming from an approval decided on their card here: kept\n // in the list so the pause's other approvals stay decidable meanwhile.\n const [resumingSubSessions, setResumingSubSessions] = useState<ReadonlySet<string>>(\n () => new Set(),\n );\n const onSubSessionResumingChange = useCallback((sessionId: string, resuming: boolean) => {\n setResumingSubSessions((current) => {\n if (current.has(sessionId) === resuming) return current;\n const next = new Set(current);\n if (resuming) next.add(sessionId);\n else next.delete(sessionId);\n return next;\n });\n }, []);\n const waitingSubSessions = useMemo(\n () => waitingDescendants(props.agentNodes, resumingSubSessions),\n [props.agentNodes, resumingSubSessions],\n );\n // A sub-session whose turn ended (idle, failed) is no longer resuming.\n useEffect(() => {\n if (resumingSubSessions.size === 0) return;\n const live = new Set(waitingSubSessions.map((session) => session.id));\n for (const id of resumingSubSessions) {\n if (!live.has(id)) onSubSessionResumingChange(id, false);\n }\n }, [onSubSessionResumingChange, resumingSubSessions, waitingSubSessions]);\n const codexConnected = modelCatalog.models.some(\n (candidate) =>\n candidate.provider === \"codex-subscription\" &&\n candidate.credentialReadiness.status === \"ready\",\n );\n // Soft-hide dictate while realtime voice owns the mic (model + mutes stay on the bar).\n const [voiceActive, setVoiceActive] = useState(false);\n const onVoiceActiveChange = useCallback((active: boolean) => {\n setVoiceActive(active);\n }, []);\n // Per-approval decision state: an in-flight decision disables both buttons for\n // that approval and shows progress; a settled one can never double-submit even\n // if the strip lingers for a beat before the status flips.\n const [selectedApprovalId, setSelectedApprovalId] = useState<string | null>(null);\n const [reviewDetails, setReviewDetails] = useState<{\n review: import(\"@opengeni/sdk\").ToolActionReview;\n path: string;\n origin?: string | undefined;\n } | null>(null);\n const loadToolReview = useCallback(\n (approval: PendingApproval) =>\n context.client.getToolActionReview(props.session.workspaceId, props.session.id, approval.id),\n [context.client, props.session.workspaceId, props.session.id],\n );\n const loadRecordedToolReview = useCallback(\n (id: string) =>\n context.client.getToolActionReview(props.session.workspaceId, props.session.id, id),\n [context.client, props.session.workspaceId, props.session.id],\n );\n const viewToolReviewDetails = useCallback(\n (review: import(\"@opengeni/sdk\").ToolActionReview, path: string) =>\n setReviewDetails({\n review,\n path,\n origin:\n document.activeElement\n ?.closest(\"[data-review-origin]\")\n ?.getAttribute(\"data-review-origin\") ?? undefined,\n }),\n [],\n );\n const loadToolReviewDetails = useCallback(\n (review: import(\"@opengeni/sdk\").ToolActionReview, path: string, offset: number) =>\n context.client.getToolReviewDetails(props.session.workspaceId, props.session.id, review.id, {\n actionDigest: review.actionDigest,\n path,\n offset,\n }),\n [context.client, props.session.workspaceId, props.session.id],\n );\n const [approvalPending, setApprovalPending] = useState<Record<string, \"approve\" | \"reject\">>({});\n const [approvalSettled, setApprovalSettled] = useState<Record<string, \"approve\" | \"reject\">>({});\n // Decision state is scoped to ONE turn's pauses. A decision resumes the turn\n // while the pause's other approvals stay decidable, so the maps reset only\n // when the turn ends, and each entry is keyed by the question round it\n // decided: an MCP server asking again under the same call id asks anew.\n useEffect(() => {\n if (!approvalsDecidable(props.session.status)) {\n setApprovalPending((current) => (Object.keys(current).length ? {} : current));\n setApprovalSettled((current) => (Object.keys(current).length ? {} : current));\n }\n }, [props.session.status]);\n // An approval no longer waiting drops its entry, so long sessions never\n // accumulate stale ones.\n useEffect(() => {\n const waiting = new Set(props.approvals.map(approvalDecisionKey));\n setApprovalSettled((current) => {\n const kept = Object.entries(current).filter(([key]) => waiting.has(key));\n return kept.length === Object.keys(current).length ? current : Object.fromEntries(kept);\n });\n }, [props.approvals]);\n // Rapid clicks land before React re-renders with the pending state, so the\n // in-flight fence is a ref: one request per approval, however fast.\n const approvalInFlightRef = useRef(new Set<string>());\n const decideApproval = useCallback(\n async (approvalId: string, decision: \"approve\" | \"reject\", answer?: McpElicitationAnswer) => {\n const approval = props.approvals.find((candidate) => candidate.id === approvalId);\n const key = approval ? approvalDecisionKey(approval) : approvalId;\n if (approvalInFlightRef.current.has(key) || approvalPending[key] || approvalSettled[key]) {\n return;\n }\n approvalInFlightRef.current.add(key);\n setApprovalPending((current) => ({ ...current, [key]: decision }));\n // A failure propagates so the approval surface releases its fence and\n // the buttons stay live for a retry.\n try {\n await (decision === \"approve\"\n ? props.onApprove(approvalId, answer)\n : props.onReject(approvalId));\n setApprovalSettled((current) => ({\n ...current,\n [key]: decision,\n }));\n } finally {\n approvalInFlightRef.current.delete(key);\n setApprovalPending((current) => {\n const next = { ...current };\n delete next[key];\n return next;\n });\n }\n },\n [approvalPending, approvalSettled, props],\n );\n // Workspace-scoped: the provider (mounted on the workspace route) supplies\n // the workspaceId, so the hook needs no positional argument.\n const attachments = useFileAttachments({\n scope:\n props.session.tenancy?.visibility === \"private\" || props.session.memoryScope === \"user\"\n ? \"personal\"\n : \"workspace\",\n });\n const repositories = useFollowUpRepositories(props.session, props.onConnectGitHubApp);\n const firstPartyToolOptions = firstPartySessionToolOptionsFor(\n clientFirstPartyMcpToolPolicy(context.clientConfig).allowed,\n );\n const selectableSessionMcpServers = context.toolMcpServers;\n const selectableToolIds = useMemo(\n () => selectableSessionMcpServers.map((server) => server.id),\n [selectableSessionMcpServers],\n );\n const policyToolIds = useMemo(\n () => sessionPolicyPickerIds(props.session, selectableToolIds, context.workspaceDefaultToolIds),\n [context.workspaceDefaultToolIds, props.session, selectableToolIds],\n );\n const [durableToolSelection, setDurableToolSelection] = useState<SessionToolSelection>(() => ({\n mcpServerIds: new Set(policyToolIds),\n firstPartyToolIds: new Set(props.session.firstPartyMcpTools),\n }));\n const [durableToolsSnapshot, setDurableToolsSnapshot] = useState(props.session);\n const durableToolsSaveInFlight = useRef(false);\n const [durableToolsHydrated, setDurableToolsHydrated] = useState(false);\n const durableToolsSessionId = useRef(props.session.id);\n const [durableToolsSaving, setDurableToolsSaving] = useState(false);\n const [durableToolsError, setDurableToolsError] = useState<string | null>(null);\n const [connectorCustomizingOverride, setConnectorCustomizingOverride] = useState<boolean | null>(\n null,\n );\n // \"+\" > Runs on: the compute this chat runs on and the machines it can move to.\n const runsOn = useSessionRunsOn(props.session.id, props.session.sandboxBackend);\n const machineAccess = currentSessionMachineAccess(\n runsOn.fleet.sessionMachineAccess,\n props.session.activeSandboxId,\n );\n // The chat is shared with other people in the workspace, so the owner of\n // the personal machine it runs on gets a heads-up that they see the work on\n // it. A Personal workspace has nobody else in it.\n const sharedChat =\n props.session.tenancy?.visibility === \"workspace\" &&\n !isPersonalWorkspace(\n context.workspaces.find((candidate) => candidate.id === props.session.workspaceId) ?? null,\n context.managedSelfContext,\n );\n const showMachineAccess = machineAccess !== null && (!machineAccess.isOwner || sharedChat);\n const connectionAccounts = useConnectionAccounts(\n context.client,\n {\n id: props.session.id,\n workspaceId: props.session.workspaceId,\n selectedIds: [...durableToolSelection.mcpServerIds],\n },\n context.workspaceCapabilityCatalog,\n context.accessContext === null\n ? null\n : hasWorkspacePermission(\n context.accessContext,\n props.session.workspaceId,\n \"connections:read\",\n ),\n );\n // A conversation card's human attach is an ordinary Send. It reads the\n // composer's policy, control and account choices at click time.\n const chatSendContext = useRef<ChatSendContext>({\n blocked: null,\n awaitingHuman: false,\n extras: {},\n });\n const readChatSendContext = useCallback(() => chatSendContext.current, []);\n // \"+\" > Runs on: moving onto the person's own machine is their consent to use\n // it here, so it goes through the same move as the machine card (repoint, then\n // a message that carries that consent). Other machines only repoint.\n const runsOnAttach = runsOn.fleet.attach;\n const runsOnPreviousSandboxId = runsOn.fleet.activeSandboxId;\n // While the chat runs on the person's own machine (only its owner sees it in\n // their list), each message renews their consent for this chat, so a chat\n // whose move message never landed recovers on the next ordinary Send. The\n // session's own pointer must agree, so a move the agent or another tab made\n // since the last machine poll doesn't send consent for a machine it left.\n const runsOnActiveMachineConsent =\n runsOn.activeMachine &&\n isPersonalMachine(runsOn.activeMachine) &&\n runsOn.activeMachine.sandboxId === props.session.activeSandboxId\n ? personalMachineUseIntent(props.session.tenancy)\n : undefined;\n const runsOnCanMessage =\n context.accessContext === null ||\n context.accessContext === undefined ||\n hasWorkspacePermission(context.accessContext, props.session.workspaceId, \"sessions:control\");\n const reloadSessionAfterMachineChange = props.onReloadSession;\n // A saved message approved for another of the person's machines already\n // carries that machine's consent, so moving the chat back only repoints it\n // (no \"use this machine\" message); the notice rechecks and re-reads right after.\n const moveSavedMessage = runsOnAttach;\n const moveRunsOn = useCallback(\n async (machine: MachineView): Promise<string | null> => {\n if (!isPersonalMachine(machine)) {\n if (!(await runsOnAttach(machine.sandboxId)))\n return \"The machine change could not be confirmed. Try refreshing the machine list.\";\n await reloadSessionAfterMachineChange();\n return null;\n }\n const result = await moveChatToMachine({\n machine,\n chat: readChatSendContext(),\n canMessage: runsOnCanMessage,\n previousSandboxId: runsOnPreviousSandboxId,\n attach: runsOnAttach,\n sendMessage: (message) =>\n context.client.sendMessage(props.session.workspaceId, props.session.id, message),\n });\n if (result.moved) await reloadSessionAfterMachineChange();\n return result.moved\n ? null\n : (result.reason ??\n \"The machine change could not be confirmed. Refresh the machine list and try again.\");\n },\n [\n context.client,\n props.session.id,\n props.session.workspaceId,\n reloadSessionAfterMachineChange,\n readChatSendContext,\n runsOnAttach,\n runsOnCanMessage,\n runsOnPreviousSandboxId,\n ],\n );\n // Session reads return a new resources array; keep the identity while the\n // contents match so timeline renderers keyed on it do not reset.\n const sessionResourcesKey = stableJson(props.session.resources);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- keyed by content\n const stableSessionResources = useMemo(() => props.session.resources, [sessionResourcesKey]);\n const reloadSessionAfterSetup = props.onReloadSession;\n const refreshConnectionAccounts = connectionAccounts.refresh;\n const afterConnectionSetup = useCallback(async () => {\n await reloadSessionAfterSetup();\n await refreshConnectionAccounts();\n }, [reloadSessionAfterSetup, refreshConnectionAccounts]);\n const renderAuthNeeded = useCallback(\n (item: AuthNeededItem) => {\n const recommendation = item.setupRequest\n ? item\n : sessionAuthRecommendation(t, item, context.workspaceCapabilityCatalog);\n return recommendation ? (\n <Suspense\n fallback={\n <p role=\"status\" className=\"text-sm text-fg-muted\">\n Loading connection card…\n </p>\n }\n >\n <SessionCapabilityCard\n key={`${props.session.id}:${props.session.tenancy?.authorityEpoch}:${item.id}`}\n item={recommendation}\n workspaceId={props.session.workspaceId}\n sessionId={props.session.id}\n visibility={props.session.tenancy?.visibility ?? \"workspace\"}\n resources={stableSessionResources}\n sendContext={readChatSendContext}\n onConfigured={afterConnectionSetup}\n />\n </Suspense>\n ) : undefined;\n },\n [\n context.workspaceCapabilityCatalog,\n props.session.id,\n props.session.workspaceId,\n props.session.tenancy?.visibility,\n props.session.tenancy?.authorityEpoch,\n stableSessionResources,\n readChatSendContext,\n afterConnectionSetup,\n ],\n );\n const launch = props.launch ?? EMPTY_COMPOSER_LAUNCH;\n const launchModel = launch.model;\n const launchEffort = launch.effort;\n const launchLatency = launch.latency;\n const launchRealtime = launch.realtime;\n const launchKey = composerLaunchSearchKey(launch);\n const appliedLaunchKeyRef = useRef<string | null>(null);\n useEffect(() => {\n if (durableToolsSessionId.current !== props.session.id) {\n durableToolsSessionId.current = props.session.id;\n setDurableToolsSnapshot(props.session);\n setDurableToolsHydrated(false);\n setConnectorCustomizingOverride(null);\n return;\n }\n if (!context.workspaceMcpCatalogReady) {\n setDurableToolsHydrated(false);\n return;\n }\n if (durableToolsSaving) return;\n // A PATCH response can be newer than the parent query. Never let stale\n // props restore a connector the user just excluded.\n const snapshot =\n props.session.toolPolicyVersion > durableToolsSnapshot.toolPolicyVersion\n ? props.session\n : durableToolsSnapshot;\n if (snapshot !== durableToolsSnapshot) setDurableToolsSnapshot(snapshot);\n const nextMcpIds = sessionPolicyPickerIds(\n snapshot,\n selectableToolIds,\n context.workspaceDefaultToolIds,\n );\n const nextFirstPartyIds = new Set(snapshot.firstPartyMcpTools);\n setDurableToolSelection((current) =>\n current.mcpServerIds.size === nextMcpIds.size &&\n [...nextMcpIds].every((id) => current.mcpServerIds.has(id)) &&\n current.firstPartyToolIds.size === nextFirstPartyIds.size &&\n [...nextFirstPartyIds].every((id) => current.firstPartyToolIds.has(id))\n ? current\n : { mcpServerIds: nextMcpIds, firstPartyToolIds: nextFirstPartyIds },\n );\n setDurableToolsHydrated(true);\n }, [\n context.workspaceMcpCatalogReady,\n context.workspaceDefaultToolIds,\n selectableToolIds,\n durableToolsSaving,\n durableToolsSnapshot,\n props.session,\n ]);\n const connectorCustomizing =\n connectorCustomizingOverride ?? sessionConnectorPolicyIsCustomized(durableToolsSnapshot);\n const applyDurableToolPolicy = useCallback(\n async (request: UpdateSessionToolPolicyRequest, optimistic?: SessionToolSelection) => {\n if (durableToolsSaveInFlight.current) return;\n durableToolsSaveInFlight.current = true;\n const targetSessionId = props.session.id;\n if (optimistic) setDurableToolSelection(optimistic);\n setDurableToolsSaving(true);\n setDurableToolsError(null);\n try {\n const updated = await context.client.updateSessionToolPolicy(\n props.session.workspaceId,\n targetSessionId,\n request,\n );\n if (durableToolsSessionId.current !== targetSessionId) return;\n setDurableToolSelection({\n mcpServerIds: sessionPolicyPickerIds(\n updated,\n selectableToolIds,\n context.workspaceDefaultToolIds,\n ),\n firstPartyToolIds: new Set(updated.firstPartyMcpTools),\n });\n setDurableToolsSnapshot(updated);\n setConnectorCustomizingOverride((current) => (current === true ? true : null));\n } catch (error) {\n const message = userErrorText(error);\n setDurableToolsError(message);\n toast.error(\"Couldn't save session tools\", { description: message });\n try {\n const refreshed = await context.client.getSession(\n props.session.workspaceId,\n props.session.id,\n );\n if (durableToolsSessionId.current !== targetSessionId) return;\n setDurableToolSelection({\n mcpServerIds: sessionPolicyPickerIds(\n refreshed,\n selectableToolIds,\n context.workspaceDefaultToolIds,\n ),\n firstPartyToolIds: new Set(refreshed.firstPartyMcpTools),\n });\n setDurableToolsSnapshot(refreshed);\n setConnectorCustomizingOverride((current) => (current === true ? true : null));\n } catch {\n if (durableToolsSessionId.current === targetSessionId) {\n setDurableToolSelection({\n mcpServerIds: sessionPolicyPickerIds(\n durableToolsSnapshot,\n selectableToolIds,\n context.workspaceDefaultToolIds,\n ),\n firstPartyToolIds: new Set(durableToolsSnapshot.firstPartyMcpTools),\n });\n }\n }\n } finally {\n durableToolsSaveInFlight.current = false;\n setDurableToolsSaving(false);\n }\n },\n [\n context.client,\n context.workspaceDefaultToolIds,\n durableToolsSnapshot,\n props.session.id,\n props.session.workspaceId,\n selectableToolIds,\n ],\n );\n const saveDurableToolPolicy = useCallback(\n async (next: SessionToolSelection) => {\n await applyDurableToolPolicy(\n connectorSelectionUpdate(\n durableToolsSnapshot,\n durableToolSelection.mcpServerIds,\n next.mcpServerIds,\n context.workspaceDefaultToolIds,\n ),\n {\n mcpServerIds: new Set(next.mcpServerIds),\n firstPartyToolIds: new Set(next.firstPartyToolIds),\n },\n );\n },\n [\n applyDurableToolPolicy,\n context.workspaceDefaultToolIds,\n durableToolsSnapshot,\n durableToolSelection,\n ],\n );\n // Send's guard; whether the model choice can run is worked out below from\n // the composer's own policy (see useSessionSendGate).\n const sendGate = useSessionSendGate();\n const workspace =\n context.workspaces.find((candidate) => candidate.id === props.session.workspaceId) ?? null;\n const loadSkillReview = useCallback(\n (reference: NonNullable<import(\"@opengeni/sdk\").HumanInputQuestion[\"skillReview\"]>) =>\n context.client.readWorkspaceSkill(\n props.session.workspaceId,\n reference.skillId,\n reference.revisionId,\n ),\n // A browser-account switch must discard the previous actor's loaded preview\n // even when the SDK client instance and workspace remain unchanged.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [context.client, props.session.workspaceId, context.accessContext.subjectId],\n );\n const fixedResourceCatalogEnabled = props.session.sandboxBackend !== \"selfhosted\";\n const fixedRigScope = useFixedRigScope(\n context.client,\n workspace?.id ?? null,\n props.session.rigId,\n fixedResourceCatalogEnabled &&\n hasWorkspacePermission(context.accessContext, props.session.workspaceId, \"rigs:use\"),\n );\n const personalAttachment = usePersonalResourceAttachment({\n client: context.client,\n authMode: context.clientConfig.auth.mode,\n authSession: context.authSession,\n accessSubjectId: context.accessContext.subjectId,\n accessContext: context.accessContext,\n managedSelfContext: context.managedSelfContext,\n workspace,\n session: props.session,\n enabled: props.session.sandboxBackend !== \"selfhosted\",\n fixed: {\n rigId: props.session.rigId,\n rigScope: fixedRigScope,\n connectedMachine: null,\n },\n personalWorkspaceTarget: isPersonalWorkspace(workspace, context.managedSelfContext),\n onReloadSession: props.onReloadSession,\n });\n const sendState: SessionSendState = {\n uploadPending: attachments.hasUnresolved,\n repositoryError: repositories.error,\n personalDecision:\n personalAttachment.requiresDecision || connectionAccounts.requiresAccountChoice,\n machineAccessDenied: machineAccess !== null && !machineAccess.isOwner,\n loading:\n durableToolsSaving ||\n durableToolsSaveInFlight.current ||\n !durableToolsHydrated ||\n personalAttachment.loading ||\n personalAttachment.refreshing ||\n connectionAccounts.loading,\n loadFailed: connectionAccounts.error !== null,\n };\n const composerSendBlocker = () => sendGate.blocker(sendState);\n const workspaceAccountId = context.workspaces.find(\n (candidate) => candidate.id === props.session.workspaceId,\n )?.accountId;\n const canBuyCredits =\n context.clientConfig.billingMode === \"stripe\" &&\n Boolean(workspaceAccountId) &&\n hasAccountPermission(context.accessContext, workspaceAccountId ?? \"\", \"billing:manage\");\n const composer = useComposer(props.session.id, {\n canBuyCredits,\n events: props.events,\n sendExtras: () => ({\n ...withHostMessageContext(hostMessageContext, props.messageContext),\n resources: [...attachments.readyResources, ...repositories.pendingResources],\n connectionAccounts: [\n ...connectionAccounts.selections,\n ...(repositories.pendingResources.some(\n (resource) =>\n resource.kind === \"repository\" && resource.connectionType === \"github_personal\",\n ) && context.personalGitHubAuthority\n ? [context.personalGitHubAuthority]\n : []),\n ],\n ...(personalAttachment.intent\n ? { personalResourceAttachment: personalAttachment.intent }\n : runsOnActiveMachineConsent\n ? { personalResourceAttachment: runsOnActiveMachineConsent }\n : {}),\n }),\n sendBlocked: () => composerSendBlocker() !== null,\n effectiveControl: props.queue.effectiveControl ?? props.session.effectiveControl,\n sendDestination: () =>\n promptSendDestination({\n status: props.session.status,\n activeTurnId: props.session.activeTurnId,\n queuedPrompts: props.queue.queue.length,\n admissionBlock: props.session.admissionBlock,\n }),\n busySend: resolveWorkspaceBusySend(workspace?.settings),\n ...(props.initialDraft ? { initialDraft: props.initialDraft } : {}),\n // The console always offers the other choice beside Send.\n offerQueue: true,\n // Ordinary Send is acknowledged locally. Clear only resources captured in\n // that immutable optimistic operation; later additions belong to the next\n // draft, while retry keeps the original resource refs in the failed bubble.\n onSubmitted: (_text, input) => {\n noteTurnFailureAction(\"send_message\");\n attachments.removeReadyFiles(\n (input.resources ?? []).flatMap((resource) =>\n resource.kind === \"file\" ? [resource.fileId] : [],\n ),\n );\n repositories.commitSent(input.resources ?? []);\n },\n // Steer and recovered sends do not pass through onSubmitted. Keep the\n // host-owned upload/repository queue in sync once those inputs are\n // accepted too; the immutable input snapshot preserves later additions.\n onSent: (_text, input) => {\n setCreditRefusal(null);\n attachments.removeReadyFiles(\n (input.resources ?? []).flatMap((resource) =>\n resource.kind === \"file\" ? [resource.fileId] : [],\n ),\n );\n repositories.commitSent(input.resources ?? []);\n personalAttachment.onAccepted(input);\n },\n onDeliveryError: (error, input, delivery) => {\n personalAttachment.onDeliveryError(error, input, delivery);\n connectionAccounts.onSelectionError(error);\n // Retrying cannot help: re-read the catalog so the composer offers a\n // replacement, and open the picker so the next step is visible.\n if (isModelUnavailableSubmissionError(error)) {\n const refused = refusedModelId(error, input);\n if (refused) setRefusedModel({ sessionId: props.session.id, model: refused });\n void modelCatalog.refresh();\n setModelPickerSession(props.session.id);\n }\n // Re-read funding so the notice and picker name what the credit covers now.\n const refusal = creditRefusalRecord(\n error,\n { sessionId: props.session.id },\n refusedModelId(error, input) ?? props.session.model,\n );\n if (refusal) {\n setCreditRefusal(refusal);\n void modelCatalog.refresh();\n }\n },\n });\n // A dropped event stream (an update or brief outage) reads as \"updating\" in\n // the composer while it reconnects.\n const composerView = useComposerWithStreamState(\n composer,\n props.connectionState,\n props.initialLoading,\n );\n const queuedRecall = useQueuedPromptRecall({\n queue: props.queue,\n composer,\n subjectId: context.accessContext.subjectId,\n enabled: !terminal,\n });\n useBrowserAccountBridgeBlocker(`session-composer:${props.session.id}`, () => {\n if (attachments.hasUnresolved) {\n return {\n id: \"ignored\",\n label: \"A file upload is not settled\",\n detail: \"Wait for the upload or remove it before changing accounts.\",\n };\n }\n if (composer.sending || composer.draftSaving || durableToolsSaving) {\n return {\n id: \"ignored\",\n label: \"A session mutation is still running\",\n detail: \"Wait for the current save or send to finish.\",\n };\n }\n return composer.hasDraftContent()\n ? {\n id: \"ignored\",\n label: \"This session has an unsent draft\",\n detail: \"Continuing clears the account-bound composer state.\",\n }\n : null;\n });\n chatSendContext.current = {\n blocked: isTerminalSessionStatus(props.session.status)\n ? \"This chat has ended. Start a new chat to use a repository.\"\n : sessionReadOnlyArchive(props.session)\n ? \"This chat is archived. Continue in a new chat to use a repository.\"\n : connectionAccounts.requiresAccountChoice\n ? \"Choose an account for this chat's connected tools in the composer first.\"\n : personalAttachment.requiresDecision\n ? \"Finish the personal access choice in the composer first.\"\n : null,\n awaitingHuman:\n props.session.status === \"requires_action\" && !sessionAdmissionBlocked(props.session),\n // Moving the chat onto the person's own machine turns it on in this workspace.\n personalMachineIntent: personalMachineUseIntent(props.session.tenancy, \"always\"),\n extras: {\n ...(composer.sendPolicy ?? {}),\n ...((props.queue.effectiveControl ?? props.session.effectiveControl)?.controlEtag\n ? {\n controlEtag: (props.queue.effectiveControl ?? props.session.effectiveControl)!\n .controlEtag,\n }\n : {}),\n ...(connectionAccounts.selections.length > 0\n ? { connectionAccounts: connectionAccounts.selections }\n : {}),\n },\n };\n const composerPolicy = composer.policy;\n const [retryOperation, setRetryOperation] = useState<FailedSessionRetryInput | null>(null);\n const pendingRetryInput =\n retryOperation?.failureEventId === props.failure?.failureEventId ? retryOperation : null;\n // A failure before a logical turn exists cannot preserve an original intent.\n // Prefer detail evidence; paged timeline absence is not positive eligibility.\n const failureTurnId =\n props.session.failureDiagnostics?.eventId === props.failure?.failureEventId\n ? props.session.failureDiagnostics?.turnId\n : props.events.find((event) => event.id === props.failure?.failureEventId)?.turnId;\n const retryHasRetainedTurn = Boolean(failureTurnId);\n const retryFailedSession = useMemo(\n () =>\n createFailedSessionRetry(\n (input) => context.client.retrySession(props.session.workspaceId, props.session.id, input),\n setRetryOperation,\n ),\n [context.client, props.session.workspaceId, props.session.id],\n );\n const composerDraftLoading = composer.draftLoading;\n const setComposerModel = composer.setModel;\n const setComposerReasoningEffort = composer.setReasoningEffort;\n const setComposerLatencyMode = composer.setLatencyMode;\n const hasComposerPolicy = composerPolicy !== null;\n const modelPickerDisabled =\n composer.sending || composer.draftLoading || !hasComposerPolicy || Boolean(pendingRetryInput);\n const canChooseRecoveryModel = !modelPickerDisabled;\n // An own-key or API stop names its one fix; no model choice or free credit fixes it.\n const stopRefusal = props.creditExhausted ? props.creditRefusal : null;\n // Free credit can still cover other models after this model's credit ran out.\n const creditGap =\n props.creditExhausted && !stopRefusal\n ? freeCreditGap(modelCatalog.rows, props.session.model, {\n selectedModel: composerPolicy?.model,\n preferredModel: modelCatalog.defaultSelection?.model,\n })\n : null;\n // Shown while the banner chunk loads or if it fails. On the free model the\n // generic daily-limit line then gives way to the free-model copy; that brief\n // text change keeps the free-model copy out of the direct session bundle.\n const failureFallback = props.failure ? (\n <div role=\"alert\" className={cn(\"mx-auto my-2 w-full max-w-3xl text-sm text-fg-muted\", gutter)}>\n {failureFallbackReason(\n failedSessionCopy(\n props.failure,\n props.creditExhausted && !props.failure.structuralSandboxFailure,\n Boolean(composerPolicy && composerPolicy.model !== props.session.model),\n canChooseRecoveryModel && !props.failure.structuralSandboxFailure,\n creditGap,\n stopRefusal,\n ),\n canBuyCredits,\n )}\n </div>\n ) : null;\n const model = composerPolicy?.model ?? props.session.model;\n const reasoningEffort = composerPolicy?.reasoningEffort ?? props.session.reasoningEffort;\n const latencyMode = composerPolicy?.latencyMode ?? props.session.latencyMode;\n const selectedPolicyRow = findPickerRow(modelCatalog.rows, model);\n // The banner's one-click switch: the same model, effort and speed coercion as the picker.\n const chooseCoveredModel = (id: string) => {\n const row = findPickerRow(modelCatalog.rows, id);\n const choice =\n row && !modelPickerDisabled ? coveredModelChoice(row, reasoningEffort, latencyMode) : null;\n if (!choice) return;\n setComposerModel(choice.model);\n setComposerReasoningEffort(choice.effort);\n if (choice.latencyMode !== null) setComposerLatencyMode(choice.latencyMode);\n };\n const matchesFrozenSessionPolicy = Boolean(\n composerPolicy &&\n composerPolicy.model === props.session.model &&\n composerPolicy.reasoningEffort === props.session.reasoningEffort &&\n composerPolicy.latencyMode === props.session.latencyMode,\n );\n const catalogComboValid = Boolean(\n selectedPolicyRow?.selectable &&\n effortOptionsForModel(selectedPolicyRow.catalog).includes(reasoningEffort) &&\n (latencyMode === \"standard\" ||\n runnableLatencyModesForModel(selectedPolicyRow.catalog).includes(latencyMode)),\n );\n // A model the catalog no longer lists (retired or removed) is refused by the\n // API, so the frozen session policy stops counting as sendable for it.\n const refusedSessionModel =\n refusedModel?.sessionId === props.session.id ? refusedModel.model : null;\n const composerModelUnavailable =\n model === refusedSessionModel ||\n sessionModelMissingFromCatalog({\n model,\n models: modelCatalog.models,\n error: modelCatalog.error,\n });\n const sessionModelUnavailable =\n props.session.model === refusedSessionModel ||\n sessionModelMissingFromCatalog({\n model: props.session.model,\n models: modelCatalog.models,\n error: modelCatalog.error,\n });\n // Only someone who can send may have the composer's model replaced: the\n // replacement is saved to their durable draft.\n const canControlSession = Boolean(\n context.accessContext.workspaceGrants\n .find((grant) => grant.workspaceId === props.session.workspaceId)\n ?.permissions.includes(\"sessions:control\"),\n );\n const composerPolicyValid = Boolean(\n composerPolicy &&\n (catalogComboValid || (matchesFrozenSessionPolicy && !composerModelUnavailable)),\n );\n const noRunnableModel =\n !modelCatalog.loading &&\n modelCatalog.rows.length > 0 &&\n !modelCatalog.rows.some((row) => row.selectable);\n const composerPolicyError =\n composerPolicy && !modelCatalog.loading && !composerPolicyValid && !noRunnableModel\n ? composerModelUnavailable\n ? \"This model is no longer available. Select a different model to continue.\"\n : \"Choose a model, reasoning level, and speed supported by this session.\"\n : null;\n\n // Preselect a runnable model for the next message when the composer still\n // names an unavailable one. Accepted turns and history keep their frozen\n // model; the notice above the input names the replacement.\n const unavailableReplacement = useMemo(\n () =>\n composerModelUnavailable || sessionModelUnavailable\n ? unavailableModelReplacement({\n rows: modelCatalog.rows,\n defaultSelection: modelCatalog.defaultSelection,\n latencyMode,\n })\n : null,\n [\n composerModelUnavailable,\n sessionModelUnavailable,\n modelCatalog.rows,\n modelCatalog.defaultSelection,\n latencyMode,\n ],\n );\n const replacesUnavailableModel = Boolean(\n composerModelUnavailable &&\n unavailableReplacement &&\n !composerDraftLoading &&\n hasComposerPolicy &&\n !modelPickerDisabled &&\n !terminal &&\n // A failed session keeps its model until the person chooses: the\n // failure banner's Retry re-runs that turn with the composer's model.\n canControlSession &&\n !props.failure,\n );\n useEffect(() => {\n if (!replacesUnavailableModel || !unavailableReplacement) return;\n setComposerModel(unavailableReplacement.model);\n setComposerReasoningEffort(unavailableReplacement.reasoningEffort);\n if (unavailableReplacement.latencyMode) {\n setComposerLatencyMode(unavailableReplacement.latencyMode);\n }\n }, [\n replacesUnavailableModel,\n setComposerLatencyMode,\n setComposerModel,\n setComposerReasoningEffort,\n unavailableReplacement,\n ]);\n const composerDelivery = useSessionComposerDelivery(composerView, sendGate, {\n policyValid: composerPolicyValid,\n catalogLoading: modelCatalog.loading,\n replacingModel: replacesUnavailableModel,\n send: sendState,\n });\n const unavailableModelNotice =\n (sessionModelUnavailable || composerModelUnavailable) && !terminal ? (\n <UnavailableModelNotice\n modelName={unavailableModelName(sessionModelUnavailable ? props.session.model : model)}\n replacementLabel={composerModelUnavailable ? null : (selectedPolicyRow?.label ?? null)}\n />\n ) : null;\n\n useEffect(() => {\n if (\n !launchKey ||\n appliedLaunchKeyRef.current === launchKey ||\n composerDraftLoading ||\n !hasComposerPolicy\n ) {\n return;\n }\n const hasPolicy = Boolean(launchModel || launchEffort || launchLatency);\n appliedLaunchKeyRef.current = launchKey;\n if (!hasPolicy) return;\n if (launchModel) setComposerModel(launchModel);\n if (launchEffort) setComposerReasoningEffort(launchEffort);\n if (launchLatency) setComposerLatencyMode(launchLatency);\n void navigate({\n to: \"/workspaces/$workspaceId/sessions/$sessionId\",\n params: {\n workspaceId: props.session.workspaceId,\n sessionId: props.session.id,\n },\n search: composerLaunchSearchAfterPolicyApply({\n model: launchModel,\n effort: launchEffort,\n latency: launchLatency,\n realtime: launchRealtime,\n }),\n replace: true,\n });\n }, [\n composerDraftLoading,\n hasComposerPolicy,\n launchEffort,\n launchKey,\n launchLatency,\n launchModel,\n launchRealtime,\n navigate,\n props.session.id,\n props.session.workspaceId,\n setComposerLatencyMode,\n setComposerModel,\n setComposerReasoningEffort,\n ]);\n const acceptedClientEventIds = useMemo(\n () =>\n new Set(\n props.events\n .filter((event) => event.type === \"user.message\" && event.clientEventId)\n .map((event) => event.clientEventId as string),\n ),\n [props.events],\n );\n const {\n optimisticMessages,\n retryOptimisticMessage,\n restoreOptimisticMessage,\n removeOptimisticMessage,\n } = composer;\n const failedOptimisticMessageCount = (optimisticMessages ?? []).filter(\n (message) => message.state === \"failed\" && !acceptedClientEventIds.has(message.clientEventId),\n ).length;\n useEffect(() => {\n updateLocalSessionDeliveryAttention({\n workspaceId: props.session.workspaceId,\n sessionId: props.session.id,\n failedMessageCount: failedOptimisticMessageCount,\n });\n }, [failedOptimisticMessageCount, props.session.id, props.session.workspaceId]);\n\n // The task's usage limit: one live read shared with the Agent tab, and the\n // calm composer notice near and at the limit. Enforcement is server-side;\n // this only keeps the view fresh.\n const usageLimitCapability = sessionUsageLimitCapability(context.clientConfig);\n const usageLimitTreeActive =\n props.session.status === \"running\" || lineageHasRunningSession(props.agentNodes);\n const usageLimit = useSessionUsageLimit({\n client: context.client,\n workspaceId: props.session.workspaceId,\n sessionId: props.session.id,\n initial: props.session.usageLimit,\n enabled: usageLimitCapability !== \"absent\",\n live: {\n events: props.events,\n active: usageLimitTreeActive,\n watch: props.agentNodes.length > 0,\n connectionState: props.connectionState,\n },\n });\n // A Send refused at the limit keeps its message (as a failed bubble with\n // Restore, never Retry). Reread the limit; until that answers, show reached.\n const refusedUsageLimitSendIds = (optimisticMessages ?? [])\n .filter(\n (message) =>\n message.state === \"failed\" &&\n message.error !== undefined &&\n !acceptedClientEventIds.has(message.clientEventId) &&\n isSessionUsageLimitSubmissionError(new Error(message.error)),\n )\n .map((message) => message.clientEventId)\n .join(\",\");\n const composerUsageLimitError =\n composer.error instanceof OpenGeniSessionUsageLimitReachedError ? composer.error : null;\n const [usageLimitRefusalPending, setUsageLimitRefusalPending] = useState(false);\n const refreshUsageLimit = usageLimit.refresh;\n useEffect(() => {\n if (!refusedUsageLimitSendIds && !composerUsageLimitError) return;\n setUsageLimitRefusalPending(true);\n void refreshUsageLimit().finally(() => setUsageLimitRefusalPending(false));\n }, [composerUsageLimitError, refreshUsageLimit, refusedUsageLimitSendIds]);\n const usageLimitRefusal = usageLimitRefusalFromState({\n pending: usageLimitRefusalPending,\n error: composerUsageLimitError,\n usage: usageLimit.usage,\n });\n const usageLimitChild =\n Boolean(props.session.parentSessionId) || usageLimit.usage?.inherited === true;\n const usageLimitRootId = usageLimit.usage?.rootSessionId ?? null;\n const usageLimitNotice =\n usageLimitCapability !== \"absent\" && !terminal ? (\n <SessionUsageLimitNotice\n usage={usageLimit.usage}\n stale={usageLimit.error !== null && usageLimit.usage !== null}\n refusal={usageLimitRefusal}\n onChangeLimit={!usageLimitChild && canControlSession ? props.onOpenUsageLimit : undefined}\n mainTaskHref={\n usageLimitChild && usageLimitRootId\n ? `/workspaces/${props.session.workspaceId}/sessions/${usageLimitRootId}`\n : undefined\n }\n goalPaused={props.goal.goal?.pausedReason === SESSION_USAGE_LIMIT_GOAL_PAUSED_REASON}\n dismissStorageKey={`opengeni:${props.session.workspaceId}`}\n />\n ) : null;\n const timelineWithOptimisticSends = useMemo<TimelineItem[]>(() => {\n return conversationTimeline(\n props.timeline,\n {\n queue: props.queue.queue,\n snapshot: props.queue.snapshot,\n acceptedSteers: props.queue.acceptedSteers,\n },\n {\n optimisticMessages,\n retryOptimisticMessage,\n restoreOptimisticMessage,\n removeOptimisticMessage,\n },\n );\n }, [\n optimisticMessages,\n removeOptimisticMessage,\n props.queue.acceptedSteers,\n props.queue.queue,\n props.queue.snapshot,\n props.timeline,\n retryOptimisticMessage,\n restoreOptimisticMessage,\n ]);\n const repositoryPickerProps = repositories.pickerProps(terminal || composer.sending);\n const admissionControl = admissionRecheckControl(\n props.admissionSessionControl,\n props.queue.effectiveControl,\n composer.effectiveControl,\n );\n const admissionRefreshRequired = admissionControlNeedsRefresh(\n admissionControl,\n props.admissionSessionControl,\n props.queue.effectiveControl,\n composer.effectiveControl,\n );\n const timelineWithStartup = useSessionStartupTimeline(timelineWithOptimisticSends, {\n session: { ...props.session, effectiveControl: admissionControl },\n events: props.events,\n optimisticMessages,\n hasNewer: props.hasNewer,\n queue: props.queue.snapshot,\n });\n const timelineEmptyStateCopy = sessionTimelineEmptyStateCopy(\n sessionDisplayStatus(props.session),\n (props.queue.effectiveControl ?? props.session.effectiveControl).state === \"paused\",\n );\n\n // Slash-command palette context: the operator controls (/goal, /clear,\n // /compact, /help) act on THIS session. Permissions come from the workspace\n // grant so the palette hides commands the operator can't run.\n const workspacePermissions = useMemo(\n () =>\n context.accessContext.workspaceGrants.find(\n (grant) => grant.workspaceId === props.session.workspaceId,\n )?.permissions ?? [],\n [context.accessContext.workspaceGrants, props.session.workspaceId],\n );\n // A ChatGPT/Codex plan out of usage blocks this chat's Codex model. The\n // chat can wait for the reset, or switch to any model in place (a Codex\n // remote compaction chat rebuilds its context for it) and carry on.\n const codexUsageBlocked =\n isCodexProductModel(props.session.model) &&\n (props.session.status === \"waiting_capacity\" ||\n (props.session.status === \"failed\"\n ? isCodexUsageLimitFailure(props.failure?.failureCode)\n : props.session.status === \"idle\" && latestTurnFailedOnUsageLimit(props.events)));\n const codexUsageChoices = codexUsageBlocked && workspacePermissions.includes(\"sessions:control\");\n const codexUsageResetsAtValue = useMemo(\n () => (codexUsageChoices ? codexUsageResetsAt(props.events) : null),\n [codexUsageChoices, props.events],\n );\n const [usageContinuationState, setUsageContinuation] = useState<{\n sessionId: string;\n pending: boolean;\n error: string | null;\n } | null>(null);\n // One continuation at a time, even for two calls within one render.\n const usageContinuationInFlight = useRef(false);\n const usageContinuation =\n usageContinuationState?.sessionId === props.session.id ? usageContinuationState : null;\n // Whether Codex already compacted this remote_v2 chat. Another model then\n // rebuilds its earlier messages from a summary, which the switch line says.\n const remoteV2Chat = props.session.codexCompactionMode === \"remote_v2\";\n const loadedCheckpointIsCompaction = useMemo(\n () => (remoteV2Chat ? latestCheckpointIsCompaction(props.events) : null),\n [remoteV2Chat, props.events],\n );\n const [fetchedCodexCompaction, setFetchedCodexCompaction] = useState<{\n sessionId: string;\n compacted: boolean;\n } | null>(null);\n useEffect(() => {\n // The loaded page may start after the latest checkpoint: read the newest ones.\n if (!remoteV2Chat || loadedCheckpointIsCompaction !== null) return;\n let stale = false;\n const sessionId = props.session.id;\n context.client\n .listEvents(props.session.workspaceId, sessionId, {\n includeTypes: CONTEXT_CHECKPOINT_EVENT_TYPES,\n // Newest first: only the latest checkpoint matters.\n direction: \"before\",\n limit: 20,\n payloadMode: \"none\",\n })\n .then((events) => {\n if (!stale)\n setFetchedCodexCompaction({\n sessionId,\n compacted: latestCheckpointIsCompaction(events) === true,\n });\n })\n .catch(() => undefined);\n return () => {\n stale = true;\n };\n }, [\n context.client,\n loadedCheckpointIsCompaction,\n props.session.id,\n props.session.workspaceId,\n remoteV2Chat,\n ]);\n const codexCompacted =\n loadedCheckpointIsCompaction ??\n (fetchedCodexCompaction?.sessionId === props.session.id && fetchedCodexCompaction.compacted);\n const switchHeadsUp = (target: string | null | undefined, label: string) =>\n needsModelSwitchHeadsUp({\n codexCompactionMode: props.session.codexCompactionMode,\n codexCompacted,\n model: target,\n })\n ? modelSwitchHeadsUpText(label)\n : null;\n // Run the blocked work on `policy`: the chat's own Codex model to continue\n // at the reset (its turn parks until then), or the model the person picked.\n // A paused chat is resumed first, so the work isn't held back.\n const continueAfterUsageLimit = async (\n policy: Parameters<typeof retryFailedSession>[1],\n options: { resumeFirst?: boolean } = {},\n ) => {\n if (usageContinuationInFlight.current) return;\n usageContinuationInFlight.current = true;\n const sessionId = props.session.id;\n setUsageContinuation({ sessionId, pending: true, error: null });\n let error: string | null = null;\n try {\n // A failed resume stops here (the server would hold the work) and\n // shows its error in the notice.\n if (options.resumeFirst)\n await context.client.resumeSession(props.session.workspaceId, sessionId, {\n clientEventId: crypto.randomUUID(),\n // Never undo a pause made after this page last read the control.\n expectedControlEtag: admissionControl.controlEtag,\n });\n if (\n props.session.status === \"failed\" &&\n props.failure?.failureEventId &&\n retryHasRetainedTurn\n ) {\n // Retry runs the failed turn again on that model.\n await retryFailedSession(props.failure.failureEventId, policy);\n } else {\n // A turn waiting for Codex is replaced by this message (a Steer);\n // after a usage-limit failure, or a failed turn that cannot be\n // retried, it is the next message.\n const chat = readChatSendContext();\n if (chat.blocked) error = chat.blocked;\n else {\n const message = {\n text: \"Continue\",\n ...chat.extras,\n ...policy,\n clientEventId: crypto.randomUUID(),\n };\n if (props.session.status === \"waiting_capacity\")\n await context.client.steerMessage(props.session.workspaceId, sessionId, message);\n else await context.client.sendMessage(props.session.workspaceId, sessionId, message);\n }\n }\n } catch (failure) {\n error = userErrorText(failure, \"Try again.\");\n } finally {\n usageContinuationInFlight.current = false;\n setUsageContinuation({ sessionId, pending: false, error });\n await Promise.allSettled([props.onReloadSession(), props.queue.refresh()]);\n }\n };\n // A Codex turn refused for usage waits for capacity and continues at the\n // reset by default; switching that off pauses the chat, so it waits for the\n // person. A chat the limit stopped instead (failed or idle) is not waiting:\n // switching it on runs the work again on Codex, which waits for the reset.\n const usagePaused = admissionControl.state === \"paused\";\n const continueAtReset = codexUsageContinuesAtReset({\n status: props.session.status,\n paused: usagePaused,\n });\n const setContinueAtReset = (next: boolean) => {\n const action = codexUsageContinueAtResetAction({\n status: props.session.status,\n paused: usagePaused,\n next,\n });\n if (action === \"pause\") void composer.pause();\n else if (action === \"resume\") void composer.resume();\n else if (action === \"run_on_codex\" || action === \"resume_and_run_on_codex\")\n void continueAfterUsageLimit(\n {\n model: props.session.model,\n reasoningEffort: props.session.reasoningEffort,\n latencyMode: props.session.latencyMode,\n },\n { resumeFirst: action === \"resume_and_run_on_codex\" },\n );\n };\n // Picking another model in the picker continues the blocked chat with it.\n const usageModelSwitch = useCodexUsageModelSwitch({\n sessionId: props.session.id,\n sessionModel: props.session.model,\n composerModel: model,\n enabled: codexUsageChoices,\n closePicker: () => setModelPickerSession(null),\n onContinue: (picked) =>\n void continueAfterUsageLimit(\n { model: picked, reasoningEffort, latencyMode },\n // A Steer resumes a paused waiting chat itself; resuming first would\n // wake its Codex wait for nothing.\n { resumeFirst: usagePaused && props.session.status !== \"waiting_capacity\" },\n ),\n });\n // A wait with no reset in sight keeps the server's own wait message; the\n // picker still continues the chat with another model.\n const codexUsageChoice: CodexUsageChoice | undefined =\n codexUsageChoices &&\n codexUsageNoticeApplies({\n status: props.session.status,\n resetsAt: codexUsageResetsAtValue,\n usageWait: codexWaitIsUsageLimit(props.events),\n })\n ? {\n resetText: codexUsageResetText(codexUsageResetsAtValue),\n continueAtReset,\n pending: usageContinuation?.pending || composer.pausing || composer.resuming,\n error: usageContinuation?.error,\n onContinueAtResetChange: setContinueAtReset,\n }\n : undefined;\n // A failed chat shows these choices in its failure banner.\n const codexUsageNotice =\n codexUsageChoice && props.session.status !== \"failed\" && !terminal ? (\n <CodexUsageNotice choice={codexUsageChoice} />\n ) : null;\n // The chosen model is about to rebuild a chat Codex compacted.\n const chosenModelHeadsUp = !terminal\n ? switchHeadsUp(model, selectedPolicyRow?.label ?? unavailableModelName(model))\n : null;\n const modelSwitchHeadsUp = chosenModelHeadsUp ? (\n <ModelSwitchHeadsUp text={chosenModelHeadsUp} className=\"px-3.5 pt-2.5 md:px-4\" />\n ) : null;\n // Your own logins in a chat shared with the workspace (D-54): one quiet line\n // for you only, never a gate. A Personal workspace has nobody else. It stays\n // mounted while none are on, so one turned off here can go back on.\n const ownLoginsApply =\n !terminal &&\n props.session.tenancy?.visibility === \"workspace\" &&\n !isPersonalWorkspace(workspace, context.managedSelfContext);\n const ownLoginsHeadsUp = ownLoginsApply ? (\n <OwnLoginsSharedHeadsUp\n key={props.session.id}\n // While the accounts can't be read, the line keeps what it last knew.\n logins={\n connectionAccounts.loading || connectionAccounts.error\n ? null\n : ownLoginsInUse(\n // Only the connectors this chat uses.\n connectionAccounts.accountGroups,\n connectionAccounts.accountChoices,\n context.accessContext.subjectId,\n )\n }\n className=\"px-3.5 pt-2.5 md:px-4\"\n logoFor={(login) => props.resolveProviderLogo(login.accounts[0]!.providerDomain)}\n onChange={async (login, on) => {\n try {\n if (on)\n await turnOnOwnLoginsHere(context.client, props.session.workspaceId, login.accounts);\n else await stopOwnLoginsHere(context.client, props.session.workspaceId, login.accounts);\n } finally {\n // Some connections may have changed even when one failed.\n await connectionAccounts.refresh();\n }\n }}\n />\n ) : null;\n // The chat's Secrets row: hidden when its agent can't use secrets.\n const sessionSecrets = useSessionSecrets(props.session.id, {\n enabled: workspacePermissions.includes(\"secrets:list\"),\n });\n const secretsView = sessionSecrets.secrets;\n const renderMessageSender = useMessageSenderRenderer(\n context.client,\n props.session.workspaceId,\n context.accessContext.subjectId,\n );\n const commandContext = useMemo(\n () => ({\n client: context.client,\n workspaceId: props.session.workspaceId,\n sessionId: props.session.id,\n status: props.session.status,\n permissions: workspacePermissions,\n }),\n [\n context.client,\n props.session.workspaceId,\n props.session.id,\n props.session.status,\n workspacePermissions,\n ],\n );\n\n const [forkEventId, setForkEventId] = useState<string | null>(null);\n const [turnRatings, setTurnRatings] = useState<Record<string, \"positive\" | \"negative\">>({});\n const mayRate = hasWorkspacePermission(\n context.accessContext,\n props.session.workspaceId,\n \"sessions:create\",\n );\n useEffect(() => {\n setTurnRatings({});\n setForkEventId(null);\n if (!mayRate) return;\n return loadSessionFeedback(\n context.client,\n props.session.workspaceId,\n props.session.id,\n ({ feedback }) => {\n const ratings = turnRatingsFromFeedback(feedback);\n setTurnRatings((saved) => ({ ...ratings, ...saved }));\n },\n );\n }, [\n context.client,\n props.session.workspaceId,\n props.session.id,\n mayRate,\n context.accessContext.subjectId,\n ]);\n const mayForkMessage =\n context.clientConfig.auth.mode === \"managedSession\" &&\n context.authSession !== null &&\n Boolean(props.session.tenancy) &&\n mayRate;\n // \"Fork chat\" from the ⌘K menu or the desktop menu bar forks from the latest\n // message, as the fork button under that message does.\n const forkRequests = useUiEventTarget(\"document\");\n const eventsRef = useRef(props.events);\n eventsRef.current = props.events;\n useEffect(() => {\n if (!mayForkMessage) return;\n const fork = () => {\n const events = eventsRef.current;\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const event = events[index]!;\n if (event.type === \"agent.message.completed\" || event.type === \"user.message\") {\n setForkEventId(event.id);\n return;\n }\n }\n };\n forkRequests.addEventListener(FORK_CURRENT_CHAT_EVENT, fork);\n return () => forkRequests.removeEventListener(FORK_CURRENT_CHAT_EVENT, fork);\n }, [forkRequests, mayForkMessage]);\n const onMessageRated = useCallback((turnId: string, sentiment: \"positive\" | \"negative\") => {\n setTurnRatings((saved) => ({ ...saved, [turnId]: sentiment }));\n }, []);\n const renderMessageActions = useCallback(\n (item: AgentMessageItem | UserMessageItem) => (\n <Suspense fallback={null}>\n <MessageActions\n item={item}\n client={context.client}\n workspaceId={props.session.workspaceId}\n sessionId={props.session.id}\n mayRate={mayRate}\n mayFork={mayForkMessage}\n savedSentiment={\n item.kind === \"agent-message\" && item.turnId ? (turnRatings[item.turnId] ?? null) : null\n }\n onRated={onMessageRated}\n onFork={setForkEventId}\n />\n </Suspense>\n ),\n [\n context.client,\n props.session.workspaceId,\n props.session.id,\n mayRate,\n mayForkMessage,\n turnRatings,\n onMessageRated,\n ],\n );\n\n const renderImage = useCallback(\n (image: { src: string; alt: string }) => {\n const artifactId = retainedImageId(image.src);\n return artifactId ? (\n <Suspense fallback={<span role=\"status\">Loading image…</span>}>\n <InlineChatArtifact\n key={props.session.workspaceId + \":\" + artifactId}\n workspaceId={props.session.workspaceId}\n artifactId={artifactId}\n alt={image.alt}\n />\n </Suspense>\n ) : null;\n },\n [props.session.workspaceId],\n );\n const renderInteractiveBlock = useCallback(\n (block: { kind: \"html\" | \"site\"; content: string }) => (\n <Suspense fallback={<span role=\"status\">Loading preview…</span>}>\n <ChatInteractiveBlock workspaceId={props.session.workspaceId} {...block} />\n </Suspense>\n ),\n [props.session.workspaceId],\n );\n\n const renderMessageText = useCallback(\n (\n text: string,\n item: AgentMessageItem | UserMessageItem,\n renderContext: { searchTarget: TimelineSearchTarget | null },\n ) => {\n if (item.kind === \"user-message\") {\n if (item.humanInputDelegation) {\n return (\n <HumanInputDelegationRecord\n client={context.client}\n workspaceId={props.session.workspaceId}\n item={{ ...item, humanInputDelegation: item.humanInputDelegation }}\n viewerSubjectId={context.accessContext.subjectId}\n />\n );\n }\n return (\n <UserMessageBody\n sessionId={props.session.id}\n workspaceId={props.session.workspaceId}\n item={item}\n searchTarget={renderContext.searchTarget}\n />\n );\n }\n return (\n <div data-testid=\"assistant-markdown\">\n <MarkdownText\n artifactHref={(id) => `/workspaces/${props.session.workspaceId}/artifacts/files/${id}`}\n text={text}\n searchTarget={renderContext.searchTarget}\n softLineBreaks\n streaming={item.kind === \"agent-message\" && item.streaming}\n onSandboxFile={props.onOpenSandboxFile}\n renderInteractiveBlock={renderInteractiveBlock}\n renderImage={renderImage}\n />\n </div>\n );\n },\n [\n context.accessContext.subjectId,\n context.client,\n props.onOpenSandboxFile,\n props.session.id,\n props.session.workspaceId,\n renderInteractiveBlock,\n renderImage,\n ],\n );\n\n const [creditTopupOpen, setCreditTopupOpen] = useState(false);\n const openCreditTopup = canBuyCredits ? () => setCreditTopupOpen(true) : undefined;\n // Opened beside an own-key refusal, the top-up hides coupons: their credit\n // can't pay the own-key fee.\n const topupRefusal =\n ((creditRefusal?.sessionId === props.session.id ? creditRefusal.code : null) ?? stopRefusal) ===\n \"byok_paid_credit_required\"\n ? \"byok_paid_credit_required\"\n : null;\n const creditTopupPrompt =\n canBuyCredits && workspaceAccountId ? (\n <Suspense fallback={null}>\n {creditTopupOpen ? (\n <LazyCreditTopupPrompt\n purpose=\"topup\"\n refusalCode={topupRefusal}\n open\n workspaceId={props.session.workspaceId}\n accountId={workspaceAccountId}\n canBuyCredits\n onOpenChange={setCreditTopupOpen}\n beforeLeave={composer.flushDraft}\n />\n ) : null}\n </Suspense>\n ) : null;\n const canConnectModel = hasWorkspacePermission(\n context.accessContext,\n props.session.workspaceId,\n \"connections:write\",\n );\n // An archived chat is read-only: there is nothing to retry or recover.\n const failureRecovery =\n !props.hasNewer &&\n !readOnlyArchive &&\n props.failure &&\n (props.session.status === \"failed\" ||\n (props.creditExhausted && props.session.status === \"idle\")) ? (\n <FailureRecoveryBoundary key={props.session.id} fallback={failureFallback}>\n <Suspense fallback={failureFallback}>\n <LazyFailedSessionBanner\n key={props.session.id}\n failure={props.failure}\n shownInTimeline={timelineShowsFailure(timelineWithStartup, {\n failureEventId: props.failure.failureEventId,\n turnId: failureTurnId,\n })}\n analyticsKey={\n props.failure.failureEventId ??\n `${props.session.id}:${props.failure.failedAt ?? \"unknown\"}`\n }\n canChooseModel={canChooseRecoveryModel}\n codexUsage={codexUsageChoice}\n hasModelPicker={hasComposerPolicy}\n freeModel={isDeploymentFreeModel(modelCatalog.rows, props.session.model)}\n subscriptions={connectableSubscriptions(context.clientConfig.models)}\n modelChanged={Boolean(composerPolicy && composerPolicy.model !== props.session.model)}\n creditExhausted={props.creditExhausted}\n creditRefusal={stopRefusal}\n freeCreditGap={creditGap}\n onChooseModel={chooseCoveredModel}\n workspaceId={props.session.workspaceId}\n canBuyCredits={canBuyCredits}\n onAddCredits={openCreditTopup}\n canConnectModel={canConnectModel}\n sandboxRecovery={\n needsSandboxRecoveryCheck(props.session, props.failure.structuralSandboxFailure)\n ? {\n client: context.client,\n workspaceId: props.session.workspaceId,\n sessionId: props.session.id,\n canControl: workspacePermissions.includes(\"sessions:control\"),\n }\n : undefined\n }\n actions={{\n failureId: props.failure.failureEventId,\n retryInput: pendingRetryInput,\n composerBlocker: composerSendBlocker(),\n onRetry: async () => {\n if (\n composer.hasDraftContent() ||\n composerSendBlocker() ||\n !props.failure?.failureEventId ||\n !retryHasRetainedTurn ||\n !composerPolicy ||\n !workspacePermissions.includes(\"sessions:control\") ||\n admissionControl.state === \"paused\"\n )\n return false;\n try {\n return await retryFailedSession(props.failure.failureEventId, composerPolicy);\n } finally {\n await Promise.allSettled([props.onReloadSession(), props.queue.refresh()]);\n }\n },\n retryBlocker: !workspacePermissions.includes(\"sessions:control\")\n ? \"permission\"\n : admissionControl.state === \"paused\"\n ? \"paused\"\n : composer.hasDraftContent()\n ? \"draft\"\n : failedOptimisticMessageCount > 0\n ? \"unsent\"\n : (optimisticMessages ?? []).some(\n (message) => !acceptedClientEventIds.has(message.clientEventId),\n )\n ? \"delivery\"\n : props.session.activeTurnId !== null || props.queue.queue.length > 0\n ? \"queued\"\n : composer.sending ||\n composer.draftLoading ||\n !hasComposerPolicy ||\n !retryHasRetainedTurn ||\n !props.failure.failureEventId\n ? \"loading\"\n : null,\n }}\n />\n </Suspense>\n </FailureRecoveryBoundary>\n ) : null;\n // A refused Send names its model, the models the credit still covers, and the\n // next step above the composer. The credit-stop banner already says this.\n const sessionCreditRefusal =\n creditRefusal?.sessionId === props.session.id &&\n !terminal &&\n !(failureRecovery && props.creditExhausted)\n ? creditRefusal\n : null;\n // The plain refusal text shows while the notice chunk loads or if it fails.\n const creditRefusalFallback = sessionCreditRefusal ? (\n <p role=\"alert\" className=\"px-1.5 text-sm text-fg-muted\">\n {apiErrorFacts(sessionCreditRefusal.message).serverMessage ?? sessionCreditRefusal.message}\n </p>\n ) : null;\n const creditRefusalNotice = sessionCreditRefusal ? (\n <FailureRecoveryBoundary key={props.session.id} fallback={creditRefusalFallback}>\n <Suspense fallback={creditRefusalFallback}>\n <LazyCreditRefusalNotice\n gap={creditRefusalGap(modelCatalog.rows, sessionCreditRefusal.model, {\n selectedModel: composerPolicy?.model,\n preferredModel: modelCatalog.defaultSelection?.model,\n })}\n message={sessionCreditRefusal.message}\n refusalCode={sessionCreditRefusal.code}\n workspaceId={props.session.workspaceId}\n accountId={workspaceAccountId}\n canReadBilling={\n Boolean(workspaceAccountId) &&\n hasAccountPermission(context.accessContext, workspaceAccountId ?? \"\", \"billing:read\")\n }\n canBuyCredits={canBuyCredits}\n canConnectModel={canConnectModel}\n continuing\n onChooseModel={modelPickerDisabled ? undefined : chooseCoveredModel}\n onAddCredits={openCreditTopup}\n onDismiss={() => setCreditRefusal(null)}\n />\n </Suspense>\n </FailureRecoveryBoundary>\n ) : null;\n\n const modelRecovery = props.hasNewer\n ? null\n : currentModelRecovery({ ...props.session, effectiveControl: admissionControl }, props.events);\n\n const reviewDetailPane = reviewDetails ? (\n <div className=\"min-h-0 flex-1 overflow-y-auto\" data-workspace-scroll-owner=\"self-managed\">\n <ToolActionReviewDetails\n key={reviewDetails.review.id + reviewDetails.path}\n review={reviewDetails.review}\n path={reviewDetails.path}\n load={loadToolReviewDetails}\n onBack={() => {\n const { review, path, origin } = reviewDetails;\n setReviewDetails(null);\n requestAnimationFrame(() => {\n const selector = `[data-approval-id=\"${CSS.escape(review.id)}\"]${origin ? `[data-review-origin=\"${CSS.escape(origin)}\"]` : \"\"} button[data-review-path=\"${CSS.escape(path)}\"]`;\n document.querySelector<HTMLElement>(selector)?.focus();\n });\n }}\n />\n </div>\n ) : null;\n\n return createElement(\n Fragment,\n null,\n reviewDetailPane,\n creditTopupPrompt,\n createElement(\n \"div\",\n {\n className: reviewDetails ? \"hidden\" : \"contents\",\n ...inertProps(Boolean(reviewDetails)),\n ...(props.placement === \"panel\" ? { ref: setPanelRoot } : {}),\n },\n createElement(\n LightboxProvider,\n null,\n <ChatViewportFileDropTarget\n data-workspace-scroll-owner=\"self-managed\"\n enabled={!terminal && context.clientConfig.fileUploads.enabled === true}\n onFiles={attachments.addFiles}\n >\n {findMounted ? (\n <LazyPart fallback={null}>\n <ConversationFind\n workspaceId={props.session.workspaceId}\n sessionId={props.session.id}\n open={findOpen}\n focusRevision={findFocusRevision}\n initial={props.searchTarget}\n showBackToSessionSearch={props.searchTarget.searchOrigin === \"session-search\"}\n onClose={closeFind}\n onTarget={setActiveSearchTarget}\n onJump={props.onJumpToSequence}\n />\n </LazyPart>\n ) : null}\n {cancelled ? (\n <div className={cn(\"mx-auto w-full max-w-3xl pt-6\", gutter)}>\n <TerminalSessionBanner session={props.session} onNewSession={props.onNewSession} />\n <TerminalSessionArchive session={props.session} eventCount={props.timeline.length} />\n </div>\n ) : readOnlyArchive ? (\n <div className={cn(\"mx-auto w-full max-w-3xl pt-6\", gutter)}>\n <ReadOnlySessionNotice\n session={props.session}\n onContinue={props.onContinueInNewSession}\n />\n </div>\n ) : null}\n {\n <>\n <div data-testid=\"session-timeline\" className=\"min-h-0 min-w-0 flex-1\">\n <LearningRefusalActionsProvider onOpen={props.onLearningRefusalOpen}>\n <KnowledgeActivityProvider\n onInspect={props.onMemoryClick}\n onRetryFile={(fileId) =>\n composer.send(\n `Retry searchable source preparation for attached file ${fileId}. Use knowledge_retain_file and report its result.`,\n )\n }\n retryDisabled={\n composer.hasDraftContent() ||\n composer.sending ||\n composer.draftLoading ||\n !hasComposerPolicy\n }\n >\n <ToolReviewHistoryProvider\n events={props.events}\n load={loadRecordedToolReview}\n onViewDetails={viewToolReviewDetails}\n >\n <InteractiveAnswerProvider\n send={composer.send}\n scope={props.session.id}\n store={answerStore}\n readOnly={terminal}\n >\n <MessageTimeline\n resolveLink={resolveLink}\n renderMessageSender={renderMessageSender}\n allowanceExhaustedLabels={CONSOLE_TIMELINE_ALLOWANCE_LABELS}\n trailingState={\n <>\n {/* Recovery follows the failed request, only in the latest history window.\n Credit exhaustion also surfaces on idle sessions. */}\n {failureRecovery}\n {/* The pause's other approvals stay up while a decision\n resumes the turn: deciding them never waits for it. */}\n {props.approvals.length > 0 &&\n approvalsDecidable(props.session.status) && (\n <ApprovalSurface\n approvals={props.approvals}\n selectedApprovalId={selectedApprovalId}\n onSelectedApprovalChange={setSelectedApprovalId}\n loadReview={loadToolReview}\n onViewDetails={viewToolReviewDetails}\n onApprove={(approval, answer) =>\n decideApproval(approval.id, \"approve\", answer)\n }\n onReject={(approval) => decideApproval(approval.id, \"reject\")}\n />\n )}\n <LazyPart fallback={null}>\n <SessionSkillReviews\n key={`${context.accessContext.subjectId}:${props.session.workspaceId}:${props.session.id}`}\n context={context}\n workspaceId={props.session.workspaceId}\n sessionId={props.session.id}\n events={props.events}\n />\n </LazyPart>\n {props.humanInput.requests.length > 0 &&\n props.session.status === \"requires_action\" ? (\n <div className=\"pb-1\" data-human-input-timeline-surface=\"\">\n <LazyPart fallback={<LoadingPanel label=\"Loading questions…\" />}>\n <HumanInputSurface\n loadSkillReview={loadSkillReview}\n allowedSaveTo={secretSaveTargets(\n context.accessContext,\n props.session.workspaceId,\n )}\n requests={props.humanInput.requests}\n respondingRequestId={props.humanInput.respondingRequestId}\n error={props.humanInput.mutationError?.message}\n onSubmit={async (requestId, response) => {\n // A failed send resolves null. Reject so the card\n // keeps what was typed (including a secret) to retry.\n if (\n !(await props.humanInput.respond(requestId, response))\n ) {\n throw new Error(\"Your answer wasn't sent. Try again.\");\n }\n }}\n />\n </LazyPart>\n </div>\n ) : null}\n </>\n }\n turnSummary={{ rolling: true }}\n key={props.session.id}\n className=\"h-full\"\n items={timelineWithStartup}\n searchTarget={activeSearchTarget}\n focusSequence={momentSequence}\n events={props.events}\n status={props.session.status}\n computeLabel={computeLabel}\n renderMessageText={renderMessageText}\n renderMessageActions={renderMessageActions}\n onAnnotate={composer.addAnnotation}\n draftAnnotations={composer.annotations}\n onDraftAnnotationSelect={composer.requestAnnotationReview}\n onOpenSession={props.onOpenSession}\n resolveSessionTitle={props.resolveSessionTitle}\n onMemoryClick={props.onMemoryClick}\n onReconnect={props.onReconnect}\n renderAuthNeeded={renderAuthNeeded}\n resolveProviderLogo={props.resolveProviderLogo}\n loadRetainedScreenshot={loadRetainedScreenshot}\n loadRetainedArtifact={loadRetainedArtifact}\n loadVideoArtifactPlayback={loadVideoArtifactPlayback}\n hasOlder={props.hasOlder}\n loadingOlder={props.loadingOlder}\n onLoadOlder={props.onLoadOlder}\n hasNewer={props.hasNewer}\n loadingNewer={props.loadingNewer}\n onLoadNewer={props.onLoadNewer}\n loadingOldest={props.loadingOldest}\n onJumpToStart={async () => {\n await props.onJumpToStart();\n }}\n onJumpToLatest={props.onJumpToLatest}\n emptyState={\n // Clear view hides history, not the retained failure or retry operation.\n failureRecovery ??\n (props.queue.stoppingPreviousAttempt ? (\n <EmptyState\n className=\"min-h-[24rem]\"\n icon={\n <Loader2Icon className=\"size-4 animate-spin motion-reduce:animate-none\" />\n }\n title={\n props.queue.effectiveControl?.state === \"paused\"\n ? \"Stopping current work\"\n : \"Stopping previous work\"\n }\n description={\n props.queue.effectiveControl?.state === \"paused\"\n ? \"Waiting for the current command to stop safely. Queued work stays saved.\"\n : \"Your direction is saved. It starts after the previous command stops safely.\"\n }\n />\n ) : props.initialLoading ? (\n <div className=\"flex min-h-[24rem]\">\n <LoadingPanel />\n </div>\n ) : props.historyReloadFailed ? (\n <ProblemPanel\n title=\"Conversation couldn't be loaded\"\n description=\"Your saved messages are unchanged. Try loading them again.\"\n action={\n <Button\n variant=\"outline\"\n onClick={() => void props.onJumpToLatest()}\n >\n Retry conversation\n </Button>\n }\n />\n ) : (\n <EmptyState\n className=\"min-h-[24rem]\"\n icon={\n props.session.status === \"running\" ||\n props.session.status === \"recovering\" ? (\n <Loader2Icon className=\"size-4 animate-spin motion-reduce:animate-none\" />\n ) : (\n <MessagesSquareIcon className=\"size-4\" />\n )\n }\n title={timelineEmptyStateCopy.title}\n description={timelineEmptyStateCopy.description}\n />\n ))\n }\n />\n </InteractiveAnswerProvider>\n </ToolReviewHistoryProvider>\n </KnowledgeActivityProvider>\n </LearningRefusalActionsProvider>\n </div>\n </>\n }\n\n {forkEventId ? (\n <LazyPart fallback={null}>\n <MessageForkDialog\n key={forkEventId}\n session={props.session}\n events={props.events}\n sourceEventId={forkEventId}\n onForkClose={() => setForkEventId(null)}\n />\n </LazyPart>\n ) : null}\n\n {repositories.removalDialog}\n\n {modelRecovery ? <ModelRecoveryNotice recovery={modelRecovery} /> : null}\n\n {/* One slim status row above the composer: the agent's wait, queue,\n goal and activity. Hides entirely when there are no signals. */}\n <div className={cn(\"mb-1 w-full shrink-0 has-[>div:empty]:hidden\", gutter)}>\n <div className=\"mx-auto w-full max-w-3xl\">\n <SessionAdmissionNotice\n key={`${props.session.workspaceId}:${props.session.id}`}\n session={props.session}\n machineAccess={machineAccess}\n machineAction={\n <SessionMachinePickerAction\n queuedWork\n runsOn={runsOn}\n workspaceId={props.session.workspaceId}\n rigId={props.session.rigId}\n move={moveRunsOn}\n />\n }\n machines={runsOn.fleet.machines}\n onMoveToMachine={runsOn.fleet.canAttach ? moveSavedMessage : undefined}\n canControl={workspacePermissions.includes(\"sessions:control\")}\n paused={admissionControl.state === \"paused\"}\n refreshRequired={admissionRefreshRequired}\n busy={\n composer.resuming || composer.pausing || composer.sending || props.queue.mutating\n }\n onRecheck={() =>\n recheckSessionAdmission({\n control: admissionControl,\n refreshOnly: admissionRefreshRequired,\n resume: (control) =>\n context.client.resumeSession(props.session.workspaceId, props.session.id, {\n clientEventId: crypto.randomUUID(),\n expectedControlEtag: control.controlEtag,\n }),\n refresh: [props.onReloadSession, props.queue.refresh],\n })\n }\n onContinueWaitingWork={async () => {\n await context.client.continueSessionWaitingWork(\n props.session.workspaceId,\n props.session.id,\n );\n // A chat the refusal blocked resumes with the usual fenced\n // Resume; a running chat picks them up at its next step.\n if (\n sessionAdmissionReason(props.session) !== null &&\n admissionControl.state !== \"paused\"\n )\n await recheckSessionAdmission({\n control: admissionControl,\n refreshOnly: admissionRefreshRequired,\n resume: (control) =>\n context.client.resumeSession(props.session.workspaceId, props.session.id, {\n clientEventId: crypto.randomUUID(),\n expectedControlEtag: control.controlEtag,\n }),\n refresh: [props.onReloadSession, props.queue.refresh],\n });\n else await props.onReloadSession();\n // Machines last: the notice clears once nothing waits, and a\n // still-blocked session read in between would flash the refusal.\n await runsOn.fleet.refresh();\n }}\n />\n {waitingSubSessions.length > 0 ? (\n <LazyPart fallback={null}>\n {/* Links in sub-session questions resolve like links in the timeline. */}\n <OpenGeniLinkProvider resolveLink={resolveLink}>\n <DescendantRequests\n client={context.client}\n workspaceId={props.session.workspaceId}\n parentSessionId={props.session.id}\n events={props.events}\n waiting={waitingSubSessions}\n onResolved={props.onDescendantResolved}\n onResumingChange={onSubSessionResumingChange}\n refreshSignal={props.descendantRefreshSignal}\n loadSkillReview={loadSkillReview}\n allowedSaveTo={secretSaveTargets(\n context.accessContext,\n props.session.workspaceId,\n )}\n />\n </OpenGeniLinkProvider>\n </LazyPart>\n ) : null}\n <SessionChrome\n sessionStatus={props.session.status}\n // Same rule as the header's Waiting badge, plus the merged admission control.\n wait={admissionControl.state === \"active\" ? sessionInputWait(props.session) : null}\n onOpenSession={props.onOpenSession}\n queue={props.queue}\n composer={terminal ? undefined : composer}\n queuedRecall={queuedRecall}\n goal={props.goal}\n readOnly={terminal}\n commandsCount={props.session.backgroundCommandActivity?.count ?? 0}\n commandsPanel={\n <LazyPart fallback={<LoadingPanel label=\"Loading commands…\" />}>\n <SessionCommands\n key={props.session.id}\n sessionId={props.session.id}\n readOnly={terminal}\n />\n </LazyPart>\n }\n agentsSignal={agentsSignal}\n agentsPanel={\n props.agentNodes.length > 0 ? (\n <LazyPart fallback={<LoadingPanel label=\"Loading agents…\" />}>\n <SubagentTree\n workspaceId={props.session.workspaceId}\n nodes={props.agentNodes}\n />\n </LazyPart>\n ) : null\n }\n />\n </div>\n </div>\n\n {/* A read-only chat can't continue: its notice offers a new chat instead. */}\n <div\n ref={composerRegionRef}\n data-read-only-composer={readOnlyArchive ? \"hidden\" : undefined}\n className={cn(\n \"shrink-0\",\n props.placement === \"panel\" ? \"pb-3\" : \"pb-4\",\n gutter,\n readOnlyArchive && \"hidden\",\n )}\n >\n <div className=\"mx-auto w-full max-w-3xl\">\n <PersonalResourceAttachmentSurface\n controller={personalAttachment}\n disabled={terminal || composer.sending}\n compact\n />\n <ConsoleComposer\n workspaceId={props.session.workspaceId}\n usageRefreshKey={props.session.status}\n composer={composerDelivery}\n attachments={attachments}\n effectiveControl={composer.effectiveControl}\n queuedAheadCount={props.queue.queue.length}\n queuedRecall={queuedRecall}\n running={\n usageLimitTreeActive ||\n sessionTurnKeepsRunControl(props.session.status) ||\n props.pendingWake\n }\n canControlWorkspace={workspacePermissions.includes(\"workspace:admin\")}\n controlLinks={{\n workspaceHref: `/workspaces/${props.session.workspaceId}`,\n sessionHref: (sessionId) =>\n `/workspaces/${props.session.workspaceId}/sessions/${sessionId}`,\n }}\n disabled={terminal}\n header={\n ownLoginsHeadsUp ||\n unavailableModelNotice ||\n codexUsageNotice ||\n modelSwitchHeadsUp ||\n usageLimitNotice ||\n creditRefusalNotice ||\n showMachineAccess ? (\n <>\n {!sessionAdmissionNeedsDifferentMachine(\n sessionAdmissionReason(props.session),\n machineAccess,\n ) ? (\n <SessionMachineAccessNotice\n access={machineAccess}\n shared={sharedChat}\n className=\"px-3.5 pt-2.5 md:px-4\"\n action={\n <SessionMachinePickerAction\n runsOn={runsOn}\n workspaceId={props.session.workspaceId}\n rigId={props.session.rigId}\n move={moveRunsOn}\n compact={machineAccess?.isOwner === true}\n />\n }\n />\n ) : null}\n {unavailableModelNotice}\n {codexUsageNotice}\n {modelSwitchHeadsUp}\n {usageLimitNotice}\n {creditRefusalNotice ? (\n <div className=\"px-2 pt-2\">{creditRefusalNotice}</div>\n ) : null}\n {ownLoginsHeadsUp}\n </>\n ) : null\n }\n commandContext={commandContext}\n onClearView={props.onClearView}\n fileUploadsEnabled={context.clientConfig.fileUploads.enabled === true}\n transcriptionSuppressed={voiceActive}\n controlsLeading={\n <>\n <ComposerMobilePlus\n connectorActions={{\n accountControls: {\n groups: connectionAccounts.availableAccountGroups,\n choices: connectionAccounts.accountChoices,\n onChoose: connectionAccounts.selectAccount,\n loading: connectionAccounts.loading,\n error: connectionAccounts.error,\n accessDenied: connectionAccounts.accessDenied,\n onRefresh: () => void connectionAccounts.refresh(),\n disabled:\n terminal ||\n composer.sending ||\n durableToolsSaving ||\n !durableToolsHydrated,\n },\n }}\n chatSettings={\n props.onOpenAgentSettings\n ? {\n workspaceId: props.session.workspaceId,\n sessionId: props.session.id,\n scope: chatLearningScope(props.session),\n canEdit: workspacePermissions.includes(\"sessions:control\"),\n onOpen: props.onOpenAgentSettings,\n }\n : undefined\n }\n workspaceId={props.session.workspaceId}\n disabled={terminal || composer.sending}\n fileUploadsEnabled={context.clientConfig.fileUploads.enabled === true}\n servers={selectableSessionMcpServers}\n firstPartyTools={firstPartyToolOptions}\n selection={durableToolSelection}\n toolsSaving={durableToolsSaving}\n toolsDisabled={\n composer.sending || terminal || durableToolsSaving || !durableToolsHydrated\n }\n connectorCustomizing={connectorCustomizing}\n onConnectorCustomizingChange={(next) => {\n setConnectorCustomizingOverride(next);\n if (next) return;\n connectionAccounts.resetEmptyChoices();\n void applyDurableToolPolicy(\n followWorkspaceConnectorPolicy(durableToolsSnapshot),\n );\n }}\n onToolSelectionChange={(next) => void saveDurableToolPolicy(next)}\n {...(secretsView?.capabilityEnabled\n ? {\n secrets: {\n summary: sessionSecretsSummary(\n secretsView.policy,\n secretsView.reachableVaults,\n ),\n panel: (\n <SessionSecretsMenuBody\n vaults={secretsView.reachableVaults}\n policy={secretsView.policy}\n narrowedByParent={secretsView.narrowedBySessionId !== null}\n taskItems={secretsView.taskItems}\n canEdit={workspacePermissions.includes(\"sessions:control\")}\n disabled={terminal}\n loading={sessionSecrets.loading}\n error={sessionSecrets.error}\n onRetry={() => void sessionSecrets.refresh()}\n onPolicyChange={async (policy) => {\n await sessionSecrets.api.setSessionVaultPolicy(\n props.session.id,\n policy,\n );\n await sessionSecrets.refresh();\n }}\n onSaveTo={async (item, target) => {\n await sessionSecrets.api.moveItem(item.vaultId, item.id, {\n targetVaultId: target.id,\n mode: \"copy\",\n });\n toast.success(`Saved ${item.name} to ${target.name}`);\n }}\n onManage={() =>\n void navigate({\n to: \"/workspaces/$workspaceId/secrets\",\n params: { workspaceId: props.session.workspaceId },\n })\n }\n />\n ),\n },\n }\n : {})}\n repositories={{\n selectedCount: repositories.selectionCount,\n disabled: terminal || composer.sending,\n panel: <FollowUpRepositoryMenuBody {...repositoryPickerProps} />,\n }}\n {...(runsOn.hasChoices ||\n props.session.rigId ||\n (runsOn.activeMachine && !runsOn.activeMachine.isSessionGroup)\n ? {\n runsOn: {\n summary: runsOn.activeName,\n panel: (\n <SessionRunsOnMenuBody\n runsOn={runsOn}\n workspaceId={props.session.workspaceId}\n rigId={props.session.rigId ?? null}\n move={moveRunsOn}\n />\n ),\n },\n }\n : {})}\n />\n </>\n }\n actions={\n !terminal ? (\n <LazyPart onLoadFailure=\"hide\" fallback={null}>\n <LazyCodexRealtimeControl\n client={realtimeClient}\n workspaceId={props.session.workspaceId}\n sessionId={props.session.id}\n sessionStatus={props.session.status}\n effectiveControl={\n props.queue.effectiveControl ?? props.session.effectiveControl\n }\n events={props.events}\n eventsReady={!props.initialLoading}\n codexConnected={codexConnected}\n realtimeAutostartModel={props.realtimeAutostartModel}\n onRealtimeAutostartConsumed={props.onRealtimeAutostartConsumed}\n onVoiceActiveChange={onVoiceActiveChange}\n />\n </LazyPart>\n ) : null\n }\n placeholder={chatComposerPlaceholder({\n cancelled: props.session.status === \"cancelled\",\n creditStopped:\n Boolean(props.creditExhausted) &&\n (props.session.status === \"failed\" || props.session.status === \"idle\"),\n stopRefusal,\n creditGap,\n canBuyCredits,\n })}\n controls={\n <div className=\"@container/model-controls flex min-w-0 flex-1 items-center gap-1.5\">\n <ModelPicker\n hasImageAttachments={attachments.attachments.some(\n (file) => file.status !== \"failed\" && file.contentType.startsWith(\"image/\"),\n )}\n open={modelPickerSession === props.session.id && !pendingRetryInput}\n onOpenChange={(open) => {\n setModelPickerSession(open ? props.session.id : null);\n if (open) void modelCatalog.refresh();\n }}\n rows={modelCatalog.rows}\n model={model}\n effort={reasoningEffort}\n latencyMode={latencyMode}\n disabled={modelPickerDisabled}\n loading={modelCatalog.loading || composer.draftLoading}\n error={modelCatalog.error ?? composerPolicyError}\n sessionKey={props.session.id}\n menuSide=\"top\"\n connectModelsHref={`/workspaces/${encodeURIComponent(props.session.workspaceId)}/settings?section=models`}\n claudeSubscriptionAvailable={\n context.clientConfig.claudeSubscriptionEnabled === true\n }\n onModelChange={(modelId) => {\n composer.setModel(modelId);\n usageModelSwitch.modelPicked(modelId);\n }}\n onEffortChange={composer.setReasoningEffort}\n onLatencyModeChange={composer.setLatencyMode}\n />\n {durableToolsError ? (\n <span className=\"sr-only\" role=\"alert\">\n {durableToolsError}\n </span>\n ) : null}\n </div>\n }\n />\n </div>\n </div>\n </ChatViewportFileDropTarget>,\n ),\n ),\n );\n}\n\n/** The model a \"model is not available\" refusal named: the API detail, else the attempted input. */\nfunction refusedModelId(error: Error, input: unknown): string | null {\n const details = (error as { details?: Record<string, unknown> | undefined }).details;\n if (typeof details?.modelId === \"string\" && details.modelId) return details.modelId;\n const attempted = (input as { model?: unknown } | null)?.model;\n return typeof attempted === \"string\" && attempted ? attempted : null;\n}\n","import type { OpenGeniBrowserClient as OpenGeniClient } from \"@opengeni/sdk/browser\";\nimport type { CapabilityCatalogItem } from \"../types\";\nimport { t } from \"../lib/console-text\";\nimport {\n catalogConnectionAccountSelection,\n oauthConnectionOwnership,\n oauthConnectionRef,\n} from \"../lib/capabilities\";\nimport {\n attachSessionCapability,\n continueAfterCapabilitySetup,\n} from \"../components/capabilities/attach-session-capability\";\n\nexport type McpCapabilityOAuthReturn = {\n name: string;\n /** A personal account still needs its own review on the card before this chat may use it. */\n needsPersonalReview: boolean;\n};\n\n/**\n * Finish an MCP capability's OAuth redirect back into a chat: bind the new\n * connection, verify the capability is enabled, add its tools to this chat\n * and let the agent continue the request that asked for it. Throws when any\n * step cannot be verified, so a failed setup never wakes the agent.\n */\nexport async function finishMcpCapabilityOAuthReturn(input: {\n client: OpenGeniClient;\n workspaceId: string;\n sessionId: string;\n capabilityId: string;\n params: URLSearchParams;\n catalog: readonly CapabilityCatalogItem[];\n refreshCatalog: (workspaceId: string) => Promise<unknown>;\n}): Promise<McpCapabilityOAuthReturn> {\n const { client, workspaceId, sessionId, params } = input;\n const item = input.catalog.find((candidate) => candidate.id === input.capabilityId);\n const connectionId = params.get(\"connectionId\");\n const providerDomain = params.get(\"providerDomain\");\n const ownership = oauthConnectionOwnership(params.get(\"ownership\"));\n if (!item || item.kind !== \"mcp\" || !connectionId || !providerDomain || !ownership) {\n throw new Error(\"The authorized capability could not be resolved from the live catalog.\");\n }\n await client.enableCapability(workspaceId, item.id, {\n connectionRef: oauthConnectionRef(\n ownership,\n connectionId,\n providerDomain,\n catalogConnectionAccountSelection(item),\n ),\n });\n await input.refreshCatalog(workspaceId);\n const connected = (await client.listCapabilities(workspaceId)).items.find(\n (candidate) => candidate.id === item.id,\n );\n if (!connected?.enabled)\n throw new Error(\"The connection was authorized, but enabling its tools could not be verified.\");\n if (connected.connectionRef?.subjectScope === \"subject\")\n return { name: item.name, needsPersonalReview: true };\n await attachSessionCapability(t, client, workspaceId, sessionId, connected);\n continueAfterCapabilitySetup(client, workspaceId, sessionId, connected.id);\n return { name: item.name, needsPersonalReview: false };\n}\n","import { useCallback, useLayoutEffect, useMemo, useState } from \"react\";\nimport type { ComposerState } from \"../../hooks/use-composer\";\nimport { getComposerSendBlocker, type ComposerSendBlocker } from \"./composer-send-blocking\";\n\n/** What else an open chat's Send waits on, apart from its model choice. */\nexport type SessionSendState = {\n uploadPending: boolean;\n repositoryError: string | null;\n personalDecision: boolean;\n machineAccessDenied: boolean;\n /** Something Send needs is still loading (the chat's tools, attachments, accounts). */\n loading: boolean;\n /** One of them failed to load; it shows its own message. */\n loadFailed: boolean;\n};\n\nexport type SessionSendGate = {\n /** Whether the composer's model choice can run, as last committed. */\n committedPolicyValid: boolean;\n commitPolicyValid: (valid: boolean) => void;\n /** Send's blocker, read while the composer renders and when Send is pressed. */\n blocker: (state: SessionSendState) => ComposerSendBlocker | null;\n};\n\n/**\n * The session page's Send guard. Whether the model choice can run depends on\n * the composer's own policy, so the page works it out after the composer\n * renders, while the guard needs it during that render: the guard reads the\n * committed answer (state, updated by useSessionComposerDelivery before paint).\n */\nexport function useSessionSendGate(): SessionSendGate {\n const [committedPolicyValid, commitPolicyValid] = useState(false);\n const blocker = useCallback(\n (state: SessionSendState) =>\n getComposerSendBlocker({\n uploadPending: state.uploadPending,\n repositoryError: state.repositoryError,\n policyValid: committedPolicyValid,\n personalDecision: state.personalDecision,\n machineAccessDenied: state.machineAccessDenied,\n personalLoading: state.loading || state.loadFailed,\n }),\n [committedPolicyValid],\n );\n return { committedPolicyValid, commitPolicyValid, blocker };\n}\n\n/**\n * The session composer as the page hands it out. Send reports `preparing`\n * while the committed model check lags the current one, while the model list\n * is still loading without a runnable choice, while an unavailable model is\n * being replaced, and while anything else Send needs is loading. A Send\n * pressed early then waits for the composer instead of being dropped in\n * between; a failure ends the wait and shows its own message.\n */\nexport function useSessionComposerDelivery<T extends ComposerState>(\n composer: T,\n gate: SessionSendGate,\n {\n policyValid,\n catalogLoading,\n replacingModel,\n send,\n }: {\n /** Whether the composer's model choice can run, worked out in this render. */\n policyValid: boolean;\n catalogLoading: boolean;\n replacingModel: boolean;\n send: SessionSendState;\n },\n): T {\n const { commitPolicyValid, committedPolicyValid } = gate;\n useLayoutEffect(() => {\n commitPolicyValid(policyValid);\n }, [commitPolicyValid, policyValid]);\n const preparing =\n composer.preparing === true ||\n policyValid !== committedPolicyValid ||\n (catalogLoading && !policyValid) ||\n replacingModel ||\n send.loading;\n return useMemo(\n () => ((composer.preparing === true) === preparing ? composer : { ...composer, preparing }),\n [composer, preparing],\n );\n}\n","// Keeps a parent session's view of its sub-sessions' waits current. The\n// workspace's live session-list hints (the same ones that move the orange dot\n// in the rail, batched by the server) re-read the tree when they name a\n// sub-session, and this session's agent answering or steering one re-reads it\n// once that call has run, so a card appears and clears without waiting for\n// the lineage poll.\nimport type { LineageNode, SessionEvent } from \"@opengeni/sdk\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport type { EmbeddedSessionEventClientLike } from \"../../client\";\nimport { useDebouncedCallback, useSessionEventTrigger } from \"../../hooks/internal\";\nimport { useOpenGeni } from \"../../session-context\";\nimport {\n descendantsRunning,\n hintTouchesTree,\n isSubSessionResponseOutput,\n lineageSessionIds,\n subSessionResponseCallIds,\n waitingDescendants,\n} from \"./descendant-requests\";\n\n/** The lineage poll: the default, and while sub-sessions are active without live hints. */\nexport const LINEAGE_POLL_MS = 30_000;\nexport const LINEAGE_POLL_ACTIVE_WITHOUT_HINTS_MS = 15_000;\n\n/** Whether a tree has a sub-session that is running or waiting on the person. */\nexport function treeNeedsWatching(nodes: readonly LineageNode[]): boolean {\n return descendantsRunning(nodes) || waitingDescendants(nodes).length > 0;\n}\n\n/**\n * How often to re-read the lineage. Live hints make a fast poll unnecessary;\n * without them (an embed authorized per session gets none) the poll speeds up\n * only while a sub-session is running or waiting. The tree comes from the\n * read this interval drives, so the page reports it through `observeTree`.\n */\nexport function useLineagePollInterval(workspaceId: string): {\n pollIntervalMs: number;\n observeTree: (nodes: readonly LineageNode[]) => void;\n} {\n const { workspaceSessionListEvent } = useOpenGeni();\n const [active, setActive] = useState(false);\n const observeTree = useCallback(\n (nodes: readonly LineageNode[]) => setActive(treeNeedsWatching(nodes)),\n [],\n );\n const live =\n workspaceSessionListEvent?.workspaceId === workspaceId &&\n workspaceSessionListEvent.available === true;\n return {\n pollIntervalMs: !live && active ? LINEAGE_POLL_ACTIVE_WITHOUT_HINTS_MS : LINEAGE_POLL_MS,\n observeTree,\n };\n}\n\n/**\n * Re-read the lineage when a hint names a descendant (or, while one runs, a\n * session the read has not seen yet, which it may have just spawned), and\n * when this session's agent has answered or steered a sub-session. Waiting\n * items re-read their requests when the re-read tree shows their sub-session\n * moved on; the returned signal increments after an agent answer, so every\n * open item re-reads even if the tree read raced the answer.\n */\nexport function useDescendantRequestsRefresh(options: {\n client: EmbeddedSessionEventClientLike;\n workspaceId: string;\n sessionId: string;\n events: SessionEvent[];\n /** The session's descendants (its lineage children), never the session itself. */\n nodes: readonly LineageNode[];\n refreshLineage: () => Promise<void>;\n}): number {\n const { client, workspaceId, sessionId, events, nodes, refreshLineage } = options;\n const { workspaceSessionListEvent } = useOpenGeni();\n const [signal, setSignal] = useState(0);\n const refreshLineageRef = useRef(refreshLineage);\n useEffect(() => {\n refreshLineageRef.current = refreshLineage;\n }, [refreshLineage]);\n const refreshTreeSoon = useDebouncedCallback(() => {\n void refreshLineageRef.current();\n }, 150);\n const refreshAllSoon = useDebouncedCallback(() => {\n void refreshLineageRef.current();\n setSignal((value) => value + 1);\n }, 150);\n\n const tree = useMemo(\n () => ({ ids: lineageSessionIds(nodes), running: descendantsRunning(nodes) }),\n [nodes],\n );\n const treeRef = useRef(tree);\n useEffect(() => {\n treeRef.current = tree;\n }, [tree]);\n\n useEffect(() => {\n const hint = workspaceSessionListEvent;\n if (!hint || hint.workspaceId !== workspaceId || !hint.available) return;\n // A hidden tab catches up through the lineage poll when it is shown again.\n if (document.visibilityState === \"hidden\") return;\n const current = treeRef.current;\n // This session's own spawns reach the tree through its feed; only a\n // running descendant can add a session the read has not seen yet.\n const unseen =\n current.running &&\n (hint.sessionIds ?? []).some((id) => id !== sessionId && !current.ids.has(id));\n if (hintTouchesTree(hint, current.ids) || unseen) refreshTreeSoon();\n }, [refreshTreeSoon, sessionId, workspaceId, workspaceSessionListEvent]);\n\n // An output carries only its call id: match it to the call that answered.\n const responseCallIds = useMemo(() => subSessionResponseCallIds(events), [events]);\n const matchResponse = useCallback(\n (event: SessionEvent) => isSubSessionResponseOutput(event, responseCallIds),\n [responseCallIds],\n );\n // The tree is read when the page opens, so answers already in the first\n // history page this session's feed loads are reflected; only later ones\n // trigger a re-read.\n const [history, setHistory] = useState<{ sessionId: string; through: number } | null>(null);\n const newest = events.at(-1);\n if (newest && newest.sessionId === sessionId && history?.sessionId !== sessionId) {\n setHistory({ sessionId, through: newest.sequence });\n }\n const readThrough = history?.sessionId === sessionId ? history.through : \"reading\";\n const onResponse = useCallback(() => refreshAllSoon(), [refreshAllSoon]);\n useSessionEventTrigger(client, workspaceId, sessionId, matchResponse, onResponse, {\n events,\n readThrough,\n });\n return signal;\n}\n","import { useEffect } from \"react\";\n\nimport { useCalmServiceFailure } from \"../../lib/use-calm-service-failure\";\nimport { isApiErrorStatus } from \"./app-api\";\nimport { toast } from \"./toast\";\n\n/**\n * Toast the session page's read failures, once per error. The read hooks keep\n * transient failures (a rolling deploy, a network blip) quiet while they retry\n * and keep one stable error per outage, so an error reaches here only when it\n * is definitive or outlasted the quiet window. A transient one still waits out\n * the calm update window (and the maintenance marker never toasts): Opengeni is\n * updating and the page reconnects by itself. A 404 renders the unavailable\n * route instead of a toast.\n */\nexport function useSessionFailureToasts(loadError: Error | null, streamError: Error | null): void {\n const streamCalm = useCalmServiceFailure(streamError);\n const loadCalm = useCalmServiceFailure(loadError);\n useEffect(() => {\n if (streamError && !streamCalm && !isApiErrorStatus(streamError, 404)) {\n toast.error(\"Event stream disconnected\", {\n description: streamError.message,\n });\n }\n }, [streamCalm, streamError]);\n useEffect(() => {\n if (loadError && !loadCalm && !isApiErrorStatus(loadError, 404)) {\n toast.error(\"Failed to load session\", { description: String(loadError) });\n }\n }, [loadCalm, loadError]);\n}\n","// Where the session route's chat sits. On its own page it is the page's open\n// chat: it publishes its session, connection and event feed to the app (the\n// header, the sidebar's row projections and the command menu read them),\n// remembers itself as the last chat and reports to an embedding host. In a\n// panel beside another view (the Site view) it is not the page's chat, so it\n// keeps all of that to itself.\nimport type { Session } from \"@opengeni/sdk\";\nimport type { SessionCreationHandoff } from \"../app-context\";\n\nexport type SessionRoutePlacement = \"page\" | \"panel\";\n\ntype AppStateTargets = {\n setSession: unknown;\n setConnectionState: unknown;\n sessionEventFeedStore: unknown;\n};\n\n/** A panel chat's updates to the page's open-chat state, which it doesn't own. */\nfunction ignoreRoutedUpdate(): void {}\n\n/**\n * The app-wide session state the route writes to. A panel chat gets no-op\n * setters and its own event feed store.\n */\nexport function sessionRouteAppState<T extends AppStateTargets>(\n placement: SessionRoutePlacement,\n context: T,\n panelEventFeed: T[\"sessionEventFeedStore\"],\n): {\n routed: boolean;\n setSession: T[\"setSession\"];\n setConnectionState: T[\"setConnectionState\"];\n sessionEventFeedStore: T[\"sessionEventFeedStore\"];\n} {\n if (placement === \"page\") {\n return {\n routed: true,\n setSession: context.setSession,\n setConnectionState: context.setConnectionState,\n sessionEventFeedStore: context.sessionEventFeedStore,\n };\n }\n return {\n routed: false,\n setSession: ignoreRoutedUpdate as T[\"setSession\"],\n setConnectionState: ignoreRoutedUpdate as T[\"setConnectionState\"],\n sessionEventFeedStore: panelEventFeed,\n };\n}\n\n/**\n * The creation handoff for `sessionId`: the one its host passed takes\n * precedence. The app's own handoff only applies to the page's open chat, so\n * a panel never picks up a chat the page itself just created.\n */\nexport function sessionRouteCreationHandoff(input: {\n sessionId: string;\n given: SessionCreationHandoff | null | undefined;\n app: SessionCreationHandoff | null;\n appSession: Pick<Session, \"id\"> | null;\n routed: boolean;\n}): SessionCreationHandoff | null {\n const { sessionId, given, app, appSession, routed } = input;\n if (given?.session.id === sessionId) return given;\n if (routed && app?.session.id === sessionId && appSession?.id === sessionId) return app;\n return null;\n}\n","import { useEffect } from \"react\";\n\n/**\n * Ctrl/⌘+F opens the conversation's find while key events reach `scope`.\n * A page chat listens on the window; an embedded app or a chat in a panel\n * beside another view listens on its own element, so it takes the shortcut\n * only while focus is inside it and the rest of the page (and the browser)\n * keeps its own find. A null scope (a panel not mounted yet) takes nothing.\n */\nexport function useFindShortcut(input: { scope: EventTarget | null }, open: () => void): void {\n const { scope } = input;\n useEffect(() => {\n if (!scope) return;\n const onKeyDown = (event: KeyboardEvent) => {\n if (\n !(event.ctrlKey || event.metaKey) ||\n event.altKey ||\n event.shiftKey ||\n event.key.toLowerCase() !== \"f\"\n )\n return;\n const target = event.target;\n // Dialogs and embedded editors own their own keyboard search behavior.\n if (\n target instanceof Element &&\n target.closest('[role=\"dialog\"], .cm-editor, .xterm, [data-native-find]')\n )\n return;\n event.preventDefault();\n open();\n };\n scope.addEventListener(\"keydown\", onKeyDown as EventListener);\n return () => scope.removeEventListener(\"keydown\", onKeyDown as EventListener);\n }, [open, scope]);\n}\n","import type { Session, SessionEvent, SessionEventType } from \"@opengeni/sdk\";\n\nimport { isCodexProductModel } from \"./session-model\";\n\n/** Events that say whether a chat's live context is a compaction checkpoint. */\nexport const CONTEXT_CHECKPOINT_EVENT_TYPES: SessionEventType[] = [\n \"session.context.compacted\",\n \"session.context.cleared\",\n];\n\n/**\n * Whether the newest context checkpoint among `events` is a compaction\n * (true), a clear (false), or absent (null). In a Codex remote_v2 chat every\n * compaction is Codex's own, which other models cannot read.\n */\nexport function latestCheckpointIsCompaction(events: readonly SessionEvent[]): boolean | null {\n // By sequence, so a page read newest-first answers the same.\n let latest: SessionEvent | null = null;\n for (const event of events) {\n if (event.type !== \"session.context.compacted\" && event.type !== \"session.context.cleared\")\n continue;\n if (!latest || event.sequence > latest.sequence) latest = event;\n }\n return latest ? latest.type === \"session.context.compacted\" : null;\n}\n\n/**\n * A chat Codex compacted is about to run on another provider's model, which\n * rebuilds its earlier messages from a fresh summary. Chats without a Codex\n * compaction switch with nothing to rebuild and need no heads-up.\n */\nexport function needsModelSwitchHeadsUp(input: {\n codexCompactionMode: Session[\"codexCompactionMode\"] | null | undefined;\n codexCompacted: boolean;\n model: string | null | undefined;\n}): boolean {\n return (\n input.codexCompactionMode === \"remote_v2\" &&\n input.codexCompacted &&\n typeof input.model === \"string\" &&\n input.model.length > 0 &&\n !isCodexProductModel(input.model)\n );\n}\n\nexport function modelSwitchHeadsUpText(modelLabel: string): string {\n return `Earlier messages will be re-summarized for ${modelLabel}, so it may remember less detail.`;\n}\n\n/**\n * When this chat's Codex usage limit resets, from its newest usage-limit\n * event: the capacity wait it is parked on, or the turn the limit stopped.\n * Null when that event names no reset.\n */\nexport function codexUsageResetsAt(events: readonly SessionEvent[]): string | null {\n let latest: SessionEvent | null = null;\n for (const event of events) {\n const usageEvent =\n event.type === \"codex.capacity.waiting\" ||\n event.type === \"turn.capacity_waiting\" ||\n (event.type === \"turn.failed\" && payloadField(event, \"code\") === \"codex_usage_limit_reached\");\n if (usageEvent && (!latest || event.sequence > latest.sequence)) latest = event;\n }\n // A wait whose reason changed later records its reset as `earliestResetAt`.\n const resetsAt = latest\n ? (payloadField(latest, \"resetsAt\") ?? payloadField(latest, \"earliestResetAt\"))\n : null;\n return typeof resetsAt === \"string\" && !Number.isNaN(Date.parse(resetsAt)) ? resetsAt : null;\n}\n\n/** Waits that only capacity coming back (a usage reset) ends. */\nconst USAGE_WAIT_REASONS: ReadonlySet<string> = new Set([\n \"no_eligible_capacity\",\n \"compaction_provider_locked\",\n // The chat's pinned account is out of usage until its reset.\n \"pinned_account_unavailable\",\n]);\n\n/**\n * Whether the newest capacity wait is a usage wait, not one that needs a\n * person to act (a turned-off or ineligible account, a model not allowed).\n */\nexport function codexWaitIsUsageLimit(events: readonly SessionEvent[]): boolean {\n let latest: SessionEvent | null = null;\n for (const event of events) {\n const wait = event.type === \"codex.capacity.waiting\" || event.type === \"turn.capacity_waiting\";\n if (wait && (!latest || event.sequence > latest.sequence)) latest = event;\n }\n if (!latest || payloadField(latest, \"actionRequired\") === true) return false;\n const reason = payloadField(latest, \"waitReason\");\n return reason === undefined || reason === null || USAGE_WAIT_REASONS.has(String(reason));\n}\n\nfunction payloadField(event: SessionEvent, key: string): unknown {\n const payload = event.payload as Record<string, unknown> | null | undefined;\n return payload && typeof payload === \"object\" ? payload[key] : undefined;\n}\n\n/**\n * \"Continue at reset\" for a chat blocked on its Codex usage limit. A turn the\n * limit refused waits for capacity and continues at the reset unless the chat\n * is paused. A chat the limit stopped (failed or idle) is not waiting.\n */\nexport function codexUsageContinuesAtReset(input: {\n status: Session[\"status\"];\n paused: boolean;\n}): boolean {\n return input.status === \"waiting_capacity\" && !input.paused;\n}\n\n/**\n * Whether the usage-limit line describes this chat. A Codex usage wait with\n * a known reset is a usage limit. A wait with no reset in sight (for example\n * no ChatGPT plan connected any more) or one that needs a person to act keeps\n * the server's own wait message, which names the actual cause.\n */\nexport function codexUsageNoticeApplies(input: {\n status: Session[\"status\"];\n resetsAt: string | null;\n usageWait: boolean;\n}): boolean {\n return input.status !== \"waiting_capacity\" || (input.usageWait && input.resetsAt !== null);\n}\n\n/**\n * What switching \"Continue at reset\" to `next` does: pause or resume the\n * waiting chat, or run a stopped chat's work again on its Codex model, which\n * waits for the reset (resuming a paused chat first, so that work isn't held\n * back). Null when nothing changes.\n */\nexport function codexUsageContinueAtResetAction(input: {\n status: Session[\"status\"];\n paused: boolean;\n next: boolean;\n}): \"pause\" | \"resume\" | \"run_on_codex\" | \"resume_and_run_on_codex\" | null {\n if (input.next === codexUsageContinuesAtReset(input)) return null;\n if (input.status === \"waiting_capacity\") return input.next ? \"resume\" : \"pause\";\n if (!input.next) return null;\n return input.paused ? \"resume_and_run_on_codex\" : \"run_on_codex\";\n}\n\n/**\n * \"Resets at 14:05.\" the same day, \"Resets Sat 14:05.\" within a week, else\n * with its date; plainly unknown without a reset time.\n */\nexport function codexUsageResetText(\n resetsAt: string | null,\n options: { now?: Date; locale?: string; timeZone?: string } = {},\n): string {\n const reset = resetsAt === null ? Number.NaN : Date.parse(resetsAt);\n if (Number.isNaN(reset)) return \"Reset time unknown.\";\n const now = options.now ?? new Date();\n if (reset <= now.getTime()) return \"Resets soon.\";\n const zone = options.timeZone ? { timeZone: options.timeZone } : {};\n const day = (date: Date) =>\n new Intl.DateTimeFormat(\"en-CA\", { dateStyle: \"short\", ...zone }).format(date);\n const at = new Date(reset);\n const time = new Intl.DateTimeFormat(options.locale, { timeStyle: \"short\", ...zone }).format(at);\n if (day(at) === day(now)) return `Resets at ${time}.`;\n const withinWeek = reset - now.getTime() < 6 * 24 * 60 * 60 * 1000;\n const date = new Intl.DateTimeFormat(\n options.locale,\n withinWeek ? { weekday: \"short\", ...zone } : { month: \"short\", day: \"numeric\", ...zone },\n ).format(at);\n return `Resets ${date} ${time}.`;\n}\n"],"mappings":"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","names":["useCallback","useMemo","useState","useState","useCallback","useMemo","useCallback","useEffect","useLayoutEffect","useMemo","useRef","useState","useEffect","useEffect","useEffect","date","Fragment","useCallback","useEffect","useRef","useMemo","useState","useLayoutEffect","returnPath","response"]}
|