@opengeni/react 6.7.0 → 6.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app/app-state.js +9 -9
- package/dist/app/components/Composer.js +20 -20
- package/dist/app/components/agent/agent-capability-picker.js +6 -6
- package/dist/app/components/artifacts/artifact-browse-controls.js +2 -2
- package/dist/app/components/artifacts/artifact-library.js +13 -13
- package/dist/app/components/artifacts/artifact-viewer.js +21 -21
- package/dist/app/components/artifacts/chat-interactive-block.js +14 -14
- package/dist/app/components/artifacts/copy-artifact-link.js +2 -2
- package/dist/app/components/artifacts/file-reach-dialog.js +7 -7
- package/dist/app/components/artifacts/inline-chat-image.js +22 -22
- package/dist/app/components/artifacts/retained-file-preview.js +23 -23
- package/dist/app/components/artifacts/retained-text-preview.js +3 -3
- package/dist/app/components/artifacts/site-actions.d.ts +43 -0
- package/dist/app/components/artifacts/site-actions.js +38 -0
- package/dist/app/components/artifacts/site-audience.js +5 -5
- package/dist/app/components/artifacts/site-conversations.js +13 -13
- package/dist/app/components/artifacts/site-data.js +14 -14
- package/dist/app/components/artifacts/site-publishing-page.js +31 -31
- package/dist/app/components/artifacts/site-publishing.js +25 -25
- package/dist/app/components/artifacts/site-settings.js +30 -30
- package/dist/app/components/artifacts/site-version-menu.js +3 -3
- package/dist/app/components/billing-class-mark.js +3 -3
- package/dist/app/components/bots/bot-launch-strip.js +23 -23
- package/dist/app/components/bots/bot-template-dialog.js +30 -30
- package/dist/app/components/bots/bot-template-shortcuts.js +23 -23
- package/dist/app/components/bots/bot-templates-page.js +37 -37
- package/dist/app/components/capabilities/capability-detail-sheet.js +9 -9
- package/dist/app/components/capabilities/capability-logo-source.js +14 -15
- package/dist/app/components/capabilities/connection-ownership-selector.js +4 -4
- package/dist/app/components/capabilities/connector-tool-permissions.js +4 -4
- package/dist/app/components/capabilities/detail-dialog.js +3 -3
- package/dist/app/components/capabilities/native-connect-setup.js +16 -17
- package/dist/app/components/capabilities/native-connect-setup.js.map +1 -1
- package/dist/app/components/capabilities/own-logins-shared-heads-up.js +3 -3
- package/dist/app/components/capabilities/prepared-mcp-setup-card.js +16 -17
- package/dist/app/components/capabilities/session-capability-card.js +49 -50
- package/dist/app/components/capabilities/session-capability-card.js.map +1 -1
- package/dist/app/components/capabilities/session-chrome-card.js +24 -25
- package/dist/app/components/capabilities/session-custom-mcp-card.js +17 -18
- package/dist/app/components/capabilities/session-github-card.js +17 -18
- package/dist/app/components/capabilities/session-machine-card.js +23 -24
- package/dist/app/components/capabilities/session-personal-github-card.js +15 -16
- package/dist/app/components/capabilities/session-plugin-card.js +9 -10
- package/dist/app/components/capabilities/use-connection-accounts.js +2 -2
- package/dist/app/components/command-menu/chat-status.js +19 -19
- package/dist/app/components/command-menu/chat-switcher.js +35 -35
- package/dist/app/components/command-menu/command-menu.js +42 -42
- package/dist/app/components/command-menu/shortcut-sheet.js +11 -11
- package/dist/app/components/composer-capabilities-menu-body.js +4 -4
- package/dist/app/components/composer-mobile-plus-panel.js +10 -10
- package/dist/app/components/composer-mobile-plus.js +3 -3
- package/dist/app/components/credit-required-gate.js +1 -1
- package/dist/app/components/credit-required-prompt.js +4 -4
- package/dist/app/components/credits/checkout-credits-celebration.js +3 -3
- package/dist/app/components/credits/checkout-return.js +3 -3
- package/dist/app/components/credits/credit-refusal-notice.js +2 -2
- package/dist/app/components/desktop/app-shots.js +6 -6
- package/dist/app/components/desktop/computer-use.js +2 -2
- package/dist/app/components/desktop/this-computer.js +5 -5
- package/dist/app/components/feedback.js +5 -5
- package/dist/app/components/github-app-connect-launcher.js +1 -1
- package/dist/app/components/machines/connect-machine-dialog.js +14 -14
- package/dist/app/components/markdown.js +7 -7
- package/dist/app/components/models/models-ui.js +6 -6
- package/dist/app/components/my-things.js +6 -6
- package/dist/app/components/own-where-it-works.js +5 -5
- package/dist/app/components/personal-resource-attachment-surface.js +4 -4
- package/dist/app/components/pickers.js +5 -5
- package/dist/app/components/rail/channel-create-dialog.js +5 -5
- package/dist/app/components/rail/project-glyph.js +23 -23
- package/dist/app/components/rail/project-profile.js +32 -32
- package/dist/app/components/rail/rail-context.js +1 -1
- package/dist/app/components/rail/rail-sections.js +70 -61
- package/dist/app/components/rail/session-header.js +54 -53
- package/dist/app/components/rail/session-list.js +68 -59
- package/dist/app/components/rail/session-row-content.js +4 -4
- package/dist/app/components/rail/session-row-hover-details.js +18 -18
- package/dist/app/components/rail/session-shell.js +89 -80
- package/dist/app/components/rail/site-session-group-heading.js +29 -12
- package/dist/app/components/session/agent-configuration-panel.js +14 -14
- package/dist/app/components/session/artifact-session-page.js +5 -5
- package/dist/app/components/session/banners.js +9 -9
- package/dist/app/components/session/console-new-conversation.js +43 -44
- package/dist/app/components/session/descendant-requests.js +39 -40
- package/dist/app/components/session/descendant-requests.js.map +1 -1
- package/dist/app/components/session/editable-artifacts-workspace.js +27 -27
- package/dist/app/components/session/failed-session-banner.js +9 -9
- package/dist/app/components/session/failure-recovery-boundary.js +3 -3
- package/dist/app/components/session/human-input-delegation-record.js +2 -2
- package/dist/app/components/session/human-input.js +37 -38
- package/dist/app/components/session/inspector.js +47 -48
- package/dist/app/components/session/inspector.js.map +1 -1
- package/dist/app/components/session/message-actions.js +5 -5
- package/dist/app/components/session/message-resource-attachments.js +13 -13
- package/dist/app/components/session/model-recovery-notice.js +3 -3
- package/dist/app/components/session/new-session-settings-menu.js +6 -6
- package/dist/app/components/session/new-session-setup-strip.js +24 -24
- package/dist/app/components/session/sandbox-recovery-actions.js +5 -5
- package/dist/app/components/session/sandbox-switcher.js +8 -8
- package/dist/app/components/session/sandbox-workspace.js +52 -53
- package/dist/app/components/session/search-markdown-highlight.js +8 -8
- package/dist/app/components/session/search-results-view.js +9 -9
- package/dist/app/components/session/session-admin-access.js +5 -5
- package/dist/app/components/session/session-admission-notice.js +4 -4
- package/dist/app/components/session/session-avatar-picker.js +24 -24
- package/dist/app/components/session/session-avatar.js +22 -22
- package/dist/app/components/session/session-machine-access-notice.js +4 -4
- package/dist/app/components/session/session-profile-dialog.js +29 -29
- package/dist/app/components/session/session-profile-editor.js +30 -30
- package/dist/app/components/session/session-retention.js +3 -3
- package/dist/app/components/session/session-search-dialog.js +11 -11
- package/dist/app/components/session/session-tenancy-control.js +4 -4
- package/dist/app/components/session/session-usage-limit-section.js +4 -4
- package/dist/app/components/session/share-chat-dialog.js +7 -7
- package/dist/app/components/session/subagents.js +12 -12
- package/dist/app/components/session/subscription-account-indicator.js +6 -6
- package/dist/app/components/settings/row-select.js +4 -4
- package/dist/app/components/transcription-settings.js +6 -6
- package/dist/app/components/ui/destructive-confirm.js +7 -7
- package/dist/app/components/usage/usage-entry.js +3 -3
- package/dist/app/components/window-bar.d.ts +3 -1
- package/dist/app/components/window-bar.js +13 -11
- package/dist/app/components/workspace-composer-plus.js +19 -20
- package/dist/app/components/workspace-reach.js +4 -4
- package/dist/app/embed/session-app.js +173 -167
- package/dist/app/lib/actions/actions-provider.js +9 -9
- package/dist/app/lib/agent-capabilities.js +3 -3
- package/dist/app/lib/codex-usage-query.js +2 -2
- package/dist/app/lib/composer-connectors.js +15 -16
- package/dist/app/lib/composer-send-blocking.d.ts +135 -1
- package/dist/app/lib/composer-send-blocking.js +30 -3
- package/dist/app/lib/console-site.js +2 -2
- package/dist/app/lib/console-text.js +2 -2
- package/dist/app/lib/copy-link.d.ts +2 -0
- package/dist/app/lib/events.js +15 -15
- package/dist/app/lib/failed-session-copy.js +4 -4
- package/dist/app/lib/model-access-onboarding.js +3 -3
- package/dist/app/lib/model-access.js +2 -2
- package/dist/app/lib/move-chat-to-machine.js +3 -3
- package/dist/app/lib/session-branch-cache.js +12 -12
- package/dist/app/lib/session-composer-readiness.d.ts +2 -2
- package/dist/app/lib/session-create.js +4 -4
- package/dist/app/lib/session-group-pagination.js +12 -12
- package/dist/app/lib/session-hover-facts.js +17 -17
- package/dist/app/lib/session-model.js +2 -2
- package/dist/app/lib/session-rail.js +9 -9
- package/dist/app/lib/session-rename.js +3 -3
- package/dist/app/lib/sessions-group.js +11 -11
- package/dist/app/lib/site-sidebar-bridge.d.ts +24 -0
- package/dist/app/lib/site-tool-consent-dialog.js +9 -10
- package/dist/app/lib/site-tool-consent-dialog.js.map +1 -1
- package/dist/app/lib/site-tool-consent.js +1 -1
- package/dist/app/lib/turn-failure-analytics.js +5 -5
- package/dist/app/lib/use-follow-up-repositories.js +5 -5
- package/dist/app/lib/use-workspace-machines.js +5 -5
- package/dist/app/lib/use-workspace-model-catalog.js +3 -3
- package/dist/app/lib/use-workspace-rigs.js +2 -2
- package/dist/app/lib/workspace-navigation-preference.js +4 -4
- package/dist/app/lib/workspace-scope-context.js +3 -3
- package/dist/app/routes/artifacts.js +69 -69
- package/dist/app/routes/retained-artifact.js +48 -48
- package/dist/app/routes/session.js +100 -101
- package/dist/app/routes/sessions-index-hydration.js +5 -5
- package/dist/app/routes/sessions-index.js +85 -85
- package/dist/app/routes/site-view.js +177 -85
- package/dist/app/routes/site-view.js.map +1 -1
- package/dist/artifacts-document.js +4 -4
- package/dist/artifacts-presentation.js +4 -4
- package/dist/artifacts-spreadsheet.js +4 -4
- package/dist/artifacts.js +13 -13
- package/dist/automations.js +12 -12
- package/dist/{browser-viewer-TC27OCIP.js → browser-viewer-ZHQDVHZ2.js} +5 -5
- package/dist/{chat-interactive-block-RWPQBHVS.js → chat-interactive-block-VSDD6X3M.js} +5 -5
- package/dist/{chunk-5MOJZORA.js → chunk-2EA4IRIP.js} +34 -3
- package/dist/chunk-2EA4IRIP.js.map +1 -0
- package/dist/{chunk-C43KRXGA.js → chunk-2GCHGWNE.js} +3 -3
- package/dist/{chunk-XLH7QY2R.js → chunk-2J77TWGH.js} +3 -3
- package/dist/{chunk-77WAKEAH.js → chunk-2OXSB2OL.js} +2 -2
- package/dist/{chunk-H3T7IWNA.js → chunk-2VJOSU4H.js} +2 -2
- package/dist/{chunk-N6AACDUW.js → chunk-34NV52R3.js} +4 -4
- package/dist/{chunk-L7YTNTIK.js → chunk-3CDJSKDW.js} +3 -3
- package/dist/{chunk-EWSOC6WF.js → chunk-3DRLCX5V.js} +2 -2
- package/dist/{chunk-JEUPAVYY.js → chunk-3L465FBR.js} +6 -6
- package/dist/{chunk-5NWEKLDZ.js → chunk-3NNAC43A.js} +2 -2
- package/dist/{chunk-EDI6SJ2N.js → chunk-3OK7Y6ES.js} +2 -2
- package/dist/{chunk-AWKES45Y.js → chunk-3PM3M2Q6.js} +2 -2
- package/dist/{chunk-I7XIZRFD.js → chunk-3PZ3LRPV.js} +3 -3
- package/dist/{chunk-AW2MQB37.js → chunk-44JWVYJB.js} +2 -2
- package/dist/{chunk-2M3J7ZWQ.js → chunk-467WDSOK.js} +2 -2
- package/dist/{chunk-UTIAXH52.js → chunk-477DTTMH.js} +3 -3
- package/dist/{chunk-J5F5HPPW.js → chunk-4BWMAGJJ.js} +3 -3
- package/dist/{chunk-YSJEAAOL.js → chunk-4F3AEJI6.js} +4 -4
- package/dist/{chunk-LHPNABDH.js → chunk-4JXPLTWV.js} +2 -2
- package/dist/{chunk-RQKLF42C.js → chunk-4K64EKM7.js} +4 -4
- package/dist/{chunk-NUNZS36W.js → chunk-4O2XWOLZ.js} +3 -3
- package/dist/{chunk-QB2KMIDP.js → chunk-4SJAEPM2.js} +2 -2
- package/dist/{chunk-6JHU2UBS.js → chunk-4Z5X7PLC.js} +3 -3
- package/dist/{chunk-2STUPWEL.js → chunk-54U6ZBEX.js} +3 -3
- package/dist/{chunk-XXSOHN35.js → chunk-5FLYHX5R.js} +2 -2
- package/dist/{chunk-MIYFS2XN.js → chunk-5MHMCE2G.js} +3 -3
- package/dist/{chunk-YWVI6ZMK.js → chunk-5MIBQ4P5.js} +2 -2
- package/dist/chunk-6B73WNLR.js +173 -0
- package/dist/chunk-6B73WNLR.js.map +1 -0
- package/dist/{chunk-5O2FCCHZ.js → chunk-6QK65ZWM.js} +3 -3
- package/dist/{chunk-RPVREAU7.js → chunk-736RUNIA.js} +4 -4
- package/dist/{chunk-2KALVELR.js → chunk-74CBR5YE.js} +3 -3
- package/dist/{chunk-5IE76VCY.js → chunk-752WXSDN.js} +2 -2
- package/dist/{chunk-OPJJSKUK.js → chunk-77B6UCNK.js} +6 -6
- package/dist/{chunk-SEO7TICN.js → chunk-77BHKC43.js} +1 -1
- package/dist/{chunk-ZUA3JMI6.js → chunk-77SYIH6O.js} +2 -2
- package/dist/{chunk-ILDXWY37.js → chunk-7AI4E7PV.js} +2 -2
- package/dist/{chunk-C372BFOV.js → chunk-7NLF35YL.js} +4 -4
- package/dist/{chunk-IFB3WJ36.js → chunk-7YTR3UFO.js} +4 -4
- package/dist/{chunk-BMICEQZQ.js → chunk-7Z76QP64.js} +3 -3
- package/dist/{chunk-YWIFM7D7.js → chunk-AAS7OWV6.js} +3 -3
- package/dist/{chunk-5QAY6K77.js → chunk-AB5IW227.js} +3 -3
- package/dist/{chunk-ZBIXBQNI.js → chunk-ABJZDRW2.js} +2 -2
- package/dist/{chunk-4DVJ6ONS.js → chunk-AH3DGOTK.js} +2 -2
- package/dist/{chunk-HGKTHF2U.js → chunk-AJBDAVX3.js} +8 -8
- package/dist/{chunk-5YKW2K6I.js → chunk-AJDGP2N4.js} +20 -20
- package/dist/{chunk-HD5X76TP.js → chunk-AQQT2FIC.js} +5 -5
- package/dist/chunk-AQQT2FIC.js.map +1 -0
- package/dist/{chunk-SC6RRD2D.js → chunk-ARTEEI2E.js} +11 -2
- package/dist/{chunk-SC6RRD2D.js.map → chunk-ARTEEI2E.js.map} +1 -1
- package/dist/{chunk-IXPTECSC.js → chunk-AVXDIRRW.js} +2 -2
- package/dist/{chunk-QK5EFEUT.js → chunk-BASI553K.js} +4 -4
- package/dist/{chunk-CRU35QQH.js → chunk-BFFNINCC.js} +108 -66
- package/dist/chunk-BFFNINCC.js.map +1 -0
- package/dist/{chunk-Z4FMAFNH.js → chunk-BQYRZIZ7.js} +2 -2
- package/dist/{chunk-DZXEDSQI.js → chunk-CEMSIU4Z.js} +5 -5
- package/dist/{chunk-FZC5N55X.js → chunk-CH4UQ4NO.js} +5 -5
- package/dist/{chunk-7X6SDK2C.js → chunk-CHU3RDV4.js} +3 -3
- package/dist/{chunk-Y4OBB2VN.js → chunk-CV4VVLPZ.js} +2 -2
- package/dist/{chunk-JQL7ZH6C.js → chunk-CXAN2FHF.js} +7 -7
- package/dist/{chunk-F2OPHAUN.js → chunk-CYDXCILL.js} +7 -7
- package/dist/{chunk-3PZ7JZI2.js → chunk-D3PTVN2I.js} +2 -2
- package/dist/{chunk-FPXASDG5.js → chunk-D5TIVCXG.js} +2 -2
- package/dist/{chunk-7W37NS3I.js → chunk-D74Z2N4K.js} +2 -2
- package/dist/{chunk-MNZG4OHU.js → chunk-DCEQCGVN.js} +2 -2
- package/dist/{chunk-ND2BXV3P.js → chunk-DEHLWZSI.js} +4 -4
- package/dist/{chunk-2YUOVM3G.js → chunk-DIP7YALH.js} +2 -2
- package/dist/{chunk-6PZ7OBYU.js → chunk-DLVIRJGK.js} +4 -4
- package/dist/{chunk-KLEUWIMZ.js → chunk-DQPIEQGP.js} +2 -2
- package/dist/{chunk-T2QX3FDP.js → chunk-DWJ6J3YW.js} +4 -4
- package/dist/{chunk-3CPWWGNK.js → chunk-E5KOWRDU.js} +2 -2
- package/dist/{chunk-6WGRDRMA.js → chunk-EBIVTDEG.js} +2 -2
- package/dist/{chunk-KUDGXAF7.js → chunk-EBTUPRRQ.js} +10 -10
- package/dist/{chunk-5CPEEAFD.js → chunk-EDDKPIIV.js} +2 -2
- package/dist/{chunk-TX3VECZU.js → chunk-EGKARC53.js} +2 -2
- package/dist/{chunk-JEA3QDX7.js → chunk-EKJHOWTZ.js} +4 -4
- package/dist/{chunk-UVN5TMHU.js → chunk-ESXAECZ3.js} +2 -2
- package/dist/{chunk-3SOIESJM.js → chunk-EWZ2RLNG.js} +2 -2
- package/dist/{chunk-CMKGILJK.js → chunk-FBA2NXYH.js} +4 -4
- package/dist/{chunk-O6N4ABCA.js → chunk-FER6EVIY.js} +2 -2
- package/dist/{chunk-DF5EAHDN.js → chunk-FLWQJDJ5.js} +5 -5
- package/dist/{chunk-PTAG4PDC.js → chunk-FNXCFIPW.js} +2 -2
- package/dist/chunk-FPSS23S4.js +36 -0
- package/dist/chunk-FPSS23S4.js.map +1 -0
- package/dist/{chunk-BJEJFISW.js → chunk-FSDQQQIA.js} +3 -3
- package/dist/{chunk-PTF5B7TJ.js → chunk-G5UQBTXY.js} +2 -2
- package/dist/{chunk-4E3ZJRTZ.js → chunk-G6ICCGJ3.js} +2 -2
- package/dist/{chunk-NRTE7DNV.js → chunk-GIWFLWXG.js} +4 -4
- package/dist/{chunk-MM4FNWI4.js → chunk-GMHIOYB7.js} +4 -4
- package/dist/{chunk-6DK6Z4UN.js → chunk-GOCODNQS.js} +3 -3
- package/dist/{chunk-TPQTRNER.js → chunk-GSCGKJNK.js} +2 -2
- package/dist/{chunk-7VMZGLYI.js → chunk-GTHCHCWW.js} +3 -3
- package/dist/{chunk-SQJIKMN3.js → chunk-GTRAH4FG.js} +2 -2
- package/dist/{chunk-ZYAZUPPV.js → chunk-GU7T2S5N.js} +3 -3
- package/dist/{chunk-JKHKLL5W.js → chunk-H6BX6WOW.js} +3 -3
- package/dist/{chunk-IMZCQBOT.js → chunk-H6MJFMHZ.js} +3 -3
- package/dist/{chunk-HSOXMJOT.js → chunk-HEGV4QMS.js} +2 -2
- package/dist/chunk-HROITVQJ.js +85 -0
- package/dist/chunk-HROITVQJ.js.map +1 -0
- package/dist/{chunk-OF4TIKYC.js → chunk-HTMQGS63.js} +17 -9
- package/dist/chunk-HTMQGS63.js.map +1 -0
- package/dist/{chunk-NC7PVOEK.js → chunk-HWVPLFIW.js} +2 -2
- package/dist/{chunk-IMDQUHBJ.js → chunk-HYEIA25Y.js} +2 -2
- package/dist/{chunk-ECJBYNLJ.js → chunk-ICAMYP5M.js} +2 -2
- package/dist/{chunk-DJAXC5OK.js → chunk-IFSXVU2S.js} +2 -2
- package/dist/{chunk-I4MRDSUF.js → chunk-IJR6VOLU.js} +3 -3
- package/dist/{chunk-YCVD6CI3.js → chunk-IN3VQFKS.js} +2 -2
- package/dist/{chunk-BJFH6JI5.js → chunk-IZXYFWA4.js} +13 -13
- package/dist/{chunk-MFROMEKA.js → chunk-J2BTILRR.js} +3 -3
- package/dist/{chunk-NCYMNCJO.js → chunk-J2WY42FA.js} +2 -2
- package/dist/{chunk-DGMR6JEJ.js → chunk-J4XSTXZP.js} +2 -2
- package/dist/{chunk-ZTPXACWB.js → chunk-JKL5S7UQ.js} +6 -6
- package/dist/{chunk-P77WNZDY.js → chunk-JMHEFZOB.js} +2 -2
- package/dist/{chunk-IDANQPRH.js → chunk-JV3UI7BH.js} +3 -3
- package/dist/{chunk-NW53H5RW.js → chunk-JV5ULONH.js} +166 -65
- package/dist/chunk-JV5ULONH.js.map +1 -0
- package/dist/{chunk-FVXBNBHO.js → chunk-K3D7IQQP.js} +6 -6
- package/dist/{chunk-XEQMZB3C.js → chunk-K4DQS2ML.js} +24 -6
- package/dist/chunk-K4DQS2ML.js.map +1 -0
- package/dist/{chunk-GKVJIDHF.js → chunk-KFNZZ2N6.js} +2 -2
- package/dist/{chunk-I4QEJ62Y.js → chunk-KI46GKMD.js} +7 -7
- package/dist/{chunk-SIRLACNZ.js → chunk-KO3OHHY2.js} +3 -3
- package/dist/{chunk-NULUNM7H.js → chunk-KUE5BOQE.js} +5 -5
- package/dist/{chunk-O3LKCBP5.js → chunk-LIJNVIT3.js} +3 -3
- package/dist/{chunk-JWB44UGJ.js → chunk-LIJPDVYP.js} +2 -2
- package/dist/{chunk-KYS77RPN.js → chunk-LPKJ77EK.js} +2 -2
- package/dist/{chunk-RMFKVOM7.js → chunk-LQKVNREV.js} +4 -4
- package/dist/{chunk-E7XERZWC.js → chunk-LTJFV2JI.js} +2 -2
- package/dist/{chunk-INXGSG3J.js → chunk-LVDNY5RC.js} +2 -2
- package/dist/{chunk-2INLDVK3.js → chunk-LVELUUK6.js} +2 -2
- package/dist/{chunk-TAT5USZN.js → chunk-M3FDGRB4.js} +3 -3
- package/dist/{chunk-5EWSRZ2Y.js → chunk-M3HGBO2Y.js} +1 -1
- package/dist/{chunk-J3DY5HWQ.js → chunk-M5IQVMLR.js} +4 -4
- package/dist/{chunk-53AGXXZM.js → chunk-MKDFYE2E.js} +2 -2
- package/dist/{chunk-4SAWSRAA.js → chunk-MRECRNVU.js} +5 -5
- package/dist/{chunk-2I7HDP53.js → chunk-MT2R57SF.js} +2 -2
- package/dist/{chunk-Z7Y523PS.js → chunk-MV2CLIO6.js} +6 -6
- package/dist/{chunk-JZ4NLCAP.js → chunk-MZY3VKKM.js} +2 -2
- package/dist/{chunk-YENLNISG.js → chunk-N3FM4BNA.js} +2 -2
- package/dist/{chunk-DZWARC4M.js → chunk-NFCS5WYC.js} +3 -3
- package/dist/{chunk-I5QZJODL.js → chunk-NQ2CPQJF.js} +3 -3
- package/dist/{chunk-6DVCC7QS.js → chunk-OBGOLHCP.js} +164 -43
- package/dist/chunk-OBGOLHCP.js.map +1 -0
- package/dist/{chunk-CUIWCGMA.js → chunk-OCXEY7HE.js} +2 -2
- package/dist/{chunk-VTTAJOQ7.js → chunk-OCXTTKVA.js} +2 -2
- package/dist/{chunk-KRDR5RJD.js → chunk-OGU73VUN.js} +2 -2
- package/dist/{chunk-YIRVLKAX.js → chunk-OI6VI6SU.js} +9 -9
- package/dist/{chunk-BHNSJVBC.js → chunk-OJWDNNW3.js} +5 -5
- package/dist/{chunk-X6KAJI3V.js → chunk-OK7BQMCI.js} +9 -9
- package/dist/{chunk-I5B5L6Q4.js → chunk-OOOSGPJL.js} +1 -1
- package/dist/chunk-OP2GD6QW.js +166 -0
- package/dist/chunk-OP2GD6QW.js.map +1 -0
- package/dist/{chunk-TUIN4MB7.js → chunk-ORV7EFSL.js} +4 -4
- package/dist/{chunk-JDTGRRNU.js → chunk-OSJ366KR.js} +49 -31
- package/dist/chunk-OSJ366KR.js.map +1 -0
- package/dist/{chunk-3IK6UYO6.js → chunk-OTW25A6I.js} +3 -3
- package/dist/{chunk-NPGISCU6.js → chunk-OWET7EY2.js} +16 -16
- package/dist/{chunk-CRAOSVHC.js → chunk-OXQ2SXVC.js} +2 -2
- package/dist/{chunk-3ED2U6XE.js → chunk-OYCK4JRS.js} +2 -2
- package/dist/{chunk-YQXTDZSU.js → chunk-OYOFPNLC.js} +4 -4
- package/dist/{chunk-4NQHXYMW.js → chunk-PD7NWM7V.js} +2 -2
- package/dist/{chunk-4YCA2Y73.js → chunk-PF2WU2IL.js} +3 -3
- package/dist/{chunk-Z654FWNU.js → chunk-PLYVGZIN.js} +2 -2
- package/dist/{chunk-MVW6HNPI.js → chunk-PRT4J2DL.js} +2 -2
- package/dist/{chunk-TXLIEOJX.js → chunk-PSM3CU7N.js} +111 -80
- package/dist/chunk-PSM3CU7N.js.map +1 -0
- package/dist/{chunk-OPWCMA4D.js → chunk-PUUEI4W3.js} +6 -6
- package/dist/{chunk-RLBKLAEY.js → chunk-PVB4YVDP.js} +2 -2
- package/dist/{chunk-NXCMHIKI.js → chunk-PWUSSSSL.js} +2 -2
- package/dist/{chunk-MJUCFQMS.js → chunk-PYB4BFEC.js} +3 -3
- package/dist/{chunk-2FSBSCZJ.js → chunk-PZKHST7A.js} +2 -2
- package/dist/{chunk-QZAAUQRN.js → chunk-Q5EZNBPI.js} +3 -3
- package/dist/{chunk-ZHDFQITM.js → chunk-Q5K2J5GG.js} +2 -2
- package/dist/{chunk-7T2ZE3VT.js → chunk-QPQ7R77C.js} +8 -1
- package/dist/chunk-QPQ7R77C.js.map +1 -0
- package/dist/{chunk-6BCXNDEI.js → chunk-QQIZMVAJ.js} +74 -60
- package/dist/chunk-QQIZMVAJ.js.map +1 -0
- package/dist/{chunk-OV6QJRT4.js → chunk-QRECBCJM.js} +2 -2
- package/dist/{chunk-3GZA4BUW.js → chunk-QURYQFDN.js} +2 -2
- package/dist/{chunk-VS7AHPCZ.js → chunk-R33SBMB7.js} +3 -3
- package/dist/{chunk-KCBMFSMS.js → chunk-R4JA5JFI.js} +3 -3
- package/dist/{chunk-HC4JFZVU.js → chunk-R5QAL43H.js} +2 -2
- package/dist/{chunk-QPSGCC5D.js → chunk-RGR57NYY.js} +2 -2
- package/dist/{chunk-XWFAMUZQ.js → chunk-RHXYO4H2.js} +2 -2
- package/dist/{chunk-Y4BB2KS2.js → chunk-RISUROBM.js} +7 -7
- package/dist/{chunk-U3DN4HEY.js → chunk-RMCLFSMX.js} +2 -2
- package/dist/{chunk-YK7756IF.js → chunk-RTZANSSC.js} +3 -3
- package/dist/{chunk-ZEG4VPBL.js → chunk-S27VZ5DO.js} +6 -6
- package/dist/{chunk-54YW6SZZ.js → chunk-SBXSKRFA.js} +3 -3
- package/dist/{chunk-HAX4LCR5.js → chunk-SFIXTOOJ.js} +3 -3
- package/dist/{chunk-QIOQ2NPQ.js → chunk-SGH7I7OY.js} +2 -2
- package/dist/{chunk-K2A5PXQ5.js → chunk-SJYTQLN3.js} +3 -3
- package/dist/{chunk-2Z3NQNTM.js → chunk-SK5S2PCK.js} +15 -15
- package/dist/{chunk-X3MWB2QU.js → chunk-SN2WENRP.js} +3 -3
- package/dist/{chunk-OSY5K7L7.js → chunk-SP44O3OU.js} +2 -2
- package/dist/{chunk-OZCBM3UC.js → chunk-SSR4ZX52.js} +2 -2
- package/dist/{chunk-QCSJ4CWE.js → chunk-SXGJL7UT.js} +14 -14
- package/dist/{chunk-NC55IFN3.js → chunk-T67LTMSW.js} +10 -10
- package/dist/{chunk-AXHZYXUV.js → chunk-TDTD66BK.js} +2 -2
- package/dist/{chunk-NGJJJPZZ.js → chunk-TK5FWVZR.js} +3 -3
- package/dist/{chunk-YPWU5KPE.js → chunk-TKQL7EDB.js} +56 -19
- package/dist/chunk-TKQL7EDB.js.map +1 -0
- package/dist/{chunk-2OP6WLGV.js → chunk-TNSJFZ6Q.js} +4 -4
- package/dist/{chunk-O732GAFC.js → chunk-U4LTPFD2.js} +2 -2
- package/dist/{chunk-4DVNUCRR.js → chunk-U5UGM5XD.js} +6 -6
- package/dist/{chunk-UJK53QFL.js → chunk-UBRQ3PQD.js} +2 -2
- package/dist/{chunk-SODC7T6L.js → chunk-UMX6DZME.js} +2 -2
- package/dist/{chunk-YLS6QE5G.js → chunk-UO35OEOX.js} +4 -4
- package/dist/{chunk-SHHJCL7X.js → chunk-UTRNLNCW.js} +3 -3
- package/dist/{chunk-HEFPPMBQ.js → chunk-UU5FBVRX.js} +2 -2
- package/dist/{chunk-GQXZPKK7.js → chunk-V6UOVHW3.js} +2 -2
- package/dist/{chunk-GVN5SZLX.js → chunk-VATYK3JQ.js} +3 -3
- package/dist/{chunk-7TIX2UAR.js → chunk-VCJQQYRE.js} +4 -4
- package/dist/{chunk-6WD2INST.js → chunk-WDASYY4S.js} +7 -7
- package/dist/{chunk-DXBYWSL5.js → chunk-WIFDNUKD.js} +3 -3
- package/dist/{chunk-RT7CJMER.js → chunk-WIXHUBQN.js} +2 -2
- package/dist/{chunk-57AZS3IE.js → chunk-WRMUXZ7C.js} +3 -3
- package/dist/{chunk-2CLNIEK4.js → chunk-WTSQUCHB.js} +3 -3
- package/dist/{chunk-OVKYVZMW.js → chunk-WXF2RTS4.js} +2 -2
- package/dist/{chunk-MIHN76LX.js → chunk-WYGTAQMX.js} +3 -3
- package/dist/{chunk-2RG7NIAS.js → chunk-X2QJXDE4.js} +10 -10
- package/dist/{chunk-GAVYGBFI.js → chunk-XMBOLFFS.js} +2 -2
- package/dist/{chunk-T7OXJZCX.js → chunk-XOIDUM2H.js} +1 -1
- package/dist/{chunk-ORJPS5VN.js → chunk-XUOYNJPB.js} +97 -37
- package/dist/chunk-XUOYNJPB.js.map +1 -0
- package/dist/{chunk-XHIQ5I6N.js → chunk-XVLEBB4Y.js} +2 -2
- package/dist/{chunk-Q3DPEYX4.js → chunk-XZCCEKPW.js} +7 -7
- package/dist/{chunk-T3OWFVMS.js → chunk-Y3XZEKDQ.js} +2 -2
- package/dist/{chunk-KODELWYT.js → chunk-YJSCLGAW.js} +3 -3
- package/dist/{chunk-ROKQU7WG.js → chunk-YMI27QPF.js} +2 -2
- package/dist/{chunk-U7XM7CB4.js → chunk-YNTLWCF4.js} +4 -4
- package/dist/{chunk-ZQCND77P.js → chunk-YRYF76OE.js} +2 -2
- package/dist/{chunk-2BDT3UZQ.js → chunk-ZAX4XQLN.js} +3 -3
- package/dist/{chunk-DXR5PDFP.js → chunk-ZBHGNE2J.js} +3 -3
- package/dist/{chunk-I7ITSXSJ.js → chunk-ZR5EKJT6.js} +2 -2
- package/dist/{chunk-IZXHMZQ6.js → chunk-ZW5YTIH3.js} +4 -4
- package/dist/components/artifacts/artifact-sandbox.d.ts +6 -1
- package/dist/components/artifacts/site-view.d.ts +4 -2
- package/dist/components/timeline-anchor.d.ts +8 -3
- package/dist/components/timeline-reading-progress.d.ts +1 -1
- package/dist/components/timeline-settlement.d.ts +1 -1
- package/dist/composer-messages.js +2 -2
- package/dist/composer.js +10 -10
- package/dist/{computer-viewer-TDDO25AV.js → computer-viewer-5LKRCEVQ.js} +5 -5
- package/dist/connect.js +13 -14
- package/dist/desktop-dictation.js +7 -7
- package/dist/desktop.js +2 -2
- package/dist/editor.js +2 -2
- package/dist/{embedded-new-voice-2G3VLPVQ.js → embedded-new-voice-GHJRY3YL.js} +5 -5
- package/dist/{embedded-voice-T5IWOWGD.js → embedded-voice-ASQXBSTX.js} +5 -5
- package/dist/{fleet-decision-row-WM64KXP3.js → fleet-decision-row-U7LDVBEM.js} +2 -2
- package/dist/in-chat-connect-model.js +5 -5
- package/dist/index.js +62 -63
- package/dist/interaction.js +6 -6
- package/dist/{latest-question-OX56OVQ5.js → latest-question-RNVF262Q.js} +5 -5
- package/dist/lib/format.d.ts +10 -0
- package/dist/machines.js +4 -4
- package/dist/meetings-recorder.js +1 -1
- package/dist/meetings.js +24 -24
- package/dist/messages/en.d.ts +7 -0
- package/dist/messages.js +1 -1
- package/dist/{model-policy-picker-menu-SMC6J6QN.js → model-policy-picker-menu-E6XKMFTA.js} +4 -4
- package/dist/{payment-page-card-G4U63KUV.js → payment-page-card-DJDKV2LW.js} +6 -5
- package/dist/{payment-page-card-G4U63KUV.js.map → payment-page-card-DJDKV2LW.js.map} +1 -1
- package/dist/{platform-activity-row-BUZGZAKZ.js → platform-activity-row-MSDCSMET.js} +17 -7
- package/dist/platform-activity-row-MSDCSMET.js.map +1 -0
- package/dist/{queue-surface-implementation-4KUZ4PJV.js → queue-surface-implementation-GUAIG6TK.js} +5 -5
- package/dist/realtime.js +4 -4
- package/dist/{recorder-host-WF2RRR56.js → recorder-host-2MYDJPQW.js} +4 -4
- package/dist/recordings.js +3 -3
- package/dist/{sandbox-files-ESDMOFSD.js → sandbox-files-W5W2LW4K.js} +6 -6
- package/dist/session-app.js +173 -167
- package/dist/{session-connect-cards-Q53KMMYY.js → session-connect-cards-HPH7JOZP.js} +9 -10
- package/dist/session-list-model.js +2 -2
- package/dist/{session-realtime-CF3I35WJ.js → session-realtime-SDTKFFIR.js} +3 -3
- package/dist/session-realtime-SDTKFFIR.js.map +1 -0
- package/dist/session-realtime.js +2 -2
- package/dist/session-ui.js +37 -38
- package/dist/session.js +9 -9
- package/dist/sites.js +2 -2
- package/dist/terminal.js +2 -2
- package/dist/this-computer.js +3 -3
- package/dist/timeline/shared.d.ts +2 -0
- package/dist/{timeline-annotation-markers-CJK4RYZ4.js → timeline-annotation-markers-FNILLWNU.js} +2 -2
- package/dist/{timeline-annotation-selection-67GF5H26.js → timeline-annotation-selection-MBCIDO2Q.js} +2 -2
- package/dist/{timeline-annotations-dialog-ONJPQDJQ.js → timeline-annotations-dialog-JPNKLOTE.js} +3 -3
- package/dist/timeline-model.js +6 -6
- package/dist/ui/access-list.js +6 -6
- package/dist/ui/cadence-picker.js +4 -4
- package/dist/ui/choice-cards.js +3 -3
- package/dist/ui/confirm-dialog.js +4 -4
- package/dist/ui/copy-field.js +3 -3
- package/dist/ui/detail-page.js +5 -5
- package/dist/ui/detail-sheet.js +4 -4
- package/dist/ui/dialog.js +2 -2
- package/dist/ui/disclosure.js +5 -5
- package/dist/ui/email-chips-input.js +3 -3
- package/dist/ui/field.js +2 -2
- package/dist/ui/flush-form-page.js +4 -4
- package/dist/ui/form-dialog.js +3 -3
- package/dist/ui/list-row.js +3 -3
- package/dist/ui/page-header.js +2 -2
- package/dist/ui/relative-time.js +2 -2
- package/dist/ui/revision-history.js +4 -4
- package/dist/ui/role-select.js +6 -6
- package/dist/ui/select-menu.js +3 -3
- package/dist/ui/sheet.js +2 -2
- package/dist/ui/usage-meter.js +3 -3
- package/dist/ui/window-bar-title.d.ts +7 -3
- package/dist/ui/window-bar-title.js +1 -1
- package/dist/usage.js +2 -2
- package/dist/workbench.js +4 -4
- package/package.json +4 -4
- package/src/app/components/artifacts/site-actions.tsx +105 -0
- package/src/app/components/rail/session-header-copy.test.tsx +172 -0
- package/src/app/components/rail/session-header.tsx +68 -12
- package/src/app/components/rail/session-list.tsx +20 -0
- package/src/app/components/rail/site-session-group-heading.test.tsx +210 -0
- package/src/app/components/rail/site-session-group-heading.tsx +119 -60
- package/src/app/components/session/failed-session-actions.test.tsx +4 -0
- package/src/app/components/window-bar.tsx +63 -15
- package/src/app/lib/composer-send-blocking.tsx +312 -1
- package/src/app/lib/copy-link.ts +10 -0
- package/src/app/lib/session-composer-readiness.ts +4 -3
- package/src/app/lib/site-sidebar-bridge.test.tsx +67 -0
- package/src/app/lib/site-sidebar-bridge.ts +57 -0
- package/src/app/routes/session.tsx +45 -12
- package/src/app/routes/sessions-index.tsx +164 -105
- package/src/app/routes/site-view.test.tsx +74 -6
- package/src/app/routes/site-view.tsx +135 -14
- package/src/components/approval-surface.tsx +78 -3
- package/src/components/artifacts/artifact-sandbox.tsx +27 -2
- package/src/components/artifacts/site-view.tsx +13 -1
- package/src/components/message-timeline.tsx +25 -52
- package/src/components/session-capability-frame.tsx +2 -30
- package/src/components/timeline-anchor.tsx +19 -14
- package/src/components/timeline-reading-progress.ts +1 -2
- package/src/components/timeline-settlement.ts +3 -3
- package/src/lib/format.ts +46 -1
- package/src/messages/en.ts +11 -0
- package/src/timeline/platform-activity-row.tsx +20 -8
- package/src/timeline/shared.tsx +203 -32
- package/src/ui/window-bar-title.test.tsx +37 -0
- package/src/ui/window-bar-title.tsx +13 -6
- package/styles/compiled.css +5 -0
- package/dist/chunk-5MOJZORA.js.map +0 -1
- package/dist/chunk-6BCXNDEI.js.map +0 -1
- package/dist/chunk-6DVCC7QS.js.map +0 -1
- package/dist/chunk-7T2ZE3VT.js.map +0 -1
- package/dist/chunk-AFRGP2VP.js +0 -17
- package/dist/chunk-AFRGP2VP.js.map +0 -1
- package/dist/chunk-CRU35QQH.js.map +0 -1
- package/dist/chunk-FO4LYKJL.js +0 -197
- package/dist/chunk-FO4LYKJL.js.map +0 -1
- package/dist/chunk-HD5X76TP.js.map +0 -1
- package/dist/chunk-JDTGRRNU.js.map +0 -1
- package/dist/chunk-NW53H5RW.js.map +0 -1
- package/dist/chunk-OF4TIKYC.js.map +0 -1
- package/dist/chunk-ORJPS5VN.js.map +0 -1
- package/dist/chunk-TXLIEOJX.js.map +0 -1
- package/dist/chunk-VBUVBHFJ.js +0 -16
- package/dist/chunk-VBUVBHFJ.js.map +0 -1
- package/dist/chunk-XEQMZB3C.js.map +0 -1
- package/dist/chunk-YPWU5KPE.js.map +0 -1
- package/dist/components/timeline-answer-follow.d.ts +0 -8
- package/dist/platform-activity-row-BUZGZAKZ.js.map +0 -1
- package/src/components/timeline-answer-follow.ts +0 -15
- /package/dist/{browser-viewer-TC27OCIP.js.map → app/components/artifacts/site-actions.js.map} +0 -0
- /package/dist/{chat-interactive-block-RWPQBHVS.js.map → browser-viewer-ZHQDVHZ2.js.map} +0 -0
- /package/dist/{computer-viewer-TDDO25AV.js.map → chat-interactive-block-VSDD6X3M.js.map} +0 -0
- /package/dist/{chunk-C43KRXGA.js.map → chunk-2GCHGWNE.js.map} +0 -0
- /package/dist/{chunk-XLH7QY2R.js.map → chunk-2J77TWGH.js.map} +0 -0
- /package/dist/{chunk-77WAKEAH.js.map → chunk-2OXSB2OL.js.map} +0 -0
- /package/dist/{chunk-H3T7IWNA.js.map → chunk-2VJOSU4H.js.map} +0 -0
- /package/dist/{chunk-N6AACDUW.js.map → chunk-34NV52R3.js.map} +0 -0
- /package/dist/{chunk-L7YTNTIK.js.map → chunk-3CDJSKDW.js.map} +0 -0
- /package/dist/{chunk-EWSOC6WF.js.map → chunk-3DRLCX5V.js.map} +0 -0
- /package/dist/{chunk-JEUPAVYY.js.map → chunk-3L465FBR.js.map} +0 -0
- /package/dist/{chunk-5NWEKLDZ.js.map → chunk-3NNAC43A.js.map} +0 -0
- /package/dist/{chunk-EDI6SJ2N.js.map → chunk-3OK7Y6ES.js.map} +0 -0
- /package/dist/{chunk-AWKES45Y.js.map → chunk-3PM3M2Q6.js.map} +0 -0
- /package/dist/{chunk-I7XIZRFD.js.map → chunk-3PZ3LRPV.js.map} +0 -0
- /package/dist/{chunk-AW2MQB37.js.map → chunk-44JWVYJB.js.map} +0 -0
- /package/dist/{chunk-2M3J7ZWQ.js.map → chunk-467WDSOK.js.map} +0 -0
- /package/dist/{chunk-UTIAXH52.js.map → chunk-477DTTMH.js.map} +0 -0
- /package/dist/{chunk-J5F5HPPW.js.map → chunk-4BWMAGJJ.js.map} +0 -0
- /package/dist/{chunk-YSJEAAOL.js.map → chunk-4F3AEJI6.js.map} +0 -0
- /package/dist/{chunk-LHPNABDH.js.map → chunk-4JXPLTWV.js.map} +0 -0
- /package/dist/{chunk-RQKLF42C.js.map → chunk-4K64EKM7.js.map} +0 -0
- /package/dist/{chunk-NUNZS36W.js.map → chunk-4O2XWOLZ.js.map} +0 -0
- /package/dist/{chunk-QB2KMIDP.js.map → chunk-4SJAEPM2.js.map} +0 -0
- /package/dist/{chunk-6JHU2UBS.js.map → chunk-4Z5X7PLC.js.map} +0 -0
- /package/dist/{chunk-2STUPWEL.js.map → chunk-54U6ZBEX.js.map} +0 -0
- /package/dist/{chunk-XXSOHN35.js.map → chunk-5FLYHX5R.js.map} +0 -0
- /package/dist/{chunk-MIYFS2XN.js.map → chunk-5MHMCE2G.js.map} +0 -0
- /package/dist/{chunk-YWVI6ZMK.js.map → chunk-5MIBQ4P5.js.map} +0 -0
- /package/dist/{chunk-5O2FCCHZ.js.map → chunk-6QK65ZWM.js.map} +0 -0
- /package/dist/{chunk-RPVREAU7.js.map → chunk-736RUNIA.js.map} +0 -0
- /package/dist/{chunk-2KALVELR.js.map → chunk-74CBR5YE.js.map} +0 -0
- /package/dist/{chunk-5IE76VCY.js.map → chunk-752WXSDN.js.map} +0 -0
- /package/dist/{chunk-OPJJSKUK.js.map → chunk-77B6UCNK.js.map} +0 -0
- /package/dist/{chunk-SEO7TICN.js.map → chunk-77BHKC43.js.map} +0 -0
- /package/dist/{chunk-ZUA3JMI6.js.map → chunk-77SYIH6O.js.map} +0 -0
- /package/dist/{chunk-ILDXWY37.js.map → chunk-7AI4E7PV.js.map} +0 -0
- /package/dist/{chunk-C372BFOV.js.map → chunk-7NLF35YL.js.map} +0 -0
- /package/dist/{chunk-IFB3WJ36.js.map → chunk-7YTR3UFO.js.map} +0 -0
- /package/dist/{chunk-BMICEQZQ.js.map → chunk-7Z76QP64.js.map} +0 -0
- /package/dist/{chunk-YWIFM7D7.js.map → chunk-AAS7OWV6.js.map} +0 -0
- /package/dist/{chunk-5QAY6K77.js.map → chunk-AB5IW227.js.map} +0 -0
- /package/dist/{chunk-ZBIXBQNI.js.map → chunk-ABJZDRW2.js.map} +0 -0
- /package/dist/{chunk-4DVJ6ONS.js.map → chunk-AH3DGOTK.js.map} +0 -0
- /package/dist/{chunk-HGKTHF2U.js.map → chunk-AJBDAVX3.js.map} +0 -0
- /package/dist/{chunk-5YKW2K6I.js.map → chunk-AJDGP2N4.js.map} +0 -0
- /package/dist/{chunk-IXPTECSC.js.map → chunk-AVXDIRRW.js.map} +0 -0
- /package/dist/{chunk-QK5EFEUT.js.map → chunk-BASI553K.js.map} +0 -0
- /package/dist/{chunk-Z4FMAFNH.js.map → chunk-BQYRZIZ7.js.map} +0 -0
- /package/dist/{chunk-DZXEDSQI.js.map → chunk-CEMSIU4Z.js.map} +0 -0
- /package/dist/{chunk-FZC5N55X.js.map → chunk-CH4UQ4NO.js.map} +0 -0
- /package/dist/{chunk-7X6SDK2C.js.map → chunk-CHU3RDV4.js.map} +0 -0
- /package/dist/{chunk-Y4OBB2VN.js.map → chunk-CV4VVLPZ.js.map} +0 -0
- /package/dist/{chunk-JQL7ZH6C.js.map → chunk-CXAN2FHF.js.map} +0 -0
- /package/dist/{chunk-F2OPHAUN.js.map → chunk-CYDXCILL.js.map} +0 -0
- /package/dist/{chunk-3PZ7JZI2.js.map → chunk-D3PTVN2I.js.map} +0 -0
- /package/dist/{chunk-FPXASDG5.js.map → chunk-D5TIVCXG.js.map} +0 -0
- /package/dist/{chunk-7W37NS3I.js.map → chunk-D74Z2N4K.js.map} +0 -0
- /package/dist/{chunk-MNZG4OHU.js.map → chunk-DCEQCGVN.js.map} +0 -0
- /package/dist/{chunk-ND2BXV3P.js.map → chunk-DEHLWZSI.js.map} +0 -0
- /package/dist/{chunk-2YUOVM3G.js.map → chunk-DIP7YALH.js.map} +0 -0
- /package/dist/{chunk-6PZ7OBYU.js.map → chunk-DLVIRJGK.js.map} +0 -0
- /package/dist/{chunk-KLEUWIMZ.js.map → chunk-DQPIEQGP.js.map} +0 -0
- /package/dist/{chunk-T2QX3FDP.js.map → chunk-DWJ6J3YW.js.map} +0 -0
- /package/dist/{chunk-3CPWWGNK.js.map → chunk-E5KOWRDU.js.map} +0 -0
- /package/dist/{chunk-6WGRDRMA.js.map → chunk-EBIVTDEG.js.map} +0 -0
- /package/dist/{chunk-KUDGXAF7.js.map → chunk-EBTUPRRQ.js.map} +0 -0
- /package/dist/{chunk-5CPEEAFD.js.map → chunk-EDDKPIIV.js.map} +0 -0
- /package/dist/{chunk-TX3VECZU.js.map → chunk-EGKARC53.js.map} +0 -0
- /package/dist/{chunk-JEA3QDX7.js.map → chunk-EKJHOWTZ.js.map} +0 -0
- /package/dist/{chunk-UVN5TMHU.js.map → chunk-ESXAECZ3.js.map} +0 -0
- /package/dist/{chunk-3SOIESJM.js.map → chunk-EWZ2RLNG.js.map} +0 -0
- /package/dist/{chunk-CMKGILJK.js.map → chunk-FBA2NXYH.js.map} +0 -0
- /package/dist/{chunk-O6N4ABCA.js.map → chunk-FER6EVIY.js.map} +0 -0
- /package/dist/{chunk-DF5EAHDN.js.map → chunk-FLWQJDJ5.js.map} +0 -0
- /package/dist/{chunk-PTAG4PDC.js.map → chunk-FNXCFIPW.js.map} +0 -0
- /package/dist/{chunk-BJEJFISW.js.map → chunk-FSDQQQIA.js.map} +0 -0
- /package/dist/{chunk-PTF5B7TJ.js.map → chunk-G5UQBTXY.js.map} +0 -0
- /package/dist/{chunk-4E3ZJRTZ.js.map → chunk-G6ICCGJ3.js.map} +0 -0
- /package/dist/{chunk-NRTE7DNV.js.map → chunk-GIWFLWXG.js.map} +0 -0
- /package/dist/{chunk-MM4FNWI4.js.map → chunk-GMHIOYB7.js.map} +0 -0
- /package/dist/{chunk-6DK6Z4UN.js.map → chunk-GOCODNQS.js.map} +0 -0
- /package/dist/{chunk-TPQTRNER.js.map → chunk-GSCGKJNK.js.map} +0 -0
- /package/dist/{chunk-7VMZGLYI.js.map → chunk-GTHCHCWW.js.map} +0 -0
- /package/dist/{chunk-SQJIKMN3.js.map → chunk-GTRAH4FG.js.map} +0 -0
- /package/dist/{chunk-ZYAZUPPV.js.map → chunk-GU7T2S5N.js.map} +0 -0
- /package/dist/{chunk-JKHKLL5W.js.map → chunk-H6BX6WOW.js.map} +0 -0
- /package/dist/{chunk-IMZCQBOT.js.map → chunk-H6MJFMHZ.js.map} +0 -0
- /package/dist/{chunk-HSOXMJOT.js.map → chunk-HEGV4QMS.js.map} +0 -0
- /package/dist/{chunk-NC7PVOEK.js.map → chunk-HWVPLFIW.js.map} +0 -0
- /package/dist/{chunk-IMDQUHBJ.js.map → chunk-HYEIA25Y.js.map} +0 -0
- /package/dist/{chunk-ECJBYNLJ.js.map → chunk-ICAMYP5M.js.map} +0 -0
- /package/dist/{chunk-DJAXC5OK.js.map → chunk-IFSXVU2S.js.map} +0 -0
- /package/dist/{chunk-I4MRDSUF.js.map → chunk-IJR6VOLU.js.map} +0 -0
- /package/dist/{chunk-YCVD6CI3.js.map → chunk-IN3VQFKS.js.map} +0 -0
- /package/dist/{chunk-BJFH6JI5.js.map → chunk-IZXYFWA4.js.map} +0 -0
- /package/dist/{chunk-MFROMEKA.js.map → chunk-J2BTILRR.js.map} +0 -0
- /package/dist/{chunk-NCYMNCJO.js.map → chunk-J2WY42FA.js.map} +0 -0
- /package/dist/{chunk-DGMR6JEJ.js.map → chunk-J4XSTXZP.js.map} +0 -0
- /package/dist/{chunk-ZTPXACWB.js.map → chunk-JKL5S7UQ.js.map} +0 -0
- /package/dist/{chunk-P77WNZDY.js.map → chunk-JMHEFZOB.js.map} +0 -0
- /package/dist/{chunk-IDANQPRH.js.map → chunk-JV3UI7BH.js.map} +0 -0
- /package/dist/{chunk-FVXBNBHO.js.map → chunk-K3D7IQQP.js.map} +0 -0
- /package/dist/{chunk-GKVJIDHF.js.map → chunk-KFNZZ2N6.js.map} +0 -0
- /package/dist/{chunk-I4QEJ62Y.js.map → chunk-KI46GKMD.js.map} +0 -0
- /package/dist/{chunk-SIRLACNZ.js.map → chunk-KO3OHHY2.js.map} +0 -0
- /package/dist/{chunk-NULUNM7H.js.map → chunk-KUE5BOQE.js.map} +0 -0
- /package/dist/{chunk-O3LKCBP5.js.map → chunk-LIJNVIT3.js.map} +0 -0
- /package/dist/{chunk-JWB44UGJ.js.map → chunk-LIJPDVYP.js.map} +0 -0
- /package/dist/{chunk-KYS77RPN.js.map → chunk-LPKJ77EK.js.map} +0 -0
- /package/dist/{chunk-RMFKVOM7.js.map → chunk-LQKVNREV.js.map} +0 -0
- /package/dist/{chunk-E7XERZWC.js.map → chunk-LTJFV2JI.js.map} +0 -0
- /package/dist/{chunk-INXGSG3J.js.map → chunk-LVDNY5RC.js.map} +0 -0
- /package/dist/{chunk-2INLDVK3.js.map → chunk-LVELUUK6.js.map} +0 -0
- /package/dist/{chunk-TAT5USZN.js.map → chunk-M3FDGRB4.js.map} +0 -0
- /package/dist/{chunk-5EWSRZ2Y.js.map → chunk-M3HGBO2Y.js.map} +0 -0
- /package/dist/{chunk-J3DY5HWQ.js.map → chunk-M5IQVMLR.js.map} +0 -0
- /package/dist/{chunk-53AGXXZM.js.map → chunk-MKDFYE2E.js.map} +0 -0
- /package/dist/{chunk-4SAWSRAA.js.map → chunk-MRECRNVU.js.map} +0 -0
- /package/dist/{chunk-2I7HDP53.js.map → chunk-MT2R57SF.js.map} +0 -0
- /package/dist/{chunk-Z7Y523PS.js.map → chunk-MV2CLIO6.js.map} +0 -0
- /package/dist/{chunk-JZ4NLCAP.js.map → chunk-MZY3VKKM.js.map} +0 -0
- /package/dist/{chunk-YENLNISG.js.map → chunk-N3FM4BNA.js.map} +0 -0
- /package/dist/{chunk-DZWARC4M.js.map → chunk-NFCS5WYC.js.map} +0 -0
- /package/dist/{chunk-I5QZJODL.js.map → chunk-NQ2CPQJF.js.map} +0 -0
- /package/dist/{chunk-CUIWCGMA.js.map → chunk-OCXEY7HE.js.map} +0 -0
- /package/dist/{chunk-VTTAJOQ7.js.map → chunk-OCXTTKVA.js.map} +0 -0
- /package/dist/{chunk-KRDR5RJD.js.map → chunk-OGU73VUN.js.map} +0 -0
- /package/dist/{chunk-YIRVLKAX.js.map → chunk-OI6VI6SU.js.map} +0 -0
- /package/dist/{chunk-BHNSJVBC.js.map → chunk-OJWDNNW3.js.map} +0 -0
- /package/dist/{chunk-X6KAJI3V.js.map → chunk-OK7BQMCI.js.map} +0 -0
- /package/dist/{chunk-I5B5L6Q4.js.map → chunk-OOOSGPJL.js.map} +0 -0
- /package/dist/{chunk-TUIN4MB7.js.map → chunk-ORV7EFSL.js.map} +0 -0
- /package/dist/{chunk-3IK6UYO6.js.map → chunk-OTW25A6I.js.map} +0 -0
- /package/dist/{chunk-NPGISCU6.js.map → chunk-OWET7EY2.js.map} +0 -0
- /package/dist/{chunk-CRAOSVHC.js.map → chunk-OXQ2SXVC.js.map} +0 -0
- /package/dist/{chunk-3ED2U6XE.js.map → chunk-OYCK4JRS.js.map} +0 -0
- /package/dist/{chunk-YQXTDZSU.js.map → chunk-OYOFPNLC.js.map} +0 -0
- /package/dist/{chunk-4NQHXYMW.js.map → chunk-PD7NWM7V.js.map} +0 -0
- /package/dist/{chunk-4YCA2Y73.js.map → chunk-PF2WU2IL.js.map} +0 -0
- /package/dist/{chunk-Z654FWNU.js.map → chunk-PLYVGZIN.js.map} +0 -0
- /package/dist/{chunk-MVW6HNPI.js.map → chunk-PRT4J2DL.js.map} +0 -0
- /package/dist/{chunk-OPWCMA4D.js.map → chunk-PUUEI4W3.js.map} +0 -0
- /package/dist/{chunk-RLBKLAEY.js.map → chunk-PVB4YVDP.js.map} +0 -0
- /package/dist/{chunk-NXCMHIKI.js.map → chunk-PWUSSSSL.js.map} +0 -0
- /package/dist/{chunk-MJUCFQMS.js.map → chunk-PYB4BFEC.js.map} +0 -0
- /package/dist/{chunk-2FSBSCZJ.js.map → chunk-PZKHST7A.js.map} +0 -0
- /package/dist/{chunk-QZAAUQRN.js.map → chunk-Q5EZNBPI.js.map} +0 -0
- /package/dist/{chunk-ZHDFQITM.js.map → chunk-Q5K2J5GG.js.map} +0 -0
- /package/dist/{chunk-OV6QJRT4.js.map → chunk-QRECBCJM.js.map} +0 -0
- /package/dist/{chunk-3GZA4BUW.js.map → chunk-QURYQFDN.js.map} +0 -0
- /package/dist/{chunk-VS7AHPCZ.js.map → chunk-R33SBMB7.js.map} +0 -0
- /package/dist/{chunk-KCBMFSMS.js.map → chunk-R4JA5JFI.js.map} +0 -0
- /package/dist/{chunk-HC4JFZVU.js.map → chunk-R5QAL43H.js.map} +0 -0
- /package/dist/{chunk-QPSGCC5D.js.map → chunk-RGR57NYY.js.map} +0 -0
- /package/dist/{chunk-XWFAMUZQ.js.map → chunk-RHXYO4H2.js.map} +0 -0
- /package/dist/{chunk-Y4BB2KS2.js.map → chunk-RISUROBM.js.map} +0 -0
- /package/dist/{chunk-U3DN4HEY.js.map → chunk-RMCLFSMX.js.map} +0 -0
- /package/dist/{chunk-YK7756IF.js.map → chunk-RTZANSSC.js.map} +0 -0
- /package/dist/{chunk-ZEG4VPBL.js.map → chunk-S27VZ5DO.js.map} +0 -0
- /package/dist/{chunk-54YW6SZZ.js.map → chunk-SBXSKRFA.js.map} +0 -0
- /package/dist/{chunk-HAX4LCR5.js.map → chunk-SFIXTOOJ.js.map} +0 -0
- /package/dist/{chunk-QIOQ2NPQ.js.map → chunk-SGH7I7OY.js.map} +0 -0
- /package/dist/{chunk-K2A5PXQ5.js.map → chunk-SJYTQLN3.js.map} +0 -0
- /package/dist/{chunk-2Z3NQNTM.js.map → chunk-SK5S2PCK.js.map} +0 -0
- /package/dist/{chunk-X3MWB2QU.js.map → chunk-SN2WENRP.js.map} +0 -0
- /package/dist/{chunk-OSY5K7L7.js.map → chunk-SP44O3OU.js.map} +0 -0
- /package/dist/{chunk-OZCBM3UC.js.map → chunk-SSR4ZX52.js.map} +0 -0
- /package/dist/{chunk-QCSJ4CWE.js.map → chunk-SXGJL7UT.js.map} +0 -0
- /package/dist/{chunk-NC55IFN3.js.map → chunk-T67LTMSW.js.map} +0 -0
- /package/dist/{chunk-AXHZYXUV.js.map → chunk-TDTD66BK.js.map} +0 -0
- /package/dist/{chunk-NGJJJPZZ.js.map → chunk-TK5FWVZR.js.map} +0 -0
- /package/dist/{chunk-2OP6WLGV.js.map → chunk-TNSJFZ6Q.js.map} +0 -0
- /package/dist/{chunk-O732GAFC.js.map → chunk-U4LTPFD2.js.map} +0 -0
- /package/dist/{chunk-4DVNUCRR.js.map → chunk-U5UGM5XD.js.map} +0 -0
- /package/dist/{chunk-UJK53QFL.js.map → chunk-UBRQ3PQD.js.map} +0 -0
- /package/dist/{chunk-SODC7T6L.js.map → chunk-UMX6DZME.js.map} +0 -0
- /package/dist/{chunk-YLS6QE5G.js.map → chunk-UO35OEOX.js.map} +0 -0
- /package/dist/{chunk-SHHJCL7X.js.map → chunk-UTRNLNCW.js.map} +0 -0
- /package/dist/{chunk-HEFPPMBQ.js.map → chunk-UU5FBVRX.js.map} +0 -0
- /package/dist/{chunk-GQXZPKK7.js.map → chunk-V6UOVHW3.js.map} +0 -0
- /package/dist/{chunk-GVN5SZLX.js.map → chunk-VATYK3JQ.js.map} +0 -0
- /package/dist/{chunk-7TIX2UAR.js.map → chunk-VCJQQYRE.js.map} +0 -0
- /package/dist/{chunk-6WD2INST.js.map → chunk-WDASYY4S.js.map} +0 -0
- /package/dist/{chunk-DXBYWSL5.js.map → chunk-WIFDNUKD.js.map} +0 -0
- /package/dist/{chunk-RT7CJMER.js.map → chunk-WIXHUBQN.js.map} +0 -0
- /package/dist/{chunk-57AZS3IE.js.map → chunk-WRMUXZ7C.js.map} +0 -0
- /package/dist/{chunk-2CLNIEK4.js.map → chunk-WTSQUCHB.js.map} +0 -0
- /package/dist/{chunk-OVKYVZMW.js.map → chunk-WXF2RTS4.js.map} +0 -0
- /package/dist/{chunk-MIHN76LX.js.map → chunk-WYGTAQMX.js.map} +0 -0
- /package/dist/{chunk-2RG7NIAS.js.map → chunk-X2QJXDE4.js.map} +0 -0
- /package/dist/{chunk-GAVYGBFI.js.map → chunk-XMBOLFFS.js.map} +0 -0
- /package/dist/{chunk-T7OXJZCX.js.map → chunk-XOIDUM2H.js.map} +0 -0
- /package/dist/{chunk-XHIQ5I6N.js.map → chunk-XVLEBB4Y.js.map} +0 -0
- /package/dist/{chunk-Q3DPEYX4.js.map → chunk-XZCCEKPW.js.map} +0 -0
- /package/dist/{chunk-T3OWFVMS.js.map → chunk-Y3XZEKDQ.js.map} +0 -0
- /package/dist/{chunk-KODELWYT.js.map → chunk-YJSCLGAW.js.map} +0 -0
- /package/dist/{chunk-ROKQU7WG.js.map → chunk-YMI27QPF.js.map} +0 -0
- /package/dist/{chunk-U7XM7CB4.js.map → chunk-YNTLWCF4.js.map} +0 -0
- /package/dist/{chunk-ZQCND77P.js.map → chunk-YRYF76OE.js.map} +0 -0
- /package/dist/{chunk-2BDT3UZQ.js.map → chunk-ZAX4XQLN.js.map} +0 -0
- /package/dist/{chunk-DXR5PDFP.js.map → chunk-ZBHGNE2J.js.map} +0 -0
- /package/dist/{chunk-I7ITSXSJ.js.map → chunk-ZR5EKJT6.js.map} +0 -0
- /package/dist/{chunk-IZXHMZQ6.js.map → chunk-ZW5YTIH3.js.map} +0 -0
- /package/dist/{embedded-new-voice-2G3VLPVQ.js.map → computer-viewer-5LKRCEVQ.js.map} +0 -0
- /package/dist/{embedded-voice-T5IWOWGD.js.map → embedded-new-voice-GHJRY3YL.js.map} +0 -0
- /package/dist/{model-policy-picker-menu-SMC6J6QN.js.map → embedded-voice-ASQXBSTX.js.map} +0 -0
- /package/dist/{fleet-decision-row-WM64KXP3.js.map → fleet-decision-row-U7LDVBEM.js.map} +0 -0
- /package/dist/{latest-question-OX56OVQ5.js.map → latest-question-RNVF262Q.js.map} +0 -0
- /package/dist/{sandbox-files-ESDMOFSD.js.map → model-policy-picker-menu-E6XKMFTA.js.map} +0 -0
- /package/dist/{queue-surface-implementation-4KUZ4PJV.js.map → queue-surface-implementation-GUAIG6TK.js.map} +0 -0
- /package/dist/{recorder-host-WF2RRR56.js.map → recorder-host-2MYDJPQW.js.map} +0 -0
- /package/dist/{session-connect-cards-Q53KMMYY.js.map → sandbox-files-W5W2LW4K.js.map} +0 -0
- /package/dist/{session-realtime-CF3I35WJ.js.map → session-connect-cards-HPH7JOZP.js.map} +0 -0
- /package/dist/{timeline-annotation-markers-CJK4RYZ4.js.map → timeline-annotation-markers-FNILLWNU.js.map} +0 -0
- /package/dist/{timeline-annotation-selection-67GF5H26.js.map → timeline-annotation-selection-MBCIDO2Q.js.map} +0 -0
- /package/dist/{timeline-annotations-dialog-ONJPQDJQ.js.map → timeline-annotations-dialog-JPNKLOTE.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/child-session-link.tsx","../src/components/session-chrome.tsx","../src/components/mcp-elicitation-request.tsx","../src/components/approval-surface.tsx","../src/components/human-input-form.tsx","../src/components/secret-question-field.tsx","../src/components/human-input-surface.tsx","../src/components/conversation-render-boundary.tsx","../src/hooks/use-live-session-events.ts","../src/components/generated-video-player.tsx","../src/timeline/rolling-activity.tsx","../src/timeline/turn-steps.tsx","../src/components/message-timeline.tsx","../src/lib/selection-clipboard.ts","../src/components/timeline-anchor.tsx","../src/components/timeline-reading-progress.ts","../src/components/timeline-settlement.ts","../src/components/tip-follow.ts","../src/components/machine-input-display.ts","../src/timeline/allowance-exhausted-row.tsx","../src/timeline/session-usage-limit-row.tsx","../src/components/session-conversation.tsx","../src/hooks/use-foreground-visibility.ts","../src/hooks/use-realtime-voice-models.ts","../src/components/session-proxy-scope.tsx","../src/components/new-conversation.tsx"],"sourcesContent":["import { isSessionId } from \"../timeline/agent-identity\";\nimport type { MachineInputMember } from \"../timeline/types\";\nimport { useOpenGeniText } from \"../messages/runtime\";\n\n/**\n * Source IDs are routing coordinates only for typed agent updates (child\n * lifecycle notices, agent messages, and agent directions), never parsed from\n * prose.\n */\nexport function ChildSessionLink({\n kind,\n sourceId,\n onOpenSession,\n}: Pick<MachineInputMember, \"kind\" | \"sourceId\"> & {\n onOpenSession?: ((sessionId: string) => void) | undefined;\n}) {\n const t = useOpenGeniText();\n if (\n !onOpenSession ||\n !(\n kind.startsWith(\"child_\") ||\n kind === \"agent_message\" ||\n kind === \"agent_steer_instruction\"\n ) ||\n !isSessionId(sourceId)\n ) {\n return null;\n }\n return (\n <button\n type=\"button\"\n onClick={() => onOpenSession(sourceId)}\n className=\"mt-1 rounded-og-sm text-og-xs font-medium og-link focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-og-accent\"\n >\n {t(\"childSessionLink.viewSession\")}\n </button>\n );\n}\n","import { ChildSessionLink } from \"./child-session-link\";\n/**\n * SessionChrome — compact merged session signals above the composer.\n *\n * Built-in session chrome for production and embeds. Token-themed\n * (`--og-session-chrome-*`); hosts override on `.og-session-chrome` or an ancestor.\n *\n * ## Host tokens\n * Defaults live in `tokens.css`.\n *\n * | Token | Role |\n * | --- | --- |\n * | `--og-session-chrome-surface` / `-open` | Dock fill (collapsed / expanded) |\n * | `--og-session-chrome-border` / `-open` | Dock edge |\n * | `--og-session-chrome-highlight` / `-ring` | Sliding chip selection fill + edge |\n * | `--og-session-chrome-shadow` / `-open` | Elevation |\n * | `--og-session-chrome-radius` | Dock corner radius |\n * | `--og-session-chrome-chip-min-height` | Signal chip height |\n * | `--og-session-chrome-chip-pad-x` / `--og-session-chrome-chip-gap` | Chip padding / rail gap |\n * | `--og-session-chrome-rail-pad` | Outer rail inset |\n * | `--og-session-chrome-panel-pad-x` / `-y` | Expanded panel padding |\n * | `--og-session-chrome-panel-max-height` | Cap for expanded body (scrolls inside) |\n * | `--og-session-chrome-duration` / `--og-session-chrome-ease` | Expand + pill motion |\n * | `--og-session-chrome-crossfade-duration` | Segment content opacity crossfade |\n * | `--og-session-chrome-row-hover` | Inbox / queue row hover wash |\n *\n * Inbox and queue stay separate segments. Queue hover actions wire to\n * `UseTurnQueueResult` (`editTurn` / `steerTurn` / `moveTurn` / `removeTurn`).\n * The collapsed queue chip previews the latest queued message beside its Steer\n * action; open queue rows keep Steer visible and reveal the rest on hover.\n * Inbox has no product dismiss API; pass `onDismissIncoming` when the host\n * wants a visible action (dev harness may use a local dummy).\n *\n * Everything shares one slim row: the agent's deliberate wait (`wait`) leads\n * with its reason and next check time, then queue and goal, with session\n * activity (incoming, agents, commands) on the right. Details and actions\n * (wait reason, goal pause/clear, queue rows) open in the panel on tap.\n *\n * Queue opens by default when chrome is idle and at least one authoritative\n * prompt is queued. Closing the queue dismisses that session's offer until\n * occupancy drains; a different session on the same chrome instance may\n * offer again. An in-flight optimistic Send never opens the drawer —\n * admission stays a paint-only receipt on the chip so layout does not jump\n * under the pointer.\n *\n * Segment switches keep the panel shell mounted and crossfade content. The\n * shell uses one CSS grid-track transition for deliberate open/close actions;\n * live queue reconciliation never feeds measurements back into layout.\n */\nimport type {\n SessionGoal,\n SessionPendingInputPreview,\n SessionStatus,\n SessionTurn,\n} from \"@opengeni/sdk\";\nimport {\n ActivityIcon,\n AudioLinesIcon,\n ArrowDownIcon,\n ArrowUpIcon,\n BotIcon,\n CheckIcon,\n Clock3Icon,\n InboxIcon,\n ListOrderedIcon,\n Loader2Icon,\n PauseIcon,\n PencilIcon,\n PlayIcon,\n Trash2Icon,\n TerminalIcon,\n TriangleAlertIcon,\n XIcon,\n CornerDownRightIcon,\n TargetIcon,\n} from \"lucide-react\";\nimport { AnimatePresence, motion, useReducedMotion } from \"motion/react\";\nimport { useEffect, useId, useMemo, useRef, useState, type ReactNode } from \"react\";\n\nimport type { ComposerOptimisticMessage, ComposerState } from \"../hooks/use-composer\";\nimport type { UseGoalResult } from \"../hooks/use-goal\";\nimport type { UseTurnQueueResult } from \"../hooks/use-turn-queue\";\nimport type { ComposerQueuedRecall } from \"../hooks/use-queued-prompt-recall\";\nimport { cn } from \"../lib/cn\";\nimport { inertProps } from \"../lib/inert\";\nimport { useErrorMessage } from \"../lib/error-message\";\nimport { formatClockTime } from \"../lib/format\";\nimport {\n countAuthoritativeQueuedTurns,\n isAuthoritativeQueuedTurn,\n QUEUE_REPLACE_DRAFT_COPY,\n queuedTurnPresentation,\n queueNeighborAnchors,\n} from \"../queue-presentation-model\";\nimport { requestQueueDraftEdit } from \"./queue-draft-policy\";\nimport { QUEUE_ITEM_CONTENT_UNAVAILABLE, queueItemContent } from \"./queue-item-content\";\nimport { TimelineAnnotationsChip, type TimelineAnnotationLike } from \"./timeline-annotations\";\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from \"./tooltip\";\nimport { SingleSendWording, useOpenGeniText, type OpenGeniText } from \"../messages/runtime\";\nimport { useCalmServiceFailure } from \"../lib/use-calm-service-failure\";\n\nexport type SessionChromeSignalId =\n | \"wait\"\n | \"incoming\"\n | \"steering\"\n | \"queue\"\n | \"goal\"\n | \"agents\"\n | \"commands\";\n\nexport type SessionChromeSignalTone = \"neutral\" | \"accent\" | \"waiting\" | \"running\";\n\n/** The agent's deliberate wait: its own reason and the deadline of its next check. */\nexport type SessionChromeWait = {\n reason: string;\n deadlineAt: string;\n};\n\nexport type SessionChromeAgentsSignal = {\n count: number;\n detail?: string | undefined;\n tone?: SessionChromeSignalTone | undefined;\n};\n\nexport type SessionChromeProps = {\n /** Authoritative execution status; omitted by older embedding hosts. */\n sessionStatus?: SessionStatus | undefined;\n /**\n * The agent's wait (`session.inputWait` while the session is idle). It leads\n * the row; its panel carries the full reason and the next check time.\n */\n wait?: SessionChromeWait | null | undefined;\n queue: UseTurnQueueResult;\n /** Open and focus an existing queued prompt without changing its delivery. */\n queueFocusTarget?: { turnId: string; requestId: number } | undefined;\n /** Needed for queue edit → composer checkout. Omit with `readOnly`. */\n composer?: ComposerState | undefined;\n /** Focus the composer after a successful queue checkout has applied its draft.\n * Connect to the composer controller's `focusInput`, or a custom input ref.\n * Never called for failed checkout or while replacement awaits confirmation.\n */\n onComposerFocus?: (() => void) | undefined;\n /** The composer's Up-arrow recall; its target row's Edit tip mentions ↑. */\n queuedRecall?: Pick<ComposerQueuedRecall, \"turnId\"> | undefined;\n goal?: UseGoalResult | null | undefined;\n /** Expanded agents body (host supplies tree / list). */\n agentsPanel?: ReactNode;\n /** Active commands only. The host mounts the body only when opened. */\n commandsPanel?: ReactNode;\n commandsCount?: number | undefined;\n /** Chip summary; when `count > 0` the agents segment appears. */\n agentsSignal?: SessionChromeAgentsSignal | undefined;\n /**\n * Optional inbox dismiss. Product pending-inputs have no remove API — hosts\n * (and the gallery) may still pass a handler so the action is visible.\n */\n onDismissIncoming?: ((inputId: string) => void) | undefined;\n /** Open a typed child update's source through the host's normal authorized route. */\n onOpenSession?: ((sessionId: string) => void) | undefined;\n readOnly?: boolean | undefined;\n className?: string | undefined;\n /** Controlled active segment; omit for uncontrolled. */\n active?: SessionChromeSignalId | null | undefined;\n defaultActive?: SessionChromeSignalId | null | undefined;\n onActiveChange?: ((next: SessionChromeSignalId | null) => void) | undefined;\n};\n\ntype GoalPillState =\n | \"pursuing\"\n | \"waiting\"\n | \"scheduled\"\n | \"session_failed\"\n | \"blocked\"\n | \"held\"\n | \"paused\"\n | \"invariant_broken\"\n | \"completed\";\n\nconst GOAL_LABEL = (t: OpenGeniText): Record<GoalPillState, string> => ({\n pursuing: t(\"sessionChrome.pursuing\"),\n waiting: t(\"sessionChrome.waiting\"),\n scheduled: t(\"sessionChrome.waiting\"),\n blocked: t(\"sessionChrome.blocked\"),\n session_failed: t(\"sessionChrome.blockedBySessionFailure\"),\n held: t(\"sessionChrome.held\"),\n paused: t(\"sessionChrome.paused\"),\n invariant_broken: t(\"sessionChrome.needsAttention\"),\n completed: t(\"sessionChrome.done\"),\n});\n\n/**\n * Short pill suffix per `pausedReason`. `max_auto_continuations` is pacing\n * (new input resumes it); `limits` is an unspecified legacy admission gate; `user_pause`/`api` is\n * the human's own override; `agent` is the model declaring it is blocked on a\n * human decision. Unknown or legacy reasons keep the bare \"Paused\".\n */\nconst GOAL_PAUSED_REASON_SUFFIX = (t: OpenGeniText): Record<string, string> => ({\n max_auto_continuations: \"cap\",\n limits: \"limits\",\n model_unavailable: \"model\",\n model_policy: \"policy\",\n credits: \"credits\",\n budget: \"budget\",\n usage_limit: t(\"sessionChrome.usageLimit\"),\n usage_policy: \"limits\",\n allowance: \"allowance\",\n session_usage_limit: t(\"sessionChrome.usageLimit\"),\n user_pause: \"manually\",\n api: \"manually\",\n agent: \"agent\",\n});\n\nconst GOAL_PAUSED_REASON_EXPLANATION = (t: OpenGeniText): Record<string, string> => ({\n max_auto_continuations: t(\"sessionChrome.pausedAtTheAutomaticContinuation\"),\n limits: t(\"sessionChrome.pausedByAnAdmissionLimit\"),\n model_unavailable: t(\"sessionChrome.theSelectedModelIsUnavailable\"),\n model_policy: t(\"sessionChrome.theSelectedModelIsBlocked\"),\n credits: t(\"sessionChrome.insufficientOpengeniCreditsAddCredits\"),\n budget: t(\"sessionChrome.monthlyModelSpendingLimitReached\"),\n usage_limit: t(\"sessionChrome.monthlyAgentRunLimitReached\"),\n usage_policy: t(\"sessionChrome.theApplicationSUsagePolicy\"),\n allowance: t(\"sessionChrome.opengeniUsageAllowanceExhaustedResume\"),\n session_usage_limit: t(\"sessionChrome.pausedAtTheTaskS\"),\n user_pause: t(\"sessionChrome.pausedManuallyByAPerson\"),\n api: t(\"sessionChrome.pausedManuallyByAPerson\"),\n agent: t(\"sessionChrome.pausedByTheAgentIt\"),\n});\n\ntype GoalPillRecord = Pick<SessionGoal, \"status\" | \"pausedReason\"> & {\n rationale?: SessionGoal[\"rationale\"];\n continuation?: SessionGoal[\"continuation\"] | null | undefined;\n};\n\n/** Pill label, with the pause reason spelled out: \"Paused · cap\" / \"Paused · manually\". */\nexport function sessionChromeGoalPillLabel(\n t: OpenGeniText,\n state: GoalPillState,\n record: GoalPillRecord | null | undefined,\n): string {\n if (state !== \"paused\") return GOAL_LABEL(t)[state];\n const suffix = record?.pausedReason\n ? GOAL_PAUSED_REASON_SUFFIX(t)[record.pausedReason]\n : undefined;\n return suffix ? t(\"sessionChrome.pausedSuffix\", { suffix }) : t(\"sessionChrome.paused\");\n}\n\n/**\n * One human sentence explaining WHY the goal is not pursuing right now: the\n * pause reason, the agent's own `wait_for_input` hold (reason + deadline), or the\n * next idle-backoff check time. Null when the state needs no explanation.\n */\nexport function sessionChromeGoalPillExplanation(\n t: OpenGeniText,\n state: GoalPillState,\n record: GoalPillRecord | null | undefined,\n): string | null {\n const continuation = record?.continuation ?? null;\n if (state === \"session_failed\") {\n return t(\"sessionChrome.resolveTheSessionFailureThen\");\n }\n if (state === \"paused\") {\n const rationale = record?.rationale?.trim();\n if (rationale) return rationale;\n return record?.pausedReason\n ? (GOAL_PAUSED_REASON_EXPLANATION(t)[record.pausedReason] ?? null)\n : null;\n }\n if (state === \"scheduled\") {\n return continuation?.nextAttemptAt\n ? t(\"sessionChrome.continuesAtClocktime\", {\n clockTime: formatClockTime(t, continuation.nextAttemptAt),\n })\n : t(\"sessionChrome.waitingToContinueAutomatically\");\n }\n if (state === \"waiting\" && continuation?.reason === \"system_work_pending\") {\n return t(\"sessionChrome.waitingForOtherSessionWork\");\n }\n if (state === \"held\" && continuation?.reason === \"held_for_input\") {\n const reason = continuation.holdReason?.trim();\n const until = continuation.nextAttemptAt\n ? ` until ${formatClockTime(t, continuation.nextAttemptAt)}`\n : \"\";\n return t(\"sessionChrome.waitingForInputValueUntil\", {\n value: reason ? `: ${reason}` : \"\",\n until,\n });\n }\n return null;\n}\n\nexport { countAuthoritativeQueuedTurns };\n\nexport type SessionChromeWaitPresentation = {\n /** The agent's own short reason, or a neutral fallback for verbose notes. */\n headline: string;\n /** Next check as a clock time (\"3:04 PM\", with the date when not today). */\n clock: string;\n /** The deadline has passed; the wait resumes on the next check. */\n due: boolean;\n /** One sentence for the panel and the chip's hover text. */\n detail: string;\n /** Reason and detail as one sentence: the chip's accessible name and announcement. */\n label: string;\n /** Older agents put long internal notes here; shown only in the panel. */\n verboseReason: string | null;\n};\n\n/** Copy for the wait signal. Pure so the chip, panel and tests agree. */\nexport function sessionChromeWaitPresentation(\n t: OpenGeniText,\n wait: SessionChromeWait,\n now: number,\n): SessionChromeWaitPresentation {\n const deadline = new Date(wait.deadlineAt);\n const valid = !Number.isNaN(deadline.getTime());\n const clock = valid\n ? deadline.toLocaleString(t.locale, {\n ...(deadline.toDateString() === new Date(now).toDateString()\n ? {}\n : { month: \"short\", day: \"numeric\" }),\n hour: \"numeric\",\n minute: \"2-digit\",\n })\n : \"\";\n const due = !valid || deadline.getTime() <= now;\n const reason = wait.reason.trim();\n // Older agents used this field for verbose internal notes. Keep those out of\n // the one-line status and show them only in the panel.\n const compact = reason.length <= 180 && !/[\\n]|[0-9a-f]{8}-[0-9a-f-]{27,}/i.test(reason);\n const headline = compact && reason ? reason : t(\"sessionChrome.waitFallback\");\n const detail = due\n ? t(\"sessionChrome.waitRecheckDue\")\n : t(\"sessionChrome.waitChecksAgain\", { clockTime: clock });\n return {\n headline,\n clock,\n due,\n detail,\n label: t(\"sessionChrome.waitLabel\", { reason: headline.replace(/[.\\s]+$/, \"\"), detail }),\n verboseReason: compact ? null : reason || null,\n };\n}\n\n/** Re-renders only when the wait's copy can change: at its deadline and at midnight. */\nfunction useWaitClock(deadlineAt: string | undefined): number {\n const [now, setNow] = useState(Date.now);\n useEffect(() => {\n if (deadlineAt) setNow(Date.now());\n }, [deadlineAt]);\n useEffect(() => {\n if (!deadlineAt) return;\n const current = Date.now();\n const midnight = new Date(current);\n midnight.setHours(24, 0, 0, 0);\n const deadline = Date.parse(deadlineAt);\n const next =\n Number.isFinite(deadline) && deadline > current\n ? Math.min(deadline, midnight.getTime())\n : midnight.getTime();\n const timer = setTimeout(() => setNow(Date.now()), Math.min(next - current + 50, 2 ** 31 - 1));\n return () => clearTimeout(timer);\n }, [deadlineAt, now]);\n return now;\n}\n\nfunction isOptimisticQueuedMessage(\n message: ComposerOptimisticMessage,\n queuedTurnIds: ReadonlySet<string>,\n snapshot: UseTurnQueueResult[\"snapshot\"],\n): boolean {\n return (\n message.delivery === \"send\" &&\n message.destination === \"queue\" &&\n (!message.turnId || !queuedTurnIds.has(message.turnId)) &&\n !(\n message.turnId &&\n message.appliedQueueVersion !== null &&\n message.appliedQueueVersion !== undefined &&\n snapshot &&\n snapshot.version >= message.appliedQueueVersion\n )\n );\n}\n\nexport function countOptimisticQueuedMessages(\n messages: readonly ComposerOptimisticMessage[] | undefined,\n queuedTurnIds: ReadonlySet<string>,\n snapshot: UseTurnQueueResult[\"snapshot\"],\n): number {\n return (messages ?? []).filter((message) =>\n isOptimisticQueuedMessage(message, queuedTurnIds, snapshot),\n ).length;\n}\n\n/**\n * Steer on a just-sent message the chip shows before the server has confirmed\n * it. Steer needs the queued turn's id and version, which arrive with the next\n * queue read, so the click is taken at once and carried out when that exact\n * message lands in the queue. It is dropped, never retargeted, when the send\n * fails, is withdrawn or dismissed, the agent starts the message first, or\n * something else (an edit, Up recall or another Steer) already acts on it.\n * Each just-sent message keeps its own request, so steering a newer one never\n * cancels an earlier one.\n */\nfunction useDeferredQueuedSteer({\n messages,\n optimisticQueued,\n queuedTurnIds,\n steerTurn,\n mutationFor,\n mutating,\n enabled,\n}: {\n messages: readonly ComposerOptimisticMessage[] | undefined;\n optimisticQueued: readonly ComposerOptimisticMessage[];\n queuedTurnIds: ReadonlySet<string>;\n steerTurn: UseTurnQueueResult[\"steerTurn\"];\n mutationFor: UseTurnQueueResult[\"mutationFor\"];\n mutating: boolean;\n enabled: boolean;\n}) {\n // clientEventId -> the message's turn id once known.\n const [pending, setPending] = useState<ReadonlyMap<string, string | null>>(() => new Map());\n const steerRef = useRef(steerTurn);\n steerRef.current = steerTurn;\n useEffect(() => {\n if (pending.size === 0) return;\n const next = new Map<string, string | null>();\n const fire: string[] = [];\n for (const [clientEventId, knownTurnId] of pending) {\n const message = (messages ?? []).find(\n (candidate) => candidate.clientEventId === clientEventId,\n );\n // Gone means the turn started or was withdrawn; failed means nothing waits.\n if (!enabled || !message || message.state === \"failed\") continue;\n const turnId = message.turnId ?? knownTurnId;\n if (turnId && queuedTurnIds.has(turnId)) {\n // An edit, Up recall or Steer already acting on it wins.\n if (mutationFor(turnId) !== null) continue;\n // Another queue change is applying: steer right after it.\n if (mutating) {\n next.set(clientEventId, turnId);\n continue;\n }\n fire.push(turnId);\n continue;\n }\n const stillPlacing = optimisticQueued.some(\n (candidate) => candidate.clientEventId === clientEventId,\n );\n // The queue read caught up without it waiting there: already started.\n if (!stillPlacing) continue;\n next.set(clientEventId, turnId);\n }\n const changed =\n next.size !== pending.size ||\n [...next].some(([clientEventId, turnId]) => pending.get(clientEventId) !== turnId);\n if (changed) setPending(next);\n for (const turnId of fire) void steerRef.current(turnId);\n }, [enabled, messages, mutating, mutationFor, optimisticQueued, pending, queuedTurnIds]);\n return {\n request: (clientEventId: string) =>\n setPending((current) => {\n if (current.has(clientEventId)) return current;\n const next = new Map(current);\n next.set(clientEventId, null);\n return next;\n }),\n isPending: (clientEventId: string) => pending.has(clientEventId),\n isPendingTurn: (turnId: string) => [...pending.values()].includes(turnId),\n };\n}\n\n/**\n * First uncontrolled segment. An existing authoritative queue opens itself\n * when the host did not pick another default; optimistic-only occupancy\n * stays collapsed so a live Send does not shove a drawer under the pointer.\n */\nexport function sessionChromeInitialActive(input: {\n defaultActive: SessionChromeSignalId | null;\n authoritativeQueuedCount: number;\n}): SessionChromeSignalId | null {\n if (input.defaultActive != null) return input.defaultActive;\n return input.authoritativeQueuedCount >= 1 ? \"queue\" : null;\n}\n\n/**\n * Whether idle chrome should offer the queue panel. A dismissed session\n * stays collapsed until occupancy drains. Controlled hosts own this.\n */\nexport function sessionChromeShouldOfferQueue(input: {\n controlled: boolean;\n active: SessionChromeSignalId | null;\n activityOpen: boolean;\n authoritativeQueuedCount: number;\n suppressed: boolean;\n}): boolean {\n return (\n !input.controlled &&\n input.active === null &&\n !input.activityOpen &&\n input.authoritativeQueuedCount >= 1 &&\n !input.suppressed\n );\n}\n\n/** Select pill state from the goal's authoritative continuation projection. */\nexport function sessionChromeGoalPillState(\n goalStatus: \"active\" | \"paused\" | \"completed\",\n continuation: SessionGoal[\"continuation\"] | null | undefined,\n sessionStatus?: SessionStatus,\n): GoalPillState {\n if (goalStatus === \"completed\") return \"completed\";\n if (goalStatus === \"paused\") return \"paused\";\n if (sessionStatus === \"failed\") return \"session_failed\";\n if (!continuation) return \"invariant_broken\";\n if (continuation.state === \"running\") {\n return continuation.reason === \"goal_turn_running\"\n ? \"pursuing\"\n : continuation.reason === \"human_turn_running\"\n ? \"waiting\"\n : \"invariant_broken\";\n }\n // `backoff_pending` (idle pacing between consecutive no-input continuations,\n // next evaluation at `nextAttemptAt`) is an ordinary scheduled state.\n if (continuation.state === \"scheduled\") return \"scheduled\";\n if (continuation.state === \"blocked\") {\n if (\n continuation.reason === \"human_turn_running\" ||\n continuation.reason === \"system_work_pending\"\n ) {\n return \"waiting\";\n }\n // `held_for_input` is the agent's own wait_for_input hold (waiting for child\n // results / external input until a deadline); it shares the Held pill.\n return continuation.reason === \"workstream_paused\" || continuation.reason === \"held_for_input\"\n ? \"held\"\n : \"blocked\";\n }\n return \"invariant_broken\";\n}\n\nfunction formatCoarseElapsed(ms: number): string {\n const totalSeconds = Math.max(0, Math.floor(ms / 1000));\n const days = Math.floor(totalSeconds / 86_400);\n const hours = Math.floor((totalSeconds % 86_400) / 3_600);\n const minutes = Math.floor((totalSeconds % 3_600) / 60);\n const seconds = totalSeconds % 60;\n if (days > 0) return `${days}d ${hours}h`;\n if (hours > 0) return `${hours}h ${minutes}m`;\n if (minutes > 0) return `${minutes}m ${seconds}s`;\n return `${seconds}s`;\n}\n\nfunction useLiveElapsed(\n startIso: string | null | undefined,\n live: boolean,\n endIso?: string | null,\n) {\n const start = startIso ? Date.parse(startIso) : Number.NaN;\n const [now, setNow] = useState(() => Date.now());\n useEffect(() => {\n if (!live) return;\n const id = setInterval(() => setNow(Date.now()), 1_000);\n return () => clearInterval(id);\n }, [live]);\n if (!Number.isFinite(start)) return null;\n const end = live ? now : endIso ? Date.parse(endIso) : now;\n return formatCoarseElapsed((Number.isFinite(end) ? end : now) - start);\n}\n\nfunction pendingKindLabel(t: OpenGeniText, kind: SessionPendingInputPreview[\"kind\"]): string {\n switch (kind) {\n case \"child_terminal_result\":\n return t(\"sessionChrome.childResult\");\n case \"child_requires_action\":\n return t(\"sessionChrome.childNeedsInput\");\n case \"child_requires_action_resolved\":\n return t(\"sessionChrome.childUnblocked\");\n case \"child_paused\":\n return t(\"sessionChrome.childPaused\");\n case \"child_waiting_capacity\":\n return t(\"sessionChrome.childWaiting\");\n case \"child_progress\":\n return t(\"sessionChrome.childProgress\");\n case \"agent_steer_instruction\":\n return t(\"sessionChrome.steer\");\n case \"scheduled_occurrence\":\n return t(\"sessionChrome.automation\");\n case \"goal_continuation\":\n return t(\"sessionChrome.goalWake\");\n case \"agent_message\":\n return t(\"sessionChrome.update\");\n case \"background_command_result\":\n return t(\"sessionChrome.commandResult\");\n case \"session_wait_timeout\":\n return t(\"sessionChrome.waitEnded\");\n case \"media_generation_result\":\n return t(\"sessionChrome.videoResult\");\n case \"secret_use_approval_decided\":\n return t(\"sessionChrome.secretUseAnswer\");\n case \"capability_setup_completed\":\n return t(\"sessionChrome.setupFinished\");\n default:\n return t(\"sessionChrome.incoming\");\n }\n}\n\nfunction toneClass(tone: SessionChromeSignalTone, selected: boolean): string {\n switch (tone) {\n case \"accent\":\n return \"text-og-accent\";\n case \"waiting\":\n return \"text-og-status-waiting\";\n case \"running\":\n return \"text-og-status-running\";\n default:\n return selected ? \"text-og-fg\" : \"text-og-fg-subtle\";\n }\n}\n\n/**\n * Under a single-Send composer (`composer.singleSend`) the chrome speaks of\n * waiting messages rather than a queue, and offers no Steer on them.\n */\nexport function SessionChrome(props: SessionChromeProps) {\n return (\n <SingleSendWording enabled={props.composer?.singleSend === true}>\n <SessionChromeView {...props} />\n </SingleSendWording>\n );\n}\n\nfunction SessionChromeView({\n sessionStatus,\n wait,\n queue,\n queueFocusTarget,\n composer,\n onComposerFocus,\n queuedRecall,\n goal,\n agentsPanel,\n commandsPanel,\n commandsCount = 0,\n agentsSignal,\n onDismissIncoming,\n onOpenSession,\n readOnly = false,\n className,\n active: activeControlled,\n defaultActive = null,\n onActiveChange,\n}: SessionChromeProps) {\n const t = useOpenGeniText();\n const formatError = useErrorMessage();\n // A queue read failing while Opengeni updates is not a queue problem: the\n // hook keeps retrying and the last queue stays on screen. Only a failure\n // that outlasts a normal update (or a definitive one) needs attention.\n const queueLoadCalm = useCalmServiceFailure(queue.error);\n const queueLoadError = queueLoadCalm ? null : queue.error;\n const [activityRequested, setActivityOpen] = useState(\n Boolean(defaultActive && [\"incoming\", \"agents\", \"commands\"].includes(defaultActive)),\n );\n const reactId = useId();\n const panelId = `og-session-chrome-panel-${reactId}`;\n const reduceMotion = useReducedMotion();\n const record = goal?.goal ?? null;\n const incoming = queue.pendingInputs;\n const turns = queue.queue;\n const queueMutationFor = queue.mutationFor;\n const queuedTurns = useMemo(\n () => turns.filter((turn) => isAuthoritativeQueuedTurn(turn, queueMutationFor)),\n [queueMutationFor, turns],\n );\n const queuedTurnIds = useMemo(() => new Set(queuedTurns.map((turn) => turn.id)), [queuedTurns]);\n const optimisticQueued = useMemo(\n () =>\n (composer?.optimisticMessages ?? []).filter((message) =>\n isOptimisticQueuedMessage(message, queuedTurnIds, queue.snapshot),\n ),\n [composer?.optimisticMessages, queue.snapshot, queuedTurnIds],\n );\n const stoppingKind =\n composer?.stoppingAttempt ??\n (queue.stoppingPreviousAttempt\n ? queue.effectiveControl?.state === \"paused\"\n ? \"current\"\n : \"previous\"\n : null);\n const stopping = stoppingKind !== null;\n const stoppingLabel =\n stoppingKind === \"current\"\n ? t(\"sessionChrome.currentWorkStopping\")\n : t(\"sessionChrome.previousWorkStopping\");\n const canMutateQueue = !readOnly && composer !== undefined;\n // One Send: nothing to choose, so waiting messages offer no Steer.\n const canSteerQueued = canMutateQueue && composer?.singleSend !== true;\n const deferredSteer = useDeferredQueuedSteer({\n messages: composer?.optimisticMessages,\n optimisticQueued,\n queuedTurnIds,\n steerTurn: queue.steerTurn,\n mutationFor: queue.mutationFor,\n mutating: queue.mutating,\n enabled: canSteerQueued,\n });\n\n const elapsed = useLiveElapsed(record?.createdAt, Boolean(record));\n const goalState = record\n ? sessionChromeGoalPillState(record.status, record.continuation, sessionStatus)\n : null;\n const waitNow = useWaitClock(wait?.deadlineAt);\n const waitReason = wait?.reason;\n const waitDeadline = wait?.deadlineAt;\n const waitView = useMemo(\n () =>\n waitReason !== undefined && waitDeadline !== undefined\n ? sessionChromeWaitPresentation(\n t,\n { reason: waitReason, deadlineAt: waitDeadline },\n waitNow,\n )\n : null,\n [t, waitReason, waitDeadline, waitNow],\n );\n // Screen readers skip a live region that mounts already filled, and the\n // chrome mounts with the wait when it is the only signal. Fill it after mount.\n const waitLabel = waitView?.label ?? \"\";\n const [waitAnnouncement, setWaitAnnouncement] = useState(\"\");\n useEffect(() => setWaitAnnouncement(waitLabel), [waitLabel]);\n\n const initialAuthoritativeQueuedCount = countAuthoritativeQueuedTurns(\n queue.queue,\n queue.mutationFor,\n );\n const [activeUncontrolled, setActiveUncontrolled] = useState<SessionChromeSignalId | null>(() =>\n sessionChromeInitialActive({\n defaultActive,\n authoritativeQueuedCount: initialAuthoritativeQueuedCount,\n }),\n );\n const active = activeControlled !== undefined ? activeControlled : activeUncontrolled;\n const rootRef = useRef<HTMLDivElement>(null);\n const openedQueueTargetRef = useRef<string | null>(null);\n const focusedQueueTargetRef = useRef<string | null>(null);\n const queueTargetKey = queueFocusTarget\n ? `${queueFocusTarget.turnId}:${queueFocusTarget.requestId}`\n : null;\n useEffect(() => {\n if (!queueTargetKey || openedQueueTargetRef.current === queueTargetKey) return;\n openedQueueTargetRef.current = queueTargetKey;\n if (activeControlled === undefined) setActiveUncontrolled(\"queue\");\n onActiveChange?.(\"queue\");\n }, [queueTargetKey, activeControlled, onActiveChange]);\n useEffect(() => {\n if (!queueFocusTarget || active !== \"queue\" || focusedQueueTargetRef.current === queueTargetKey)\n return;\n const root = rootRef.current;\n if (!root) return;\n const focus = () => {\n const row = Array.from(root.querySelectorAll<HTMLElement>(\"[data-queue-turn-id]\")).find(\n (element) => element.dataset.queueTurnId === queueFocusTarget.turnId,\n );\n if (!row) return false;\n focusedQueueTargetRef.current = queueTargetKey;\n row.focus({ preventScroll: true });\n row.scrollIntoView?.({ block: \"nearest\" });\n return true;\n };\n if (focus()) return;\n const observer = new MutationObserver(() => {\n if (focus()) observer.disconnect();\n });\n observer.observe(root, { childList: true, subtree: true });\n return () => observer.disconnect();\n }, [queueFocusTarget, queueTargetKey, active, queuedTurns]);\n const activityOpen =\n activityRequested || Boolean(active && [\"incoming\", \"agents\", \"commands\"].includes(active));\n const activityVisibleRef = useRef(activityOpen);\n activityVisibleRef.current = activityOpen;\n // Two independent suppressions, both occupancy-scoped:\n // - admission: a live Send while idle must not open a drawer under the pointer\n // - dismiss: closing the queue remembers that session until occupancy drains\n const queueOfferAdmissionSuppressedRef = useRef(\n defaultActive == null &&\n initialAuthoritativeQueuedCount === 0 &&\n countOptimisticQueuedMessages(composer?.optimisticMessages, queuedTurnIds, queue.snapshot) >\n 0,\n );\n const queueOfferDismissedSessionIdsRef = useRef<Set<string>>(new Set());\n const occupancySessionId = queuedTurns[0]?.sessionId ?? null;\n const setActive = (next: SessionChromeSignalId | null) => {\n if (active === \"queue\" && next === null) {\n if (occupancySessionId) {\n queueOfferDismissedSessionIdsRef.current.add(occupancySessionId);\n } else {\n queueOfferAdmissionSuppressedRef.current = true;\n }\n }\n if (activeControlled === undefined) setActiveUncontrolled(next);\n onActiveChange?.(next);\n };\n\n const hasCommandsPanel = commandsPanel != null;\n const signals = useMemo(() => {\n const rows: Array<{\n id: SessionChromeSignalId;\n label: string;\n detail?: string | undefined;\n /** Hover explanation (why paused / held / when the next check is). */\n title?: string | undefined;\n tone: SessionChromeSignalTone;\n icon: ReactNode;\n }> = [];\n if (waitView) {\n rows.push({\n id: \"wait\",\n label: waitView.headline,\n detail: waitView.due ? t(\"sessionChrome.waitDue\") : waitView.clock,\n title: waitView.label,\n tone: \"neutral\",\n icon: <Clock3Icon className=\"size-3\" />,\n });\n }\n if (incoming.length > 0) {\n const detail = incoming[0]?.summary;\n rows.push({\n id: \"incoming\",\n label: `${incoming.length} in`,\n ...(detail ? { detail } : {}),\n tone: incoming.some(\n (item) => item.classification === \"action_required\" || item.classification === \"failure\",\n )\n ? \"waiting\"\n : \"neutral\",\n icon: <InboxIcon className=\"size-3\" />,\n });\n }\n const queuedCount = queuedTurns.length + optimisticQueued.length;\n const queueProblem = queue.mutationError ?? queueLoadError;\n if (queuedCount > 0 || queueProblem) {\n const presentations = queuedTurns.map((turn) => queuedTurnPresentation(t, turn));\n const first = presentations[0];\n const allVoiceRequests =\n optimisticQueued.length === 0 &&\n presentations.length > 0 &&\n presentations.every(({ kind }) => kind === \"realtime_voice\");\n const onlyVoiceHandoff =\n optimisticQueued.length === 0 &&\n presentations.length === 1 &&\n first?.kind === \"realtime_voice_handoff\";\n const voiceOnly = allVoiceRequests || onlyVoiceHandoff;\n const detail = queueProblem\n ? queue.mutationError\n ? t(\"sessionChrome.actionNotConfirmed\")\n : t(\"sessionChrome.queueUnavailable2\")\n : (first?.text ?? optimisticQueued[0]?.text);\n rows.push({\n id: \"queue\",\n label: queueProblem\n ? queuedCount > 0\n ? t(\"sessionChrome.queuedcountQueuedNeedsAttention\", { queuedCount })\n : t(\"sessionChrome.queueNeedsAttention\")\n : allVoiceRequests\n ? queuedCount === 1\n ? t(\"sessionChrome.voiceRequestQueued\")\n : t(\"sessionChrome.queuedcountVoiceRequestsQueued\", { queuedCount })\n : onlyVoiceHandoff\n ? t(\"sessionChrome.voiceHandoffQueued\")\n : t(\"sessionChrome.queuedPromptCount\", { count: queuedCount }),\n ...(detail ? { detail } : {}),\n tone: queueProblem ? \"waiting\" : \"neutral\",\n icon: queueProblem ? (\n <TriangleAlertIcon className=\"size-3\" />\n ) : voiceOnly ? (\n <AudioLinesIcon className=\"size-3\" />\n ) : (\n <ListOrderedIcon className=\"size-3\" />\n ),\n });\n }\n if (record && goalState) {\n const waiting =\n goalState === \"waiting\" ||\n goalState === \"blocked\" ||\n goalState === \"session_failed\" ||\n goalState === \"held\" ||\n goalState === \"paused\";\n const explanation = sessionChromeGoalPillExplanation(t, goalState, record);\n rows.push({\n id: \"goal\",\n label: sessionChromeGoalPillLabel(t, goalState, record),\n detail: elapsed ? `${elapsed} · ${record.text}` : record.text,\n ...(explanation ? { title: explanation } : {}),\n tone: waiting\n ? \"waiting\"\n : goalState === \"pursuing\" || goalState === \"scheduled\"\n ? \"accent\"\n : \"neutral\",\n icon: <TargetIcon className=\"size-3\" />,\n });\n }\n if (agentsSignal && agentsSignal.count > 0) {\n const detail = agentsSignal.detail;\n rows.push({\n id: \"agents\",\n label: t(\"counts.agents\", { count: agentsSignal.count }),\n ...(detail ? { detail } : {}),\n tone: agentsSignal.tone ?? \"neutral\",\n icon: <BotIcon className=\"size-3\" />,\n });\n }\n if (commandsCount > 0 || (active === \"commands\" && hasCommandsPanel)) {\n rows.push({\n id: \"commands\",\n label:\n commandsCount > 0\n ? t(\"counts.commands\", { count: commandsCount })\n : t(\"sessionChrome.commands2\"),\n tone: commandsCount > 0 ? \"running\" : \"neutral\",\n icon: <TerminalIcon className=\"size-3\" />,\n });\n }\n return rows;\n }, [\n commandsCount,\n hasCommandsPanel,\n active,\n agentsSignal,\n elapsed,\n goalState,\n incoming,\n optimisticQueued,\n queueLoadError,\n queue.mutationError,\n queuedTurns,\n record,\n t,\n waitView,\n ]);\n\n const optimisticQueueKeys = optimisticQueued.map((message) => message.clientEventId).join(\",\");\n const previousOptimisticQueueKeys = useRef(optimisticQueueKeys);\n const [queueArrivalNonce, setQueueArrivalNonce] = useState(0);\n useEffect(() => {\n const previous = new Set(previousOptimisticQueueKeys.current.split(\",\").filter(Boolean));\n const arrived = optimisticQueued.some((message) => !previous.has(message.clientEventId));\n previousOptimisticQueueKeys.current = optimisticQueueKeys;\n if (!arrived) return;\n // Queue admission must not move the conversation or open a drawer beneath\n // the pointer. A stable, paint-only receipt on the queue chip communicates\n // destination without participating in layout.\n setQueueArrivalNonce((current) => current + 1);\n if (activeControlled === undefined && active === null) {\n queueOfferAdmissionSuppressedRef.current = true;\n }\n }, [active, activeControlled, optimisticQueueKeys, optimisticQueued]);\n const queueOccupied = queuedTurns.length > 0 || optimisticQueued.length > 0;\n useEffect(() => {\n if (queueOccupied) return;\n // A later wave may offer again. A prior session's dismiss must not stick\n // after this instance has actually gone empty.\n queueOfferAdmissionSuppressedRef.current = false;\n queueOfferDismissedSessionIdsRef.current.clear();\n }, [queueOccupied]);\n const queueOfferSuppressed =\n queueOfferAdmissionSuppressedRef.current ||\n (occupancySessionId != null &&\n queueOfferDismissedSessionIdsRef.current.has(occupancySessionId));\n useEffect(() => {\n if (\n !sessionChromeShouldOfferQueue({\n controlled: activeControlled !== undefined,\n active,\n activityOpen,\n authoritativeQueuedCount: queuedTurns.length,\n suppressed: queueOfferSuppressed,\n })\n ) {\n return;\n }\n if (activeControlled === undefined) setActiveUncontrolled(\"queue\");\n onActiveChange?.(\"queue\");\n }, [\n active,\n activeControlled,\n activityOpen,\n occupancySessionId,\n onActiveChange,\n queueOfferSuppressed,\n queuedTurns.length,\n ]);\n const [replaceDraftFor, setReplaceDraftFor] = useState<string | null>(null);\n\n const chipRefs = useRef<Partial<Record<SessionChromeSignalId, HTMLButtonElement | null>>>({});\n const railRef = useRef<HTMLDivElement | null>(null);\n const [pill, setPill] = useState({ left: 0, top: 0, width: 0, height: 0, opacity: 0 });\n\n const signalIds = signals.map((signal) => signal.id).join(\",\");\n useEffect(() => {\n if (!signals.some((signal) => [\"incoming\", \"agents\", \"commands\"].includes(signal.id)))\n setActivityOpen(false);\n }, [signals]);\n useEffect(() => {\n if (active && !signalIds.split(\",\").includes(active)) {\n if (activeControlled === undefined) setActiveUncontrolled(null);\n onActiveChange?.(null);\n }\n }, [active, activeControlled, onActiveChange, signalIds]);\n\n useEffect(() => {\n if (active !== \"queue\" || !replaceDraftFor) return;\n if (!queuedTurns.some((turn) => turn.id === replaceDraftFor)) {\n setReplaceDraftFor(null);\n }\n }, [active, queuedTurns, replaceDraftFor]);\n\n useEffect(() => {\n const rail = railRef.current;\n const measure = () => {\n if (!rail || !active) {\n setPill((prev) => (prev.opacity === 0 ? prev : { ...prev, opacity: 0 }));\n return;\n }\n const chip = chipRefs.current[active];\n if (!chip) {\n setPill((prev) => ({ ...prev, opacity: 0 }));\n return;\n }\n // Measure against the chip's own box so a wrapped multi-row rail never\n // stretches the highlight into a tall stripe across every signal.\n const railBox = rail.getBoundingClientRect();\n const chipBox = chip.getBoundingClientRect();\n setPill({\n left: chipBox.left - railBox.left,\n top: chipBox.top - railBox.top,\n width: chipBox.width,\n height: chipBox.height,\n opacity: 1,\n });\n };\n measure();\n if (!rail) return;\n const observer = new ResizeObserver(measure);\n observer.observe(rail);\n for (const chip of Object.values(chipRefs.current)) {\n if (chip) observer.observe(chip);\n }\n window.addEventListener(\"resize\", measure);\n return () => {\n observer.disconnect();\n window.removeEventListener(\"resize\", measure);\n };\n }, [active, signals]);\n\n const open = active !== null;\n // Collapsed queue chip shows the latest queued message so a Send that lands\n // in the queue is visible without opening the list. Steer on a message the\n // server has not confirmed yet is taken at once and carried out when it lands.\n const latestOptimisticQueued = optimisticQueued[optimisticQueued.length - 1];\n const latestQueuedTurn = queuedTurns[queuedTurns.length - 1];\n const queuePeek: {\n text: string | null;\n turnId: string | null;\n /** Unconfirmed send shown in the chip; Steer on it is deferred. */\n pending: ComposerOptimisticMessage | null;\n } | null =\n queueLoadError || queue.mutationError\n ? null\n : latestOptimisticQueued\n ? {\n text: latestOptimisticQueued.text.trim() || null,\n turnId: null,\n pending: latestOptimisticQueued,\n }\n : latestQueuedTurn\n ? {\n text: queuedTurnPresentation(t, latestQueuedTurn).text.trim() || null,\n turnId: latestQueuedTurn.id,\n pending: null,\n }\n : null;\n const queuePeekSteering = queuePeek\n ? queuePeek.pending\n ? deferredSteer.isPending(queuePeek.pending.clientEventId)\n : queuePeek.turnId !== null &&\n (queue.mutationFor(queuePeek.turnId) === \"steer\" ||\n deferredSteer.isPendingTurn(queuePeek.turnId))\n : false;\n\n if (signals.length === 0 && !stopping) return null;\n\n const shellDuration = reduceMotion ? 0 : 0.22;\n const crossfadeDuration = reduceMotion ? 0 : 0.18;\n const ease = [0.22, 1, 0.36, 1] as const;\n\n const panelBody =\n active === \"incoming\" ? (\n <IncomingPanel\n inputs={incoming}\n onDismiss={onDismissIncoming}\n onOpenSession={onOpenSession}\n />\n ) : active === \"queue\" ? (\n <QueuePanel\n turns={queuedTurns}\n optimistic={optimisticQueued}\n loadError={queueLoadError}\n mutationError={queue.mutationError}\n onRefresh={queue.refresh}\n onClearMutationError={queue.clearMutationError}\n onRetryOptimistic={composer?.retryOptimisticMessage}\n onRestoreOptimistic={composer?.restoreOptimisticMessage}\n onRemoveOptimistic={composer?.removeOptimisticMessage}\n readOnly={!canMutateQueue}\n mutationFor={queue.mutationFor}\n upRecallTurnId={queuedRecall?.turnId ?? null}\n replaceDraftFor={replaceDraftFor}\n onCancelReplace={() => setReplaceDraftFor(null)}\n onConfirmReplace={\n canMutateQueue && composer && replaceDraftFor\n ? () => {\n const turnId = replaceDraftFor;\n setReplaceDraftFor(null);\n void (async () => {\n const checkedOut = await queue.editTurn(turnId, {\n expectedDraftRevision: composer.draftRevision,\n replaceDraft: true,\n });\n if (checkedOut) {\n composer.applyDraft(checkedOut);\n onComposerFocus?.();\n }\n })();\n }\n : undefined\n }\n onEdit={\n canMutateQueue && composer\n ? (turn) => {\n requestQueueDraftEdit(\n composer,\n () => setReplaceDraftFor(turn.id),\n () => {\n void (async () => {\n const checkedOut = await queue.editTurn(turn.id, {\n expectedDraftRevision: composer.draftRevision,\n replaceDraft: false,\n });\n if (checkedOut) {\n composer.applyDraft(checkedOut);\n onComposerFocus?.();\n }\n })();\n },\n );\n }\n : undefined\n }\n onSteer={\n canSteerQueued\n ? (turnId) => {\n void queue.steerTurn(turnId);\n }\n : undefined\n }\n onRemove={\n canMutateQueue\n ? (turnId) => {\n void queue.removeTurn(turnId);\n }\n : undefined\n }\n onMove={\n canMutateQueue\n ? (turnId, beforeTurnId) => {\n void queue.moveTurn(turnId, beforeTurnId);\n }\n : undefined\n }\n />\n ) : active === \"wait\" && waitView ? (\n <WaitPanel view={waitView} />\n ) : active === \"goal\" && record && goalState && goal ? (\n <GoalPanel goal={goal} state={goalState} elapsed={elapsed} readOnly={readOnly} />\n ) : active === \"commands\" ? (\n <div data-og-session-chrome-panel=\"commands\">{commandsPanel}</div>\n ) : active === \"agents\" ? (\n <div data-og-session-chrome-panel=\"agents\">\n {agentsPanel ?? (\n <p className=\"text-og-xs text-og-fg-muted\">{t(\"sessionChrome.noAgentDetails\")}</p>\n )}\n </div>\n ) : null;\n\n return (\n <TooltipProvider delayDuration={300}>\n <div\n className={cn(\"og-session-chrome og-root w-full\", className)}\n data-testid=\"session-chrome\"\n ref={rootRef}\n data-og-session-chrome=\"\"\n data-og-session-chrome-open={open ? \"true\" : \"false\"}\n >\n {/* The wait chip is a button; announce when the agent starts waiting or its check is due. */}\n <span className=\"sr-only\" role=\"status\" aria-live=\"polite\">\n {waitAnnouncement}\n </span>\n <div\n className={cn(\n \"relative overflow-hidden border\",\n \"transition-[background-color,border-color,box-shadow] motion-reduce:transition-none\",\n )}\n style={{\n borderRadius: \"var(--_og-session-chrome-radius)\",\n background: \"transparent\",\n borderColor: \"transparent\",\n boxShadow: \"none\",\n transitionDuration: \"var(--og-session-chrome-duration)\",\n transitionTimingFunction: \"var(--_og-session-chrome-ease)\",\n }}\n >\n <div\n // The frame clips its children. On coarse pointers the rail leaves\n // room for the chips' invisible hit areas so each stays a 44px target.\n className=\"relative py-[var(--og-session-chrome-rail-pad)] pointer-coarse:py-1.5\"\n style={{\n paddingLeft: \"var(--og-session-chrome-rail-pad)\",\n paddingRight: \"var(--og-session-chrome-rail-pad)\",\n }}\n >\n <div\n ref={railRef}\n className=\"relative flex flex-nowrap items-center\"\n style={{\n gap: \"6px\",\n }}\n >\n <motion.div\n aria-hidden\n className=\"pointer-events-none absolute left-0 top-0 rounded-og-md\"\n style={{\n background: \"var(--_og-session-chrome-highlight)\",\n boxShadow: \"inset 0 0 0 1px var(--_og-session-chrome-highlight-ring)\",\n }}\n initial={false}\n animate={{\n x: pill.left,\n y: pill.top,\n width: pill.width,\n height: pill.height,\n opacity: pill.opacity,\n }}\n transition={{ duration: shellDuration, ease }}\n />\n {signals\n .filter((signal) => ![\"incoming\", \"agents\", \"commands\"].includes(signal.id))\n .map((signal) => {\n const selected = active === signal.id;\n return (\n <div\n key={signal.id}\n role=\"group\"\n aria-label={\n signal.id === \"queue\"\n ? t(\"sessionChrome.queuedMessagesAndActions\")\n : signal.id === \"goal\"\n ? t(\"sessionChrome.goalAndActions\")\n : signal.id === \"wait\"\n ? t(\"sessionChrome.waitStatus\")\n : signal.label\n }\n className={cn(\n \"group/signal relative z-[1] inline-flex min-w-0 max-w-full items-center rounded-og-md\",\n // The wait reason gives way first; short chips keep their size.\n signal.id === \"goal\" ? \"shrink-0\" : \"shrink\",\n selected && \"bg-og-surface-3\",\n )}\n >\n <button\n type=\"button\"\n ref={(node) => {\n chipRefs.current[signal.id] = node;\n }}\n aria-expanded={selected}\n aria-controls={panelId}\n aria-label={\n signal.id === \"goal\"\n ? t(\"sessionChrome.goalValue\", {\n value:\n goalState === \"pursuing\"\n ? t(\"sessionChrome.running\")\n : signal.label,\n })\n : selected\n ? t(\"sessionChrome.closeLabel\", { label: signal.label })\n : signal.id === \"wait\" && waitView\n ? waitView.label\n : undefined\n }\n data-testid={`session-chrome-${signal.id}`}\n data-og-session-chrome-signal={signal.id}\n title={signal.title ?? signal.label}\n onClick={() => {\n setActivityOpen(false);\n setActive(selected ? null : signal.id);\n }}\n className={cn(\n \"group relative z-[1] inline-flex min-w-0 min-h-[var(--og-session-chrome-chip-min-height)] max-w-full items-center gap-1.5 rounded-og-md py-1 text-left text-og-xs outline-hidden\",\n // Coarse pointers keep a 44px target (session-pins acceptance)\n // through an invisible hit area, so the row itself stays slim.\n \"pointer-coarse:min-h-8 pointer-coarse:before:absolute pointer-coarse:before:inset-x-0 pointer-coarse:before:-inset-y-1.5 pointer-coarse:before:content-['']\",\n \"transition-colors duration-150 motion-reduce:transition-none\",\n \"hover:bg-og-surface-2/70 hover:text-og-fg focus-visible:bg-og-surface-3/50\",\n selected ? \"text-og-fg\" : \"text-og-fg-muted\",\n )}\n style={{\n paddingInline: \"var(--og-session-chrome-chip-pad-x)\",\n }}\n >\n {signal.id === \"queue\" && queueArrivalNonce > 0 && !reduceMotion ? (\n <motion.span\n key={queueArrivalNonce}\n aria-hidden=\"true\"\n data-testid=\"session-chrome-queue-arrival\"\n className=\"pointer-events-none absolute inset-0 rounded-og-md bg-og-accent-soft\"\n initial={{ opacity: 0 }}\n animate={{ opacity: [0, 0.38, 0] }}\n transition={{ duration: 0.72, times: [0, 0.18, 1], ease }}\n />\n ) : null}\n <span className={cn(\"shrink-0\", toneClass(signal.tone, selected))}>\n {signal.icon}\n </span>\n <span\n className={cn(\n signal.id === \"wait\" ? \"text-og-fg\" : \"font-medium text-og-fg\",\n signal.id === \"queue\" && queuePeek?.text && !selected\n ? \"shrink-0\"\n : \"min-w-0 truncate\",\n )}\n >\n {signal.id === \"goal\"\n ? // Held for the agent's own wait: the wait signal already\n // says why, so the goal chip only names itself.\n waitView && goalState === \"held\"\n ? t(\"sessionChrome.goal\")\n : `${t(\"sessionChrome.goalPrefix\")} ${\n goalState === \"pursuing\"\n ? t(\"sessionChrome.running\")\n : signal.label\n }`\n : signal.id === \"queue\"\n ? queueLoadError || queue.mutationError\n ? signal.label\n : t(\"sessionChrome.queuedCount\", {\n count: queuedTurns.length + optimisticQueued.length,\n })\n : signal.label}\n </span>\n {signal.id === \"wait\" && signal.detail ? (\n <span className=\"shrink-0 tabular-nums text-og-fg-subtle\">\n {signal.detail}\n </span>\n ) : null}\n {signal.id === \"queue\" && queuePeek?.text && !selected ? (\n <AnimatePresence initial={false} mode=\"popLayout\">\n <motion.span\n key={queuePeek.text}\n data-testid=\"session-chrome-queue-peek\"\n className=\"min-w-0 max-w-[min(24rem,60vw)] truncate text-og-fg-muted\"\n initial={reduceMotion ? false : { opacity: 0, y: 3 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, transition: { duration: crossfadeDuration } }}\n transition={{ duration: crossfadeDuration, ease }}\n >\n {queuePeek.text}\n </motion.span>\n </AnimatePresence>\n ) : null}\n </button>\n {signal.id === \"queue\" && canSteerQueued && queuePeek && !selected ? (\n <div className=\"flex shrink-0 items-center pr-1 pl-0.5\">\n <IconAction\n label={t(\"sessionChrome.steerLatestQueuedMessage\")}\n analyticsAction=\"steer\"\n text={t(\"sessionChrome.steer\")}\n tip={<QueueSteerTip />}\n disabled={\n queuePeek.pending\n ? queuePeek.pending.state === \"failed\" || queuePeekSteering\n : !queuePeek.turnId ||\n queue.mutating ||\n Boolean(queue.mutationFor(queuePeek.turnId))\n }\n onClick={() => {\n if (queuePeek.pending) {\n deferredSteer.request(queuePeek.pending.clientEventId);\n } else if (queuePeek.turnId) {\n void queue.steerTurn(queuePeek.turnId);\n }\n }}\n >\n {queuePeekSteering ? (\n <Loader2Icon className=\"size-3 animate-og-spin\" />\n ) : (\n <CornerDownRightIcon className=\"size-3\" />\n )}\n </IconAction>\n </div>\n ) : null}\n </div>\n );\n })}\n {stopping ? (\n // Beside Activity at the rail's end, on one line. In a full rail\n // its words give way first so other chips keep their size; the\n // spinner always stays.\n <span\n role=\"status\"\n aria-live=\"polite\"\n title={stoppingLabel}\n className=\"ml-auto inline-flex min-h-[var(--og-session-chrome-chip-min-height)] min-w-6 shrink-[9999] items-center gap-1.5 px-1.5 text-og-xs whitespace-nowrap text-og-fg-muted\"\n data-testid=\"session-chrome-stopping\"\n >\n <Loader2Icon\n aria-hidden=\"true\"\n className=\"size-3 shrink-0 animate-og-spin motion-reduce:animate-none\"\n />\n <span className=\"min-w-0 truncate\">{stoppingLabel}</span>\n </span>\n ) : null}\n {signals.some((signal) => [\"incoming\", \"agents\", \"commands\"].includes(signal.id)) ? (\n <button\n type=\"button\"\n aria-label={t(\"sessionChrome.sessionActivity\")}\n aria-describedby={commandsCount > 0 ? `${panelId}-commands-count` : undefined}\n title={\n activityOpen\n ? t(\"sessionChrome.closeActivity\")\n : t(\"sessionChrome.inboxAgentsAndCommands\")\n }\n aria-controls={panelId}\n aria-expanded={activityOpen}\n onClick={() => {\n setActivityOpen(!activityOpen);\n setActive(\n activityOpen\n ? null\n : commandsCount > 0 && hasCommandsPanel\n ? \"commands\"\n : (signals.find((signal) =>\n [\"incoming\", \"agents\", \"commands\"].includes(signal.id),\n )?.id ?? null),\n );\n }}\n className={cn(\n \"relative inline-flex min-h-[var(--og-session-chrome-chip-min-height)] shrink-0 items-center justify-center gap-1.5 rounded-og-md px-2 text-og-xs transition-colors outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent/40\",\n // A stopping status before it takes the free space instead.\n !stopping && \"ml-auto\",\n // 44px coarse target without a taller row (see the signal chips).\n \"pointer-coarse:min-h-8 pointer-coarse:min-w-11 pointer-coarse:before:absolute pointer-coarse:before:inset-x-0 pointer-coarse:before:-inset-y-1.5 pointer-coarse:before:content-['']\",\n activityOpen\n ? \"bg-og-surface-3 text-og-fg\"\n : \"text-og-fg-muted hover:bg-og-surface-2 hover:text-og-fg\",\n )}\n >\n <ActivityIcon className=\"size-3.5\" />\n <span className=\"sr-only\">{t(\"sessionChrome.activity\")}</span>\n {commandsCount > 0 ? (\n <>\n <span\n aria-hidden=\"true\"\n className=\"size-1.5 shrink-0 animate-og-pulse rounded-full bg-og-fg-muted motion-reduce:animate-none\"\n />\n <span id={`${panelId}-commands-count`}>\n {t(\"sessionChrome.commands\", { count: commandsCount })}\n </span>\n </>\n ) : null}\n {incoming.length > 0 ? (\n <span className=\"size-1.5 rounded-full bg-og-accent\" />\n ) : null}\n </button>\n ) : null}\n </div>\n </div>\n\n <AnimatePresence initial={false}>\n {activityOpen ? (\n <motion.div\n key=\"activity-tabs\"\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: \"auto\", opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={{ duration: shellDuration, ease }}\n style={{ overflow: \"hidden\" }}\n >\n <div className=\"mt-1 flex items-center gap-1 rounded-t-og-lg bg-og-surface-2/50 px-2 py-1\">\n {signals\n .filter((signal) => [\"incoming\", \"agents\", \"commands\"].includes(signal.id))\n .map((signal) => (\n <button\n key={signal.id}\n type=\"button\"\n aria-expanded={active === signal.id}\n onClick={() => {\n if (activityVisibleRef.current) setActive(signal.id);\n }}\n className={cn(\n \"inline-flex min-h-9 items-center gap-1.5 rounded-og-md px-2 text-og-xs pointer-coarse:min-h-11\",\n active === signal.id\n ? \"bg-og-surface-3 text-og-fg\"\n : \"text-og-fg-muted hover:text-og-fg\",\n )}\n >\n {signal.icon}\n {signal.id === \"incoming\"\n ? t(\"sessionChrome.lengthIncoming\", { length: incoming.length })\n : signal.label}\n </button>\n ))}\n </div>\n </motion.div>\n ) : null}\n </AnimatePresence>\n {goal?.mutationError ? (\n <p role=\"alert\" className=\"px-3 pb-2 text-og-xs text-og-danger\">\n {t(\"sessionChrome.goalActionNotConfirmedError\", {\n error: formatError(goal.mutationError),\n })}\n </p>\n ) : null}\n <div\n id={panelId}\n data-og-session-chrome-panel-shell=\"\"\n aria-hidden={!open}\n {...inertProps(!open)}\n className=\"grid overflow-hidden motion-reduce:transition-none\"\n style={{\n gridTemplateRows: open ? \"1fr\" : \"0fr\",\n opacity: open ? 1 : 0,\n pointerEvents: open ? \"auto\" : \"none\",\n transitionProperty: \"grid-template-rows, opacity\",\n transitionDuration: \"var(--og-session-chrome-duration)\",\n transitionTimingFunction: \"var(--_og-session-chrome-ease)\",\n }}\n >\n <div className=\"min-h-0 overflow-hidden\">\n <div\n className={cn(\n \"relative overflow-y-auto overscroll-contain\",\n activityOpen\n ? \"rounded-b-og-lg bg-og-surface-2/50\"\n : \"mt-1 rounded-og-lg bg-og-surface-2/50\",\n )}\n style={{\n maxHeight: \"var(--og-session-chrome-panel-max-height)\",\n paddingInline: \"var(--og-session-chrome-panel-pad-x)\",\n paddingBlock: \"var(--og-session-chrome-panel-pad-y)\",\n }}\n >\n <AnimatePresence initial={false}>\n {active && active !== \"commands\" && panelBody ? (\n <motion.div\n key={active}\n data-og-session-chrome-panel-frame={active}\n initial={reduceMotion ? false : { opacity: 0 }}\n animate={{ opacity: 1, position: \"relative\" }}\n exit={\n reduceMotion\n ? { opacity: 1, position: \"relative\" }\n : {\n opacity: 0,\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n }\n }\n transition={{ duration: crossfadeDuration, ease }}\n >\n {panelBody}\n </motion.div>\n ) : null}\n </AnimatePresence>\n {active === \"commands\" ? (\n <motion.div\n key=\"commands\"\n initial={reduceMotion ? false : { opacity: 0 }}\n animate={{ opacity: 1 }}\n transition={{ duration: crossfadeDuration, ease }}\n >\n {panelBody}\n </motion.div>\n ) : null}\n </div>\n </div>\n </div>\n </div>\n </div>\n </TooltipProvider>\n );\n}\n\nfunction IncomingPanel({\n inputs,\n onDismiss,\n onOpenSession,\n}: {\n inputs: SessionPendingInputPreview[];\n onDismiss?: ((inputId: string) => void) | undefined;\n onOpenSession?: ((sessionId: string) => void) | undefined;\n}) {\n const t = useOpenGeniText();\n // When a sandbox is shut down or lost, every command on it reports at once.\n // One row reads better than dozens of identical ones; each result still\n // reaches the agent. Ordinary results keep their own rows.\n const lostWithSandbox = inputs.filter(isLostWithSandboxResult);\n const grouped = new Set(\n lostWithSandbox.length >= 2 ? lostWithSandbox.map((input) => input.id) : [],\n );\n const firstGrouped = lostWithSandbox.length >= 2 ? lostWithSandbox[0]!.id : null;\n return (\n <div>\n <p className=\"mb-2 text-og-xs text-og-fg-subtle\">\n {t(\"sessionChrome.waitingToBeIncludedIn\")}\n </p>\n <ul\n className=\"flex flex-col gap-0.5\"\n aria-label={t(\"sessionChrome.incomingUpdates\")}\n data-og-session-chrome-panel=\"incoming\"\n >\n {inputs.map((input) =>\n grouped.has(input.id) ? (\n input.id === firstGrouped ? (\n <CommandResultsRow key={input.id} inputs={lostWithSandbox} onDismiss={onDismiss} />\n ) : null\n ) : (\n <li\n key={input.id}\n className=\"group flex items-start gap-1.5 rounded-og-sm px-1.5 py-1 transition-colors hover:bg-[var(--_og-session-chrome-row-hover)]\"\n >\n <span\n className={cn(\n \"mt-px shrink-0 rounded px-1 py-px text-[10px] font-medium leading-4\",\n input.classification === \"action_required\" || input.classification === \"failure\"\n ? \"bg-og-status-waiting/12 text-og-status-waiting\"\n : \"bg-og-surface-3/80 text-og-fg-muted\",\n )}\n >\n {pendingKindLabel(t, input.kind)}\n </span>\n <div className=\"min-w-0 flex-1\">\n <p className=\"break-words text-og-xs leading-4 text-og-fg\">{input.summary}</p>\n <ChildSessionLink\n kind={input.kind}\n sourceId={input.sourceId}\n onOpenSession={onOpenSession}\n />\n </div>\n {onDismiss ? (\n <div className=\"flex shrink-0 items-center gap-0.5 opacity-0 transition-opacity group-hover:opacity-100 focus-within:opacity-100 max-sm:opacity-100\">\n <IconAction\n label={t(\"sessionChrome.dismissIncomingPendingkindlabel\", {\n pendingKindLabel: pendingKindLabel(t, input.kind),\n })}\n tip=\"Dismiss\"\n onClick={() => onDismiss(input.id)}\n danger\n >\n <Trash2Icon className=\"size-3\" />\n </IconAction>\n </div>\n ) : null}\n </li>\n ),\n )}\n </ul>\n </div>\n );\n}\n\n/** Matches the worker's notice for a command whose sandbox is gone. */\nfunction isLostWithSandboxResult(input: SessionPendingInputPreview): boolean {\n return (\n input.kind === \"background_command_result\" &&\n input.summary.includes(\"is no longer running because its sandbox was shut down or lost\")\n );\n}\n\nfunction commandResultsSummary(t: OpenGeniText, inputs: SessionPendingInputPreview[]): string {\n return t(\"sessionChrome.lengthBackgroundCommandsAreNo\", { length: inputs.length });\n}\n\nfunction CommandResultsRow({\n inputs,\n onDismiss,\n}: {\n inputs: SessionPendingInputPreview[];\n onDismiss?: ((inputId: string) => void) | undefined;\n}) {\n const t = useOpenGeniText();\n return (\n <li\n className=\"group flex items-start gap-1.5 rounded-og-sm px-1.5 py-1 transition-colors hover:bg-[var(--_og-session-chrome-row-hover)]\"\n data-og-session-chrome-command-results={inputs.length}\n >\n <span className=\"mt-px shrink-0 rounded bg-og-status-waiting/12 px-1 py-px text-[10px] font-medium leading-4 text-og-status-waiting\">\n {t(\"sessionChrome.commandResults\")}\n </span>\n <div className=\"min-w-0 flex-1\">\n <p className=\"break-words text-og-xs leading-4 text-og-fg\">\n {commandResultsSummary(t, inputs)}\n </p>\n </div>\n {onDismiss ? (\n <div className=\"flex shrink-0 items-center gap-0.5 opacity-0 transition-opacity group-hover:opacity-100 focus-within:opacity-100 max-sm:opacity-100\">\n <IconAction\n label={t(\"sessionChrome.dismissIncomingCommandResults\")}\n tip={t(\"sessionChrome.dismissAll\")}\n onClick={() => {\n for (const input of inputs) onDismiss(input.id);\n }}\n danger\n >\n <Trash2Icon className=\"size-3\" />\n </IconAction>\n </div>\n ) : null}\n </li>\n );\n}\n\nfunction QueuePanel({\n turns,\n optimistic,\n loadError,\n mutationError,\n onRefresh,\n onClearMutationError,\n onRetryOptimistic,\n onRestoreOptimistic,\n onRemoveOptimistic,\n readOnly,\n mutationFor,\n upRecallTurnId = null,\n replaceDraftFor,\n onCancelReplace,\n onConfirmReplace,\n onEdit,\n onSteer,\n onRemove,\n onMove,\n}: {\n turns: SessionTurn[];\n optimistic: ComposerOptimisticMessage[];\n loadError: Error | null;\n mutationError: Error | null;\n onRefresh: () => Promise<void>;\n onClearMutationError: () => void;\n onRetryOptimistic?: ((clientEventId: string) => void) | undefined;\n onRestoreOptimistic?: ((clientEventId: string) => void) | undefined;\n onRemoveOptimistic?: ((clientEventId: string) => void) | undefined;\n readOnly: boolean;\n mutationFor: UseTurnQueueResult[\"mutationFor\"];\n /** The row Up in an empty composer would pull back. */\n upRecallTurnId?: string | null | undefined;\n replaceDraftFor?: string | null | undefined;\n onCancelReplace?: (() => void) | undefined;\n onConfirmReplace?: (() => void) | undefined;\n onEdit?: ((turn: SessionTurn) => void) | undefined;\n onSteer?: ((turnId: string) => void) | undefined;\n onRemove?: ((turnId: string) => void) | undefined;\n onMove?: ((turnId: string, beforeTurnId: string | null) => void) | undefined;\n}) {\n const t = useOpenGeniText();\n const reduceMotion = useReducedMotion();\n const turnIdsKey = turns.map((turn) => turn.id).join(\",\");\n const [interactiveTurnIds, setInteractiveTurnIds] = useState<ReadonlySet<string>>(\n () => new Set(),\n );\n useEffect(() => {\n const visibleTurnIds = new Set(turnIdsKey ? turnIdsKey.split(\",\") : []);\n setInteractiveTurnIds((current) => {\n const retained = new Set([...current].filter((turnId) => visibleTurnIds.has(turnId)));\n return retained.size === current.size ? current : retained;\n });\n if (visibleTurnIds.size === 0) return;\n // An optimistic queue row and its authoritative replacement have different\n // React identities. Do not expose an actionable control during that short\n // handoff: a pointer can otherwise press the outgoing DOM node and release\n // over its replacement, producing a completed-looking click with no event.\n const timer = setTimeout(\n () => setInteractiveTurnIds((current) => new Set([...current, ...visibleTurnIds])),\n reduceMotion ? 0 : 240,\n );\n return () => clearTimeout(timer);\n }, [reduceMotion, turnIdsKey]);\n return (\n <ol\n className=\"flex flex-col gap-0.5\"\n aria-label={t(\"sessionChrome.queuedPrompts\")}\n data-og-session-chrome-panel=\"queue\"\n >\n {turns.map((turn, index) => {\n const presentation = queuedTurnPresentation(t, turn);\n const voice = presentation.kind !== \"prompt\";\n const pending = mutationFor(turn.id);\n const settling = !interactiveTurnIds.has(turn.id);\n const { beforeUp, beforeDown } = queueNeighborAnchors(turns, index);\n const showActions = !readOnly && (onEdit || onSteer || onRemove || onMove);\n const confirmingReplace = replaceDraftFor === turn.id;\n return (\n <li\n key={turn.id}\n data-queue-turn-id={turn.id}\n tabIndex={-1}\n className=\"group flex flex-col gap-1 rounded-og-sm px-1.5 py-1 transition-colors hover:bg-[var(--_og-session-chrome-row-hover)]\"\n >\n <div className=\"flex items-start gap-1.5\">\n {voice ? (\n <AudioLinesIcon\n aria-hidden=\"true\"\n className=\"mt-0.5 size-3 shrink-0 text-og-accent\"\n />\n ) : (\n <span className=\"mt-px shrink-0 font-og-mono text-[10px] leading-4 text-og-fg-subtle\">\n {index + 1}\n </span>\n )}\n <CompactQueueItemContent\n text={presentation.text}\n annotations={turn.annotations ?? []}\n />\n {showActions ? (\n <div className=\"flex shrink-0 items-center gap-0.5\">\n {/* Reorder, edit and delete stay on hover; Steer is always visible. */}\n <div className=\"flex shrink-0 items-center gap-0.5 opacity-0 transition-opacity group-hover:opacity-100 focus-within:opacity-100 max-sm:opacity-100\">\n {onMove && turns.length > 1 ? (\n <>\n <IconAction\n label={t(\"sessionChrome.moveQueuedPromptIndexUp\", { index: index + 1 })}\n tip={t(\"sessionChrome.moveUp\")}\n disabled={settling || pending !== null || index === 0}\n onClick={() => onMove(turn.id, beforeUp)}\n >\n <ArrowUpIcon className=\"size-3\" />\n </IconAction>\n <IconAction\n label={t(\"sessionChrome.moveQueuedPromptIndexDown\", { index: index + 1 })}\n tip={t(\"sessionChrome.moveDown\")}\n disabled={settling || pending !== null || index >= turns.length - 1}\n onClick={() => onMove(turn.id, beforeDown)}\n >\n <ArrowDownIcon className=\"size-3\" />\n </IconAction>\n </>\n ) : null}\n {onEdit ? (\n <IconAction\n label={t(\"sessionChrome.editQueuedPromptIndex\", { index: index + 1 })}\n tip={upRecallTurnId === turn.id ? <QueueEditUpTip /> : QUEUE_EDIT_TIP(t)}\n disabled={settling || pending !== null}\n onClick={() => onEdit(turn)}\n >\n {pending === \"edit\" ? (\n <Loader2Icon className=\"size-3 animate-og-spin\" />\n ) : (\n <PencilIcon className=\"size-3\" />\n )}\n </IconAction>\n ) : null}\n {onRemove ? (\n <IconAction\n label={t(\"sessionChrome.removeQueuedPromptIndex\", { index: index + 1 })}\n tip={QUEUE_DELETE_TIP(t)}\n disabled={settling || pending !== null}\n onClick={() => onRemove(turn.id)}\n danger\n >\n {pending === \"delete\" ? (\n <Loader2Icon className=\"size-3 animate-og-spin\" />\n ) : (\n <Trash2Icon className=\"size-3\" />\n )}\n </IconAction>\n ) : null}\n </div>\n {onSteer ? (\n <IconAction\n label={t(\"sessionChrome.steerQueuedPromptIndex\", { index: index + 1 })}\n analyticsAction=\"steer\"\n text={t(\"sessionChrome.steer\")}\n tip={<QueueSteerTip />}\n disabled={settling || pending !== null}\n onClick={() => onSteer(turn.id)}\n >\n {pending === \"steer\" ? (\n <Loader2Icon className=\"size-3 animate-og-spin\" />\n ) : (\n <CornerDownRightIcon className=\"size-3\" />\n )}\n </IconAction>\n ) : null}\n </div>\n ) : null}\n </div>\n {confirmingReplace ? (\n <div className=\"rounded-og-sm border border-og-status-waiting/30 bg-og-status-waiting/10 p-2 text-og-xs text-og-fg\">\n <p>{QUEUE_REPLACE_DRAFT_COPY(t).title}</p>\n <p className=\"mt-0.5 text-og-fg-muted\">{QUEUE_REPLACE_DRAFT_COPY(t).detail}</p>\n <div className=\"mt-2 flex justify-end gap-1.5\">\n <button\n type=\"button\"\n className=\"rounded-og-sm px-2 py-1 font-medium hover:bg-og-surface-3/70 focus-visible:ring-2 focus-visible:ring-og-accent/40\"\n onClick={onCancelReplace}\n >\n {QUEUE_REPLACE_DRAFT_COPY(t).keep}\n </button>\n <button\n type=\"button\"\n className=\"rounded-og-sm border border-og-primary-border bg-og-primary text-og-primary-fg px-2 py-1 font-medium hover:bg-og-primary-hover focus-visible:ring-2 focus-visible:ring-og-accent/40\"\n onClick={onConfirmReplace}\n >\n {QUEUE_REPLACE_DRAFT_COPY(t).replace}\n </button>\n </div>\n </div>\n ) : null}\n </li>\n );\n })}\n <AnimatePresence initial={false}>\n {optimistic.map((message, index) => (\n <motion.li\n key={message.clientEventId}\n aria-live=\"polite\"\n data-optimistic-queue-message={message.clientEventId}\n initial={reduceMotion ? false : { opacity: 0 }}\n animate={{ opacity: 1 }}\n transition={{ duration: reduceMotion ? 0 : 0.12, ease: [0.22, 1, 0.36, 1] }}\n className={cn(\n \"flex min-h-6 items-center gap-1.5 rounded-og-sm px-1.5 py-1\",\n message.state === \"failed\" ? \"bg-og-danger/8 text-og-danger\" : \"bg-og-accent-soft/45\",\n )}\n >\n <span className=\"shrink-0 font-og-mono text-[10px] leading-4 text-og-fg-subtle\">\n {turns.length + index + 1}\n </span>\n <div className=\"min-w-0 flex-1\">\n <CompactQueueItemContent text={message.text} annotations={message.annotations} />\n {message.state === \"failed\" && message.error ? (\n <p className=\"break-words text-og-xs\">{message.error}</p>\n ) : null}\n </div>\n <span className=\"sr-only\">\n {message.state === \"failed\"\n ? message.outcomeUnknown\n ? t(\"sessionChrome.notConfirmed\")\n : t(\"sessionChrome.messageNotSent\")\n : message.state === \"sending\"\n ? t(\"sessionChrome.placingInQueue\")\n : t(\"sessionChrome.queued\")}\n </span>\n {message.state === \"failed\" ? (\n <div className=\"flex shrink-0 items-center gap-1 text-[10px]\">\n {message.retryable !== false && onRetryOptimistic ? (\n <button\n type=\"button\"\n className=\"rounded-og-sm px-1.5 py-1 font-medium hover:bg-og-surface-2 pointer-coarse:min-h-11 pointer-coarse:min-w-11\"\n onClick={() => onRetryOptimistic(message.clientEventId)}\n >\n {t(\"sessionChrome.retry\")}\n </button>\n ) : null}\n {message.retryable === false && onRestoreOptimistic ? (\n <button\n type=\"button\"\n className=\"rounded-og-sm px-1.5 py-1 font-medium hover:bg-og-surface-2 pointer-coarse:min-h-11 pointer-coarse:min-w-11\"\n onClick={() => onRestoreOptimistic(message.clientEventId)}\n >\n {t(\"sessionChrome.editMessage\")}\n </button>\n ) : null}\n {onRemoveOptimistic ? (\n <button\n type=\"button\"\n aria-label={t(\"sessionChrome.dismissUnconfirmedQueuedPrompt\")}\n className=\"rounded-og-sm p-1 text-og-fg-muted hover:bg-og-surface-2 hover:text-og-fg pointer-coarse:min-h-11 pointer-coarse:min-w-11\"\n onClick={() => onRemoveOptimistic(message.clientEventId)}\n >\n <XIcon className=\"size-3\" />\n </button>\n ) : null}\n </div>\n ) : message.state === \"sending\" ? (\n <Loader2Icon\n aria-hidden=\"true\"\n className=\"size-3 shrink-0 animate-og-spin text-og-accent motion-reduce:animate-none\"\n />\n ) : (\n <CheckIcon aria-hidden=\"true\" className=\"size-3 shrink-0 text-og-accent\" />\n )}\n </motion.li>\n ))}\n </AnimatePresence>\n {loadError ? (\n <li\n role=\"alert\"\n className=\"flex items-center gap-1.5 rounded-og-sm bg-og-danger/8 px-1.5 py-1 text-og-xs text-og-danger\"\n >\n <TriangleAlertIcon className=\"size-3 shrink-0\" />\n <span className=\"min-w-0 flex-1\">{t(\"sessionChrome.queueUnavailable\")}</span>\n <button\n type=\"button\"\n className=\"rounded-og-sm px-1.5 py-1 font-medium hover:bg-og-surface-2 pointer-coarse:min-h-11 pointer-coarse:min-w-11\"\n onClick={() => void onRefresh()}\n >\n {t(\"sessionChrome.retry\")}\n </button>\n </li>\n ) : null}\n {mutationError ? (\n <li\n role=\"alert\"\n className=\"flex items-center gap-1.5 rounded-og-sm bg-og-danger/8 px-1.5 py-1 text-og-xs text-og-danger\"\n >\n <TriangleAlertIcon className=\"size-3 shrink-0\" />\n <span className=\"min-w-0 flex-1\">{t(\"sessionChrome.notConfirmedCheckTheQueue\")}</span>\n <button\n type=\"button\"\n className=\"rounded-og-sm px-1.5 py-1 font-medium hover:bg-og-surface-2 pointer-coarse:min-h-11 pointer-coarse:min-w-11\"\n onClick={onClearMutationError}\n >\n {t(\"sessionChrome.dismiss\")}\n </button>\n </li>\n ) : null}\n </ol>\n );\n}\n\nfunction CompactQueueItemContent({\n text,\n annotations,\n}: {\n text: string;\n annotations: readonly TimelineAnnotationLike[];\n}) {\n const t = useOpenGeniText();\n const content = queueItemContent(text, annotations.length);\n return (\n <div className=\"flex min-w-0 flex-1 items-center gap-1.5\">\n {content === \"text\" ? (\n <p className=\"min-w-0 flex-1 truncate text-og-xs leading-4 text-og-fg\">{text}</p>\n ) : content === \"unavailable\" ? (\n <p className=\"min-w-0 flex-1 truncate text-og-xs leading-4 text-og-fg-muted italic\">\n {QUEUE_ITEM_CONTENT_UNAVAILABLE(t)}\n </p>\n ) : null}\n {annotations.length > 0 ? (\n <TimelineAnnotationsChip annotations={annotations} className=\"shrink-0\" compact />\n ) : null}\n </div>\n );\n}\n\nfunction WaitPanel({ view }: { view: SessionChromeWaitPresentation }) {\n const t = useOpenGeniText();\n return (\n <div className=\"space-y-1\" data-og-session-chrome-panel=\"wait\">\n <p className=\"text-og-sm leading-5 text-og-fg\">{view.headline}</p>\n <p className=\"text-og-xs leading-4 text-og-fg-muted\">{view.detail}</p>\n {view.verboseReason ? (\n <details className=\"text-og-xs text-og-fg-muted\">\n <summary className=\"cursor-pointer\">{t(\"sessionChrome.waitDetails\")}</summary>\n <p className=\"mt-1 max-h-32 overflow-y-auto whitespace-pre-wrap break-words\">\n {view.verboseReason}\n </p>\n </details>\n ) : null}\n </div>\n );\n}\n\nfunction GoalPanel({\n goal,\n state,\n elapsed,\n readOnly,\n}: {\n goal: UseGoalResult;\n state: GoalPillState;\n elapsed: string | null;\n readOnly: boolean;\n}) {\n const t = useOpenGeniText();\n const formatError = useErrorMessage();\n const record = goal.goal;\n if (!record) return null;\n const canToggle = !readOnly && (record.status === \"active\" || record.status === \"paused\");\n const explanation = sessionChromeGoalPillExplanation(t, state, record);\n\n return (\n <div className=\"space-y-1.5\" data-og-session-chrome-panel=\"goal\">\n <div className=\"flex flex-wrap items-center gap-1.5 text-[10px] font-medium uppercase tracking-wider text-og-fg-subtle\">\n <span>{sessionChromeGoalPillLabel(t, state, record)}</span>\n {elapsed ? (\n <span className=\"tabular-nums normal-case tracking-normal text-og-fg-muted\">\n {t(\"sessionChrome.createdElapsedAgo\", { elapsed })}\n </span>\n ) : null}\n <span className=\"normal-case tracking-normal text-og-fg-muted\">· v{record.version}</span>\n </div>\n <p className=\"text-og-sm leading-5 text-og-fg\">{record.text}</p>\n {record.successCriteria ? (\n <p className=\"text-og-xs leading-4 text-og-fg-muted\">\n <span className=\"font-medium text-og-fg\">{t(\"sessionChrome.doneWhen\")}</span>{\" \"}\n {record.successCriteria}\n </p>\n ) : null}\n {explanation ? (\n <p\n data-og-session-chrome-goal-explanation\n className=\"text-og-xs leading-4 text-og-fg-muted\"\n >\n {explanation}\n </p>\n ) : null}\n {record.continuation?.lastError ? (\n <p className=\"rounded-og-sm bg-og-status-waiting/10 px-1.5 py-1 text-og-xs leading-4 text-og-status-waiting\">\n {formatError(record.continuation.lastError)}\n </p>\n ) : null}\n <div className=\"flex flex-wrap items-center justify-between gap-1.5 pt-0.5\">\n <div className=\"flex flex-wrap gap-1 text-[10px] text-og-fg-muted\">\n <span className=\"rounded bg-og-surface-3/70 px-1 py-px\">\n {t(\"sessionChrome.autocontinuationsConsecutiveUnattendedContinues\", {\n autoContinuations: record.autoContinuations,\n })}\n </span>\n <span className=\"rounded bg-og-surface-3/70 px-1 py-px\">\n {t(\"sessionChrome.noprogressstreakStalled\", {\n noProgressStreak: record.noProgressStreak,\n })}\n </span>\n </div>\n {!readOnly ? (\n <div className=\"flex items-center gap-0.5\">\n {canToggle ? (\n <button\n type=\"button\"\n disabled={goal.updating}\n aria-label={\n record.status === \"paused\"\n ? t(\"sessionChrome.resumeGoal\")\n : t(\"sessionChrome.pauseGoal\")\n }\n onClick={() =>\n void (record.status === \"paused\"\n ? goal.resume()\n : goal.pause(\"Paused from session chrome\"))\n }\n className=\"inline-flex h-6 items-center gap-1 rounded-og-sm px-1.5 text-og-xs font-medium text-og-fg-muted outline-hidden pointer-coarse:h-9 transition-colors hover:bg-og-surface-3/70 hover:text-og-fg focus-visible:ring-2 focus-visible:ring-og-accent/40 disabled:opacity-50\"\n >\n {goal.updating ? (\n <Loader2Icon className=\"size-3 animate-og-spin\" />\n ) : record.status === \"paused\" ? (\n <PlayIcon className=\"size-3\" />\n ) : (\n <PauseIcon className=\"size-3\" />\n )}\n {record.status === \"paused\" ? t(\"sessionChrome.resume\") : t(\"sessionChrome.pause\")}\n </button>\n ) : null}\n <button\n type=\"button\"\n disabled={goal.updating}\n aria-label={t(\"sessionChrome.clearGoal\")}\n onClick={() => void goal.deleteGoal()}\n className=\"inline-flex h-6 items-center gap-1 rounded-og-sm px-1.5 text-og-xs font-medium text-og-fg-subtle outline-hidden pointer-coarse:h-9 transition-colors hover:bg-og-surface-3/70 hover:text-og-danger focus-visible:ring-2 focus-visible:ring-og-accent/40 disabled:opacity-50\"\n >\n <Trash2Icon className=\"size-3\" />\n {t(\"sessionChrome.clear\")}\n </button>\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n\nfunction QueueSteerTip() {\n const t = useOpenGeniText();\n return (\n <span className=\"flex flex-col gap-0.5 text-left\">\n <span className=\"font-medium\">{t(\"sessionChrome.steer\")}</span>\n <span className=\"opacity-80\">{t(\"sessionChrome.steerTip\")}</span>\n </span>\n );\n}\nconst QUEUE_EDIT_TIP = (t: OpenGeniText) => t(\"sessionChrome.editInComposer\");\n/** The row Up would recall: same tip plus the key, muted. */\nfunction QueueEditUpTip() {\n const t = useOpenGeniText();\n return (\n <span className=\"inline-flex items-center gap-1.5\" data-testid=\"session-chrome-queue-up-hint\">\n {QUEUE_EDIT_TIP(t)}\n <kbd aria-label={t(\"sessionChrome.upArrowKey\")} className=\"font-sans opacity-60\">\n ↑\n </kbd>\n </span>\n );\n}\nconst QUEUE_DELETE_TIP = (t: OpenGeniText) => t(\"sessionChrome.deleteThisQueuedPrompt\");\n\nfunction IconAction({\n text,\n label,\n analyticsAction,\n tip,\n onClick,\n disabled,\n danger,\n children,\n}: {\n label: string;\n /** Stable, content-free control label a host's product analytics may read. */\n analyticsAction?: \"steer\";\n text?: string;\n tip: ReactNode;\n onClick: () => void;\n disabled?: boolean;\n danger?: boolean;\n children: ReactNode;\n}) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label={label}\n data-analytics-action={analyticsAction}\n disabled={disabled}\n onClick={onClick}\n className={cn(\n \"inline-flex size-6 items-center justify-center rounded-og-sm outline-hidden transition-colors\",\n \"hover:bg-og-surface-2 hover:text-og-fg focus-visible:ring-2 focus-visible:ring-og-accent/40\",\n \"disabled:pointer-events-none disabled:opacity-40 pointer-coarse:size-9\",\n text ? \"text-og-fg\" : \"text-og-fg-subtle\",\n text && \"w-auto gap-1 px-1.5 text-og-xs pointer-coarse:w-auto\",\n danger && \"hover:text-og-danger\",\n )}\n >\n {children}\n {text}\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">{tip}</TooltipContent>\n </Tooltip>\n );\n}\n","import { useId, useMemo, useState, type FormEvent, type ReactNode } from \"react\";\nimport { LoaderCircleIcon, MessageCircleQuestionIcon } from \"lucide-react\";\nimport {\n mcpElicitationKind,\n mcpElicitationChoices,\n mcpElicitationDefaults,\n type McpElicitationApprovalRequest,\n type McpElicitationContent,\n type McpElicitationField,\n type McpElicitationValue,\n} from \"@opengeni/contracts/mcp-elicitation-model\";\nimport { cn } from \"../lib/cn\";\nimport { useOpenGeniText } from \"../messages/runtime\";\nimport { DecisionActions, DecisionButton } from \"./decision-card\";\nimport { DeclineButton, ToolReviewFrame } from \"./tool-action-review\";\n\n/** More choices than this become a drop-down instead of a list. */\nconst LISTED_CHOICES = 6;\n\ntype Draft = Record<string, Record<string, McpElicitationValue | undefined>>;\n\nconst inputClass =\n \"w-full rounded-og-md border border-og-border bg-og-surface-1 px-3 py-2 text-og-sm text-og-fg outline-hidden placeholder:text-og-fg-subtle focus:border-og-accent disabled:opacity-60 aria-[invalid=true]:border-og-status-failed\";\n\n/**\n * An MCP server's question in the middle of a tool call, answered in place:\n * its message, its form (prefilled with the server's defaults), and Decline.\n * A question with no fields is a plain confirmation answered with Allow.\n */\nexport function McpElicitationRequest({\n elicitation,\n title,\n subtitle,\n submitting,\n disabled,\n onAnswer,\n onDecline,\n details,\n}: {\n elicitation: McpElicitationApprovalRequest;\n /** What the paused call does, e.g. \"Send message\". */\n title: ReactNode;\n subtitle?: ReactNode;\n submitting: \"approve\" | \"reject\" | null;\n disabled: boolean;\n onAnswer: (content: McpElicitationContent) => void;\n onDecline: () => void;\n /** A link to the paused call's full arguments. */\n details?: ReactNode;\n}) {\n const t = useOpenGeniText();\n const formId = useId();\n const titleId = useId();\n const [draft, setDraft] = useState<Draft>(() =>\n Object.fromEntries(\n elicitation.requests.map((request) => [\n request.id,\n mcpElicitationDefaults(request.requestedSchema),\n ]),\n ),\n );\n const kind = mcpElicitationKind(elicitation);\n const busy = disabled || submitting !== null;\n const submit = (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n if (busy || !event.currentTarget.reportValidity()) return;\n onAnswer(answerContent(elicitation, draft));\n };\n return (\n <ToolReviewFrame\n tone=\"waiting\"\n icon={\n submitting ? (\n <LoaderCircleIcon className=\"size-4 animate-spin\" aria-hidden=\"true\" />\n ) : (\n <MessageCircleQuestionIcon className=\"size-4\" aria-hidden=\"true\" />\n )\n }\n eyebrow={\n submitting === \"approve\"\n ? kind === \"form\"\n ? t(\"approvalSurface.sendingAnswer\")\n : t(\"approvalSurface.approving\")\n : submitting === \"reject\"\n ? t(\"approvalSurface.declining\")\n : t(\"approvalSurface.serverAsks\", { server: elicitation.server })\n }\n title={title}\n titleId={titleId}\n subtitle={subtitle}\n aria-busy={submitting !== null}\n data-og-mcp-elicitation=\"\"\n footer={\n // The same actions row as every approval card: stacked full width on a\n // narrow card with the answer on top, one line at the end otherwise.\n <DecisionActions lead={details}>\n <DeclineButton\n busy={busy}\n submitting={submitting === \"reject\"}\n label={t(\"approvalSurface.decline\")}\n onClick={onDecline}\n />\n <DecisionButton\n kind=\"primary\"\n type=\"submit\"\n form={formId}\n disabled={busy}\n busy={submitting === \"approve\"}\n >\n {kind === \"form\" ? t(\"approvalSurface.sendAnswer\") : t(\"approvalSurface.allow\")}\n </DecisionButton>\n </DecisionActions>\n }\n >\n <form id={formId} onSubmit={submit} aria-labelledby={titleId} className=\"space-y-4\">\n {elicitation.requests.map((request) => (\n // mx-0 resets the browser's fieldset margin and leaves the vertical rhythm to space-y.\n <fieldset\n key={request.id}\n disabled={busy}\n className=\"mx-0 min-w-0 space-y-5 border-0 p-0\"\n >\n {request.message ? (\n <legend className=\"mb-4 whitespace-pre-wrap p-0 text-og-sm leading-relaxed text-og-fg [overflow-wrap:anywhere] last:mb-0\">\n {request.message}\n </legend>\n ) : null}\n {Object.entries(request.requestedSchema.properties).map(([name, field]) => (\n <ElicitationField\n key={name}\n id={`${formId}-${request.id}-${name}`}\n name={name}\n field={field}\n required={(request.requestedSchema.required ?? []).includes(name)}\n value={draft[request.id]?.[name]}\n onChange={(value) =>\n setDraft((current) => ({\n ...current,\n [request.id]: { ...current[request.id], [name]: value },\n }))\n }\n />\n ))}\n </fieldset>\n ))}\n </form>\n </ToolReviewFrame>\n );\n}\n\n/** What the person entered, without fields they left empty. */\nfunction answerContent(\n elicitation: McpElicitationApprovalRequest,\n draft: Draft,\n): McpElicitationContent {\n const content: McpElicitationContent = {};\n for (const request of elicitation.requests) {\n const values: Record<string, McpElicitationValue> = {};\n for (const [name, value] of Object.entries(draft[request.id] ?? {})) {\n if (value === undefined || value === \"\") continue;\n const field = request.requestedSchema.properties[name];\n values[name] =\n field?.type === \"string\" && \"format\" in field && field.format === \"date-time\"\n ? new Date(value as string).toISOString()\n : value;\n }\n content[request.id] = values;\n }\n return content;\n}\n\nfunction ElicitationField({\n id,\n name,\n field,\n required,\n value,\n onChange,\n}: {\n id: string;\n name: string;\n field: McpElicitationField;\n required: boolean;\n value: McpElicitationValue | undefined;\n onChange: (value: McpElicitationValue | undefined) => void;\n}) {\n const t = useOpenGeniText();\n const label = field.title ?? name;\n const helpId = `${id}-help`;\n const describedBy = field.description ? helpId : undefined;\n const choices = useMemo(() => mcpElicitationChoices(field), [field]);\n const heading = (\n <span className=\"flex flex-wrap items-baseline gap-x-1.5\">\n <span className=\"min-w-0 text-og-sm font-medium text-og-fg [overflow-wrap:anywhere]\">\n {label}\n </span>\n {required ? null : (\n <span className=\"text-og-xs text-og-fg-subtle\">{t(\"approvalSurface.optional\")}</span>\n )}\n </span>\n );\n const help = field.description ? (\n <p id={helpId} className=\"m-0 text-og-xs text-og-fg-muted [overflow-wrap:anywhere]\">\n {field.description}\n </p>\n ) : null;\n if (field.type === \"boolean\") {\n return (\n <div className=\"space-y-1\">\n <label htmlFor={id} className=\"flex cursor-pointer items-start gap-2.5\">\n <input\n id={id}\n type=\"checkbox\"\n checked={value === true}\n aria-describedby={describedBy}\n onChange={(event) => onChange(event.target.checked)}\n className=\"mt-0.5 accent-og-accent\"\n />\n {heading}\n </label>\n {help}\n </div>\n );\n }\n if (choices && (field.type === \"array\" || choices.length <= LISTED_CHOICES)) {\n const multiple = field.type === \"array\";\n const selected = multiple ? ((value as string[] | undefined) ?? []) : [value];\n return (\n <fieldset className=\"mx-0 min-w-0 space-y-1 border-0 p-0\" aria-describedby={describedBy}>\n <legend className=\"mb-1 p-0\">{heading}</legend>\n {help}\n {/* Rows bleed into the gutter so each control lines up with the labels. */}\n <div className=\"-mx-2.5 flex flex-col\">\n {choices.map((choice, index) => {\n const checked = selected.includes(choice.value);\n return (\n <label\n key={choice.value}\n className={cn(\n \"flex cursor-pointer items-start gap-2.5 rounded-og-md px-2.5 py-1.5 transition-colors [@media(pointer:coarse)]:py-2.5\",\n checked ? \"bg-og-status-waiting/12\" : \"hover:bg-og-surface-1/80\",\n )}\n >\n <input\n type={multiple ? \"checkbox\" : \"radio\"}\n name={id}\n value={choice.value}\n checked={checked}\n required={!multiple && required && index === 0}\n onChange={(event) => {\n if (!multiple) return onChange(choice.value);\n const current = (value as string[] | undefined) ?? [];\n onChange(\n event.target.checked\n ? [...current, choice.value]\n : current.filter((item) => item !== choice.value),\n );\n }}\n className=\"mt-0.5 accent-og-accent\"\n />\n <span className=\"min-w-0 text-og-sm text-og-fg [overflow-wrap:anywhere]\">\n {choice.label}\n </span>\n </label>\n );\n })}\n </div>\n </fieldset>\n );\n }\n const control = choices ? (\n <select\n id={id}\n value={(value as string | undefined) ?? \"\"}\n required={required}\n aria-describedby={describedBy}\n onChange={(event) => onChange(event.target.value || undefined)}\n className={cn(inputClass, \"max-w-sm\")}\n >\n <option value=\"\" disabled={required}>\n {t(\"approvalSurface.choose\")}\n </option>\n {choices.map((choice) => (\n <option key={choice.value} value={choice.value}>\n {choice.label}\n </option>\n ))}\n </select>\n ) : field.type === \"number\" || field.type === \"integer\" ? (\n <input\n id={id}\n type=\"number\"\n inputMode={field.type === \"integer\" ? \"numeric\" : \"decimal\"}\n step={field.type === \"integer\" ? 1 : \"any\"}\n min={field.minimum}\n max={field.maximum}\n required={required}\n value={typeof value === \"number\" ? value : \"\"}\n aria-describedby={describedBy}\n onChange={(event) =>\n // A number input's value is a valid number or empty.\n onChange(event.target.value === \"\" ? undefined : Number(event.target.value))\n }\n className={cn(inputClass, \"max-w-40\")}\n />\n ) : (\n <TextControl\n id={id}\n field={field as Extract<McpElicitationField, { minLength?: number }>}\n required={required}\n value={typeof value === \"string\" ? value : \"\"}\n describedBy={describedBy}\n onChange={onChange}\n />\n );\n return (\n <div className=\"space-y-1\">\n <label htmlFor={id} className=\"block\">\n {heading}\n </label>\n {help}\n {control}\n </div>\n );\n}\n\nfunction TextControl({\n id,\n field,\n required,\n value,\n describedBy,\n onChange,\n}: {\n id: string;\n field: { minLength?: number; maxLength?: number; format?: string };\n required: boolean;\n value: string;\n describedBy: string | undefined;\n onChange: (value: string | undefined) => void;\n}) {\n const shared = {\n id,\n required,\n minLength: field.minLength,\n maxLength: field.maxLength,\n \"aria-describedby\": describedBy,\n className: inputClass,\n };\n if (field.format === \"date-time\") {\n return (\n <input\n {...shared}\n type=\"datetime-local\"\n value={localDateTime(value)}\n onChange={(event) => onChange(event.target.value || undefined)}\n className={cn(inputClass, \"max-w-64\")}\n />\n );\n }\n if (field.format) {\n const type = field.format === \"uri\" ? \"url\" : field.format;\n return (\n <input\n {...shared}\n type={type}\n value={value}\n onChange={(event) => onChange(event.target.value || undefined)}\n {...(type === \"date\" ? { className: cn(inputClass, \"max-w-56\") } : {})}\n />\n );\n }\n // A short answer is one line; anything that may run long can wrap.\n return field.maxLength !== undefined && field.maxLength <= 200 ? (\n <input\n {...shared}\n type=\"text\"\n value={value}\n onChange={(event) => onChange(event.target.value || undefined)}\n />\n ) : (\n <textarea\n {...shared}\n rows={2}\n value={value}\n onChange={(event) => onChange(event.target.value || undefined)}\n className={cn(inputClass, \"min-h-14 resize-y\")}\n />\n );\n}\n\n/** An RFC 3339 default shown in the person's own time, as the picker needs. */\nfunction localDateTime(value: string): string {\n if (!value || /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$/u.test(value)) return value;\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return \"\";\n const pad = (part: number) => String(part).padStart(2, \"0\");\n return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}T${pad(date.getHours())}:${pad(date.getMinutes())}`;\n}\n","import { useCallback, useEffect, useMemo, useRef, useState, type ReactNode } from \"react\";\nimport { dequal } from \"dequal\";\nimport { ChevronLeftIcon, ChevronRightIcon, ShieldCheckIcon } from \"lucide-react\";\nimport { OpenGeniApiError, toolReviewDetails, type ToolActionReview } from \"@opengeni/sdk\";\nimport type { PendingApproval } from \"../approvals\";\nimport { cn } from \"../lib/cn\";\nimport { useErrorMessage } from \"../lib/error-message\";\nimport {\n approvalAnswerLabels,\n approvalToolName,\n formatApprovalToolName,\n pendingApprovalReview,\n} from \"../approval-review-model\";\nimport {\n ToolActionReviewCard,\n ToolActionReviewDetails,\n ToolReviewFrame,\n DeclineButton,\n UNRECOVERABLE_TEXT,\n type ToolReviewDetailsLoader,\n} from \"./tool-action-review\";\nimport { DecisionActions } from \"./decision-card\";\nimport { useOpenGeniText, type OpenGeniText } from \"../messages/runtime\";\nimport { McpElicitationRequest } from \"./mcp-elicitation-request\";\nimport type {\n McpElicitationAnswer,\n McpElicitationContent,\n} from \"@opengeni/contracts/mcp-elicitation-model\";\n\nexport type ApprovalSurfaceMessages = {\n title: string;\n description: string;\n approve: string;\n reject: string;\n approving: string;\n rejecting: string;\n formatToolName: (name: string) => string;\n showDetails?: string | undefined;\n hideDetails?: string | undefined;\n};\nexport const defaultApprovalSurfaceMessages = (t: OpenGeniText): ApprovalSurfaceMessages => ({\n title: t(\"approvalSurface.approvalNeeded\"),\n description: t(\"approvalSurface.reviewTheActionBeforeIt\"),\n approve: t(\"approvalSurface.approveAction\"),\n reject: t(\"approvalSurface.decline\"),\n approving: t(\"approvalSurface.approving\"),\n rejecting: t(\"approvalSurface.declining\"),\n formatToolName: (name) => formatApprovalToolName(t, name),\n showDetails: t(\"approvalSurface.viewFullDetails\"),\n hideDetails: t(\"approvalSurface.backToReview\"),\n});\nexport type ApprovalSurfaceProps = {\n approvals: PendingApproval[];\n /**\n * `answer` is present when the approval answers its MCP server's questions\n * (`approval.elicitation`); send it with the decision.\n */\n onApprove: (approval: PendingApproval, answer?: McpElicitationAnswer) => void | Promise<void>;\n onReject: (approval: PendingApproval) => void | Promise<void>;\n responding?: boolean | undefined;\n error?: string | Error | null | undefined;\n messages?: Partial<ApprovalSurfaceMessages> | undefined;\n renderApproval?: ((approval: PendingApproval) => ReactNode) | undefined;\n /** Authenticated server facts; hosts need not import any web-app code. */\n loadReview?: ((approval: PendingApproval) => Promise<ToolActionReview>) | undefined;\n loadDetails?: ToolReviewDetailsLoader | undefined;\n onViewDetails?: ((review: ToolActionReview, path: string) => void) | undefined;\n selectedApprovalId?: string | null | undefined;\n onSelectedApprovalChange?: ((id: string) => void) | undefined;\n className?: string | undefined;\n};\nexport type ApprovalField = { key: string; label: string; value: string };\n\n/** Hosts provide decisions; this surface never mutates the approved payload. */\nexport function ApprovalSurface({\n approvals,\n onApprove,\n onReject,\n responding,\n error,\n messages: overrides,\n renderApproval,\n loadReview,\n loadDetails,\n onViewDetails,\n selectedApprovalId,\n onSelectedApprovalChange,\n className,\n}: ApprovalSurfaceProps) {\n const t = useOpenGeniText();\n const messages = { ...defaultApprovalSurfaceMessages(t), ...overrides };\n const formatError = useErrorMessage();\n const [pending, setPending] = useState<{\n id: string;\n decision: \"approve\" | \"reject\";\n } | null>(null);\n const pendingRef = useRef<string | null>(null);\n const [decisionError, setDecisionError] = useState<{ cause: unknown } | null>(null);\n const [localSelectedId, setLocalSelectedId] = useState<string | null>(null);\n const selectedId = selectedApprovalId === undefined ? localSelectedId : selectedApprovalId;\n const setSelectedId = (id: string) => {\n setLocalSelectedId(id);\n onSelectedApprovalChange?.(id);\n };\n const surface = useRef<HTMLElement>(null);\n useEffect(() => {\n if (pending && !approvals.some((approval) => approval.id === pending.id)) {\n pendingRef.current = null;\n setPending(null);\n requestAnimationFrame(() => surface.current?.querySelector<HTMLElement>(\"h3\")?.focus());\n }\n }, [approvals, pending]);\n if (!approvals.length) return null;\n const selectedIndex = Math.max(\n 0,\n approvals.findIndex((approval) => approval.id === selectedId),\n );\n const selected = approvals[selectedIndex]!;\n const decide = async (\n approval: PendingApproval,\n decision: \"approve\" | \"reject\",\n answer?: McpElicitationAnswer,\n ) => {\n if (responding || pendingRef.current) return;\n pendingRef.current = approval.id;\n setPending({ id: approval.id, decision });\n setDecisionError(null);\n try {\n await (decision === \"approve\"\n ? answer\n ? onApprove(approval, answer)\n : onApprove(approval)\n : onReject(approval));\n } catch (cause) {\n if (pendingRef.current === approval.id) {\n pendingRef.current = null;\n setPending(null);\n setDecisionError({ cause });\n }\n }\n };\n const errorText = decisionError\n ? formatError(decisionError.cause)\n : error instanceof Error\n ? formatError(error)\n : error;\n return (\n <section\n ref={surface}\n aria-label={messages.title}\n className={cn(\"og-root box-border w-full min-w-0 space-y-2 py-2\", className)}\n data-og-approval-surface=\"\"\n >\n {approvals.length > 1 && (\n <nav\n aria-label={t(\"approvalSurface.actionsToReview\")}\n className=\"flex flex-wrap items-center justify-between gap-x-3 gap-y-1 px-1 text-og-xs text-og-fg-muted\"\n >\n <span className=\"inline-flex items-center gap-1.5 font-medium text-og-fg\">\n <span aria-hidden=\"true\" className=\"size-1.5 rounded-full bg-og-status-waiting\" />\n {t(\"approvalSurface.lengthActionsAreWaitingFor\", { length: approvals.length })}\n </span>\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n aria-label={t(\"approvalSurface.previousAction\")}\n disabled={selectedIndex === 0}\n onClick={() => setSelectedId(approvals[selectedIndex - 1]!.id)}\n className=\"inline-flex min-h-8 min-w-8 items-center justify-center rounded-og-md hover:bg-og-hover hover:text-og-fg disabled:opacity-40 disabled:hover:bg-transparent [@media(pointer:coarse)]:min-h-11 [@media(pointer:coarse)]:min-w-11 focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent/40\"\n >\n <ChevronLeftIcon className=\"size-4\" aria-hidden=\"true\" />\n </button>\n <span className=\"tabular-nums\" aria-live=\"polite\">\n {selectedIndex + 1} {t(\"approvalSurface.ofLength\", { length: approvals.length })}\n </span>\n <button\n type=\"button\"\n aria-label={t(\"approvalSurface.nextAction\")}\n disabled={selectedIndex === approvals.length - 1}\n onClick={() => setSelectedId(approvals[selectedIndex + 1]!.id)}\n className=\"inline-flex min-h-8 min-w-8 items-center justify-center rounded-og-md hover:bg-og-hover hover:text-og-fg disabled:opacity-40 disabled:hover:bg-transparent [@media(pointer:coarse)]:min-h-11 [@media(pointer:coarse)]:min-w-11 focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent/40\"\n >\n <ChevronRightIcon className=\"size-4\" aria-hidden=\"true\" />\n </button>\n </div>\n </nav>\n )}\n <div>\n {[selected].map((approval) => (\n <ApprovalRequest\n key={approval.id}\n approval={approval}\n loadReview={loadReview}\n loadDetails={loadDetails}\n messages={messages}\n custom={renderApproval?.(approval)}\n onViewDetails={onViewDetails}\n submitting={pending?.id === approval.id ? pending.decision : null}\n disabled={Boolean(responding || pending)}\n onApprove={() => void decide(approval, \"approve\")}\n onAnswer={(content) =>\n approval.elicitation\n ? void decide(approval, \"approve\", {\n content,\n elicitationRound: approval.elicitation.round,\n })\n : undefined\n }\n onReject={() => void decide(approval, \"reject\")}\n />\n ))}\n </div>\n {errorText && (\n <p role=\"alert\" className=\"m-0 px-1 text-og-sm text-og-status-failed\">\n {errorText}\n </p>\n )}\n </section>\n );\n}\n\nfunction ApprovalRequest({\n approval,\n loadReview,\n loadDetails,\n messages,\n custom,\n onViewDetails,\n onAnswer,\n ...actions\n}: {\n approval: PendingApproval;\n loadReview: ApprovalSurfaceProps[\"loadReview\"];\n messages: ApprovalSurfaceMessages;\n loadDetails: ToolReviewDetailsLoader | undefined;\n custom: ReactNode;\n onViewDetails: ApprovalSurfaceProps[\"onViewDetails\"];\n submitting: \"approve\" | \"reject\" | null;\n disabled: boolean;\n onApprove: () => void;\n onAnswer: (content: McpElicitationContent) => void;\n onReject: () => void;\n}) {\n const t = useOpenGeniText();\n const [retry, setRetry] = useState(0);\n // A server's question is answered from the approval itself; there is no\n // saved review of a call that has already started.\n const reviewLoader = approval.elicitation ? undefined : loadReview;\n // Event projection recreates the same approval on unrelated timeline updates.\n // Keep one request for equal facts, but never reuse it across changed facts,\n // an explicit retry, or a loader change (the host's client/access boundary).\n const requestRef = useRef({ approval, loadReview: reviewLoader, retry });\n if (\n requestRef.current.loadReview !== reviewLoader ||\n requestRef.current.retry !== retry ||\n !dequal(requestRef.current.approval, approval)\n ) {\n requestRef.current = { approval, loadReview: reviewLoader, retry };\n }\n const request = requestRef.current;\n const [result, setResult] = useState<{\n request: typeof request;\n review?: ToolActionReview;\n failed?: boolean;\n legacy?: boolean;\n denied?: boolean;\n } | null>(null);\n // Hide stale facts during render, before passive effect cleanup can run.\n const current = result?.request === request ? result : null;\n const loaded = current?.review;\n const failed = current?.failed;\n const legacy = current?.legacy;\n const denied = current?.denied;\n const [detailPath, setDetailPath] = useState<string | null>(null);\n useEffect(() => {\n let active = true;\n if (request.loadReview)\n void request.loadReview(request.approval).then(\n (review) => {\n if (active) {\n setResult(\n review.id !== request.approval.id ? { request, failed: true } : { request, review },\n );\n }\n },\n (error) => {\n if (active) {\n // 404: no saved review (older or non-connector actions); use the\n // approval's own arguments. 401/403: this person cannot review it.\n if (error instanceof OpenGeniApiError && error.status === 404)\n setResult({ request, legacy: true });\n else if (\n error instanceof OpenGeniApiError &&\n (error.status === 401 || error.status === 403)\n )\n setResult({ request, failed: true, denied: true });\n else setResult({ request, failed: true });\n }\n },\n );\n return () => {\n active = false;\n };\n }, [request]);\n const stableApproval = request.approval;\n const { formatToolName, approve: approveLabel } = messages;\n const toolName = approvalToolName(stableApproval);\n const answer = approvalAnswerLabels(t, toolName);\n const fallback = useMemo<ToolActionReview>(\n () => pendingApprovalReview(stableApproval, { formatToolName, approveLabel }),\n [stableApproval, formatToolName, approveLabel],\n );\n const loadLegacyDetails = useCallback<ToolReviewDetailsLoader>(\n async (value, path, offset) => ({\n version: 1,\n id: value.id,\n actionDigest: value.actionDigest,\n ...toolReviewDetails(stableApproval.arguments, undefined, path, offset, 25, toolName),\n }),\n [stableApproval, toolName],\n );\n if (reviewLoader && !loaded && !failed && !legacy)\n return (\n <ToolReviewFrame\n tone=\"waiting\"\n icon={<ShieldCheckIcon className=\"size-4\" aria-hidden=\"true\" />}\n eyebrow={messages.title}\n title={fallback.title}\n subtitle={fallback.accountLabel}\n aria-busy\n data-og-tool-review-loading=\"\"\n >\n <div role=\"status\" className=\"space-y-2\">\n <span className=\"sr-only\">{t(\"approvalSurface.loadingActionDetails\")}</span>\n <div className=\"h-3 w-3/4 animate-pulse rounded-og-sm bg-og-fg/8\" aria-hidden=\"true\" />\n <div className=\"h-3 w-1/2 animate-pulse rounded-og-sm bg-og-fg/8\" aria-hidden=\"true\" />\n </div>\n </ToolReviewFrame>\n );\n if (denied)\n return (\n <ToolReviewFrame\n tone=\"waiting\"\n icon={<ShieldCheckIcon className=\"size-4\" aria-hidden=\"true\" />}\n eyebrow={messages.title}\n title={fallback.title}\n subtitle={fallback.accountLabel}\n >\n <p role=\"alert\" className=\"m-0 text-og-sm text-og-fg\">\n {t(\"approvalSurface.youDonTHaveAccess\")}\n </p>\n </ToolReviewFrame>\n );\n if (failed)\n return (\n <ToolReviewFrame\n tone=\"waiting\"\n icon={<ShieldCheckIcon className=\"size-4\" aria-hidden=\"true\" />}\n eyebrow={messages.title}\n title={fallback.title}\n subtitle={fallback.accountLabel}\n footer={\n <DecisionActions>\n <DeclineButton\n busy={Boolean(actions.disabled || actions.submitting)}\n submitting={actions.submitting === \"reject\"}\n label={answer?.reject ?? messages.reject}\n onClick={actions.onReject}\n />\n </DecisionActions>\n }\n >\n <p role=\"alert\" className=\"m-0 text-og-sm text-og-fg\">\n {t(\"approvalSurface.couldnTLoadThisAction\")}{\" \"}\n <button\n type=\"button\"\n className=\"min-h-8 font-medium underline underline-offset-4 [@media(pointer:coarse)]:min-h-11 focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent/40\"\n onClick={() => setRetry((value) => value + 1)}\n >\n {t(\"approvalSurface.tryAgain\")}\n </button>\n </p>\n </ToolReviewFrame>\n );\n if (!loaded && stableApproval.arguments === undefined)\n return (\n <div data-approval-id={approval.id} data-review-origin=\"pending\">\n {custom}\n <ToolReviewFrame\n tone=\"waiting\"\n icon={<ShieldCheckIcon className=\"size-4\" aria-hidden=\"true\" />}\n eyebrow={messages.title}\n title={fallback.title}\n subtitle={fallback.accountLabel}\n data-og-tool-review=\"\"\n footer={\n <DecisionActions>\n <DeclineButton\n busy={Boolean(actions.disabled || actions.submitting)}\n submitting={actions.submitting === \"reject\"}\n label={answer?.reject ?? messages.reject}\n onClick={actions.onReject}\n />\n </DecisionActions>\n }\n >\n <p className=\"m-0 text-og-sm text-og-fg\">{UNRECOVERABLE_TEXT(t)}</p>\n </ToolReviewFrame>\n </div>\n );\n const saved = loaded ?? fallback;\n const review = answer ? { ...saved, approveLabel: answer.approve } : saved;\n if (detailPath !== null)\n return (\n <ToolActionReviewDetails\n review={review}\n path={detailPath}\n load={loaded && loadDetails ? loadDetails : loadLegacyDetails}\n onBack={() => {\n const path = detailPath;\n setDetailPath(null);\n requestAnimationFrame(() => {\n [\n ...document.querySelectorAll<HTMLButtonElement>(\n \"[data-approval-id] button[data-review-path]\",\n ),\n ]\n .find(\n (button) =>\n button.closest(\"[data-approval-id]\")?.getAttribute(\"data-approval-id\") ===\n approval.id && button.dataset.reviewPath === path,\n )\n ?.focus();\n });\n }}\n />\n );\n if (stableApproval.elicitation)\n return (\n <div data-approval-id={approval.id} data-review-origin=\"pending\">\n {custom}\n <McpElicitationRequest\n // A new question on the same call starts a fresh answer.\n key={`${stableApproval.elicitation.round}:${JSON.stringify(stableApproval.elicitation)}`}\n elicitation={stableApproval.elicitation}\n title={fallback.title}\n subtitle={fallback.accountLabel}\n submitting={actions.submitting}\n disabled={actions.disabled}\n onAnswer={onAnswer}\n onDecline={actions.onReject}\n details={\n fallback.detailsAvailable ? (\n <button\n type=\"button\"\n className=\"inline-flex min-h-8 items-center rounded-og-sm text-og-sm text-og-fg-muted underline decoration-og-border-strong underline-offset-4 hover:text-og-fg hover:decoration-current [@media(pointer:coarse)]:min-h-11 focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent/40\"\n data-review-path=\"\"\n onClick={() => setDetailPath(\"\")}\n >\n {t(\"toolActionReview.details\")}\n </button>\n ) : null\n }\n />\n </div>\n );\n return (\n <div data-approval-id={approval.id} data-review-origin=\"pending\">\n {custom}\n <ToolActionReviewCard\n review={review}\n {...actions}\n pendingLabel={messages.title}\n rejectLabel={answer?.reject ?? messages.reject}\n onViewDetails={\n loaded && onViewDetails\n ? (path) => onViewDetails(review, path)\n : loadDetails || !loaded\n ? setDetailPath\n : undefined\n }\n />\n </div>\n );\n}\n","import type {\n HumanInputAnswer,\n HumanInputQuestion,\n HumanInputSecretAnswer,\n HumanInputSecretSaveTo,\n HumanInputSecretSpec,\n SkillRecord,\n SessionHumanInputRequest,\n SubmitHumanInputResponseRequest,\n} from \"@opengeni/sdk\";\nimport { CheckIcon, ChevronDownIcon, ChevronUpIcon, MessageCircleQuestionIcon } from \"lucide-react\";\nimport {\n Fragment,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type FormEvent,\n type ReactNode,\n} from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { useErrorMessage } from \"../lib/error-message\";\nimport {\n answersFromDrafts,\n choiceOffersOther,\n defaultHumanInputFormMessages,\n humanInputAgentMayDecide,\n mergeHumanInputFormMessages,\n emptyDraft,\n initialDrafts,\n secretAnswerFromReading,\n type HumanInputAnswerDraft,\n type HumanInputFormMessages,\n} from \"../human-input-model\";\nimport {\n forgetHumanInputDraft,\n readHumanInputDraft,\n writeHumanInputDraft,\n type HumanInputDraftScope,\n} from \"../human-input-draft-store\";\nimport { SecretQuestionField, type SecretFieldHandle } from \"./secret-question-field\";\nimport {\n DecisionActions,\n DecisionButton,\n DecisionMark,\n decisionCardClass,\n decisionCardPad,\n} from \"./decision-card\";\nimport { InlineMarkdown } from \"./markdown\";\nimport { useOpenGeniText } from \"../messages/runtime\";\n\nexport {\n answersFromDrafts,\n defaultHumanInputFormMessages,\n type HumanInputAnswerDraft,\n type HumanInputFormMessages,\n};\n\nclass SkillReviewVerificationError extends Error {}\n\nexport type HumanInputFormProps = {\n /** Scoped immutable revision reader. Saving a Skill fails closed without its full preview. */\n loadSkillReview?:\n | ((reference: NonNullable<HumanInputQuestion[\"skillReview\"]>) => Promise<SkillRecord>)\n | undefined;\n /**\n * With `workspaceId` and `sessionId` (as on a full pending request), unsent\n * non-secret answers are kept per browser tab and restored when the card\n * mounts again, e.g. after visiting Settings and coming back.\n */\n request: Pick<SessionHumanInputRequest, \"id\" | \"questions\" | \"allowSkip\" | \"expiresAt\"> &\n Partial<Pick<SessionHumanInputRequest, \"workspaceId\" | \"sessionId\" | \"status\" | \"origin\">>;\n /**\n * Resolve only once the response was accepted: the form then forgets the\n * unsent draft and clears secret fields. Reject when sending failed so the\n * card keeps what was typed for a retry.\n */\n onSubmit: (response: SubmitHumanInputResponseRequest) => void | Promise<void>;\n submitting?: boolean | undefined;\n error?: string | null | undefined;\n title?: ReactNode;\n description?: ReactNode;\n /** e.g. \"1 of 2\" when a host is stepping through parallel requests. */\n progressLabel?: ReactNode;\n submitLabel?: string | undefined;\n skipLabel?: string | undefined;\n /**\n * \"Let the agent decide\", offered on every ordinary question (never on a\n * secret, a Skill review or a secret approval) in place of Skip. By default\n * it settles the request with `{ outcome: \"skipped\", agentDecides: true }`,\n * so the asking agent makes its own best choice. A host can hand the\n * question to another agent instead (a sub-session's parent); resolve once\n * that was sent. `false` hides the action.\n */\n onLetAgentDecide?: (() => void | Promise<void>) | false | undefined;\n /** An agent was asked to decide: the action is replaced by a note; answering still works. */\n agentDeciding?: boolean | undefined;\n messages?: Partial<HumanInputFormMessages> | undefined;\n autoFocus?: boolean | undefined;\n /** Start collapsed to a compact bar (drafts still retained). */\n defaultCollapsed?: boolean | undefined;\n /**\n * Answer a yes/no decision (one required choice between an accept and a\n * decline option, without Other) with two buttons instead of a radio list.\n * Off by default; embedded conversations turn it on.\n */\n decisionButtons?: boolean | undefined;\n /**\n * Where this person may save an answer to a secret question. A request for\n * a target outside this list falls back to the most private allowed one,\n * with a note. Defaults to Only me, This task and This workspace.\n */\n allowedSaveTo?: readonly HumanInputSecretSaveTo[] | undefined;\n className?: string | undefined;\n};\n\n/**\n * Styled but host-neutral renderer for one structured request. Matches the\n * waiting-tone decision language of ApprovalSurface: question-first, compact\n * options, sticky ask/submit chrome. Hosts can replace title/description or\n * use `useHumanInputRequests` headlessly.\n */\nexport function HumanInputForm(props: HumanInputFormProps) {\n // The pending-request read model is refreshed after session events and\n // returns newly allocated question arrays for the same durable request.\n // Key the state owner by that request's lifecycle identity so reconciliation\n // cannot erase an answer that the operator is still typing.\n return <HumanInputRequestForm key={props.request.id} {...props} />;\n}\n\nfunction HumanInputRequestForm({\n request,\n onSubmit,\n loadSkillReview,\n submitting = false,\n error,\n title,\n description,\n progressLabel,\n submitLabel,\n skipLabel,\n onLetAgentDecide,\n agentDeciding = false,\n messages: messageOverrides,\n autoFocus = true,\n defaultCollapsed = false,\n decisionButtons = false,\n allowedSaveTo,\n className,\n}: HumanInputFormProps) {\n const t = useOpenGeniText();\n const formatError = useErrorMessage();\n const messages = mergeHumanInputFormMessages(defaultHumanInputFormMessages(t), messageOverrides);\n const singleQuestion = request.questions.length === 1 ? request.questions[0]! : null;\n // Several questions are asked one at a time; every step stays mounted (hidden)\n // so typed secrets and drafts survive moving back and forth.\n const multi = request.questions.length > 1;\n const lastStep = request.questions.length - 1;\n const [step, setStep] = useState(0);\n const stepQuestion = request.questions[Math.min(step, Math.max(0, lastStep))] ?? null;\n const headerQuestion = singleQuestion ?? (multi ? stepQuestion : null);\n const decision = binaryDecision(request.questions, { inferFromLabels: decisionButtons });\n const [decisionChoice, setDecisionChoice] = useState<string | null>(null);\n // Agent-written question text renders as inline Markdown; host-provided\n // titles and messages render as given.\n const questionTitle =\n title === undefined && headerQuestion ? (headerQuestion.label ?? headerQuestion.prompt) : null;\n const questionDescription =\n description === undefined && headerQuestion && questionTitle !== null\n ? headerQuestion.label\n ? headerQuestion.prompt\n : (headerQuestion.helpText ?? null)\n : null;\n /** The heading asks the current question; the body holds only its answer. */\n const headerCarriesQuestion = questionTitle !== null;\n const resolvedTitle =\n questionTitle !== null ? (\n <InlineMarkdown>{questionTitle}</InlineMarkdown>\n ) : title === undefined ? (\n messages.title\n ) : (\n title\n );\n const resolvedDescription = questionDescription ? (\n <InlineMarkdown>{questionDescription}</InlineMarkdown>\n ) : description === undefined ? (\n headerCarriesQuestion ? null : (\n messages.description || null\n )\n ) : (\n description\n );\n const resolvedSubmitLabel =\n submitLabel ?? (multi ? messages.submit : (messages.submitOne ?? messages.submit));\n const resolvedSkipLabel = skipLabel ?? messages.skip;\n const formId = useId();\n const titleId = useId();\n const bodyRef = useRef<HTMLDivElement>(null);\n const draftScope = useMemo<HumanInputDraftScope | null>(\n () =>\n request.workspaceId && request.sessionId\n ? { workspaceId: request.workspaceId, sessionId: request.sessionId, requestId: request.id }\n : null,\n [request.id, request.sessionId, request.workspaceId],\n );\n const requestSettled = request.status !== undefined && request.status !== \"pending\";\n const [drafts, setDrafts] = useState<Record<string, HumanInputAnswerDraft>>(() => ({\n ...initialDrafts(request.questions),\n ...(draftScope && !requestSettled ? readHumanInputDraft(draftScope, request) : null),\n }));\n // Once a response is accepted, nothing typed afterwards becomes a draft again.\n const draftClosed = useRef(false);\n // Mounting (or StrictMode's second mount) is not an edit: rewriting the\n // restored draft would refresh its age and let it outlive a pending-list\n // read that already settled it.\n const mountedDrafts = useRef(drafts);\n const questionsRef = useRef(request.questions);\n questionsRef.current = request.questions;\n useEffect(() => {\n if (!draftScope) return;\n if (requestSettled) {\n draftClosed.current = true;\n forgetHumanInputDraft(draftScope);\n return;\n }\n if (draftClosed.current || drafts === mountedDrafts.current) return;\n writeHumanInputDraft(draftScope, questionsRef.current, drafts);\n }, [draftScope, drafts, requestSettled]);\n const [validationErrors, setValidationErrors] = useState<Record<string, string>>({});\n const [submissionError, setSubmissionError] = useState<string | null>(null);\n const [submittingInternally, setSubmittingInternally] = useState(false);\n const [collapsed, setCollapsed] = useState(defaultCollapsed);\n const submissionInFlight = useRef(false);\n const submissionGeneration = useRef(0);\n // Secret answers stay in their uncontrolled inputs until submit.\n const secretHandles = useRef(new Map<string, SecretFieldHandle>());\n const secretRegistrars = useMemo(\n () => new Map<string, (handle: SecretFieldHandle | null) => void>(),\n [],\n );\n const registerSecret = useCallback(\n (questionId: string) => {\n let registrar = secretRegistrars.get(questionId);\n if (!registrar) {\n registrar = (handle) => {\n if (handle) secretHandles.current.set(questionId, handle);\n else secretHandles.current.delete(questionId);\n };\n secretRegistrars.set(questionId, registrar);\n }\n return registrar;\n },\n [secretRegistrars],\n );\n const busy = submitting || submittingInternally;\n const reviewIdentity = JSON.stringify(\n request.questions\n .filter((question) => question.skillReview)\n .map((question) => ({\n id: question.id,\n reference: {\n sourceOperationId: question.skillReview!.sourceOperationId,\n skillId: question.skillReview!.skillId,\n revisionId: question.skillReview!.revisionId,\n expectedRevisionId: question.skillReview!.expectedRevisionId,\n expectedScopeVersion: question.skillReview!.expectedScopeVersion,\n ...(question.skillReview!.removalOperationId\n ? { removalOperationId: question.skillReview!.removalOperationId }\n : {}),\n },\n })),\n );\n const [reviewReload, setReviewReload] = useState(0);\n const [reviews, setReviews] = useState<{\n loader: typeof loadSkillReview;\n identity: string;\n records: Record<string, SkillRecord>;\n error: string | null;\n } | null>(null);\n useEffect(() => {\n let current = true;\n const questions = JSON.parse(reviewIdentity) as Array<{\n id: string;\n reference: NonNullable<HumanInputQuestion[\"skillReview\"]>;\n }>;\n if (!questions.length) return;\n setReviews(null);\n void Promise.all(\n questions.map(async (question) => {\n if (!loadSkillReview) throw new Error(t(\"humanInputForm.thisClientCannotPreviewSkill\"));\n const reference = question.reference;\n const record = await loadSkillReview(reference);\n if (\n record.id !== reference.skillId ||\n record.revisionId !== reference.revisionId ||\n (record.removalOperationId ?? undefined) !== reference.removalOperationId ||\n !record.files.some((file) => file.path === \"SKILL.md\")\n ) {\n throw new SkillReviewVerificationError(\n t(\"humanInputForm.theRequestedSkillRevisionCould\"),\n );\n }\n return [question.id, record] as const;\n }),\n )\n .then((records) => {\n if (current)\n setReviews({\n loader: loadSkillReview,\n identity: reviewIdentity,\n records: Object.fromEntries(records),\n error: null,\n });\n })\n .catch((cause) => {\n if (current)\n setReviews({\n loader: loadSkillReview,\n identity: reviewIdentity,\n records: {},\n error: formatError(\n cause,\n cause instanceof SkillReviewVerificationError\n ? cause.message\n : !loadSkillReview\n ? t(\"humanInputForm.thisClientCannotPreviewSkill\")\n : undefined,\n ),\n });\n });\n return () => {\n current = false;\n };\n }, [loadSkillReview, reviewIdentity, reviewReload, formatError, t]);\n const visibleReviews =\n reviews?.loader === loadSkillReview && reviews?.identity === reviewIdentity ? reviews : null;\n const preview = (question: HumanInputQuestion) => {\n if (!question.skillReview) return null;\n const record = visibleReviews?.records[question.id];\n return (\n <div className=\"mb-3 min-w-0 space-y-2\" data-skill-review=\"\">\n {record ? (\n <>\n <p className=\"text-og-sm\">\n {record.title ?? t(\"humanInputForm.skill\")}{\" \"}\n {t(\"humanInputForm.scopeLengthFiles\", {\n scope: record.scope,\n length: record.files.length,\n })}\n </p>\n <p className=\"text-og-xs text-og-fg-muted\">\n {question.skillReview.removalOperationId\n ? t(\"humanInputForm.permanentlyDeletesThisSkillAnd\")\n : t(\"humanInputForm.savingActivatesTheseExactFiles\")}\n </p>\n {record.files.map((file) => (\n <details key={file.path} open={file.path === \"SKILL.md\"}>\n <summary className=\"cursor-pointer break-all text-og-sm\">{file.path}</summary>\n <pre className=\"max-h-64 overflow-auto whitespace-pre-wrap break-words rounded-og-md bg-og-surface-1 p-2 text-og-xs\">\n {file.content}\n </pre>\n </details>\n ))}\n </>\n ) : visibleReviews?.error ? (\n <>\n <p role=\"alert\" className=\"text-og-sm\">\n {visibleReviews.error}\n </p>\n <button type=\"button\" onClick={() => setReviewReload((value) => value + 1)}>\n {t(\"humanInputForm.retryPreview\")}\n </button>\n </>\n ) : (\n <p role=\"status\" className=\"text-og-sm\">\n {t(\"humanInputForm.loadingTheExactSkillFiles\")}\n </p>\n )}\n </div>\n );\n };\n\n const update = (\n questionId: string,\n apply: (draft: HumanInputAnswerDraft) => HumanInputAnswerDraft,\n ): void => {\n setDrafts((current) => ({\n ...current,\n [questionId]: apply(current[questionId] ?? emptyDraft()),\n }));\n setValidationErrors((current) => {\n if (!(questionId in current)) return current;\n const next = { ...current };\n delete next[questionId];\n return next;\n });\n };\n\n const clearValidationError = (questionId: string): void =>\n setValidationErrors((current) => {\n if (!(questionId in current)) return current;\n const next = { ...current };\n delete next[questionId];\n return next;\n });\n\n /** Resolves true when the host accepted the response. */\n const submitResponse = async (response: SubmitHumanInputResponseRequest): Promise<boolean> => {\n if (busy || submissionInFlight.current) return false;\n const generation = submissionGeneration.current;\n submissionInFlight.current = true;\n setSubmissionError(null);\n setSubmittingInternally(true);\n try {\n await onSubmit(response);\n if (draftScope) {\n draftClosed.current = true;\n forgetHumanInputDraft(draftScope);\n }\n return true;\n } catch (cause) {\n if (generation === submissionGeneration.current) {\n setSubmissionError(formatError(cause));\n }\n return false;\n } finally {\n if (generation === submissionGeneration.current) {\n submissionInFlight.current = false;\n setSubmittingInternally(false);\n }\n }\n };\n\n const focusQuestion = (questionId: string): void => {\n const root = bodyRef.current;\n if (!root) return;\n const block = Array.from(\n root.querySelectorAll<HTMLElement>(\"[data-human-input-question]\"),\n ).find((node) => node.getAttribute(\"data-human-input-question\") === questionId);\n block?.scrollIntoView({ block: \"nearest\", behavior: \"smooth\" });\n const focusable = block?.querySelector<HTMLElement>(\n \"input:not([type='hidden']):not([disabled]), textarea:not([disabled])\",\n );\n focusable?.focus({ preventScroll: true });\n };\n\n /** The validation error for one question's current answer, if any. */\n const questionError = (question: HumanInputQuestion): string | null => {\n if (question.kind === \"secret\") {\n const handle = secretHandles.current.get(question.id);\n if (!handle) return null;\n const secret = secretAnswerFromReading(t, question, handle.read(), messages);\n return secret && \"error\" in secret ? secret.error : null;\n }\n return answersFromDrafts(t, [question], drafts, messages).errors[question.id] ?? null;\n };\n\n const goToStep = (next: number): void => {\n const target = request.questions[next];\n if (!target) return;\n setStep(next);\n // After paint, once the step is visible.\n requestAnimationFrame(() => focusQuestion(target.id));\n };\n\n const nextStep = (): void => {\n if (!stepQuestion) return;\n const stepProblem = questionError(stepQuestion);\n if (stepProblem) {\n setValidationErrors((current) => ({ ...current, [stepQuestion.id]: stepProblem }));\n requestAnimationFrame(() => focusQuestion(stepQuestion.id));\n return;\n }\n goToStep(step + 1);\n };\n\n const submit = async (event: FormEvent<HTMLFormElement>): Promise<void> => {\n event.preventDefault();\n // Enter (or the primary button) on an earlier step moves on instead of sending.\n if (multi && step < lastStep) {\n nextStep();\n return;\n }\n const result = answersFromDrafts(t, request.questions, drafts, messages);\n const secretAnswers: HumanInputSecretAnswer[] = [];\n const secretPublicAnswers = new Map<string, HumanInputAnswer>();\n for (const question of request.questions) {\n if (question.kind !== \"secret\") continue;\n const handle = secretHandles.current.get(question.id);\n if (!handle) continue;\n const secret = secretAnswerFromReading(t, question, handle.read(), messages);\n if (!secret) continue;\n if (\"error\" in secret) {\n result.errors[question.id] = secret.error;\n continue;\n }\n secretAnswers.push(secret.secretAnswer);\n secretPublicAnswers.set(question.id, secret.answer);\n }\n if (Object.keys(result.errors).length > 0) {\n setValidationErrors(result.errors);\n const firstInvalid = request.questions.find((question) => question.id in result.errors);\n if (firstInvalid) {\n setStep(request.questions.indexOf(firstInvalid));\n // After paint so aria-invalid / error text exist under the question.\n requestAnimationFrame(() => focusQuestion(firstInvalid.id));\n }\n return;\n }\n const unreviewedSave = request.questions.find(\n (question) =>\n question.skillReview &&\n !visibleReviews?.records[question.id] &&\n result.answers.some(\n (answer) => answer.questionId === question.id && answer.values.includes(\"save\"),\n ),\n );\n if (unreviewedSave) {\n setStep(request.questions.indexOf(unreviewedSave));\n setValidationErrors({\n [unreviewedSave.id]: unreviewedSave.skillReview?.removalOperationId\n ? t(\"humanInputForm.loadTheExactSkillProposal\")\n : t(\"humanInputForm.loadTheExactSkillFiles\"),\n });\n return;\n }\n // Keep the request's question order across drafted and secret answers.\n const drafted = new Map(result.answers.map((answer) => [answer.questionId, answer]));\n const answers = request.questions.flatMap((question) => {\n const answer = drafted.get(question.id) ?? secretPublicAnswers.get(question.id);\n return answer ? [answer] : [];\n });\n const accepted = await submitResponse({\n outcome: \"answered\",\n answers,\n ...(secretAnswers.length > 0 ? { secretAnswers } : {}),\n });\n if (accepted) for (const handle of secretHandles.current.values()) handle.clear();\n };\n\n const stepLabel = multi\n ? t(\"humanInputForm.questionOfTotal\", { current: step + 1, total: request.questions.length })\n : null;\n const metaBits = [\n progressLabel,\n stepLabel,\n request.expiresAt ? (\n <>\n {messages.deadlineLabel}{\" \"}\n <time\n dateTime={request.expiresAt}\n title={new Date(request.expiresAt).toLocaleString(t.locale)}\n >\n {messages.formatDeadline(request.expiresAt)}\n </time>\n </>\n ) : null,\n ].filter(Boolean);\n const meta =\n metaBits.length > 0\n ? metaBits.map((bit, index) => (\n // Positional facts of one line; a deadline is markup, not text.\n // oxlint-disable-next-line react/no-array-index-key -- fixed positions\n <Fragment key={index}>\n {index > 0 ? \" · \" : null}\n {bit}\n </Fragment>\n ))\n : null;\n const errorText = error ?? submissionError;\n const agentMayDecide = onLetAgentDecide !== false && humanInputAgentMayDecide(request);\n const [delegating, setDelegating] = useState(false);\n const letAgentDecide = async (): Promise<void> => {\n if (busy || delegating) return;\n if (typeof onLetAgentDecide !== \"function\") {\n await submitResponse({ outcome: \"skipped\", agentDecides: true });\n return;\n }\n setSubmissionError(null);\n setDelegating(true);\n try {\n await onLetAgentDecide();\n } catch (cause) {\n setSubmissionError(formatError(cause));\n } finally {\n setDelegating(false);\n }\n };\n const skipButton = agentMayDecide ? (\n agentDeciding ? (\n <p\n role=\"status\"\n className=\"m-0 inline-flex min-h-9 items-center gap-1.5 text-og-sm text-og-fg-muted\"\n data-human-input-agent-deciding=\"\"\n >\n <span aria-hidden=\"true\" className=\"size-1.5 rounded-full bg-og-status-waiting\" />\n {messages.agentDeciding ?? t(\"humanInputModel.yourAgentIsDeciding\")}\n </p>\n ) : (\n <DecisionButton\n kind=\"quiet\"\n disabled={busy || delegating}\n busy={delegating}\n data-human-input-let-agent-decide=\"\"\n onClick={() => void letAgentDecide()}\n >\n {messages.letAgentDecide ?? t(\"humanInputModel.letTheAgentDecide\")}\n </DecisionButton>\n )\n ) : request.allowSkip ? (\n <DecisionButton\n kind=\"quiet\"\n disabled={busy}\n onClick={() => void submitResponse({ outcome: \"skipped\" })}\n >\n {resolvedSkipLabel}\n </DecisionButton>\n ) : null;\n\n if (collapsed) {\n return (\n <div\n data-human-input-request={request.id}\n data-human-input-collapsed=\"\"\n aria-labelledby={titleId}\n className={cn(decisionCardClass, \"flex items-center gap-3 px-3 py-2.5\", className)}\n >\n <DecisionMark>\n <MessageCircleQuestionIcon />\n </DecisionMark>\n <div className=\"min-w-0 flex-1\">\n <h2 id={titleId} className=\"m-0 truncate text-og-sm font-semibold text-og-fg\">\n {questionTitle !== null ? (\n <InlineMarkdown singleLine>{questionTitle}</InlineMarkdown>\n ) : (\n resolvedTitle\n )}\n </h2>\n {meta ? <p className=\"m-0 mt-0.5 truncate text-og-xs text-og-fg-subtle\">{meta}</p> : null}\n </div>\n <DecisionButton\n kind=\"secondary\"\n onClick={() => setCollapsed(false)}\n className=\"w-auto shrink-0 px-3 @md/decision:min-h-8\"\n >\n {messages.expand}\n <ChevronDownIcon aria-hidden=\"true\" className=\"size-3.5\" />\n </DecisionButton>\n </div>\n );\n }\n\n return (\n <form\n data-human-input-request={request.id}\n data-human-input-step={multi ? step + 1 : undefined}\n onSubmit={(event) => void submit(event)}\n aria-labelledby={titleId}\n className={cn(decisionCardClass, \"flex flex-col\", className)}\n >\n <header className={cn(\"flex items-start gap-3 pt-4\", decisionCardPad)}>\n <DecisionMark>\n <MessageCircleQuestionIcon />\n </DecisionMark>\n <div className=\"min-w-0 flex-1 pt-px\">\n <h2\n id={titleId}\n className=\"m-0 text-og-md font-semibold leading-snug text-balance text-og-fg [overflow-wrap:anywhere]\"\n >\n {resolvedTitle}\n </h2>\n {resolvedDescription ? (\n <div className=\"mt-1 text-og-sm leading-relaxed text-og-fg-muted [overflow-wrap:anywhere]\">\n {resolvedDescription}\n </div>\n ) : null}\n {meta ? <p className=\"m-0 mt-1.5 text-og-xs text-og-fg-subtle\">{meta}</p> : null}\n </div>\n <button\n type=\"button\"\n onClick={() => setCollapsed(true)}\n aria-label={messages.collapse}\n title={messages.collapse}\n className=\"-mr-1.5 -mt-1 inline-flex size-8 shrink-0 items-center justify-center rounded-og-md text-og-fg-subtle transition-colors hover:bg-og-hover hover:text-og-fg focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent/45 pointer-coarse:size-11\"\n >\n <ChevronUpIcon aria-hidden=\"true\" className=\"size-4\" />\n </button>\n </header>\n\n {decision ? (\n <>\n {decision.question.helpText ||\n decision.accept.description ||\n decision.decline.description ? (\n <div\n className={cn(\n \"space-y-1 pt-3 text-og-sm leading-relaxed text-og-fg-muted [overflow-wrap:anywhere]\",\n decisionCardPad,\n )}\n >\n {decision.question.label && decision.question.helpText ? (\n <p className=\"m-0\">\n <InlineMarkdown>{decision.question.helpText}</InlineMarkdown>\n </p>\n ) : null}\n {[decision.accept, decision.decline].map((option) =>\n option.description ? (\n <p key={option.id} className=\"m-0\">\n <span className=\"font-medium text-og-fg\">{option.label}</span>\n {\" · \"}\n <InlineMarkdown>{option.description}</InlineMarkdown>\n </p>\n ) : null,\n )}\n </div>\n ) : null}\n {errorText ? (\n <p\n role=\"alert\"\n className={cn(\"m-0 pt-3 text-og-sm text-og-status-failed\", decisionCardPad)}\n >\n {errorText}\n </p>\n ) : null}\n <footer className={cn(\"pb-4 pt-4\", decisionCardPad)} data-human-input-decision=\"\">\n <DecisionActions lead={skipButton}>\n {[decision.decline, decision.accept].map((option) => {\n const primary = option === decision.accept;\n const chosen = busy && decisionChoice === option.id;\n return (\n <DecisionButton\n key={option.id}\n kind={primary ? \"primary\" : \"secondary\"}\n disabled={busy}\n busy={chosen}\n ref={\n !primary && autoFocus\n ? (node: HTMLButtonElement | null) => {\n if (node && !node.dataset.ogFocused) {\n node.dataset.ogFocused = \"\";\n node.focus({ preventScroll: true });\n }\n }\n : undefined\n }\n data-human-input-choice={option.id}\n onClick={() => {\n setDecisionChoice(option.id);\n void submitResponse({\n outcome: \"answered\",\n answers: [{ questionId: decision.question.id, values: [option.id] }],\n });\n }}\n >\n {chosen ? messages.submitting : option.label}\n </DecisionButton>\n );\n })}\n </DecisionActions>\n </footer>\n </>\n ) : (\n <>\n <div ref={bodyRef} className={cn(\"min-w-0 pt-3\", decisionCardPad)}>\n <fieldset disabled={busy} className=\"m-0 min-w-0 border-0 p-0\">\n {request.questions.map((question, index) => (\n <div\n key={question.id}\n data-human-input-question={question.id}\n hidden={multi && index !== step}\n className=\"flex flex-col gap-2\"\n >\n {preview(question)}\n <QuestionControls\n question={question}\n questionNumber={!headerCarriesQuestion && multi ? index + 1 : null}\n labelledBy={headerCarriesQuestion ? titleId : undefined}\n draft={drafts[question.id] ?? emptyDraft()}\n fieldId={`${formId}-${index}`}\n error={validationErrors[question.id]}\n messages={messages}\n autoFocus={autoFocus && index === 0}\n firstOption={index === 0}\n showPromptChrome={!headerCarriesQuestion}\n allowSkip={request.allowSkip}\n busy={busy}\n allowedSaveTo={allowedSaveTo}\n registerSecret={registerSecret(question.id)}\n onSecretEdited={() => clearValidationError(question.id)}\n onUpdate={(apply) => update(question.id, apply)}\n />\n </div>\n ))}\n </fieldset>\n </div>\n\n {errorText ? (\n <p\n role=\"alert\"\n className={cn(\"m-0 pt-3 text-og-sm text-og-status-failed\", decisionCardPad)}\n >\n {errorText}\n </p>\n ) : null}\n\n <footer className={cn(\"pb-4 pt-4\", decisionCardPad)}>\n <DecisionActions lead={skipButton}>\n {multi && step > 0 ? (\n <DecisionButton kind=\"secondary\" disabled={busy} onClick={() => goToStep(step - 1)}>\n {t(\"humanInputForm.back\")}\n </DecisionButton>\n ) : null}\n <DecisionButton type=\"submit\" kind=\"primary\" disabled={busy} busy={busy}>\n {busy\n ? messages.submitting\n : multi && step < lastStep\n ? t(\"humanInputForm.next\")\n : resolvedSubmitLabel}\n </DecisionButton>\n </DecisionActions>\n </footer>\n </>\n )}\n </form>\n );\n}\n\n// Unambiguous approve/decline verbs only: \"Continue with A\" vs \"Keep B\" is a\n// real choice between two options, not a yes/no decision.\nconst ACCEPT_WORDS = new Set([\"approve\", \"approved\", \"yes\", \"confirm\", \"allow\", \"accept\"]);\nconst DECLINE_WORDS = new Set([\"cancel\", \"decline\", \"reject\", \"deny\", \"no\", \"don't\", \"dont\"]);\n\nfunction firstWord(label: string): string {\n return (\n label\n .trim()\n .toLowerCase()\n .replace(/[’]/g, \"'\")\n .split(/[\\s,.:;!?()]+/)[0] ?? \"\"\n );\n}\n\n/**\n * A yes/no decision (an approval asked as a question): one required\n * single-choice question with exactly an accept and a decline option. It is\n * answered with two buttons; an \"Other\" free-text answer has no meaning for it,\n * and the composer still accepts a different instruction.\n */\nexport function binaryDecision(\n questions: readonly HumanInputQuestion[],\n { inferFromLabels = true }: { inferFromLabels?: boolean | undefined } = {},\n): {\n question: HumanInputQuestion;\n accept: HumanInputQuestion[\"options\"][number];\n decline: HumanInputQuestion[\"options\"][number];\n} | null {\n if (questions.length !== 1) return null;\n const question = questions[0]!;\n // The agent asked for a yes/no decision in its own words: the action first,\n // the way out second.\n if (\n question.confirm === true &&\n question.kind === \"single_select\" &&\n !question.skillReview &&\n question.options.length === 2\n ) {\n return { question, accept: question.options[0]!, decline: question.options[1]! };\n }\n if (!inferFromLabels) return null;\n if (\n question.kind !== \"single_select\" ||\n question.skillReview ||\n // The runtime marks every choice question `allowOther`, so it is not a\n // signal here; a different answer goes through the composer instead.\n !question.required ||\n question.options.length !== 2\n )\n return null;\n const [first, second] = question.options as [\n HumanInputQuestion[\"options\"][number],\n HumanInputQuestion[\"options\"][number],\n ];\n const kind = (option: HumanInputQuestion[\"options\"][number]) => {\n const word = firstWord(option.label);\n return ACCEPT_WORDS.has(word) ? \"accept\" : DECLINE_WORDS.has(word) ? \"decline\" : null;\n };\n const a = kind(first);\n const b = kind(second);\n if (a === \"accept\" && b === \"decline\") return { question, accept: first, decline: second };\n if (a === \"decline\" && b === \"accept\") return { question, accept: second, decline: first };\n return null;\n}\n\nfunction QuestionControls({\n question,\n questionNumber,\n labelledBy,\n draft,\n fieldId,\n error,\n messages,\n autoFocus,\n firstOption,\n showPromptChrome,\n allowSkip,\n busy,\n allowedSaveTo,\n registerSecret,\n onSecretEdited,\n onUpdate,\n}: {\n question: HumanInputQuestion;\n questionNumber: number | null;\n labelledBy: string | undefined;\n draft: HumanInputAnswerDraft;\n fieldId: string;\n error: string | undefined;\n messages: HumanInputFormMessages;\n autoFocus: boolean;\n firstOption: boolean;\n showPromptChrome: boolean;\n allowSkip: boolean;\n busy: boolean;\n allowedSaveTo: readonly HumanInputSecretSaveTo[] | undefined;\n registerSecret: (handle: SecretFieldHandle | null) => void;\n onSecretEdited: () => void;\n onUpdate: (apply: (draft: HumanInputAnswerDraft) => HumanInputAnswerDraft) => void;\n}) {\n const t = useOpenGeniText();\n const errorId = `${fieldId}-error`;\n const helpId = `${fieldId}-help`;\n const labelId = `${fieldId}-label`;\n const promptId = `${fieldId}-prompt`;\n const otherChoiceId = `${fieldId}-other-choice`;\n const otherLabelId = `${fieldId}-other-label`;\n const otherTextId = `${fieldId}-other-text`;\n const visibleLabel = question.label ?? question.prompt;\n const controlLabelId = showPromptChrome ? labelId : labelledBy;\n const hint =\n question.kind === \"multi_select\"\n ? messages.selectionHint(\n question.validation?.minSelections,\n question.validation?.maxSelections,\n )\n : null;\n const describedBy =\n [\n question.label && showPromptChrome ? promptId : null,\n question.helpText && showPromptChrome ? helpId : null,\n hint ? `${fieldId}-hint` : null,\n error ? errorId : null,\n ]\n .filter(Boolean)\n .join(\" \") || undefined;\n const selectOtherDraft = (current: HumanInputAnswerDraft): HumanInputAnswerDraft => ({\n ...current,\n otherSelected: true,\n ...(question.kind === \"single_select\" ? { values: [] } : {}),\n });\n return (\n <>\n {showPromptChrome ? (\n <>\n <div className=\"flex flex-wrap items-baseline gap-x-2\">\n <label\n id={labelId}\n htmlFor={question.kind === \"text\" ? fieldId : undefined}\n className=\"min-w-0 text-og-sm font-medium text-og-fg [overflow-wrap:anywhere]\"\n >\n {questionNumber === null ? null : (\n <span className=\"mr-1.5 tabular-nums text-og-fg-muted\">{questionNumber}.</span>\n )}\n {questionNumber === null ? null : \" \"}\n <InlineMarkdown>{visibleLabel}</InlineMarkdown>\n {question.required && !allowSkip ? (\n <span aria-hidden className=\"ml-1 text-og-status-failed\">\n *\n </span>\n ) : !question.required ? (\n <span className=\"ml-1.5 text-og-xs font-normal text-og-fg-subtle\">\n {messages.optional}\n </span>\n ) : null}\n </label>\n </div>\n {question.label ? (\n <p id={promptId} className=\"text-og-sm text-og-fg-muted [overflow-wrap:anywhere]\">\n <InlineMarkdown>{question.prompt}</InlineMarkdown>\n </p>\n ) : null}\n {question.helpText ? (\n <p id={helpId} className=\"text-og-xs text-og-fg-subtle [overflow-wrap:anywhere]\">\n <InlineMarkdown>{question.helpText}</InlineMarkdown>\n </p>\n ) : null}\n {hint ? (\n <p id={`${fieldId}-hint`} className=\"text-og-xs text-og-fg-subtle\">\n {hint}\n </p>\n ) : null}\n </>\n ) : (\n <>\n {!question.required && allowSkip === false ? (\n <p className=\"text-og-xs text-og-fg-subtle\">{messages.optional}</p>\n ) : null}\n {question.helpText && question.label ? (\n <p id={helpId} className=\"mb-1.5 text-og-xs text-og-fg-subtle [overflow-wrap:anywhere]\">\n <InlineMarkdown>{question.helpText}</InlineMarkdown>\n </p>\n ) : null}\n {hint ? (\n <p id={`${fieldId}-hint`} className=\"mb-1.5 text-og-xs text-og-fg-subtle\">\n {hint}\n </p>\n ) : null}\n </>\n )}\n\n {question.kind === \"secret\" ? (\n question.secret ? (\n <SecretQuestionField\n question={question as HumanInputQuestion & { secret: HumanInputSecretSpec }}\n fieldId={fieldId}\n messages={messages}\n autoFocus={autoFocus}\n allowedSaveTo={allowedSaveTo}\n error={error}\n describedBy={\n [\n question.label && showPromptChrome ? promptId : null,\n question.helpText && showPromptChrome ? helpId : null,\n ]\n .filter(Boolean)\n .join(\" \") || undefined\n }\n register={registerSecret}\n onEdited={onSecretEdited}\n />\n ) : (\n <p className=\"text-og-sm text-og-fg-muted\">{t(\"humanInputForm.thisQuestionCanTBe\")}</p>\n )\n ) : question.kind === \"text\" ? (\n <textarea\n id={fieldId}\n value={draft.values[0] ?? \"\"}\n onChange={(event) =>\n onUpdate((current) => ({\n ...current,\n values: event.target.value ? [event.target.value] : [],\n }))\n }\n aria-invalid={Boolean(error)}\n aria-labelledby={controlLabelId}\n aria-describedby={describedBy}\n autoFocus={autoFocus}\n rows={3}\n placeholder={t(\"humanInputForm.typeYourAnswer\")}\n className=\"min-h-20 w-full resize-y rounded-og-md border border-og-border bg-og-surface-1 px-3.5 py-2.5 text-og-sm leading-relaxed text-og-fg outline-hidden transition-[border-color,box-shadow] placeholder:text-og-fg-subtle focus:border-og-fg/50 focus:ring-2 focus:ring-og-accent/25 aria-[invalid=true]:border-og-status-failed/60 pointer-coarse:text-[16px]\"\n />\n ) : (\n <div\n role={question.kind === \"single_select\" ? \"radiogroup\" : \"group\"}\n aria-labelledby={controlLabelId}\n aria-describedby={describedBy}\n className=\"flex flex-col gap-2\"\n >\n {question.options.map((option, optionIndex) => {\n const checked = draft.values.includes(option.id);\n return (\n <label key={option.id} className={choiceRowClass(checked, true)}>\n <input\n type={question.kind === \"single_select\" ? \"radio\" : \"checkbox\"}\n name={question.kind === \"single_select\" ? fieldId : undefined}\n autoFocus={autoFocus && firstOption && optionIndex === 0}\n checked={checked}\n onChange={(event) =>\n onUpdate((current) => ({\n ...current,\n values:\n question.kind === \"single_select\"\n ? event.target.checked\n ? [option.id]\n : []\n : event.target.checked\n ? [...current.values, option.id]\n : current.values.filter((value) => value !== option.id),\n ...(question.kind === \"single_select\" && event.target.checked\n ? { otherSelected: false }\n : {}),\n }))\n }\n className=\"sr-only\"\n />\n <ChoiceIndicator multiple={question.kind !== \"single_select\"} checked={checked} />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block text-og-sm font-medium leading-5 [overflow-wrap:anywhere]\">\n {option.label}\n {option.recommended ? (\n <span\n data-human-input-recommended=\"\"\n className=\"ml-2 inline-flex -translate-y-px items-center rounded-full bg-og-accent/12 px-2 align-middle text-og-xs font-medium leading-[1.125rem] text-og-accent\"\n >\n {t(\"humanInputForm.recommended\")}\n </span>\n ) : null}\n </span>\n {option.description ? (\n <span className=\"mt-0.5 block text-og-xs leading-[1.125rem] text-og-fg-muted [overflow-wrap:anywhere]\">\n <InlineMarkdown>{option.description}</InlineMarkdown>\n </span>\n ) : null}\n {option.preview ? (\n <span\n data-human-input-preview=\"\"\n className=\"mt-2 block max-h-40 overflow-auto whitespace-pre-wrap rounded-og-md bg-og-fg/[0.04] px-2.5 py-2 font-og-mono text-og-xs leading-[1.125rem] text-og-fg [overflow-wrap:anywhere]\"\n >\n {option.preview}\n </span>\n ) : null}\n </span>\n </label>\n );\n })}\n {choiceOffersOther(question) ? (\n <div className={choiceRowClass(draft.otherSelected, false)}>\n <input\n id={otherChoiceId}\n type={question.kind === \"single_select\" ? \"radio\" : \"checkbox\"}\n name={question.kind === \"single_select\" ? fieldId : undefined}\n aria-labelledby={otherLabelId}\n checked={draft.otherSelected}\n autoFocus={autoFocus && firstOption && question.options.length === 0}\n onChange={(event) =>\n onUpdate((current) => ({\n ...current,\n otherSelected: event.target.checked,\n ...(question.kind === \"single_select\" && event.target.checked\n ? { values: [] }\n : {}),\n }))\n }\n className=\"sr-only\"\n />\n <label htmlFor={otherChoiceId} className=\"cursor-pointer\">\n <ChoiceIndicator\n multiple={question.kind !== \"single_select\"}\n checked={draft.otherSelected}\n />\n <span id={otherLabelId} className=\"sr-only\">\n {messages.other}\n </span>\n </label>\n <span className=\"min-w-0 flex-1\">\n <label htmlFor={otherTextId} className=\"sr-only\">\n {t(\"humanInputForm.otherAnswerForVisiblelabel\", {\n other: messages.other,\n visibleLabel,\n })}\n </label>\n <input\n id={otherTextId}\n type=\"text\"\n value={draft.other}\n disabled={busy}\n placeholder={t(\"humanInputForm.somethingElse\")}\n onClick={() => onUpdate(selectOtherDraft)}\n onFocus={() => onUpdate(selectOtherDraft)}\n onChange={(event) => {\n const other = event.target.value;\n onUpdate((current) => ({\n ...selectOtherDraft(current),\n other,\n }));\n }}\n className=\"block w-full min-w-0 bg-transparent p-0 text-og-sm font-medium leading-5 text-og-fg outline-hidden placeholder:font-normal placeholder:text-og-fg-subtle disabled:opacity-50 pointer-coarse:text-[16px]\"\n />\n </span>\n </div>\n ) : null}\n </div>\n )}\n {/* A secret field shows its error under the input, above Save to. */}\n {error && !(question.kind === \"secret\" && question.secret) ? (\n <p id={errorId} role=\"alert\" className=\"text-og-xs text-og-status-failed\">\n {error}\n </p>\n ) : null}\n </>\n );\n}\n\n/** One answer row: the whole row is the target, the selected row is outlined. */\nfunction choiceRowClass(checked: boolean, clickable: boolean): string {\n return cn(\n \"flex min-w-0 items-start gap-3 rounded-og-md border px-3.5 py-3 text-og-fg transition-[border-color,background-color,box-shadow] duration-150\",\n \"has-[:focus-visible]:ring-2 has-[:focus-visible]:ring-og-accent/40\",\n clickable && \"cursor-pointer\",\n checked\n ? \"border-og-fg/70 bg-og-fg/[0.035] shadow-[inset_0_0_0_1px_var(--color-og-fg)]\"\n : \"border-og-border hover:border-og-border-strong hover:bg-og-hover\",\n );\n}\n\nfunction ChoiceIndicator({ multiple, checked }: { multiple: boolean; checked: boolean }) {\n return (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"mt-px grid size-[18px] shrink-0 place-items-center border transition-colors duration-150\",\n multiple ? \"rounded-[5px]\" : \"rounded-full\",\n checked ? \"border-og-fg bg-og-fg text-og-bg\" : \"border-og-border-strong bg-og-surface-1\",\n )}\n >\n {checked ? (\n multiple ? (\n <CheckIcon className=\"size-3\" strokeWidth={3} />\n ) : (\n <span className=\"size-1.5 rounded-full bg-og-bg\" />\n )\n ) : null}\n </span>\n );\n}\n","import type {\n GeneratePasswordSpec,\n HumanInputQuestion,\n HumanInputSecretSaveTo,\n HumanInputSecretSpec,\n} from \"@opengeni/sdk\";\nimport { EyeIcon, EyeOffIcon, TriangleAlertIcon } from \"lucide-react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n resolveSecretSaveTo,\n secretAutocomplete,\n secretCanGenerate,\n secretConcealed,\n secretFieldLabel,\n secretInputMode,\n secretPatternMismatch,\n secretVaultForTarget,\n type HumanInputFormMessages,\n type SecretFieldReading,\n} from \"../human-input-model\";\nimport { cn } from \"../lib/cn\";\nimport { useSecretsUi } from \"../secrets-ui\";\nimport { useOpenGeniText } from \"../messages/runtime\";\n\n/** Read and clear one secret field at submit time; the value never enters React state. */\nexport type SecretFieldHandle = {\n read: () => SecretFieldReading;\n clear: () => void;\n focus: () => void;\n};\n\nconst INPUT_CLASS =\n \"h-10 w-full min-w-0 rounded-og-md border border-og-border bg-og-surface-1 px-3 text-og-sm text-og-fg outline-hidden placeholder:text-og-fg-subtle focus:border-og-accent disabled:opacity-50 pointer-coarse:h-11\";\n\nexport type SecretQuestionFieldProps = {\n question: HumanInputQuestion & { secret: HumanInputSecretSpec };\n fieldId: string;\n messages: HumanInputFormMessages;\n autoFocus: boolean;\n /** Save to targets this person may write. Defaults to all three. */\n allowedSaveTo?: readonly HumanInputSecretSaveTo[] | undefined;\n error?: string | undefined;\n /** Question prompt chrome rendered by the form (multi-question cards). */\n describedBy?: string | undefined;\n register: (handle: SecretFieldHandle | null) => void;\n /** The person changed the field: clears a stale validation error. */\n onEdited: () => void;\n};\n\n/**\n * The ask card's secret field: an uncontrolled password input (read through a\n * ref, so the value never reaches React state, props, logs or storage) with\n * show/hide, optional Generate, an optional username placed first so password\n * managers pair the two, soft `looksLike`/`pattern` hints, and Save to.\n */\nexport function SecretQuestionField({\n question,\n fieldId,\n messages,\n autoFocus,\n allowedSaveTo,\n error,\n describedBy,\n register,\n onEdited,\n}: SecretQuestionFieldProps) {\n const t = useOpenGeniText();\n const spec = question.secret;\n const ui = useSecretsUi();\n const inputRef = useRef<HTMLInputElement | null>(null);\n const usernameRef = useRef<HTMLInputElement | null>(null);\n const saveToChoice = resolveSecretSaveTo(spec, allowedSaveTo);\n const [saveTo, setSaveTo] = useState<HumanInputSecretSaveTo>(saveToChoice.initial);\n const saveToRef = useRef(saveTo);\n saveToRef.current = saveTo;\n const [revealed, setRevealed] = useState(false);\n /** No client generator: the server generates, nothing is typed. */\n const [serverGenerate, setServerGenerate] = useState<GeneratePasswordSpec | null>(null);\n const serverGenerateRef = useRef(serverGenerate);\n serverGenerateRef.current = serverGenerate;\n const [patternMismatch, setPatternMismatch] = useState(false);\n const [touched, setTouched] = useState(false);\n\n const concealed = secretConcealed(spec);\n const canGenerate = secretCanGenerate(spec);\n const autoComplete = secretAutocomplete(spec);\n const inputMode = secretInputMode(spec);\n const label = secretFieldLabel(t, spec);\n const inputId = `${fieldId}-secret`;\n const usernameId = `${fieldId}-username`;\n const saveToId = `${fieldId}-save-to`;\n const hintId = `${fieldId}-looks-like`;\n const warningId = `${fieldId}-pattern`;\n const errorId = `${fieldId}-error`;\n const vaultHintId = `${fieldId}-vault`;\n const downgradeId = `${fieldId}-downgrade`;\n const vault = secretVaultForTarget(spec, saveTo);\n const showWarning = patternMismatch && touched && !serverGenerate;\n\n // A callback ref clears an input as it leaves the DOM (unmount, or the\n // server-generate swap), so the browser never keeps a detached value.\n const attachInput = useCallback((node: HTMLInputElement | null) => {\n if (!node && inputRef.current) inputRef.current.value = \"\";\n inputRef.current = node;\n }, []);\n\n const checkPattern = useCallback(() => {\n setPatternMismatch(secretPatternMismatch(spec.pattern, inputRef.current?.value ?? \"\"));\n }, [spec.pattern]);\n\n useEffect(() => {\n register({\n read: () => ({\n value: serverGenerateRef.current ? null : inputRef.current?.value || null,\n generate: serverGenerateRef.current,\n username: usernameRef.current?.value ?? null,\n saveTo: saveToRef.current,\n }),\n clear: () => {\n if (inputRef.current) inputRef.current.value = \"\";\n setRevealed(false);\n setPatternMismatch(false);\n },\n focus: () => (inputRef.current ?? usernameRef.current)?.focus({ preventScroll: true }),\n });\n return () => register(null);\n }, [register]);\n\n const generate = () => {\n onEdited();\n if (ui) {\n const input = inputRef.current;\n if (!input) return;\n try {\n input.value = ui.generatePassword(spec.generate ?? undefined);\n setRevealed(true);\n setTouched(true);\n checkPattern();\n return;\n } catch {\n // A spec the client generator rejects: let the server generate it.\n }\n }\n setServerGenerate(spec.generate ?? {});\n setRevealed(false);\n };\n\n const undoServerGenerate = () => {\n onEdited();\n setServerGenerate(null);\n requestAnimationFrame(() => inputRef.current?.focus({ preventScroll: true }));\n };\n\n const inputDescribedBy =\n [\n describedBy,\n spec.looksLike ? hintId : null,\n showWarning ? warningId : null,\n error ? errorId : null,\n ]\n .filter(Boolean)\n .join(\" \") || undefined;\n const focusUsername = autoFocus && Boolean(spec.username) && !spec.username?.value;\n\n return (\n <div className=\"flex min-w-0 flex-col gap-3\" data-secret-question={question.id}>\n {spec.username ? (\n <div className=\"flex min-w-0 flex-col gap-1.5\">\n <label htmlFor={usernameId} className=\"text-og-sm font-medium text-og-fg\">\n {spec.username.prompt}\n </label>\n <input\n ref={usernameRef}\n id={usernameId}\n name=\"username\"\n type=\"text\"\n autoComplete=\"username\"\n autoCapitalize=\"none\"\n autoCorrect=\"off\"\n spellCheck={false}\n defaultValue={spec.username.value ?? \"\"}\n autoFocus={focusUsername}\n className={INPUT_CLASS}\n />\n </div>\n ) : null}\n\n <div className=\"flex min-w-0 flex-col gap-1.5\">\n <label\n htmlFor={serverGenerate ? undefined : inputId}\n className=\"text-og-sm font-medium text-og-fg\"\n >\n {label}\n </label>\n {serverGenerate ? (\n <div\n className=\"flex min-h-10 items-center gap-2 rounded-og-md border border-dashed border-og-border px-3 text-og-sm text-og-fg pointer-coarse:min-h-11\"\n data-secret-server-generate=\"\"\n >\n <span role=\"status\" className=\"min-w-0 flex-1\">\n {messages.secretWillGenerate}\n </span>\n <button\n type=\"button\"\n onClick={undoServerGenerate}\n className=\"og-link inline-flex min-h-10 shrink-0 items-center text-og-sm pointer-coarse:min-h-11\"\n >\n {messages.secretUndo}\n </button>\n </div>\n ) : (\n <div className=\"flex min-w-0 items-center gap-2\">\n <div className=\"relative min-w-0 flex-1\">\n <input\n ref={attachInput}\n id={inputId}\n name={`secret-${question.id}`}\n type={concealed && !revealed ? \"password\" : \"text\"}\n autoComplete={autoComplete}\n inputMode={inputMode}\n autoCapitalize=\"none\"\n autoCorrect=\"off\"\n spellCheck={false}\n autoFocus={autoFocus && !focusUsername}\n aria-invalid={Boolean(error)}\n aria-describedby={inputDescribedBy}\n aria-required={question.required || undefined}\n onInput={() => {\n onEdited();\n checkPattern();\n }}\n onBlur={() => {\n setTouched(true);\n checkPattern();\n }}\n className={cn(\n INPUT_CLASS,\n concealed && \"pr-11 pointer-coarse:pr-12\",\n revealed && \"font-og-mono\",\n )}\n />\n {concealed ? (\n <button\n type=\"button\"\n aria-pressed={revealed}\n aria-label={revealed ? messages.secretHide : messages.secretShow}\n aria-controls={inputId}\n title={revealed ? messages.secretHide : messages.secretShow}\n onClick={() => setRevealed((value) => !value)}\n className=\"absolute inset-y-0 right-0 inline-flex w-10 items-center justify-center rounded-r-og-md text-og-fg-muted transition-colors hover:text-og-fg focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-og-accent/55 pointer-coarse:w-11\"\n >\n {revealed ? (\n <EyeOffIcon aria-hidden=\"true\" className=\"size-4\" />\n ) : (\n <EyeIcon aria-hidden=\"true\" className=\"size-4\" />\n )}\n </button>\n ) : null}\n </div>\n {canGenerate ? (\n <button\n type=\"button\"\n onClick={generate}\n className=\"inline-flex h-10 shrink-0 items-center rounded-og-md border border-og-border bg-og-surface-1 px-3 text-og-sm font-medium text-og-fg transition-colors hover:bg-og-hover disabled:opacity-50 pointer-coarse:h-11\"\n >\n {messages.secretGenerate}\n </button>\n ) : null}\n </div>\n )}\n {spec.looksLike && !serverGenerate ? (\n <p id={hintId} className=\"text-og-xs text-og-fg-muted\">\n {messages.secretLooksLike(spec.looksLike)}\n </p>\n ) : null}\n {showWarning ? (\n <p id={warningId} className=\"flex items-start gap-1.5 text-og-xs text-og-fg\">\n <TriangleAlertIcon\n aria-hidden=\"true\"\n className=\"mt-px size-3.5 shrink-0 text-og-status-running\"\n />\n <span>{messages.secretPatternWarning(spec.looksLike ?? null)}</span>\n </p>\n ) : null}\n {error ? (\n <p id={errorId} role=\"alert\" className=\"text-og-xs text-og-status-failed\">\n {error}\n </p>\n ) : null}\n </div>\n\n <div className=\"flex min-w-0 flex-col gap-1\">\n <div className=\"flex min-w-0 flex-wrap items-center gap-x-3 gap-y-1.5\">\n <label htmlFor={saveToId} className=\"text-og-sm font-medium text-og-fg\">\n {messages.secretSaveTo}\n </label>\n <select\n id={saveToId}\n value={saveTo}\n onChange={(event) => setSaveTo(event.target.value as HumanInputSecretSaveTo)}\n aria-describedby={\n [vaultHintId, saveToChoice.downgraded ? downgradeId : null]\n .filter(Boolean)\n .join(\" \") || undefined\n }\n className=\"h-10 min-w-[10rem] cursor-pointer rounded-og-md border border-og-border bg-og-surface-1 px-2.5 text-og-sm text-og-fg outline-hidden focus:border-og-accent disabled:opacity-50 pointer-coarse:h-11\"\n >\n {saveToChoice.options.map((option) => (\n <option key={option} value={option}>\n {messages.secretSaveToOptions[option]}\n </option>\n ))}\n </select>\n <span id={vaultHintId} className=\"min-w-0 text-og-xs text-og-fg-muted\">\n {messages.secretVaultHint(saveTo, vault)}\n </span>\n </div>\n {saveToChoice.downgraded ? (\n <p id={downgradeId} className=\"text-og-xs text-og-fg-muted\">\n {messages.secretSaveToDowngraded(saveToChoice.requested, saveToChoice.initial)}\n </p>\n ) : null}\n </div>\n </div>\n );\n}\n","import type { SessionHumanInputRequest, SubmitHumanInputResponseRequest } from \"@opengeni/sdk\";\nimport { useEffect, useMemo, useRef } from \"react\";\nimport { isActionableHumanInputRequest } from \"../human-input\";\nimport { cn } from \"../lib/cn\";\nimport {\n HumanInputForm,\n type HumanInputFormMessages,\n type HumanInputFormProps,\n} from \"./human-input-form\";\n\nexport type HumanInputSurfaceProps = {\n loadSkillReview?: HumanInputFormProps[\"loadSkillReview\"];\n requests: SessionHumanInputRequest[];\n onSubmit: (requestId: string, response: SubmitHumanInputResponseRequest) => void | Promise<void>;\n respondingRequestId?: string | null | undefined;\n error?: string | null | undefined;\n messages?: Partial<HumanInputFormMessages> | undefined;\n className?: string | undefined;\n /** Forwarded to the active form. Defaults true. */\n autoFocus?: boolean | undefined;\n /** Forwarded to the active form: yes/no decisions as two buttons. */\n decisionButtons?: boolean | undefined;\n /** Forwarded to the active form: where secret answers may be saved. */\n allowedSaveTo?: HumanInputFormProps[\"allowedSaveTo\"];\n /** Forwarded to the active form: start as its compact bar (drafts kept). */\n defaultCollapsed?: boolean | undefined;\n /**\n * Hand the active request to another agent instead of letting the asking\n * agent decide (see HumanInputForm `onLetAgentDecide`); `false` hides it.\n */\n onLetAgentDecide?:\n | ((request: SessionHumanInputRequest) => void | Promise<void>)\n | false\n | undefined;\n /** Requests an agent was asked to decide: their card says so. */\n agentDecidingRequestIds?: ReadonlySet<string> | undefined;\n};\n\n/**\n * One decision shell for pending structured human-input requests. Parallel\n * freezes are shown one at a time (oldest first) as “N of M”; Send answers/Skip\n * settles the active request and the next remaining set advances automatically\n * when the authoritative pending list updates.\n */\nexport function HumanInputSurface({\n requests,\n onSubmit,\n loadSkillReview,\n respondingRequestId = null,\n error,\n messages,\n className,\n autoFocus = true,\n decisionButtons,\n allowedSaveTo,\n defaultCollapsed,\n onLetAgentDecide,\n agentDecidingRequestIds,\n}: HumanInputSurfaceProps) {\n const batchTotalRef = useRef(0);\n\n const ordered = useMemo(() => {\n const now = Date.now();\n return requests\n .filter((request) => isActionableHumanInputRequest(request, now))\n .sort((a, b) => {\n const aAt = a.createdAt ? Date.parse(a.createdAt) : 0;\n const bAt = b.createdAt ? Date.parse(b.createdAt) : 0;\n if (aAt !== bAt) return aAt - bAt;\n return a.id.localeCompare(b.id);\n });\n }, [requests]);\n\n useEffect(() => {\n if (ordered.length === 0) {\n batchTotalRef.current = 0;\n return;\n }\n batchTotalRef.current =\n batchTotalRef.current === 0\n ? ordered.length\n : Math.max(batchTotalRef.current, ordered.length);\n }, [ordered]);\n\n if (ordered.length === 0) return null;\n\n const active = ordered[0]!;\n const batchTotal = Math.max(batchTotalRef.current, ordered.length);\n const position = batchTotal - ordered.length + 1;\n const progressLabel = batchTotal > 1 ? `${position} of ${batchTotal}` : null;\n\n const formProps: HumanInputFormProps = {\n request: active,\n loadSkillReview,\n submitting: respondingRequestId !== null,\n error: error ?? null,\n progressLabel,\n autoFocus,\n decisionButtons,\n allowedSaveTo,\n defaultCollapsed,\n ...(messages ? { messages } : {}),\n ...(onLetAgentDecide === false\n ? { onLetAgentDecide: false }\n : onLetAgentDecide\n ? { onLetAgentDecide: () => onLetAgentDecide(active) }\n : {}),\n agentDeciding: agentDecidingRequestIds?.has(active.id) ?? false,\n onSubmit: (response) => onSubmit(active.id, response),\n };\n\n return (\n <div className={cn(\"w-full\", className)} data-human-input-surface=\"\">\n <HumanInputForm {...formProps} />\n </div>\n );\n}\n","import { Component, useState, type ErrorInfo, type ReactNode } from \"react\";\nimport { isChunkLoadError } from \"../lib/chunk-load-error\";\nimport { LoadFailureNotice } from \"./load-failure-notice\";\nimport { useOpenGeniText } from \"../messages/runtime\";\n\ntype ConversationRenderBoundaryProps = {\n /** A change (another session or workspace) clears a previous failure. */\n resetKey: string;\n children: ReactNode;\n};\n\ntype BoundaryState = { failed: boolean; notLoaded: boolean; resetKey: string };\n\n/**\n * Contains a rendering error inside the chat. Without it, one bad payload or\n * an incompatible host response unmounts the whole embedding page (a blank\n * Site or dashboard). Try again remounts the chat with fresh data. Code that\n * failed to download asks for a reload instead: remounting reuses the failed\n * import.\n */\nexport function ConversationRenderBoundary({\n resetKey,\n children,\n}: ConversationRenderBoundaryProps) {\n const [attempt, setAttempt] = useState(0);\n return (\n <Boundary resetKey={`${resetKey}:${attempt}`} onRetry={() => setAttempt((value) => value + 1)}>\n {children}\n </Boundary>\n );\n}\n\nclass Boundary extends Component<\n { resetKey: string; onRetry: () => void; children: ReactNode },\n BoundaryState\n> {\n state: BoundaryState = { failed: false, notLoaded: false, resetKey: this.props.resetKey };\n\n static getDerivedStateFromError(error: unknown): Partial<BoundaryState> {\n return { failed: true, notLoaded: isChunkLoadError(error) };\n }\n\n static getDerivedStateFromProps(\n props: { resetKey: string },\n state: BoundaryState,\n ): Partial<BoundaryState> | null {\n return props.resetKey !== state.resetKey\n ? { failed: false, notLoaded: false, resetKey: props.resetKey }\n : null;\n }\n\n componentDidCatch(error: unknown, info: ErrorInfo): void {\n console.error(\"Opengeni chat failed to render\", error, info.componentStack);\n }\n\n render(): ReactNode {\n if (!this.state.failed) return this.props.children;\n return this.state.notLoaded ? (\n <LoadFailureNotice variant=\"block\" />\n ) : (\n <ConversationRenderError onRetry={this.props.onRetry} />\n );\n }\n}\n\nfunction ConversationRenderError({ onRetry }: { onRetry: () => void }) {\n const t = useOpenGeniText();\n return (\n <div\n role=\"alert\"\n data-og-conversation-render-error=\"\"\n className=\"flex min-h-0 flex-1 flex-col items-center justify-center gap-3 px-6 py-8 text-center\"\n >\n <p className=\"max-w-sm text-og-base text-og-fg-muted\">\n {t(\"conversationRenderBoundary.chatUnavailable\")}\n </p>\n <button\n type=\"button\"\n onClick={onRetry}\n className=\"inline-flex min-h-9 items-center rounded-og-md border border-og-border bg-og-surface-1 px-3 py-1.5 text-og-sm font-medium text-og-fg hover:bg-og-surface-2\"\n >\n {t(\"conversationRenderBoundary.tryAgain\")}\n </button>\n </div>\n );\n}\n","import type { SessionEvent } from \"@opengeni/sdk\";\nimport { useEffect, useRef } from \"react\";\n\n/**\n * `onEvent` for each event newer than any seen since the history first\n * loaded. The first ready read only sets where \"new\" starts, so loading the\n * history, an older page or a reconnect's replay calls nothing again.\n */\nexport function useLiveSessionEvents(\n sessionId: string | null,\n events: readonly SessionEvent[],\n ready: boolean,\n onEvent: ((event: SessionEvent) => void) | undefined,\n): void {\n const callback = useRef(onEvent);\n callback.current = onEvent;\n const seen = useRef<{ sessionId: string | null; sequence: number | null }>({\n sessionId,\n sequence: null,\n });\n useEffect(() => {\n if (seen.current.sessionId !== sessionId) seen.current = { sessionId, sequence: null };\n if (!ready || sessionId === null) return;\n const previous = seen.current.sequence;\n const newest = events.reduce((max, event) => Math.max(max, event.sequence), previous ?? 0);\n seen.current = { sessionId, sequence: newest };\n if (previous === null) return;\n const fresh = events\n .filter((event) => event.sequence > previous)\n .sort((a, b) => a.sequence - b.sequence);\n for (const event of fresh) callback.current?.(event);\n }, [events, ready, sessionId]);\n}\n","import type { GeneratedVideoReceipt, VideoArtifactPlaybackSource } from \"@opengeni/sdk\";\nimport { useEffect, useState } from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { useErrorMessage } from \"../lib/error-message\";\nimport type { VideoArtifactPlaybackLoader } from \"../timeline\";\nimport { useOpenGeniText } from \"../messages/runtime\";\n\nexport type GeneratedVideoPlayerProps = {\n receipt: GeneratedVideoReceipt;\n loadPlaybackSource: VideoArtifactPlaybackLoader;\n className?: string | undefined;\n label?: string | undefined;\n};\n\ntype SourceState =\n | { kind: \"loading\" }\n | { kind: \"ready\"; source: VideoArtifactPlaybackSource }\n | { kind: \"error\"; message: string };\n\n/** Native, Range-based playback. Video bytes never pass through React or the SDK heap. */\nexport function GeneratedVideoPlayer({\n receipt,\n loadPlaybackSource,\n className,\n label: labelProp,\n}: GeneratedVideoPlayerProps) {\n const t = useOpenGeniText();\n const label = labelProp === undefined ? t(\"generatedVideoPlayer.generatedVideo\") : labelProp;\n const formatError = useErrorMessage();\n const [retry, setRetry] = useState(0);\n const [state, setState] = useState<SourceState>({ kind: \"loading\" });\n\n useEffect(() => {\n const controller = new AbortController();\n setState({ kind: \"loading\" });\n void loadPlaybackSource(receipt.artifact.artifactId, controller.signal).then(\n (source) => {\n if (!controller.signal.aborted) setState({ kind: \"ready\", source });\n },\n (error: unknown) => {\n if (controller.signal.aborted) return;\n setState({\n kind: \"error\",\n message: formatError(error),\n });\n },\n );\n return () => controller.abort();\n }, [loadPlaybackSource, receipt.artifact.artifactId, retry, formatError]);\n\n if (state.kind === \"loading\") {\n return (\n <div\n aria-label={t(\"generatedVideoPlayer.loadingLowercase\", { lowerCase: label.toLowerCase() })}\n className={cn(\n \"aspect-video w-full animate-pulse rounded-og-md bg-og-surface-2 motion-reduce:animate-none\",\n className,\n )}\n />\n );\n }\n if (state.kind === \"error\") {\n return (\n <div\n role=\"status\"\n className={cn(\n \"rounded-og-md border border-og-status-failed/30 bg-og-status-failed/5 px-3 py-2 text-og-sm text-og-status-failed\",\n className,\n )}\n >\n {state.message}\n </div>\n );\n }\n\n return (\n <video\n key={state.source.url}\n aria-label={label}\n className={cn(\n \"max-h-[32rem] w-full rounded-og-md bg-black object-contain shadow-sm\",\n className,\n )}\n controls\n playsInline\n preload=\"metadata\"\n src={state.source.url}\n onError={() => {\n if (retry === 0) setRetry(1);\n else setState({ kind: \"error\", message: t(\"generatedVideoPlayer.videoPlaybackFailed\") });\n }}\n />\n );\n}\n","import { renderActivity } from \"./activity-rail\";\nimport { AnimatePresence, motion, useReducedMotion } from \"motion/react\";\nimport { Suspense, useEffect, useState } from \"react\";\nimport { CompactActivityContext } from \"./shared\";\nimport { defaultToolRegistry } from \"./tool-renderers\";\nimport type { ToolRegistry } from \"./registry\";\nimport { toolDisplayName } from \"./tool-display-name\";\nimport { ToolKindIcon } from \"./tool-icon\";\nimport { genericToolIconKind } from \"./tool-presentation\";\nimport { toolStepPhase } from \"./tool-steps\";\nimport type { ActivityItem } from \"./types\";\nimport { rollingActivityItem } from \"./work-presentation\";\nimport { useOpenGeniText } from \"../messages/runtime\";\n\n/** One stable viewport; updates replace its content without moving the conversation. */\nexport function RollingActivity({\n items,\n toolRegistry = defaultToolRegistry,\n previousItem,\n showCount = true,\n}: {\n items: ActivityItem[];\n /** The standalone item visible immediately before this reel mounted. */\n previousItem?: ActivityItem | undefined;\n toolRegistry?: ToolRegistry;\n /** Show \"+N earlier\"; off when an enclosing status line already counts steps. */\n showCount?: boolean;\n}) {\n const t = useOpenGeniText();\n const reduced = useReducedMotion();\n const [mounted, setMounted] = useState(false);\n useEffect(() => setMounted(true), []);\n // Progress notes have their own line in the status row; the reel shows steps, advancing\n // with the event order so finishing a parallel tool never replays an older one.\n const selected = rollingActivityItem(items, previousItem, mounted);\n if (!selected) return null;\n const { item, earlierCount } = selected;\n const fallback = (\n <span className=\"og-rolling-label\">\n <ToolKindIcon\n kind={item.kind === \"tool-call\" ? genericToolIconKind(item.name) : \"wrench\"}\n className=\"size-3.5\"\n />\n <span>\n {item.kind === \"tool-call\"\n ? toolDisplayName(t, item.name, item.display, toolStepPhase(item.status))\n : t(\"timeline.rollingActivity.working\")}\n </span>\n </span>\n );\n return (\n <span className=\"og-rolling-status\" data-running={selected.running ? \"true\" : undefined}>\n <span className=\"sr-only\">\n {item.kind === \"tool-call\"\n ? toolDisplayName(t, item.name, item.display, toolStepPhase(item.status))\n : item.kind === \"reasoning\"\n ? t(\"timeline.rollingActivity.thinking\")\n : t(\"timeline.rollingActivity.working\")}\n </span>\n <span className=\"og-rolling-window\" aria-hidden=\"true\">\n <AnimatePresence initial={false} mode=\"sync\">\n <motion.span\n key={item.id}\n className=\"og-rolling-face\"\n initial={{\n opacity: 0,\n y: reduced ? 0 : 24,\n }}\n animate={{ opacity: 1, y: 0 }}\n exit={{\n opacity: 0,\n y: reduced ? 0 : -24,\n }}\n transition={{ duration: reduced ? 0 : 0.4, ease: [0.22, 1, 0.36, 1] }}\n >\n <CompactActivityContext.Provider value={true}>\n <Suspense fallback={fallback}>\n {renderActivity(t, item, toolRegistry, undefined, undefined, undefined, undefined)}\n </Suspense>\n </CompactActivityContext.Provider>\n </motion.span>\n </AnimatePresence>\n </span>\n {showCount && earlierCount > 0 ? (\n <span className=\"og-rolling-count\">{`+${earlierCount} earlier`}</span>\n ) : null}\n </span>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { useOpenGeniText } from \"../messages/runtime\";\nimport type { TurnStepsItem } from \"./types\";\n\n/**\n * Loads an opened turn's steps. Mounted only inside an open work row, so a\n * turn's steps are read when a reader opens it, newest first, and kept while\n * it stays open. A row that opens by itself (`autoLoad={false}`, for example\n * a failed turn or one with an image) waits for the reader to ask.\n */\nexport function TurnStepsLoader({\n steps,\n autoLoad = true,\n}: {\n steps: TurnStepsItem;\n autoLoad?: boolean | undefined;\n}) {\n const { state, load, retain } = steps;\n const [requested, setRequested] = useState(autoLoad);\n // An open row keeps its steps (live ones too) while mounted; only the\n // read waits for the reader.\n useEffect(() => retain(), [retain]);\n useEffect(() => {\n if (requested && state === \"idle\") load();\n }, [requested, state, load]);\n const ask = () => {\n setRequested(true);\n if (state !== \"idle\") load();\n };\n return <TurnStepsStatus steps={steps} onLoad={requested ? undefined : ask} />;\n}\n\n/**\n * Timelines without readable turn rows place this at the turn's start: its\n * steps load when the reader asks, and are kept from then on.\n */\nexport function TurnStepsAction({ steps }: { steps: TurnStepsItem }) {\n const release = useRef<(() => void) | null>(null);\n useEffect(() => () => release.current?.(), []);\n const load = () => {\n release.current ??= steps.retain();\n steps.load();\n };\n return <TurnStepsStatus steps={steps} onLoad={load} />;\n}\n\nfunction TurnStepsStatus({\n steps,\n onLoad,\n}: {\n steps: TurnStepsItem;\n onLoad?: (() => void) | undefined;\n}) {\n const t = useOpenGeniText();\n const { state } = steps;\n const load = onLoad ?? steps.load;\n if (state === \"complete\") return null;\n // An opened row loads by itself; elsewhere the reader asks.\n if (state === \"partial\" || (state === \"idle\" && onLoad)) {\n return (\n <div data-og-turn-steps={state} className=\"py-1\">\n <button\n type=\"button\"\n onClick={load}\n className=\"rounded-og-sm px-1.5 py-0.5 text-og-sm text-og-fg-subtle transition-colors hover:bg-og-surface-1 hover:text-og-fg\"\n >\n {state === \"idle\"\n ? t(\"timeline.turnSteps.showSteps\")\n : t(\"timeline.turnSteps.showEarlierSteps\")}\n </button>\n </div>\n );\n }\n if (state === \"error\") {\n return (\n <div data-og-turn-steps=\"error\" className=\"flex items-center gap-2 py-1 text-og-sm\">\n <span className=\"text-og-fg-subtle\">{t(\"timeline.turnSteps.couldNotLoadSteps\")}</span>\n <button\n type=\"button\"\n onClick={load}\n className=\"rounded-og-sm px-1.5 py-0.5 text-og-fg-muted transition-colors hover:bg-og-surface-1 hover:text-og-fg\"\n >\n {t(\"timeline.turnSteps.retry\")}\n </button>\n </div>\n );\n }\n return (\n <div\n data-og-turn-steps=\"loading\"\n role=\"status\"\n className=\"animate-og-pulse py-1 text-og-sm text-og-fg-subtle motion-reduce:animate-none\"\n >\n {t(\"timeline.turnSteps.loadingSteps\")}\n </div>\n );\n}\n","import { QUESTION_NAV_MARGIN_PX, questionNavTarget } from \"../timeline/question-nav-model\";\nimport { timelineGroupIndexAtSequence } from \"../timeline/focus-sequence\";\nimport { RollingActivity } from \"../timeline/rolling-activity\";\nimport {\n clusterIsSettled,\n compactedLandmarkCount,\n durationBetween,\n flattenActivityItems,\n isPreparingWork,\n timelineTurnsWithOutput,\n readableWorkDefaultOpen,\n readableWorkHasDetails,\n readableWorkShowsPreview,\n readableWorkStatus,\n} from \"../timeline/work-presentation\";\nimport { useErrorMessage } from \"../lib/error-message\";\nimport { formatElapsed } from \"../timeline/turn-summary\";\nimport { ActivityNoteTextContext } from \"../timeline/activity-rail\";\nimport { TurnStepsAction, TurnStepsLoader } from \"../timeline/turn-steps\";\nimport { timelineGroupContainsPresentedImage } from \"../timeline/presented-image\";\nimport {\n isTimelineSearchTarget,\n TimelineSearchRevealContext,\n useTimelineSearchNavigation,\n type TimelineSearchTarget,\n} from \"./timeline-search\";\nimport { GenieLoadingOptionsContext, type GenieLoadingOptions } from \"../timeline/genie-loading\";\nimport { ChildSessionLink } from \"./child-session-link\";\nimport { useStartupDetails } from \"../timeline/startup-preference\";\nimport {\n compactionFailureDetails,\n compactionSkipSubtitle,\n compactionSkipTitle,\n} from \"../timeline/compaction-copy\";\nimport type {\n DraftTimelineAnnotation,\n MediaGenerationResult,\n SessionEvent,\n SessionStatus,\n} from \"@opengeni/sdk\";\nimport { dequal } from \"dequal/lite\";\nimport {\n ArrowDownIcon,\n ArrowRightIcon,\n ArrowUpIcon,\n BotIcon,\n CheckCircle2Icon,\n CheckIcon,\n ChevronDownIcon,\n ChevronRightIcon,\n CornerDownRightIcon,\n PauseCircleIcon,\n PauseIcon,\n MessageCircleQuestionIcon,\n PencilLineIcon,\n PlayIcon,\n ShrinkIcon,\n TargetIcon,\n Trash2Icon,\n TriangleAlertIcon,\n XCircleIcon,\n} from \"lucide-react\";\nimport type { ComponentType, CSSProperties } from \"react\";\nimport { AnimatePresence, motion, useReducedMotion } from \"motion/react\";\nimport {\n Component,\n Fragment,\n createContext,\n lazy,\n memo,\n useCallback,\n useContext,\n useEffect,\n useId,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { inertProps } from \"../lib/inert\";\nimport {\n MessageSenderContext,\n MessageSenderSlot,\n type RenderMessageSender,\n} from \"../timeline/message-sender\";\nimport { formatClockTime, formatRelativeTime, truncate } from \"../lib/format\";\nimport { prefersReducedMotion } from \"../lib/motion\";\nimport { copySelectionWithoutPageStyles } from \"../lib/selection-clipboard\";\nimport {\n invokeOlderHistoryLoaderWithReceiptCapture,\n type OlderHistoryLoadReceipt,\n type OlderHistoryLoader,\n} from \"../older-history\";\nimport { InlineMarkdown, Markdown, type MarkdownProps } from \"./markdown\";\nimport { OpenGeniLinkProvider, type OpenGeniLinkResolver } from \"./open-geni-links\";\nimport {\n TimelineBeforeLayout,\n captureTimelineAnchor,\n timelineAnchorCorrection,\n timelineHasReader,\n type TimelineAnchor,\n} from \"./timeline-anchor\";\nimport { useReadingProgress } from \"./timeline-reading-progress\";\nimport { TimelineAnswerFollowContext } from \"./timeline-answer-follow\";\nimport {\n animateTimelineSettlement,\n captureTimelineSettlement,\n type TimelineSettlement,\n} from \"./timeline-settlement\";\nimport {\n UserMessageBody,\n UserMessageDisclosureProvider,\n type UserMessageDisclosureContextValue,\n type UserMessageDisclosureLabels,\n} from \"./user-message-body\";\nimport {\n createTipFollowState,\n readerScrollUpPx,\n tipFollowCancel,\n tipFollowCompensateViewportShrink,\n tipFollowObserveContentShrink,\n tipFollowStep,\n supportsScrollEndEvent,\n TIP_FOLLOW_READER_UP_EPS_PX,\n TIP_FOLLOW_SHRINK_EPS_PX,\n type TipFollowContentShrinkBaseline,\n type TipFollowState,\n} from \"./tip-follow\";\nimport {\n ActivityRail,\n buildTimeline,\n defaultToolRegistry,\n groupTimeline,\n LightboxProvider,\n type ActivityItem,\n type AgentMessageItem,\n type AuthNeededItem,\n type ContextCompactionItem,\n type GoalItem,\n type HumanInputItem,\n type MachineInputBatchItem,\n type NoticeItem,\n type TimelineGroup,\n type TimelineItem,\n type TimelineAnnotationSourceDescriptor,\n type RetainedArtifactLoader,\n type RetainedScreenshotLoader,\n type VideoArtifactPlaybackLoader,\n type ToolRegistry,\n type TurnSummaryOptions,\n type TurnSummaryStatus,\n type UserMessageItem,\n type FoldRestingState,\n type WorkerCompletionItem,\n ActivityDisclosure,\n FoldMemoryProvider,\n inheritFoldRestingState,\n TurnSummary,\n useFoldMemory,\n useTurnSettleOpen,\n} from \"../timeline\";\nimport { CopyHoverFrame } from \"./copy-button\";\nimport { SecretAnswerChip } from \"./secret-ref-chip\";\nimport { secretAnswerLabel } from \"../human-input-model\";\nimport {\n agentWorkHumanInputSummary,\n isAgentWorkHumanInput,\n} from \"../timeline/agent-work-human-input\";\nimport { TimelineAnnotationSourceRootContext } from \"./timeline-annotation-reveal-context\";\nimport { annotationQuoteText } from \"../timeline/annotation-model\";\nimport { GeneratedVideoPlayer } from \"./generated-video-player\";\nimport {\n MACHINE_INPUT_META,\n agentMemberSessionId,\n agentMemberText,\n agentMemberTitle,\n cleanMachineInputSummary,\n isAgentMember,\n machineInputBatchLabel,\n machineInputSummaryIsUseful,\n readableMachineInputSource,\n} from \"./machine-input-display\";\nimport { AgentRow, AgentRowSection, AgentRowText } from \"../timeline/agent-row\";\nimport {\n AgentIdentityProvider,\n useAgentIdentity,\n type ResolveSessionTitle,\n} from \"../timeline/agent-identity\";\nimport { namedAgentTitle, type AgentTitleParts } from \"../timeline/platform-activity-presentation\";\nimport { SESSION_STATUS_META, StatusDot } from \"./session-status\";\nimport {\n noticeDisplayText,\n noticeIsResolvedApproval,\n noticeTone,\n} from \"../timeline/notice-presentation\";\nimport { TimelineComputeLabelProvider } from \"../timeline/compute-label\";\nimport { ProviderLogoProvider } from \"../timeline/provider-logo\";\nimport { EntranceAnimationProvider, useEntranceAnimation } from \"../timeline/entrance\";\nimport {\n AllowanceExhaustedRow,\n AllowancePresentationProvider,\n type RenderAllowanceExhausted,\n} from \"../timeline/allowance-exhausted-row\";\nimport { SessionUsageLimitRow } from \"../timeline/session-usage-limit-row\";\nimport { LearningRefusalRow } from \"../timeline/learning-refusal-row\";\nimport type { AllowanceLabels } from \"../usage/allowance-copy\";\nimport { SeenActivityIdsProvider } from \"../timeline/seen-activity-ids\";\nimport { TimelineAnnotationCards } from \"./timeline-annotations\";\nimport { TooltipProvider } from \"./tooltip\";\nimport { ShimmerText } from \"../timeline/shimmer-text\";\nimport { useOpenGeniText, type OpenGeniText } from \"../messages/runtime\";\nimport { isChunkLoadError } from \"../lib/chunk-load-error\";\nimport { LazyPart } from \"./lazy-part\";\nimport { LoadFailureNotice } from \"./load-failure-notice\";\nimport { AuthNeededRow } from \"./auth-needed-row\";\n\nconst TimelineAnnotationSelection = lazy(() => import(\"./timeline-annotation-selection\"));\nconst TimelineAnnotationMarkers = lazy(() => import(\"./timeline-annotation-markers\"));\n\nexport type MessageTimelineProps = {\n /** Exact durable search hit; clearing it removes highlighting without moving the reader. */\n searchTarget?: TimelineSearchTarget | null | undefined;\n /**\n * A durable event sequence to open on once (an inbox item's or notification's\n * moment): the timeline lands on the row that holds it, or the nearest row\n * before it, instead of the latest message. Load the window around it first.\n */\n focusSequence?: number | null | undefined;\n /** Localized user-message disclosure actions, including custom UserMessageBody renderers. */\n userMessageDisclosureLabels?: UserMessageDisclosureLabels | undefined;\n /** Raw session events (projected internally) … */\n events?: SessionEvent[] | undefined;\n /** … or pre-projected items (e.g. from `useSessionEvents().timeline`). */\n items?: TimelineItem[] | undefined;\n /** Current session status (reserved; tip \"Working…\" chrome removed for now). */\n status?: SessionStatus | null | undefined;\n /** Host-owned controls beside Copy and the timestamp on settled message rows. */\n renderMessageActions?: ((item: AgentMessageItem | UserMessageItem) => ReactNode) | undefined;\n /**\n * Who sent a person's message, drawn above its bubble. Called only for\n * messages that carry a sender; return null for the viewer's own messages\n * or when the host has no identity to show. Omit to show no senders.\n */\n renderMessageSender?: RenderMessageSender | undefined;\n /** Plug a markdown renderer for message bodies (e.g. streamdown). */\n renderMessageText?:\n | ((\n text: string,\n item: AgentMessageItem | UserMessageItem,\n context: { searchTarget: TimelineSearchTarget | null },\n ) => ReactNode)\n | undefined;\n /**\n * Render assistant `opengeni-html` / `opengeni-site` fences in the default\n * message renderer (`SessionConversation` supplies the inline Site preview).\n */\n renderInteractiveBlock?: MarkdownProps[\"renderInteractiveBlock\"];\n /** Drill into a spawned worker session. */\n onOpenSession?: ((sessionId: string) => void) | undefined;\n /**\n * Name the agents this session spawns, messages, and hears from. Return the\n * current display title for a session id, or null when unknown; the\n * timeline falls back to the title given at spawn, then to generic copy.\n * Keep the function identity stable across renders.\n */\n resolveSessionTitle?: ResolveSessionTitle | undefined;\n /**\n * Deep-link a memory row (a `memory.saved` / `memory.corrected` step) to its\n * record in the host's memory pane. Opt-in, exactly like `onReconnect`: the\n * library draws no \"View in memory\" affordance without a handler — the memory\n * row is then non-interactive rich content. This is the switch that makes the\n * deep-link a first-party Opengeni capability without other SDK consumers\n * opting into it. The app supplies it (it owns routing to the memory pane).\n */\n onMemoryClick?: ((memoryId: string) => void) | undefined;\n /**\n * Start the reconnect flow when a tool needs its connection reauthorized. The\n * app supplies this (it owns the SDK client + workspace): it typically kicks\n * off `startConnectionOAuth` and redirects, or routes to credential entry.\n * Rejecting surfaces a calm inline error on the card; the library never draws\n * a Reconnect button without a handler to run it.\n */\n onReconnect?: ((item: AuthNeededItem) => void | Promise<void>) | undefined;\n /** Host-owned inline connection setup. Return undefined to use the default recovery card. */\n renderAuthNeeded?: ((item: AuthNeededItem) => ReactNode | undefined) | undefined;\n /**\n * Replace the \"usage limit reached\" row shown when a workspace or member\n * usage allowance stops work (an `allowance_exhausted` refusal). Receives the\n * typed refusal (scope, reset time) and the default row; return undefined to\n * keep the default. Use it to point people at your own plan or admin page.\n */\n renderAllowanceExhausted?: RenderAllowanceExhausted | undefined;\n /** Replace the words of the default \"usage limit reached\" row. */\n allowanceExhaustedLabels?: Partial<AllowanceLabels> | undefined;\n /**\n * Decide which durable authentication notices this timeline presents.\n * Defaults to showing every notice. Embedded hosts can suppress notices for\n * credentials they manage elsewhere without discarding the underlying event.\n */\n shouldRenderAuthNeeded?: ((item: AuthNeededItem) => boolean) | undefined;\n /**\n * Resolve a provider domain (from a reconnect card) to a logo URL the host\n * serves itself — the app maps it through its catalog + `catalogAssetUrl`.\n * Return null/undefined to fall back to a calm monogram. The library never\n * fetches an off-origin favicon (CSP + privacy); an unresolved logo is a\n * monogram, not an external image.\n */\n resolveProviderLogo?: ((providerDomain: string) => string | null | undefined) | undefined;\n /**\n * The tool-renderer registry that resolves how each tool call is drawn.\n * Defaults to {@link defaultToolRegistry}; pass a registry from\n * `createDefaultToolRegistry({ entries })` to add custom tool renderers.\n */\n toolRegistry?: ToolRegistry | undefined;\n /**\n * Open Opengeni object links the agent writes in replies and progress notes:\n * `artifact:<file>`, `sandbox:<path>`, editable artifacts, and Sites. Return\n * a host URL (`{ href }`) or action (`{ open }`); unhandled targets render as\n * unavailable text instead of a console link that 404s inside the host.\n * Applies to the default message renderer and to any `Markdown` a custom\n * `renderMessageText` renders. `SessionConversation` supplies file and\n * sandbox downloads by default.\n */\n resolveLink?: OpenGeniLinkResolver | undefined;\n /** Resolve opaque retained screenshot receipts through the authenticated host SDK. */\n loadRetainedScreenshot?: RetainedScreenshotLoader | undefined;\n /** Resolve permanent workspace image/file receipts through the authenticated host SDK. */\n loadRetainedArtifact?: RetainedArtifactLoader | undefined;\n /** Mint short-lived native playback sources for retained generated videos. */\n loadVideoArtifactPlayback?: VideoArtifactPlaybackLoader | undefined;\n /**\n * Display name of the session's active compute target (Connected Machine or\n * cloud sandbox). When set, exec_command collapsed previews prefix `on {label}`.\n */\n computeLabel?: string | null | undefined;\n /** Customize collapsed turn facets for this timeline instance. */\n genieLoading?: GenieLoadingOptions | undefined;\n turnSummary?: TurnSummaryOptions | undefined;\n /** Follow new events when pinned to the bottom. Defaults to true. */\n autoFollow?: boolean | undefined;\n /** Capture a same-row text selection into the host's canonical composer draft. */\n onAnnotate?: ((annotation: DraftTimelineAnnotation) => void) | undefined;\n /**\n * Hide the floating \"Back to your message\" pill while the timeline viewport\n * is shorter than this (px), e.g. a narrow embed above a decision card.\n * Defaults to 0 (always available).\n */\n questionNavMinViewportHeight?: number | undefined;\n /** Composer draft quotes currently attached to the next send. */\n draftAnnotations?: readonly DraftTimelineAnnotation[] | undefined;\n /** Open the composer review list for one numbered draft badge. */\n onDraftAnnotationSelect?: ((id: string) => void) | undefined;\n /** Older durable history exists above the current window (see useSessionEvents). */\n hasOlder?: boolean | undefined;\n /** An older window is being fetched; shows the quiet top shimmer. */\n loadingOlder?: boolean | undefined;\n /**\n * Called when older history should backfill. Existing void, synchronous-value,\n * and arbitrary-promise callbacks remain supported. Receipt-aware loaders\n * preserve committed-page direction through wrappers and bounded windows.\n */\n onLoadOlder?: OlderHistoryLoader | undefined;\n /** Jump to the durable session start (bounded oldest window, no middle). */\n onJumpToStart?: (() => void | Promise<void>) | undefined;\n /** True while the oldest window is loading. */\n loadingOldest?: boolean | undefined;\n /** Newer durable history exists below the current (history) window. */\n hasNewer?: boolean | undefined;\n /** A newer history page is being fetched. */\n loadingNewer?: boolean | undefined;\n /** Page forward through history. Return the request promise to enable inline error/retry. */\n onLoadNewer?: (() => unknown) | undefined;\n /**\n * Reload the live tip window. When omitted, Jump to latest only re-pins and\n * scrolls the in-memory window.\n */\n onJumpToLatest?: (() => void | Promise<void>) | undefined;\n /** @deprecated Retained for source compatibility; contextual prompt navigation\n * uses only mounted prompts and never invokes this global resolver. */\n onJumpToLatestQuestion?: (() => Promise<number | null>) | undefined;\n /** Host-owned content appended after timeline groups, such as startup progress. */\n trailingState?: ReactNode | undefined;\n emptyState?: ReactNode | undefined;\n className?: string | undefined;\n};\n\n/**\n * Scroll ownership, from first principles. Everything the events hook has\n * loaded is mounted — no tip-lock window, no per-frame progressive reveal.\n * (The in-memory window is already byte/count-bounded by useSessionEvents, and\n * rows are memoized, so a full mount is cheap; the drip-feed machinery this\n * replaces was the \"content is hidden, then pops in in batches\" wobble.)\n *\n * Scroll invariant (tip-follow camera — see `./tip-follow.ts`):\n * - Load/remount: hidden until tip is hard-snapped across a short settle; then\n * reveal. Live tip: DOM growth advances the pinned viewport by the same\n * amount, so rendered content is visible immediately. Only debt that already\n * existed before the growth goes through the camera ease.\n * - One continuous follow while hot (faster τ when behind); sleeps when cold.\n * - While pinned, tip-debt from growth/collapse must NEVER unpin — only\n * wheel/keys/pointer-armed scroll-up, or a settled scrollend away from the\n * tip while the tip-follow camera is idle (Vimium / unfocused PageUp).\n * Height shrink compensates scrollTop by Δh (collapse owns motion); tip-ease\n * pauses briefly so the two don't fight. Programmatic camera writes are\n * tagged so their scroll echoes never count as leave.\n * - overflow-anchor off while pinned so the browser cannot instant-correct.\n * - Scrolled up → history prepends restore via the retained group anchor\n * (offsetTop delta); loadOlder can truncate the tip, so scrollHeight delta\n * alone is wrong. Late layout while unpinned stays browser-owned.\n */\nconst PIN_THRESHOLD_PX = 48;\n/**\n * A pinned timeline can still have meaningful pre-existing debt while the\n * tip-follow camera catches up. Surface the existing explicit jump once that\n * debt is large enough to be useful, without flashing the control for ordinary\n * line-sized streaming movement.\n */\nconst JUMP_TO_LATEST_CATCHUP_DEBT_PX = 240;\n/**\n * Floating timeline navigation: two identical small round arrow buttons at fixed\n * spots, centered on the conversation. Back to your message floats 12px below\n * the top edge, or just below an expanded work-header strip while that strip is\n * pinned (32px, 44px on coarse pointers) so the strip stays a full-width\n * target. Jump to latest floats 12px above the bottom edge. They never dodge\n * the content beneath them (floating over a sliver of text is fine), so they\n * cannot wander as rows stream in or the host resizes. Coarse pointers get a\n * larger invisible hit area instead of a larger button.\n */\nconst NAV_BUTTON_CLASS =\n \"pointer-events-auto relative inline-flex size-8 items-center justify-center rounded-full border border-og-border bg-og-surface-3/90 text-og-fg-muted shadow-og-md backdrop-blur hover:border-og-border-strong hover:text-og-fg focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-og-accent pointer-coarse:before:absolute pointer-coarse:before:-inset-1.5 pointer-coarse:before:content-['']\";\nconst NAV_FADE = {\n initial: { opacity: 0 },\n animate: { opacity: 1 },\n exit: { opacity: 0 },\n transition: { duration: 0.15, ease: \"easeOut\" },\n} as const;\n/**\n * Prefetch older history when the top sentinel is this far from the viewport.\n * After a page loads we stay cool until the reader leaves this band (scrolls\n * down into content) — never re-fire from continued scroll toward y=0.\n */\nconst OLDER_PREFETCH_MARGIN_PX = 400;\nconst OLDER_PREFETCH_ROOT_MARGIN = `${OLDER_PREFETCH_MARGIN_PX}px 0px 0px 0px`;\nconst MESSAGE_BUBBLE_CLASS =\n \"w-fit max-w-full min-w-0 rounded-og-lg rounded-br-og-xs border border-og-border bg-og-surface-2 px-4 py-2.5 text-og-md leading-6 text-og-fg\";\nconst WAITING_PILL_CLASS =\n \"border-og-status-waiting/35 bg-og-status-waiting/10 text-og-status-waiting\";\nconst LOADING_CHIP_CLASS =\n \"pointer-events-none inline-flex items-center rounded-full border border-og-border bg-og-surface-3/90 px-3 py-1 text-og-control font-medium shadow-og-md backdrop-blur\";\n/** How long live progress notes take to fold into (or out of) their work row. */\nconst LIVE_NOTE_FOLD_MS = 220;\n/** The timeline list's `gap-5`; a folded note gives it back with `-mt-5`. */\nconst LIVE_NOTE_GAP_PX = 20;\n/** Longest a bottom-space loan waits for an opening work list to grow into it. */\nconst LIVE_NOTE_RESERVE_MS = 700;\n/** Lets a live work disclosure report whether it is open (see `reportLiveFold`). */\nconst LiveNoteFoldContext = createContext<((workId: string, open: boolean) => void) | null>(null);\n\n// State: 0 underfill retry, 1 prefetch pending, 2 compatibility-settled,\n// 3 explicit no-progress waiting to become an underfill retry.\n// The tuple identity is the exact request ownership fence. The boundary may rebase\n// forward while that request is pending when a bounded live-tail append evicts\n// its former oldest row. First-party loaders mark the exact owner when their\n// older page commits; retained direction is the fallback for other hosts.\ntype OlderLoadAttempt = [\n boundary: string | undefined,\n state?: number,\n receipt?: OlderHistoryLoadReceipt,\n];\n\nfunction invokeOlderLoad(\n load: OlderHistoryLoader,\n noProgress: () => void,\n attempt: OlderLoadAttempt,\n preserveTail = false,\n): 1 | undefined {\n try {\n // Receipt creation is captured synchronously through legacy wrappers such\n // as `() => void loadOlder()`, even when the wrapper discards the return.\n const result = invokeOlderHistoryLoaderWithReceiptCapture(\n load,\n (receipt) => {\n attempt[2] = receipt;\n },\n preserveTail,\n ) as OlderHistoryLoadReceipt | PromiseLike<unknown> | unknown;\n const receipt =\n attempt[2] ??\n (typeof (result as { committed?: unknown } | undefined)?.committed === \"boolean\"\n ? (result as OlderHistoryLoadReceipt)\n : undefined);\n if (receipt) {\n attempt[2] = receipt;\n void receipt.then(\n (value) => value === false && !receipt.committed && noProgress(),\n noProgress,\n );\n return 1;\n }\n if (typeof (result as PromiseLike<unknown> | undefined)?.then != \"function\") {\n return;\n }\n void (result as PromiseLike<unknown>).then(\n (value) => value === false && noProgress(),\n noProgress,\n );\n } catch {\n noProgress();\n }\n return 1;\n}\n\n/**\n * Pinned = the viewport bottom is within PIN_THRESHOLD_PX of the content\n * bottom. When the scroll range itself is shorter than the threshold, the\n * whole range would count as \"at the bottom\" and the reader could never unpin\n * to reach older history — so the effective threshold shrinks to the range,\n * making the very top of a short window count as scrolled up. A window that\n * cannot scroll at all is always pinned.\n */\nfunction maxScrollOf(node: HTMLElement): number {\n // Browser layout guarantees scrollHeight is at least clientHeight.\n return node.scrollHeight - node.clientHeight;\n}\n\n/**\n * React bubbles events from portaled content (a card's setup dialog, a menu)\n * through the timeline's handlers although that content is outside the\n * scroller. Only events from the scroller's own DOM are reader intent.\n */\nfunction eventFromScrollerDom(event: {\n target: EventTarget | null;\n currentTarget: EventTarget | null;\n}): boolean {\n return (\n event.currentTarget instanceof Node &&\n event.target instanceof Node &&\n event.currentTarget.contains(event.target)\n );\n}\n\n/**\n * Wheel bubbled from a nested overflow scroller that can still move up — not\n * timeline intent (code blocks / notice `<pre>`).\n */\nfunction wheelConsumedByNestedScrollable(event: {\n deltaY: number;\n target: EventTarget | null;\n currentTarget: EventTarget | null;\n}): boolean {\n if (event.deltaY >= 0) {\n return false;\n }\n let el = event.target instanceof Element ? event.target : null;\n const root = event.currentTarget instanceof Element ? event.currentTarget : null;\n while (el && el !== root) {\n if (el instanceof HTMLElement) {\n const style = getComputedStyle(el);\n const overflowY = style.overflowY;\n if (\n (overflowY === \"auto\" || overflowY === \"scroll\" || overflowY === \"overlay\") &&\n el.scrollHeight > el.clientHeight + 1 &&\n el.scrollTop > 0\n ) {\n return true;\n }\n }\n el = el.parentElement;\n }\n return false;\n}\n\nfunction isNearBottom(node: HTMLElement): boolean {\n const maxScroll = maxScrollOf(node);\n if (maxScroll <= 1) {\n return true;\n }\n const gap = maxScroll - node.scrollTop;\n return gap < Math.min(PIN_THRESHOLD_PX, maxScroll);\n}\n\n/** Content-space top of a timeline group, or null when it is not mounted. */\nfunction contentTopOf(node: HTMLElement, groupKey: string): number | null {\n const element = node.querySelector(`[data-og-group-key=\"${cssEscapeAttribute(groupKey)}\"]`);\n if (!(element instanceof HTMLElement)) {\n return null;\n }\n return element.getBoundingClientRect().top - node.getBoundingClientRect().top + node.scrollTop;\n}\n\n/** The question the reader is inside of, once its start has scrolled out of view. */\n/**\n * `belowHeader`: an expanded work header is pinned to the top of the scrollport,\n * so the up arrow sits just below that strip instead of covering it.\n */\ntype QuestionNav = { key: string; belowHeader: boolean };\n\nfunction readQuestionNav(node: HTMLElement): QuestionNav | null {\n const view = node.getBoundingClientRect();\n const prompts = [...node.querySelectorAll<HTMLElement>(\"[data-og-prompt]\")].flatMap((prompt) => {\n const key = prompt.dataset.ogGroupKey;\n if (!key) return [];\n const bounds = prompt.getBoundingClientRect();\n return [{ key, top: bounds.top, bottom: bounds.bottom }];\n });\n const key = questionNavTarget(prompts, { top: view.top, height: view.height });\n return key ? { key, belowHeader: workHeaderPinned(node, view) } : null;\n}\n\n/** True while an expanded outer work header is stuck to the scrollport's top edge. */\nfunction workHeaderPinned(node: HTMLElement, view: DOMRect): boolean {\n for (const header of node.querySelectorAll<HTMLElement>(\n '[data-og-work-header=\"outer\"][data-state=\"open\"]',\n )) {\n const box = header.getBoundingClientRect();\n if (Math.abs(box.top - view.top) <= 1 && box.bottom > view.top) return true;\n }\n return false;\n}\n\nfunction sameQuestionNav(a: QuestionNav | null, b: QuestionNav | null): boolean {\n return a === b || (!!a && !!b && a.key === b.key && a.belowHeader === b.belowHeader);\n}\n\n/** Escape a value for use inside a CSS attribute selector. */\nfunction cssEscapeAttribute(value: string): string {\n if (typeof CSS !== \"undefined\" && typeof CSS.escape === \"function\") {\n return CSS.escape(value);\n }\n return value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\n}\n\n/**\n * The session timeline: chat messages with streaming deltas, collapsed\n * activity clusters (reasoning, tool calls, sandbox work), spawned-worker\n * cards, goal markers, and status transitions. Owns stick-to-bottom scrolling\n * with a \"jump to latest\" affordance when the reader scrolls back.\n */\nexport function MessageTimeline({\n resolveLink,\n renderInteractiveBlock,\n userMessageDisclosureLabels,\n searchTarget,\n focusSequence,\n events,\n items,\n status: _status,\n renderMessageActions,\n renderMessageSender,\n renderMessageText,\n onOpenSession,\n resolveSessionTitle,\n onMemoryClick,\n onReconnect,\n renderAuthNeeded,\n renderAllowanceExhausted,\n allowanceExhaustedLabels,\n shouldRenderAuthNeeded,\n resolveProviderLogo,\n toolRegistry = defaultToolRegistry,\n loadRetainedScreenshot,\n loadRetainedArtifact,\n loadVideoArtifactPlayback,\n computeLabel = null,\n genieLoading,\n turnSummary,\n autoFollow = true,\n onAnnotate,\n questionNavMinViewportHeight = 0,\n draftAnnotations,\n onDraftAnnotationSelect,\n hasOlder = false,\n loadingOlder = false,\n onLoadOlder,\n onJumpToStart,\n loadingOldest = false,\n hasNewer = false,\n loadingNewer = false,\n onLoadNewer,\n onJumpToLatest,\n trailingState,\n emptyState,\n className,\n}: MessageTimelineProps) {\n const t = useOpenGeniText();\n const formatError = useErrorMessage();\n const resolvedItems = useMemo(() => {\n const projectedItems = items ?? buildTimeline(t, events ?? []);\n if (!shouldRenderAuthNeeded) {\n return projectedItems;\n }\n return projectedItems.filter(\n (item) => item.kind !== \"auth-needed\" || shouldRenderAuthNeeded(item),\n );\n }, [items, events, shouldRenderAuthNeeded, t]);\n const searchItem = searchTarget\n ? resolvedItems.find((item) => isTimelineSearchTarget(item, searchTarget))\n : undefined;\n const searchRevealKey =\n searchItem && searchTarget\n ? JSON.stringify([\n searchItem.id,\n searchTarget.query,\n searchTarget.occurrence ?? 0,\n searchTarget.offset ?? null,\n ])\n : null;\n const searchTargetRef = useRef(searchTarget);\n searchTargetRef.current = searchTarget;\n const renderSearchableMessageText = useMemo(\n () =>\n renderMessageText\n ? (text: string, item: AgentMessageItem | UserMessageItem) =>\n renderMessageText(text, item, {\n searchTarget: searchItem?.id === item.id ? (searchTarget ?? null) : null,\n })\n : (text: string, item: AgentMessageItem | UserMessageItem) => {\n const body = (\n <Markdown\n searchTarget={searchItem?.id === item.id ? searchTarget : null}\n softLineBreaks\n streaming={item.kind === \"agent-message\" && item.streaming}\n renderInteractiveBlock={\n item.kind === \"agent-message\" ? renderInteractiveBlock : undefined\n }\n >\n {text}\n </Markdown>\n );\n return item.kind === \"user-message\" ? (\n <UserMessageBody messageId={item.id} text={text}>\n {body}\n </UserMessageBody>\n ) : (\n body\n );\n },\n [renderInteractiveBlock, renderMessageText, searchItem?.id, searchTarget],\n );\n // Event-window identity is independent of projected rows (partial messages\n // can acquire a different first-delta id when older text arrives).\n const sourceItems = events ?? items;\n const olderBoundaryKey = sourceItems?.[0]?.id;\n const newerBoundaryKey = `${events?.[0]?.sessionId ?? \"\"}:${olderBoundaryKey ?? \"\"}`;\n const newerScopeRef = useRef(newerBoundaryKey);\n newerScopeRef.current = newerBoundaryKey;\n const newerAttemptRef = useRef<{ pending: boolean } | null>(null);\n const newerRetryButtonRef = useRef<HTMLButtonElement | null>(null);\n const [newerRetryPending, setNewerRetryPending] = useState(false);\n const [newerFailure, setNewerFailure] = useState<{ key: string; message: string } | null>(null);\n useEffect(() => {\n newerScopeRef.current = newerBoundaryKey;\n newerAttemptRef.current = null;\n setNewerFailure(null);\n setNewerRetryPending(false);\n return () => {\n newerScopeRef.current = \"\";\n newerAttemptRef.current = null;\n };\n }, [newerBoundaryKey]);\n const requestNewer = useCallback(\n (explicitRetry = false) => {\n if (\n newerScopeRef.current !== newerBoundaryKey ||\n !onLoadNewer ||\n loadingNewer ||\n (newerAttemptRef.current && (!explicitRetry || newerAttemptRef.current.pending))\n ) {\n return;\n }\n const attempt = { pending: true };\n newerAttemptRef.current = attempt;\n if (explicitRetry) setNewerRetryPending(true);\n const isCurrent = () =>\n newerAttemptRef.current === attempt && newerScopeRef.current === newerBoundaryKey;\n // Both synchronous host errors and rejected promises belong to this\n // boundary. Retain the failed attempt so observers cannot hot-retry it.\n void Promise.resolve()\n .then(() => (isCurrent() ? onLoadNewer() : undefined))\n .then(\n () => {\n if (!isCurrent()) return;\n newerAttemptRef.current = null;\n // The successful page removes the recovery control. Return focus\n // to the reading surface without moving the reader's viewport.\n if (document.activeElement === newerRetryButtonRef.current) {\n scrollRef.current?.focus({ preventScroll: true });\n }\n setNewerFailure(null);\n setNewerRetryPending(false);\n },\n (reason: unknown) => {\n if (!isCurrent()) return;\n attempt.pending = false;\n setNewerRetryPending(false);\n setNewerFailure({\n key: newerBoundaryKey,\n message: formatError(reason),\n });\n },\n );\n },\n [onLoadNewer, loadingNewer, newerBoundaryKey, formatError],\n );\n const previousSourceIdsRef = useRef(new Set<string>());\n const previousSourceBoundaryRef = useRef<string | undefined>(undefined);\n const readingAnchorRef = useRef<TimelineAnchor | null>(null);\n const settlementRef = useRef<TimelineSettlement | null>(null);\n const settlementAnimationRef = useRef<Animation | null>(null);\n const stopSettlement = useCallback(() => {\n settlementAnimationRef.current?.cancel();\n settlementAnimationRef.current = null;\n }, []);\n const olderPageBudgetRef = useRef(0);\n const [olderDemand, setOlderDemand] = useState(0);\n const readableTurns = turnSummary?.rolling === true;\n const projectedGroups = useMemo(\n () => groupTimeline(t, resolvedItems, { readableTurns }),\n [resolvedItems, readableTurns, t],\n );\n // A new timeline revision (including session/turn replacement) owns layout.\n // Never leave an old decorative transform running on its retained rows.\n useLayoutEffect(() => stopSettlement, [projectedGroups, stopSettlement]);\n const annotationSources = useMemo(() => {\n const sources = new Map<string, TimelineAnnotationSourceDescriptor>();\n for (const item of resolvedItems) {\n if (\n (item.kind === \"user-message\" ||\n item.kind === \"agent-message\" ||\n item.kind === \"tool-call\") &&\n item.annotationSource\n ) {\n sources.set(item.annotationSource.eventId, item.annotationSource);\n }\n }\n return sources;\n }, [resolvedItems]);\n const scrollRef = useRef<HTMLDivElement | null>(null);\n /** The card whose answer handed the view back to the tip (see followAfterAnswer). */\n const answeredCardRef = useRef<HTMLElement | null>(null);\n const topSentinelRef = useRef<HTMLDivElement | null>(null);\n const bottomSentinelRef = useRef<HTMLDivElement | null>(null);\n const previousBulkFirstKeyRef = useRef<string | null | undefined>(undefined);\n const [pinned, setPinned] = useState(true);\n const { groups: allGroups, release: releaseProgress } = useReadingProgress(\n projectedGroups,\n autoFollow && pinned && !hasNewer,\n scrollRef.current,\n answeredCardRef.current,\n );\n const [canSkipTipCatchup, setCanSkipTipCatchup] = useState(false);\n const canSkipTipCatchupRef = useRef(false);\n const [bulkActive, setBulkActive] = useState(true);\n // Older history prefetch is user-driven: a window shorter than the viewport\n // + rootMargin would otherwise keep the top sentinel intersecting and fetch\n // history forever while the reader sits at the tip. Arm on first scroll-up.\n const olderPrefetchArmedRef = useRef(false);\n const [olderPrefetchArmed, setOlderPrefetchArmed] = useState(false);\n // A collapsed history tail can be shorter than the viewport. In that state\n // there is no upward scroll range, so reader intent can never arm the top\n // sentinel. Request one older page per loaded window until history either\n // fills the viewport or the host reports that no older rows remain. Each\n // attempt owns the oldest loaded item boundary across BOTH the automatic\n // underfill and reader-driven sentinel paths. Live-tail appends do not\n // advance older pagination or release that exact owner.\n const olderLoadAttemptRef = useRef<OlderLoadAttempt | null>(null);\n const [underfillSettledAttempt, setUnderfillSettledAttempt] = useState<OlderLoadAttempt | null>(\n null,\n );\n const underfillRetryReadyRef = useRef(false);\n const resizeFollowRafRef = useRef<number | null>(null);\n const questionNavFrameRef = useRef<number | null>(null);\n const [questionNav, setQuestionNav] = useState<QuestionNav | null>(null);\n const questionNavMinViewportRef = useRef(questionNavMinViewportHeight);\n questionNavMinViewportRef.current = questionNavMinViewportHeight;\n const scheduleQuestionNavRef = useRef<() => void>(() => {});\n // Unpinned is not the same as away from the tip: focusing a control in the\n // conversation (Copy, a connection card) hands the view to the reader while\n // they are still at the bottom. Offer the jump only once there is something\n // below them, or a newer window / catch-up to skip.\n const [awayFromTip, setAwayFromTip] = useState(false);\n const jumpPillShown = autoFollow && ((!pinned && awayFromTip) || hasNewer || canSkipTipCatchup);\n const firstGroupKey = allGroups[0] ? timelineGroupKey(allGroups[0]) : null;\n // Content stays invisible until the tip is hard-parked across a short\n // post-commit settle (two rAFs). That absorbs sync late layout while hidden\n // so load/remount does not ease into the tip — live tip-follow is unchanged\n // once revealed. A flash of the window's TOP is still structurally impossible.\n // The accepted-create handoff uses the reserved local id \"c\" so its known\n // first message is visible immediately; loaded histories still park first.\n const [revealed, setRevealed] = useState(resolvedItems[0]?.id === \"c\");\n // Mirror `pinned` into a ref, written ONLY by applyPinned, so the\n // ResizeObserver rAF (a stable closure) reads the live value and a snap can\n // never race a just-unpinned reader across a pending React commit.\n const pinnedRef = useRef(true);\n // History windows (`hasNewer`) have a bottom that is not the live tip.\n // Pin/follow must ignore that floor — otherwise loadNewer appends yank the\n // reader to the new page bottom. LoadOlder prepends already stay put because\n // the reader is unpinned and scroll anchoring / delta correction owns place.\n const hasNewerRef = useRef(hasNewer);\n hasNewerRef.current = hasNewer;\n // Jump-to-latest pressed while a history window is showing: the pin must\n // wait for the tip window to actually land (`hasNewer` → false) — pinning\n // immediately would snap to the bottom of the CURRENT history page and\n // page-crawl forward through the gap.\n const wantPinRef = useRef(false);\n // Jump-to-start pressed: consume on the commit that swaps the window so the\n // scroll-to-top write races neither the old DOM nor the prepend correction.\n const pendingJumpToStartRef = useRef(false);\n // Identifies the newest Jump-to-start click so a settling promise callback\n // from an earlier click can never clear a re-click's pending flag.\n const jumpToStartSeqRef = useRef(0);\n // Prepend detection: the oldest loaded item's id changes exactly when older\n // history lands (including the merge-into-first-group case where the first\n // GROUP key is retained). Item ids, not group keys, are the durable signal.\n const previousFirstItemIdRef = useRef<string | null>(null);\n const previousScrollHeightRef = useRef(0);\n // Per-commit place memory for unpinned prepend restore (see layout effect).\n // Paired with max/height/client for clamp-conservation reader-intent math.\n const lastScrollTopRef = useRef(0);\n const lastMaxScrollRef = useRef(0);\n const lastScrollHeightRef = useRef(0);\n const lastClientHeightRef = useRef(0);\n /**\n * Armed by pointerdown on the scroller. Immediate geometric scroll-up unpins\n * while armed (scrollbar / touch drag). Wheel/keys unpin directly. Extension\n * jumps (Vimium) settle via scrollend while the camera is idle.\n */\n const readerIntentArmRef = useRef(false);\n /** Gesture-start geometry survives commits before the native scroll event. */\n const readerIntentStartRef = useRef<{ scrollTop: number; maxScroll: number } | null>(null);\n /**\n * Count of camera/snap scrollTop writes whose scroll echoes are not yet\n * consumed. A boolean was wrong when the browser coalesced two writes into\n * one scroll event (or fired two) — use a count, and clear to 0 on echo.\n */\n const programmaticScrollRef = useRef(0);\n /**\n * Disclosure height changes are not reader navigation. While an unpinned\n * Show more/less state is active, its clamp/native-anchor scroll echoes must\n * never geometrically re-enable bottom-follow. A later real reader navigation\n * or explicit Jump to latest releases this fence.\n */\n const disclosureKeepsUnpinnedRef = useRef(false);\n /**\n * Unarmed scroll-away observed; waiting for scrollend (or rAF fallback).\n * Blocks layout tip-follow so a stream token cannot yank before leave settles.\n */\n const pendingReaderLeaveRef = useRef(false);\n /** Fallback leave check when `scrollend` is missing (one rAF, not a timer). */\n const leaveFallbackRafRef = useRef<number | null>(null);\n // Resting fold state per durable group id (see fold-memory.ts). Outlives the\n // deliberate chip remounts (activity→turn wrap, nested key flips) so a fold\n // that already settled closed — or that the reader closed — never reopens.\n const foldMemoryRef = useRef<Map<string, FoldRestingState>>(new Map());\n // Live work disclosures that are open. While open, that turn's progress\n // notes read inside the disclosure, so their copies above it fold away.\n const [openLiveFolds, setOpenLiveFolds] = useState<ReadonlySet<string>>(() => new Set());\n const openLiveFoldsRef = useRef<ReadonlySet<string>>(openLiveFolds);\n const liveNoteIdsByWorkRef = useRef<ReadonlyMap<string, readonly string[]>>(new Map());\n const liveFoldMotionRef = useRef<{ frame: number | null; finish: () => void } | null>(null);\n // The bottom-space loan currently on the scroller, by owner.\n const liveFoldReserveRef = useRef<object | null>(null);\n // writeScrollTop is declared further down; the fold reaches it through this.\n const writeScrollTopRef = useRef<(node: HTMLElement, top: number) => void>(() => {});\n const reportLiveFold = useCallback((workId: string, open: boolean) => {\n const current = openLiveFoldsRef.current;\n if (current.has(workId) === open) return;\n const next = new Set(current);\n if (open) next.add(workId);\n else next.delete(workId);\n openLiveFoldsRef.current = next;\n liveFoldMotionRef.current?.finish();\n const scroller = scrollRef.current;\n const rows = (liveNoteIdsByWorkRef.current.get(workId) ?? []).flatMap((id) => {\n const row = scroller?.querySelector<HTMLElement>(\n `[data-og-live-note-id=\"${cssEscapeAttribute(id)}\"]`,\n );\n return row ? [row] : [];\n });\n if (!scroller || rows.length === 0) {\n setOpenLiveFolds(next);\n return;\n }\n const header = scroller.querySelector<HTMLElement>(\n `[data-og-work-id=\"${cssEscapeAttribute(workId)}\"] [data-og-work-header=\"outer\"]`,\n );\n const viewTop = scroller.getBoundingClientRect().top;\n const headerTop = header?.getBoundingClientRect().top;\n if (\n !open &&\n header &&\n headerTop !== undefined &&\n (headerTop < viewTop || headerTop > viewTop + scroller.clientHeight)\n ) {\n // Closed from the row's sticky header after reading down the list: the\n // row is no longer where the reader is. Like any big collapse, land on\n // it in one step — the notes return above and the closed row rests at\n // the bottom edge — rather than animating content the reader can't see.\n setOpenLiveFolds(next);\n requestFrame(() =>\n requestFrame(() => {\n const row = header.closest<HTMLElement>(\"[data-og-timeline-group-anchor]\");\n if (!row?.isConnected) return;\n const box = row.getBoundingClientRect();\n const top = scroller.getBoundingClientRect().top;\n const bottom = top + scroller.clientHeight;\n // + the scroller's pb-6, as at the true end.\n if (box.bottom > bottom || box.top < top)\n writeScrollTopRef.current(scroller, scroller.scrollTop + box.bottom - bottom + 24);\n scheduleQuestionNavRef.current();\n }),\n );\n return;\n }\n // Opening a live row near the bottom drops its one-line preview while its\n // list grows from nothing; closing shrinks the list before the notes have\n // grown back. For that moment the page is shorter than where the reader\n // is, so the browser would clamp the scroll and everything would drop.\n // This runs before that frame paints: keep the reader's position and lend\n // one screen of space at the bottom (the shortfall keeps changing through\n // the commit) until the content has grown back into it.\n const readerTop = lastScrollTopRef.current;\n const reserve = readerTop > 0.5 ? scroller.clientHeight : 0;\n const loan = {};\n if (reserve > 0) {\n liveFoldReserveRef.current = loan;\n scroller.style.paddingBottom = `calc(1.5rem + ${reserve}px)`;\n if (Math.abs(scroller.scrollTop - readerTop) > 0.5)\n writeScrollTopRef.current(scroller, readerTop);\n }\n const releaseReserve = (deadline: number) => {\n // Only this motion's loan; a newer toggle may have replaced it.\n if (reserve === 0 || liveFoldReserveRef.current !== loan) return;\n const needed = scroller.scrollTop + scroller.clientHeight - (scroller.scrollHeight - reserve);\n if (needed > 0.5 && performance.now() < deadline && scroller.isConnected) {\n requestFrame(() => releaseReserve(deadline));\n return;\n }\n liveFoldReserveRef.current = null;\n scroller.style.removeProperty(\"padding-bottom\");\n };\n // The notes fold into (or out of) the work row in one short motion. The\n // row glides to where it should rest: opening, into the first note's place\n // (or the top edge, when that note was above view) so its list starts just\n // beneath; closing, down below its returning notes but never past the\n // bottom edge. When everything is in view that is exactly what happens on\n // its own; otherwise the scroll is written in the same frame as the\n // heights, so it cannot lag. Native scroll anchoring is suspended for the\n // motion; inline styles pin the current look across the state commit, end\n // exactly at the classes' resting geometry, and are then removed.\n const workRow = header?.closest<HTMLElement>(\"[data-og-timeline-group-anchor]\") ?? null;\n const rowStart = workRow?.getBoundingClientRect().top;\n const viewBottom = viewTop + scroller.clientHeight;\n let landing =\n open && rowStart !== undefined\n ? Math.max(rows[0]!.getBoundingClientRect().top, viewTop)\n : null;\n const heights = rows.map((row) => (open ? row.offsetHeight : 0));\n const apply = (progress: number) => {\n const shown = open ? 1 - progress : progress;\n rows.forEach((note, index) => {\n // The list gap travels inside the row as padding (margin cancels it),\n // so a shrinking row never overlaps the one above it mid-motion.\n note.style.marginTop = `${-LIVE_NOTE_GAP_PX}px`;\n note.style.paddingTop = `${LIVE_NOTE_GAP_PX * shown}px`;\n note.style.height = `${(heights[index]! + LIVE_NOTE_GAP_PX) * shown}px`;\n note.style.opacity = String(shown);\n });\n if (workRow && rowStart !== undefined && landing !== null) {\n const drift =\n workRow.getBoundingClientRect().top - (rowStart + (landing - rowStart) * progress);\n if (Math.abs(drift) > 0.5) writeScrollTopRef.current(scroller, scroller.scrollTop + drift);\n }\n };\n for (const row of rows) {\n row.style.boxSizing = \"border-box\";\n row.style.overflow = \"hidden\";\n row.style.overflowAnchor = \"none\";\n }\n scroller.style.overflowAnchor = \"none\";\n apply(0);\n const fold: { frame: number | null; finish: () => void } = {\n frame: null,\n finish: () => {\n if (fold.frame != null) cancelFrame(fold.frame);\n for (const row of rows) {\n for (const property of [\n \"height\",\n \"margin-top\",\n \"padding-top\",\n \"opacity\",\n \"overflow\",\n \"overflow-anchor\",\n \"box-sizing\",\n ])\n row.style.removeProperty(property);\n }\n scroller.style.removeProperty(\"overflow-anchor\");\n releaseReserve(performance.now() + LIVE_NOTE_RESERVE_MS);\n // The row may now be pinned to the top without any scroll: re-place\n // the up arrow (it sits below a pinned work header).\n scheduleQuestionNavRef.current();\n if (liveFoldMotionRef.current === fold) liveFoldMotionRef.current = null;\n },\n };\n liveFoldMotionRef.current = fold;\n const duration = prefersReducedMotion() ? 0 : LIVE_NOTE_FOLD_MS;\n let began: number | null = null;\n const step = (now: number) => {\n fold.frame = null;\n if (!rows.every((row) => row.isConnected)) return fold.finish();\n if (!open && began === null) {\n // Unfolding: the natural heights are known only once the folded\n // class is gone; the inline styles still hold them at zero.\n rows.forEach((note, index) => (heights[index] = note.scrollHeight));\n if (workRow && rowStart !== undefined) {\n const returning = heights.reduce((sum, height) => sum + height + LIVE_NOTE_GAP_PX, 0);\n // The closed row is its header plus one preview line (its list is\n // still collapsing now, so the row's own height is not final yet).\n const closedRow = 2 * (header?.getBoundingClientRect().height ?? 0);\n const lowest = viewBottom - closedRow - 24;\n landing = Math.min(rowStart + returning, Math.max(lowest, rowStart));\n }\n }\n began ??= now;\n const linear = duration === 0 ? 1 : Math.min(1, (now - began) / duration);\n apply(1 - (1 - linear) ** 3);\n if (linear < 1) fold.frame = requestFrame(step);\n else fold.finish();\n };\n fold.frame = requestFrame(step);\n setOpenLiveFolds(next);\n }, []);\n useEffect(\n () => () => {\n liveFoldMotionRef.current?.finish();\n },\n [],\n );\n const userMessageDisclosureMemoryRef = useRef<Map<string, boolean>>(new Map());\n const seenActivityIdsRef = useRef<Set<string>>(new Set());\n const firstItemGroupKeyRef = useRef<string | null>(null);\n const firstItemGroupOffsetTopRef = useRef<number | null>(null);\n const firstItemContentTopRef = useRef<number | null>(null);\n const firstItemId = resolvedItems[0]?.id ?? null;\n // Pagination ownership follows the oldest committed input, before host\n // filtering and grouping. A page containing only suppressed auth notices\n // still advances this receipt, while live-tail appends leave it unchanged.\n // Promise fulfillment alone does neither, so delayed prepends stay fenced.\n const underfillRetryReady = (underfillRetryReadyRef.current = !!(\n underfillSettledAttempt &&\n underfillSettledAttempt === olderLoadAttemptRef.current &&\n hasOlder &&\n onLoadOlder &&\n !loadingOlder\n ));\n // Bulk paints (the initial tail window, a prepended older window — detected\n // by the first group key changing) must not run per-row entrance animations.\n const firstKeyChangedForBulk =\n previousBulkFirstKeyRef.current !== undefined &&\n previousBulkFirstKeyRef.current !== firstGroupKey;\n const bulkRender = allGroups.length > 0 && (bulkActive || firstKeyChangedForBulk);\n const groups = useStableTimelineGroupKeys(allGroups, !bulkRender);\n // Each live progress note → whether its turn's work disclosure is open.\n const [liveNoteFolds, liveNoteIdsByWork] = useMemo(() => {\n const folds = new Map<string, boolean>();\n const byWork = new Map<string, readonly string[]>();\n for (const { group } of groups) {\n if (group.kind !== \"activity\" || !group.work?.liveNoteIds) continue;\n byWork.set(group.id, group.work.liveNoteIds);\n for (const id of group.work.liveNoteIds) folds.set(id, openLiveFolds.has(group.id));\n }\n return [folds, byWork] as const;\n }, [groups, openLiveFolds]);\n useLayoutEffect(() => {\n liveNoteIdsByWorkRef.current = liveNoteIdsByWork;\n }, [liveNoteIdsByWork]);\n const turnsWithOutput = useMemo(() => timelineTurnsWithOutput(resolvedItems), [resolvedItems]);\n\n const applyCanSkipTipCatchup = useCallback((value: boolean) => {\n if (canSkipTipCatchupRef.current !== value) {\n canSkipTipCatchupRef.current = value;\n setCanSkipTipCatchup(value);\n }\n }, []);\n\n // The ONLY writer of the pinned flag. Ref and state move together, so\n // behavior (refs read by rAF callbacks) and rendering (the anchor class,\n // the Jump-to-latest button) can never desync.\n const applyPinned = useCallback(\n (value: boolean) => {\n if (pinnedRef.current !== value) {\n pinnedRef.current = value;\n setPinned(value);\n }\n if (!value) {\n applyCanSkipTipCatchup(false);\n }\n },\n [applyCanSkipTipCatchup],\n );\n\n const rearmOlderPrefetchAfterLeavingTop = useCallback((node: HTMLElement) => {\n if (node.scrollTop > OLDER_PREFETCH_MARGIN_PX) {\n const state = olderLoadAttemptRef.current?.[1];\n if (state === 2 || state === 3) {\n olderLoadAttemptRef.current = null;\n }\n }\n }, []);\n\n const revealedRef = useRef(revealed);\n revealedRef.current = revealed;\n\n // Pure tip-follow camera. Pin intent uses clamp conservation, not timers.\n const followRef = useRef<TipFollowState>(createTipFollowState());\n const followFrameRef = useRef<number | null>(null);\n const contentShrinkBaselineRef = useRef<TipFollowContentShrinkBaseline | null>(null);\n\n const syncScrollBaseline = useCallback((node: HTMLElement) => {\n lastScrollTopRef.current = node.scrollTop;\n lastMaxScrollRef.current = maxScrollOf(node);\n lastScrollHeightRef.current = node.scrollHeight;\n lastClientHeightRef.current = node.clientHeight;\n }, []);\n\n const writeScrollTop = useCallback((node: HTMLElement, top: number) => {\n const next = Math.max(0, top);\n const before = node.scrollTop;\n if (before === next) {\n return;\n }\n // Unpinned camera/anchor writes invalidate return intent. A pinned\n // pointer gesture still needs its cumulative leave budget across writes.\n if (!pinnedRef.current || !readerIntentArmRef.current) readerIntentStartRef.current = null;\n programmaticScrollRef.current += 1;\n node.scrollTop = next;\n if (node.scrollTop === before) {\n // The engine floored a sub-device-pixel write to a no-op: no scroll echo\n // will ever fire. Counting it would leak the echo count and silently eat\n // a later REAL reader scroll as programmatic.\n programmaticScrollRef.current -= 1;\n }\n }, []);\n writeScrollTopRef.current = writeScrollTop;\n\n const cancelLeaveFallback = useCallback(() => {\n if (leaveFallbackRafRef.current != null) {\n cancelFrame(leaveFallbackRafRef.current);\n leaveFallbackRafRef.current = null;\n }\n }, []);\n\n const clearPendingReaderLeave = useCallback(() => {\n pendingReaderLeaveRef.current = false;\n cancelLeaveFallback();\n }, [cancelLeaveFallback]);\n\n const clearReaderIntent = useCallback(() => {\n readerIntentArmRef.current = false;\n readerIntentStartRef.current = null;\n }, []);\n\n const stopFollow = useCallback(() => {\n contentShrinkBaselineRef.current = null;\n followRef.current = tipFollowCancel(followRef.current);\n if (followFrameRef.current != null) {\n cancelFrame(followFrameRef.current);\n followFrameRef.current = null;\n }\n }, []);\n\n /** Reader left the tip — wheel, keyboard, pointer-armed scroll-up, or scrollend. */\n const releasePinFromReader = useCallback(() => {\n // The reader took over again: focus on the answered card counts once more.\n answeredCardRef.current = null;\n if (!autoFollow || !pinnedRef.current || hasNewerRef.current) {\n return;\n }\n clearReaderIntent();\n clearPendingReaderLeave();\n stopFollow();\n applyPinned(false);\n if (wantPinRef.current) {\n wantPinRef.current = false;\n }\n if (!olderPrefetchArmedRef.current) {\n olderPrefetchArmedRef.current = true;\n setOlderPrefetchArmed(true);\n }\n }, [autoFollow, applyPinned, clearPendingReaderLeave, clearReaderIntent, stopFollow]);\n\n useEffect(() => {\n if (!readableTurns) return;\n const node = scrollRef.current;\n if (!node) return;\n const onSelection = () => {\n const selection = node.ownerDocument.getSelection();\n if (\n selection &&\n !selection.isCollapsed &&\n node.contains(selection.anchorNode) &&\n node.contains(selection.focusNode)\n ) {\n stopSettlement();\n releasePinFromReader();\n disclosureKeepsUnpinnedRef.current = true;\n }\n };\n node.ownerDocument.addEventListener(\"selectionchange\", onSelection);\n return () => node.ownerDocument.removeEventListener(\"selectionchange\", onSelection);\n }, [readableTurns, releasePinFromReader, stopSettlement]);\n\n /**\n * Settled away from the tip while the camera is idle — Vimium / unfocused\n * PageUp. Folds are recovered by layout tip-follow before this fires at tip.\n */\n const releasePinAfterScrollSettled = useCallback(\n (node: HTMLElement) => {\n if (!autoFollow || !pinnedRef.current || hasNewerRef.current) {\n return;\n }\n if (programmaticScrollRef.current > 0) {\n return;\n }\n if (followRef.current.running || followFrameRef.current != null) {\n return;\n }\n if (isNearBottom(node) || maxScrollOf(node) <= 1) {\n clearPendingReaderLeave();\n return;\n }\n releasePinFromReader();\n rearmOlderPrefetchAfterLeavingTop(node);\n },\n [autoFollow, clearPendingReaderLeave, rearmOlderPrefetchAfterLeavingTop, releasePinFromReader],\n );\n\n const scheduleLeaveFallback = useCallback(() => {\n // Prefer scrollend when the engine supports it.\n if (supportsScrollEndEvent()) {\n return;\n }\n cancelLeaveFallback();\n leaveFallbackRafRef.current = requestFrame(() => {\n leaveFallbackRafRef.current = null;\n const current = scrollRef.current;\n if (current) {\n releasePinAfterScrollSettled(current);\n }\n });\n }, [cancelLeaveFallback, releasePinAfterScrollSettled]);\n\n const requestEarlierFromReader = () => {\n // Upward navigation replaces any earlier downward gesture, even when\n // already unpinned and the engine never delivered scrollend.\n clearReaderIntent();\n releasePinFromReader();\n wantPinRef.current = false;\n // A stationary upward gesture is still demand. Successful short/folded\n // pages may never create enough range to leave the prefetch band.\n olderPageBudgetRef.current = 8;\n if (olderLoadAttemptRef.current?.[1] === 2) {\n olderLoadAttemptRef.current = null;\n setOlderDemand((value) => value + 1);\n }\n };\n const touchPositionRef = useRef<{ x: number; y: number } | null>(null);\n\n const onWheel = (event: {\n deltaY: number;\n deltaX: number;\n target: EventTarget | null;\n currentTarget: EventTarget | null;\n }) => {\n // Nested overflow (code / notice pre) or mostly-horizontal pan: not\n // timeline reader intent. A real timeline wheel in either direction\n // releases the disclosure fence; downward movement may then re-pin\n // naturally when it reaches the bottom.\n if (!eventFromScrollerDom(event)) {\n return;\n }\n if (Math.abs(event.deltaY) <= Math.abs(event.deltaX)) {\n return;\n }\n if (wheelConsumedByNestedScrollable(event)) {\n return;\n }\n stopSettlement();\n disclosureKeepsUnpinnedRef.current = false;\n programmaticScrollRef.current = 0;\n if (event.deltaY >= 0) {\n const node = scrollRef.current;\n readerIntentStartRef.current = node\n ? { scrollTop: node.scrollTop, maxScroll: maxScrollOf(node) }\n : null;\n return;\n }\n requestEarlierFromReader();\n };\n\n /** Touch / stylus / mouse drag on the scroller — explicit leave (not layout). */\n const onPointerDown = (event: {\n button: number;\n pointerType: string;\n target: EventTarget | null;\n currentTarget: EventTarget | null;\n }) => {\n // Primary button / touch / pen only. Ignore right-click etc.\n if ((event.button && event.pointerType === \"mouse\") || !eventFromScrollerDom(event)) {\n return;\n }\n stopSettlement();\n // Clicks on chips/buttons/links must not arm — their settle collapse\n // also drops scrollTop and would false-unpin. Drag on prose/scroller may.\n if (\n event.target instanceof Element &&\n event.target.closest(\"button, a, input, textarea, select, [role='button']\")\n ) {\n return;\n }\n disclosureKeepsUnpinnedRef.current = false;\n programmaticScrollRef.current = 0;\n const node =\n event.currentTarget instanceof HTMLElement ? event.currentTarget : scrollRef.current;\n readerIntentArmRef.current = true;\n readerIntentStartRef.current = node\n ? { scrollTop: node.scrollTop, maxScroll: maxScrollOf(node) }\n : null;\n };\n\n const onKeyDown = (event: {\n key: string;\n target: EventTarget | null;\n currentTarget: EventTarget | null;\n }) => {\n if (!eventFromScrollerDom(event)) {\n return;\n }\n if (\n event.key === \"ArrowUp\" ||\n event.key === \"ArrowDown\" ||\n event.key === \"PageUp\" ||\n event.key === \"PageDown\" ||\n event.key === \"Home\" ||\n event.key === \"End\"\n ) {\n stopSettlement();\n disclosureKeepsUnpinnedRef.current = false;\n // Reader navigation supersedes a pending camera/anchor scroll echo,\n // including downward keys that do not explicitly release the pin.\n programmaticScrollRef.current = 0;\n const node = scrollRef.current;\n readerIntentStartRef.current = node\n ? { scrollTop: node.scrollTop, maxScroll: maxScrollOf(node) }\n : null;\n }\n if (event.key !== \"ArrowUp\" && event.key !== \"PageUp\" && event.key !== \"Home\") {\n return;\n }\n requestEarlierFromReader();\n };\n\n const snapToBottom = useCallback(\n (node: HTMLElement) => {\n clearReaderIntent();\n stopFollow();\n cancelLeaveFallback();\n writeScrollTop(node, Math.max(0, node.scrollHeight - node.clientHeight));\n syncScrollBaseline(node);\n followRef.current = {\n ...followRef.current,\n lastHeight: node.scrollHeight,\n lastClientHeight: node.clientHeight,\n cameraTop: null,\n };\n applyCanSkipTipCatchup(false);\n },\n [\n applyCanSkipTipCatchup,\n cancelLeaveFallback,\n clearReaderIntent,\n stopFollow,\n syncScrollBaseline,\n writeScrollTop,\n ],\n );\n\n /**\n * The person answered a card (finished a connection, say) and the agent\n * continues from that answer: follow the tip as Jump to latest does, while\n * focus stays on the card for keyboard and screen reader users. Wheel, keys,\n * a drag or focus elsewhere hand the view back to the reader as usual.\n */\n const followAfterAnswer = useCallback(\n (card: HTMLElement) => {\n const node = scrollRef.current;\n if (!autoFollow || !node || !node.contains(card) || hasNewerRef.current) {\n return;\n }\n answeredCardRef.current = card;\n disclosureKeepsUnpinnedRef.current = false;\n wantPinRef.current = false;\n clearPendingReaderLeave();\n applyPinned(true);\n snapToBottom(node);\n },\n [applyPinned, autoFollow, clearPendingReaderLeave, snapToBottom],\n );\n\n const beginUserMessageDisclosureChange = useCallback(\n (messageBody: HTMLElement, disclosureControl: HTMLElement) => {\n const node = scrollRef.current;\n if (!node || !node.contains(messageBody)) {\n return null;\n }\n const keepBottom = autoFollow && pinnedRef.current && !hasNewerRef.current;\n if (keepBottom) {\n return () => {\n const current = scrollRef.current;\n if (current) {\n snapToBottom(current);\n }\n };\n }\n\n disclosureKeepsUnpinnedRef.current = true;\n\n const scrollerRect = node.getBoundingClientRect();\n const group = messageBody.closest<HTMLElement>(\"[data-og-timeline-group-anchor]\");\n const groupRect = group?.getBoundingClientRect();\n // Expanding from a visible message top keeps the beginning in place.\n // Collapsing after reading deep in the message keeps the disclosure\n // control in place because the message top is already above the viewport.\n const anchor =\n group &&\n groupRect &&\n groupRect.top >= scrollerRect.top - 1 &&\n groupRect.top < scrollerRect.bottom\n ? group\n : disclosureControl;\n const beforeTop = anchor.getBoundingClientRect().top - scrollerRect.top;\n\n return () => {\n const current = scrollRef.current;\n if (!current || !current.contains(anchor)) {\n return;\n }\n const currentScrollerTop = current.getBoundingClientRect().top;\n const afterTop = anchor.getBoundingClientRect().top - currentScrollerTop;\n const delta = afterTop - beforeTop;\n if (Math.abs(delta) > 0.5) {\n writeScrollTop(current, current.scrollTop + delta);\n }\n applyPinned(false);\n syncScrollBaseline(current);\n };\n },\n [applyPinned, autoFollow, snapToBottom, syncScrollBaseline, writeScrollTop],\n );\n\n const userMessageDisclosureContext = useMemo<UserMessageDisclosureContextValue>(\n () => ({\n expandedByMessageId: userMessageDisclosureMemoryRef.current,\n beginChange: beginUserMessageDisclosureChange,\n labels: {\n showMore: userMessageDisclosureLabels?.showMore,\n showLess: userMessageDisclosureLabels?.showLess,\n },\n }),\n [\n beginUserMessageDisclosureChange,\n userMessageDisclosureLabels?.showMore,\n userMessageDisclosureLabels?.showLess,\n ],\n );\n const timelineGroupEntryContext = useMemo<TimelineGroupEntryContext>(\n () => ({\n userMessageDisclosureContext,\n behavior: {\n renderMessageActions,\n renderMessageText: renderSearchableMessageText,\n onOpenSession,\n onMemoryClick,\n onReconnect,\n renderAuthNeeded,\n resolveProviderLogo,\n toolRegistry,\n loadRetainedScreenshot,\n loadRetainedArtifact,\n loadVideoArtifactPlayback,\n genieLoading,\n turnSummary,\n },\n }),\n [\n loadRetainedArtifact,\n loadRetainedScreenshot,\n loadVideoArtifactPlayback,\n onMemoryClick,\n onOpenSession,\n onReconnect,\n renderAuthNeeded,\n renderMessageActions,\n renderSearchableMessageText,\n resolveProviderLogo,\n toolRegistry,\n genieLoading,\n turnSummary,\n userMessageDisclosureContext,\n ],\n );\n\n const releaseSearchPin = useCallback(() => {\n applyPinned(false);\n stopFollow();\n setRevealed(true);\n }, [applyPinned, stopFollow]);\n useTimelineSearchNavigation(\n scrollRef,\n searchItem?.id,\n searchTarget,\n releaseSearchPin,\n resolvedItems,\n );\n\n const requestOlderIfUnderfilled = useCallback(\n (node: HTMLElement, retry?: OlderLoadAttempt) => {\n let currentAttempt = olderLoadAttemptRef.current;\n if (retry && (currentAttempt !== retry || retry[0] !== olderBoundaryKey)) {\n // AnimatePresence may retain the exiting button briefly. Its stale\n // handler cannot replace a newer exact owner.\n return;\n }\n const underfilled = maxScrollOf(node) <= 1;\n if (!retry && underfilled && currentAttempt?.[1] === 3) {\n // A receipted prefetch already declined or failed while the viewport\n // was still scrollable. Collapse may later remove the scroll range;\n // promote that exact owner to Retry without issuing another request.\n currentAttempt[1] = 0;\n setUnderfillSettledAttempt(currentAttempt);\n return;\n }\n if (!retry && underfilled && currentAttempt?.[1] === 2) {\n // A settled ordinary prefetch owns only this visit to the top band.\n // If its resulting window cannot scroll, yield to automatic underfill\n // so the reader is not stranded behind a cooldown they cannot exit.\n currentAttempt = olderLoadAttemptRef.current = null;\n }\n // clientHeight=0 is pre-layout/headless, not evidence that the rendered\n // history underfills a real viewport.\n if (\n node.clientHeight <= 1 ||\n (!retry && !underfilled) ||\n !hasOlder ||\n loadingOlder ||\n !onLoadOlder ||\n (currentAttempt && !retry)\n ) {\n return;\n }\n const attempt: OlderLoadAttempt = (olderLoadAttemptRef.current = [olderBoundaryKey]);\n setUnderfillSettledAttempt(null);\n // Every underfill request owns the ordinary sentinel too, even if reader\n // intent had not armed it yet when this short-window request began.\n const noProgress = () => {\n if (scrollRef.current && olderLoadAttemptRef.current === attempt) {\n setUnderfillSettledAttempt(attempt);\n }\n };\n // Legacy fire-and-forget callbacks keep the one-shot behavior. Hosts\n // that return the real promise opt into safe rejection/no-progress retry;\n // exact `false` is the first-party request-not-accepted receipt.\n // All other fulfillment retains this exact owner until its prepend\n // boundary commits; promise settlement alone cannot prove progress.\n invokeOlderLoad(onLoadOlder, noProgress, attempt, !retry);\n },\n [hasOlder, loadingOlder, olderBoundaryKey, onLoadOlder],\n );\n const scheduleQuestionNav = useCallback(() => {\n if (!readableTurns || questionNavFrameRef.current != null) {\n return;\n }\n questionNavFrameRef.current = requestFrame(() => {\n questionNavFrameRef.current = null;\n const node = scrollRef.current;\n // A short viewport (a narrow embed above a decision card) has no room\n // for a floating pill that would cover the very rows being read.\n // clientHeight <= 1 is pre-layout/headless, not a short viewport.\n const roomy =\n node !== null &&\n (node.clientHeight <= 1 || node.clientHeight >= questionNavMinViewportRef.current);\n const next = node && roomy ? readQuestionNav(node) : null;\n setQuestionNav((current) => (sameQuestionNav(current, next) ? current : next));\n });\n }, [readableTurns]);\n scheduleQuestionNavRef.current = scheduleQuestionNav;\n useEffect(\n () => () => {\n if (questionNavFrameRef.current != null) {\n cancelFrame(questionNavFrameRef.current);\n questionNavFrameRef.current = null;\n }\n },\n [],\n );\n const jumpToQuestion = (key: string) => {\n const node = scrollRef.current;\n const top = node ? contentTopOf(node, key) : null;\n if (!node || top === null) {\n return;\n }\n // Explicit reader navigation: leave the tip and park the question on top.\n releasePinFromReader();\n wantPinRef.current = false;\n disclosureKeepsUnpinnedRef.current = false;\n writeScrollTop(node, Math.max(0, top - QUESTION_NAV_MARGIN_PX));\n // Hand keyboard/accessibility focus to the actual destination. This also\n // gives native scroll anchoring the new question rather than an old work\n // row when the bounded context subsequently gains a later history page.\n node\n .querySelector<HTMLElement>(`[data-og-group-key=\"${cssEscapeAttribute(key)}\"]`)\n ?.focus({ preventScroll: true });\n syncScrollBaseline(node);\n scheduleQuestionNav();\n };\n\n // Land once on the moment an inbox item or a notification points at.\n // Deliberately dependency-free: it retries after every commit until the\n // target row is laid out, and the ref guard makes the state update run once\n // per focus sequence, so it cannot chain renders.\n const focusedSequenceRef = useRef<number | null>(null);\n // oxlint-disable-next-line react-hooks/exhaustive-deps -- retries each commit; ref-guarded to run once\n useLayoutEffect(() => {\n if (!focusSequence || focusedSequenceRef.current === focusSequence) return;\n const index = timelineGroupIndexAtSequence(\n groups.map((entry) => entry.group),\n focusSequence,\n );\n const key = index >= 0 ? groups[index]?.key : undefined;\n const node = scrollRef.current;\n if (!key || !node || contentTopOf(node, key) === null) return;\n focusedSequenceRef.current = focusSequence;\n setRevealed(true);\n jumpToQuestion(key);\n });\n\n const driveFollowRef = useRef<(node: HTMLElement, now?: number) => void>(\n requestOlderIfUnderfilled as (node: HTMLElement, now?: number) => void,\n );\n const driveFollow = useCallback(\n (node: HTMLElement, nowMs?: number) => {\n if (!pinnedRef.current || hasNewerRef.current) {\n stopFollow();\n return;\n }\n // Reader/extension leave in flight — do not yank back before scrollend.\n if (pendingReaderLeaveRef.current) {\n stopFollow();\n return;\n }\n cancelLeaveFallback();\n // Prefer the rAF timestamp so ease integrates against vsync (and tests\n // can advance a synthetic clock via requestAnimationFrame callbacks).\n const now =\n typeof nowMs === \"number\"\n ? nowMs\n : typeof performance !== \"undefined\"\n ? performance.now()\n : Date.now();\n let previousHeight = followRef.current.lastHeight;\n const previousObservedHeight = lastScrollHeightRef.current;\n if (\n contentShrinkBaselineRef.current &&\n previousObservedHeight > 0 &&\n node.scrollHeight > previousObservedHeight\n ) {\n // A reversal ends the collapse sequence. If it remains below the held\n // baseline, adopt the recovered height; if it grew beyond the baseline,\n // leave that baseline for tipFollowStep to observe as real growth.\n contentShrinkBaselineRef.current = null;\n if (node.scrollHeight < previousHeight) {\n followRef.current = {\n ...followRef.current,\n lastHeight: node.scrollHeight,\n cameraTop: null,\n };\n previousHeight = node.scrollHeight;\n }\n }\n const shrinkObservation = tipFollowObserveContentShrink(\n contentShrinkBaselineRef.current,\n previousHeight,\n lastScrollTopRef.current,\n node.scrollHeight,\n node.clientHeight,\n );\n contentShrinkBaselineRef.current = shrinkObservation.baseline;\n // Settle-collapse: compensate Δh from the pre-shrink baseline (browser\n // may already have clamped — don't double-subtract). Keep the follow rAF\n // alive so when collapse ends (or stream resumes) we ease instead of a\n // hard stop → flick. Do NOT tip-ease on the same frame as a real shrink\n // (that fight was the top-of-viewport flicker).\n if (shrinkObservation.compensatedScrollTop !== null) {\n let nextTop = shrinkObservation.compensatedScrollTop;\n // A chrome/composer dock can land on the same frame as a settle-fold\n // (the \"turn blocked\" moment). Compensate BOTH in one write — adopting\n // the shrunk clientHeight below without gluing left the chrome height\n // behind as cold tip debt.\n const previousClient = followRef.current.lastClientHeight;\n if (previousClient > 0 && node.clientHeight < previousClient - TIP_FOLLOW_SHRINK_EPS_PX) {\n nextTop = tipFollowCompensateViewportShrink(\n nextTop,\n previousClient,\n node.clientHeight,\n node.scrollHeight,\n );\n }\n writeScrollTop(node, nextTop);\n syncScrollBaseline(node);\n followRef.current = {\n ...followRef.current,\n lastHeight: node.scrollHeight,\n lastClientHeight: node.clientHeight,\n running: true,\n lastTs: now,\n // A direct glue write re-based the camera — drop any stale fraction.\n cameraTop: null,\n };\n if (followFrameRef.current == null) {\n followFrameRef.current = requestFrame((frameNow) => {\n followFrameRef.current = null;\n const current = scrollRef.current;\n if (current) {\n driveFollowRef.current(current, frameNow);\n }\n });\n }\n return;\n }\n const result = tipFollowStep(followRef.current, {\n scrollTop: node.scrollTop,\n scrollHeight: node.scrollHeight,\n clientHeight: node.clientHeight,\n now,\n pinned: true,\n reducedMotion: prefersReducedMotion(),\n revealed: revealedRef.current,\n });\n followRef.current = result.state;\n writeScrollTop(node, result.scrollTop);\n syncScrollBaseline(node);\n applyCanSkipTipCatchup(\n result.state.running &&\n maxScrollOf(node) - node.scrollTop >= JUMP_TO_LATEST_CATCHUP_DEBT_PX,\n );\n if (result.state.running) {\n cancelLeaveFallback();\n if (followFrameRef.current == null) {\n followFrameRef.current = requestFrame((frameNow) => {\n followFrameRef.current = null;\n const current = scrollRef.current;\n if (current) {\n driveFollowRef.current(current, frameNow);\n }\n });\n }\n } else if (followFrameRef.current != null) {\n cancelFrame(followFrameRef.current);\n followFrameRef.current = null;\n }\n },\n [applyCanSkipTipCatchup, cancelLeaveFallback, stopFollow, syncScrollBaseline, writeScrollTop],\n );\n driveFollowRef.current = driveFollow;\n\n useEffect(() => stopFollow, [stopFollow]);\n useEffect(() => () => cancelLeaveFallback(), [cancelLeaveFallback]);\n\n // The single post-commit scroll authority. Runs after EVERY commit (no dep\n // list): any commit may change content height, and the decision is cheap.\n // Also the ONLY writer of the prepend-correction baselines\n // (previousFirstItemIdRef / previousScrollHeightRef / group offset maps).\n // oxlint-disable-next-line react-hooks/exhaustive-deps -- Deliberately runs after every commit.\n useLayoutEffect(() => {\n const node = scrollRef.current;\n if (!node) {\n return;\n }\n const previousFirstItemId = previousFirstItemIdRef.current;\n const previousFirstItemGroupKey = firstItemGroupKeyRef.current;\n const previousFirstItemGroupOffsetTop = firstItemGroupOffsetTopRef.current;\n const previousItemContentTop = firstItemContentTopRef.current;\n const previousScrollTop = lastScrollTopRef.current;\n const previousMaxScroll = lastMaxScrollRef.current;\n const wasAtLiveTailBeforeCommit =\n previousMaxScroll <= 1 ||\n previousMaxScroll - previousScrollTop < Math.min(PIN_THRESHOLD_PX, previousMaxScroll);\n const firstItemChanged = !!previousFirstItemId && firstItemId !== previousFirstItemId;\n const sourceChanged = olderBoundaryKey !== previousSourceBoundaryRef.current;\n const retainedSource =\n sourceItems?.some((item) => previousSourceIdsRef.current.has(item.id)) ?? false;\n const prepended = sourceChanged && retainedSource;\n previousSourceBoundaryRef.current = olderBoundaryKey;\n previousSourceIdsRef.current = new Set(sourceItems?.map((item) => item.id));\n const readingAnchor = readingAnchorRef.current;\n readingAnchorRef.current = null;\n const settlement = settlementRef.current;\n settlementRef.current = null;\n const attempt = olderLoadAttemptRef.current;\n const committedZeroOverlapOlderReplacement = !!(\n attempt?.[2]?.committed &&\n sourceChanged &&\n !retainedSource\n );\n const restorePrependAnchor = () => {\n const correction = readingAnchor && timelineAnchorCorrection(node, readingAnchor);\n if (correction != null) {\n if (Math.abs(correction) > 1) writeScrollTop(node, node.scrollTop + correction);\n return;\n }\n // Keep the reader on the same retained rows. Prefer the exact first-item\n // content coordinate (needed when a prepend merges inside one group),\n // then the retained group offset, then scrollHeight as a final fallback.\n // If native anchoring already applied the same shift, leave scrollTop.\n let delta: number | null = null;\n if (previousFirstItemId && previousItemContentTop != null) {\n const itemEl = node.querySelector(\n `[data-og-item=\"${cssEscapeAttribute(previousFirstItemId)}\"]`,\n );\n if (itemEl instanceof HTMLElement) {\n const scrollerTop = node.getBoundingClientRect().top;\n const currentItemTop = itemEl.getBoundingClientRect().top - scrollerTop + node.scrollTop;\n delta = Math.round(currentItemTop - previousItemContentTop);\n }\n }\n const anchorKey = previousFirstItemGroupKey;\n const anchorEl =\n anchorKey != null\n ? node.querySelector(`[data-og-group-key=\"${cssEscapeAttribute(anchorKey)}\"]`)\n : null;\n if (\n delta == null &&\n anchorEl instanceof HTMLElement &&\n previousFirstItemGroupOffsetTop != null\n ) {\n const moved = Math.round(anchorEl.offsetTop - previousFirstItemGroupOffsetTop);\n if (moved) {\n delta = moved;\n }\n }\n if (delta == null) {\n const heightDelta = Math.round(node.scrollHeight - previousScrollHeightRef.current);\n if (heightDelta > 0) {\n delta = heightDelta;\n }\n }\n if (delta != null) {\n const expected = previousScrollTop + delta;\n if (Math.abs(node.scrollTop - expected) > 2) {\n writeScrollTop(node, expected);\n }\n }\n };\n if (pendingJumpToStartRef.current && firstItemChanged) {\n // The oldest window landed — jump against the NEW DOM, and skip the\n // prepend correction (it would shift the reader away from the top).\n pendingJumpToStartRef.current = false;\n stopFollow();\n writeScrollTop(node, 0);\n } else if (wantPinRef.current && !hasNewer) {\n // Jump-to-latest was pressed on a history window and the tip window is\n // in THIS commit — consume pre-paint so the first tip frame is already\n // at the bottom (post-paint consumption flashed one clamped frame).\n wantPinRef.current = false;\n if (autoFollow) {\n applyPinned(true);\n snapToBottom(node);\n }\n } else if (committedZeroOverlapOlderReplacement) {\n // An oldest-directed bounded page can replace every previously mounted\n // row. Its receipt is the only causal proof that this is backward\n // progress rather than live-tail forward eviction. Anchor at the bottom\n // seam before recording this window's scroll baselines so an unpinned\n // reader stays adjacent to the history they were reading.\n clearPendingReaderLeave();\n stopFollow();\n writeScrollTop(node, maxScrollOf(node));\n if (attempt?.[1] === 1 && pinnedRef.current) {\n applyPinned(false);\n }\n } else if (prepended) {\n const olderAttemptState = olderLoadAttemptRef.current?.[1];\n const underfillOwned =\n !!olderLoadAttemptRef.current &&\n olderAttemptState !== 1 &&\n olderAttemptState !== 2 &&\n olderAttemptState !== 3;\n if (\n autoFollow &&\n pinnedRef.current &&\n !hasNewer &&\n !pendingReaderLeaveRef.current &&\n (wasAtLiveTailBeforeCommit || underfillOwned)\n ) {\n // Still following the live tip: underfill, or a prefetch the reader\n // started and then returned from. Park at the new tip. A stale pin\n // while they are actually up in a short window (gap is not inside\n // PIN_THRESHOLD of maxScroll, so wasAtLiveTail is false) restores.\n clearPendingReaderLeave();\n snapToBottom(node);\n } else {\n restorePrependAnchor();\n if (autoFollow && pinnedRef.current && !hasNewer) {\n // Geometry or a pending extension/programmatic leave proves the\n // reader was browsing history even if the pin ref has not settled.\n stopFollow();\n clearPendingReaderLeave();\n applyPinned(false);\n }\n }\n } else if (!pinnedRef.current && readingAnchor && readableTurns) {\n // A live work row moves behind newly streamed prose. Correct only the\n // residual movement native anchoring did not absorb, using the reader's\n // retained paragraph/control rather than the moving row's outer box.\n const correction = timelineAnchorCorrection(node, readingAnchor);\n if (correction !== null && Math.abs(correction) > 1) {\n writeScrollTop(node, node.scrollTop + correction);\n }\n const focused = readingAnchor.find((anchor) => anchor.focused)?.element;\n if (\n focused &&\n node.contains(focused) &&\n node.ownerDocument.activeElement === node.ownerDocument.body\n ) {\n focused.focus({ preventScroll: true });\n }\n } else if (autoFollow && pinnedRef.current && !hasNewer) {\n // Load/remount (still hidden): hard-park. Live tip after reveal: ease.\n // Pending unarmed leave: tip *growth* must not yank (Vimium during stream).\n // Flat/shrink commits (fold) still recover — height did not grow under us.\n if (!revealedRef.current) {\n snapToBottom(node);\n } else if (pendingReaderLeaveRef.current) {\n if (node.scrollHeight <= lastScrollHeightRef.current) {\n clearPendingReaderLeave();\n driveFollow(node);\n }\n } else {\n driveFollow(node);\n }\n }\n // After a prepend, if restore left us below the top prefetch band,\n // re-arm so a later approach can load again. Still cooling while parked\n // inside the band (short pages) — that stops the y=0 load loop.\n if (prepended && !pinnedRef.current && node.scrollTop > OLDER_PREFETCH_MARGIN_PX) {\n rearmOlderPrefetchAfterLeavingTop(node);\n }\n scheduleQuestionNav();\n previousFirstItemIdRef.current = firstItemId;\n previousScrollHeightRef.current = node.scrollHeight;\n syncScrollBaseline(node);\n // offsetTop queries are O(groups); skip while pinned at the live tip\n // (every stream token used to remeasure the whole timeline).\n firstItemGroupKeyRef.current = groups[0]?.key ?? null;\n const needOffsets =\n prepended ||\n firstItemChanged ||\n !pinnedRef.current ||\n hasNewer ||\n firstItemContentTopRef.current == null;\n if (needOffsets) {\n const committedFirstGroupKey = firstItemGroupKeyRef.current;\n const firstGroupEl = committedFirstGroupKey\n ? node.querySelector(`[data-og-group-key=\"${cssEscapeAttribute(committedFirstGroupKey)}\"]`)\n : null;\n firstItemGroupOffsetTopRef.current =\n firstGroupEl instanceof HTMLElement ? firstGroupEl.offsetTop : null;\n const firstItemEl = firstItemId\n ? node.querySelector(`[data-og-item=\"${cssEscapeAttribute(firstItemId)}\"]`)\n : null;\n firstItemContentTopRef.current =\n firstItemId && firstItemEl instanceof HTMLElement\n ? firstItemEl.getBoundingClientRect().top -\n node.getBoundingClientRect().top +\n node.scrollTop\n : null;\n }\n\n if (settlement) settlementAnimationRef.current = animateTimelineSettlement(settlement);\n\n // Promise settlement is not itself permission to retry. A receipt-marked\n // accepted page retires its exact owner on this commit even when projection\n // is empty or merges into the same first item. Without that mark, retain\n // the compatibility fallback: a retained prior boundary proves prepend,\n // while a missing prior boundary is forward eviction and merely rebases.\n if (!attempt) {\n return;\n }\n if (!attempt[2]?.committed && attempt[0] === olderBoundaryKey) {\n return;\n }\n if (\n !attempt[2]?.committed &&\n attempt[0] &&\n !sourceItems?.find((entry) => entry.id === attempt[0])\n ) {\n attempt[0] = olderBoundaryKey;\n return;\n }\n if (!attempt[1] || !hasOlder) {\n setUnderfillSettledAttempt((olderLoadAttemptRef.current = null));\n return;\n }\n // Boundary progress retires the request owner. A late settlement from\n // that completed prefetch cannot mutate the new window's cooldown owner.\n olderLoadAttemptRef.current = [olderBoundaryKey, 2];\n // Bound automatic work, but let continued upward input replenish demand.\n // Only a committed first-party receipt proves that another page is safe.\n if (\n attempt[2]?.committed &&\n !pinnedRef.current &&\n hasOlder &&\n node.scrollTop <= OLDER_PREFETCH_MARGIN_PX &&\n olderPageBudgetRef.current > 0\n ) {\n olderPageBudgetRef.current -= 1;\n olderLoadAttemptRef.current = null;\n setOlderDemand((value) => value + 1);\n }\n rearmOlderPrefetchAfterLeavingTop(node);\n requestOlderIfUnderfilled(node);\n });\n\n // First paint / session remount: keep the scroller hidden, snap to tip for\n // two animation frames (late sync layout), then reveal. Does not change the\n // live tip-follow law used once `revealed` is true.\n useLayoutEffect(() => {\n if (revealed || !allGroups.length) {\n return;\n }\n let cancelled = false;\n let frame2 = 0;\n const park = () => {\n const node = scrollRef.current;\n if (node && autoFollow && pinnedRef.current && !hasNewerRef.current) {\n snapToBottom(node);\n }\n };\n park();\n const frame1 = requestFrame(() => {\n if (cancelled) {\n return;\n }\n park();\n frame2 = requestFrame(() => {\n if (cancelled) {\n return;\n }\n park();\n setRevealed(true);\n });\n });\n return () => {\n cancelled = true;\n cancelFrame(frame1);\n if (frame2) {\n cancelFrame(frame2);\n }\n };\n }, [revealed, allGroups.length, autoFollow, snapToBottom]);\n\n // A cleared timeline (stream identity change) re-arms the reveal + prefetch\n // gate and returns to bottom-follow for the next session's first paint.\n useLayoutEffect(() => {\n if (allGroups.length > 0) {\n return;\n }\n if (revealed) {\n setRevealed(false);\n }\n if (olderPrefetchArmedRef.current) {\n olderPrefetchArmedRef.current = false;\n setOlderPrefetchArmed(false);\n }\n wantPinRef.current = false;\n pendingJumpToStartRef.current = false;\n previousFirstItemIdRef.current = null;\n previousScrollHeightRef.current = 0;\n lastScrollTopRef.current = 0;\n lastMaxScrollRef.current = 0;\n lastScrollHeightRef.current = 0;\n lastClientHeightRef.current = 0;\n firstItemGroupKeyRef.current = null;\n firstItemGroupOffsetTopRef.current = null;\n firstItemContentTopRef.current = null;\n foldMemoryRef.current.clear();\n userMessageDisclosureMemoryRef.current.clear();\n disclosureKeepsUnpinnedRef.current = false;\n clearReaderIntent();\n contentShrinkBaselineRef.current = null;\n seenActivityIdsRef.current.clear();\n applyPinned(true);\n }, [allGroups.length, revealed, applyPinned, clearReaderIntent]);\n\n // Parent commits cover the initial/history-loading cases. Disclosure state\n // changes are child-local, so the ResizeObserver below owns dynamic collapse\n // and expansion after mount.\n useEffect(() => {\n const node = scrollRef.current;\n if (node) {\n requestOlderIfUnderfilled(node);\n }\n });\n\n // Clear the bulk-paint marker a frame after it renders, so rows appended\n // live (streams, new turns) animate exactly as before.\n useLayoutEffect(() => {\n previousBulkFirstKeyRef.current = firstGroupKey;\n if (!bulkRender) {\n return;\n }\n setBulkActive(true);\n const frame = requestFrame(() => setBulkActive(false));\n return () => cancelFrame(frame);\n }, [bulkRender, firstGroupKey]);\n\n // Prefetch older history only after the reader scrolls up from the tip.\n // Once armed, the sentinel trips early so backfill is usually rendered\n // (and its scroll delta corrected) before the reader reaches it. Gated so\n // a short prepend that leaves the sentinel intersecting cannot loop.\n useEffect(() => {\n const root = scrollRef.current;\n const target = topSentinelRef.current;\n if (\n !root ||\n !target ||\n !olderPrefetchArmed ||\n !hasOlder ||\n loadingOlder ||\n !onLoadOlder ||\n typeof IntersectionObserver === \"undefined\"\n ) {\n return;\n }\n const observer = new IntersectionObserver(\n (entries) => {\n const intersecting = entries.some((entry) => entry.isIntersecting);\n if (!intersecting) {\n // Left the top band. A settled ordinary prefetch releases its exact\n // owner here; a still-pending request remains cooling so a quick\n // leave/re-enter cannot overlap it.\n const attempt = olderLoadAttemptRef.current;\n if (attempt?.[1] === 2 || attempt?.[1] === 3) {\n olderLoadAttemptRef.current = null;\n }\n return;\n }\n // Both automatic underfill and ordinary prefetch use one boundary\n // owner. In particular, live growth cannot arm a second sentinel load\n // while the short-window request that preceded it is still pending.\n if (olderLoadAttemptRef.current) {\n return;\n }\n const attempt: OlderLoadAttempt = (olderLoadAttemptRef.current = [olderBoundaryKey, 1]);\n const noProgress = () => {\n if (!scrollRef.current || olderLoadAttemptRef.current !== attempt) {\n return;\n }\n attempt[1] = 3;\n if (root.scrollTop > OLDER_PREFETCH_MARGIN_PX) {\n olderLoadAttemptRef.current = null;\n } else if (maxScrollOf(root) <= 1) {\n attempt[1] = 0;\n setUnderfillSettledAttempt(attempt);\n }\n };\n // Preserve legacy fire-and-forget top-band retries: the callback has\n // synchronously returned, but this visit remains cooling until exit.\n // Only rejection/throw/exact `false` is a no-progress receipt. Other\n // fulfillment retains the pending owner until boundary commit;\n // otherwise a delayed prepend could overlap a same-boundary request.\n if (\n !invokeOlderLoad(onLoadOlder, noProgress, attempt) &&\n olderLoadAttemptRef.current === attempt\n ) {\n olderLoadAttemptRef.current[1] = 2;\n requestOlderIfUnderfilled(root);\n }\n },\n { root, rootMargin: OLDER_PREFETCH_ROOT_MARGIN },\n );\n observer.observe(target);\n return () => observer.disconnect();\n }, [\n firstGroupKey,\n hasOlder,\n loadingOlder,\n olderBoundaryKey,\n olderPrefetchArmed,\n olderDemand,\n onLoadOlder,\n requestOlderIfUnderfilled,\n ]);\n\n // History view: page forward when the reader nears the bottom of the current\n // non-tip window. Does not pull the whole gap — one density-bounded page.\n useEffect(() => {\n const root = scrollRef.current;\n const target = bottomSentinelRef.current;\n if (\n !root ||\n !target ||\n !hasNewer ||\n loadingNewer ||\n !onLoadNewer ||\n typeof IntersectionObserver === \"undefined\"\n ) {\n return;\n }\n const observer = new IntersectionObserver(\n (entries) => {\n // An underfilled history window has both sentinels visible. Advancing\n // it automatically would undo an explicit older-page navigation.\n if (maxScrollOf(root) > 1 && entries.some((entry) => entry.isIntersecting)) {\n requestNewer();\n }\n },\n { root, rootMargin: \"0px 0px 1200px 0px\" },\n );\n observer.observe(target);\n return () => observer.disconnect();\n }, [hasNewer, loadingNewer, onLoadNewer, requestNewer, firstGroupKey]);\n\n // Late layout that React commits cannot see (images decoding, fonts, code\n // blocks) grows content without a commit. While pinned, soft-follow the tip;\n // unpinned: do nothing — chasing those shifts was the wobble. Coalesce RO\n // into one rAF.\n useEffect(() => {\n const node = scrollRef.current;\n const inner = node?.firstElementChild;\n if (!node || !inner || typeof ResizeObserver === \"undefined\") {\n return;\n }\n const observer = new ResizeObserver(() => {\n if (resizeFollowRafRef.current != null) {\n return;\n }\n resizeFollowRafRef.current = requestFrame(() => {\n resizeFollowRafRef.current = null;\n const current = scrollRef.current;\n if (!current) {\n return;\n }\n // A viewport that shrank below the pill's minimum hides it now, not\n // on the next scroll.\n if (questionNavMinViewportRef.current > 0) scheduleQuestionNavRef.current();\n requestOlderIfUnderfilled(current);\n if (!autoFollow || !pinnedRef.current || hasNewerRef.current) {\n return;\n }\n // Still unveiling the first tip frame: hard-park (no ease settle).\n if (!revealedRef.current) {\n snapToBottom(current);\n return;\n }\n driveFollow(current);\n });\n });\n observer.observe(inner);\n // The scroller's own box moves the bottom too (window resize, composer\n // growing): clientHeight changes with no inner resize and no commit.\n observer.observe(node);\n return () => {\n observer.disconnect();\n if (resizeFollowRafRef.current != null) {\n cancelFrame(resizeFollowRafRef.current);\n resizeFollowRafRef.current = null;\n }\n };\n }, [autoFollow, driveFollow, requestOlderIfUnderfilled, snapToBottom]);\n\n // Entering a non-tip history window: drop any live pin so the page bottom\n // cannot re-stick follow across loadNewer. Leaving it (the tip window\n // landed): honor a pending Jump-to-latest, or re-pin a reader already parked\n // at what just became the live bottom — paging forward to the tip must not\n // strand them unpinned watching new content grow below.\n useEffect(() => {\n // Closing find is paint-only; it must not trigger this history-to-tip rule.\n if (searchTargetRef.current) return;\n if (hasNewer) {\n stopFollow();\n applyPinned(false);\n return;\n }\n const node = scrollRef.current;\n if (!node) {\n return;\n }\n if (wantPinRef.current) {\n wantPinRef.current = false;\n if (autoFollow) {\n applyPinned(true);\n snapToBottom(node);\n }\n return;\n }\n if (autoFollow && !pinnedRef.current && isNearBottom(node)) {\n applyPinned(true);\n }\n }, [hasNewer, autoFollow, applyPinned, snapToBottom, stopFollow]);\n\n // After the scroll authority above has settled each commit, record whether\n // the reader is away from the tip (content can land below an unpinned\n // reader without any scroll event).\n // oxlint-disable-next-line react-hooks/exhaustive-deps -- Deliberately runs after every commit.\n useLayoutEffect(() => {\n const node = scrollRef.current;\n if (node && !pinnedRef.current) setAwayFromTip(!isNearBottom(node));\n });\n\n // Pinned: layout/camera recover tip debt; wheel/keys/pointer-arm unpin\n // immediately; extension jumps settle via scrollend (or one-rAF fallback).\n // Do not tip-follow-yank an in-flight unarmed scroll-away — that ate Vimium.\n const onScroll = () => {\n const node = scrollRef.current;\n if (!node) {\n return;\n }\n // Only an unpinned reader's distance matters for the jump.\n if (!pinnedRef.current) setAwayFromTip(!isNearBottom(node));\n scheduleQuestionNav();\n const previousTop = lastScrollTopRef.current;\n const previousMaxScroll = lastMaxScrollRef.current;\n const nextTop = node.scrollTop;\n const nextMaxScroll = maxScrollOf(node);\n const nextHeight = node.scrollHeight;\n const readerUp = readerScrollUpPx(previousTop, nextTop, previousMaxScroll, nextMaxScroll);\n const maxFell = nextMaxScroll < previousMaxScroll - 1;\n const readerArmed = readerIntentArmRef.current;\n const readerIntentStart = readerIntentStartRef.current;\n const cumulativeReaderUp =\n readerArmed && readerIntentStart\n ? readerScrollUpPx(\n readerIntentStart.scrollTop,\n nextTop,\n readerIntentStart.maxScroll,\n nextMaxScroll,\n )\n : readerUp;\n const heightShrunk =\n followRef.current.lastHeight > 0 &&\n nextHeight < followRef.current.lastHeight - TIP_FOLLOW_SHRINK_EPS_PX;\n // Consume all pending camera-write echoes (browsers may coalesce writes).\n const programmatic = programmaticScrollRef.current > 0;\n if (programmatic) {\n programmaticScrollRef.current = 0;\n }\n if (disclosureKeepsUnpinnedRef.current) {\n stopFollow();\n applyPinned(false);\n syncScrollBaseline(node);\n return;\n }\n\n if (programmatic && !pinnedRef.current) {\n // Restore/camera writes while reading history are not a return to the tip.\n // Still expire a pending Jump-to-latest latch: the in-window jump itself\n // is a programmatic snap, and a later reader scroll-away can arrive\n // before that echo is consumed. Skipping this left the latch armed and\n // snapped the reader when hasNewer later flipped false.\n syncScrollBaseline(node);\n if (wantPinRef.current && !isNearBottom(node)) {\n wantPinRef.current = false;\n }\n return;\n }\n\n if (autoFollow && pinnedRef.current && !hasNewer) {\n // Fold / composer / SessionChrome: viewport shrink raises maxScroll without\n // growing content. Must hit tipFollow before we adopt the new clientHeight\n // (the near-bottom branch used to poison lastClientHeight and skip glue).\n const previousClient = followRef.current.lastClientHeight;\n const viewportShrunk =\n previousClient > 0 && node.clientHeight < previousClient - TIP_FOLLOW_SHRINK_EPS_PX;\n // Fold / composer content shrink: compensate before baseline sync so\n // driveFollow still sees the pre-shrink scrollTop (avoid double-subtract).\n if (heightShrunk || maxFell || viewportShrunk) {\n clearReaderIntent();\n clearPendingReaderLeave();\n driveFollow(node);\n return;\n }\n if (programmatic) {\n // Camera-write echo: consume it, sync the SHELL baselines only. The\n // camera's growth baselines (lastHeight / lastClientHeight) belong to\n // tipFollowStep — adopting them here made every echo \"consume\" growth\n // that arrived without a commit (motion/Radix height animations of\n // nested tools, late layout). Echoes fire before rAF callbacks, so the\n // step saw frameGrowth=0, never heated, and the cold ~42px/s settle\n // let bursty growth park the tip under the chrome.\n syncScrollBaseline(node);\n return;\n }\n syncScrollBaseline(node);\n const nearBottomPinned = isNearBottom(node);\n if (nearBottomPinned) {\n clearPendingReaderLeave();\n }\n // Pointer-dragged scroll-up away from tip. Layout churn never arms this.\n if (readerArmed && cumulativeReaderUp > TIP_FOLLOW_READER_UP_EPS_PX && !nearBottomPinned) {\n clearReaderIntent();\n requestEarlierFromReader();\n rearmOlderPrefetchAfterLeavingTop(node);\n return;\n }\n // Tip grew under a still viewport (no reader-up): track the new growth\n // immediately and ease only any debt that already existed.\n // Reader/extension scroll-up in progress: do not yank — scrollend decides.\n // Near-bottom with tipDebt≈0 stays the quiet path (do not broaden follow\n // inside PIN_THRESHOLD — that fights small intentional scroll-ups).\n if (!nearBottomPinned && readerUp <= TIP_FOLLOW_READER_UP_EPS_PX) {\n if (!pendingReaderLeaveRef.current) {\n driveFollow(node);\n }\n } else if (!nearBottomPinned && readerUp > TIP_FOLLOW_READER_UP_EPS_PX) {\n pendingReaderLeaveRef.current = true;\n scheduleLeaveFallback();\n }\n // Near-bottom reader jiggle: stay quiet, and leave the camera's growth\n // baselines alone — adopting them here stole the heat of growth the\n // step had not seen yet (the next driveFollow then settled cold and\n // parked short inside the pin band).\n return;\n }\n\n syncScrollBaseline(node);\n if (programmatic) {\n // Anchor restoration is never permission to resume tip-follow.\n return;\n }\n const nearBottom = isNearBottom(node);\n\n // Re-pin only when the reader moved toward/at the tip. Prepend restore\n // and overflow-anchor raise scrollTop by roughly the same amount as\n // maxScroll; treating that as a scroll-down\n // re-pinned a compact-tail history reader (their preserved gap falls\n // inside PIN_THRESHOLD once the window is tall) and snapped them back.\n // A commit may already have adopted this scroll position into the layout\n // baseline. Explicit wheel/key/pointer intent retains its own start so\n // returning to the tip still re-pins after that interleaving.\n // Passive wheel handlers may run after compositor scrolling; retain the\n // earlier layout baseline when it still contains that reader movement.\n const returnStart =\n readerIntentStart && readerIntentStart.scrollTop <= previousTop ? readerIntentStart : null;\n const inserted = Math.max(0, nextMaxScroll - (returnStart?.maxScroll ?? previousMaxScroll));\n const towardTip = nextTop - (returnStart?.scrollTop ?? previousTop) - inserted;\n // Explicit intent may reach the exact live bottom despite intervening\n // streaming growth. Keep subtracting that growth: native anchoring alone\n // conserves the gap and must never qualify as reader movement.\n const explicitReturnToBottom = returnStart !== null && nextMaxScroll - nextTop <= 1;\n const nextPinned =\n !hasNewer && nearBottom && towardTip > 0.5 && (inserted <= 1 || explicitReturnToBottom);\n if (!nextPinned) {\n stopFollow();\n }\n const focused = node.ownerDocument.activeElement;\n if (\n nextPinned &&\n focused instanceof HTMLElement &&\n focused.hasAttribute(\"data-og-prompt\") &&\n node.contains(focused)\n ) {\n // Question navigation focuses its destination. Returning to the live\n // tip releases that stale reader ownership before the commit snapshot.\n node.focus({ preventScroll: true });\n }\n applyPinned(nextPinned);\n // A far-from-bottom scroll while a Jump-to-latest is pending is the reader\n // changing their mind: drop the latch, or a stale one (host rejected or\n // never flipped hasNewer) would fire a surprise pin + snap whenever the\n // reader later pages to the tip themselves. Our own snaps land AT the\n // bottom, so their echoes read nearBottom and keep a live latch.\n if (wantPinRef.current && !nearBottom) {\n wantPinRef.current = false;\n }\n if (nextPinned) {\n clearReaderIntent();\n return;\n }\n if (readerIntentStart) {\n // This scroll already accounted for the gesture's movement. Retain a\n // fresh start for continuous input across the next commit, not stale\n // movement that could turn a later native clamp into a return to tip.\n readerIntentStartRef.current = { scrollTop: nextTop, maxScroll: nextMaxScroll };\n }\n if (!olderPrefetchArmedRef.current) {\n olderPrefetchArmedRef.current = true;\n setOlderPrefetchArmed(true);\n }\n // Re-arm older prefetch only after leaving the top band (scroll down into\n // content). Never re-arm/load from continued scroll toward y=0.\n rearmOlderPrefetchAfterLeavingTop(node);\n };\n\n const onScrollEnd = () => {\n const node = scrollRef.current;\n if (!node) {\n return;\n }\n cancelLeaveFallback();\n // Engines can emit scrollend between tiny pointer steps. Keep the pinned\n // gesture's cumulative leave budget until it actually leaves the tip.\n if (!pinnedRef.current || !readerIntentArmRef.current) clearReaderIntent();\n if (disclosureKeepsUnpinnedRef.current) {\n programmaticScrollRef.current = 0;\n stopFollow();\n applyPinned(false);\n syncScrollBaseline(node);\n return;\n }\n if (programmaticScrollRef.current > 0) {\n programmaticScrollRef.current = 0;\n syncScrollBaseline(node);\n return;\n }\n releasePinAfterScrollSettled(node);\n };\n // React 18 has no `onScrollEnd` prop: it warns and never calls it, while\n // `supportsScrollEndEvent()` still makes the camera wait for scrollend. A\n // native listener (re-bound each commit, so it always sees this render's\n // handler and scroller) works on every supported React version.\n useEffect(() => {\n const node = scrollRef.current;\n if (!node) return;\n node.addEventListener(\"scrollend\", onScrollEnd);\n return () => node.removeEventListener(\"scrollend\", onScrollEnd);\n });\n\n const timeline = (\n <AllowancePresentationProvider\n render={renderAllowanceExhausted}\n labels={allowanceExhaustedLabels}\n >\n <LightboxProvider>\n <FoldMemoryProvider value={foldMemoryRef.current}>\n <LiveNoteFoldContext.Provider value={reportLiveFold}>\n <SeenActivityIdsProvider value={seenActivityIdsRef.current}>\n <TimelineComputeLabelProvider value={computeLabel ?? null}>\n <EntranceAnimationProvider value={false}>\n <TooltipProvider delayDuration={400}>\n <TimelineAnnotationSourceRootContext.Provider value={scrollRef}>\n <div\n className={cn(\"og-root relative flex min-h-0 flex-col\", className)}\n // Sticky insets start at the scroller's padded content edge\n // (pt-16). Subtract exactly that padding so an expanded work\n // header pins flush to the scrollport. Pinning it lower left a\n // band of scrolling rows visible above the header, which then\n // looked like it floated over the middle of the timeline.\n style={{ \"--og-work-header-top\": \"-4rem\" } as CSSProperties}\n >\n {onAnnotate ? (\n <LazyPart onLoadFailure=\"hide\">\n <TimelineAnnotationSelection\n rootRef={scrollRef}\n sources={annotationSources}\n onAnnotate={onAnnotate}\n />\n </LazyPart>\n ) : null}\n {/* Pinned: anchoring off so the tip-follow camera owns the motion.\n Unpinned: native scroll anchoring holds the reader's place. */}\n <div\n ref={scrollRef}\n data-og-timeline-scroller=\"\"\n data-og-bottom-follow={\n autoFollow && pinned && !hasNewer ? \"true\" : \"false\"\n }\n tabIndex={-1}\n onScroll={onScroll}\n onWheel={onWheel}\n // Copy selected text without the timeline's colours and\n // backgrounds; the browser would otherwise paste them along.\n onCopy={(event) =>\n copySelectionWithoutPageStyles(event, event.currentTarget)\n }\n onTouchStart={(event) => {\n stopSettlement();\n const touch = event.touches.length === 1 ? event.touches[0] : undefined;\n touchPositionRef.current = touch\n ? { x: touch.clientX, y: touch.clientY }\n : null;\n }}\n onTouchMove={(event) => {\n const touch = event.touches[0];\n const previous = touchPositionRef.current;\n if (!touch || !previous || event.touches.length !== 1) {\n touchPositionRef.current = null;\n return;\n }\n const deltaX = previous.x - touch.clientX;\n const deltaY = previous.y - touch.clientY;\n if (Math.max(Math.abs(deltaX), Math.abs(deltaY)) < 4) return;\n touchPositionRef.current = { x: touch.clientX, y: touch.clientY };\n onWheel({\n deltaX,\n deltaY,\n target: event.target,\n currentTarget: event.currentTarget,\n });\n }}\n onTouchEnd={() => {\n touchPositionRef.current = null;\n }}\n onTouchCancel={() => {\n touchPositionRef.current = null;\n }}\n onClickCapture={(event) => {\n if (!eventFromScrollerDom(event)) return;\n const target =\n event.target instanceof Element\n ? event.target.closest(\"button[aria-expanded]\")\n : null;\n if (target) {\n if (target.hasAttribute(\"data-og-work-header\")) {\n releaseProgress(\n target\n .closest(\"[data-og-group-key]\")\n ?.getAttribute(\"data-og-group-key\") ?? null,\n );\n }\n releasePinFromReader();\n disclosureKeepsUnpinnedRef.current = true;\n }\n }}\n onFocusCapture={(event) => {\n if (\n readableTurns &&\n event.target !== event.currentTarget &&\n eventFromScrollerDom(event) &&\n !answeredCardRef.current?.contains(event.target)\n ) {\n stopSettlement();\n releasePinFromReader();\n disclosureKeepsUnpinnedRef.current = true;\n }\n }}\n onPointerDown={onPointerDown}\n onKeyDown={onKeyDown}\n style={\n groups.length > 0 && !revealed ? { visibility: \"hidden\" } : undefined\n }\n className={cn(\n // tabIndex=-1 is programmatic only — never paint a focus ring on\n // the whole scroller (click + Shift used to flash a blue outline).\n \"min-h-0 flex-1 overflow-y-auto overscroll-contain px-4 pt-16 pb-6 sm:px-6 outline-hidden\",\n autoFollow && pinned && !hasNewer\n ? \"[overflow-anchor:none]\"\n : \"[overflow-anchor:auto]\",\n )}\n >\n <TimelineBeforeLayout\n capture={() => {\n if (\n readableTurns &&\n timelineHasReader(scrollRef.current, answeredCardRef.current)\n ) {\n releasePinFromReader();\n }\n readingAnchorRef.current =\n !pinnedRef.current && scrollRef.current\n ? captureTimelineAnchor(scrollRef.current)\n : null;\n settlementRef.current =\n readableTurns &&\n autoFollow &&\n pinnedRef.current &&\n revealedRef.current &&\n !hasNewer &&\n !pendingReaderLeaveRef.current &&\n !disclosureKeepsUnpinnedRef.current &&\n !prefersReducedMotion() &&\n scrollRef.current\n ? captureTimelineSettlement(\n scrollRef.current,\n groups,\n answeredCardRef.current,\n )\n : null;\n }}\n >\n <div className=\"relative mx-auto flex w-full max-w-3xl flex-col gap-5\">\n <AnimatePresence>\n {loadingOlder ||\n loadingOldest ||\n (hasOlder && onJumpToStart && olderPrefetchArmed) ||\n underfillRetryReady ? (\n // Reserved top gutter: controls scroll with history and cannot\n // cover a disclosure. Visibility never changes content height.\n <motion.div\n initial={{ opacity: 0, y: -6 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -6 }}\n transition={{ duration: 0.15, ease: \"easeOut\" }}\n data-og-loading-older=\"\"\n aria-live=\"polite\"\n className=\"pointer-events-none absolute inset-x-0 -top-11 z-10 flex justify-center\"\n >\n {loadingOlder || loadingOldest ? (\n <span className={LOADING_CHIP_CLASS}>\n <ShimmerText>\n {loadingOldest\n ? t(\"messageTimeline.jumpingToStart\")\n : t(\"messageTimeline.loadingEarlierActivity\")}\n </ShimmerText>\n </span>\n ) : null}\n {hasOlder &&\n !loadingOlder &&\n !loadingOldest &&\n (underfillRetryReady || onJumpToStart) ? (\n <button\n type=\"button\"\n data-og-retry={underfillRetryReady || undefined}\n data-og-jump-to-start={!underfillRetryReady || undefined}\n onClick={() => {\n const node = scrollRef.current;\n if (underfillRetryReady) {\n if (node && underfillRetryReadyRef.current) {\n // AnimatePresence retains this handler during\n // exit. Current authorization plus the exact\n // attempt check prevent stale dispatch.\n requestOlderIfUnderfilled(\n node,\n underfillSettledAttempt!,\n );\n }\n return;\n }\n applyPinned(false);\n pendingJumpToStartRef.current = true;\n const seq = ++jumpToStartSeqRef.current;\n void Promise.resolve(onJumpToStart!()).then(\n () => {\n // The commit that swaps in the oldest window consumes\n // the flag against the new DOM; this write covers the\n // already-committed order and the no-window-change\n // case (jumping within the current window).\n const scroller = scrollRef.current ?? node;\n if (scroller) {\n scroller.scrollTop = 0;\n }\n // A host may resolve without ever changing the\n // window (already on the oldest page). Any swap\n // commit runs its layout effect before the next\n // frame, so a flag still armed by then is the\n // no-change case — clear it, or a LATER prepend\n // would spuriously jump the reader to the top.\n requestFrame(() => {\n if (jumpToStartSeqRef.current === seq) {\n pendingJumpToStartRef.current = false;\n }\n });\n },\n () => {\n if (jumpToStartSeqRef.current === seq) {\n pendingJumpToStartRef.current = false;\n }\n },\n );\n }}\n className=\"pointer-events-auto rounded-full border border-og-border px-3 py-1.5 text-og-control\"\n >\n {underfillRetryReady\n ? underfillSettledAttempt?.[2]?.tailPreserved\n ? t(\"messageTimeline.loadEarlierActivity\")\n : t(\"messageTimeline.retryEarlierActivity\")\n : t(\"messageTimeline.jumpToStart\")}\n </button>\n ) : null}\n </motion.div>\n ) : null}\n </AnimatePresence>\n {!groups.length\n ? (emptyState ?? (\n <p className=\"py-10 text-center text-og-menu text-og-fg-subtle\">\n {t(\"messageTimeline.noActivityYet\")}\n </p>\n ))\n : null}\n {hasOlder && olderPrefetchArmed ? (\n // Overlaid, not a layout row: mounting/unmounting the sentinel\n // must never shift content (that shift was itself a wobble).\n // End at the scroll origin above the pt-16 gutter so the\n // observer and scrollTop cooldown share the same 400px band.\n <div\n ref={topSentinelRef}\n data-og-top-sentinel=\"\"\n data-og-timeline-chrome=\"\"\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute inset-x-0 -top-16 h-px -translate-y-full\"\n />\n ) : null}\n {groups.map(({ group, key, entranceEnabled }, index) => {\n return (\n <TimelineSearchRevealContext.Provider\n key={key}\n value={\n searchItem &&\n timelineGroupItemIds(group).includes(searchItem.id)\n ? searchRevealKey\n : null\n }\n >\n <TimelineGroupEntry\n groupKey={key}\n group={group}\n nextGroup={groups[index + 1]?.group}\n startupDismissed={\n group.kind === \"activity\" &&\n group.items.some(\n (item) => item.turnId && turnsWithOutput.has(item.turnId),\n )\n }\n entranceEnabled={entranceEnabled}\n liveEntranceEnabled={\n group.kind === \"activity\" ? !bulkRender : undefined\n }\n noteFolded={\n group.kind === \"item\"\n ? liveNoteFolds.get(group.item.id)\n : undefined\n }\n context={timelineGroupEntryContext}\n />\n </TimelineSearchRevealContext.Provider>\n );\n })}\n {groups.length > 0 && trailingState ? (\n <div data-og-timeline-trailing-state=\"\">{trailingState}</div>\n ) : null}\n {hasNewer && newerFailure?.key === newerBoundaryKey ? (\n <div\n data-og-newer-error=\"\"\n className=\"flex flex-col items-center gap-2 px-4 py-3 text-center text-og-menu text-og-fg-muted\"\n >\n <p role=\"status\" className=\"max-w-prose [overflow-wrap:anywhere]\">\n {t(\"messageTimeline.couldnTLoadLaterActivity\", {\n message: newerFailure.message,\n })}\n </p>\n <button\n ref={newerRetryButtonRef}\n type=\"button\"\n data-og-retry-newer=\"\"\n className=\"min-h-11 rounded-og-md border border-og-border px-3 py-2 text-og-fg hover:bg-og-surface-2 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-og-accent\"\n aria-disabled={loadingNewer || newerRetryPending}\n aria-busy={newerRetryPending}\n onClick={() => requestNewer(true)}\n >\n {newerRetryPending\n ? t(\"messageTimeline.retryingLaterActivity\")\n : t(\"messageTimeline.retryLaterActivity\")}\n </button>\n </div>\n ) : null}\n {hasNewer ? (\n <div\n ref={bottomSentinelRef}\n data-og-bottom-sentinel=\"\"\n data-og-timeline-chrome=\"\"\n aria-hidden=\"true\"\n className=\"h-px w-full\"\n />\n ) : null}\n </div>\n </TimelineBeforeLayout>\n </div>\n {draftAnnotations && draftAnnotations.length > 0 ? (\n <LazyPart onLoadFailure=\"hide\">\n <TimelineAnnotationMarkers\n rootRef={scrollRef}\n annotations={draftAnnotations}\n onSelect={onDraftAnnotationSelect}\n />\n </LazyPart>\n ) : null}\n\n <div\n data-og-timeline-nav=\"top\"\n className={cn(\n \"pointer-events-none absolute inset-x-0 z-10 flex justify-center\",\n questionNav?.belowHeader ? \"top-10 pointer-coarse:top-13\" : \"top-3\",\n )}\n >\n <AnimatePresence>\n {questionNav ? (\n <motion.button\n key=\"question-nav\"\n {...NAV_FADE}\n type=\"button\"\n data-og-question-nav=\"\"\n data-og-jump-to-question=\"\"\n title={t(\"messageTimeline.backToYourMessage\")}\n onClick={() => jumpToQuestion(questionNav.key)}\n className={NAV_BUTTON_CLASS}\n >\n <ArrowUpIcon aria-hidden className=\"size-4\" />\n <span className=\"sr-only\">\n {t(\"messageTimeline.backToYourMessage\")}\n </span>\n </motion.button>\n ) : null}\n </AnimatePresence>\n </div>\n <div\n data-og-timeline-nav=\"bottom\"\n className=\"pointer-events-none absolute inset-x-0 bottom-3 z-10 flex flex-col items-center gap-2\"\n >\n <AnimatePresence>\n {loadingNewer ? (\n <motion.div\n key=\"loading-newer\"\n {...NAV_FADE}\n data-og-loading-newer=\"\"\n aria-live=\"polite\"\n className=\"flex max-w-full justify-center\"\n >\n <span className={LOADING_CHIP_CLASS}>\n <ShimmerText>\n {t(\"messageTimeline.loadingLaterActivity\")}\n </ShimmerText>\n </span>\n </motion.div>\n ) : null}\n {jumpPillShown ? (\n <motion.button\n key=\"jump-to-latest\"\n {...NAV_FADE}\n type=\"button\"\n data-og-jump-to-latest=\"\"\n title={t(\"messageTimeline.jumpToLatest\")}\n onClick={() => {\n // Returning to the tip explicitly releases reader-owned\n // prose. Clear only this timeline's selection before the\n // synchronous ownership check on the next commit.\n const viewport = scrollRef.current;\n const selection = viewport?.ownerDocument.getSelection();\n if (\n selection &&\n !selection.isCollapsed &&\n (viewport?.contains(selection.anchorNode) ||\n viewport?.contains(selection.focusNode))\n )\n selection.removeAllRanges();\n disclosureKeepsUnpinnedRef.current = false;\n if (hasNewer) {\n // Do not pin against the current history page — its bottom\n // is not the tip. The pin + snap run when the tip window\n // actually lands (`hasNewer` flips false).\n wantPinRef.current = true;\n const node = scrollRef.current;\n if (onJumpToLatest) {\n void Promise.resolve(onJumpToLatest()).then(\n () => {\n // Covers a host that flipped hasNewer before\n // resolving; otherwise the tip-window commit\n // consumes the flag.\n const current = scrollRef.current;\n if (\n current &&\n wantPinRef.current &&\n !hasNewerRef.current\n ) {\n wantPinRef.current = false;\n applyPinned(true);\n snapToBottom(current);\n }\n },\n () => {\n // The tip reload failed (ordinary network error):\n // an armed latch would fire a surprise snap when\n // the reader later pages to the tip themselves.\n wantPinRef.current = false;\n },\n );\n } else if (node) {\n // No tip reload available: jump within the in-memory\n // window so the newer sentinel can page forward; the\n // latch pins if the tip window eventually lands.\n snapToBottom(node);\n }\n return;\n }\n const node = scrollRef.current;\n if (node) {\n applyPinned(true);\n snapToBottom(node);\n }\n }}\n className={NAV_BUTTON_CLASS}\n >\n <ArrowDownIcon aria-hidden className=\"size-4\" />\n <span className=\"sr-only\">{t(\"messageTimeline.jumpToLatest\")}</span>\n </motion.button>\n ) : null}\n </AnimatePresence>\n </div>\n </div>\n </TimelineAnnotationSourceRootContext.Provider>\n </TooltipProvider>\n </EntranceAnimationProvider>\n </TimelineComputeLabelProvider>\n </SeenActivityIdsProvider>\n </LiveNoteFoldContext.Provider>\n </FoldMemoryProvider>\n </LightboxProvider>\n </AllowancePresentationProvider>\n );\n // Agent-authored object links resolve through the host, never the console.\n return (\n <OpenGeniLinkProvider resolveLink={resolveLink}>\n <MessageSenderContext.Provider value={renderMessageSender}>\n <AgentIdentityProvider\n items={resolvedItems}\n resolveSessionTitle={resolveSessionTitle}\n onOpenSession={onOpenSession}\n >\n <ProviderLogoProvider value={resolveProviderLogo}>\n <TimelineAnswerFollowContext.Provider value={followAfterAnswer}>\n {timeline}\n </TimelineAnswerFollowContext.Provider>\n </ProviderLogoProvider>\n </AgentIdentityProvider>\n </MessageSenderContext.Provider>\n </OpenGeniLinkProvider>\n );\n}\n\ntype KeyedTimelineGroup = {\n group: TimelineGroup;\n key: string;\n entranceEnabled: boolean;\n};\n\nfunction timelineGroupsRenderEqual(previous: TimelineGroup, next: TimelineGroup): boolean {\n try {\n return dequal(previous, next);\n } catch {\n // Consumer-owned `unknown` payloads may be proxies/getters. Equality is an\n // optimization only; a hostile comparator surface must fall back to the\n // authoritative new group rather than taking down the timeline render.\n return false;\n }\n}\n\n/**\n * Projection can legitimately change a group's content-derived key while\n * retaining its existing rows. The common pagination case is an older activity\n * item merging into the first activity group; live appends grow the same group\n * from the other side. Match the new authoritative groups to the previous\n * committed groups by their durable item IDs so both the React key and the\n * progressive-window anchor survive either change.\n */\nfunction useStableTimelineGroupKeys(\n allGroups: TimelineGroup[],\n entranceEnabled: boolean,\n): KeyedTimelineGroup[] {\n const previousRef = useRef<KeyedTimelineGroup[]>([]);\n const keyedGroups = useMemo(() => {\n const previousByItemId = new Map<string, KeyedTimelineGroup>();\n for (const previous of previousRef.current) {\n for (const itemId of timelineGroupItemIds(previous.group)) {\n // A live progress note is both its own row and listed in its work\n // history. Its own row owns the id, so the note keeps its identity.\n if (previous.group.kind === \"item\" || !previousByItemId.has(itemId)) {\n previousByItemId.set(itemId, previous);\n }\n }\n }\n\n const usedKeys = new Set<string>();\n return allGroups.map((group, index) => {\n const itemIds = timelineGroupItemIds(group);\n let retainedGroup: KeyedTimelineGroup | undefined;\n for (const itemId of itemIds) {\n const previous = previousByItemId.get(itemId);\n // Retain only same-kind matches. Activity → turn wrap must NOT keep the\n // activity chip's React key: that reused a collapsed TurnSummary and\n // skipped the settle beat (insta-collapse / content flash).\n const startupCompletion =\n previous?.group.kind === \"activity\" &&\n previous.group.items.every(\n (item) =>\n item.kind === \"startup-phase\" || (item.kind === \"reasoning\" && !item.text.trim()),\n ) &&\n group.kind === \"turn\" &&\n group.outcome === \"complete\" &&\n group.groups.every(\n (child) =>\n child.kind === \"activity\" &&\n child.items.every((item) => item.kind === \"startup-phase\"),\n );\n if (\n previous &&\n (previous.group.kind === group.kind || startupCompletion) &&\n !usedKeys.has(previous.key)\n ) {\n retainedGroup = previous;\n break;\n }\n }\n\n const canonicalKey = timelineGroupKey(group);\n let key = retainedGroup?.key ?? canonicalKey;\n let collision = 0;\n while (usedKeys.has(key)) {\n key = `${canonicalKey}:${index}:${collision}`;\n collision += 1;\n }\n usedKeys.add(key);\n return {\n group:\n retainedGroup && timelineGroupsRenderEqual(retainedGroup.group, group)\n ? retainedGroup.group\n : group,\n key,\n entranceEnabled: retainedGroup?.entranceEnabled ?? entranceEnabled,\n };\n });\n }, [allGroups, entranceEnabled]);\n\n useLayoutEffect(() => {\n previousRef.current = keyedGroups;\n }, [keyedGroups]);\n\n return keyedGroups;\n}\n\nfunction requestFrame(callback: FrameRequestCallback): number {\n if (typeof requestAnimationFrame === \"function\") {\n return requestAnimationFrame(callback);\n }\n return window.setTimeout(() => callback(performance.now()), 16);\n}\n\nfunction cancelFrame(id: number): void {\n if (typeof cancelAnimationFrame === \"function\") {\n cancelAnimationFrame(id);\n return;\n }\n window.clearTimeout(id);\n}\n\ntype TimelineGroupRenderBoundaryProps = {\n children: ReactNode;\n resetKeys: readonly unknown[];\n};\n\ntype TimelineGroupRenderBoundaryState = {\n failed: boolean;\n /** The item's code failed to download; only a reload helps. */\n notLoaded: boolean;\n resetKeys: readonly unknown[];\n};\n\nfunction timelineRenderResetKeysChanged(\n previous: readonly unknown[],\n next: readonly unknown[],\n): boolean {\n return (\n previous.length !== next.length || previous.some((key, index) => !Object.is(key, next[index]))\n );\n}\n\n/**\n * A malformed historical payload or consumer renderer must not take down the\n * entire conversation. Keep the boundary outside the row component so React\n * can replace an invalid element type (error #130) with a bounded fallback.\n */\nfunction TimelineGroupRenderError() {\n const t = useOpenGeniText();\n return (\n <div\n data-testid=\"timeline-group-render-error\"\n role=\"status\"\n className=\"flex items-start gap-2 rounded-lg border border-og-border bg-og-surface-2 px-3 py-2 text-og-menu text-og-fg-muted\"\n >\n <TriangleAlertIcon aria-hidden=\"true\" className=\"mt-0.5 size-4 shrink-0\" />\n <div>\n <p className=\"font-medium text-og-fg\">{t(\"messageTimeline.timelineItemUnavailable\")}</p>\n <p>{t(\"messageTimeline.timelineItemUnavailableDetail\")}</p>\n </div>\n </div>\n );\n}\n\nclass TimelineGroupRenderBoundary extends Component<\n TimelineGroupRenderBoundaryProps,\n TimelineGroupRenderBoundaryState\n> {\n state: TimelineGroupRenderBoundaryState = {\n failed: false,\n notLoaded: false,\n resetKeys: this.props.resetKeys,\n };\n\n static getDerivedStateFromError(error: unknown): Partial<TimelineGroupRenderBoundaryState> {\n return { failed: true, notLoaded: isChunkLoadError(error) };\n }\n\n static getDerivedStateFromProps(\n props: TimelineGroupRenderBoundaryProps,\n state: TimelineGroupRenderBoundaryState,\n ): Partial<TimelineGroupRenderBoundaryState> | null {\n if (timelineRenderResetKeysChanged(state.resetKeys, props.resetKeys)) {\n return { failed: false, notLoaded: false, resetKeys: props.resetKeys };\n }\n return null;\n }\n\n render(): ReactNode {\n if (this.state.failed) {\n return this.state.notLoaded ? <LoadFailureNotice /> : <TimelineGroupRenderError />;\n }\n return this.props.children;\n }\n}\n\ntype TimelineGroupEntryProps = {\n groupKey: string;\n group: TimelineGroup;\n nextGroup?: TimelineGroup | undefined;\n startupDismissed: boolean;\n entranceEnabled: boolean;\n liveEntranceEnabled?: boolean | undefined;\n /**\n * Present for a live progress note: true while its turn's work disclosure is\n * open (the note then reads inside it), false while it reads here.\n */\n noteFolded?: boolean | undefined;\n context: TimelineGroupEntryContext;\n};\n\ntype TimelineGroupEntryContext = {\n userMessageDisclosureContext: UserMessageDisclosureContextValue;\n behavior: TimelineGroupBehaviorProps;\n};\n\ntype TimelineGroupBehaviorProps = {\n renderMessageActions: MessageTimelineProps[\"renderMessageActions\"];\n renderMessageText:\n | ((text: string, item: AgentMessageItem | UserMessageItem) => ReactNode)\n | undefined;\n onOpenSession: MessageTimelineProps[\"onOpenSession\"];\n onMemoryClick: MessageTimelineProps[\"onMemoryClick\"];\n onReconnect: MessageTimelineProps[\"onReconnect\"];\n renderAuthNeeded: MessageTimelineProps[\"renderAuthNeeded\"];\n resolveProviderLogo: MessageTimelineProps[\"resolveProviderLogo\"];\n toolRegistry: ToolRegistry;\n loadRetainedScreenshot: MessageTimelineProps[\"loadRetainedScreenshot\"];\n loadRetainedArtifact: MessageTimelineProps[\"loadRetainedArtifact\"];\n loadVideoArtifactPlayback: MessageTimelineProps[\"loadVideoArtifactPlayback\"];\n genieLoading: MessageTimelineProps[\"genieLoading\"];\n turnSummary: MessageTimelineProps[\"turnSummary\"];\n};\n\n/**\n * Keep the complete settled-row shell behind one shallow memo boundary. A\n * prepend still reconciles the keyed list, but render-equivalent suffix groups\n * skip their providers, error boundaries, disclosure wrappers, and row trees.\n */\nconst TimelineGroupEntry = memo(function TimelineGroupEntry({\n groupKey,\n group,\n nextGroup,\n startupDismissed,\n entranceEnabled,\n liveEntranceEnabled,\n noteFolded,\n context,\n}: TimelineGroupEntryProps) {\n const reducedMotion = useReducedMotion();\n const { behavior, userMessageDisclosureContext } = context;\n const contextCompactionCount =\n group.kind === \"turn\"\n ? (group.contextCompactionCount ?? 0)\n : group.kind === \"activity\" &&\n nextGroup?.kind === \"item\" &&\n nextGroup.item.kind === \"context-compaction\" &&\n nextGroup.item.phase === \"compacted\"\n ? 1\n : 0;\n const content = (\n <ActivityNoteTextContext.Provider value={behavior.renderMessageText ?? null}>\n <TimelineGroupView\n {...behavior}\n group={group}\n foldLiveCluster={isAgentProgress(nextGroup)}\n startupDismissed={startupDismissed}\n trailingAgentText={trailingAgentTextAfterTurn(group, nextGroup)}\n contextCompactionCount={contextCompactionCount > 0 ? contextCompactionCount : undefined}\n />\n </ActivityNoteTextContext.Provider>\n );\n return (\n <GenieLoadingOptionsContext.Provider value={behavior.genieLoading}>\n <div\n data-og-timeline-group-anchor=\"\"\n data-og-group-key={groupKey}\n data-og-prompt={\n group.kind === \"item\" && group.item.kind === \"user-message\" ? \"\" : undefined\n }\n tabIndex={group.kind === \"item\" && group.item.kind === \"user-message\" ? -1 : undefined}\n // A live progress note reads inside its open work row instead; folded,\n // it takes no space and also gives back the list's gap-5 above it.\n data-og-live-note={noteFolded === undefined ? undefined : noteFolded ? \"folded\" : \"shown\"}\n data-og-live-note-id={\n noteFolded !== undefined && group.kind === \"item\" ? group.item.id : undefined\n }\n aria-hidden={noteFolded || undefined}\n {...inertProps(noteFolded)}\n className={\n noteFolded ? \"-mt-5 h-0 overflow-hidden opacity-0 [overflow-anchor:none]\" : undefined\n }\n >\n <EntranceAnimationProvider value={entranceEnabled} liveValue={liveEntranceEnabled}>\n <TimelineGroupRenderBoundary resetKeys={[group, behavior]}>\n <UserMessageDisclosureProvider value={userMessageDisclosureContext}>\n {/* Item groups never switch the preparation/content key. Keep their\n DOM shell without mounting inert presence and motion lifecycles\n for every historical message in a prepend. */}\n {group.kind === \"item\" ? (\n <div>{content}</div>\n ) : (\n <AnimatePresence initial={false}>\n <motion.div\n key={\n !startupDismissed &&\n group.kind === \"activity\" &&\n !group.work &&\n group.items.every(\n (item) =>\n item.kind === \"startup-phase\" ||\n (item.kind === \"reasoning\" && !item.text.trim()),\n )\n ? \"preparation\"\n : \"content\"\n }\n initial={false}\n exit={{ opacity: 0, height: 0 }}\n transition={{ duration: reducedMotion ? 0 : 0.2 }}\n >\n {content}\n </motion.div>\n </AnimatePresence>\n )}\n </UserMessageDisclosureProvider>\n </TimelineGroupRenderBoundary>\n </EntranceAnimationProvider>\n </div>\n </GenieLoadingOptionsContext.Provider>\n );\n});\n\n// The full loaded window stays mounted, so settled history rows must be cheap\n// on every commit: the stable-key projection reuses render-equivalent group\n// objects, so memo skips them. Changed projection content receives a new group\n// object, and behavior/callback changes are separate props, so ordinary\n// streaming and host updates still invalidate immediately.\nconst TimelineGroupView = memo(function TimelineGroupView({\n group,\n renderMessageActions,\n renderMessageText,\n onOpenSession,\n onMemoryClick,\n onReconnect,\n renderAuthNeeded,\n resolveProviderLogo,\n toolRegistry,\n loadRetainedScreenshot,\n loadRetainedArtifact,\n loadVideoArtifactPlayback,\n turnSummary,\n insideTurn = false,\n nestClusterChips = false,\n foldLiveCluster = false,\n startupDismissed = false,\n trailingAgentText,\n contextCompactionCount,\n}: {\n group: TimelineGroup;\n renderMessageActions?: ((item: AgentMessageItem | UserMessageItem) => ReactNode) | undefined;\n renderMessageText?:\n | ((text: string, item: AgentMessageItem | UserMessageItem) => ReactNode)\n | undefined;\n onOpenSession?: ((sessionId: string) => void) | undefined;\n onMemoryClick?: ((memoryId: string) => void) | undefined;\n onReconnect?: ((item: AuthNeededItem) => void | Promise<void>) | undefined;\n /** Host-owned inline connection setup. Return undefined to use the default recovery card. */\n renderAuthNeeded?: ((item: AuthNeededItem) => ReactNode | undefined) | undefined;\n resolveProviderLogo?: ((providerDomain: string) => string | null | undefined) | undefined;\n toolRegistry: ToolRegistry;\n loadRetainedScreenshot?: RetainedScreenshotLoader | undefined;\n loadRetainedArtifact?: RetainedArtifactLoader | undefined;\n loadVideoArtifactPlayback?: VideoArtifactPlaybackLoader | undefined;\n turnSummary?: TurnSummaryOptions | undefined;\n /** A completed cluster of a still-RUNNING turn (not the live tail) folds\n behind a neutral chip — the one place activity without an outcome still\n folds, bounding the DOM of days-long autonomous turns. */\n foldLiveCluster?: boolean;\n startupDismissed?: boolean;\n /** Rendering inside an expanded turn group: the outer chip already owns the\n failure surface, so nested chips stay tinted but quiet (no repeated\n failure text, no auto-open) — one loud error, N calm sub-expands. */\n insideTurn?: boolean;\n /**\n * Parent turn has ≥2 foldable activity clusters. Only then do we wrap settled\n * clusters in nested chips — a single cluster under \"N steps\" is redundant.\n * During outer settle chrome, nested chips stay force-open (structure kept,\n * height stable) instead of flat-mapping to bare rails.\n */\n nestClusterChips?: boolean;\n /**\n * Final agent answer extracted as a sibling after a settled turn — folded\n * into \"Copy turn\" so the chip copies the whole assistant reply, not only\n * mid-turn narration still inside the fold.\n */\n trailingAgentText?: string | undefined;\n /** Secondary chip facet when this fold sits next to a compaction landmark. */\n contextCompactionCount?: number | undefined;\n}) {\n const t = useOpenGeniText();\n const startupDetails = useStartupDetails();\n const enter = useEntranceAnimation();\n const settleChrome = useTurnSettleOpen();\n const previousSingleActivity = useRef<ActivityItem | undefined>(undefined);\n useLayoutEffect(() => {\n const work =\n group.kind === \"activity\" ? group.items.filter((item) => item.kind !== \"startup-phase\") : [];\n previousSingleActivity.current = work.length === 1 ? work[0] : undefined;\n }, [group]);\n const foldMemory = useFoldMemory();\n const reportLiveFold = useContext(LiveNoteFoldContext);\n // Settled (or live-fold) activity clusters get a chip. Inside an expanded\n // turn that is the second layer — quiet nested chips under the outer turn\n // summary when contiguous activity naturally clusters (≥2 only).\n const containsPresentedImage = timelineGroupContainsPresentedImage(group);\n const hasRememberedImageFold =\n group.kind === \"activity\" && containsPresentedImage && foldMemory?.has(group.id);\n // Primary images stay visible through live narration and the turn wrap.\n // Manual collapse still belongs to TurnSummary's existing fold memory.\n const activityShouldFold =\n group.kind === \"activity\" &&\n !containsPresentedImage &&\n !!(group.outcome || (foldLiveCluster && clusterIsSettled(group)));\n // Latch live→folded so a top-level shell that was already mounted open can\n // start the settle beat without remounting bare rail → wrapper.\n const liveActivitySettle = useLiveSettleFold(activityShouldFold && !insideTurn);\n const turnDefaultOpen =\n !insideTurn &&\n group.kind === \"turn\" &&\n (group.outcome === \"failed\" ||\n timelineGroupContainsAuthNeeded(group) ||\n containsPresentedImage);\n // activity-* → turn-* remount: carry resting state so settleFold does not\n // re-open a chip the reader already watched collapse.\n if (group.kind === \"turn\" && foldMemory && !insideTurn) {\n inheritFoldRestingState(\n foldMemory,\n group.id,\n group.groups.flatMap((child) => (child.kind === \"activity\" ? [child.id] : [])),\n );\n }\n const settleFold =\n !turnSummary?.rolling &&\n (group.kind === \"turn\" ? !!(enter && !insideTurn && !turnDefaultOpen) : liveActivitySettle);\n switch (group.kind) {\n case \"activity\":\n if (group.work) {\n const preparing = isPreparingWork(group, { startupDetails, startupDismissed });\n if (preparing) {\n // Preparation is primary, never hidden in an activity disclosure.\n // Keep work.startedAt unchanged for the handoff and settled duration.\n return (\n <ActivityRail\n items={group.items}\n startupActive\n bare\n toolRegistry={toolRegistry}\n onOpenSession={onOpenSession}\n onMemoryClick={onMemoryClick}\n loadRetainedScreenshot={loadRetainedScreenshot}\n loadRetainedArtifact={loadRetainedArtifact}\n />\n );\n }\n const workStatus = readableWorkStatus(t, { ...group, work: group.work });\n const status: TurnSummaryStatus =\n workStatus.kind === \"working\"\n ? {\n ...workStatus,\n preview: readableWorkShowsPreview(group) ? (\n <RollingActivity\n items={group.items}\n toolRegistry={toolRegistry}\n showCount={false}\n />\n ) : undefined,\n }\n : workStatus.kind === \"waiting\"\n ? {\n kind: \"waiting\",\n label: workStatus.label,\n since: workStatus.since,\n // One quiet line under the row saying what the wait needs,\n // kept visible when the work is expanded; never a second\n // warning banner.\n guidance: workStatus.detail ? (\n <span\n data-og-exchange-wait-detail=\"\"\n className=\"block text-og-sm text-og-fg-subtle\"\n >\n {workStatus.detail}\n </span>\n ) : undefined,\n }\n : group.work.cycles?.summary\n ? {\n ...workStatus,\n // Folded quiet cycles say what the agent is waiting on.\n preview: (\n <p\n data-og-cycles-summary=\"\"\n className=\"truncate text-og-sm text-og-fg-subtle\"\n title={group.work.cycles.summary}\n >\n {group.work.cycles.summary}\n </p>\n ),\n }\n : workStatus;\n return (\n // Marks this work row for the live-note fold (list keys can be carried\n // over from an earlier row, so they are not the work id).\n <div className=\"contents\" data-og-work-id={group.id}>\n <TurnSummary\n key=\"work\"\n items={group.items}\n bare={insideTurn || undefined}\n status={status}\n // A wait before any visible work has nothing to reveal.\n expandable={readableWorkHasDetails(\n { ...group, work: group.work },\n { startupDetails },\n )}\n outcome={group.outcome}\n failureText={group.failureText}\n failureDetail={group.failureDetail}\n foldKey={group.id}\n defaultOpen={readableWorkDefaultOpen(group)}\n unloadedSteps={!!group.work.steps && group.work.steps.state !== \"complete\"}\n facets={turnSummary?.facets}\n contextCompactionCount={compactedLandmarkCount(group.work.details)}\n onOpenStateChange={\n group.work.liveNoteIds?.length && reportLiveFold\n ? (open) => reportLiveFold(group.id, open)\n : undefined\n }\n >\n <TurnRailFrame compact>\n {group.work.steps ? (\n <TurnStepsLoader\n steps={group.work.steps}\n autoLoad={!readableWorkDefaultOpen(group)}\n />\n ) : null}\n {renderFoldedGroups(\n group.work.details,\n {\n renderMessageActions,\n renderMessageText,\n onOpenSession,\n onMemoryClick,\n onReconnect,\n renderAuthNeeded,\n resolveProviderLogo,\n toolRegistry,\n loadRetainedScreenshot,\n loadRetainedArtifact,\n loadVideoArtifactPlayback,\n turnSummary,\n },\n true,\n )}\n </TurnRailFrame>\n </TurnSummary>\n </div>\n );\n }\n // Preparation is one quiet surface, not a fold with eight technical steps.\n // A later turn of the same exchange keeps its status row instead.\n if (\n !startupDetails &&\n !insideTurn &&\n !group.outcome &&\n group.items.every(\n (item) =>\n item.kind === \"startup-phase\" || (item.kind === \"reasoning\" && !item.text.trim()),\n )\n ) {\n return (\n <ActivityRail\n items={group.items}\n startupActive={!startupDismissed && !foldLiveCluster}\n bare\n toolRegistry={toolRegistry}\n onOpenSession={onOpenSession}\n onMemoryClick={onMemoryClick}\n loadRetainedScreenshot={loadRetainedScreenshot}\n loadRetainedArtifact={loadRetainedArtifact}\n />\n );\n }\n if (\n turnSummary?.rolling &&\n insideTurn &&\n !startupDetails &&\n !hasRememberedImageFold &&\n group.items.filter((item) => item.kind !== \"startup-phase\").length === 1\n ) {\n return (\n <ActivityRail\n items={group.items}\n startupActive={false}\n bare\n toolRegistry={toolRegistry}\n onOpenSession={onOpenSession}\n onMemoryClick={onMemoryClick}\n loadRetainedScreenshot={loadRetainedScreenshot}\n loadRetainedArtifact={loadRetainedArtifact}\n />\n );\n }\n if (insideTurn) {\n // Nested chips whenever the parent has ≥2 clusters. During outer settle\n // chrome they stay force-open so structure is visible and height stays\n // stable through collapse — never flat-map to bare rails (that flash\n // was the \"inner steps vanish then reappear nested\" bug). Key flips\n // when chrome clears so they remount closed inside the already-hidden\n // parent (safe; mid-collapse remount of closed chips was the snap).\n // foldKey memory overrides the force-open: a cluster that already\n // settled closed pre-wrap was showing as a CHIP, so mounting it closed\n // is both the stable height and the honest state — force-opening it\n // was the \"already-collapsed cluster auto-expands at the end\" reopen.\n const visibleActivity = group.items.filter((item) => item.kind !== \"startup-phase\");\n const singleThought =\n !startupDetails &&\n visibleActivity.length === 1 &&\n visibleActivity[0]?.kind === \"reasoning\";\n // Untouched images stay primary output, but a reader-owned image fold\n // must keep its shell across a multi-cluster wrap. A bare rail would\n // bypass the remembered choice; retaining either state also lets the\n // reader reopen and close the same chip after settlement.\n const useNestedChip =\n nestClusterChips && (activityShouldFold || hasRememberedImageFold) && !singleThought;\n if (!useNestedChip) {\n return (\n <ActivityRail\n items={group.items}\n {...(startupDismissed ? { startupActive: false } : {})}\n onOpenSession={onOpenSession}\n onMemoryClick={onMemoryClick}\n toolRegistry={toolRegistry}\n loadRetainedScreenshot={loadRetainedScreenshot}\n loadRetainedArtifact={loadRetainedArtifact}\n bare\n />\n );\n }\n return (\n <TurnSummary\n key={settleChrome ? \"settle\" : \"rest\"}\n items={group.items}\n outcome={group.outcome}\n failureText={undefined}\n bare\n defaultOpen={settleChrome ? true : undefined}\n foldKey={group.id}\n facets={turnSummary?.facets}\n contextCompactionCount={contextCompactionCount}\n >\n <ActivityRail\n items={group.items}\n onOpenSession={onOpenSession}\n onMemoryClick={onMemoryClick}\n toolRegistry={toolRegistry}\n loadRetainedScreenshot={loadRetainedScreenshot}\n loadRetainedArtifact={loadRetainedArtifact}\n bare\n />\n </TurnSummary>\n );\n }\n // Always the same TurnSummary shell while live so mid-turn fold only\n // flips settleFold (collapse) instead of remounting bare rail → wrapper.\n return (\n <TurnSummary\n // Apply the primary-output default when a rolling activity first\n // produces an image; the stable foldKey still preserves user choices.\n key={containsPresentedImage ? \"primary-image\" : \"activity\"}\n items={group.items}\n outcome={group.outcome}\n failureText={group.failureText}\n failureDetail={group.failureDetail}\n defaultOpen={\n group.outcome === \"failed\" ||\n containsPresentedImage ||\n (!turnSummary?.rolling && !activityShouldFold)\n ? true\n : undefined\n }\n liveHeader={\n turnSummary?.rolling &&\n !containsPresentedImage &&\n !group.outcome &&\n !foldLiveCluster ? (\n <RollingActivity\n items={group.items}\n toolRegistry={toolRegistry}\n previousItem={previousSingleActivity.current}\n />\n ) : undefined\n }\n foldKey={group.id}\n facets={turnSummary?.facets}\n settleFold={settleFold}\n contextCompactionCount={contextCompactionCount}\n >\n <FoldBody>\n <TurnRailFrame>\n <ActivityRail\n items={group.items}\n onOpenSession={onOpenSession}\n onMemoryClick={onMemoryClick}\n toolRegistry={toolRegistry}\n loadRetainedScreenshot={loadRetainedScreenshot}\n loadRetainedArtifact={loadRetainedArtifact}\n bare\n />\n </TurnRailFrame>\n </FoldBody>\n </TurnSummary>\n );\n case \"turn\": {\n const activityItems = flattenActivityItems(group.groups);\n if (\n !startupDetails &&\n group.outcome === \"complete\" &&\n group.groups.every(\n (child) =>\n child.kind === \"activity\" &&\n child.items.every(\n (item) => item.kind === \"startup-phase\" && item.status === \"complete\",\n ),\n )\n )\n return <ActivityRail items={activityItems} startupActive={false} bare />;\n const turnCopyText = collectTurnCopyText(group.groups, trailingAgentText);\n const body = renderFoldedGroups(group.groups, {\n renderMessageActions,\n renderMessageText,\n onOpenSession,\n onMemoryClick,\n onReconnect,\n renderAuthNeeded,\n resolveProviderLogo,\n toolRegistry,\n loadRetainedScreenshot,\n loadRetainedArtifact,\n loadVideoArtifactPlayback,\n turnSummary,\n });\n const durationMs = durationBetween(group.startedAt, group.endedAt);\n return (\n <TurnSummary\n items={activityItems}\n outcome={group.outcome}\n failureText={insideTurn ? undefined : group.failureText}\n failureDetail={insideTurn ? undefined : group.failureDetail}\n durationMs={durationMs}\n defaultOpen={turnDefaultOpen ? true : undefined}\n bare={insideTurn}\n foldKey={group.id}\n facets={turnSummary?.facets}\n settleFold={settleFold}\n copyText={insideTurn ? undefined : turnCopyText}\n contextCompactionCount={contextCompactionCount ?? group.contextCompactionCount}\n >\n <FoldBody>\n {insideTurn ? (\n // A nested turn is already on an ancestor rail — its body just stacks\n // flush (the bare-node body already indents it), so no second rule.\n <div className=\"flex flex-col gap-4\">{body}</div>\n ) : (\n <TurnRailFrame>{body}</TurnRailFrame>\n )}\n </FoldBody>\n </TurnSummary>\n );\n }\n case \"item\":\n return (\n <TimelineRow\n item={group.item}\n renderMessageActions={renderMessageActions}\n renderMessageText={renderMessageText}\n onReconnect={onReconnect}\n renderAuthNeeded={renderAuthNeeded}\n resolveProviderLogo={resolveProviderLogo}\n onOpenSession={onOpenSession}\n loadVideoArtifactPlayback={loadVideoArtifactPlayback}\n />\n );\n }\n});\n\ntype FoldedGroupBehavior = {\n renderMessageActions?: ((item: AgentMessageItem | UserMessageItem) => ReactNode) | undefined;\n renderMessageText?:\n | ((text: string, item: AgentMessageItem | UserMessageItem) => ReactNode)\n | undefined;\n onOpenSession?: ((sessionId: string) => void) | undefined;\n onMemoryClick?: ((memoryId: string) => void) | undefined;\n onReconnect?: ((item: AuthNeededItem) => void | Promise<void>) | undefined;\n renderAuthNeeded?: ((item: AuthNeededItem) => ReactNode | undefined) | undefined;\n resolveProviderLogo?: ((providerDomain: string) => string | null | undefined) | undefined;\n toolRegistry: ToolRegistry;\n loadRetainedScreenshot?: RetainedScreenshotLoader | undefined;\n loadRetainedArtifact?: RetainedArtifactLoader | undefined;\n loadVideoArtifactPlayback?: VideoArtifactPlaybackLoader | undefined;\n turnSummary?: TurnSummaryOptions | undefined;\n};\n\n/**\n * A search hit inside a nested work row opens that row only. The reveal key\n * is provided per top-level group, so without narrowing every nested row of\n * a folded quiet-cycle run would open at once.\n */\nfunction NestedSearchReveal({ group, children }: { group: TimelineGroup; children: ReactNode }) {\n const revealKey = useContext(TimelineSearchRevealContext);\n const itemId = useMemo(() => {\n if (!revealKey) return null;\n try {\n const [id] = JSON.parse(revealKey) as unknown[];\n return typeof id === \"string\" ? id : null;\n } catch {\n return null;\n }\n }, [revealKey]);\n const value = itemId && timelineGroupItemIds(group).includes(itemId) ? revealKey : null;\n return (\n <TimelineSearchRevealContext.Provider value={value}>\n {children}\n </TimelineSearchRevealContext.Provider>\n );\n}\n\n/** Rows in a turn's work details that stack like tool steps, without a gap. */\nfunction isWorkRow(group: TimelineGroup | undefined): boolean {\n return (\n group?.kind === \"activity\" || (group?.kind === \"item\" && isAgentWorkHumanInput(group.item))\n );\n}\n\nfunction renderFoldedGroups(\n groups: readonly TimelineGroup[],\n behavior: FoldedGroupBehavior,\n readableWork = false,\n) {\n // Second-layer chips only when there are natural multi-cluster seams:\n // otherwise the outer turn chip alone is enough (\"N steps\" wrapping one\n // more \"N steps\" was the redundant double fold).\n const nestClusters = foldableActivityClusterCount(groups) >= 2;\n return groups.map((child, index) => (\n <TimelineGroupRenderBoundary\n key={timelineGroupKey(child)}\n resetKeys={[\n child,\n behavior.renderMessageActions,\n behavior.renderMessageText,\n behavior.onOpenSession,\n behavior.onMemoryClick,\n behavior.onReconnect,\n behavior.renderAuthNeeded,\n behavior.resolveProviderLogo,\n behavior.toolRegistry,\n behavior.loadRetainedScreenshot,\n behavior.loadRetainedArtifact,\n behavior.loadVideoArtifactPlayback,\n behavior.turnSummary,\n ]}\n >\n {readableWork ? (\n <div\n className={\n index > 0 && !(isWorkRow(child) && isWorkRow(groups[index - 1])) ? \"mt-3\" : undefined\n }\n >\n <NestedSearchReveal group={child}>\n <TimelineGroupView {...behavior} group={child} insideTurn startupDismissed />\n </NestedSearchReveal>\n </div>\n ) : (\n <TimelineGroupView {...behavior} group={child} insideTurn nestClusterChips={nestClusters} />\n )}\n </TimelineGroupRenderBoundary>\n ));\n}\n\n/**\n * Body under a turn/activity chip. Remount flashes are gated by the timeline\n * seen-activity-id map (not by killing entrance): FoldBody used to force\n * entrance off, which made every live tool pop with no fade.\n */\nfunction FoldBody({ children }: { children: ReactNode }) {\n return <>{children}</>;\n}\n\n/** Stable left rule for turn/activity bodies — always present so settle wrap\n never inserts or removes the rail chrome. */\nfunction TurnRailFrame({ children, compact = false }: { children: ReactNode; compact?: boolean }) {\n return (\n <div\n className={cn(\n \"flex flex-col border-l-2 border-og-border pl-3 sm:pl-4\",\n compact ? \"gap-0.5\" : \"gap-4\",\n )}\n >\n {children}\n </div>\n );\n}\n\n/**\n * True once THIS component instance has seen its group transition from\n * unfolded to folded — i.e. the reader watched the rows live and the fold is\n * new information worth choreographing. Latched: TurnSummary captures the flag\n * at its own mount (the flip render), so later prop churn is inert. History\n * that mounts already folded initializes folded and never latches.\n */\nfunction useLiveSettleFold(folded: boolean): boolean {\n const previousFoldedRef = useRef(folded);\n const latchedRef = useRef(false);\n if (!previousFoldedRef.current && folded) {\n latchedRef.current = true;\n }\n useLayoutEffect(() => {\n previousFoldedRef.current = folded;\n });\n return latchedRef.current;\n}\n\nfunction timelineGroupKey(group: TimelineGroup): string {\n switch (group.kind) {\n case \"item\":\n return group.item.kind === \"user-message\" && group.item.reconciliationKey\n ? group.item.reconciliationKey\n : group.item.id;\n case \"activity\":\n return group.id;\n case \"turn\":\n return group.id;\n }\n}\n\nfunction timelineGroupContainsAuthNeeded(group: TimelineGroup): boolean {\n switch (group.kind) {\n case \"item\":\n return group.item.kind === \"auth-needed\";\n case \"activity\":\n return false;\n case \"turn\":\n return group.groups.some(timelineGroupContainsAuthNeeded);\n }\n}\n\nfunction timelineGroupItemIds(group: TimelineGroup): string[] {\n switch (group.kind) {\n case \"item\":\n return [group.item.id];\n case \"activity\":\n return [\n ...(group.work?.details ?? []).flatMap(timelineGroupItemIds),\n ...group.items.map((item) => item.id),\n ];\n case \"turn\":\n return group.groups.flatMap(timelineGroupItemIds);\n }\n}\n\n/** The agent has moved PAST a cluster only when what follows is more agent\n progress — new activity, a settled turn, or narration. A waiting notice\n (approval pause), a pending queued message, a goal pill, or nothing at all\n do NOT advance the story, and folding on them would hide exactly the work\n the reader needs in view. */\nfunction isAgentProgress(next: TimelineGroup | undefined): boolean {\n if (!next) {\n return false;\n }\n return (\n next.kind === \"activity\" ||\n next.kind === \"turn\" ||\n (next.kind === \"item\" && next.item.kind === \"agent-message\" && next.item.text.trim().length > 0)\n );\n}\n\n/** No item still running or streaming — the only state safe to fold live.\n Position alone is a broken proxy: a pending queued message (or any trailing\n item) can sit after the ACTIVE cluster, which must never fold mid-work. */\n\n/** Settled activity clusters that could become nested chips under a turn. */\nfunction foldableActivityClusterCount(groups: readonly TimelineGroup[]): number {\n let count = 0;\n for (const child of groups) {\n if (child.kind === \"activity\" && (child.outcome || clusterIsSettled(child))) {\n count += 1;\n }\n }\n return count;\n}\n\n/** Assistant prose inside a turn fold (mid-turn narration), joined for copy. */\nfunction collectAgentMessageText(groups: readonly TimelineGroup[]): string {\n const parts: string[] = [];\n for (const group of groups) {\n if (group.kind === \"item\" && group.item.kind === \"agent-message\") {\n const text = group.item.text.trim();\n if (text.length > 0) {\n parts.push(text);\n }\n } else if (group.kind === \"activity\") {\n // Commentary folded into clusters is still the assistant's own prose.\n const nested = collectAgentMessageText(group.work?.details ?? []);\n if (nested.length > 0) {\n parts.push(nested);\n }\n for (const item of group.items) {\n const text = item.kind === \"agent-message\" ? item.text.trim() : \"\";\n if (text.length > 0) {\n parts.push(text);\n }\n }\n } else if (group.kind === \"turn\") {\n const nested = collectAgentMessageText(group.groups);\n if (nested.length > 0) {\n parts.push(nested);\n }\n }\n }\n return parts.join(\"\\n\\n\");\n}\n\n/** Non-null turnIds projected into a turn body (activity + nested messages). */\nfunction collectTurnIdsFromGroups(groups: readonly TimelineGroup[]): Set<string> {\n const ids = new Set<string>();\n for (const group of groups) {\n if (group.kind === \"item\") {\n const turnId = \"turnId\" in group.item ? group.item.turnId : null;\n if (typeof turnId === \"string\" && turnId.length > 0) {\n ids.add(turnId);\n }\n } else if (group.kind === \"activity\") {\n for (const nested of collectTurnIdsFromGroups(group.work?.details ?? [])) {\n ids.add(nested);\n }\n for (const item of group.items) {\n if (item.turnId) {\n ids.add(item.turnId);\n }\n }\n } else if (group.kind === \"turn\") {\n for (const nested of collectTurnIdsFromGroups(group.groups)) {\n ids.add(nested);\n }\n }\n }\n return ids;\n}\n\n/**\n * Settled turns lift the final agent answer out as a sibling group. Include it\n * in \"Copy turn\" when present so the chip copies the full assistant reply.\n * Fenced by turnId so the next turn's answer is never stolen.\n */\nexport function trailingAgentTextAfterTurn(\n group: TimelineGroup,\n next: TimelineGroup | undefined,\n): string | undefined {\n if (group.kind !== \"turn\") {\n return undefined;\n }\n if (next?.kind === \"item\" && next.item.kind === \"agent-message\") {\n const turnIds = collectTurnIdsFromGroups(group.groups);\n // Degenerate body with no turnIds: do not guess — safer than lifting wrong.\n if (!turnIds.size) {\n return undefined;\n }\n if (!next.item.turnId || !turnIds.has(next.item.turnId)) {\n return undefined;\n }\n const text = next.item.text.trim();\n return text.length > 0 ? text : undefined;\n }\n return undefined;\n}\n\nfunction collectTurnCopyText(\n groups: readonly TimelineGroup[],\n trailingAgentText: string | undefined,\n): string | undefined {\n const parts = [collectAgentMessageText(groups), trailingAgentText?.trim() ?? \"\"].filter(\n (part) => part.length > 0,\n );\n if (!parts.length) {\n return undefined;\n }\n return parts.join(\"\\n\\n\");\n}\n\n/* --- single rows ------------------------------------------------------------ */\n\n/**\n * Render one non-activity timeline item (chat message, status divider, goal\n * landmark, notice). Exported so the component demo draws the EXACT same rows as\n * the live app — no forked bubble/goal markup.\n */\nexport function TimelineRow({\n item,\n renderMessageActions,\n renderMessageText,\n onReconnect,\n renderAuthNeeded,\n resolveProviderLogo,\n onOpenSession,\n loadVideoArtifactPlayback,\n}: {\n item: TimelineItem;\n renderMessageActions?: ((item: AgentMessageItem | UserMessageItem) => ReactNode) | undefined;\n renderMessageText?:\n | ((text: string, item: AgentMessageItem | UserMessageItem) => ReactNode)\n | undefined;\n onReconnect?: ((item: AuthNeededItem) => void | Promise<void>) | undefined;\n /** Host-owned inline connection setup. Return undefined to use the default recovery card. */\n renderAuthNeeded?: ((item: AuthNeededItem) => ReactNode | undefined) | undefined;\n resolveProviderLogo?: ((providerDomain: string) => string | null | undefined) | undefined;\n onOpenSession?: ((sessionId: string) => void) | undefined;\n loadVideoArtifactPlayback?: VideoArtifactPlaybackLoader | undefined;\n}) {\n switch (item.kind) {\n case \"user-message\":\n return (\n <UserMessageRow\n item={item}\n renderMessageActions={renderMessageActions}\n renderMessageText={renderMessageText}\n />\n );\n case \"human-input\":\n return isAgentWorkHumanInput(item) ? (\n <AgentWorkHumanInputRow item={item} />\n ) : (\n <HumanInputConversationRow item={item} />\n );\n case \"agent-message\":\n return (\n <AgentMessageRow\n item={item}\n renderMessageActions={renderMessageActions}\n renderMessageText={renderMessageText}\n />\n );\n case \"worker-completion\":\n return <WorkerCompletionRow item={item} onOpenSession={onOpenSession} />;\n case \"session-status\":\n return <SessionStatusRow item={item} />;\n case \"goal\":\n return <GoalRow item={item} />;\n case \"machine-input-batch\":\n return (\n <MachineInputBatchRow\n item={item}\n onOpenSession={onOpenSession}\n loadVideoArtifactPlayback={loadVideoArtifactPlayback}\n />\n );\n case \"notice\":\n return <NoticeRow item={item} />;\n case \"context-compaction\":\n return <CompactionRow item={item} />;\n case \"turn-steps\":\n return <TurnStepsAction steps={item} />;\n case \"auth-needed\":\n return (\n renderAuthNeeded?.(item) ?? (\n <AuthNeededRow\n item={item}\n onReconnect={onReconnect}\n resolveProviderLogo={resolveProviderLogo}\n />\n )\n );\n default:\n return null;\n }\n}\n\nconst COMPACTION_TRIGGER_LABEL = (\n t: OpenGeniText,\n): Record<NonNullable<ContextCompactionItem[\"trigger\"]>, string> => ({\n auto: t(\"messageTimeline.auto\"),\n operator: t(\"messageTimeline.manual\"),\n proactive: t(\"messageTimeline.auto\"),\n overflow: t(\"messageTimeline.overflow\"),\n});\n\nfunction CompactionRow({ item }: { item: ContextCompactionItem }) {\n const t = useOpenGeniText();\n const enter = useEntranceAnimation();\n const detailsId = useId();\n const [detailsOpen, setDetailsOpen] = useState(false);\n // Switching a Codex chat to another model rebuilds its context once; say\n // that plainly instead of describing an ordinary compaction.\n const modelSwitch = item.implementation === \"portable_model_switch\";\n const trigger =\n item.trigger && item.phase !== \"started\" && !modelSwitch\n ? COMPACTION_TRIGGER_LABEL(t)[item.trigger]\n : null;\n const before =\n item.estimatedTokensBefore != null\n ? Math.round(item.estimatedTokensBefore).toLocaleString(t.locale)\n : null;\n const after =\n item.estimatedTokensAfter != null\n ? Math.round(item.estimatedTokensAfter).toLocaleString(t.locale)\n : null;\n const title =\n item.phase === \"started\"\n ? modelSwitch\n ? t(\"messageTimeline.summarizingEarlierMessagesForNewModel\")\n : t(\"messageTimeline.compactingConversationHistory\")\n : item.phase === \"compacted\"\n ? modelSwitch\n ? t(\"messageTimeline.earlierMessagesSummarizedForNewModel\")\n : before && after\n ? t(\"messageTimeline.conversationHistoryCompactedBeforeAfter\", { before, after })\n : t(\"messageTimeline.conversationHistoryCompacted\")\n : compactionSkipTitle(t, item.skipReason);\n const subtitle =\n item.phase === \"compacted\" && !modelSwitch\n ? t(\"messageTimeline.chatHistoryAboveIsUnchanged\")\n : item.phase === \"skipped\"\n ? compactionSkipSubtitle(t, item.skipReason, item.providerRejection)\n : null;\n // Provider identifiers are diagnostics: one short line up front, the rest on demand.\n const details = compactionFailureDetails(t, item);\n const failed = item.phase === \"skipped\" && item.skipReason === \"summarization_failed\";\n const pill = failed\n ? \"border-og-status-failed/35 bg-og-status-failed/10 text-og-status-failed\"\n : item.phase === \"started\"\n ? WAITING_PILL_CLASS\n : NEUTRAL_PILL;\n return (\n <div className={cn(enter && \"animate-og-enter\", \"flex min-w-0 flex-col items-center gap-1.5\")}>\n <div\n className={cn(\n \"inline-flex min-w-0 max-w-full flex-col items-center gap-0.5 border px-3 py-1.5 text-og-sm\",\n // A failure's recovery step may wrap on narrow screens; a full pill\n // radius would pinch its second line.\n failed ? \"rounded-og-lg\" : \"rounded-full\",\n pill,\n )}\n role=\"status\"\n >\n <span className=\"inline-flex min-w-0 max-w-full items-center gap-1.5\">\n <ShrinkIcon className=\"size-3.5 shrink-0\" />\n <span className=\"min-w-0 truncate\">\n {title}\n {trigger ? ` · ${trigger}` : \"\"}\n </span>\n </span>\n {subtitle || details ? (\n <span\n className={cn(\n \"min-w-0 max-w-full text-og-xs\",\n failed ? \"text-balance text-center\" : \"inline-flex items-center gap-1\",\n )}\n >\n {subtitle ? (\n <span className={cn(\"opacity-80\", !failed && \"min-w-0 truncate\")}>{subtitle}</span>\n ) : null}\n {subtitle && details && failed ? \" \" : null}\n {details ? (\n <button\n type=\"button\"\n aria-expanded={detailsOpen}\n aria-controls={detailsId}\n onClick={() => setDetailsOpen((open) => !open)}\n className={cn(\n \"inline-flex shrink-0 items-center gap-0.5 whitespace-nowrap rounded-og-sm align-baseline font-medium underline-offset-2\",\n \"hover:underline focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-current/40\",\n \"pointer-coarse:-my-2 pointer-coarse:px-1 pointer-coarse:py-2\",\n )}\n >\n {t(\"messageTimeline.details\")}\n <ChevronDownIcon\n aria-hidden\n className={cn(\"size-3 transition-transform\", detailsOpen && \"rotate-180\")}\n />\n </button>\n ) : null}\n </span>\n ) : null}\n </div>\n {details ? (\n <div\n id={detailsId}\n hidden={!detailsOpen}\n data-og-compaction-details=\"\"\n className=\"w-full max-w-md rounded-og-md border border-og-border bg-og-surface-1 px-3 py-2 text-left text-og-xs text-og-fg-muted\"\n >\n {details.note ? <p className=\"mb-2\">{details.note}</p> : null}\n <dl className=\"grid grid-cols-[auto_minmax(0,1fr)] gap-x-3 gap-y-1\">\n {details.facts.map((fact) => (\n <Fragment key={fact.label}>\n <dt className=\"text-og-fg-subtle\">{fact.label}</dt>\n <dd className=\"max-h-40 min-w-0 overflow-auto whitespace-pre-wrap break-words font-mono\">\n {fact.value}\n </dd>\n </Fragment>\n ))}\n </dl>\n </div>\n ) : null}\n </div>\n );\n}\n\n/** Hover-reveal clock beside the copy control (sent / finished). */\nfunction MessageFooterTime({ occurredAt }: { occurredAt: string }) {\n const t = useOpenGeniText();\n return (\n <time\n dateTime={occurredAt}\n className={cn(\n \"shrink-0 tabular-nums text-og-xs text-og-fg-subtle\",\n \"opacity-0 transition-opacity duration-150\",\n \"group-hover/copy:opacity-100 group-focus-within/copy:opacity-100 pointer-coarse:opacity-100\",\n )}\n >\n {formatClockTime(t, occurredAt)}\n </time>\n );\n}\n\nfunction UserMessageRow({\n item,\n renderMessageActions,\n renderMessageText,\n}: {\n item: UserMessageItem;\n renderMessageActions?: ((item: AgentMessageItem | UserMessageItem) => ReactNode) | undefined;\n renderMessageText?:\n | ((text: string, item: AgentMessageItem | UserMessageItem) => ReactNode)\n | undefined;\n}) {\n const t = useOpenGeniText();\n const enter = useEntranceAnimation();\n const deliveryFailed = item.delivery?.state === \"failed\";\n return (\n <div className={cn(enter && \"animate-og-enter\", \"flex justify-end\")}>\n <div className=\"flex max-w-[85%] min-w-0 flex-col items-end gap-1\">\n <MessageSenderSlot item={item} />\n <CopyHoverFrame\n copyText={\n item.text ||\n (item.annotations ?? [])\n .map((annotation) => `${annotationQuoteText(annotation)}\\n${annotation.note}`)\n .join(\"\\n\\n\")\n }\n label={t(\"messageTimeline.copyMessage\")}\n className=\"w-fit max-w-full min-w-0\"\n trailing={\n <>\n {renderMessageActions ? (\n <LazyPart onLoadFailure=\"hide\">{renderMessageActions(item)}</LazyPart>\n ) : null}\n <MessageFooterTime occurredAt={item.occurredAt} />\n </>\n }\n >\n <div className={MESSAGE_BUBBLE_CLASS}>\n {item.text ? (\n <div\n data-og-search-item={item.id}\n data-og-annotation-source-key={item.annotationSource?.eventId}\n >\n {renderMessageText ? (\n renderMessageText(item.text, item)\n ) : (\n <UserMessageBody messageId={item.id} text={item.text}>\n <Markdown softLineBreaks>{item.text}</Markdown>\n </UserMessageBody>\n )}\n </div>\n ) : null}\n {(item.annotations?.length ?? 0) > 0 ? (\n <TimelineAnnotationCards\n annotations={item.annotations ?? []}\n className={item.text ? \"mt-2\" : undefined}\n />\n ) : null}\n </div>\n </CopyHoverFrame>\n {deliveryFailed ? (\n <div\n role=\"status\"\n className=\"flex max-w-full flex-col items-start gap-1 px-1 text-og-xs text-og-status-failed\"\n >\n <span className=\"flex min-w-0 items-start gap-1\">\n <TriangleAlertIcon className=\"size-3.5 shrink-0\" aria-hidden=\"true\" />\n <span className=\"min-w-0 break-words\">\n {item.delivery?.error || t(\"messageTimeline.messageNotSent\")}\n </span>\n </span>\n <div className=\"flex flex-wrap items-center gap-2\">\n {item.delivery?.onEdit ? (\n <button\n type=\"button\"\n className=\"font-medium text-og-status-failed underline decoration-og-status-failed/50 underline-offset-2 hover:text-og-fg\"\n onClick={item.delivery.onEdit}\n >\n {t(\"messageTimeline.editMessage\")}\n </button>\n ) : null}\n {item.delivery?.onRetry ? (\n <button\n type=\"button\"\n className=\"font-medium text-og-status-failed underline decoration-og-status-failed/50 underline-offset-2 hover:text-og-fg\"\n onClick={item.delivery.onRetry}\n >\n {t(\"messageTimeline.retry\")}\n </button>\n ) : null}\n {item.delivery?.onRemove ? (\n <button\n type=\"button\"\n className=\"font-medium text-og-fg-subtle underline decoration-og-border underline-offset-2 hover:text-og-fg\"\n onClick={item.delivery.onRemove}\n >\n {t(\"messageTimeline.remove\")}\n </button>\n ) : null}\n </div>\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n\nfunction HumanInputConversationRow({ item }: { item: HumanInputItem }) {\n const t = useOpenGeniText();\n const enter = useEntranceAnimation();\n const multipleQuestions = Math.max(item.questions.length, item.answers.length) > 1;\n const questionNumberById = new Map(\n item.questions.map((question, index) => [question.id, index + 1]),\n );\n const settledLabel =\n item.response.outcome === \"answered\"\n ? t(\"messageTimeline.youAnswered\")\n : item.response.outcome === \"skipped\"\n ? item.response.agentDecides\n ? t(\"messageTimeline.youLetTheAgentDecide\")\n : t(\"messageTimeline.skipped\")\n : item.response.outcome === \"expired\"\n ? t(\"messageTimeline.expired\")\n : t(\"messageTimeline.cancelled\");\n const copyText = humanInputConversationCopyText(t, item, settledLabel);\n\n return (\n <div\n className={cn(enter && \"animate-og-enter\", \"flex w-full flex-col gap-2.5\")}\n data-human-input-history={item.requestId}\n >\n <div className=\"flex max-w-[90%] items-start gap-3 rounded-og-lg rounded-bl-og-xs border border-og-border bg-og-surface-1 px-3.5 py-3 sm:max-w-[82%]\">\n <span className=\"mt-0.5 inline-flex size-8 shrink-0 items-center justify-center rounded-og-md bg-og-status-waiting/10 text-og-status-waiting\">\n <MessageCircleQuestionIcon aria-hidden=\"true\" className=\"size-4\" />\n </span>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-og-xs font-medium text-og-fg-subtle\">\n {t(\"messageTimeline.agentAsked\")}\n </p>\n <div className=\"mt-1.5 space-y-3\">\n {item.questions.length > 0 ? (\n item.questions.map((question, index) => (\n <div key={question.id}>\n {question.label ? (\n <p className=\"text-og-sm font-semibold text-og-fg [overflow-wrap:anywhere]\">\n {multipleQuestions ? (\n <span className=\"mr-1.5 tabular-nums text-og-fg-muted\">{index + 1}.</span>\n ) : null}\n {multipleQuestions ? \" \" : null}\n {question.label}\n </p>\n ) : null}\n <p\n className={cn(\n \"text-og-md leading-6 text-og-fg [overflow-wrap:anywhere]\",\n question.label && \"mt-0.5 text-og-sm text-og-fg-muted\",\n )}\n >\n {!question.label && multipleQuestions ? (\n <span className=\"mr-1.5 tabular-nums text-og-fg-muted\">{index + 1}.</span>\n ) : null}\n {!question.label && multipleQuestions ? \" \" : null}\n <InlineMarkdown>{question.prompt}</InlineMarkdown>\n </p>\n </div>\n ))\n ) : (\n <p className=\"text-og-sm text-og-fg-muted\">\n {t(\"messageTimeline.theAgentRequestedStructuredInput\")}\n </p>\n )}\n </div>\n </div>\n </div>\n\n <div className=\"flex justify-end\">\n <CopyHoverFrame\n copyText={copyText}\n label={t(\"messageTimeline.copyAnswer\")}\n className=\"w-fit max-w-[90%] min-w-0 sm:max-w-[82%]\"\n trailing={<MessageFooterTime occurredAt={item.occurredAt} />}\n >\n <div className={MESSAGE_BUBBLE_CLASS}>\n <p className=\"text-og-xs font-medium text-og-fg-subtle\">{settledLabel}</p>\n {item.response.outcome === \"answered\" ? (\n <div className=\"mt-1.5 space-y-3\">\n {item.answers.length > 0 ? (\n item.answers.map((answer, answerIndex) => (\n <div key={answer.questionId}>\n {multipleQuestions ? (\n <p className=\"text-og-sm font-semibold text-og-fg\">\n <span className=\"mr-1.5 tabular-nums text-og-fg-muted\">\n {questionNumberById.get(answer.questionId) ?? answerIndex + 1}.\n </span>{\" \"}\n {answer.label}\n </p>\n ) : null}\n <div className={cn(\"text-og-md text-og-fg\", multipleQuestions && \"mt-0.5\")}>\n {answer.secret ? (\n <SecretAnswerChip\n result={answer.secret}\n label={secretAnswerLabel(t, answer.secret)}\n />\n ) : answer.values.length > 1 ? (\n <ul className=\"list-disc space-y-0.5 pl-5\">\n {answer.values.map((value) => (\n <li key={`${answer.questionId}-${value}`}>{value}</li>\n ))}\n </ul>\n ) : (\n <p>{answer.values[0] || t(\"messageTimeline.answered\")}</p>\n )}\n </div>\n </div>\n ))\n ) : (\n <p>{t(\"messageTimeline.answered\")}</p>\n )}\n </div>\n ) : null}\n </div>\n </CopyHoverFrame>\n </div>\n </div>\n );\n}\n\n/**\n * A question an agent (such as a sub-session's parent) answered or skipped: one\n * quiet work row, \"Asked Target branch → main\", that opens to the full\n * question and answer. Nothing sits on the person's side.\n */\nfunction AgentWorkHumanInputRow({ item }: { item: HumanInputItem }) {\n const t = useOpenGeniText();\n const multipleQuestions = Math.max(item.questions.length, item.answers.length) > 1;\n const questionNumberById = new Map(\n item.questions.map((question, index) => [question.id, index + 1]),\n );\n const skipped = item.response.outcome === \"skipped\";\n const byLine = skipped ? t(\"messageTimeline.agentSkipped\") : t(\"messageTimeline.agentAnswered\");\n const summary = agentWorkHumanInputSummary(item, {\n answered: t(\"messageTimeline.answered\"),\n skipped: t(\"messageTimeline.skipped\"),\n secretSaved: (secret) => secretAnswerLabel(t, secret),\n });\n return (\n <div data-human-input-history={item.requestId} data-og-agent-answered=\"\">\n <ActivityDisclosure\n icon={<MessageCircleQuestionIcon className=\"size-3.5\" />}\n title={t(\"messageTimeline.asked\")}\n preview={summary}\n >\n <div className=\"flex flex-col gap-3 text-og-sm leading-6\">\n {item.questions.map((question, index) => (\n <div key={question.id} className=\"min-w-0\">\n {question.label ? (\n <p className=\"font-medium text-og-fg [overflow-wrap:anywhere]\">\n {multipleQuestions ? (\n <span className=\"mr-1.5 tabular-nums text-og-fg-muted\">{index + 1}.</span>\n ) : null}\n {question.label}\n </p>\n ) : null}\n <p className=\"text-og-fg-muted [overflow-wrap:anywhere]\">\n {!question.label && multipleQuestions ? (\n <span className=\"mr-1.5 tabular-nums\">{index + 1}.</span>\n ) : null}\n <InlineMarkdown>{question.prompt}</InlineMarkdown>\n </p>\n </div>\n ))}\n <div className=\"min-w-0\">\n <p className=\"text-og-xs font-medium text-og-fg-subtle\">{byLine}</p>\n {item.response.outcome === \"answered\" ? (\n <div className=\"mt-1 space-y-1.5 text-og-fg\">\n {item.answers.length > 0 ? (\n item.answers.map((answer, answerIndex) => (\n <div key={answer.questionId} className=\"min-w-0 [overflow-wrap:anywhere]\">\n {multipleQuestions ? (\n <span className=\"mr-1.5 tabular-nums text-og-fg-muted\">\n {questionNumberById.get(answer.questionId) ?? answerIndex + 1}.\n </span>\n ) : null}\n {answer.secret ? (\n <SecretAnswerChip\n result={answer.secret}\n label={secretAnswerLabel(t, answer.secret)}\n />\n ) : (\n answer.values.join(\", \") || t(\"messageTimeline.answered\")\n )}\n </div>\n ))\n ) : (\n <p>{t(\"messageTimeline.answered\")}</p>\n )}\n </div>\n ) : null}\n </div>\n </div>\n </ActivityDisclosure>\n </div>\n );\n}\n\nfunction humanInputConversationCopyText(\n t: OpenGeniText,\n item: HumanInputItem,\n settledLabel: string,\n): string {\n const questions = item.questions\n .map(\n (question, index) =>\n `${item.questions.length > 1 ? `${index + 1}. ` : \"\"}${question.label || t(\"messageTimeline.question\")}: ${question.prompt}`,\n )\n .join(\"\\n\\n\");\n const questionNumberById = new Map(\n item.questions.map((question, index) => [question.id, index + 1]),\n );\n const answers = item.answers\n .map(\n (answer, index) =>\n `${\n item.questions.length > 1\n ? `${questionNumberById.get(answer.questionId) ?? index + 1}. `\n : \"\"\n }${answer.label}: ${\n answer.secret\n ? `${secretAnswerLabel(t, answer.secret)} (${answer.secret.reference})`\n : answer.values.join(\", \") || t(\"messageTimeline.answered\")\n }`,\n )\n .join(\"\\n\\n\");\n return [questions, `${settledLabel}${answers ? `\\n\\n${answers}` : \"\"}`]\n .filter(Boolean)\n .join(\"\\n\\n\");\n}\n\nfunction AgentMessageRow({\n item,\n renderMessageActions,\n renderMessageText,\n}: {\n item: AgentMessageItem;\n renderMessageActions?: ((item: AgentMessageItem | UserMessageItem) => ReactNode) | undefined;\n renderMessageText?:\n | ((text: string, item: AgentMessageItem | UserMessageItem) => ReactNode)\n | undefined;\n}) {\n const t = useOpenGeniText();\n const enter = useEntranceAnimation();\n // No streaming caret: it fought the trailing block layout (inline ↔ block)\n // and snapped on exit. Live text carries the stream via tip ink.\n const body = renderMessageText ? (\n renderMessageText(item.text, item)\n ) : (\n <Markdown softLineBreaks streaming={item.streaming}>\n {item.text}\n </Markdown>\n );\n // While streaming, copy is still useful (current text) but keep chrome calm —\n // stamp only after the message finishes (occurredAt tracks completion).\n return (\n <CopyHoverFrame\n copyText={item.text}\n label={t(\"messageTimeline.copyMessage\")}\n align=\"start\"\n className={cn(enter && \"animate-og-enter\", \"min-w-0 text-og-md leading-7 text-og-fg\")}\n trailing={\n item.streaming ? null : (\n <>\n {renderMessageActions ? (\n <LazyPart onLoadFailure=\"hide\">{renderMessageActions(item)}</LazyPart>\n ) : null}\n <MessageFooterTime occurredAt={item.occurredAt} />\n </>\n )\n }\n >\n <div\n data-og-wide-table-message=\"\"\n data-og-search-item={item.id}\n data-og-annotation-source-key={item.annotationSource?.eventId}\n >\n {body}\n </div>\n </CopyHoverFrame>\n );\n}\n\n/**\n * A worker session reporting back to its manager in older history: the child's\n * completion arrived as a `user.message` carrying a `childCompletion` payload.\n * It draws as the same named agent row as every other inbound agent update:\n * the outcome and goal on the row, the report, evidence, and any paused\n * reason behind the disclosure, and a deep link into the child.\n */\ntype WorkerCompletionMeta = {\n title: AgentTitleParts;\n icon: ComponentType<{ className?: string }>;\n failed: boolean;\n};\n\nfunction workerCompletionMeta(\n t: OpenGeniText,\n item: WorkerCompletionItem,\n name: string | null,\n): WorkerCompletionMeta {\n if (item.childStatus === \"failed\") {\n return {\n title: namedAgentTitle(\n name,\n (agent) => t(\"messageTimeline.nameFailed\", { name: agent }),\n t(\"messageTimeline.workerFailed\"),\n ),\n icon: XCircleIcon,\n failed: true,\n };\n }\n if (item.goalStatus === \"paused\") {\n return {\n title: namedAgentTitle(\n name,\n (agent) => t(\"messageTimeline.namePaused\", { name: agent }),\n t(\"messageTimeline.workerPaused\"),\n ),\n icon: PauseCircleIcon,\n failed: false,\n };\n }\n if (item.goalStatus === \"completed\") {\n return {\n title: namedAgentTitle(\n name,\n (agent) => t(\"messageTimeline.nameCompletedItsGoal\", { name: agent }),\n t(\"messageTimeline.workerCompleted\"),\n ),\n icon: CheckCircle2Icon,\n failed: false,\n };\n }\n return {\n title: namedAgentTitle(\n name,\n (agent) => t(\"messageTimeline.resultFromName\", { name: agent }),\n t(\"messageTimeline.workerReportedBack\"),\n ),\n icon: BotIcon,\n failed: false,\n };\n}\n\nfunction WorkerCompletionRow({\n item,\n onOpenSession,\n}: {\n item: WorkerCompletionItem;\n onOpenSession?: ((sessionId: string) => void) | undefined;\n}) {\n const t = useOpenGeniText();\n const enter = useEntranceAnimation();\n const identity = useAgentIdentity();\n const meta = workerCompletionMeta(t, item, identity.titleFor(item.childSessionId));\n const Icon = meta.icon;\n // \"Paused because\" only when the outcome actually IS a pause — completion\n // payloads can carry a leftover pausedReason/rationale from earlier in the\n // worker's life, and a completed row must not show a pause section.\n const showPausedReason =\n item.childStatus !== \"failed\" && item.goalStatus === \"paused\" && !!item.pausedReason?.trim();\n const details: { label: string; value: string; muted?: boolean }[] = [\n ...(item.text.trim() ? [{ label: t(\"messageTimeline.report\"), value: item.text.trim() }] : []),\n ...(item.evidence?.trim()\n ? [{ label: t(\"messageTimeline.evidence\"), value: item.evidence.trim(), muted: true }]\n : []),\n ...(showPausedReason\n ? [\n {\n label: t(\"messageTimeline.pausedBecause\"),\n value: item.pausedReason!.trim(),\n muted: true,\n },\n ]\n : []),\n ];\n return (\n <div className={cn(enter && \"animate-og-enter\", \"min-w-0\")}>\n <AgentRow\n icon={<Icon />}\n title={meta.title}\n preview={item.goalText ? truncate(item.goalText, 240) : null}\n previewLines={2}\n sessionId={item.childSessionId}\n onOpenSession={onOpenSession ?? identity.onOpenSession}\n failed={meta.failed}\n >\n {details.length > 0 ? (\n <>\n {details.map((detail) => (\n <AgentRowSection key={detail.label} label={detail.label} muted={detail.muted}>\n {detail.value}\n </AgentRowSection>\n ))}\n </>\n ) : undefined}\n </AgentRow>\n </div>\n );\n}\n\nfunction SessionStatusRow({\n item,\n}: {\n item: {\n status: SessionStatus;\n blocked?: true;\n occurredAt: string;\n resolvedAt?: string;\n };\n}) {\n const t = useOpenGeniText();\n const enter = useEntranceAnimation();\n const status = item.blocked ? \"blocked\" : item.status;\n const meta = SESSION_STATUS_META(t)[status];\n return (\n <div\n className={cn(\n enter && \"animate-og-enter\",\n \"flex items-center gap-3 text-og-xs text-og-fg-subtle\",\n )}\n role=\"status\"\n >\n <span className=\"h-px flex-1 bg-og-border\" />\n <span className=\"inline-flex items-center gap-1.5\">\n {item.resolvedAt ? null : <StatusDot status={status} className=\"size-1\" />}\n {item.resolvedAt ? t(\"messageTimeline.workResumed\") : meta.label.toLowerCase()} ·{\" \"}\n {formatRelativeTime(t, item.resolvedAt ?? item.occurredAt)}\n </span>\n <span className=\"h-px flex-1 bg-og-border\" />\n </div>\n );\n}\n\n/**\n * The per-action presentation of a goal landmark pill. Each of the six goal\n * actions reads distinctly, but the palette stays quiet — color is spent only on\n * the two states that genuinely earn it, the rest are neutral pills set apart by\n * their glyph alone:\n *\n * completed success green (status-idle) check — the only \"done\" hue\n * paused attention waiting-tinted pause — a held goal asks to resume\n * set a landmark a quiet accent target — opening a fresh goal\n * resumed forward neutral play — motion picking back up\n * updated a revision neutral pencil — the goal text changed\n * continuation steady on neutral arrow — still tracking the same goal\n *\n * The pill class is the established badge convention (`text-X border-X/30\n * bg-X/10`); neutral actions reuse the surface/border tokens so a clean run of\n * landmarks stays calm rather than a row of colored chips.\n */\ntype GoalMeta = { label: string; pill: string; icon: ComponentType<{ className?: string }> };\n\nconst NEUTRAL_PILL = \"border-og-border bg-og-surface-1 text-og-fg-muted\";\n\n// Shared production chunks can be cyclic. Resolve icon bindings during render,\n// after their modules initialize, rather than permanently capturing undefined.\nfunction goalMeta(t: OpenGeniText, action: GoalItem[\"action\"]): GoalMeta {\n const metadata: Record<GoalItem[\"action\"], GoalMeta> = {\n set: {\n label: t(\"messageTimeline.goalSet\"),\n pill: \"border-og-accent/30 bg-og-accent/10 text-og-accent\",\n icon: TargetIcon,\n },\n updated: { label: t(\"messageTimeline.goalUpdated\"), pill: NEUTRAL_PILL, icon: PencilLineIcon },\n completed: {\n label: t(\"messageTimeline.goalCompleted\"),\n pill: \"border-og-status-idle/30 bg-og-status-idle/10 text-og-status-idle\",\n icon: CheckIcon,\n },\n paused: {\n label: t(\"messageTimeline.goalPaused\"),\n pill: WAITING_PILL_CLASS,\n icon: PauseIcon,\n },\n resumed: { label: t(\"messageTimeline.goalResumed\"), pill: NEUTRAL_PILL, icon: PlayIcon },\n cleared: { label: t(\"messageTimeline.goalCleared\"), pill: NEUTRAL_PILL, icon: Trash2Icon },\n held: {\n label: t(\"messageTimeline.goalHeld\"),\n pill: WAITING_PILL_CLASS,\n icon: PauseCircleIcon,\n },\n continuation: {\n label: t(\"messageTimeline.continuingTowardTheGoal\"),\n pill: NEUTRAL_PILL,\n icon: ArrowRightIcon,\n },\n };\n return metadata[action];\n}\n\n/**\n * A goal landmark pill. Resolves its label, accent/tone, and glyph from\n * {@link goalMeta} so all six actions are visually distinguishable while the\n * palette stays restrained — see that table for the per-action rationale.\n */\nfunction GoalRow({ item }: { item: GoalItem }) {\n const t = useOpenGeniText();\n const enter = useEntranceAnimation();\n const { label, pill, icon: Icon } = goalMeta(t, item.action);\n return (\n <div className={cn(enter && \"animate-og-enter\", \"flex justify-center\")}>\n <span\n className={cn(\n \"inline-flex max-w-full items-center gap-1.5 rounded-full border px-3 py-1 text-og-sm\",\n pill,\n )}\n >\n <Icon className=\"size-3.5 shrink-0\" />\n <span className=\"truncate\">\n {label}\n {item.text ? `: ${truncate(item.text, 90)}` : \"\"}\n </span>\n </span>\n </div>\n );\n}\n\nfunction MachineInputBatchRow({\n item,\n onOpenSession,\n loadVideoArtifactPlayback,\n}: {\n item: MachineInputBatchItem;\n onOpenSession?: ((sessionId: string) => void) | undefined;\n loadVideoArtifactPlayback?: VideoArtifactPlaybackLoader | undefined;\n}) {\n const t = useOpenGeniText();\n const enter = useEntranceAnimation();\n const identity = useAgentIdentity();\n const label = machineInputBatchLabel(t, item.members, identity.titleFor);\n const single = item.members.length === 1 ? item.members[0]! : null;\n if (single?.kind === \"media_generation_result\" && single.result) {\n return (\n <VideoGenerationResultRow\n result={single.result}\n loadVideoArtifactPlayback={loadVideoArtifactPlayback}\n />\n );\n }\n const singleSummary = single ? cleanMachineInputSummary(single.summary) : \"\";\n // An agent's words live in its named row behind the pill; the pill already\n // says who it is from, so nothing repeats beneath it.\n const showCollapsedSummary =\n !item.compact &&\n single != null &&\n !isAgentMember(single) &&\n machineInputSummaryIsUseful(t, single.kind, singleSummary);\n\n return (\n <div className={cn(enter && \"animate-og-enter\", \"flex flex-col items-center gap-1.5\")}>\n <details\n className=\"group w-full max-w-full\"\n data-og-machine-input-batch=\"\"\n title={t(\"messageTimeline.receivedClocktime\", {\n clockTime: formatClockTime(t, item.occurredAt),\n })}\n >\n <summary className=\"flex cursor-pointer list-none justify-center [&::-webkit-details-marker]:hidden\">\n <span\n className={cn(\n \"inline-flex max-w-full items-center gap-1.5 rounded-full border px-3 py-1 text-og-sm\",\n NEUTRAL_PILL,\n )}\n >\n <ChevronRightIcon\n aria-hidden\n className=\"size-3.5 shrink-0 transition-transform group-open:rotate-90\"\n />\n <span className=\"truncate\">{label}</span>\n </span>\n </summary>\n <div className=\"mx-auto mt-2 w-full max-w-lg space-y-1.5 border-t border-og-border/50 pt-2\">\n <p className=\"text-og-xs text-og-fg-subtle\">\n {t(\"messageTimeline.received\")}{\" \"}\n <time dateTime={item.occurredAt}>{formatClockTime(t, item.occurredAt)}</time>\n </p>\n {groupMachineInputMembers(item.members).map((group) =>\n group.kind === \"agent\" ? (\n <AgentMemberRow\n key={group.members[0]!.id}\n members={group.members}\n onOpenSession={onOpenSession}\n />\n ) : (\n <MachineInputRow\n key={group.member.id}\n member={group.member}\n onOpenSession={onOpenSession}\n loadVideoArtifactPlayback={loadVideoArtifactPlayback}\n />\n ),\n )}\n </div>\n </details>\n {showCollapsedSummary ? (\n <p className=\"max-w-lg px-3 text-center text-og-xs leading-4 text-og-fg-subtle\">\n {truncate(singleSummary, 160)}\n </p>\n ) : null}\n </div>\n );\n}\n\ntype MachineInputMemberGroup =\n | { kind: \"agent\"; members: MachineInputBatchItem[\"members\"] }\n | { kind: \"other\"; member: MachineInputBatchItem[\"members\"][number] };\n\n/**\n * Agent members get named rows; repeated progress notes from one agent fold\n * into its single row (latest note shown, earlier ones behind the disclosure).\n */\nfunction groupMachineInputMembers(\n members: MachineInputBatchItem[\"members\"],\n): MachineInputMemberGroup[] {\n const groups: MachineInputMemberGroup[] = [];\n const progressBySource = new Map<string, MachineInputBatchItem[\"members\"]>();\n for (const member of members) {\n if (!isAgentMember(member)) {\n groups.push({ kind: \"other\", member });\n continue;\n }\n if (member.kind === \"child_progress\") {\n const existing = progressBySource.get(member.sourceId);\n if (existing) {\n existing.push(member);\n continue;\n }\n const bucket = [member];\n progressBySource.set(member.sourceId, bucket);\n groups.push({ kind: \"agent\", members: bucket });\n continue;\n }\n groups.push({ kind: \"agent\", members: [member] });\n }\n return groups;\n}\n\nfunction agentMemberIcon(member: MachineInputBatchItem[\"members\"][number]): ReactNode {\n if (member.kind === \"child_terminal_result\" && member.classification === \"failure\") {\n return <XCircleIcon />;\n }\n if (member.kind === \"child_paused\") return <PauseCircleIcon />;\n return <CornerDownRightIcon />;\n}\n\n/** One named row for an update sent by (or about) another agent. */\nfunction AgentMemberRow({\n members,\n onOpenSession,\n}: {\n members: MachineInputBatchItem[\"members\"];\n onOpenSession?: ((sessionId: string) => void) | undefined;\n}) {\n const t = useOpenGeniText();\n const identity = useAgentIdentity();\n const latest = members[members.length - 1]!;\n const sessionId = agentMemberSessionId(latest);\n const title = agentMemberTitle(t, latest, identity.titleFor(sessionId));\n const texts = members.map((member) => agentMemberText(t, member));\n const latestText = texts[texts.length - 1]!;\n const bodies = texts\n .map((text, index) => ({ id: members[index]!.id, body: text.body }))\n .filter((entry) => entry.body.length > 0);\n return (\n <AgentRow\n icon={agentMemberIcon(latest)}\n title={title}\n preview={latestText.preview ? truncate(latestText.preview, 320) : null}\n previewLines={2}\n meta={members.length > 1 ? `+${members.length - 1} earlier` : null}\n sessionId={sessionId}\n onOpenSession={onOpenSession ?? identity.onOpenSession}\n failed={latest.kind === \"child_terminal_result\" && latest.classification === \"failure\"}\n >\n {bodies.length > 0 ? (\n <>\n {bodies.map((entry) => (\n <AgentRowText key={entry.id}>{entry.body}</AgentRowText>\n ))}\n </>\n ) : undefined}\n </AgentRow>\n );\n}\n\nfunction MachineInputRow({\n member,\n onOpenSession,\n loadVideoArtifactPlayback,\n}: {\n member: MachineInputBatchItem[\"members\"][number];\n onOpenSession?: ((sessionId: string) => void) | undefined;\n loadVideoArtifactPlayback?: VideoArtifactPlaybackLoader | undefined;\n}) {\n const t = useOpenGeniText();\n if (member.kind === \"media_generation_result\" && member.result) {\n return (\n <VideoGenerationResultRow\n result={member.result}\n loadVideoArtifactPlayback={loadVideoArtifactPlayback}\n compact\n />\n );\n }\n const source = readableMachineInputSource(member.sourceId);\n const summary = cleanMachineInputSummary(member.summary);\n return (\n <div className=\"flex min-w-0 items-start gap-2.5\">\n <span className=\"mt-2 size-1.5 shrink-0 rounded-full bg-og-fg-subtle\" aria-hidden />\n <div className=\"min-w-0 flex-1\">\n <span className=\"text-og-control font-medium text-og-fg-muted\">\n {MACHINE_INPUT_META(t)[member.kind]}\n </span>\n {source && (\n <span className=\"ml-1.5 text-og-control text-og-fg-subtle\">\n {t(\"messageTimeline.fromSource\", { source })}\n </span>\n )}\n {summary ? (\n <p className=\"mt-0.5 whitespace-pre-wrap break-words text-og-menu leading-5 text-og-fg\">\n {truncate(summary, 320)}\n </p>\n ) : null}\n <ChildSessionLink\n kind={member.kind}\n sourceId={member.sourceId}\n onOpenSession={onOpenSession}\n />\n </div>\n </div>\n );\n}\n\nfunction VideoGenerationResultRow({\n result,\n loadVideoArtifactPlayback,\n compact = false,\n}: {\n result: MediaGenerationResult;\n loadVideoArtifactPlayback?: VideoArtifactPlaybackLoader | undefined;\n compact?: boolean | undefined;\n}) {\n const t = useOpenGeniText();\n const enter = useEntranceAnimation();\n if (result.status !== \"ready\") {\n return (\n <div\n className={cn(\n enter && \"animate-og-enter\",\n \"mx-auto w-full max-w-lg rounded-og-md border border-og-status-failed/30 bg-og-status-failed/5 px-3.5 py-3\",\n )}\n >\n <div className=\"flex items-center gap-2 text-og-sm font-medium text-og-status-failed\">\n <XCircleIcon aria-hidden className=\"size-4\" />\n {t(\"messageTimeline.videoGenerationFailed\")}\n </div>\n <p className=\"mt-1 text-og-sm leading-5 text-og-fg-muted\">{result.boundedPublicReason}</p>\n </div>\n );\n }\n const { receipt } = result;\n const facts = receipt.video;\n return (\n <section\n aria-label={t(\"messageTimeline.generatedVideo\")}\n className={cn(\n enter && \"animate-og-enter\",\n \"mx-auto w-full max-w-2xl overflow-hidden rounded-og-lg border border-og-border bg-og-surface-1 shadow-sm\",\n compact && \"max-w-lg\",\n )}\n >\n {loadVideoArtifactPlayback ? (\n <GeneratedVideoPlayer\n receipt={receipt}\n loadPlaybackSource={loadVideoArtifactPlayback}\n className=\"rounded-none border-0 shadow-none\"\n />\n ) : (\n <div className=\"flex aspect-video items-center justify-center bg-og-surface-2 text-og-fg-subtle\">\n <PlayIcon aria-hidden className=\"size-6\" />\n </div>\n )}\n <div className=\"flex items-center justify-between gap-4 px-3.5 py-2.5\">\n <div className=\"min-w-0\">\n <p className=\"text-og-sm font-medium text-og-fg\">{t(\"messageTimeline.generatedVideo\")}</p>\n <p className=\"truncate text-og-xs text-og-fg-subtle\">\n {facts.width}×{facts.height} · {formatVideoDuration(facts.durationSeconds)}\n {facts.hasAudio ? \" · Audio\" : \"\"}\n </p>\n </div>\n <CheckCircle2Icon\n aria-label={t(\"messageTimeline.ready\")}\n className=\"size-4 shrink-0 text-og-status-idle\"\n />\n </div>\n </section>\n );\n}\n\nfunction formatVideoDuration(seconds: number): string {\n return `${Math.round(seconds * 10) / 10}s`;\n}\n\nfunction NoticeRow({ item }: { item: NoticeItem }) {\n const t = useOpenGeniText();\n const enter = useEntranceAnimation();\n if (item.allowance) return <AllowanceExhaustedRow refusal={item.allowance} />;\n if (item.sessionUsageLimit) return <SessionUsageLimitRow stop={item.sessionUsageLimit} />;\n if (item.learningRefusal) return <LearningRefusalRow refusal={item.learningRefusal} />;\n if (item.recordedOutcome) {\n return (\n <details\n className=\"group text-og-sm text-og-fg-muted\"\n role=\"note\"\n data-og-recorded-outcome=\"wait\"\n >\n <summary className=\"flex cursor-pointer list-none items-center gap-2 py-1 [&::-webkit-details-marker]:hidden\">\n <ChevronRightIcon\n aria-hidden\n className=\"size-3.5 transition-transform group-open:rotate-90\"\n />\n <span title={new Date(item.occurredAt).toLocaleString(t.locale)}>\n {recordedWaitSummary(t, item)}\n </span>\n </summary>\n <p className=\"mt-1 whitespace-pre-wrap break-words pl-5 text-og-fg-muted\">{item.text}</p>\n </details>\n );\n }\n const presentedTone = noticeTone(item);\n const resolvedApproval = noticeIsResolvedApproval(item);\n const tone =\n presentedTone === \"failed\"\n ? \"border-og-status-failed/35 bg-og-status-failed/10 text-og-status-failed\"\n : presentedTone === \"waiting\"\n ? WAITING_PILL_CLASS\n : NEUTRAL_PILL;\n return (\n <div\n className={cn(\n enter && \"animate-og-enter\",\n \"flex items-start gap-2.5 rounded-og-md border px-3.5 py-2.5 text-og-menu\",\n tone,\n )}\n role=\"status\"\n >\n {resolvedApproval ? (\n <CheckIcon className=\"mt-0.5 size-4 shrink-0 opacity-70\" aria-hidden=\"true\" />\n ) : (\n <TriangleAlertIcon\n className={cn(\"mt-0.5 size-4 shrink-0\", item.tone === \"cancelled\" && \"opacity-60\")}\n />\n )}\n <div className=\"min-w-0 flex-1\">\n <span className=\"whitespace-pre-wrap break-words\">{noticeDisplayText(t, item)}</span>\n {item.details ? (\n <details className=\"mt-2 text-og-control\">\n <summary className=\"cursor-pointer font-medium\">{item.details.label}</summary>\n <pre className=\"mt-2 max-h-64 overflow-auto whitespace-pre-wrap break-all rounded-og-sm bg-og-fg/5 p-2 font-mono\">\n {typeof item.details.value === \"string\"\n ? item.details.value\n : JSON.stringify(item.details.value, null, 2)}\n </pre>\n </details>\n ) : null}\n </div>\n {item.action ? (\n <a\n className=\"shrink-0 rounded-og-sm border border-current/25 px-2 py-1 text-og-control font-medium hover:bg-current/10\"\n href={item.action.url}\n rel=\"noreferrer\"\n target=\"_blank\"\n >\n {item.action.label}\n </a>\n ) : null}\n </div>\n );\n}\n\n/**\n * \"Waited for 2 agents · 3m 5s\" once later input ended the wait, otherwise\n * \"Waiting for 2 agents · since 10:32\" (with the date on a later day). The\n * reason stays behind the disclosure.\n */\nfunction recordedWaitSummary(t: OpenGeniText, item: NoticeItem): ReactNode {\n const agents = item.waitingAgents ?? 0;\n const waitedMs = item.waitEndedAt\n ? durationBetween(item.occurredAt, item.waitEndedAt)\n : undefined;\n if (waitedMs !== undefined) {\n return withSlot(\n agents > 0\n ? t(\"timeline.noticePresentation.waitedForAgentsElapsed\", { count: agents, elapsed: SLOT })\n : t(\"timeline.noticePresentation.waitedElapsed\", { elapsed: SLOT }),\n <time dateTime={`PT${Math.floor(waitedMs / 1000)}S`}>{formatElapsed(t, waitedMs)}</time>,\n );\n }\n // An open wait is historical once its day has passed; keep its date visible.\n const started = new Date(item.occurredAt);\n const sameDay = started.toDateString() === new Date().toDateString();\n const text = item.waitEndedAt\n ? agents > 0\n ? t(\"timeline.noticePresentation.waitedForAgentsSince\", { count: agents, since: SLOT })\n : t(\"timeline.noticePresentation.waitedSince\", { since: SLOT })\n : agents > 0\n ? t(\"timeline.noticePresentation.waitingForAgentsSince\", { count: agents, since: SLOT })\n : t(\"timeline.noticePresentation.waitingSince\", { since: SLOT });\n return withSlot(\n text,\n <time dateTime={item.occurredAt}>\n {sameDay\n ? formatClockTime(t, item.occurredAt)\n : started.toLocaleString(t.locale, { dateStyle: \"medium\", timeStyle: \"short\" })}\n </time>,\n );\n}\n\n/** Marks where a rendered element goes inside translated text. */\nconst SLOT = \"\\u0000\";\n\nfunction withSlot(text: string, node: ReactNode): ReactNode {\n const at = text.indexOf(SLOT);\n if (at < 0) {\n return (\n <>\n {text} {node}\n </>\n );\n }\n return (\n <>\n {text.slice(0, at)}\n {node}\n {text.slice(at + SLOT.length)}\n </>\n );\n}\n","/**\n * Copy a page selection as clean rich text.\n *\n * Browsers serialize a copied selection with the page's computed styles inlined\n * (text colour, font, and the background of the surrounding message), so a\n * selection pasted into a document or chat keeps the app's dark or tinted\n * backgrounds. This rebuilds the selected content as semantic HTML only:\n * structure and formatting (paragraphs, lists, emphasis, code, links, tables)\n * survive, page styling does not. The plain-text flavour is the browser's own.\n */\n\n/** Elements copied as themselves. Everything else is unwrapped or becomes a block. */\nconst KEPT_TAGS = new Set([\n \"A\",\n \"B\",\n \"BLOCKQUOTE\",\n \"BR\",\n \"CODE\",\n \"DD\",\n \"DEL\",\n \"DL\",\n \"DT\",\n \"EM\",\n \"H1\",\n \"H2\",\n \"H3\",\n \"H4\",\n \"H5\",\n \"H6\",\n \"HR\",\n \"I\",\n \"IMG\",\n \"INS\",\n \"KBD\",\n \"LI\",\n \"OL\",\n \"P\",\n \"PRE\",\n \"S\",\n \"STRONG\",\n \"SUB\",\n \"SUP\",\n \"TABLE\",\n \"TBODY\",\n \"TD\",\n \"TFOOT\",\n \"TH\",\n \"THEAD\",\n \"TR\",\n \"U\",\n \"UL\",\n]);\n\n/** Never copied: no readable text, or not content. */\nconst DROPPED_TAGS = new Set([\n \"AUDIO\",\n \"CANVAS\",\n \"IFRAME\",\n \"INPUT\",\n \"NOSCRIPT\",\n \"OBJECT\",\n \"SCRIPT\",\n \"SELECT\",\n \"STYLE\",\n \"SVG\",\n \"TEMPLATE\",\n \"TEXTAREA\",\n \"VIDEO\",\n]);\n\n/**\n * Formatting a selection inherits from where it sits. A selection inside one\n * code block or heading starts below that element, so wrap it back in.\n */\nconst CONTEXT_TAGS = new Set([\n \"A\",\n \"B\",\n \"BLOCKQUOTE\",\n \"CODE\",\n \"DEL\",\n \"EM\",\n \"H1\",\n \"H2\",\n \"H3\",\n \"H4\",\n \"H5\",\n \"H6\",\n \"I\",\n \"PRE\",\n \"S\",\n \"STRONG\",\n \"U\",\n]);\n\n/** Containers that only make sense with their parent table. */\nconst TABLE_PARTS = new Set([\"THEAD\", \"TBODY\", \"TFOOT\", \"TR\"]);\n\nconst INLINE_DISPLAYS = new Set([\n \"inline\",\n \"inline-block\",\n \"inline-flex\",\n \"inline-grid\",\n \"contents\",\n]);\n\nfunction computedStyle(element: Element): CSSStyleDeclaration | null {\n const view = element.ownerDocument.defaultView;\n if (!view || typeof view.getComputedStyle !== \"function\") return null;\n try {\n return view.getComputedStyle(element);\n } catch {\n return null;\n }\n}\n\n/** Mirrors what the browser's own selection text leaves out. */\nfunction excluded(element: Element): boolean {\n if (DROPPED_TAGS.has(element.tagName.toUpperCase())) return true;\n if (element.hasAttribute(\"hidden\")) return true;\n const style = computedStyle(element);\n if (!style) return false;\n if (style.display === \"none\") return true;\n if (style.visibility === \"hidden\" || style.visibility === \"collapse\") return true;\n const userSelect =\n style.userSelect ||\n style.getPropertyValue(\"user-select\") ||\n style.getPropertyValue(\"-webkit-user-select\");\n return userSelect === \"none\";\n}\n\nfunction isBlock(element: Element): boolean {\n const display = computedStyle(element)?.display;\n return !!display && !INLINE_DISPLAYS.has(display);\n}\n\nfunction safeUrl(value: string | null, base: string): string | null {\n if (!value) return null;\n try {\n const url = new URL(value, base);\n return url.protocol === \"http:\" || url.protocol === \"https:\" || url.protocol === \"mailto:\"\n ? url.href\n : null;\n } catch {\n return null;\n }\n}\n\nfunction shallowCopy(source: Element, target: Document): Element {\n const tag = source.tagName.toLowerCase();\n const copy = target.createElement(tag);\n const base = source.ownerDocument.baseURI;\n if (tag === \"a\") {\n const href = safeUrl(source.getAttribute(\"href\"), base);\n if (href) copy.setAttribute(\"href\", href);\n } else if (tag === \"img\") {\n const src = safeUrl(source.getAttribute(\"src\"), base);\n if (src) copy.setAttribute(\"src\", src);\n const alt = source.getAttribute(\"alt\");\n if (alt) copy.setAttribute(\"alt\", alt);\n } else if (tag === \"ol\") {\n const start = source.getAttribute(\"start\");\n if (start && /^-?\\d+$/.test(start)) copy.setAttribute(\"start\", start);\n } else if (tag === \"td\" || tag === \"th\") {\n for (const name of [\"colspan\", \"rowspan\"]) {\n const value = source.getAttribute(name);\n if (value && /^\\d+$/.test(value)) copy.setAttribute(name, value);\n }\n }\n return copy;\n}\n\nfunction appendSelected(node: Node, range: Range, parent: Node, target: Document): void {\n if (node.nodeType === Node.TEXT_NODE) {\n const text = node.textContent ?? \"\";\n const start = node === range.startContainer ? range.startOffset : 0;\n const end = node === range.endContainer ? range.endOffset : text.length;\n if (end > start) parent.appendChild(target.createTextNode(text.slice(start, end)));\n return;\n }\n if (node.nodeType !== Node.ELEMENT_NODE) return;\n const element = node as Element;\n if (excluded(element)) return;\n const tag = element.tagName.toUpperCase();\n let into: Node = parent;\n if (KEPT_TAGS.has(tag)) {\n into = parent.appendChild(shallowCopy(element, target));\n } else if (isBlock(element)) {\n into = parent.appendChild(target.createElement(\"div\"));\n }\n appendChildrenInRange(element, range, into, target);\n}\n\nfunction appendChildrenInRange(node: Node, range: Range, parent: Node, target: Document): void {\n for (let child = node.firstChild; child; child = child.nextSibling) {\n if (range.intersectsNode(child)) appendSelected(child, range, parent, target);\n }\n}\n\n/** The selected content of one range, wrapped in the formatting it sits inside. */\nfunction serializeRange(range: Range, root: Element, target: Document): Node {\n const fragment = target.createDocumentFragment();\n const common = range.commonAncestorContainer;\n if (common.nodeType === Node.TEXT_NODE) {\n appendSelected(common, range, fragment, target);\n } else {\n appendChildrenInRange(common, range, fragment, target);\n }\n let content: Node = fragment;\n let ancestor: Element | null =\n common.nodeType === Node.ELEMENT_NODE ? (common as Element) : common.parentElement;\n // A selection across several items or rows keeps its list or table.\n if (ancestor && ancestor !== root) {\n const tag = ancestor.tagName.toUpperCase();\n if (tag === \"UL\" || tag === \"OL\" || tag === \"TABLE\" || TABLE_PARTS.has(tag)) {\n const wrapper = shallowCopy(ancestor, target);\n wrapper.appendChild(content);\n content = wrapper;\n if (TABLE_PARTS.has(tag)) {\n const table = target.createElement(\"table\");\n if (tag === \"TR\") {\n const body = target.createElement(\"tbody\");\n body.appendChild(content);\n table.appendChild(body);\n } else {\n table.appendChild(content);\n }\n content = table;\n }\n }\n }\n for (\n ;\n ancestor && ancestor !== root && root.contains(ancestor);\n ancestor = ancestor.parentElement\n ) {\n if (excluded(ancestor)) continue;\n if (!CONTEXT_TAGS.has(ancestor.tagName.toUpperCase())) continue;\n const wrapper = shallowCopy(ancestor, target);\n wrapper.appendChild(content);\n content = wrapper;\n }\n return content;\n}\n\nfunction editable(node: Node | null): boolean {\n const element = node?.nodeType === Node.ELEMENT_NODE ? (node as Element) : node?.parentElement;\n if (!element) return false;\n return !!element.closest(\n \"input, textarea, select, [contenteditable]:not([contenteditable='false'])\",\n );\n}\n\n/**\n * Clean clipboard flavours for the current selection inside `root`, or null\n * when the browser's default copy should run (no selection, a selection that\n * leaves `root`, or one inside an editable field).\n */\nexport function selectionClipboardContent(root: Element): { html: string; text: string } | null {\n const selection = root.ownerDocument.getSelection();\n if (!selection || selection.isCollapsed || selection.rangeCount === 0) return null;\n const ranges: Range[] = [];\n for (let index = 0; index < selection.rangeCount; index += 1) {\n const range = selection.getRangeAt(index);\n if (!root.contains(range.commonAncestorContainer)) return null;\n if (editable(range.startContainer) || editable(range.endContainer)) return null;\n ranges.push(range);\n }\n const text = selection.toString();\n if (!text) return null;\n // An inert document: nothing created here loads images or runs anything.\n const target = root.ownerDocument.implementation.createHTMLDocument(\"\");\n const container = target.createElement(\"div\");\n for (const range of ranges) container.appendChild(serializeRange(range, root, target));\n return { html: container.innerHTML, text };\n}\n\n/**\n * `copy` handler: replace the browser's styled copy of a selection inside\n * `root` with clean HTML plus the browser's own plain text. Leaves every other\n * copy (editable fields, selections outside `root`) untouched.\n */\nexport function copySelectionWithoutPageStyles(\n event: Pick<ClipboardEvent, \"clipboardData\" | \"preventDefault\">,\n root: Element | null,\n): boolean {\n if (!root || !event.clipboardData) return false;\n const content = selectionClipboardContent(root);\n if (!content) return false;\n event.clipboardData.setData(\"text/plain\", content.text);\n event.clipboardData.setData(\"text/html\", content.html);\n event.preventDefault();\n return true;\n}\n","import { Component, type ReactNode } from \"react\";\n\ntype Anchor = {\n element: HTMLElement;\n key: string | null;\n text: string | null;\n top: number;\n focused?: boolean;\n};\nexport type TimelineAnchor = Anchor[];\n\n/**\n * Read ownership synchronously: selectionchange may follow the next React commit.\n * Focus left on a card the person just answered is not reading: that answer\n * handed the view back to the conversation's tip.\n */\nexport function timelineHasReader(\n scroller: HTMLElement | null,\n answeredCard: HTMLElement | null = null,\n): boolean {\n if (!scroller) return false;\n const focused = scroller.ownerDocument.activeElement;\n const selection = scroller.ownerDocument.getSelection();\n return Boolean(\n (focused &&\n focused !== scroller &&\n scroller.contains(focused) &&\n !answeredCard?.contains(focused)) ||\n (selection &&\n !selection.isCollapsed &&\n (scroller.contains(selection.anchorNode) || scroller.contains(selection.focusNode))),\n );\n}\n\n/** Read the old DOM immediately before React changes it, not when a fetch starts. */\nexport class TimelineBeforeLayout extends Component<{\n capture: () => void;\n children: ReactNode;\n}> {\n getSnapshotBeforeUpdate() {\n this.props.capture();\n return null;\n }\n componentDidUpdate() {}\n render() {\n return this.props.children;\n }\n}\n\nexport function captureTimelineAnchor(scroller: HTMLElement): TimelineAnchor | null {\n const viewport = scroller.getBoundingClientRect();\n if (viewport.height <= 0) return null;\n // Capture each box once: these measurements share one pre-commit DOM snapshot.\n const groups = Array.from(scroller.querySelectorAll<HTMLElement>(\"[data-og-group-key]\"))\n .map((element) => ({ element, rect: element.getBoundingClientRect() }))\n .filter(({ rect }) => rect.height > 0);\n const anchors: TimelineAnchor = [];\n let stickyFocus: Anchor | undefined;\n // A disclosure is the reader's explicit point of interaction. In particular,\n // anchoring a paragraph below an expanding disclosure would move its button.\n const focused = scroller.ownerDocument.activeElement;\n if (focused instanceof HTMLElement && scroller.contains(focused) && focused !== scroller) {\n const box = focused.getBoundingClientRect();\n if (box.bottom > viewport.top && box.top < viewport.bottom) {\n const anchor = { element: focused, key: null, text: null, top: box.top, focused: true };\n const section = focused.closest(\"[data-og-work-section]\");\n // A stuck header stays put even when its section moves. Anchor the work\n // being read beneath it instead, while still retaining its focus identity.\n if (\n focused.matches('[data-og-work-header=\"outer\"]') &&\n section &&\n section.getBoundingClientRect().top < box.top - 1\n )\n stickyFocus = anchor;\n else anchors.push(anchor);\n }\n }\n // A paragraph survives even when earlier deltas reconstruct its containing message.\n for (const { element: group, rect } of groups) {\n if (rect.bottom <= viewport.top || rect.top >= viewport.bottom) continue;\n for (const element of group.querySelectorAll<HTMLElement>(\"p, li, pre, h1, h2, h3, h4\")) {\n const box = element.getBoundingClientRect();\n const text = element.textContent;\n if (box.bottom > viewport.top && box.top < viewport.bottom && text && text.length >= 12) {\n anchors.push({ element, key: null, text, top: box.top });\n }\n }\n }\n // Prefer a retained visible row, then a following row. A following row also\n // anchors the unchanged suffix of a partially loaded message above it.\n const rows = groups.map(({ element, rect }) => ({\n element,\n key: element.getAttribute(\"data-og-group-key\"),\n text: null,\n top: rect.top,\n }));\n anchors.push(...rows.filter((row) => row.top >= viewport.top));\n anchors.push(...rows.filter((row) => row.top < viewport.top).reverse());\n if (stickyFocus) anchors.push(stickyFocus);\n return anchors;\n}\n\n/** Return only the correction native browser anchoring has not already made. */\nexport function timelineAnchorCorrection(\n scroller: HTMLElement,\n anchors: TimelineAnchor,\n): number | null {\n let blocks: HTMLElement[] | undefined;\n let groups: HTMLElement[] | undefined;\n for (const anchor of anchors) {\n let element: HTMLElement | undefined;\n if (\n scroller.contains(anchor.element) &&\n (!anchor.text || anchor.element.textContent === anchor.text)\n ) {\n element = anchor.element;\n } else if (anchor.key) {\n groups ??= Array.from(scroller.querySelectorAll<HTMLElement>(\"[data-og-group-key]\"));\n element = groups.find((group) => group.getAttribute(\"data-og-group-key\") === anchor.key);\n } else if (anchor.text) {\n blocks ??= Array.from(scroller.querySelectorAll<HTMLElement>(\"p, li, pre, h1, h2, h3, h4\"));\n const matches = blocks.filter((block) => block.textContent === anchor.text);\n // Repeated boilerplate is not sufficient evidence of retained content.\n if (matches.length === 1) element = matches[0];\n }\n if (element) return element.getBoundingClientRect().top - anchor.top;\n }\n return null;\n}\n","import { useCallback, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport type { TimelineGroup } from \"../timeline/types\";\nimport { timelineHasReader } from \"./timeline-anchor\";\n\n/**\n * Settlement may compact history, but cannot remove prose beneath a reader.\n * Keep only progress that was already primary on the preceding commit; loading\n * settled history never expands it. An explicit work toggle or tip return ends\n * the protection. Keeping the original sibling keys also preserves selection.\n */\nexport function useReadingProgress(\n projected: TimelineGroup[],\n pinned: boolean,\n scroller: HTMLElement | null,\n answeredCard: HTMLElement | null = null,\n) {\n const following = pinned && !timelineHasReader(scroller, answeredCard);\n const previous = useRef<TimelineGroup[]>([]);\n const [released, setReleased] = useState<ReadonlySet<string>>(() => new Set());\n const groups = useMemo(() => {\n if (following) return projected;\n const key = (group: TimelineGroup) => (group.kind === \"item\" ? group.item.id : group.id);\n const visible = new Set(previous.current.map(key));\n const retained = new Map<string, TimelineGroup>();\n const compact = projected.map((group): TimelineGroup => {\n if (group.kind !== \"activity\" || !group.work?.endedAt || released.has(group.id)) {\n return group;\n }\n const progress = group.work.details.filter(\n (child) =>\n child.kind === \"item\" &&\n child.item.kind === \"agent-message\" &&\n visible.has(child.item.id),\n );\n if (!progress.length) return group;\n for (const child of progress) retained.set(key(child), child);\n return {\n ...group,\n work: {\n ...group.work,\n details: group.work.details.filter((child) => !retained.has(key(child))),\n },\n };\n });\n if (!retained.size) return compact;\n // Keep prose before the same retained sibling, including attention rows.\n // Merely hoisting it before Work would still move its DOM across those rows\n // and invalidate a browser selection despite retaining React keys.\n const current = new Set(compact.map(key));\n const before = new Map<string | null, TimelineGroup[]>();\n let next: string | null = null;\n for (let index = previous.current.length - 1; index >= 0; index--) {\n const id = key(previous.current[index]!);\n const child = retained.get(id);\n if (child) before.set(next, [child, ...(before.get(next) ?? [])]);\n else if (current.has(id)) next = id;\n }\n return [\n ...compact.flatMap((group) => [...(before.get(key(group)) ?? []), group]),\n ...(before.get(null) ?? []),\n ];\n }, [projected, following, released]);\n useLayoutEffect(() => {\n previous.current = groups;\n if (following && released.size) setReleased(new Set());\n }, [groups, following, released]);\n const release = useCallback(\n (id: string | null) => {\n if (\n !id ||\n !projected.some(\n (group) => group.kind === \"activity\" && group.id === id && group.work?.endedAt,\n )\n )\n return;\n setReleased((current) => (current.has(id) ? current : new Set([...current, id])));\n },\n [projected],\n );\n return { groups, release };\n}\n","import type { TimelineGroup } from \"../timeline/types\";\nimport { timelineHasReader } from \"./timeline-anchor\";\n\nexport type TimelineSettlement = { element: HTMLElement; top: number };\n\n/** Capture only a retained answer at a real live→settled boundary, never history load. */\nexport function captureTimelineSettlement(\n scroller: HTMLElement,\n groups: readonly { key: string; group: TimelineGroup }[],\n answeredCard: HTMLElement | null = null,\n): TimelineSettlement | null {\n // Selectionchange can arrive after this commit. Inspect ownership directly\n // as well as the caller's pin latch so that race cannot move selected text.\n if (timelineHasReader(scroller, answeredCard)) return null;\n const live = Array.from(\n scroller.querySelectorAll(\n '[data-og-exchange-status=\"working\"], [data-og-exchange-status=\"waiting\"]',\n ),\n );\n // At the live tip the newest retained answer owns the transition. An older\n // waiting/incomplete row must not mask it, including batched settlements.\n for (const status of live.reverse()) {\n const row = status.closest<HTMLElement>(\"[data-og-group-key]\");\n const index = groups.findIndex(({ key }) => key === row?.dataset.ogGroupKey);\n const work = groups[index]?.group;\n const answer = groups[index + 1];\n if (\n work?.kind !== \"activity\" ||\n !work.work?.endedAt ||\n answer?.group.kind !== \"item\" ||\n answer.group.item.kind !== \"agent-message\"\n )\n continue;\n const element = Array.from(scroller.querySelectorAll<HTMLElement>(\"[data-og-group-key]\")).find(\n (node) => node.dataset.ogGroupKey === answer.key,\n );\n if (element) return { element, top: element.getBoundingClientRect().top };\n }\n return null;\n}\n\n/**\n * Folding earlier prose can clamp scrollTop before paint. Keep the retained\n * answer visually continuous after the normal scroll authority has run. This\n * is one local position transition, not a new scroll writer or a presence tree.\n */\nexport function animateTimelineSettlement(snapshot: TimelineSettlement): Animation | null {\n const { element, top } = snapshot;\n if (!element.isConnected || typeof element.animate !== \"function\") return null;\n const delta = top - element.getBoundingClientRect().top;\n if (Math.abs(delta) < 1) return null;\n return element.animate(\n [{ transform: `translateY(${delta}px)` }, { transform: \"translateY(0)\" }],\n {\n id: \"og-timeline-settlement\",\n // Match the existing activity-rail collapse; reduced motion is gated by the caller.\n duration: 320,\n easing: \"cubic-bezier(0.22, 1, 0.36, 1)\",\n },\n );\n}\n","/* ----------------------------------------------------------------------------\n Tip-follow camera (pure)\n\n DOM truth is immediate; while pinned, the viewport tracks new layout growth\n immediately so already-rendered content is never hidden behind the camera.\n Any debt that existed before the growth still closes through the camera.\n No React, no DOM — the shell reads metrics, calls step, writes scrollTop.\n\n One law for pre-existing debt — second-order camera:\n\n desiredVel = debt / τ\n scrollVel → exponential approach to desiredVel (accel τ = k·τ)\n scrollTop += scrollVel · dt (clamp: no overshoot past tip)\n\n - Layout growth advances cameraTop by the same amount, preserving rather\n than increasing existing debt. This keeps the visible stream truthful.\n - Existing debt eases out as desiredVel→0 (soft settle).\n - τ still adapts (calm / catch-up / line / idle settle).\n - maxStep is a speed ceiling for catch-up, never a source of stream lag.\n - Shrink is separate: compensate Δh so collapse doesn't fight the ease\n - Snap only for first paint / reduced motion / cold oversized jumps\n -------------------------------------------------------------------------- */\n\nimport { MOTION_INSPECT_SCALE } from \"../lib/motion-inspect\";\n\nconst _t = (ms: number) => ms * MOTION_INSPECT_SCALE;\nconst _s = (pxPerSec: number) => pxPerSec / MOTION_INSPECT_SCALE;\n\n/** Calm ease while live: remaining debt shrinks ~63% every τ_max ms. */\nexport const TIP_FOLLOW_TAU_MAX_MS = _t(720);\n/** Catch-up ease under large tip-debt (reader far behind / big paste). */\nexport const TIP_FOLLOW_TAU_MIN_MS = _t(200);\n/**\n * Idle settle τ — stream quiet, soft landing into the tip. Longer than live\n * calm so the last pixels decelerate instead of linear-crawling then stopping.\n */\nexport const TIP_FOLLOW_SETTLE_TAU_MS = _t(960);\n/** Debt that saturates urgency toward τ_min. */\nexport const TIP_FOLLOW_CATCHUP_DEBT_PX = 240;\n/** Keep the rAF alive this long after the last height growth. */\nexport const TIP_FOLLOW_HOT_IDLE_MS = _t(320);\n/** Cold oversized debt snaps (session switch / huge fold), not eases. */\nexport const TIP_FOLLOW_SNAP_PX = 480;\n/** Soft speed floor while live with tiny debt (px/s). */\nexport const TIP_FOLLOW_CALM_MAX_PX_S = _s(42);\n/** Soft speed ceiling while catching a fast stream / modest tip-debt (px/s). */\nexport const TIP_FOLLOW_BURST_MAX_PX_S = _s(420);\n/** Ceiling for huge tip-debt / large single-frame walls (px/s). */\nexport const TIP_FOLLOW_SURGE_MAX_PX_S = _s(1800);\n/** Hot line-sized tip-debt uses the short {@link TIP_FOLLOW_LINE_TAU_MS}. */\nexport const TIP_FOLLOW_LINE_GROWTH_PX = 48;\n/** Hot τ ceiling while closing a line-sized tip-debt (ms). */\nexport const TIP_FOLLOW_LINE_TAU_MS = _t(140);\n/**\n * Velocity ease-in/out: scrollVel approaches desiredVel with this fraction of τ.\n * Lower → snappier accel; higher → softer start (and slower reaction).\n */\nexport const TIP_FOLLOW_ACCEL_TAU_FRAC = 0.45;\n/** Ignore sub-pixel / reflow height noise for shrink compensate. */\nexport const TIP_FOLLOW_SHRINK_EPS_PX = 4;\n/** Growth speed (px/s) that saturates velocity urgency. */\nexport const TIP_FOLLOW_VELOCITY_REF_PX_S = _s(420);\n/**\n * Tip-debt below which growth velocity must not tighten τ.\n * Sparse tokens are high-velocity by nature; only arm once actually behind.\n */\nexport const TIP_FOLLOW_VELOCITY_ARM_DEBT_PX = 72;\n/** EMA decay τ for growthVelocity when height is flat (ms). */\nexport const TIP_FOLLOW_VELOCITY_DECAY_MS = _t(180);\n/** Reader-up pixels above clamp budget that count as leaving the tip. */\nexport const TIP_FOLLOW_READER_UP_EPS_PX = 2;\n/**\n * Browsers snap scrollTop writes to device pixels (whole px at dpr 1). A DOM\n * position within this window of the camera's own fractional position is that\n * quantization echo, not external motion — keep the fraction so sub-pixel\n * settle steps accumulate. Anything larger (clamp, user, glue) re-bases.\n */\nexport const TIP_FOLLOW_QUANTIZE_WINDOW_PX = 1;\n\n/** Test-only override for scrollend feature detection (`null` = probe DOM). */\nlet scrollEndSupportOverride: boolean | null = null;\n\n/** @internal */ export function setScrollEndSupportForTests(value: boolean | null): void {\n scrollEndSupportOverride = value;\n}\n\n/** True when the engine exposes element `scrollend` (prefer over rAF leave). */\nexport function supportsScrollEndEvent(): boolean {\n if (scrollEndSupportOverride !== null) {\n return scrollEndSupportOverride;\n }\n return typeof HTMLElement !== \"undefined\" && \"onscrollend\" in HTMLElement.prototype;\n}\n\n/**\n * ScrollTop decrease not explained by a maxScroll clamp (fold / composer\n * shrink). Fold clamp: top falls by ≈ maxScroll fall → 0. Real scroll-up:\n * top falls while maxScroll holds → positive. No timers.\n */\nexport function readerScrollUpPx(\n prevTop: number,\n nextTop: number,\n prevMaxScroll: number,\n nextMaxScroll: number,\n): number {\n const topDelta = prevTop - nextTop;\n const clampBudget = Math.max(0, prevMaxScroll - nextMaxScroll);\n return topDelta - clampBudget;\n}\n\nexport type TipFollowState = {\n running: boolean;\n hotUntil: number;\n lastTs: number;\n lastHeight: number;\n /** Last observed scroller clientHeight — viewport shrink heats like tip growth. */\n lastClientHeight: number;\n lastGrowthAt: number;\n /** EMA of recent height growth (px/s); nudges τ / ceiling under bursts. */\n growthVelocity: number;\n /** Camera velocity toward tip (px/s). Smoothed — never jumps with debt. */\n scrollVelocity: number;\n /**\n * Fractional camera position. The DOM quantizes scrollTop to device pixels,\n * so settle steps under 1px would be discarded every frame if the camera\n * re-based on the DOM — it then parks 20-50px short of the tip forever.\n * `null` = no fraction in flight; adopt the DOM position.\n */\n cameraTop: number | null;\n};\n\nexport type TipFollowStepInput = {\n scrollTop: number;\n scrollHeight: number;\n clientHeight: number;\n now: number;\n pinned: boolean;\n reducedMotion: boolean;\n revealed: boolean;\n};\n\nexport type TipFollowStepResult = {\n scrollTop: number;\n state: TipFollowState;\n};\n\nexport function createTipFollowState(): TipFollowState {\n return {\n running: false,\n hotUntil: 0,\n lastTs: 0,\n lastHeight: 0,\n lastClientHeight: 0,\n lastGrowthAt: 0,\n growthVelocity: 0,\n scrollVelocity: 0,\n cameraTop: null,\n };\n}\n\nexport function tipFollowCancel(state: TipFollowState): TipFollowState {\n return {\n ...state,\n running: false,\n lastTs: 0,\n scrollVelocity: 0,\n cameraTop: null,\n };\n}\n\n/**\n * Record content height. Positive growth extends the hot window so sparse\n * lines do not tear down the follow loop between appends.\n */\nexport function tipFollowNoteGrowth(\n state: TipFollowState,\n height: number,\n now: number,\n): TipFollowState {\n const previous = state.lastHeight;\n if (previous <= 0) {\n return { ...state, lastHeight: height };\n }\n if (height < previous && previous - height <= TIP_FOLLOW_SHRINK_EPS_PX) {\n // Match viewport-shrink deadband memory: the shell retains the paired\n // pre-shrink scrollTop and this state retains the corresponding height.\n return state;\n }\n if (height <= previous) {\n return { ...state, lastHeight: height };\n }\n const dt = state.lastGrowthAt > 0 ? now - state.lastGrowthAt : 0;\n let growthVelocity = state.growthVelocity;\n if (dt > 0) {\n const instant = ((height - previous) / dt) * 1000;\n growthVelocity = growthVelocity * 0.65 + instant * 0.35;\n }\n return {\n ...state,\n lastHeight: height,\n lastGrowthAt: now,\n growthVelocity,\n hotUntil: now + TIP_FOLLOW_HOT_IDLE_MS,\n };\n}\n\n/**\n * Record scroller viewport height. A shrink (composer / SessionChrome /\n * window) raises tip debt (`scrollHeight - clientHeight`) without growing\n * content — the same debt content-growth would create. Heat the camera so\n * catch-up does not fall into cold soft-settle (~42px/s) and leave the tip\n * parked under the chrome.\n */\nexport function tipFollowNoteViewportShrink(\n state: TipFollowState,\n clientHeight: number,\n now: number,\n): TipFollowState {\n const previous = state.lastClientHeight;\n if (previous <= 0) {\n return { ...state, lastClientHeight: clientHeight };\n }\n const shrink = previous - clientHeight;\n if (shrink <= 0) {\n return { ...state, lastClientHeight: clientHeight };\n }\n if (shrink <= TIP_FOLLOW_SHRINK_EPS_PX) {\n // Sub-eps shrink: HOLD the baseline (deadband with memory). An animated\n // chrome/composer ease-out delivers many ≤eps frames; adopting each one\n // leaked the whole tail into cold debt with no glue and no heat.\n return state;\n }\n const dt = state.lastGrowthAt > 0 ? now - state.lastGrowthAt : 0;\n let growthVelocity = state.growthVelocity;\n if (dt > 0) {\n const instant = (shrink / dt) * 1000;\n growthVelocity = growthVelocity * 0.65 + instant * 0.35;\n } else {\n growthVelocity = Math.max(growthVelocity, shrink * (1000 / TIP_FOLLOW_HOT_IDLE_MS));\n }\n return {\n ...state,\n lastClientHeight: clientHeight,\n lastGrowthAt: now,\n growthVelocity,\n hotUntil: now + TIP_FOLLOW_HOT_IDLE_MS,\n };\n}\n\n/**\n * Adaptive τ: small debt → calm; large debt / armed velocity → catch-up.\n * While hot, floor urgency so live streams are not stuck on calm τ.\n * Idle settle uses the longer settle τ.\n */\nexport function tipFollowTauMs(\n debtPx: number,\n growthVelocityPxPerSec = 0,\n settling = false,\n hot = false,\n): number {\n if (settling) {\n return TIP_FOLLOW_SETTLE_TAU_MS;\n }\n const absDebt = Math.abs(debtPx);\n const debtT = Math.min(1, absDebt / TIP_FOLLOW_CATCHUP_DEBT_PX);\n let velUrgency = 0;\n if (absDebt >= TIP_FOLLOW_VELOCITY_ARM_DEBT_PX) {\n const velT = Math.min(1, Math.max(0, growthVelocityPxPerSec) / TIP_FOLLOW_VELOCITY_REF_PX_S);\n velUrgency = velT * 0.55;\n }\n const hotUrgency = hot ? 0.65 : 0;\n const urgency = Math.min(1, Math.max(debtT, velUrgency, hotUrgency));\n let tau = TIP_FOLLOW_TAU_MAX_MS + (TIP_FOLLOW_TAU_MIN_MS - TIP_FOLLOW_TAU_MAX_MS) * urgency;\n // Line-sized live debt: close over ~LINE_TAU so the glide finishes before\n // the next newline without needing 1:1 tip-glue.\n if (hot && absDebt > 0 && absDebt <= TIP_FOLLOW_LINE_GROWTH_PX) {\n tau = Math.min(tau, TIP_FOLLOW_LINE_TAU_MS);\n }\n return tau;\n}\n\n/**\n * Soft speed ceiling from continuous signals (debt, velocity EMA, this-frame\n * growth). No mode switches — larger inputs raise the ceiling smoothly.\n */\nexport function tipFollowMaxStepPx(\n debtPx: number,\n growthVelocityPxPerSec: number,\n dtMs: number,\n frameGrowthPx = 0,\n hot = false,\n): number {\n const absDebt = Math.abs(debtPx);\n const debtT = Math.min(1, absDebt / TIP_FOLLOW_CATCHUP_DEBT_PX);\n const velT = Math.min(1, Math.max(0, growthVelocityPxPerSec) / TIP_FOLLOW_VELOCITY_REF_PX_S);\n const armed = absDebt >= TIP_FOLLOW_VELOCITY_ARM_DEBT_PX;\n const blend = Math.max(debtT, armed ? velT : 0, hot ? 0.35 : 0);\n let maxPxS =\n TIP_FOLLOW_CALM_MAX_PX_S +\n (TIP_FOLLOW_BURST_MAX_PX_S - TIP_FOLLOW_CALM_MAX_PX_S) * blend * blend;\n if (hot && frameGrowthPx > 0 && dtMs > 0) {\n // Allow pre-existing debt to close without falling behind current growth.\n maxPxS = Math.max(maxPxS, (frameGrowthPx / dtMs) * 1000);\n }\n if (hot && growthVelocityPxPerSec > TIP_FOLLOW_CALM_MAX_PX_S) {\n // Live stream: slightly outrun the EMA so tip-debt cannot ratchet forever.\n maxPxS = Math.max(maxPxS, Math.min(TIP_FOLLOW_BURST_MAX_PX_S, growthVelocityPxPerSec * 1.25));\n }\n if (hot && absDebt > 8) {\n // Continuous debt horizon (no catch-up cliff at CATCHUP_DEBT).\n maxPxS = Math.max(maxPxS, Math.min(TIP_FOLLOW_SURGE_MAX_PX_S, absDebt / 0.2));\n } else if (absDebt >= TIP_FOLLOW_CATCHUP_DEBT_PX) {\n maxPxS = Math.max(maxPxS, Math.min(TIP_FOLLOW_SURGE_MAX_PX_S, absDebt / 0.12));\n }\n return (maxPxS / 1000) * dtMs;\n}\n\nfunction targetScrollTop(scrollHeight: number, clientHeight: number): number {\n return Math.max(0, scrollHeight - clientHeight);\n}\n\n/**\n * Height left the document (settle collapse / composer). Keep the same pixels\n * on screen: scrollTop -= Δh, clamped to the new max.\n */\nexport function tipFollowCompensateShrink(\n scrollTop: number,\n previousHeight: number,\n nextHeight: number,\n clientHeight: number,\n epsPx: number = TIP_FOLLOW_SHRINK_EPS_PX,\n): number {\n const delta = previousHeight - nextHeight;\n if (delta <= epsPx) {\n return scrollTop;\n }\n const maxScroll = Math.max(0, nextHeight - clientHeight);\n return Math.max(0, Math.min(maxScroll, scrollTop - delta));\n}\n\nexport type TipFollowContentShrinkBaseline = {\n scrollHeight: number;\n scrollTop: number;\n};\n\nexport type TipFollowContentShrinkObservation = {\n baseline: TipFollowContentShrinkBaseline | null;\n compensatedScrollTop: number | null;\n};\n\n/**\n * Retain the geometry from the first sub-epsilon content-shrink frame until\n * the cumulative collapse crosses the deadband. Browsers may clamp scrollTop\n * after every tiny frame, so compensating from the latest DOM top would count\n * those already-applied clamps twice and make the result animation-cadence\n * dependent.\n */\nexport function tipFollowObserveContentShrink(\n baseline: TipFollowContentShrinkBaseline | null,\n previousHeight: number,\n previousScrollTop: number,\n nextHeight: number,\n clientHeight: number,\n epsPx: number = TIP_FOLLOW_SHRINK_EPS_PX,\n): TipFollowContentShrinkObservation {\n if (previousHeight <= 0 || nextHeight >= previousHeight) {\n return { baseline: null, compensatedScrollTop: null };\n }\n const retained = baseline ?? {\n scrollHeight: previousHeight,\n scrollTop: previousScrollTop,\n };\n if (retained.scrollHeight - nextHeight <= epsPx) {\n return { baseline: retained, compensatedScrollTop: null };\n }\n return {\n baseline: null,\n compensatedScrollTop: tipFollowCompensateShrink(\n retained.scrollTop,\n retained.scrollHeight,\n nextHeight,\n clientHeight,\n epsPx,\n ),\n };\n}\n\n/**\n * Viewport shrank (SessionChrome / composer / window). maxScroll rises by ≈Δc;\n * keep the same tip distance: scrollTop += Δc. Without this, pinned follow only\n * sees new tip debt and soft-settles under the chrome.\n */\nexport function tipFollowCompensateViewportShrink(\n scrollTop: number,\n previousClientHeight: number,\n nextClientHeight: number,\n scrollHeight: number,\n epsPx: number = TIP_FOLLOW_SHRINK_EPS_PX,\n): number {\n if (previousClientHeight <= 0) {\n return scrollTop;\n }\n const shrink = previousClientHeight - nextClientHeight;\n if (shrink <= epsPx) {\n return scrollTop;\n }\n const maxScroll = Math.max(0, scrollHeight - nextClientHeight);\n return Math.max(0, Math.min(maxScroll, scrollTop + shrink));\n}\n\n/**\n * One camera step. Shell schedules the next rAF while `result.state.running`.\n */\nexport function tipFollowStep(\n state: TipFollowState,\n input: TipFollowStepInput,\n): TipFollowStepResult {\n const { scrollTop, scrollHeight, clientHeight, now, pinned, reducedMotion, revealed } = input;\n const previousHeight = state.lastHeight;\n const previousClient = state.lastClientHeight;\n const frameGrowth =\n previousHeight > 0 && scrollHeight > previousHeight ? scrollHeight - previousHeight : 0;\n const frameViewportShrink =\n previousClient > 0 && clientHeight < previousClient - TIP_FOLLOW_SHRINK_EPS_PX\n ? previousClient - clientHeight\n : 0;\n const grew = frameGrowth > 0 || frameViewportShrink > 0;\n let noted = tipFollowNoteGrowth(state, scrollHeight, now);\n noted = tipFollowNoteViewportShrink(noted, clientHeight, now);\n // Sub-device-pixel writes are floored by the engine: a DOM position within\n // the quantization window of our own fractional camera is the echo of our\n // last write, not external motion — keep the fraction so settle steps\n // accumulate. Larger disagreement (clamp / reader / snap) re-bases.\n let cameraTop = scrollTop;\n if (\n state.cameraTop !== null &&\n Math.abs(state.cameraTop - scrollTop) <= TIP_FOLLOW_QUANTIZE_WINDOW_PX\n ) {\n cameraTop = state.cameraTop;\n }\n // Chrome/composer dock: tip-glue before ease so debt from ΔclientHeight is\n // not left for cold soft-settle (content still under the new bar).\n if (pinned && frameViewportShrink > 0) {\n cameraTop = tipFollowCompensateViewportShrink(\n cameraTop,\n previousClient,\n clientHeight,\n scrollHeight,\n );\n }\n const target = targetScrollTop(scrollHeight, clientHeight);\n if (pinned && frameGrowth > 0) {\n // Preserve the distance that existed before this layout growth instead of\n // manufacturing new visual debt. The content is already in the DOM; while\n // pinned, hiding it behind an eased scroll makes frontend streaming appear\n // slower than the provider and leaves a visible catch-up tail after the\n // final token. Existing debt still goes through the camera below.\n cameraTop = Math.min(target, cameraTop + frameGrowth);\n }\n const debt = target - cameraTop;\n const hot = now < noted.hotUntil;\n const settling = !hot && Math.abs(debt) < TIP_FOLLOW_CATCHUP_DEBT_PX;\n\n if (!pinned) {\n return {\n scrollTop,\n state: tipFollowCancel(noted),\n };\n }\n\n if (!revealed || reducedMotion) {\n return {\n scrollTop: target,\n state: tipFollowCancel(noted),\n };\n }\n\n if (Math.abs(debt) > TIP_FOLLOW_SNAP_PX && !hot) {\n return {\n scrollTop: target,\n state: tipFollowCancel(noted),\n };\n }\n\n const dt = noted.lastTs === 0 ? 16 : Math.min(64, Math.max(8, now - noted.lastTs));\n if (!grew && noted.growthVelocity > 0) {\n const decayed = noted.growthVelocity * Math.exp(-dt / TIP_FOLLOW_VELOCITY_DECAY_MS);\n noted = {\n ...noted,\n growthVelocity: decayed < 1 ? 0 : decayed,\n };\n }\n\n if (Math.abs(debt) <= 0.75) {\n return {\n scrollTop: Math.abs(debt) > 0 ? target : cameraTop,\n state: {\n ...tipFollowCancel(noted),\n growthVelocity: hot ? noted.growthVelocity : 0,\n },\n };\n }\n\n const tau = tipFollowTauMs(debt, noted.growthVelocity, settling, hot);\n const dtSec = dt / 1000;\n const tauSec = Math.max(tau / 1000, 1e-3);\n // P-gain: held desiredVel would close debt in ~τ. Velocity cannot jump —\n // pre-existing debt accelerates toward desiredVel and then settles out.\n const desiredVel = debt / tauSec;\n const accelTauSec = Math.max(tauSec * TIP_FOLLOW_ACCEL_TAU_FRAC, 0.02);\n const velAlpha = 1 - Math.exp(-dtSec / accelTauSec);\n let scrollVelocity =\n (noted.scrollVelocity ?? 0) + (desiredVel - (noted.scrollVelocity ?? 0)) * velAlpha;\n\n const maxStep = tipFollowMaxStepPx(\n debt,\n noted.growthVelocity,\n dt,\n frameGrowth + frameViewportShrink,\n hot,\n );\n const maxVel = maxStep / dtSec;\n if (Math.abs(scrollVelocity) > maxVel) {\n scrollVelocity = Math.sign(scrollVelocity) * maxVel;\n }\n\n let next = cameraTop + scrollVelocity * dtSec;\n // Never overshoot the tip — stop and kill velocity on arrival.\n if (debt > 0 && next >= target - 0.35) {\n next = target;\n scrollVelocity = 0;\n } else if (debt < 0 && next <= target + 0.35) {\n next = target;\n scrollVelocity = 0;\n }\n next = Math.max(0, next);\n\n const running = Math.abs(target - next) > 0.35 || Math.abs(scrollVelocity) > 1;\n return {\n scrollTop: next,\n state: {\n ...noted,\n scrollVelocity,\n running,\n lastTs: now,\n // Carry the fraction the DOM will floor away; drop it once landed.\n cameraTop: running ? next : null,\n },\n };\n}\n","import { isSessionId } from \"../timeline/agent-identity\";\nimport { namedAgentTitle, type AgentTitleParts } from \"../timeline/platform-activity-presentation\";\nimport type { MachineInputMember } from \"../timeline/types\";\nimport { type OpenGeniText } from \"../messages/runtime\";\n\nexport const MACHINE_INPUT_META = (\n t: OpenGeniText,\n): Record<MachineInputMember[\"kind\"], string> => ({\n scheduled_occurrence: t(\"machineInputDisplay.automationRun\"),\n goal_continuation: t(\"machineInputDisplay.goalContinued\"),\n background_command_result: t(\"machineInputDisplay.commandResultReceived\"),\n session_wait_timeout: t(\"machineInputDisplay.waitEnded\"),\n agent_message: t(\"machineInputDisplay.agentUpdate\"),\n agent_steer_instruction: t(\"machineInputDisplay.agentDirection\"),\n child_terminal_result: t(\"machineInputDisplay.agentResultReceived\"),\n media_generation_result: t(\"machineInputDisplay.videoUpdate\"),\n secret_use_approval_decided: t(\"machineInputDisplay.secretUseAnswered\"),\n child_requires_action: t(\"machineInputDisplay.agentNeedsInput\"),\n child_requires_action_resolved: t(\"machineInputDisplay.agentUnblocked\"),\n child_paused: t(\"machineInputDisplay.agentPaused\"),\n child_waiting_capacity: t(\"machineInputDisplay.agentWaitingForCapacity\"),\n child_progress: t(\"machineInputDisplay.agentProgress\"),\n capability_setup_completed: t(\"machineInputDisplay.setupFinished\"),\n});\n\n/**\n * Collapsed landmark label for a coalesced machine-input batch.\n * Same-kind batches get a natural plural; mixed kinds stay short.\n * When every agent update's sender has a known title, the label names them\n * (\"Update from Release audit\", \"3 updates from Audit and Flake · Wait ended\").\n */\nexport function machineInputBatchLabel(\n t: OpenGeniText,\n members: readonly MachineInputMember[],\n titleFor?: ((sessionId: string) => string | null) | undefined,\n): string {\n if (members.length === 0) return t(\"machineInputDisplay.updates\");\n const named = titleFor ? namedAgentBatchLabel(t, members, titleFor) : null;\n if (named) return named;\n const counts = new Map<MachineInputMember[\"kind\"], number>();\n for (const member of members) {\n counts.set(member.kind, (counts.get(member.kind) ?? 0) + 1);\n }\n if (counts.size === 1) {\n const kind = members[0]!.kind;\n const n = members.length;\n switch (kind) {\n case \"background_command_result\":\n return n === 1\n ? t(\"machineInputDisplay.commandResultReceived\")\n : t(\"machineInputDisplay.commandResultsReceivedCount\", { count: n });\n case \"session_wait_timeout\":\n return n === 1\n ? t(\"machineInputDisplay.waitEnded\")\n : t(\"machineInputDisplay.waitsEndedCount\", { count: n });\n case \"child_terminal_result\":\n return n === 1\n ? t(\"machineInputDisplay.agentResultReceived\")\n : t(\"machineInputDisplay.agentResultsReceivedCount\", { count: n });\n case \"goal_continuation\":\n return n === 1\n ? t(\"machineInputDisplay.goalContinued\")\n : t(\"machineInputDisplay.goalContinuationsCount\", { count: n });\n case \"scheduled_occurrence\":\n return n === 1\n ? t(\"machineInputDisplay.automationRun\")\n : t(\"machineInputDisplay.automationRunsCount\", { count: n });\n case \"agent_message\":\n return n === 1\n ? t(\"machineInputDisplay.agentUpdate\")\n : t(\"machineInputDisplay.agentUpdatesCount\", { count: n });\n case \"agent_steer_instruction\":\n return n === 1\n ? t(\"machineInputDisplay.agentDirection\")\n : t(\"machineInputDisplay.agentDirectionsCount\", { count: n });\n case \"media_generation_result\":\n return n === 1\n ? t(\"machineInputDisplay.videoReady\")\n : t(\"machineInputDisplay.videoUpdatesCount\", { count: n });\n case \"secret_use_approval_decided\":\n return n === 1\n ? t(\"machineInputDisplay.secretUseAnswered\")\n : t(\"machineInputDisplay.secretUsesAnsweredCount\", { count: n });\n case \"child_requires_action\":\n return n === 1\n ? t(\"machineInputDisplay.agentNeedsInput\")\n : t(\"machineInputDisplay.agentsNeedInputCount\", { count: n });\n case \"child_requires_action_resolved\":\n return n === 1\n ? t(\"machineInputDisplay.agentUnblocked\")\n : t(\"machineInputDisplay.agentsUnblockedCount\", { count: n });\n case \"child_paused\":\n return n === 1\n ? t(\"machineInputDisplay.agentPaused\")\n : t(\"machineInputDisplay.agentsPausedCount\", { count: n });\n case \"child_waiting_capacity\":\n return n === 1\n ? t(\"machineInputDisplay.agentWaitingForCapacity\")\n : t(\"machineInputDisplay.agentsWaitingForCapacityCount\", { count: n });\n case \"child_progress\":\n return n === 1\n ? t(\"machineInputDisplay.agentProgress\")\n : t(\"machineInputDisplay.agentProgressNotesCount\", { count: n });\n case \"capability_setup_completed\":\n return n === 1\n ? t(\"machineInputDisplay.setupFinished\")\n : t(\"machineInputDisplay.setupsFinishedCount\", { count: n });\n }\n }\n const parts = [...counts.entries()].map(([kind, count]) => {\n const label = MACHINE_INPUT_META(t)[kind];\n return count === 1 ? label : t(\"machineInputDisplay.countTimesLabel\", { count, label });\n });\n const preview = parts.slice(0, 2).join(\", \");\n const suffix = parts.length > 2 ? \", …\" : \"\";\n return t(\"machineInputDisplay.lengthUpdatesPreviewSuffix\", {\n length: members.length,\n preview,\n suffix,\n });\n}\n\nfunction namedAgentBatchLabel(\n t: OpenGeniText,\n members: readonly MachineInputMember[],\n titleFor: (sessionId: string) => string | null,\n): string | null {\n const agents = members.filter(isAgentMember);\n if (agents.length === 0) return null;\n const names: string[] = [];\n for (const member of agents) {\n const sessionId = agentMemberSessionId(member);\n const name = sessionId ? titleFor(sessionId) : null;\n if (!name) return null;\n if (!names.includes(name)) names.push(name);\n }\n const others = members.filter((member) => !isAgentMember(member));\n const agentPart =\n agents.length === 1\n ? agentMemberTitle(t, agents[0]!, names[0]!).text\n : names.length === 1\n ? t(\"machineInputDisplay.updatesFromName\", { count: agents.length, name: names[0]! })\n : names.length === 2\n ? t(\"machineInputDisplay.updatesFromTwoNames\", {\n count: agents.length,\n first: names[0]!,\n second: names[1]!,\n })\n : t(\"machineInputDisplay.updatesFromAgents\", {\n count: agents.length,\n agents: names.length,\n });\n if (others.length === 0) return agentPart;\n const counts = new Map<MachineInputMember[\"kind\"], number>();\n for (const member of others) counts.set(member.kind, (counts.get(member.kind) ?? 0) + 1);\n const rest = [...counts.entries()]\n .map(([kind, count]) =>\n count === 1\n ? MACHINE_INPUT_META(t)[kind]\n : t(\"machineInputDisplay.countTimesLabel\", { count, label: MACHINE_INPUT_META(t)[kind] }),\n )\n .join(\", \");\n return `${agentPart} · ${rest}`;\n}\n\n/** Strip protocol prefixes and worker/session UUIDs from display summaries. */\nexport function cleanMachineInputSummary(summary: string): string {\n return summary\n .replace(/^\\[[A-Z][A-Z _-]*(?:\\s+\\d+\\/\\d+)?\\]\\s*/, \"\")\n .replace(/\\bWorker session id:\\s*[0-9a-f]{8}-[0-9a-f-]{27,}\\b/gi, \"\")\n .replace(/\\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\\b/gi, \"\")\n .replace(/\\(\\s*\\)/g, \"\")\n .replace(/\\s*[·|]\\s*$/g, \"\")\n .replace(/\\s{2,}/g, \" \")\n .replace(/\\s+([.,;:])/g, \"$1\")\n .trim();\n}\n\nexport function readableMachineInputSource(sourceId: string): string | null {\n const value = sourceId.trim();\n if (!value || /^[0-9a-f]{8}-[0-9a-f-]{27,}$/i.test(value)) return null;\n if (/^(goal|schedule|system):/i.test(value)) return null;\n return value.replaceAll(\"_\", \" \");\n}\n\n/** True when a cleaned single-member summary adds meaning beyond the pill label. */\nexport function machineInputSummaryIsUseful(\n t: OpenGeniText,\n kind: MachineInputMember[\"kind\"],\n cleanedSummary: string,\n): boolean {\n if (!cleanedSummary) return false;\n const label = MACHINE_INPUT_META(t)[kind].toLowerCase();\n const text = cleanedSummary.toLowerCase();\n if (text === label || text === `${label}.`) return false;\n // Generic child-finished boilerplate after UUID scrub is still noise.\n if (\n kind === \"child_terminal_result\" &&\n /^a worker session you spawned has finished/i.test(cleanedSummary)\n ) {\n return false;\n }\n return true;\n}\n\n/* --- agent members ----------------------------------------------------------- */\n\nconst AGENT_MEMBER_KINDS: ReadonlySet<MachineInputMember[\"kind\"]> = new Set([\n \"agent_message\",\n \"agent_steer_instruction\",\n \"child_terminal_result\",\n \"child_requires_action\",\n \"child_requires_action_resolved\",\n \"child_paused\",\n \"child_waiting_capacity\",\n \"child_progress\",\n]);\n\n/** Members sent by (or about) another agent session. */\nexport function isAgentMember(member: Pick<MachineInputMember, \"kind\">): boolean {\n return AGENT_MEMBER_KINDS.has(member.kind);\n}\n\n/** The agent session a member came from; only typed UUID sources route. */\nexport function agentMemberSessionId(\n member: Pick<MachineInputMember, \"kind\" | \"sourceId\">,\n): string | null {\n return isAgentMember(member) && isSessionId(member.sourceId) ? member.sourceId : null;\n}\n\n/**\n * The row title for an agent member. A child result only means the agent went\n * idle, so it reads \"Result from …\", never \"finished\".\n */\nexport function agentMemberTitle(\n t: OpenGeniText,\n member: Pick<MachineInputMember, \"kind\" | \"classification\">,\n name: string | null,\n): AgentTitleParts {\n const fallback = MACHINE_INPUT_META(t)[member.kind];\n switch (member.kind) {\n case \"agent_message\":\n return namedAgentTitle(\n name,\n (agent) => t(\"machineInputDisplay.updateFromName\", { name: agent }),\n fallback,\n );\n case \"agent_steer_instruction\":\n return namedAgentTitle(\n name,\n (agent) => t(\"machineInputDisplay.directionFromName\", { name: agent }),\n fallback,\n );\n case \"child_terminal_result\":\n return member.classification === \"failure\"\n ? namedAgentTitle(\n name,\n (agent) => t(\"machineInputDisplay.nameFailed\", { name: agent }),\n t(\"machineInputDisplay.agentFailed\"),\n )\n : namedAgentTitle(\n name,\n (agent) => t(\"machineInputDisplay.resultFromName\", { name: agent }),\n fallback,\n );\n case \"child_requires_action\":\n return namedAgentTitle(\n name,\n (agent) => t(\"machineInputDisplay.nameNeedsInput\", { name: agent }),\n fallback,\n );\n case \"child_requires_action_resolved\":\n return namedAgentTitle(\n name,\n (agent) => t(\"machineInputDisplay.nameUnblocked\", { name: agent }),\n fallback,\n );\n case \"child_paused\":\n return namedAgentTitle(\n name,\n (agent) => t(\"machineInputDisplay.namePaused\", { name: agent }),\n fallback,\n );\n case \"child_waiting_capacity\":\n return namedAgentTitle(\n name,\n (agent) => t(\"machineInputDisplay.nameIsWaitingForCapacity\", { name: agent }),\n fallback,\n );\n case \"child_progress\":\n return namedAgentTitle(\n name,\n (agent) => t(\"machineInputDisplay.progressFromName\", { name: agent }),\n fallback,\n );\n default:\n return namedAgentTitle(null, () => fallback, fallback);\n }\n}\n\nfunction capitalize(text: string): string {\n return text ? text[0]!.toUpperCase() + text.slice(1) : text;\n}\n\n/**\n * Drop the protocol tag and \"Worker session id: …\" routing note from a\n * server-written child notice, keeping every other character (and line break)\n * of the agent's own words.\n */\nfunction cleanLines(text: string): string {\n return text\n .split(\"\\n\")\n .map((line) =>\n line\n .replace(/^\\[[A-Z][A-Z _-]*(?:\\s+\\d+\\/\\d+)?\\]\\s*/, \"\")\n .replace(/\\s*\\bWorker session id:\\s*[0-9a-f]{8}-[0-9a-f-]{27,}\\b\\.?/gi, \"\")\n .trim(),\n )\n .filter((line) => line.length > 0)\n .join(\"\\n\");\n}\n\n/**\n * Human text for an agent member: the agent's own words where the summary\n * carries them, without the model-facing \"Worker <id> …\" framing. `preview`\n * is the most useful single passage; `body` is everything worth reading.\n */\nexport function agentMemberText(\n t: OpenGeniText,\n member: Pick<MachineInputMember, \"kind\" | \"summary\">,\n): {\n preview: string;\n body: string;\n} {\n const raw = member.summary.trim();\n const same = (text: string) => ({ preview: text.replace(/\\s+/g, \" \"), body: text });\n switch (member.kind) {\n case \"child_progress\":\n return same(cleanLines(raw.replace(/^Worker \\S+ progress:\\s*/, \"\")));\n case \"child_requires_action\":\n return same(\n cleanLines(\n raw\n .replace(/^Worker \\S+ is blocked and needs input(?: \\(turn [^)]*\\))?\\.\\s*/, \"\")\n .replace(/^It asked:\\s*/, \"\")\n .replace(/([?!])\\.$/, \"$1\"),\n ),\n );\n case \"child_requires_action_resolved\":\n return same(capitalize(cleanLines(raw.replace(/^Worker \\S+:\\s*/, \"\"))));\n case \"child_paused\": {\n const match = /^Worker \\S+ was paused by (.+?)\\.(?:\\s*Reason:\\s*([\\s\\S]*))?$/.exec(raw);\n if (!match) return same(cleanLines(raw));\n return same(\n match[2]?.trim()\n ? cleanLines(match[2])\n : t(\"machineInputDisplay.pausedByValue\", { value: match[1] }),\n );\n }\n case \"child_waiting_capacity\":\n return same(capitalize(cleanLines(raw.replace(/^Worker \\S+ is\\s+/, \"\"))));\n case \"child_terminal_result\": {\n const lines = raw.split(\"\\n\").map((line) => line.trim());\n const rest = lines.filter(\n (line) => line.length > 0 && !/^A worker session you spawned has\\b/i.test(line),\n );\n const field = (prefix: string) =>\n rest\n .find((line) => line.startsWith(prefix))\n ?.slice(prefix.length)\n .trim() || null;\n const goal = field(\"Worker goal:\");\n const evidence = field(\"Completion evidence:\");\n const rationale = field(\"Pause rationale:\");\n const body = cleanLines(\n rest\n .map((line) =>\n line\n .replace(/^Worker goal:\\s*/, `${t(\"machineInputDisplay.goalLabel\")} `)\n .replace(/^Completion evidence:\\s*/, `${t(\"machineInputDisplay.evidenceLabel\")} `)\n .replace(/^Pause rationale:\\s*/, `${t(\"machineInputDisplay.pausedBecauseLabel\")} `),\n )\n .join(\"\\n\"),\n );\n const preview = cleanLines(evidence ?? rationale ?? goal ?? body);\n return { preview: preview.replace(/\\s+/g, \" \"), body };\n }\n default:\n // Agent messages and directions are the sender's own words, verbatim.\n return same(raw);\n }\n}\n","import type { AllowanceExhaustedRefusal } from \"@opengeni/sdk\";\nimport { GaugeIcon } from \"lucide-react\";\nimport { createContext, useContext, useMemo, type ReactNode } from \"react\";\n\nimport { cn } from \"../lib/cn\";\nimport {\n allowanceLabels,\n allowanceResetSentence,\n formatAllowanceInstant,\n type AllowanceLabels,\n} from \"../usage/allowance-copy\";\nimport { useEntranceAnimation } from \"./entrance\";\nimport { useOpenGeniText } from \"../messages/runtime\";\n\n/**\n * Replace the built-in \"usage limit reached\" row. Return `undefined` to keep\n * the default for this refusal (for example, only customize member limits).\n */\nexport type RenderAllowanceExhausted = (\n refusal: AllowanceExhaustedRefusal,\n context: { labels: AllowanceLabels; defaultRow: ReactNode },\n) => ReactNode | undefined;\n\ntype AllowancePresentation = {\n render: RenderAllowanceExhausted | undefined;\n /** Host overrides; the defaults come from the active message catalog. */\n labels: Partial<AllowanceLabels> | undefined;\n};\n\nconst AllowancePresentationContext = createContext<AllowancePresentation>({\n render: undefined,\n labels: undefined,\n});\n\nexport function AllowancePresentationProvider({\n render,\n labels,\n children,\n}: {\n render: RenderAllowanceExhausted | undefined;\n labels: Partial<AllowanceLabels> | undefined;\n children: ReactNode;\n}) {\n const value = useMemo(() => ({ render, labels }), [render, labels]);\n return (\n <AllowancePresentationContext.Provider value={value}>\n {children}\n </AllowancePresentationContext.Provider>\n );\n}\n\n/**\n * A usage ceiling stopped further work. Calm by design: nothing failed, the\n * conversation is kept, and the row says who can raise the limit and when it\n * resets. Never the server's prose or a member identifier.\n */\nexport function AllowanceExhaustedRow({ refusal }: { refusal: AllowanceExhaustedRefusal }) {\n const { render, labels: overrides } = useContext(AllowancePresentationContext);\n const t = useOpenGeniText();\n const labels = useMemo(() => allowanceLabels(t, overrides), [t, overrides]);\n const enter = useEntranceAnimation();\n const workspace = refusal.scope === \"workspace\";\n const defaultRow = (\n <div\n className={cn(\n enter && \"animate-og-enter\",\n \"flex items-start gap-2.5 rounded-og-md border border-og-status-waiting/35 bg-og-status-waiting/8 px-3.5 py-2.5 text-og-menu text-og-fg\",\n )}\n role=\"status\"\n data-og-allowance-exhausted={refusal.scope}\n >\n <GaugeIcon aria-hidden className=\"mt-0.5 size-4 shrink-0 text-og-status-waiting\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"font-medium\">\n {workspace ? labels.workspaceLimitReachedTitle : labels.memberLimitReachedTitle}\n </p>\n <p className=\"mt-0.5 text-og-fg-muted\">\n {workspace ? labels.workspaceRemedy : labels.memberRemedy}{\" \"}\n <span\n title={refusal.resetsAt ? formatAllowanceInstant(t, refusal.resetsAt) : undefined}\n className=\"whitespace-nowrap\"\n >\n {allowanceResetSentence(labels, refusal.resetsAt)}\n </span>\n </p>\n </div>\n </div>\n );\n return <>{render?.(refusal, { labels, defaultRow }) ?? defaultRow}</>;\n}\n","import { formatSessionUsageMicros } from \"@opengeni/sdk/session-usage-limits\";\nimport { GaugeIcon } from \"lucide-react\";\n\nimport { cn } from \"../lib/cn\";\nimport { DEFAULT_SESSION_USAGE_LIMIT_LABELS } from \"../usage/session-usage-limit\";\nimport { useEntranceAnimation } from \"./entrance\";\nimport type { SessionUsageLimitStop } from \"./types\";\nimport { useOpenGeniText } from \"../messages/runtime\";\n\n/**\n * A compact historical marker: the task's usage limit stopped further model\n * requests here. One calm line with the amounts at the stop (the overshoot is\n * kept, without implying only the final request caused it). The current\n * state and the one recovery action live in the host's composer notice, so\n * this row repeats neither. Never a credits or purchase remedy.\n */\nexport function SessionUsageLimitRow({ stop }: { stop: SessionUsageLimitStop }) {\n const t = useOpenGeniText();\n const enter = useEntranceAnimation();\n const labels = DEFAULT_SESSION_USAGE_LIMIT_LABELS(t);\n const amount =\n stop.usedMicros !== null && stop.limitMicros !== null\n ? labels.usedOfLimit(\n formatSessionUsageMicros(stop.usedMicros),\n formatSessionUsageMicros(stop.limitMicros),\n )\n : null;\n return (\n <p\n className={cn(\n enter && \"animate-og-enter\",\n \"flex min-w-0 items-center gap-2 text-og-sm text-og-fg-muted\",\n )}\n role=\"status\"\n data-og-session-usage-limit-stop=\"\"\n >\n <GaugeIcon aria-hidden className=\"size-3.5 shrink-0 text-og-status-waiting\" />\n <span className=\"min-w-0\">\n <span className=\"font-medium text-og-fg\">{labels.reachedTitle}</span>\n {amount ? ` · ${amount}` : \"\"}\n </span>\n </p>\n );\n}\n","import {\n resolveWorkspaceVoiceInputEnabled,\n SESSION_SCOPE_HEADER,\n type ClientVoiceInputConfig,\n type OpenGeniClient,\n type SessionEvent,\n} from \"@opengeni/sdk\";\nimport {\n lazy,\n Suspense,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ComponentProps,\n type CSSProperties,\n} from \"react\";\nimport type { SiteSnapshotClient } from \"./artifacts/chat-interactive-block\";\nimport type { ClientOverride } from \"../session-context\";\nimport { ModelPolicyPicker, type ModelPolicyPickerProps } from \"./model-policy-picker\";\nimport { ConversationRenderBoundary } from \"./conversation-render-boundary\";\nimport { LazyPart } from \"./lazy-part\";\nimport {\n useSessionConversation,\n type SessionConversationController,\n type UseSessionConversationOptions,\n} from \"../hooks/use-session-conversation\";\nimport { useGoal, type UseGoalOptions } from \"../hooks/use-goal\";\nimport { useQueuedPromptRecall } from \"../hooks/use-queued-prompt-recall\";\nimport { useLiveSessionEvents } from \"../hooks/use-live-session-events\";\nimport { useDocumentForeground, useElementOnScreen } from \"../hooks/use-foreground-visibility\";\nimport { useSessionReadAcknowledgement } from \"../hooks/use-session-read-acknowledgement\";\nimport {\n createSessionRetainedScreenshotLoader,\n createWorkspaceRetainedArtifactLoader,\n createWorkspaceRetainedVideoLoader,\n} from \"../timeline/retained-loaders\";\nimport { useRealtimeVoiceModels } from \"../hooks/use-realtime-voice-models\";\nimport type { SessionRealtimeControl } from \"../realtime/realtime-control\";\nimport { EMBEDDED_GENIE_LOADING, type GenieLoadingOptions } from \"../timeline/genie-loading\";\nimport { ApprovalSurface } from \"./approval-surface\";\nimport { ChatComposer, type ChatComposerProps } from \"./chat-composer\";\nimport {\n browserInteractiveAnswerStore,\n InteractiveAnswerProvider,\n} from \"../interactive-answer-model\";\nimport type {\n ComposerTranscriptionControlProps,\n ComposerVoiceInputOptions,\n} from \"./composer-transcription-control\";\nimport { SessionChrome, type SessionChromeProps } from \"./session-chrome\";\nimport { HumanInputSurface, type HumanInputSurfaceProps } from \"./human-input-surface\";\nimport { AuthNeededRow } from \"./auth-needed-row\";\nimport { MessageTimeline, type MessageTimelineProps } from \"./message-timeline\";\nimport {\n inChatConnectDecision,\n isAgentCapabilityRequest,\n useInChatConnectSupport,\n type InChatConnectSource,\n} from \"./conversation-capability-connect\";\nimport type { SessionMcpCapabilityCardProps } from \"./session-mcp-capability-card\";\nimport type { SessionIntegrationCapabilityCardProps } from \"./session-integration-capability-card\";\nimport type { AuthNeededItem } from \"../timeline\";\nimport { ProviderRecoveryNotice } from \"./provider-recovery-notice\";\nimport { currentProviderRecovery } from \"../lib/provider-recovery\";\nimport {\n chainLinkResolvers,\n OpenGeniLinkProvider,\n sessionLinkResolver,\n useOpenGeniLinkResolver,\n viewerLinkResolver,\n type OpenGeniLinkResolver,\n type OpenGeniViewerTarget,\n} from \"./open-geni-links\";\nimport type { UserMessageDisclosureLabels } from \"./user-message-body\";\nimport { cn } from \"../lib/cn\";\nimport { useComposerWithStreamState } from \"../lib/use-calm-service-failure\";\nimport { SessionProxyScope, type SessionProxyBaseUrl } from \"./session-proxy-scope\";\nimport { useErrorMessage } from \"../lib/error-message\";\nimport {\n useHostTheme,\n type HostSurfacePreference,\n type HostThemePreference,\n} from \"../lib/host-theme\";\nimport { SingleSendWording, useOpenGeniText, type OpenGeniText } from \"../messages/runtime\";\nimport { ClientPaymentPageActivity } from \"../timeline/payment-page-activity\";\nimport { ThisComputerCard, type ThisComputerCardProps } from \"./this-computer/this-computer-card\";\n\nexport type SessionConversationLabels = {\n /** Banner action after a refresh failure; the conversation stays mounted. */\n retry: string;\n /** Action when the conversation could not load at all. */\n tryAgain: string;\n /** Shown in place of a Site preview when the client config reports `artifacts: false`. */\n sitePreviewUnavailable: string;\n};\n\nconst DEFAULT_CONVERSATION_LABELS = (t: OpenGeniText): SessionConversationLabels => ({\n retry: t(\"sessionConversation.retry\"),\n tryAgain: t(\"sessionConversation.tryAgain\"),\n sitePreviewUnavailable: t(\"sessionConversation.sitePreviewUnavailable\"),\n});\n\nexport type SessionConversationProps = ClientOverride &\n SessionProxyBaseUrl & {\n /**\n * `null` while your server is still creating the session. Render the\n * conversation as soon as the person sends, with `pendingPrompt`, then\n * pass the id when creation returns: it is the same mounted conversation,\n * so the prompt and its startup row stay put and nothing flashes.\n */\n sessionId: string | null;\n /** See `useSessionConversation`'s `pendingPrompt`. Read once per conversation. */\n pendingPrompt?: UseSessionConversationOptions[\"pendingPrompt\"];\n /** Product-owned desktop connection flow for computer offers. No console URLs or shell commands are assumed. */\n computerConnection?: Omit<ThisComputerCardProps, \"rationale\">;\n /** Host-owned artifact links, previews and other message presentation. */\n renderMessageText?: MessageTimelineProps[\"renderMessageText\"];\n /**\n * Open Opengeni object links in agent replies (`artifact:`, `sandbox:`,\n * editable artifacts, Sites). Asked first; by default retained files and\n * sandbox files download only when the proxy explicitly enables them, while\n * editable artifacts and Sites stay unavailable until the host resolves them.\n */\n resolveLink?: OpenGeniLinkResolver | undefined;\n /**\n * Open agent links to editable artifacts and Sites in a host viewer, for\n * example `SessionArtifactViewer` mounted beside the conversation. Asked\n * after `resolveLink`.\n */\n onOpenArtifact?: ((target: OpenGeniViewerTarget) => void) | undefined;\n /**\n * Open another session the conversation points at: a sub-agent's chat from\n * its worker card or a child update. `OpenGeniChat` opens it in place;\n * without it those entries are not links.\n */\n onOpenSession?: ((sessionId: string) => void) | undefined;\n /**\n * Current title for a session id, used to name the agents this\n * conversation spawns, messages, and hears from. Without it, agents keep\n * the title they were spawned with, or generic labels.\n */\n resolveSessionTitle?: ((sessionId: string) => string | null | undefined) | undefined;\n /**\n * Inline previews for assistant `opengeni-site` / `opengeni-html` fences.\n * Defaults to the Opengeni preview. When the client config reports\n * `artifacts: false`, Sites show as unavailable without a request; `false`\n * shows the fence as code.\n */\n renderInteractiveBlock?: MessageTimelineProps[\"renderInteractiveBlock\"] | false;\n /** Product-specific tool-call renderers; defaults to the built-in registry. */\n toolRegistry?: MessageTimelineProps[\"toolRegistry\"];\n /** Host presentation without replacing native history, navigation or annotations. */\n timelineProps?:\n | Pick<\n MessageTimelineProps,\n \"turnSummary\" | \"renderAuthNeeded\" | \"emptyState\" | \"renderMessageSender\"\n >\n | undefined;\n /**\n * Replace the \"usage limit reached\" row for an `allowance_exhausted`\n * refusal, for example to link your own plan or admin page.\n */\n renderAllowanceExhausted?: MessageTimelineProps[\"renderAllowanceExhausted\"];\n /** Replace the words of the default \"usage limit reached\" row. */\n allowanceExhaustedLabels?: MessageTimelineProps[\"allowanceExhaustedLabels\"];\n /**\n * File attachments in the composer. Defaults to true; the attach control\n * appears only when the deployment's client config enables file uploads.\n * A session proxy reports them off for anonymous visitors (`visitor: true`\n * from `resolve`) unless it sets `visitorUploads`.\n */\n attachments?: boolean | undefined;\n /**\n * Composer microphone (dictation into the draft). Defaults to true; it\n * appears only when the client config reports voice input available.\n * Pass options instead of `true` to set the language dictations are\n * heard in, or a check (such as a consent prompt) before each one starts.\n */\n voiceInput?: boolean | ComposerVoiceInputOptions | undefined;\n /**\n * Live speech-to-speech voice in the composer. Opt-in: a call spends the\n * workspace's credits and asks for the microphone, so it is off unless this\n * is `true` (or an older session proxy reports `realtimeVoice: true`). The\n * button then appears only when the workspace offers an available voice\n * model and the config has not turned voice off (`realtimeVoice: false`).\n */\n realtimeVoice?: boolean | undefined;\n /** Optional connection/voice handoff; the stock control owns call lifecycle and admission. */\n realtimeVoiceProps?:\n | Partial<\n Pick<\n ComponentProps<typeof SessionRealtimeControl>,\n | \"codexConnected\"\n | \"realtimeAutostartModel\"\n | \"onRealtimeAutostartConsumed\"\n | \"onVoiceActiveChange\"\n | \"modelMenu\"\n | \"voiceSettings\"\n >\n >\n | undefined;\n /**\n * Copy and visual for the \"working\" indicator before the first reply.\n * Defaults to neutral copy (\"Thinking…\"); omitted fields keep those\n * defaults. See `MessageTimeline`'s `genieLoading`.\n */\n genieLoading?: GenieLoadingOptions | undefined;\n /**\n * Show the model/reasoning picker. End users of an embedded product rarely\n * choose models, so it is hidden unless this is `true` or the client config\n * reports `modelSelection: true` (`createSessionProxyHandler({ modelSelection: true })`).\n */\n modelPicker?: boolean | undefined;\n /** Model-picker appearance only; visibility, policy and delivery remain owned here. */\n modelPickerProps?: Pick<ModelPolicyPickerProps, \"groupPresentation\" | \"messages\"> | undefined;\n /** Localized actions for already-sent user-message disclosure. */\n userMessageDisclosureLabels?: UserMessageDisclosureLabels | undefined;\n loadSkillReview?: HumanInputSurfaceProps[\"loadSkillReview\"];\n className?: string;\n /** Defaults to filling the host. The host owns available height. */\n height?: CSSProperties[\"height\"];\n /**\n * Mark the conversation read while the person can see it. Defaults to\n * true: whenever the timeline is on screen, the page is visible and the\n * window focused, each delivered reply, question or failure is\n * acknowledged for the signed-in person (once per reply, not per streamed\n * token). Unread state, and notifications a host derives from it (for\n * example from `turn.completed` webhooks that check `session.unread`),\n * then skip replies the person already watched. A hidden or collapsed\n * timeline, a background tab, or an unfocused window acknowledges nothing.\n * Set `false` when viewing must not count as reading.\n */\n readAcknowledgement?: boolean | undefined;\n /**\n * Called once for each event that arrives while the conversation is open,\n * after its history first loaded (never for that history or for older\n * pages read later). For hosts that react to the agent's work, for\n * example reloading a preview when a tool call returns.\n */\n onEvent?: ((event: SessionEvent) => void) | undefined;\n /**\n * Light or dark. Defaults to `auto`: follow the host page (an enclosing\n * `data-og-theme`, `class=\"dark\"`/`data-theme` on <html> or <body>, the\n * host's `color-scheme`, then its background), not the OS setting alone.\n */\n theme?: HostThemePreference | undefined;\n /**\n * `host` (default) derives backgrounds and cards from the host background so\n * the conversation blends in; `theme` uses the `--og-color-*` surface tokens\n * as they are. Customized surface tokens are always kept.\n */\n surface?: HostSurfacePreference | undefined;\n /** Conversation-owned copy (error actions). */\n labels?: Partial<SessionConversationLabels> | undefined;\n /**\n * The signed-in person's subject id, as recorded on their turns\n * (`turn.initiator.subjectId`). When set, Up in an empty composer pulls\n * their latest waiting prompt back for editing; prompts from anyone else,\n * including ones your backend sends with a service key, are never\n * recalled. Omit it and Up keeps its normal behaviour.\n */\n viewerSubjectId?: string | null | undefined;\n /** Presentation/custom controls only; queue and delivery wiring stay owned here. */\n composerProps?: Omit<\n ChatComposerProps,\n \"composer\" | \"effectiveControl\" | \"queuedAheadCount\" | \"attachments\"\n >;\n /** Optional host context and notifications; stock delivery remains authoritative. */\n composerOptions?: UseSessionConversationOptions[\"composerOptions\"];\n /** Extra status panels without replacing stock queue/goal behavior. */\n chromeProps?: Omit<\n SessionChromeProps,\n \"queue\" | \"composer\" | \"goal\" | \"sessionStatus\" | \"readOnly\" | \"onComposerFocus\"\n >;\n /** Localized questions and presentation; responses remain stock. */\n humanInputProps?: Pick<\n HumanInputSurfaceProps,\n \"messages\" | \"autoFocus\" | \"decisionButtons\" | \"allowedSaveTo\" | \"className\"\n >;\n /** Product approval presentation; permission decisions remain stock. */\n approvalProps?: Omit<\n ComponentProps<typeof ApprovalSurface>,\n \"approvals\" | \"onApprove\" | \"onReject\" | \"responding\" | \"error\"\n >;\n };\n\nexport type SessionConversationViewProps = Omit<\n SessionConversationProps,\n | \"sessionId\"\n | \"client\"\n | \"workspaceId\"\n | \"baseUrl\"\n | \"headers\"\n | \"fetch\"\n | \"attachments\"\n | \"modelPicker\"\n | \"composerOptions\"\n | \"pendingPrompt\"\n> & {\n conversation: SessionConversationController;\n};\n\n/**\n * One mount per conversation. A host-created session goes from `null` to its\n * id inside the same conversation; any other change of id is a new one.\n */\nfunction useConversationIdentity(workspaceId: string | undefined, sessionId: string | null) {\n const ref = useRef<{ workspaceId: string | undefined; sessionId: string | null; key: string }>(\n null,\n );\n const previous = ref.current;\n if (\n !previous ||\n previous.workspaceId !== workspaceId ||\n (previous.sessionId !== sessionId && previous.sessionId !== null)\n )\n ref.current = { workspaceId, sessionId, key: `${workspaceId ?? \"\"}:${sessionId ?? \"new\"}` };\n else if (previous.sessionId !== sessionId) ref.current = { ...previous, sessionId };\n return ref.current!.key;\n}\n\n/** Complete existing-session conversation. Uses the provider's normal SDK client\n * (including Site clients), one shared event feed, and authoritative queue state.\n * `<SessionConversation baseUrl=\"/api/opengeni\" sessionId={id} />` needs no\n * provider: it talks to your session proxy and its resolved workspace. */\nexport function SessionConversation({\n baseUrl,\n headers,\n fetch,\n ...props\n}: SessionConversationProps) {\n const resetKey = useConversationIdentity(props.workspaceId, props.sessionId);\n if (baseUrl === undefined)\n return (\n <ConversationRenderBoundary resetKey={resetKey}>\n <RetryingConversation {...props} />\n </ConversationRenderBoundary>\n );\n const { client, workspaceId, ...rest } = props;\n return (\n <ConversationRenderBoundary resetKey={resetKey}>\n <SessionProxyScope\n baseUrl={baseUrl}\n workspaceId={workspaceId}\n client={client}\n headers={headers}\n fetch={fetch}\n >\n <RetryingConversation {...rest} />\n </SessionProxyScope>\n </ConversationRenderBoundary>\n );\n}\n\nfunction RetryingConversation(props: Omit<SessionConversationProps, \"baseUrl\">) {\n // A failed initial load retries by remounting the whole conversation.\n const [attempt, setAttempt] = useState(0);\n const identity = useConversationIdentity(props.workspaceId, props.sessionId);\n return (\n <Conversation\n key={`${identity}:${attempt}`}\n {...props}\n onRetry={() => setAttempt((value) => value + 1)}\n />\n );\n}\n\nfunction Conversation(props: SessionConversationProps & { onRetry: () => void }) {\n const conversation = useSessionConversation(props.sessionId, props);\n return <ConversationView {...props} conversation={conversation} />;\n}\n\n/** Stock view for a controller mounted in a stable host. No second event feed or draft. */\nexport function SessionConversationView(props: SessionConversationViewProps) {\n const identity = useConversationIdentity(\n props.conversation.workspaceId,\n props.conversation.sessionId,\n );\n return (\n <ConversationView key={identity} {...props} onRetry={() => void props.conversation.retry()} />\n );\n}\n\nfunction ConversationView({\n conversation,\n renderMessageText,\n resolveLink,\n onOpenArtifact,\n onOpenSession,\n resolveSessionTitle,\n renderInteractiveBlock,\n toolRegistry,\n timelineProps,\n computerConnection,\n renderAllowanceExhausted,\n allowanceExhaustedLabels,\n voiceInput: voiceInputRequested = true,\n realtimeVoice: realtimeVoiceProp,\n realtimeVoiceProps,\n genieLoading,\n modelPickerProps,\n userMessageDisclosureLabels,\n loadSkillReview,\n className,\n height = \"100%\",\n readAcknowledgement = true,\n onEvent,\n theme,\n surface,\n labels: labelOverrides,\n composerProps,\n viewerSubjectId,\n chromeProps,\n humanInputProps,\n approvalProps,\n onRetry,\n}: SessionConversationViewProps & { onRetry: () => void }) {\n const t = useOpenGeniText();\n const {\n sessionId,\n config,\n showModelPicker,\n catalog,\n feed,\n detail,\n queue,\n human,\n control,\n approvals,\n files,\n uploadsEnabled,\n status,\n terminal,\n importedArchive,\n composer,\n running,\n error,\n loadFailed,\n } = conversation;\n const context = conversation;\n // A dropped event stream (an update or brief outage) reads as \"updating\" in\n // the composer while it reconnects.\n const answerStore = useMemo(() => browserInteractiveAnswerStore(), []);\n const composerView = useComposerWithStreamState(\n composer,\n feed.connectionState,\n feed.initialLoading,\n );\n const builtInQueuedRecall = useQueuedPromptRecall({\n queue,\n composer,\n subjectId: viewerSubjectId,\n enabled: sessionId !== null && !terminal && Boolean(viewerSubjectId),\n });\n // One recall drives both the composer key and the queue row's ↑ hint.\n const queuedRecall = composerProps?.queuedRecall ?? builtInQueuedRecall;\n const formatError = useErrorMessage();\n useLiveSessionEvents(sessionId, feed.events, feed.initialHistoryReady, onEvent);\n const region = useRef<HTMLDivElement>(null);\n const hostTheme = useHostTheme(region, { theme, surface });\n // Read means seen: the timeline itself must be on screen (hosts may hide it\n // while keeping the composer), in a visible, focused page, showing the live\n // end of the conversation rather than an older page of history.\n const foreground = useDocumentForeground();\n const timelineOnScreen = useElementOnScreen(\n () => region.current?.querySelector(\"[data-og-timeline-scroller]\") ?? null,\n loadFailed,\n );\n useSessionReadAcknowledgement({\n client: context.client,\n workspaceId: context.workspaceId,\n sessionId,\n session: detail.session,\n events: feed.events,\n active:\n readAcknowledgement &&\n foreground &&\n timelineOnScreen &&\n feed.initialHistoryReady &&\n !loadFailed &&\n !feed.hasNewer,\n });\n const defaultInteractiveBlock = useDefaultInteractiveBlock(\n context.client,\n context.workspaceId,\n sessionId,\n config.artifacts,\n labelOverrides?.sitePreviewUnavailable ?? DEFAULT_CONVERSATION_LABELS(t).sitePreviewUnavailable,\n );\n const retainedLoaders = useRetainedLoaders(context.client, context.workspaceId, sessionId);\n const transcription = useComposerTranscription(\n context.client,\n context.workspaceId,\n voiceInputRequested && !importedArchive ? config.voiceInput : null,\n typeof voiceInputRequested === \"object\" ? voiceInputRequested : undefined,\n );\n const inheritedLinks = useOpenGeniLinkResolver();\n const defaultLinks = useMemo(\n () =>\n sessionId\n ? sessionLinkResolver(t, {\n client: context.client,\n workspaceId: context.workspaceId,\n sessionId,\n sandboxFiles: config.sandboxFiles,\n })\n : null,\n [context.client, context.workspaceId, sessionId, config.sandboxFiles, t],\n );\n const onOpenArtifactRef = useRef(onOpenArtifact);\n onOpenArtifactRef.current = onOpenArtifact;\n const opensArtifacts = onOpenArtifact !== undefined;\n const viewerLinks = useMemo(\n () =>\n opensArtifacts\n ? viewerLinkResolver({\n workspaceId: context.workspaceId,\n open: (target) => onOpenArtifactRef.current?.(target),\n })\n : null,\n [context.workspaceId, opensArtifacts],\n );\n const links = useMemo(\n () => chainLinkResolvers(resolveLink, viewerLinks, inheritedLinks, defaultLinks) ?? undefined,\n [resolveLink, viewerLinks, inheritedLinks, defaultLinks],\n );\n const labels = { ...DEFAULT_CONVERSATION_LABELS(t), ...labelOverrides };\n // The agent's capability cards get the shared connect card, so a person\n // can connect from the chat with no host code; the agent then continues.\n const showsCapabilityRequest = useMemo(\n () =>\n conversation.timeline.some(\n (item) => item.kind === \"auth-needed\" && isAgentCapabilityRequest(item),\n ),\n [conversation.timeline],\n );\n const connectSupport = useInChatConnectSupport(\n // Custom session clients may not read grants or the catalog; the stock\n // card then stays off.\n context.client as Partial<InChatConnectSource>,\n context.workspaceId,\n showsCapabilityRequest && config.chatConnections && !importedArchive,\n );\n const renderStockAuthNeeded = (item: AuthNeededItem) => {\n if (!sessionId || importedArchive) return undefined;\n const decision = inChatConnectDecision(item, connectSupport, config.chatConnections);\n if (decision.kind === \"unavailable\") return <AuthNeededRow item={item} setupUnavailable />;\n if (decision.kind === \"integration\") {\n return (\n <Suspense fallback={<AuthNeededRow item={item} />}>\n <LazySessionIntegrationCapabilityCard\n client={context.client as unknown as SessionIntegrationCapabilityCardProps[\"client\"]}\n workspaceId={context.workspaceId}\n sessionId={sessionId}\n capabilityId={decision.capabilityId}\n name={decision.name}\n rationale={item.capability?.rationale ?? \"\"}\n returnUrl={typeof window === \"undefined\" ? \"\" : window.location.href}\n />\n </Suspense>\n );\n }\n if (decision.kind !== \"card\") return undefined;\n return (\n <Suspense fallback={<AuthNeededRow item={item} />}>\n <LazySessionMcpCapabilityCard\n client={context.client as unknown as SessionMcpCapabilityCardProps[\"client\"]}\n workspaceId={context.workspaceId}\n sessionId={sessionId}\n capabilityId={decision.item.id}\n name={decision.item.name}\n personalOnly={decision.personalOnly}\n rationale={item.capability?.rationale ?? \"\"}\n // OAuth returns to this exact host page; the card follows the\n // attempt's durable state, so the page needs no return handler.\n returnUrl={typeof window === \"undefined\" ? \"\" : window.location.href}\n />\n </Suspense>\n );\n };\n const retryInPlace = () => void conversation.retry();\n const realtimeVoiceRequested = realtimeVoiceProp ?? config.realtimeVoiceOffered;\n const loadingOptions = useMemo(() => embeddedGenieLoading(t, genieLoading), [genieLoading, t]);\n const providerRecovery = useMemo(\n () =>\n detail.session\n ? currentProviderRecovery(\n {\n id: detail.session.id,\n status,\n activeTurnId: detail.session.activeTurnId,\n effectiveControl:\n queue.effectiveControl ?? detail.session.effectiveControl ?? undefined,\n },\n feed.events,\n )\n : null,\n [detail.session, status, queue.effectiveControl, feed.events],\n );\n const voiceModels = useRealtimeVoiceModels(\n context.client,\n context.workspaceId,\n realtimeVoiceRequested && config.realtimeVoice && !importedArchive,\n );\n const [voiceActive, setVoiceActive] = useState(false);\n const notifyVoiceActive = realtimeVoiceProps?.onVoiceActiveChange;\n const onVoiceActiveChange = useCallback(\n (active: boolean) => {\n setVoiceActive(active);\n notifyVoiceActive?.(active);\n },\n [notifyVoiceActive],\n );\n const voiceControl =\n composer.effectiveControl ?? queue.effectiveControl ?? detail.session?.effectiveControl;\n const voice =\n sessionId && voiceModels.length > 0 && status && !terminal && voiceControl ? (\n <LazyPart onLoadFailure=\"hide\" fallback={null}>\n <LazyEmbeddedRealtimeVoice\n {...realtimeVoiceProps}\n client={\n context.client as unknown as ComponentProps<typeof SessionRealtimeControl>[\"client\"]\n }\n workspaceId={context.workspaceId}\n codexConnected={realtimeVoiceProps?.codexConnected ?? false}\n sessionId={sessionId}\n sessionStatus={status}\n effectiveControl={voiceControl}\n events={feed.events}\n eventsReady={!feed.initialLoading}\n getModelContext={conversation.getModelContext}\n onVoiceActiveChange={onVoiceActiveChange}\n />\n </LazyPart>\n ) : null;\n const view = (\n <SingleSendWording enabled={composer.singleSend === true}>\n <div\n className={cn(\n \"og-root flex min-h-0 min-w-0 flex-col gap-2 overflow-hidden bg-og-bg text-og-base text-og-fg\",\n className,\n )}\n ref={region}\n style={{ ...hostTheme.style, height }}\n data-og-theme={hostTheme.attribute}\n data-og-host-theme=\"\"\n data-og-conversation=\"\"\n >\n {error && !loadFailed ? (\n <div\n role=\"alert\"\n className=\"mx-auto flex w-full max-w-3xl shrink-0 items-center gap-3 rounded-og-md border border-og-status-failed/30 bg-og-status-failed/10 px-3 py-2 text-og-sm text-og-fg\"\n data-og-conversation-error=\"\"\n >\n <span className=\"min-w-0 flex-1\">{formatError(error)}</span>\n <button\n type=\"button\"\n onClick={retryInPlace}\n className=\"shrink-0 rounded-og-sm px-2 py-1 font-medium text-og-fg hover:bg-og-hover\"\n >\n {labels.retry}\n </button>\n </div>\n ) : null}\n {loadFailed ? (\n <div\n role=\"alert\"\n className=\"flex min-h-0 flex-1 flex-col items-center justify-center gap-3 px-6 text-center\"\n data-og-conversation-error=\"\"\n >\n <p className=\"max-w-sm text-og-base text-og-fg-muted\">{formatError(feed.error)}</p>\n <button\n type=\"button\"\n onClick={onRetry}\n className=\"inline-flex min-h-9 items-center rounded-og-md border border-og-border bg-og-surface-1 px-3 py-1.5 text-og-sm font-medium text-og-fg hover:bg-og-surface-2\"\n >\n {labels.tryAgain}\n </button>\n </div>\n ) : (\n <InteractiveAnswerProvider\n send={composer.send}\n scope={sessionId ?? undefined}\n store={answerStore}\n readOnly={Boolean(importedArchive) || terminal || sessionId === null}\n >\n <MessageTimeline\n renderMessageText={renderMessageText}\n resolveLink={links}\n renderInteractiveBlock={\n renderInteractiveBlock === false\n ? undefined\n : (renderInteractiveBlock ?? defaultInteractiveBlock)\n }\n userMessageDisclosureLabels={userMessageDisclosureLabels}\n genieLoading={loadingOptions}\n renderAllowanceExhausted={renderAllowanceExhausted}\n allowanceExhaustedLabels={allowanceExhaustedLabels}\n // Isolated and clipped: floating navigation stays inside the timeline.\n className=\"isolate min-h-0 flex-1 overflow-hidden\"\n {...(toolRegistry ? { toolRegistry } : {})}\n {...retainedLoaders}\n {...(onOpenSession ? { onOpenSession } : {})}\n {...(resolveSessionTitle ? { resolveSessionTitle } : {})}\n events={feed.events}\n items={conversation.timeline}\n turnSummary={timelineProps?.turnSummary ?? { rolling: true }}\n renderAuthNeeded={(item) =>\n timelineProps?.renderAuthNeeded?.(item) ??\n (item.capability?.id === \"api:connected-machine\" && computerConnection ? (\n <ThisComputerCard {...computerConnection} rationale={item.capability.rationale} />\n ) : (\n renderStockAuthNeeded(item)\n ))\n }\n emptyState={timelineProps?.emptyState}\n renderMessageSender={timelineProps?.renderMessageSender}\n status={status}\n hasOlder={feed.hasOlder}\n loadingOlder={feed.loadingOlder}\n onLoadOlder={feed.loadOlder}\n hasNewer={feed.hasNewer}\n loadingNewer={feed.loadingNewer}\n onLoadNewer={feed.loadNewer}\n onJumpToStart={async () => {\n await feed.loadOldest();\n }}\n loadingOldest={feed.loadingOldest}\n onJumpToLatest={feed.jumpToLatest}\n onAnnotate={importedArchive ? undefined : composer.addAnnotation}\n // A narrow embed above a decision card has no room for the pill.\n questionNavMinViewportHeight={320}\n />\n </InteractiveAnswerProvider>\n )}\n {importedArchive ? (\n <p className=\"shrink-0 px-4 py-2 text-center text-sm text-og-fg-muted\" role=\"status\">\n {t(\"sessionConversation.archivedConversationReadOnly\")}\n </p>\n ) : (\n <>\n <div\n // Above the timeline's floating navigation, which may never paint\n // over a decision card.\n className=\"relative z-20 min-h-0 max-h-[40%] shrink-0 overflow-y-auto empty:hidden\"\n data-og-conversation-inputs=\"\"\n >\n {approvals.length > 0 && !terminal ? (\n <ApprovalSurface\n className=\"mx-auto max-w-3xl\"\n {...approvalProps}\n approvals={approvals}\n onApprove={async (approval, answer) => {\n await control.approve(approval.id, undefined, answer);\n }}\n onReject={async (approval) => {\n await control.reject(approval.id);\n }}\n responding={control.responding}\n error={control.error}\n />\n ) : null}\n <ProviderRecoveryNotice\n className=\"mx-auto max-w-3xl px-1\"\n recovery={providerRecovery}\n />\n {/* Links in agent questions resolve like links in its replies. */}\n <OpenGeniLinkProvider resolveLink={links}>\n <HumanInputSurface\n className=\"mx-auto max-w-3xl\"\n autoFocus={false}\n decisionButtons\n {...humanInputProps}\n loadSkillReview={loadSkillReview}\n requests={human.requests}\n onSubmit={async (id, response) => {\n // `respond` reports a failed send as null. Reject so the card\n // keeps what was typed (including a secret) for a retry.\n if (!(await human.respond(id, response))) {\n throw new Error(t(\"sessionConversation.yourAnswerWasnTSent\"));\n }\n }}\n respondingRequestId={human.respondingRequestId}\n error={human.mutationError ? formatError(human.mutationError) : null}\n />\n </OpenGeniLinkProvider>\n <ConversationChrome\n sessionId={sessionId}\n client={context.client}\n workspaceId={context.workspaceId}\n events={feed.events}\n chrome={\n terminal\n ? {\n ...chromeProps,\n queue,\n sessionStatus: status,\n readOnly: true,\n onOpenSession,\n }\n : {\n ...chromeProps,\n queue,\n composer,\n queuedRecall,\n sessionStatus: status,\n onOpenSession,\n onComposerFocus: () =>\n region.current?.querySelector<HTMLTextAreaElement>(\"textarea\")?.focus(),\n }\n }\n />\n </div>\n <div\n className=\"relative z-20 mx-auto w-full max-w-3xl shrink-0\"\n data-og-conversation-composer=\"\"\n >\n <ChatComposer\n runControl=\"stop\"\n running={running}\n {...composerProps}\n {...(transcription && composerProps?.transcription === undefined\n ? { transcription }\n : {})}\n actionsStart={\n voice ? (\n <>\n {composerProps?.actionsStart}\n {voice}\n </>\n ) : (\n composerProps?.actionsStart\n )\n }\n transcriptionSuppressed={composerProps?.transcriptionSuppressed ?? voiceActive}\n composer={composerView}\n attachments={uploadsEnabled ? files : undefined}\n // Nothing can be written (typed, dictated or chosen) into a\n // session the host is still creating.\n disabled={sessionId === null || terminal || composerProps?.disabled}\n controlsStart={\n composerProps?.controlsStart ??\n (showModelPicker && composer.policy && (\n <ModelPolicyPicker\n groupPresentation={modelPickerProps?.groupPresentation}\n messages={modelPickerProps?.messages}\n rows={catalog.rows}\n model={composer.policy.model}\n effort={composer.policy.reasoningEffort}\n latencyMode={composer.policy.latencyMode}\n loading={catalog.loading}\n error={catalog.error?.message}\n disabled={sessionId === null || terminal}\n sessionKey={sessionId ?? undefined}\n onOpenChange={(open) => {\n if (open) void catalog.refresh();\n }}\n onModelChange={(model) => composer.setModel?.(model)}\n onEffortChange={(effort) => composer.setReasoningEffort?.(effort)}\n onLatencyModeChange={(mode) => composer.setLatencyMode?.(mode)}\n />\n ))\n }\n responsiveBasis={composerProps?.responsiveBasis ?? \"container\"}\n effectiveControl={\n composer.effectiveControl ??\n queue.effectiveControl ??\n detail.session?.effectiveControl\n }\n queuedAheadCount={queue.queue.length}\n queuedRecall={queuedRecall}\n />\n </div>\n </>\n )}\n </div>\n </SingleSendWording>\n );\n // A payment page opened in this chat confirms its credits here, in the app\n // and in an embed (through its session proxy) alike.\n return <ClientPaymentPageActivity client={context.client}>{view}</ClientPaymentPageActivity>;\n}\n\n/** Neutral embedded defaults under the host's overrides; an empty phrase list keeps them. */\nfunction embeddedGenieLoading(\n t: OpenGeniText,\n options: GenieLoadingOptions | undefined,\n): GenieLoadingOptions {\n if (!options) return EMBEDDED_GENIE_LOADING(t);\n return {\n ...EMBEDDED_GENIE_LOADING(t),\n ...options,\n phrases: options.phrases?.length ? options.phrases : EMBEDDED_GENIE_LOADING(t).phrases,\n messages: { ...EMBEDDED_GENIE_LOADING(t).messages, ...options.messages },\n };\n}\n\ntype ConversationChromeProps = {\n sessionId: string | null;\n client: unknown;\n workspaceId: string;\n events: UseGoalOptions[\"events\"];\n chrome: Omit<ComponentProps<typeof SessionChrome>, \"goal\">;\n};\n\n/** Session chrome with the goal pill and its Pause/Resume/Clear when the client can reach goals. */\nfunction ConversationChrome(props: ConversationChromeProps) {\n const goals = props.client as Partial<Record<\"getGoal\" | \"updateGoal\" | \"deleteGoal\", unknown>>;\n const canReachGoals =\n typeof goals.getGoal === \"function\" &&\n typeof goals.updateGoal === \"function\" &&\n typeof goals.deleteGoal === \"function\";\n return canReachGoals && props.sessionId ? (\n <GoalChrome {...props} sessionId={props.sessionId} />\n ) : (\n <SessionChrome {...props.chrome} />\n );\n}\n\nfunction GoalChrome({\n sessionId,\n client,\n workspaceId,\n events,\n chrome,\n}: ConversationChromeProps & { sessionId: string }) {\n const goal = useGoal(sessionId, {\n client: client as UseGoalOptions[\"client\"],\n workspaceId,\n events,\n });\n return <SessionChrome {...chrome} goal={goal} />;\n}\nconst LazyEmbeddedRealtimeVoice = lazy(() => import(\"../realtime/embedded-voice\"));\n\nconst LazySessionIntegrationCapabilityCard = lazy(() =>\n import(\"./session-connect-cards\").then((module) => ({\n default: module.SessionIntegrationCapabilityCard,\n })),\n);\n\nconst LazySessionMcpCapabilityCard = lazy(() =>\n import(\"./session-connect-cards\").then((module) => ({\n default: module.SessionMcpCapabilityCard,\n })),\n);\n\nconst LazyChatInteractiveBlock = lazy(() =>\n import(\"./artifacts/chat-interactive-block\").then((module) => ({\n default: module.ChatInteractiveBlock,\n })),\n);\n\n/** This client with the conversation's session scope header, when it can add headers. */\nfunction sessionScoped<T>(client: T, sessionId: string | null): T {\n const candidate = client as { withHeaders?: (headers: Readonly<Record<string, string>>) => T };\n // Nothing in a conversation whose session is still being created can read.\n return sessionId && typeof candidate.withHeaders === \"function\"\n ? candidate.withHeaders({ [SESSION_SCOPE_HEADER]: sessionId })\n : client;\n}\n\n/** Inline Site/HTML preview reading through this conversation's session scope. */\nfunction useDefaultInteractiveBlock(\n client: unknown,\n workspaceId: string,\n sessionId: string | null,\n sitesAvailable: boolean,\n sitePreviewUnavailable: string,\n): NonNullable<MessageTimelineProps[\"renderInteractiveBlock\"]> {\n const t = useOpenGeniText();\n // Scope lazily: only a rendered preview reads, and some clients (a Site's\n // own client) cannot add headers.\n const scoped = useMemo((): SiteSnapshotClient => {\n let resolved: SiteSnapshotClient | null = null;\n const get = () => (resolved ??= sessionScoped(client as SiteSnapshotClient, sessionId));\n return {\n getWorkspaceArtifact: (...args) => get().getWorkspaceArtifact(...args),\n getWorkspaceArtifactHtml: (...args) => get().getWorkspaceArtifactHtml(...args),\n getWorkspaceArtifactContent: (...args) => {\n const target = get();\n if (!target.getWorkspaceArtifactContent) throw new Error(\"Site version unavailable\");\n return target.getWorkspaceArtifactContent(...args);\n },\n };\n }, [client, sessionId]);\n return useCallback(\n (block) =>\n block.kind === \"site\" && !sitesAvailable ? (\n // The proxy does not serve Sites: say so instead of offering a load\n // that can only fail.\n <div\n className=\"rounded-og-md border border-og-border bg-og-surface-1 px-3 py-2 text-og-sm text-og-fg-muted\"\n data-og-site-preview-unavailable=\"\"\n >\n {sitePreviewUnavailable}\n </div>\n ) : (\n <Suspense fallback={<span role=\"status\">{t(\"sessionConversation.loadingPreview\")}</span>}>\n <LazyChatInteractiveBlock workspaceId={workspaceId} client={scoped} {...block} />\n </Suspense>\n ),\n [scoped, workspaceId, sitesAvailable, sitePreviewUnavailable, t],\n );\n}\n\ntype RetainedLoaderClient = Partial<\n Pick<\n OpenGeniClient,\n | \"createRetainedArtifactDownloadUrl\"\n | \"downloadRetainedArtifact\"\n | \"downloadRetainedScreenshot\"\n | \"createVideoArtifactPlaybackSource\"\n >\n>;\n\n/**\n * Generated images, published files, screenshots and generated video, read\n * through this conversation's session scope (`x-opengeni-session-id`, which\n * a session proxy's `authorizeSession` checks). Clients without the SDK reads\n * get none.\n */\nfunction useRetainedLoaders(\n client: unknown,\n workspaceId: string,\n sessionId: string | null,\n): Pick<\n MessageTimelineProps,\n \"loadRetainedArtifact\" | \"loadRetainedScreenshot\" | \"loadVideoArtifactPlayback\"\n> {\n return useMemo(() => {\n const base = client as RetainedLoaderClient;\n // Scope lazily: only a rendered receipt reads.\n let scoped: RetainedLoaderClient | null = null;\n const get = () => (scoped ??= sessionScoped(base, sessionId));\n return {\n ...(typeof base.downloadRetainedArtifact === \"function\" &&\n typeof base.createRetainedArtifactDownloadUrl === \"function\"\n ? {\n loadRetainedArtifact: (artifact, signal, options) =>\n createWorkspaceRetainedArtifactLoader(\n get() as Required<RetainedLoaderClient>,\n workspaceId,\n )(artifact, signal, options),\n }\n : {}),\n ...(sessionId && typeof base.downloadRetainedScreenshot === \"function\"\n ? {\n loadRetainedScreenshot: (artifact, signal) =>\n createSessionRetainedScreenshotLoader(\n get() as Required<RetainedLoaderClient>,\n workspaceId,\n sessionId,\n )(artifact, signal),\n }\n : {}),\n ...(typeof base.createVideoArtifactPlaybackSource === \"function\"\n ? {\n loadVideoArtifactPlayback: (artifactId, signal) =>\n createWorkspaceRetainedVideoLoader(\n get() as Required<RetainedLoaderClient>,\n workspaceId,\n )(artifactId, signal),\n }\n : {}),\n } satisfies Pick<\n MessageTimelineProps,\n \"loadRetainedArtifact\" | \"loadRetainedScreenshot\" | \"loadVideoArtifactPlayback\"\n >;\n }, [client, workspaceId, sessionId]);\n}\n\n/**\n * The composer microphone: shown when the deployment can transcribe, enabled\n * once the workspace's voice-input setting allows it.\n */\nexport function useComposerTranscription(\n client: unknown,\n workspaceId: string,\n capability: ClientVoiceInputConfig | null,\n options?: ComposerVoiceInputOptions,\n): ComposerTranscriptionControlProps | null {\n const [workspaceEnabled, setWorkspaceEnabled] = useState<{\n key: string;\n enabled: boolean;\n } | null>(null);\n const reader = client as Partial<Pick<OpenGeniClient, \"getWorkspace\" | \"transcribeAudio\">>;\n const supported = capability !== null && typeof reader.transcribeAudio === \"function\";\n useEffect(() => {\n if (!supported) return;\n let live = true;\n const key = workspaceId;\n if (typeof reader.getWorkspace !== \"function\") {\n setWorkspaceEnabled({ key, enabled: true });\n return;\n }\n reader.getWorkspace(workspaceId).then(\n (workspace) => {\n if (live) {\n setWorkspaceEnabled({\n key,\n enabled: resolveWorkspaceVoiceInputEnabled(workspace.settings) ?? true,\n });\n }\n },\n // The transcription request still enforces the setting.\n () => live && setWorkspaceEnabled({ key, enabled: true }),\n );\n return () => {\n live = false;\n };\n }, [reader, workspaceId, supported]);\n const language = options?.language;\n const beforeStart = options?.beforeStart;\n return useMemo(\n () =>\n supported\n ? {\n client: reader as Pick<OpenGeniClient, \"transcribeAudio\"> &\n Partial<Pick<OpenGeniClient, \"requestJson\">>,\n workspaceId,\n capability,\n workspaceEnabled:\n workspaceEnabled?.key === workspaceId ? workspaceEnabled.enabled : false,\n ...(language !== undefined ? { language } : {}),\n ...(beforeStart ? { beforeStart } : {}),\n }\n : null,\n [supported, reader, workspaceId, capability, workspaceEnabled, language, beforeStart],\n );\n}\n\nexport { useClientConfigFlags } from \"../hooks/use-client-config-flags\";\n","import { useEffect, useRef, useState } from \"react\";\n\nfunction documentForeground(): boolean {\n if (typeof document === \"undefined\") return false;\n return document.visibilityState === \"visible\" && document.hasFocus();\n}\n\n/**\n * True while this page is visible and its window has focus. A page left open\n * in a background tab, behind another window, or (in an iframe) while focus is\n * elsewhere is not in the foreground.\n */\nexport function useDocumentForeground(): boolean {\n const [foreground, setForeground] = useState(documentForeground);\n useEffect(() => {\n const update = () => setForeground(documentForeground());\n update();\n document.addEventListener(\"visibilitychange\", update);\n window.addEventListener(\"focus\", update);\n window.addEventListener(\"blur\", update);\n window.addEventListener(\"pageshow\", update);\n window.addEventListener(\"pagehide\", update);\n return () => {\n document.removeEventListener(\"visibilitychange\", update);\n window.removeEventListener(\"focus\", update);\n window.removeEventListener(\"blur\", update);\n window.removeEventListener(\"pageshow\", update);\n window.removeEventListener(\"pagehide\", update);\n };\n }, []);\n return foreground;\n}\n\n/**\n * True while the resolved element is rendered and intersects the viewport. An\n * element that a host hides (`display: none`, a collapsed panel, a closed\n * drawer moved off screen) or that is not rendered at all is not on screen.\n * `resolve` runs again whenever `refreshKey` changes (for example when the\n * element may have been replaced).\n */\nexport function useElementOnScreen(resolve: () => Element | null, refreshKey: unknown): boolean {\n const [onScreen, setOnScreen] = useState(false);\n const resolveRef = useRef(resolve);\n resolveRef.current = resolve;\n useEffect(() => {\n const element = resolveRef.current();\n if (!element) {\n setOnScreen(false);\n return;\n }\n if (typeof IntersectionObserver === \"undefined\") {\n // No observer (old engines, some test DOMs): a rendered element counts.\n setOnScreen(element.getClientRects().length > 0);\n return;\n }\n const observer = new IntersectionObserver((entries) => {\n const latest = entries[entries.length - 1];\n if (latest) setOnScreen(latest.isIntersecting);\n });\n observer.observe(element);\n return () => {\n observer.disconnect();\n setOnScreen(false);\n };\n }, [refreshKey]);\n return onScreen;\n}\n","import { useEffect, useState } from \"react\";\nimport type { RealtimeControllerClient, RealtimeModelOption } from \"../realtime/session-realtime\";\n\n/**\n * Voice models this user can start in the workspace, or an empty list while\n * disabled, unsupported or unknown. Shares the stock voice control's catalog\n * cache, without eagerly loading voice code for a text-only embed.\n */\nexport function useRealtimeVoiceModels(\n client: unknown,\n workspaceId: string,\n enabled: boolean,\n): RealtimeModelOption[] {\n const [snapshot, setSnapshot] = useState<{\n client: unknown;\n workspaceId: string;\n models: RealtimeModelOption[];\n } | null>(null);\n useEffect(() => {\n if (!enabled || !workspaceId) return;\n const controller = new AbortController();\n void import(\"../realtime/session-realtime\")\n .then(async ({ loadRealtimeModelCatalog }) => {\n const models = await loadRealtimeModelCatalog(\n client as RealtimeControllerClient,\n workspaceId,\n controller.signal,\n );\n if (!controller.signal.aborted) {\n setSnapshot({\n client,\n workspaceId,\n models: models?.filter((model) => model.available) ?? [],\n });\n }\n })\n .catch(() => undefined);\n return () => controller.abort();\n }, [client, workspaceId, enabled]);\n return enabled &&\n snapshot !== null &&\n snapshot.client === client &&\n snapshot.workspaceId === workspaceId\n ? snapshot.models\n : [];\n}\n","import {\n formatErrorMessage,\n OpenGeniApiError,\n OpenGeniBrowserClient,\n type FetchLike,\n} from \"@opengeni/sdk/browser\";\nimport { useEffect, useMemo, useRef, useState, type ReactNode } from \"react\";\nimport type { SessionClientLike } from \"../client\";\nimport { OpenGeniProvider } from \"../provider\";\nimport { useOpenGeniText, type OpenGeniText } from \"../messages/runtime\";\nimport { joinClientConfigRead } from \"../lib/client-config-read\";\n\n/** Request headers for every proxy call: static, or computed per request. */\nexport type SessionProxyHeaders = Record<string, string> | (() => Record<string, string>);\n\nexport type SessionProxyBaseUrl = {\n /**\n * Mount path of your `createSessionProxyHandler` (for example\n * `\"/api/opengeni\"`). The component then needs no `OpenGeniProvider`,\n * client, or workspace id: it creates the browser client for that path and\n * uses the workspace the proxy resolved for the signed-in user. An explicit\n * `workspaceId` skips that lookup. A `client` you pass is used instead of\n * the created one (point it at the same proxy).\n */\n baseUrl?: string | undefined;\n /**\n * `baseUrl` mode: headers added to every proxy request, for hosts that\n * authenticate with a bearer token instead of cookies. A function is called\n * per request, so it can return the current token.\n */\n headers?: SessionProxyHeaders | undefined;\n /** `baseUrl` mode: custom fetch for every proxy request (async auth, retries). */\n fetch?: FetchLike | undefined;\n};\n\n/**\n * End-user copy for a failed first load. The proxy calls Opengeni with the\n * server's key, so Opengeni's own `unauthenticated` refusal means that key was\n * rejected (the server logs what to fix), not that this person must sign in.\n * A host's own 401 from `resolve` carries no Opengeni code and still reads as\n * \"Sign in to continue.\"\n */\nfunction proxyLoadErrorMessage(t: OpenGeniText, error: unknown): string {\n if (\n error instanceof OpenGeniApiError &&\n error.status === 401 &&\n error.code === \"unauthenticated\"\n ) {\n const message = t(\"sessionProxyScope.chatIsUnavailableRightNow\");\n return error.correlationId\n ? t(\"sessionProxyScope.messageReferenceCorrelationid\", {\n message,\n correlationId: error.correlationId,\n })\n : message;\n }\n return formatErrorMessage(error, t(\"sessionProxyScope.couldNotLoadTheConversation\"));\n}\n\ntype ScopeState =\n | { status: \"loading\" }\n | { status: \"ready\"; workspaceId: string }\n | { status: \"error\"; message: string };\n\n/**\n * `OpenGeniProvider` for a same-origin session proxy, from its base URL alone.\n * The proxy's client config names the resolved workspace, so the browser\n * never handles an Opengeni id. Provider-based usage is unchanged.\n */\nexport function SessionProxyScope({\n baseUrl,\n workspaceId,\n client: suppliedClient,\n headers,\n fetch,\n children,\n}: Omit<SessionProxyBaseUrl, \"baseUrl\"> & {\n baseUrl: string;\n workspaceId?: string | undefined;\n client?: SessionClientLike | undefined;\n children: ReactNode;\n}) {\n const t = useOpenGeniText();\n if (suppliedClient && (headers !== undefined || fetch !== undefined)) {\n throw new TypeError(\n \"@opengeni/react: pass headers/fetch either to your own client or as props, not both.\",\n );\n }\n // Latest values without recreating the client (inline props change identity).\n const headersRef = useRef(headers);\n headersRef.current = headers;\n const fetchRef = useRef(fetch);\n fetchRef.current = fetch;\n const hasFetch = fetch !== undefined;\n // Version skew between this bundle and the server SDK is tolerated, as for\n // any embedded host: the proxy reports its own contract revision.\n const ownClient = useMemo(\n () =>\n new OpenGeniBrowserClient({\n baseUrl,\n apiContract: \"compatible\",\n headers: () => {\n const current = headersRef.current;\n return typeof current === \"function\" ? current() : (current ?? {});\n },\n ...(hasFetch\n ? { fetch: (input, init) => (fetchRef.current ?? globalThis.fetch)(input, init) }\n : {}),\n }),\n [baseUrl, hasFetch],\n );\n const client: SessionClientLike = suppliedClient ?? ownClient;\n const [state, setState] = useState<ScopeState>(\n workspaceId ? { status: \"ready\", workspaceId } : { status: \"loading\" },\n );\n useEffect(() => {\n if (workspaceId) {\n setState({ status: \"ready\", workspaceId });\n return;\n }\n let active = true;\n setState({ status: \"loading\" });\n joinClientConfigRead(client).then(\n (config) => {\n if (!active) return;\n setState(\n config.workspaceId\n ? { status: \"ready\", workspaceId: config.workspaceId }\n : {\n status: \"error\",\n message: t(\"sessionProxyScope.thisServerDoesNotReport\"),\n },\n );\n },\n (error: unknown) => {\n if (!active) return;\n setState({ status: \"error\", message: proxyLoadErrorMessage(t, error) });\n },\n );\n return () => {\n active = false;\n };\n }, [client, workspaceId, t]);\n\n if (state.status === \"error\") {\n return (\n <div role=\"alert\" className=\"og-root p-3 text-og-sm text-og-danger\" data-og-proxy-error=\"\">\n {state.message}\n </div>\n );\n }\n if (state.status === \"loading\") {\n return <div className=\"og-root\" aria-busy=\"true\" data-og-proxy-loading=\"\" />;\n }\n return (\n <OpenGeniProvider client={client} workspaceId={state.workspaceId}>\n {children}\n </OpenGeniProvider>\n );\n}\n","import { OpenGeniApiError } from \"@opengeni/sdk\";\nimport { lazy, useRef, type ComponentProps, type FormEvent, type ReactNode } from \"react\";\nimport {\n useNewConversation,\n type NewConversationController,\n type UseNewConversationOptions,\n} from \"../hooks/use-new-conversation\";\nimport { useRealtimeVoiceModels } from \"../hooks/use-realtime-voice-models\";\nimport { useErrorMessage } from \"../lib/error-message\";\nimport { useHostTheme } from \"../lib/host-theme\";\nimport { cn } from \"../lib/cn\";\nimport type { NewSessionRealtimeControl } from \"../realtime/realtime-control\";\nimport { ChatComposer } from \"./chat-composer\";\nimport type { ComposerVoiceInputOptions } from \"./composer-transcription-control\";\nimport { ModelPolicyPicker } from \"./model-policy-picker\";\nimport { useComposerTranscription, type SessionConversationProps } from \"./session-conversation\";\nimport { SessionProxyScope, type SessionProxyBaseUrl } from \"./session-proxy-scope\";\nimport { ConversationRenderBoundary } from \"./conversation-render-boundary\";\nimport { LazyPart } from \"./lazy-part\";\nimport { useOpenGeniText, type OpenGeniText } from \"../messages/runtime\";\n\nconst LazyNewVoice = lazy(() => import(\"../realtime/embedded-new-voice\"));\n\nexport type NewConversationLabels = {\n title: string;\n placeholder: string;\n send: string;\n unavailable: string;\n retry: string;\n pending: string;\n finishingUploads: string;\n};\nconst DEFAULT_LABELS = (t: OpenGeniText): NewConversationLabels => ({\n title: t(\"newConversation.howCanIHelp\"),\n placeholder: t(\"newConversation.askAnything\"),\n send: t(\"newConversation.send\"),\n unavailable: t(\"newConversation.newChatsAreNotEnabled\"),\n retry: t(\"newConversation.retry\"),\n pending: t(\"newConversation.creationIsNotConfirmedRetry\"),\n finishingUploads: t(\"newConversation.chatCreatedFinishOrRemove\"),\n});\ntype Presentation = {\n composerProps?: SessionConversationProps[\"composerProps\"] | undefined;\n modelPickerProps?: SessionConversationProps[\"modelPickerProps\"] | undefined;\n /** The composer microphone: false hides it; options set its language or a check before it starts. */\n voiceInput?: boolean | ComposerVoiceInputOptions | undefined;\n realtimeVoiceProps?: SessionConversationProps[\"realtimeVoiceProps\"] | undefined;\n labels?: Partial<NewConversationLabels> | undefined;\n theme?: SessionConversationProps[\"theme\"] | undefined;\n surface?: SessionConversationProps[\"surface\"] | undefined;\n height?: SessionConversationProps[\"height\"] | undefined;\n className?: string | undefined;\n};\n\nexport type NewConversationProps = UseNewConversationOptions & SessionProxyBaseUrl & Presentation;\nexport type NewConversationViewProps = Presentation & { creation: NewConversationController };\n\n/** Standalone stock new-chat composer. OpenGeniChat uses this same implementation. */\nexport function NewConversation({ baseUrl, headers, fetch, ...props }: NewConversationProps) {\n const resetKey = props.workspaceId ?? \"\";\n if (baseUrl === undefined)\n return (\n <ConversationRenderBoundary resetKey={resetKey}>\n <NewConversationRuntime {...props} />\n </ConversationRenderBoundary>\n );\n const { client, workspaceId, ...rest } = props;\n return (\n <ConversationRenderBoundary resetKey={resetKey}>\n <SessionProxyScope\n baseUrl={baseUrl}\n headers={headers}\n fetch={fetch}\n client={client}\n workspaceId={workspaceId}\n >\n <NewConversationRuntime {...rest} />\n </SessionProxyScope>\n </ConversationRenderBoundary>\n );\n}\nfunction NewConversationRuntime(props: NewConversationProps) {\n const creation = useNewConversation(props);\n return <NewConversationView {...props} creation={creation} />;\n}\n\n/** Presentation for a new-chat controller kept above host layout changes. */\nexport function NewConversationView({\n creation,\n labels: overrides,\n composerProps,\n modelPickerProps,\n voiceInput = true,\n realtimeVoiceProps,\n theme,\n surface,\n height = \"100%\",\n className,\n}: NewConversationViewProps) {\n const t = useOpenGeniText();\n const labels = { ...DEFAULT_LABELS(t), ...overrides };\n const { composer, config, catalog, files, uploadsEnabled, available } = creation;\n const root = useRef<HTMLFormElement>(null);\n const hostTheme = useHostTheme(root, { theme, surface });\n const transcription = useComposerTranscription(\n creation.client,\n creation.workspaceId,\n voiceInput && available ? config.voiceInput : null,\n typeof voiceInput === \"object\" ? voiceInput : undefined,\n );\n const voice = useNewConversationVoice(creation, realtimeVoiceProps);\n return (\n <form\n onSubmit={(event: FormEvent) => {\n event.preventDefault();\n void composer.send();\n }}\n ref={root}\n className={cn(\n \"og-root mx-auto box-border flex w-full max-w-3xl flex-col gap-4 bg-og-bg p-3 text-og-base text-og-fg\",\n className,\n )}\n style={{ ...hostTheme.style, height }}\n data-og-theme={hostTheme.attribute}\n data-og-host-theme=\"\"\n data-og-new-chat-composer=\"\"\n >\n <div aria-hidden className=\"min-h-0 flex-[2]\" />\n {labels.title ? (\n <p className=\"text-center text-og-md font-medium text-og-fg\">{labels.title}</p>\n ) : null}\n <ChatComposer\n {...composerProps}\n {...(transcription && composerProps?.transcription === undefined ? { transcription } : {})}\n composer={composer}\n attachments={uploadsEnabled ? files : undefined}\n disabled={!available || composerProps?.disabled}\n runControl=\"none\"\n running={false}\n placeholder={overrides?.placeholder ?? composerProps?.placeholder ?? labels.placeholder}\n inputProps={{ \"aria-label\": labels.placeholder, ...composerProps?.inputProps }}\n messages={{ sendMessageAriaLabel: labels.send, ...composerProps?.messages }}\n actionsStart={\n voice ? (\n <>\n {composerProps?.actionsStart}\n {voice}\n </>\n ) : (\n composerProps?.actionsStart\n )\n }\n controlsStart={\n composerProps?.controlsStart ??\n (composer.policy ? (\n <ModelPolicyPicker\n groupPresentation={modelPickerProps?.groupPresentation}\n messages={modelPickerProps?.messages}\n rows={catalog.rows}\n model={composer.policy.model}\n effort={composer.policy.reasoningEffort}\n latencyMode={composer.policy.latencyMode}\n loading={catalog.loading}\n error={catalog.error?.message}\n disabled={composer.sending}\n menuSide=\"bottom\"\n onOpenChange={(open) => {\n if (open) void catalog.refresh();\n }}\n onModelChange={composer.setModel!}\n onEffortChange={composer.setReasoningEffort!}\n onLatencyModeChange={composer.setLatencyMode!}\n />\n ) : undefined)\n }\n responsiveBasis={composerProps?.responsiveBasis ?? \"container\"}\n />\n <NewConversationStatus creation={creation} labels={labels} />\n <div aria-hidden className=\"min-h-0 flex-[3]\" />\n </form>\n );\n}\n\n/**\n * The voice-first start for a new chat, or null when the workspace offers no\n * voice model. Shared by the stock view and the console's own layouts.\n */\nexport function useNewConversationVoice(\n creation: NewConversationController,\n realtimeVoiceProps?: SessionConversationProps[\"realtimeVoiceProps\"] | undefined,\n): ReactNode {\n const models = useRealtimeVoiceModels(\n creation.client,\n creation.workspaceId,\n creation.realtimeVoiceEnabled && creation.available,\n );\n if (!models.length) return null;\n return (\n <LazyPart onLoadFailure=\"hide\" fallback={null}>\n <LazyNewVoice\n client={\n creation.client as unknown as ComponentProps<typeof NewSessionRealtimeControl>[\"client\"]\n }\n workspaceId={creation.workspaceId}\n codexConnected={realtimeVoiceProps?.codexConnected ?? false}\n modelMenu={realtimeVoiceProps?.modelMenu}\n disabled={\n creation.composer.sending ||\n creation.pending !== null ||\n creation.finishingUploads ||\n creation.files.hasUnresolved\n }\n onStart={creation.startRealtime}\n />\n </LazyPart>\n );\n}\n\n/**\n * What stands between a new chat and its creation: unavailable, a failed or\n * unconfirmed create (with Retry), or uploads still finishing.\n */\nexport function NewConversationStatus({\n creation,\n labels: overrides,\n}: {\n creation: NewConversationController;\n labels?: Partial<NewConversationLabels> | undefined;\n}) {\n const t = useOpenGeniText();\n const labels = { ...DEFAULT_LABELS(t), ...overrides };\n const formatError = useErrorMessage();\n const { available, error, pending, composer } = creation;\n return (\n <>\n {!available ? (\n <p className=\"text-center text-og-sm text-og-fg-muted\" data-og-new-chat-unavailable=\"\">\n {labels.unavailable}\n </p>\n ) : error ? (\n <p role=\"alert\" className=\"text-center text-og-sm text-og-status-failed\">\n {formatError(\n error.cause,\n error.cause instanceof OpenGeniApiError && error.cause.code === \"route_not_allowed\"\n ? labels.unavailable\n : undefined,\n )}\n </p>\n ) : null}\n {pending ? (\n <div className=\"text-center text-og-sm text-og-fg-muted\">\n <p role=\"status\">{labels.pending}</p>\n <button\n type=\"button\"\n disabled={composer.sending}\n onClick={() => {\n void creation.retry();\n }}\n className=\"mt-2 rounded-og-sm border border-og-border px-3 py-1.5 text-og-fg hover:bg-og-hover disabled:opacity-50\"\n >\n {labels.retry}\n </button>\n </div>\n ) : null}\n {creation.finishingUploads ? (\n <p role=\"status\" className=\"text-center text-og-sm text-og-fg-muted\">\n {labels.finishingUploads}\n </p>\n ) : null}\n </>\n );\n}\n"],"mappings":"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","names":["jsx","jsx","useId","useMemo","useState","jsx","jsxs","useId","useState","useMemo","useEffect","useMemo","useRef","useState","jsx","jsxs","useState","useRef","useEffect","review","useMemo","CheckIcon","MessageCircleQuestionIcon","Fragment","useCallback","useEffect","useId","useMemo","useRef","useState","TriangleAlertIcon","useCallback","useEffect","useRef","useState","jsx","jsxs","useRef","useState","useCallback","useEffect","TriangleAlertIcon","Fragment","jsx","jsxs","jsx","useState","useId","useRef","useMemo","useEffect","useCallback","jsxs","Fragment","MessageCircleQuestionIcon","CheckIcon","useEffect","useMemo","useRef","jsx","useRef","useMemo","useEffect","useState","jsx","jsxs","useState","useEffect","useRef","useEffect","useState","jsx","useState","useEffect","AnimatePresence","motion","useReducedMotion","useEffect","useState","jsx","jsxs","useReducedMotion","useState","useEffect","AnimatePresence","motion","useEffect","useRef","useState","jsx","jsxs","useState","useEffect","useRef","dequal","ArrowDownIcon","ArrowUpIcon","BotIcon","CheckIcon","ChevronDownIcon","ChevronRightIcon","CornerDownRightIcon","PauseIcon","MessageCircleQuestionIcon","PlayIcon","TargetIcon","Trash2Icon","TriangleAlertIcon","AnimatePresence","motion","useReducedMotion","Component","Fragment","createContext","useCallback","useContext","useEffect","useId","useLayoutEffect","useMemo","useRef","useState","Component","useCallback","useMemo","useRef","useState","useRef","useState","useMemo","useCallback","useMemo","Fragment","jsx","jsxs","useMemo","GaugeIcon","jsx","jsxs","GaugeIcon","Fragment","jsx","jsxs","createContext","receipt","key","useMemo","useRef","useState","useEffect","useCallback","useLayoutEffect","attempt","AnimatePresence","motion","ArrowUpIcon","node","ArrowDownIcon","dequal","TriangleAlertIcon","Component","TimelineGroupEntry","useReducedMotion","TimelineGroupView","useContext","useId","ChevronDownIcon","MessageCircleQuestionIcon","BotIcon","TargetIcon","CheckIcon","PauseIcon","PlayIcon","Trash2Icon","ChevronRightIcon","CornerDownRightIcon","lazy","Suspense","useCallback","useEffect","useMemo","useRef","useState","useEffect","useRef","useState","useEffect","useState","OpenGeniApiError","useEffect","useMemo","useRef","useState","jsx","OpenGeniApiError","useRef","useMemo","useState","useEffect","Fragment","jsx","jsxs","useRef","useState","useMemo","Suspense","useCallback","lazy","useEffect","OpenGeniApiError","lazy","useRef","Fragment","jsx","jsxs","lazy","useRef","OpenGeniApiError"]}
|