@opengeni/react 3.1.0 → 3.1.3-canary.38890816741001
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/README.md +769 -22
- package/dist/accounts.js +89 -11
- package/dist/accounts.js.map +1 -1
- package/dist/approvals.d.ts +2 -1
- package/dist/artifacts-document.js +5 -3
- package/dist/artifacts-presentation.js +5 -3
- package/dist/artifacts-spreadsheet.d.ts +1 -1
- package/dist/artifacts-spreadsheet.js +5 -3
- package/dist/artifacts.d.ts +5 -1
- package/dist/artifacts.js +536 -42
- package/dist/artifacts.js.map +1 -1
- package/dist/browser-viewer-ZWR6MWJ7.js +19 -0
- package/dist/capability-catalog-row.d.ts +20 -0
- package/dist/capability-logo-fallback.d.ts +3 -0
- package/dist/chat-interactive-block-BO2IWXVK.js +14 -0
- package/dist/chunk-2DDJ6YH6.js +41 -0
- package/dist/chunk-2DDJ6YH6.js.map +1 -0
- package/dist/chunk-2HVLQ26H.js +183 -0
- package/dist/chunk-2HVLQ26H.js.map +1 -0
- package/dist/{chunk-RGALCTWO.js → chunk-2I6R3GCZ.js} +4285 -3980
- package/dist/chunk-2I6R3GCZ.js.map +1 -0
- package/dist/{chunk-D3UIAJKY.js → chunk-2SFFYIH3.js} +1179 -166
- package/dist/chunk-2SFFYIH3.js.map +1 -0
- package/dist/chunk-3PVDYTTB.js +24 -0
- package/dist/chunk-3PVDYTTB.js.map +1 -0
- package/dist/chunk-3UZCWK46.js +298 -0
- package/dist/chunk-3UZCWK46.js.map +1 -0
- package/dist/chunk-47CKUXTW.js +293 -0
- package/dist/chunk-47CKUXTW.js.map +1 -0
- package/dist/chunk-4QYP6QUI.js +109 -0
- package/dist/chunk-4QYP6QUI.js.map +1 -0
- package/dist/chunk-5EY26VZ7.js +1053 -0
- package/dist/chunk-5EY26VZ7.js.map +1 -0
- package/dist/chunk-5I4VRWBB.js +56 -0
- package/dist/chunk-5I4VRWBB.js.map +1 -0
- package/dist/chunk-5WOR7UCL.js +191 -0
- package/dist/chunk-5WOR7UCL.js.map +1 -0
- package/dist/chunk-5YJLGOM5.js +51 -0
- package/dist/chunk-5YJLGOM5.js.map +1 -0
- package/dist/chunk-6JFN3OWG.js +386 -0
- package/dist/chunk-6JFN3OWG.js.map +1 -0
- package/dist/chunk-7QJT5O4S.js +35 -0
- package/dist/chunk-7QJT5O4S.js.map +1 -0
- package/dist/chunk-A55KV72M.js +402 -0
- package/dist/chunk-A55KV72M.js.map +1 -0
- package/dist/chunk-ADWCLI4G.js +2028 -0
- package/dist/chunk-ADWCLI4G.js.map +1 -0
- package/dist/chunk-B27E3V37.js +29 -0
- package/dist/chunk-B27E3V37.js.map +1 -0
- package/dist/chunk-B7TC2A33.js +83 -0
- package/dist/chunk-B7TC2A33.js.map +1 -0
- package/dist/chunk-BLL56F7R.js +385 -0
- package/dist/chunk-BLL56F7R.js.map +1 -0
- package/dist/chunk-BOFEQC6K.js +162 -0
- package/dist/chunk-BOFEQC6K.js.map +1 -0
- package/dist/chunk-CM7LVUKC.js +35 -0
- package/dist/chunk-CM7LVUKC.js.map +1 -0
- package/dist/chunk-CORUP6JB.js +122 -0
- package/dist/chunk-CORUP6JB.js.map +1 -0
- package/dist/chunk-CSX5FFKZ.js +35 -0
- package/dist/chunk-CSX5FFKZ.js.map +1 -0
- package/dist/chunk-EGVHJKGJ.js +3125 -0
- package/dist/chunk-EGVHJKGJ.js.map +1 -0
- package/dist/{chunk-NEXLLTP4.js → chunk-G76LSA76.js} +6 -5
- package/dist/chunk-G76LSA76.js.map +1 -0
- package/dist/{chunk-PEI6RANI.js → chunk-GQMRL52F.js} +311 -75
- package/dist/chunk-GQMRL52F.js.map +1 -0
- package/dist/{chunk-ELIYWBZR.js → chunk-GUUXOISA.js} +1113 -457
- package/dist/chunk-GUUXOISA.js.map +1 -0
- package/dist/{chunk-HUIKIDM5.js → chunk-I7X2P4FU.js} +225 -116
- package/dist/chunk-I7X2P4FU.js.map +1 -0
- package/dist/chunk-IGFZFLI2.js +1390 -0
- package/dist/chunk-IGFZFLI2.js.map +1 -0
- package/dist/{chunk-4MDLEHXL.js → chunk-IMSUVYQB.js} +26 -13
- package/dist/chunk-IMSUVYQB.js.map +1 -0
- package/dist/chunk-IOYHDEP3.js +38 -0
- package/dist/chunk-IOYHDEP3.js.map +1 -0
- package/dist/chunk-IZV5FTJC.js +55 -0
- package/dist/chunk-IZV5FTJC.js.map +1 -0
- package/dist/chunk-KF33GTWN.js +343 -0
- package/dist/chunk-KF33GTWN.js.map +1 -0
- package/dist/chunk-KSGQ5ODA.js +457 -0
- package/dist/chunk-KSGQ5ODA.js.map +1 -0
- package/dist/{chunk-OAM4WAAM.js → chunk-KZC6QRNR.js} +1513 -697
- package/dist/chunk-KZC6QRNR.js.map +1 -0
- package/dist/chunk-LJUMYUBO.js +218 -0
- package/dist/chunk-LJUMYUBO.js.map +1 -0
- package/dist/chunk-LSW2OJVV.js +380 -0
- package/dist/chunk-LSW2OJVV.js.map +1 -0
- package/dist/chunk-M357MHH3.js +2 -0
- package/dist/chunk-M357MHH3.js.map +1 -0
- package/dist/chunk-MK2TQO4Y.js +24 -0
- package/dist/chunk-MK2TQO4Y.js.map +1 -0
- package/dist/chunk-N7S72EXK.js +25 -0
- package/dist/chunk-N7S72EXK.js.map +1 -0
- package/dist/{chunk-XXWH2JLC.js → chunk-NKMYZFHA.js} +616 -621
- package/dist/chunk-NKMYZFHA.js.map +1 -0
- package/dist/chunk-NX4ADH73.js +14 -0
- package/dist/chunk-NX4ADH73.js.map +1 -0
- package/dist/chunk-O7F6UJO4.js +71 -0
- package/dist/chunk-O7F6UJO4.js.map +1 -0
- package/dist/chunk-OVB5WIG5.js +14064 -0
- package/dist/chunk-OVB5WIG5.js.map +1 -0
- package/dist/chunk-OYQQJL3J.js +16 -0
- package/dist/chunk-OYQQJL3J.js.map +1 -0
- package/dist/{chunk-H5YGYNXS.js → chunk-P4BNUO57.js} +60 -17
- package/dist/chunk-P4BNUO57.js.map +1 -0
- package/dist/{chunk-JVYQRRC4.js → chunk-PEHTX3V7.js} +21 -1
- package/dist/chunk-PEHTX3V7.js.map +1 -0
- package/dist/chunk-PMV53IMM.js +26 -0
- package/dist/chunk-PMV53IMM.js.map +1 -0
- package/dist/{chunk-KCGXPP5V.js → chunk-PYEOPA4M.js} +13 -7
- package/dist/chunk-PYEOPA4M.js.map +1 -0
- package/dist/{chunk-KZ73RL76.js → chunk-QHUE7E4N.js} +8 -3
- package/dist/chunk-QHUE7E4N.js.map +1 -0
- package/dist/chunk-QV3DJVRZ.js +11 -0
- package/dist/chunk-QV3DJVRZ.js.map +1 -0
- package/dist/chunk-R5SBNG7S.js +810 -0
- package/dist/chunk-R5SBNG7S.js.map +1 -0
- package/dist/chunk-RI42H5IU.js +326 -0
- package/dist/chunk-RI42H5IU.js.map +1 -0
- package/dist/chunk-S2QH6EZ5.js +211 -0
- package/dist/chunk-S2QH6EZ5.js.map +1 -0
- package/dist/chunk-SHLZMAJN.js +304 -0
- package/dist/chunk-SHLZMAJN.js.map +1 -0
- package/dist/chunk-TGXK4BAZ.js +293 -0
- package/dist/chunk-TGXK4BAZ.js.map +1 -0
- package/dist/{chunk-5YK2ZDIG.js → chunk-TNEZNMSN.js} +4 -10
- package/dist/chunk-TNEZNMSN.js.map +1 -0
- package/dist/{chunk-22KP6LR5.js → chunk-TXS65BB2.js} +3 -1
- package/dist/{chunk-22KP6LR5.js.map → chunk-TXS65BB2.js.map} +1 -1
- package/dist/chunk-UNJPZGNK.js +63 -0
- package/dist/chunk-UNJPZGNK.js.map +1 -0
- package/dist/{chunk-MZ2G2XBA.js → chunk-V5ZUJT2T.js} +205 -45
- package/dist/chunk-V5ZUJT2T.js.map +1 -0
- package/dist/chunk-VIUEOHXY.js +394 -0
- package/dist/chunk-VIUEOHXY.js.map +1 -0
- package/dist/chunk-WIUKB3LD.js +1911 -0
- package/dist/chunk-WIUKB3LD.js.map +1 -0
- package/dist/{chunk-ICA6R6TW.js → chunk-WNN7NO2N.js} +1451 -355
- package/dist/chunk-WNN7NO2N.js.map +1 -0
- package/dist/{chunk-YJFGAFBD.js → chunk-X5UVUIMF.js} +1892 -1223
- package/dist/chunk-X5UVUIMF.js.map +1 -0
- package/dist/chunk-XDA5QJE7.js +402 -0
- package/dist/chunk-XDA5QJE7.js.map +1 -0
- package/dist/{chunk-VZTQ73XT.js → chunk-XEA5BCMA.js} +3 -1
- package/dist/{chunk-VZTQ73XT.js.map → chunk-XEA5BCMA.js.map} +1 -1
- package/dist/chunk-XHF7OYAN.js +1150 -0
- package/dist/chunk-XHF7OYAN.js.map +1 -0
- package/dist/chunk-YSRBFJMQ.js +43 -0
- package/dist/chunk-YSRBFJMQ.js.map +1 -0
- package/dist/chunk-ZOZAPAUO.js +174 -0
- package/dist/chunk-ZOZAPAUO.js.map +1 -0
- package/dist/chunk-ZQV5W7YC.js +809 -0
- package/dist/chunk-ZQV5W7YC.js.map +1 -0
- package/dist/chunk-ZUWF4NF7.js +13 -0
- package/dist/chunk-ZUWF4NF7.js.map +1 -0
- package/dist/client.d.ts +16 -7
- package/dist/clipboard.js +3 -1
- package/dist/commands/types.d.ts +2 -0
- package/dist/components/anthropic-mark.d.ts +3 -0
- package/dist/components/approval-surface.d.ts +19 -6
- package/dist/components/artifacts/artifact-chrome.d.ts +120 -0
- package/dist/components/artifacts/artifact-sandbox.d.ts +30 -0
- package/dist/components/artifacts/artifact-surface.d.ts +4 -2
- package/dist/components/artifacts/chat-interactive-block.d.ts +29 -0
- package/dist/components/artifacts/deferred-chat-media.d.ts +15 -0
- package/dist/components/artifacts/document-editor.d.ts +4 -2
- package/dist/components/artifacts/editable-artifact-ui.d.ts +2 -1
- package/dist/components/artifacts/editable-artifact-view.d.ts +48 -0
- package/dist/components/artifacts/editable-document.d.ts +1 -1
- package/dist/components/artifacts/editable-presentation.d.ts +2 -2
- package/dist/components/artifacts/editable-spreadsheet.d.ts +8 -3
- package/dist/components/artifacts/index.d.ts +9 -2
- package/dist/components/artifacts/inline-html-document.d.ts +2 -0
- package/dist/components/artifacts/latest-task-runner.d.ts +15 -0
- package/dist/components/artifacts/presentation-editor.d.ts +6 -2
- package/dist/components/artifacts/published-html-artifact-frame.d.ts +23 -3
- package/dist/components/artifacts/session-artifact-viewer.d.ts +39 -0
- package/dist/components/artifacts/site-view.d.ts +26 -0
- package/dist/components/artifacts/spreadsheet-command-queue.d.ts +20 -0
- package/dist/components/artifacts/spreadsheet-download.d.ts +7 -0
- package/dist/components/artifacts/spreadsheet-general-display.d.ts +24 -0
- package/dist/components/artifacts/spreadsheet-grid.d.ts +10 -3
- package/dist/components/artifacts/spreadsheet-resize.d.ts +50 -0
- package/dist/components/artifacts/spreadsheet-submissions.d.ts +9 -0
- package/dist/components/artifacts/visualization-assets.gen.d.ts +2 -0
- package/dist/components/browser-select-control.d.ts +16 -0
- package/dist/components/browser-viewer.d.ts +11 -2
- package/dist/components/chat-composer.d.ts +21 -3
- package/dist/components/child-session-link.d.ts +9 -0
- package/dist/components/claude-mark.d.ts +3 -0
- package/dist/components/code-editor.d.ts +1 -4
- package/dist/components/composer-transcription-control.d.ts +7 -0
- package/dist/components/composer.d.ts +34 -67
- package/dist/components/computer-viewer.d.ts +1 -1
- package/dist/components/copy-button.d.ts +3 -1
- package/dist/components/desktop-viewer.d.ts +1 -1
- package/dist/components/fleet-tile.d.ts +2 -2
- package/dist/components/grok-mark.d.ts +26 -0
- package/dist/components/human-input-form.d.ts +28 -32
- package/dist/components/human-input-surface.d.ts +7 -2
- package/dist/components/linkified-text.d.ts +18 -0
- package/dist/components/machine-input-display.d.ts +22 -1
- package/dist/components/machines/agent-status-icon.d.ts +6 -0
- package/dist/components/machines/machine-detail.d.ts +7 -1
- package/dist/components/machines/machine-status.d.ts +48 -0
- package/dist/components/markdown-table-layout.d.ts +18 -0
- package/dist/components/markdown.d.ts +37 -4
- package/dist/components/message-timeline.d.ts +86 -7
- package/dist/components/model-mark.d.ts +29 -0
- package/dist/components/model-policy-picker-menu.d.ts +9 -0
- package/dist/components/model-policy-picker.d.ts +41 -25
- package/dist/components/new-conversation.d.ts +32 -0
- package/dist/components/open-geni-chat.d.ts +73 -0
- package/dist/components/open-geni-links.d.ts +68 -0
- package/dist/components/openrouter-mark.d.ts +6 -0
- package/dist/components/opper-mark.d.ts +7 -0
- package/dist/components/preview-loading.d.ts +2 -0
- package/dist/components/provider-recovery-notice.d.ts +16 -0
- package/dist/components/queue-item-content.d.ts +9 -0
- package/dist/components/rehype-secret-refs.d.ts +23 -0
- package/dist/components/remark-soft-line-breaks.d.ts +38 -0
- package/dist/components/sandbox-files.d.ts +3 -1
- package/dist/components/sandbox-workspace.d.ts +18 -0
- package/dist/components/secret-question-field.d.ts +31 -0
- package/dist/components/secret-ref-chip.d.ts +35 -0
- package/dist/components/session-capability-frame.d.ts +37 -0
- package/dist/components/session-chrome.d.ts +57 -8
- package/dist/components/session-commands-panel.d.ts +6 -0
- package/dist/components/session-commands.d.ts +6 -0
- package/dist/components/session-connection-request.d.ts +8 -0
- package/dist/components/session-conversation.d.ts +157 -0
- package/dist/components/session-list.d.ts +39 -0
- package/dist/components/session-mcp-capability-card.d.ts +41 -0
- package/dist/components/session-proxy-scope.d.ts +35 -0
- package/dist/components/session-status.d.ts +4 -1
- package/dist/components/session-usage-limit-notice.d.ts +39 -0
- package/dist/components/timeline-anchor.d.ts +24 -0
- package/dist/components/timeline-annotation-chrome.d.ts +25 -0
- package/dist/components/timeline-annotation-layout.d.ts +42 -0
- package/dist/components/timeline-annotation-markers.d.ts +8 -0
- package/dist/components/timeline-annotation-reveal-context.d.ts +4 -0
- package/dist/components/timeline-annotation-shared.d.ts +31 -0
- package/dist/components/timeline-annotations-dialog.d.ts +3 -2
- package/dist/components/timeline-annotations.d.ts +13 -3
- package/dist/components/timeline-reading-progress.d.ts +11 -0
- package/dist/components/timeline-search.d.ts +34 -0
- package/dist/components/timeline-settlement.d.ts +16 -0
- package/dist/components/tip-follow.d.ts +16 -0
- package/dist/components/tool-action-review.d.ts +47 -0
- package/dist/components/tool-review-history.d.ts +25 -0
- package/dist/components/usage-limit-notice.d.ts +49 -0
- package/dist/components/usage-member-list.d.ts +91 -0
- package/dist/components/usage-meter.d.ts +73 -0
- package/dist/components/use-viewer-menu-dismiss.d.ts +2 -0
- package/dist/components/user-message-body.d.ts +10 -1
- package/dist/composer-messages.d.ts +74 -0
- package/dist/composer-messages.js +9 -0
- package/dist/composer-messages.js.map +1 -0
- package/dist/composer-voice-events.d.ts +8 -0
- package/dist/composer.d.ts +5 -4
- package/dist/composer.js +26 -13
- package/dist/computer-viewer-GMLDXPON.js +20 -0
- package/dist/computer-viewer-GMLDXPON.js.map +1 -0
- package/dist/connect-account-identity.d.ts +8 -0
- package/dist/connect-accounts.d.ts +15 -0
- package/dist/connect-chooser.d.ts +18 -0
- package/dist/connect-panel.d.ts +18 -0
- package/dist/connect-setup.d.ts +18 -0
- package/dist/connect.d.ts +21 -0
- package/dist/connect.js +2149 -0
- package/dist/connect.js.map +1 -0
- package/dist/connection-catalog.d.ts +38 -0
- package/dist/connection-discovery.d.ts +12 -0
- package/dist/connection-installed.d.ts +17 -0
- package/dist/connection-logo.d.ts +9 -0
- package/dist/connection-service-logo.d.ts +8 -0
- package/dist/connection-service-presentation.d.ts +13 -0
- package/dist/connection-skeleton.d.ts +5 -0
- package/dist/connection-type-picker.d.ts +6 -0
- package/dist/conversation-timeline.d.ts +5 -0
- package/dist/desktop.d.ts +7 -0
- package/dist/desktop.js +27 -0
- package/dist/desktop.js.map +1 -0
- package/dist/device-authorization.d.ts +23 -0
- package/dist/diffs.d.ts +8 -0
- package/dist/diffs.js +15 -0
- package/dist/diffs.js.map +1 -0
- package/dist/discovery-cache.d.ts +5 -0
- package/dist/editor.d.ts +7 -0
- package/dist/editor.js +22 -0
- package/dist/editor.js.map +1 -0
- package/dist/embedded-new-voice-OCRNT6U5.js +18 -0
- package/dist/embedded-new-voice-OCRNT6U5.js.map +1 -0
- package/dist/embedded-voice-RPHPYVBT.js +18 -0
- package/dist/embedded-voice-RPHPYVBT.js.map +1 -0
- package/dist/{fleet-decision-row-GGCAT4E4.js → fleet-decision-row-SI63O5V4.js} +4 -1
- package/dist/fleet-decision-row-SI63O5V4.js.map +1 -0
- package/dist/hooks/latest-question.d.ts +25 -0
- package/dist/hooks/shared-machines-list.d.ts +4 -0
- package/dist/hooks/shared-query.d.ts +113 -0
- package/dist/hooks/use-attached-browsers.d.ts +1 -1
- package/dist/hooks/use-auth-runs.d.ts +1 -4
- package/dist/hooks/use-available-models.d.ts +1 -1
- package/dist/hooks/use-browser-frame-stream.d.ts +1 -1
- package/dist/hooks/use-browser-session.d.ts +12 -1
- package/dist/hooks/use-client-config-flags.d.ts +49 -0
- package/dist/hooks/use-codex-accounts.d.ts +59 -10
- package/dist/hooks/use-composer.d.ts +24 -2
- package/dist/hooks/use-computer-frame-stream.d.ts +1 -1
- package/dist/hooks/use-computer-input-posture.d.ts +13 -0
- package/dist/hooks/use-computer-session.d.ts +4 -0
- package/dist/hooks/use-connect.d.ts +23 -0
- package/dist/hooks/use-desktop-stream.d.ts +1 -1
- package/dist/hooks/use-file-attachments.d.ts +12 -0
- package/dist/hooks/use-goal.d.ts +2 -1
- package/dist/hooks/use-last-started-turn-policy.d.ts +5 -1
- package/dist/hooks/use-new-conversation.d.ts +56 -0
- package/dist/hooks/use-new-session-draft.d.ts +74 -0
- package/dist/hooks/use-realtime-voice-models.d.ts +7 -0
- package/dist/hooks/use-sandbox-files.d.ts +4 -1
- package/dist/hooks/use-session-conversation.d.ts +49 -0
- package/dist/hooks/use-session-events.d.ts +28 -7
- package/dist/hooks/use-session-mcp-approval-policy.d.ts +2 -2
- package/dist/hooks/use-session-model-account.d.ts +48 -0
- package/dist/hooks/use-supergrok-accounts.d.ts +7 -1
- package/dist/hooks/use-terminal-stream.d.ts +11 -5
- package/dist/hooks/use-usage.d.ts +40 -0
- package/dist/hooks/use-vaults.d.ts +53 -0
- package/dist/hooks/use-voice-input.d.ts +8 -1
- package/dist/hooks/use-workspace-edit.d.ts +4 -0
- package/dist/hooks/use-workspace-sessions.d.ts +22 -5
- package/dist/human-input-model.d.ts +122 -0
- package/dist/identity-link-accounts.d.ts +11 -0
- package/dist/identity-link-consent.d.ts +18 -0
- package/dist/index.d.ts +82 -20
- package/dist/index.js +2350 -6605
- package/dist/index.js.map +1 -1
- package/dist/interaction.d.ts +1 -1
- package/dist/interaction.js +14 -24
- package/dist/interaction.js.map +1 -1
- package/dist/latest-question-R77KWSUP.js +118 -0
- package/dist/latest-question-R77KWSUP.js.map +1 -0
- package/dist/lib/clipboard.d.ts +7 -0
- package/dist/lib/error-message.d.ts +7 -0
- package/dist/lib/format.d.ts +58 -4
- package/dist/lib/host-theme.d.ts +77 -0
- package/dist/lib/interaction-errors.d.ts +3 -0
- package/dist/lib/menu-styles.d.ts +22 -0
- package/dist/lib/notify-observer.d.ts +2 -0
- package/dist/lib/pierre-diffs-loader.d.ts +20 -0
- package/dist/lib/provider-recovery.d.ts +55 -0
- package/dist/lib/scrollbars.d.ts +11 -0
- package/dist/lib/terminal-input-readiness.d.ts +11 -0
- package/dist/lib/transient-retry.d.ts +25 -0
- package/dist/lib/workbench-peers.d.ts +36 -0
- package/dist/lib/xterm-theme.d.ts +7 -5
- package/dist/machines.js +9 -5
- package/dist/markdown-table-layout-3PV2UAAH.js +113 -0
- package/dist/markdown-table-layout-3PV2UAAH.js.map +1 -0
- package/dist/mcp-connection-status.d.ts +14 -0
- package/dist/model-mark-paths.d.ts +34 -0
- package/dist/model-mark-paths.js +16 -0
- package/dist/model-mark-paths.js.map +1 -0
- package/dist/model-picker-model.d.ts +111 -0
- package/dist/model-picker-model.js +25 -0
- package/dist/model-picker-model.js.map +1 -0
- package/dist/model-policy-picker-menu-7GJ5URPR.js +17 -0
- package/dist/model-policy-picker-menu-7GJ5URPR.js.map +1 -0
- package/dist/model-policy.d.ts +30 -3
- package/dist/model-policy.js +14 -1
- package/dist/native-previews.d.ts +28 -0
- package/dist/native-previews.js +82 -0
- package/dist/native-previews.js.map +1 -0
- package/dist/new-session-draft.d.ts +7 -0
- package/dist/new-session-draft.js +639 -0
- package/dist/new-session-draft.js.map +1 -0
- package/dist/notification-text.d.ts +27 -0
- package/dist/{noto-sans-arabic-loader-IA2T4X2A.js → noto-sans-arabic-loader-XSH2KYWJ.js} +3 -1
- package/dist/{noto-sans-arabic-loader-IA2T4X2A.js.map → noto-sans-arabic-loader-XSH2KYWJ.js.map} +1 -1
- package/dist/{noto-sans-jp-loader.generated-HFGLYBR3.js → noto-sans-jp-loader.generated-MR5L6V7K.js} +3 -1
- package/dist/{noto-sans-jp-loader.generated-HFGLYBR3.js.map → noto-sans-jp-loader.generated-MR5L6V7K.js.map} +1 -1
- package/dist/older-history.d.ts +3 -2
- package/dist/organization-model.d.ts +32 -0
- package/dist/organization-model.js +65 -0
- package/dist/organization-model.js.map +1 -0
- package/dist/{platform-activity-row-BJHUHXAT.js → platform-activity-row-5OCKOQWZ.js} +16 -78
- package/dist/platform-activity-row-5OCKOQWZ.js.map +1 -0
- package/dist/plugin-details.d.ts +14 -0
- package/dist/plugin-discovery.d.ts +25 -0
- package/dist/preview-loading-paint.d.ts +20 -0
- package/dist/provider.d.ts +25 -2
- package/dist/queue-presentation-model.d.ts +72 -0
- package/dist/queue-presentation-model.js +38 -0
- package/dist/queue-presentation-model.js.map +1 -0
- package/dist/{queue-surface-implementation-BSKUWHRI.js → queue-surface-implementation-GJBH7NKO.js} +65 -265
- package/dist/queue-surface-implementation-GJBH7NKO.js.map +1 -0
- package/dist/realtime/embedded-new-voice.d.ts +1 -0
- package/dist/realtime/embedded-voice.d.ts +1 -0
- package/dist/realtime/realtime-control.d.ts +4 -65
- package/dist/realtime/session-realtime.d.ts +78 -0
- package/dist/realtime.js +25 -1294
- package/dist/realtime.js.map +1 -1
- package/dist/sandbox-files-O27IPOZW.js +21 -0
- package/dist/sandbox-files-O27IPOZW.js.map +1 -0
- package/dist/sandbox-label-model.d.ts +30 -0
- package/dist/sandbox-label-model.js +20 -0
- package/dist/sandbox-label-model.js.map +1 -0
- package/dist/scrollbars.d.ts +1 -0
- package/dist/scrollbars.js +10 -0
- package/dist/scrollbars.js.map +1 -0
- package/dist/secret-reference-label.d.ts +14 -0
- package/dist/secrets-ui.d.ts +57 -0
- package/dist/session-agents-model.d.ts +10 -0
- package/dist/session-agents-model.js +25 -0
- package/dist/session-agents-model.js.map +1 -0
- package/dist/session-attention-model.d.ts +8 -0
- package/dist/session-attention-model.js +47 -0
- package/dist/session-attention-model.js.map +1 -0
- package/dist/session-auth-recommendation.d.ts +5 -0
- package/dist/session-capability-policy.d.ts +31 -0
- package/dist/session-feedback-model.d.ts +20 -0
- package/dist/session-feedback-model.js +56 -0
- package/dist/session-feedback-model.js.map +1 -0
- package/dist/session-list-model.d.ts +138 -0
- package/dist/session-list-model.js +274 -0
- package/dist/session-list-model.js.map +1 -0
- package/dist/session-realtime-7DJOIHQW.js +21 -0
- package/dist/session-realtime-7DJOIHQW.js.map +1 -0
- package/dist/session-realtime.d.ts +7 -0
- package/dist/session-realtime.js +19 -0
- package/dist/session-realtime.js.map +1 -0
- package/dist/session-status-model.d.ts +36 -0
- package/dist/session-ui.d.ts +39 -1
- package/dist/session-ui.js +126 -12
- package/dist/session-ui.js.map +1 -1
- package/dist/session.d.ts +8 -2
- package/dist/session.js +35 -20
- package/dist/site-snapshot.d.ts +14 -0
- package/dist/sites-ui.d.ts +24 -0
- package/dist/sites.d.ts +3 -0
- package/dist/sites.js +14 -0
- package/dist/sites.js.map +1 -0
- package/dist/skill-discovery.d.ts +47 -0
- package/dist/terminal.d.ts +8 -0
- package/dist/terminal.js +32 -0
- package/dist/terminal.js.map +1 -0
- package/dist/testing/session-scenarios.d.ts +10 -0
- package/dist/testing/session-scenarios.js +367 -0
- package/dist/testing/session-scenarios.js.map +1 -0
- package/dist/timeline/activity-rail.d.ts +11 -2
- package/dist/timeline/agent-identity.d.ts +30 -0
- package/dist/timeline/agent-row.d.ts +31 -0
- package/dist/timeline/allowance-exhausted-row.d.ts +24 -0
- package/dist/timeline/compaction-copy.d.ts +46 -0
- package/dist/timeline/entrance.d.ts +13 -1
- package/dist/timeline/focus-sequence.d.ts +9 -0
- package/dist/timeline/genie-copy.d.ts +3 -0
- package/dist/timeline/genie-loading.d.ts +47 -0
- package/dist/timeline/index.d.ts +10 -5
- package/dist/timeline/knowledge-receipt.d.ts +17 -0
- package/dist/timeline/message-sender.d.ts +19 -0
- package/dist/timeline/notice-presentation.d.ts +13 -0
- package/dist/timeline/parsers.d.ts +11 -0
- package/dist/timeline/patch-apply-command.d.ts +18 -0
- package/dist/timeline/platform-activity-presentation.d.ts +21 -0
- package/dist/timeline/platform-activity-row.d.ts +1 -2
- package/dist/timeline/presented-image.d.ts +11 -0
- package/dist/timeline/projection.d.ts +31 -2
- package/dist/timeline/provider-logo.d.ts +15 -0
- package/dist/timeline/question-nav-model.d.ts +23 -0
- package/dist/timeline/registry.d.ts +12 -1
- package/dist/timeline/retained-image.d.ts +18 -0
- package/dist/timeline/retained-loaders.d.ts +27 -0
- package/dist/timeline/rolling-activity.d.ts +11 -0
- package/dist/timeline/screenshot-lightbox.d.ts +23 -1
- package/dist/timeline/session-usage-limit-row.d.ts +11 -0
- package/dist/timeline/shared.d.ts +4 -1
- package/dist/timeline/startup-dispatch-details.d.ts +5 -0
- package/dist/timeline/startup-preference.d.ts +3 -0
- package/dist/timeline/startup-timings.d.ts +4 -0
- package/dist/timeline/tool-display-name.d.ts +5 -2
- package/dist/timeline/tool-presentation.d.ts +172 -0
- package/dist/timeline/turn-summary-model.d.ts +95 -0
- package/dist/timeline/turn-summary.d.ts +20 -54
- package/dist/timeline/types.d.ts +179 -7
- package/dist/timeline/work-presentation.d.ts +60 -0
- package/dist/timeline-annotation-markers-U3G66KUD.js +166 -0
- package/dist/timeline-annotation-markers-U3G66KUD.js.map +1 -0
- package/dist/timeline-annotation-selection-BI7QTPTZ.js +242 -0
- package/dist/timeline-annotation-selection-BI7QTPTZ.js.map +1 -0
- package/dist/timeline-annotations-dialog-FOMHSDTE.js +274 -0
- package/dist/timeline-annotations-dialog-FOMHSDTE.js.map +1 -0
- package/dist/timeline-model.d.ts +29 -0
- package/dist/timeline-model.js +254 -0
- package/dist/timeline-model.js.map +1 -0
- package/dist/usage/allowance-copy.d.ts +25 -0
- package/dist/usage/session-usage-limit.d.ts +88 -0
- package/dist/usage/summary.d.ts +35 -0
- package/dist/usage.d.ts +17 -0
- package/dist/usage.js +1187 -0
- package/dist/usage.js.map +1 -0
- package/dist/voice-recording-owner.d.ts +7 -0
- package/package.json +107 -7
- package/src/accounts.tsx +116 -14
- package/src/approvals.ts +8 -1
- package/src/artifacts-spreadsheet.ts +1 -0
- package/src/artifacts.ts +44 -0
- package/src/assets/README.md +8 -0
- package/src/assets/gmail.ico +0 -0
- package/src/assets/outlook.ico +0 -0
- package/src/capability-catalog-row.tsx +94 -0
- package/src/capability-logo-fallback.ts +22 -0
- package/src/client.ts +20 -31
- package/src/commands/registry.ts +18 -15
- package/src/commands/types.ts +2 -0
- package/src/components/anthropic-mark.tsx +10 -0
- package/src/components/approval-surface.tsx +401 -138
- package/src/components/artifacts/artifact-chrome.tsx +413 -0
- package/src/components/artifacts/artifact-sandbox.tsx +189 -0
- package/src/components/artifacts/artifact-surface.tsx +40 -20
- package/src/components/artifacts/chat-interactive-block.tsx +260 -0
- package/src/components/artifacts/deferred-chat-media.tsx +67 -0
- package/src/components/artifacts/document-editor.tsx +141 -16
- package/src/components/artifacts/editable-artifact-ui.tsx +4 -2
- package/src/components/artifacts/editable-artifact-view.tsx +197 -0
- package/src/components/artifacts/editable-artifact-workbench.tsx +5 -2
- package/src/components/artifacts/editable-document.tsx +37 -36
- package/src/components/artifacts/editable-presentation.tsx +36 -18
- package/src/components/artifacts/editable-spreadsheet.tsx +543 -103
- package/src/components/artifacts/index.ts +45 -0
- package/src/components/artifacts/inline-html-document.ts +24 -0
- package/src/components/artifacts/latest-task-runner.ts +49 -0
- package/src/components/artifacts/presentation-editor.tsx +323 -67
- package/src/components/artifacts/published-html-artifact-frame.tsx +122 -5
- package/src/components/artifacts/session-artifact-viewer.tsx +378 -0
- package/src/components/artifacts/site-view.tsx +121 -0
- package/src/components/artifacts/spreadsheet-canvas.ts +5 -10
- package/src/components/artifacts/spreadsheet-command-queue.ts +184 -0
- package/src/components/artifacts/spreadsheet-download.tsx +109 -0
- package/src/components/artifacts/spreadsheet-general-display.ts +43 -0
- package/src/components/artifacts/spreadsheet-grid.tsx +344 -144
- package/src/components/artifacts/spreadsheet-resize.tsx +421 -0
- package/src/components/artifacts/spreadsheet-submissions.tsx +46 -0
- package/src/components/artifacts/visualization-assets/base.css +1015 -0
- package/src/components/artifacts/visualization-assets/helpers.html +349 -0
- package/src/components/artifacts/visualization-assets.gen.ts +3 -0
- package/src/components/browser-select-control.tsx +312 -0
- package/src/components/browser-viewer.tsx +778 -318
- package/src/components/chat-composer.tsx +47 -5
- package/src/components/child-session-link.tsx +36 -0
- package/src/components/claude-mark.tsx +11 -0
- package/src/components/code-editor.tsx +13 -16
- package/src/components/composer-transcription-control.tsx +128 -30
- package/src/components/composer.tsx +404 -195
- package/src/components/computer-viewer.tsx +880 -253
- package/src/components/copy-button.tsx +13 -5
- package/src/components/desktop-viewer.tsx +1 -1
- package/src/components/enrollment-consent.tsx +1 -1
- package/src/components/enrollment-device-flow.tsx +1 -1
- package/src/components/file-browser.tsx +10 -14
- package/src/components/fleet-tile.tsx +9 -18
- package/src/components/generated-video-player.tsx +4 -2
- package/src/components/grok-mark.tsx +34 -0
- package/src/components/human-input-form.tsx +590 -283
- package/src/components/human-input-surface.tsx +11 -0
- package/src/components/interaction-intervention-banner.tsx +2 -2
- package/src/components/linkified-text.tsx +79 -0
- package/src/components/machine-card.tsx +35 -78
- package/src/components/machine-dock-bar.tsx +1 -1
- package/src/components/machine-input-display.ts +197 -3
- package/src/components/machines/agent-status-icon.tsx +31 -0
- package/src/components/machines/machine-detail.tsx +200 -31
- package/src/components/machines/machine-operation-policy.tsx +1 -1
- package/src/components/machines/machine-status.ts +241 -0
- package/src/components/machines-dashboard.tsx +2 -17
- package/src/components/markdown-table-layout.ts +143 -0
- package/src/components/markdown.tsx +466 -129
- package/src/components/message-timeline.tsx +2567 -728
- package/src/components/model-mark.tsx +102 -0
- package/src/components/model-picker.tsx +15 -4
- package/src/components/model-policy-picker-menu.tsx +371 -0
- package/src/components/model-policy-picker.tsx +256 -412
- package/src/components/new-conversation.tsx +221 -0
- package/src/components/open-geni-chat.tsx +309 -0
- package/src/components/open-geni-links.tsx +179 -0
- package/src/components/openrouter-mark.tsx +13 -0
- package/src/components/opper-mark.tsx +18 -0
- package/src/components/pierre-diff.tsx +41 -16
- package/src/components/pierre-file.tsx +35 -10
- package/src/components/preview-loading.tsx +109 -0
- package/src/components/provider-recovery-notice.tsx +49 -0
- package/src/components/queue-item-content.ts +14 -0
- package/src/components/queue-surface-implementation.tsx +51 -356
- package/src/components/queue-surface-state.tsx +3 -1
- package/src/components/rehype-secret-refs.ts +98 -0
- package/src/components/remark-soft-line-breaks.ts +166 -0
- package/src/components/sandbox-files.tsx +91 -15
- package/src/components/sandbox-terminal.tsx +84 -13
- package/src/components/sandbox-workspace.tsx +147 -51
- package/src/components/secret-question-field.tsx +324 -0
- package/src/components/secret-ref-chip.tsx +185 -0
- package/src/components/session-capability-frame.tsx +197 -0
- package/src/components/session-chrome.tsx +842 -251
- package/src/components/session-commands-panel.tsx +126 -0
- package/src/components/session-commands.tsx +18 -0
- package/src/components/session-connection-request.tsx +97 -0
- package/src/components/session-conversation.tsx +876 -0
- package/src/components/session-list.tsx +257 -0
- package/src/components/session-mcp-capability-card.tsx +680 -0
- package/src/components/session-proxy-scope.tsx +153 -0
- package/src/components/session-status.tsx +26 -17
- package/src/components/session-usage-limit-notice.tsx +174 -0
- package/src/components/timeline-anchor.tsx +119 -0
- package/src/components/timeline-annotation-chrome.tsx +196 -0
- package/src/components/timeline-annotation-layout.ts +268 -0
- package/src/components/timeline-annotation-markers.tsx +185 -0
- package/src/components/timeline-annotation-reveal-context.ts +9 -0
- package/src/components/timeline-annotation-selection.tsx +106 -54
- package/src/components/timeline-annotation-shared.ts +245 -0
- package/src/components/timeline-annotations-dialog.tsx +185 -128
- package/src/components/timeline-annotations.tsx +189 -45
- package/src/components/timeline-reading-progress.ts +80 -0
- package/src/components/timeline-search.tsx +168 -0
- package/src/components/timeline-settlement.ts +60 -0
- package/src/components/tip-follow.ts +52 -0
- package/src/components/tool-action-review.tsx +650 -0
- package/src/components/tool-review-history.tsx +88 -0
- package/src/components/tooltip.tsx +38 -5
- package/src/components/usage-limit-notice.tsx +179 -0
- package/src/components/usage-member-list.tsx +792 -0
- package/src/components/usage-meter.tsx +382 -0
- package/src/components/use-viewer-menu-dismiss.ts +33 -0
- package/src/components/user-message-body.tsx +27 -2
- package/src/components/workspace-dock.tsx +18 -1
- package/src/composer-messages.ts +150 -0
- package/src/composer-voice-events.ts +12 -0
- package/src/composer.ts +6 -1
- package/src/connect-account-identity.tsx +34 -0
- package/src/connect-accounts.tsx +233 -0
- package/src/connect-chooser.tsx +336 -0
- package/src/connect-panel.tsx +99 -0
- package/src/connect-setup.tsx +355 -0
- package/src/connect.ts +60 -0
- package/src/connection-assets.d.ts +4 -0
- package/src/connection-catalog.tsx +162 -0
- package/src/connection-discovery.tsx +238 -0
- package/src/connection-installed.tsx +51 -0
- package/src/connection-logo.tsx +37 -0
- package/src/connection-service-logo.tsx +55 -0
- package/src/connection-service-presentation.ts +46 -0
- package/src/connection-skeleton.tsx +16 -0
- package/src/connection-type-picker.tsx +36 -0
- package/src/conversation-timeline.ts +92 -0
- package/src/desktop.ts +24 -0
- package/src/device-authorization.tsx +98 -0
- package/src/diffs.ts +16 -0
- package/src/discovery-cache.ts +42 -0
- package/src/editor.ts +13 -0
- package/src/hooks/internal.ts +3 -2
- package/src/hooks/latest-question.ts +164 -0
- package/src/hooks/shared-machines-list.ts +34 -1
- package/src/hooks/shared-query.ts +721 -0
- package/src/hooks/use-attached-browsers.ts +1 -1
- package/src/hooks/use-auth-runs.ts +0 -27
- package/src/hooks/use-available-models.ts +21 -15
- package/src/hooks/use-browser-frame-stream.ts +19 -2
- package/src/hooks/use-browser-session.ts +680 -205
- package/src/hooks/use-browser-sessions.ts +32 -1
- package/src/hooks/use-client-config-flags.ts +118 -0
- package/src/hooks/use-codex-accounts.ts +247 -47
- package/src/hooks/use-composer.ts +276 -47
- package/src/hooks/use-computer-frame-stream.ts +25 -7
- package/src/hooks/use-computer-input-posture.ts +94 -0
- package/src/hooks/use-computer-session.ts +409 -95
- package/src/hooks/use-connect.ts +23 -0
- package/src/hooks/use-desktop-stream.ts +19 -28
- package/src/hooks/use-file-attachments.ts +80 -4
- package/src/hooks/use-goal.ts +107 -13
- package/src/hooks/use-last-started-turn-policy.ts +46 -14
- package/src/hooks/use-machines.ts +4 -0
- package/src/hooks/use-new-conversation.ts +374 -0
- package/src/hooks/use-new-session-draft.ts +813 -0
- package/src/hooks/use-realtime-voice-models.ts +46 -0
- package/src/hooks/use-sandbox-files.ts +68 -20
- package/src/hooks/use-session-background-commands.ts +22 -11
- package/src/hooks/use-session-capabilities.ts +3 -2
- package/src/hooks/use-session-conversation.ts +150 -0
- package/src/hooks/use-session-events.ts +703 -382
- package/src/hooks/use-session-lineage.ts +20 -16
- package/src/hooks/use-session-mcp-approval-policy.ts +13 -5
- package/src/hooks/use-session-model-account.ts +174 -0
- package/src/hooks/use-session.ts +53 -21
- package/src/hooks/use-slash-commands.ts +6 -11
- package/src/hooks/use-supergrok-accounts.ts +22 -8
- package/src/hooks/use-terminal-stream.ts +153 -27
- package/src/hooks/use-transcription.ts +6 -0
- package/src/hooks/use-turn-queue.ts +2 -1
- package/src/hooks/use-usage.ts +100 -0
- package/src/hooks/use-vaults.ts +153 -0
- package/src/hooks/use-video-artifact-playback.ts +1 -1
- package/src/hooks/use-voice-input.ts +127 -19
- package/src/hooks/use-workspace-capture.ts +3 -2
- package/src/hooks/use-workspace-edit.ts +23 -5
- package/src/hooks/use-workspace-sessions.ts +97 -32
- package/src/human-input-model.ts +359 -0
- package/src/identity-link-accounts.tsx +148 -0
- package/src/identity-link-consent.tsx +192 -0
- package/src/index.ts +262 -16
- package/src/interaction.ts +1 -0
- package/src/lib/clipboard.ts +29 -0
- package/src/lib/error-message.ts +37 -0
- package/src/lib/format.ts +213 -16
- package/src/lib/host-theme.ts +529 -0
- package/src/lib/interaction-errors.ts +15 -0
- package/src/lib/menu-styles.ts +44 -0
- package/src/lib/notify-observer.ts +15 -0
- package/src/lib/pierre-diffs-loader.ts +53 -0
- package/src/lib/provider-recovery.ts +243 -0
- package/src/lib/scrollbars.ts +30 -0
- package/src/lib/terminal-input-readiness.ts +51 -0
- package/src/lib/transient-retry.ts +99 -0
- package/src/lib/workbench-peers.ts +62 -0
- package/src/lib/xterm-theme.ts +23 -21
- package/src/mcp-connection-status.ts +35 -0
- package/src/model-mark-paths.ts +53 -0
- package/src/model-picker-model.ts +330 -0
- package/src/model-policy.ts +299 -74
- package/src/native-previews.ts +100 -0
- package/src/new-session-draft.ts +22 -0
- package/src/notification-text.ts +81 -0
- package/src/older-history.ts +22 -4
- package/src/organization-model.ts +118 -0
- package/src/plugin-details.tsx +185 -0
- package/src/plugin-discovery.tsx +196 -0
- package/src/preview-loading-paint.ts +68 -0
- package/src/provider.tsx +74 -15
- package/src/queue-presentation-model.ts +464 -0
- package/src/realtime/dropdown-menu.tsx +19 -12
- package/src/realtime/embedded-new-voice.tsx +1 -0
- package/src/realtime/embedded-voice.tsx +3 -0
- package/src/realtime/realtime-control.tsx +138 -501
- package/src/realtime/session-realtime.ts +566 -0
- package/src/sandbox-label-model.ts +53 -0
- package/src/scrollbars.ts +3 -0
- package/src/secret-reference-label.ts +43 -0
- package/src/secrets-ui.tsx +59 -0
- package/src/session-agents-model.ts +33 -0
- package/src/session-attention-model.ts +62 -0
- package/src/session-auth-recommendation.ts +48 -0
- package/src/session-capability-policy.ts +196 -0
- package/src/session-context.ts +3 -4
- package/src/session-feedback-model.ts +95 -0
- package/src/session-list-model.ts +434 -0
- package/src/session-realtime.ts +18 -0
- package/src/session-status-model.ts +99 -0
- package/src/session-ui.ts +98 -1
- package/src/session.ts +17 -1
- package/src/site-snapshot.ts +74 -0
- package/src/sites-ui.tsx +348 -0
- package/src/sites.ts +3 -0
- package/src/skill-discovery.tsx +208 -0
- package/src/terminal.ts +26 -0
- package/src/testing/session-scenarios.ts +404 -0
- package/src/timeline/activity-rail.tsx +242 -101
- package/src/timeline/agent-identity.tsx +84 -0
- package/src/timeline/agent-row.tsx +231 -0
- package/src/timeline/allowance-exhausted-row.tsx +86 -0
- package/src/timeline/compaction-copy.ts +115 -0
- package/src/timeline/entrance.tsx +28 -3
- package/src/timeline/fleet-decision-projection.ts +2 -1
- package/src/timeline/fleet-decision-row.tsx +1 -0
- package/src/timeline/focus-sequence.ts +44 -0
- package/src/timeline/genie-copy.ts +19 -0
- package/src/timeline/genie-loading.tsx +143 -0
- package/src/timeline/index.ts +30 -2
- package/src/timeline/knowledge-receipt.tsx +100 -0
- package/src/timeline/message-sender.tsx +71 -0
- package/src/timeline/notice-presentation.ts +48 -0
- package/src/timeline/parsers.ts +42 -2
- package/src/timeline/patch-apply-command.tsx +135 -0
- package/src/timeline/platform-activity-presentation.ts +166 -0
- package/src/timeline/platform-activity-row.tsx +15 -90
- package/src/timeline/presented-image.ts +63 -0
- package/src/timeline/projection.ts +1746 -76
- package/src/timeline/provider-logo.tsx +53 -0
- package/src/timeline/question-nav-model.ts +28 -0
- package/src/timeline/registry.ts +26 -4
- package/src/timeline/retained-image.ts +97 -0
- package/src/timeline/retained-loaders.ts +91 -0
- package/src/timeline/rolling-activity.tsx +80 -0
- package/src/timeline/screenshot-lightbox.tsx +228 -5
- package/src/timeline/session-usage-limit-row.tsx +42 -0
- package/src/timeline/shared.tsx +42 -15
- package/src/timeline/startup-dispatch-details.tsx +36 -0
- package/src/timeline/startup-preference.ts +33 -0
- package/src/timeline/startup-timings.tsx +145 -0
- package/src/timeline/tool-display-name.ts +19 -7
- package/src/timeline/tool-presentation.ts +1316 -0
- package/src/timeline/tool-renderers.tsx +835 -1138
- package/src/timeline/turn-summary-model.ts +343 -0
- package/src/timeline/turn-summary.tsx +272 -365
- package/src/timeline/types.ts +189 -6
- package/src/timeline/work-presentation.ts +189 -0
- package/src/timeline-model.ts +143 -0
- package/src/usage/allowance-copy.ts +64 -0
- package/src/usage/session-usage-limit.ts +266 -0
- package/src/usage/summary.ts +93 -0
- package/src/usage.ts +70 -0
- package/src/voice-recording-owner.ts +22 -0
- package/styles/compiled.css +2319 -748
- package/styles/connect.css +290 -0
- package/styles/connect.d.ts +1 -0
- package/styles/effective-tokens.css +1 -0
- package/styles/index.css +309 -9
- package/styles/responsive.css +99 -7
- package/styles/session-capability.css +44 -0
- package/styles/tokens.css +134 -66
- package/dist/browser-viewer-AEFHUYZK.js +0 -14
- package/dist/chunk-4MDLEHXL.js.map +0 -1
- package/dist/chunk-5YK2ZDIG.js.map +0 -1
- package/dist/chunk-D3UIAJKY.js.map +0 -1
- package/dist/chunk-ELIYWBZR.js.map +0 -1
- package/dist/chunk-H5YGYNXS.js.map +0 -1
- package/dist/chunk-HQVCKCLG.js +0 -9458
- package/dist/chunk-HQVCKCLG.js.map +0 -1
- package/dist/chunk-HUIKIDM5.js.map +0 -1
- package/dist/chunk-ICA6R6TW.js.map +0 -1
- package/dist/chunk-JVYQRRC4.js.map +0 -1
- package/dist/chunk-KCGXPP5V.js.map +0 -1
- package/dist/chunk-KZ73RL76.js.map +0 -1
- package/dist/chunk-LAKLF4PA.js +0 -141
- package/dist/chunk-LAKLF4PA.js.map +0 -1
- package/dist/chunk-MZ2G2XBA.js.map +0 -1
- package/dist/chunk-NEXLLTP4.js.map +0 -1
- package/dist/chunk-OAM4WAAM.js.map +0 -1
- package/dist/chunk-PEI6RANI.js.map +0 -1
- package/dist/chunk-RGALCTWO.js.map +0 -1
- package/dist/chunk-W6NFJXSA.js +0 -454
- package/dist/chunk-W6NFJXSA.js.map +0 -1
- package/dist/chunk-WSK7G5LE.js +0 -170
- package/dist/chunk-WSK7G5LE.js.map +0 -1
- package/dist/chunk-X4A66EWZ.js +0 -223
- package/dist/chunk-X4A66EWZ.js.map +0 -1
- package/dist/chunk-XXWH2JLC.js.map +0 -1
- package/dist/chunk-YFKJ7VZH.js +0 -268
- package/dist/chunk-YFKJ7VZH.js.map +0 -1
- package/dist/chunk-YJFGAFBD.js.map +0 -1
- package/dist/computer-viewer-FWEZISW4.js +0 -16
- package/dist/fleet-decision-row-GGCAT4E4.js.map +0 -1
- package/dist/hooks/use-environments.d.ts +0 -41
- package/dist/hooks/use-packs.d.ts +0 -32
- package/dist/platform-activity-row-BJHUHXAT.js.map +0 -1
- package/dist/queue-surface-implementation-BSKUWHRI.js.map +0 -1
- package/dist/timeline-annotation-selection-3L7LHGG2.js +0 -187
- package/dist/timeline-annotation-selection-3L7LHGG2.js.map +0 -1
- package/dist/timeline-annotations-dialog-U7EVLR75.js +0 -196
- package/dist/timeline-annotations-dialog-U7EVLR75.js.map +0 -1
- package/src/hooks/use-environments.ts +0 -182
- package/src/hooks/use-packs.ts +0 -157
- /package/dist/{browser-viewer-AEFHUYZK.js.map → browser-viewer-ZWR6MWJ7.js.map} +0 -0
- /package/dist/{computer-viewer-FWEZISW4.js.map → chat-interactive-block-BO2IWXVK.js.map} +0 -0
|
@@ -1,14 +1,12 @@
|
|
|
1
|
+
import {
|
|
2
|
+
COMPOSER_VOICE_INPUT_START_EVENT,
|
|
3
|
+
composerVoiceEventScope,
|
|
4
|
+
} from "../composer-voice-events";
|
|
1
5
|
import { type EffectiveSessionControl, type SessionEvent, type SessionStatus } from "@opengeni/sdk";
|
|
2
6
|
import {
|
|
3
|
-
hasStoredSessionRealtimeOwnerProof,
|
|
4
7
|
projectSessionRealtimeLifecycle,
|
|
5
|
-
type SessionRealtimeClientLike,
|
|
6
|
-
type SessionRealtimeController,
|
|
7
8
|
type SessionRealtimeControllerSnapshot,
|
|
8
|
-
type CreateSessionRealtimeControllerOptions,
|
|
9
|
-
type SessionRealtimeLifecycleProjection,
|
|
10
9
|
type SessionRealtimeModel,
|
|
11
|
-
type WorkspaceRealtimeModelCatalogItem,
|
|
12
10
|
} from "@opengeni/sdk/realtime";
|
|
13
11
|
import {
|
|
14
12
|
AudioLinesIcon,
|
|
@@ -22,6 +20,7 @@ import {
|
|
|
22
20
|
SquareIcon,
|
|
23
21
|
Volume2Icon,
|
|
24
22
|
VolumeXIcon,
|
|
23
|
+
XIcon,
|
|
25
24
|
} from "lucide-react";
|
|
26
25
|
import { AnimatePresence, motion, useReducedMotion } from "motion/react";
|
|
27
26
|
import {
|
|
@@ -40,10 +39,8 @@ import {
|
|
|
40
39
|
PickerBackHeader,
|
|
41
40
|
PickerNavRow,
|
|
42
41
|
} from "../components/model-policy-picker";
|
|
43
|
-
import type { EmbeddedRealtimeSessionClientLike } from "../client";
|
|
44
42
|
import { cn } from "../lib/cn";
|
|
45
43
|
import type { PickerBillingClass as BillingClass } from "../model-policy";
|
|
46
|
-
import { useEmbeddedRealtimeSession } from "../session-context";
|
|
47
44
|
import {
|
|
48
45
|
DropdownMenu,
|
|
49
46
|
DropdownMenuContent,
|
|
@@ -54,26 +51,43 @@ import {
|
|
|
54
51
|
DropdownMenuSubTrigger,
|
|
55
52
|
DropdownMenuTrigger,
|
|
56
53
|
} from "./dropdown-menu";
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
};
|
|
54
|
+
import { MENU_CHECK_CLASS } from "../lib/menu-styles";
|
|
55
|
+
import {
|
|
56
|
+
CODEX_LIVE_MODEL,
|
|
57
|
+
type RealtimeControllerClient,
|
|
58
|
+
type RealtimeModelOption,
|
|
59
|
+
type SessionRealtimeControllerFactory,
|
|
60
|
+
sessionRealtimeLifecycleIsActive,
|
|
61
|
+
useRealtimeModelSelection,
|
|
62
|
+
useSessionRealtime,
|
|
63
|
+
} from "./session-realtime";
|
|
64
|
+
|
|
65
|
+
export {
|
|
66
|
+
codexRealtimeAdmissionAllowed,
|
|
67
|
+
codexRealtimeAdmissionBlocker,
|
|
68
|
+
CODEX_LIVE_MODEL,
|
|
69
|
+
sessionRealtimeLifecycleIsActive,
|
|
70
|
+
useRealtimeModelSelection,
|
|
71
|
+
useSessionRealtime,
|
|
72
|
+
} from "./session-realtime";
|
|
73
|
+
export type { RealtimeModelOption, SessionRealtimeControllerFactory } from "./session-realtime";
|
|
74
|
+
|
|
75
|
+
/** Short status label for a credit/availability refusal (shared with the model menu). */
|
|
76
|
+
function realtimeRefusalLabel(code: string | null | undefined): string | null {
|
|
77
|
+
switch (code) {
|
|
78
|
+
case "insufficient_credits":
|
|
79
|
+
return "Credits needed";
|
|
80
|
+
case "allowance_exhausted":
|
|
81
|
+
case "monthly_model_cost_limit":
|
|
82
|
+
return "Usage limit reached";
|
|
83
|
+
case "realtime_voice_unavailable":
|
|
84
|
+
return "Voice unavailable";
|
|
85
|
+
case "credits_disabled":
|
|
86
|
+
return "Credits off";
|
|
87
|
+
default:
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
77
91
|
|
|
78
92
|
const REALTIME_MODEL_PROVIDERS = [
|
|
79
93
|
"OpenGeni",
|
|
@@ -85,331 +99,30 @@ type RealtimeModelProvider = (typeof REALTIME_MODEL_PROVIDERS)[number];
|
|
|
85
99
|
|
|
86
100
|
const REALTIME_PROVIDER_META: Record<
|
|
87
101
|
RealtimeModelProvider,
|
|
88
|
-
{ billingClass: BillingClass; hint: string }
|
|
102
|
+
{ billingClass: BillingClass; label: string; hint: string }
|
|
89
103
|
> = {
|
|
90
|
-
|
|
104
|
+
// The wire value keeps its historical spelling; the product name is Opengeni.
|
|
105
|
+
OpenGeni: { billingClass: "opengeni_credits", label: "Opengeni", hint: "Uses Opengeni credits" },
|
|
91
106
|
"Connected Codex": {
|
|
92
107
|
billingClass: "codex_subscription",
|
|
108
|
+
label: "Connected Codex",
|
|
93
109
|
hint: "ChatGPT / Codex plan",
|
|
94
110
|
},
|
|
95
111
|
"Connected SuperGrok": {
|
|
96
112
|
billingClass: "supergrok_subscription",
|
|
113
|
+
label: "Connected SuperGrok",
|
|
97
114
|
hint: "SuperGrok / xAI plan",
|
|
98
115
|
},
|
|
99
|
-
"Your Gateway": {
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
type RealtimeControllerClient = EmbeddedRealtimeSessionClientLike & SessionRealtimeClientLike;
|
|
106
|
-
|
|
107
|
-
type RealtimeModelCatalogCacheEntry =
|
|
108
|
-
| { state: "loading"; promise: Promise<RealtimeModelOption[]> }
|
|
109
|
-
| { state: "ready"; models: RealtimeModelOption[]; expiresAt: number };
|
|
110
|
-
|
|
111
|
-
// Scope advisory availability to the exact client object and workspace. The
|
|
112
|
-
// server still authorizes every realtime operation; changing principals should
|
|
113
|
-
// replace the client just as it does for the rest of the SDK state.
|
|
114
|
-
const realtimeModelCatalogCache = new WeakMap<
|
|
115
|
-
RealtimeControllerClient,
|
|
116
|
-
Map<string, RealtimeModelCatalogCacheEntry>
|
|
117
|
-
>();
|
|
118
|
-
|
|
119
|
-
function realtimeModelFallback(codexConnected: boolean): RealtimeModelOption[] {
|
|
120
|
-
return [
|
|
121
|
-
{
|
|
122
|
-
...CODEX_LIVE_MODEL,
|
|
123
|
-
available: codexConnected,
|
|
124
|
-
unavailableReason: codexConnected ? null : CODEX_LIVE_MODEL.unavailableReason,
|
|
125
|
-
},
|
|
126
|
-
];
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
function realtimeModelCatalogCacheFor(
|
|
130
|
-
client: RealtimeControllerClient,
|
|
131
|
-
): Map<string, RealtimeModelCatalogCacheEntry> {
|
|
132
|
-
const existing = realtimeModelCatalogCache.get(client);
|
|
133
|
-
if (existing) return existing;
|
|
134
|
-
const created = new Map<string, RealtimeModelCatalogCacheEntry>();
|
|
135
|
-
realtimeModelCatalogCache.set(client, created);
|
|
136
|
-
return created;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
function readCachedRealtimeModelCatalog(
|
|
140
|
-
client: RealtimeControllerClient,
|
|
141
|
-
workspaceId: string,
|
|
142
|
-
now = Date.now(),
|
|
143
|
-
): RealtimeModelOption[] | null {
|
|
144
|
-
const cache = realtimeModelCatalogCache.get(client);
|
|
145
|
-
const entry = cache?.get(workspaceId);
|
|
146
|
-
if (!entry || entry.state === "loading") return null;
|
|
147
|
-
if (entry.expiresAt > now) return entry.models;
|
|
148
|
-
cache?.delete(workspaceId);
|
|
149
|
-
return null;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
function pruneRealtimeModelCatalogCache(
|
|
153
|
-
cache: Map<string, RealtimeModelCatalogCacheEntry>,
|
|
154
|
-
now: number,
|
|
155
|
-
): void {
|
|
156
|
-
for (const [workspaceId, entry] of cache) {
|
|
157
|
-
if (entry.state === "ready" && entry.expiresAt <= now) cache.delete(workspaceId);
|
|
158
|
-
}
|
|
159
|
-
while (cache.size >= REALTIME_MODEL_CATALOG_CACHE_MAX_WORKSPACES) {
|
|
160
|
-
const oldestWorkspaceId = cache.keys().next().value;
|
|
161
|
-
if (oldestWorkspaceId === undefined) return;
|
|
162
|
-
cache.delete(oldestWorkspaceId);
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
function loadRealtimeModelCatalog(
|
|
167
|
-
client: RealtimeControllerClient,
|
|
168
|
-
workspaceId: string,
|
|
169
|
-
): Promise<RealtimeModelOption[]> | null {
|
|
170
|
-
const load = client.getWorkspaceRealtimeModelCatalog;
|
|
171
|
-
if (!load) return null;
|
|
172
|
-
const now = Date.now();
|
|
173
|
-
const cache = realtimeModelCatalogCacheFor(client);
|
|
174
|
-
const entry = cache.get(workspaceId);
|
|
175
|
-
if (entry?.state === "loading") return entry.promise;
|
|
176
|
-
if (entry?.state === "ready" && entry.expiresAt > now) return Promise.resolve(entry.models);
|
|
177
|
-
if (entry) cache.delete(workspaceId);
|
|
178
|
-
pruneRealtimeModelCatalogCache(cache, now);
|
|
179
|
-
|
|
180
|
-
const promise = load
|
|
181
|
-
.call(client, workspaceId)
|
|
182
|
-
.then((response) => response.models.map(toRealtimeModelOption))
|
|
183
|
-
.then((models) => {
|
|
184
|
-
const current = cache.get(workspaceId);
|
|
185
|
-
if (current?.state === "loading" && current.promise === promise) {
|
|
186
|
-
cache.delete(workspaceId);
|
|
187
|
-
cache.set(workspaceId, {
|
|
188
|
-
state: "ready",
|
|
189
|
-
models,
|
|
190
|
-
expiresAt: Date.now() + REALTIME_MODEL_CATALOG_CACHE_TTL_MS,
|
|
191
|
-
});
|
|
192
|
-
}
|
|
193
|
-
return models;
|
|
194
|
-
})
|
|
195
|
-
.catch((error: unknown) => {
|
|
196
|
-
const current = cache.get(workspaceId);
|
|
197
|
-
if (current?.state === "loading" && current.promise === promise) cache.delete(workspaceId);
|
|
198
|
-
throw error;
|
|
199
|
-
});
|
|
200
|
-
cache.set(workspaceId, { state: "loading", promise });
|
|
201
|
-
return promise;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
export type SessionRealtimeControllerFactory = (
|
|
205
|
-
options: CreateSessionRealtimeControllerOptions,
|
|
206
|
-
) => SessionRealtimeController;
|
|
207
|
-
|
|
208
|
-
type AdmissionInput = {
|
|
209
|
-
sessionStatus: SessionStatus;
|
|
210
|
-
controlState: "active" | "paused";
|
|
211
|
-
settlement: { state: string } | null;
|
|
212
|
-
codexConnected: boolean;
|
|
213
|
-
lifecycleActive: boolean;
|
|
116
|
+
"Your Gateway": {
|
|
117
|
+
billingClass: "byok",
|
|
118
|
+
label: "Your Gateway",
|
|
119
|
+
hint: "Billed to your AI Gateway",
|
|
120
|
+
},
|
|
214
121
|
};
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
return
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
export function codexRealtimeAdmissionBlocker(input: AdmissionInput): string | null {
|
|
221
|
-
if (input.sessionStatus === "cancelled") return "This session was cancelled.";
|
|
222
|
-
if (input.controlState !== "active") return "Resume this session before starting voice.";
|
|
223
|
-
if (input.settlement !== null) return "Wait for the current session transition to finish.";
|
|
224
|
-
if (!input.codexConnected) return "Connect Codex to use this voice model.";
|
|
225
|
-
if (input.lifecycleActive) return "Voice is already active for this session.";
|
|
226
|
-
return null;
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
export function useSessionRealtime(options: {
|
|
230
|
-
client?: RealtimeControllerClient | undefined;
|
|
231
|
-
workspaceId?: string | undefined;
|
|
232
|
-
sessionId: string;
|
|
233
|
-
sessionStatus: SessionStatus;
|
|
234
|
-
effectiveControl: EffectiveSessionControl;
|
|
235
|
-
events: SessionEvent[];
|
|
236
|
-
eventsReady: boolean;
|
|
237
|
-
codexConnected: boolean;
|
|
238
|
-
model?: SessionRealtimeModel | undefined;
|
|
239
|
-
modelAvailable?: boolean | undefined;
|
|
240
|
-
modelUnavailableReason?: string | null | undefined;
|
|
241
|
-
/** Model-visible application context captured with each durable realtime message. */
|
|
242
|
-
getModelContext?: (() => string | undefined) | undefined;
|
|
243
|
-
/** Deterministic browser-test/demo seam. Production hosts should use the SDK default. */
|
|
244
|
-
controllerFactory?: SessionRealtimeControllerFactory | undefined;
|
|
245
|
-
}) {
|
|
246
|
-
const { client, workspaceId } = useEmbeddedRealtimeSession({
|
|
247
|
-
client: options.client,
|
|
248
|
-
workspaceId: options.workspaceId,
|
|
249
|
-
});
|
|
250
|
-
const model = options.model ?? CODEX_LIVE_MODEL.id;
|
|
251
|
-
const audioRef = useRef<HTMLAudioElement>(null);
|
|
252
|
-
const controllerRef = useRef<SessionRealtimeController | null>(null);
|
|
253
|
-
const controllerModelRef = useRef<SessionRealtimeModel | null>(null);
|
|
254
|
-
const modelContextProviderRef = useRef(options.getModelContext);
|
|
255
|
-
modelContextProviderRef.current = options.getModelContext;
|
|
256
|
-
const [snapshot, setSnapshot] = useState<SessionRealtimeControllerSnapshot>(() => ({
|
|
257
|
-
status: hasStoredSessionRealtimeOwnerProof({
|
|
258
|
-
workspaceId,
|
|
259
|
-
sessionId: options.sessionId,
|
|
260
|
-
model,
|
|
261
|
-
})
|
|
262
|
-
? "recovering"
|
|
263
|
-
: "idle",
|
|
264
|
-
realtimeId: null,
|
|
265
|
-
mode: null,
|
|
266
|
-
bridge: null,
|
|
267
|
-
microphone: "inactive",
|
|
268
|
-
inputMuted: false,
|
|
269
|
-
audibleOutput: "inactive",
|
|
270
|
-
outputMuted: false,
|
|
271
|
-
connectionGeneration: 0,
|
|
272
|
-
reconnectAttempt: 0,
|
|
273
|
-
diagnostic: null,
|
|
274
|
-
error: null,
|
|
275
|
-
}));
|
|
276
|
-
const lifecycle = useMemo(
|
|
277
|
-
() => projectSessionRealtimeLifecycle(options.events),
|
|
278
|
-
[options.events],
|
|
279
|
-
);
|
|
280
|
-
const lifecycleRef = useRef(lifecycle);
|
|
281
|
-
const eventsReadyRef = useRef(options.eventsReady);
|
|
282
|
-
lifecycleRef.current = lifecycle;
|
|
283
|
-
eventsReadyRef.current = options.eventsReady;
|
|
284
|
-
const lifecycleActive = sessionRealtimeLifecycleIsActive(lifecycle);
|
|
285
|
-
|
|
286
|
-
useEffect(() => {
|
|
287
|
-
let disposed = false;
|
|
288
|
-
let controller: SessionRealtimeController | null = null;
|
|
289
|
-
let unsubscribe: (() => void) | null = null;
|
|
290
|
-
void import("@opengeni/sdk/realtime")
|
|
291
|
-
.then(({ createSessionRealtimeController }) => {
|
|
292
|
-
if (disposed) return;
|
|
293
|
-
const controllerFactory = options.controllerFactory ?? createSessionRealtimeController;
|
|
294
|
-
controller = controllerFactory({
|
|
295
|
-
client,
|
|
296
|
-
workspaceId,
|
|
297
|
-
sessionId: options.sessionId,
|
|
298
|
-
...(audioRef.current ? { remoteAudio: audioRef.current } : {}),
|
|
299
|
-
model,
|
|
300
|
-
getModelContext: () => modelContextProviderRef.current?.(),
|
|
301
|
-
});
|
|
302
|
-
controllerRef.current = controller;
|
|
303
|
-
controllerModelRef.current = model;
|
|
304
|
-
unsubscribe = controller.subscribe(setSnapshot);
|
|
305
|
-
if (eventsReadyRef.current) {
|
|
306
|
-
void controller.observeLifecycle(lifecycleRef.current).catch(() => undefined);
|
|
307
|
-
}
|
|
308
|
-
})
|
|
309
|
-
.catch((error: unknown) => {
|
|
310
|
-
if (disposed) return;
|
|
311
|
-
setSnapshot({
|
|
312
|
-
status: "error",
|
|
313
|
-
realtimeId: null,
|
|
314
|
-
mode: null,
|
|
315
|
-
bridge: null,
|
|
316
|
-
microphone: "inactive",
|
|
317
|
-
inputMuted: false,
|
|
318
|
-
audibleOutput: "inactive",
|
|
319
|
-
outputMuted: false,
|
|
320
|
-
connectionGeneration: 0,
|
|
321
|
-
reconnectAttempt: 0,
|
|
322
|
-
diagnostic: {
|
|
323
|
-
kind: "negotiation_failure",
|
|
324
|
-
message:
|
|
325
|
-
error instanceof Error ? error.message : "Codex realtime controller failed to load",
|
|
326
|
-
recoverable: false,
|
|
327
|
-
connectionGeneration: 0,
|
|
328
|
-
attempt: 0,
|
|
329
|
-
},
|
|
330
|
-
error:
|
|
331
|
-
error instanceof Error ? error.message : "Codex realtime controller failed to load",
|
|
332
|
-
});
|
|
333
|
-
});
|
|
334
|
-
return () => {
|
|
335
|
-
disposed = true;
|
|
336
|
-
unsubscribe?.();
|
|
337
|
-
controller?.close();
|
|
338
|
-
if (controllerRef.current === controller) {
|
|
339
|
-
controllerRef.current = null;
|
|
340
|
-
controllerModelRef.current = null;
|
|
341
|
-
}
|
|
342
|
-
};
|
|
343
|
-
}, [client, model, options.controllerFactory, options.sessionId, workspaceId]);
|
|
344
|
-
|
|
345
|
-
useEffect(() => {
|
|
346
|
-
if (!options.eventsReady) return;
|
|
347
|
-
void controllerRef.current?.observeLifecycle(lifecycle).catch(() => undefined);
|
|
348
|
-
}, [lifecycle, options.eventsReady]);
|
|
349
|
-
|
|
350
|
-
const start = useCallback(async () => {
|
|
351
|
-
const controller = controllerRef.current;
|
|
352
|
-
if (!controller || controllerModelRef.current !== model) {
|
|
353
|
-
throw new Error("The selected voice model is still preparing");
|
|
354
|
-
}
|
|
355
|
-
await controller.start();
|
|
356
|
-
}, [model]);
|
|
357
|
-
const stop = useCallback(async () => {
|
|
358
|
-
await controllerRef.current?.stop();
|
|
359
|
-
}, []);
|
|
360
|
-
const retry = useCallback(async () => {
|
|
361
|
-
await controllerRef.current?.retry();
|
|
362
|
-
}, []);
|
|
363
|
-
const retryAudibleOutput = useCallback(async () => {
|
|
364
|
-
await controllerRef.current?.retryAudibleOutput();
|
|
365
|
-
}, []);
|
|
366
|
-
const setInputMuted = useCallback((muted: boolean) => {
|
|
367
|
-
controllerRef.current?.setInputMuted(muted);
|
|
368
|
-
}, []);
|
|
369
|
-
const setOutputMuted = useCallback((muted: boolean) => {
|
|
370
|
-
controllerRef.current?.setOutputMuted(muted);
|
|
371
|
-
}, []);
|
|
372
|
-
const admissionInput = {
|
|
373
|
-
sessionStatus: options.sessionStatus,
|
|
374
|
-
controlState: options.effectiveControl.state,
|
|
375
|
-
settlement: options.effectiveControl.settlement,
|
|
376
|
-
codexConnected: options.modelAvailable ?? options.codexConnected,
|
|
377
|
-
lifecycleActive,
|
|
378
|
-
} satisfies AdmissionInput;
|
|
379
|
-
const admissionBlocker =
|
|
380
|
-
options.modelAvailable === false
|
|
381
|
-
? (options.modelUnavailableReason ?? "This voice model is unavailable.")
|
|
382
|
-
: codexRealtimeAdmissionBlocker(admissionInput);
|
|
383
|
-
const canStart =
|
|
384
|
-
controllerRef.current !== null &&
|
|
385
|
-
controllerModelRef.current === model &&
|
|
386
|
-
["idle", "error"].includes(snapshot.status) &&
|
|
387
|
-
admissionBlocker === null;
|
|
388
|
-
|
|
389
|
-
return {
|
|
390
|
-
snapshot,
|
|
391
|
-
lifecycleActive,
|
|
392
|
-
canStart,
|
|
393
|
-
admissionBlocker,
|
|
394
|
-
codexConnected: options.codexConnected,
|
|
395
|
-
audioRef,
|
|
396
|
-
start,
|
|
397
|
-
stop,
|
|
398
|
-
retry,
|
|
399
|
-
retryAudibleOutput,
|
|
400
|
-
setInputMuted,
|
|
401
|
-
setOutputMuted,
|
|
402
|
-
};
|
|
403
|
-
}
|
|
404
|
-
|
|
405
|
-
function sessionRealtimeLifecycleIsActive(
|
|
406
|
-
lifecycle: SessionRealtimeLifecycleProjection | null,
|
|
407
|
-
): boolean {
|
|
408
|
-
if (lifecycle?.state !== "active") return false;
|
|
409
|
-
const leaseExpiresAt = Date.parse(lifecycle.leaseExpiresAt);
|
|
410
|
-
return !Number.isFinite(leaseExpiresAt) || leaseExpiresAt > Date.now();
|
|
122
|
+
/** Display name; the catalog's `provider` value stays the wire identifier. */
|
|
123
|
+
function realtimeProviderLabel(provider: RealtimeModelProvider): string {
|
|
124
|
+
return provider === "OpenGeni" ? "Opengeni" : provider;
|
|
411
125
|
}
|
|
412
|
-
|
|
413
126
|
export function SessionRealtimeControl(props: {
|
|
414
127
|
client?: RealtimeControllerClient | undefined;
|
|
415
128
|
workspaceId?: string | undefined;
|
|
@@ -464,6 +177,7 @@ export function SessionRealtimeControl(props: {
|
|
|
464
177
|
useEffect(() => {
|
|
465
178
|
onVoiceActiveChange?.(voiceActive);
|
|
466
179
|
}, [onVoiceActiveChange, voiceActive]);
|
|
180
|
+
useEffect(() => () => onVoiceActiveChange?.(false), [onVoiceActiveChange]);
|
|
467
181
|
|
|
468
182
|
useEffect(() => {
|
|
469
183
|
const pending = autostartModelRef.current;
|
|
@@ -476,14 +190,13 @@ export function SessionRealtimeControl(props: {
|
|
|
476
190
|
}
|
|
477
191
|
if (!canStart) return;
|
|
478
192
|
autostartStartedRef.current = true;
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
});
|
|
193
|
+
// One automatic attempt. A failed start stays visible with its reason and
|
|
194
|
+
// the user retries explicitly; re-arming would loop on a definitive refusal.
|
|
195
|
+
const consume = () => {
|
|
196
|
+
autostartModelRef.current = null;
|
|
197
|
+
onRealtimeAutostartConsumed?.();
|
|
198
|
+
};
|
|
199
|
+
void start().then(consume, consume);
|
|
487
200
|
}, [
|
|
488
201
|
canStart,
|
|
489
202
|
lifecycleActive,
|
|
@@ -519,94 +232,6 @@ export function SessionRealtimeControl(props: {
|
|
|
519
232
|
);
|
|
520
233
|
}
|
|
521
234
|
|
|
522
|
-
export function useRealtimeModelSelection(options: {
|
|
523
|
-
client?: RealtimeControllerClient | undefined;
|
|
524
|
-
workspaceId?: string | undefined;
|
|
525
|
-
codexConnected: boolean;
|
|
526
|
-
activeModel?: SessionRealtimeModel | null | undefined;
|
|
527
|
-
}) {
|
|
528
|
-
const { client, workspaceId } = useEmbeddedRealtimeSession({
|
|
529
|
-
client: options.client,
|
|
530
|
-
workspaceId: options.workspaceId,
|
|
531
|
-
});
|
|
532
|
-
const activeModel = options.activeModel;
|
|
533
|
-
const initialCachedCatalog = readCachedRealtimeModelCatalog(client, workspaceId);
|
|
534
|
-
const [catalog, setCatalog] = useState<RealtimeModelOption[]>(
|
|
535
|
-
() => initialCachedCatalog ?? realtimeModelFallback(options.codexConnected),
|
|
536
|
-
);
|
|
537
|
-
const catalogScopeRef = useRef({
|
|
538
|
-
client,
|
|
539
|
-
workspaceId,
|
|
540
|
-
source: initialCachedCatalog ? ("cache" as const) : ("fallback" as const),
|
|
541
|
-
});
|
|
542
|
-
const [selectedModelId, setSelectedModelId] = useState<SessionRealtimeModel>(() => {
|
|
543
|
-
const preferred = readRealtimeModelPreference(workspaceId) ?? CODEX_LIVE_MODEL.id;
|
|
544
|
-
if (!initialCachedCatalog) return preferred;
|
|
545
|
-
if (initialCachedCatalog.some((model) => model.id === preferred && model.available)) {
|
|
546
|
-
return preferred;
|
|
547
|
-
}
|
|
548
|
-
return initialCachedCatalog.find((model) => model.available)?.id ?? CODEX_LIVE_MODEL.id;
|
|
549
|
-
});
|
|
550
|
-
|
|
551
|
-
useEffect(() => {
|
|
552
|
-
let disposed = false;
|
|
553
|
-
const applyCatalog = (models: RealtimeModelOption[]) => {
|
|
554
|
-
catalogScopeRef.current = { client, workspaceId, source: "cache" };
|
|
555
|
-
setCatalog(models);
|
|
556
|
-
setSelectedModelId((current) => {
|
|
557
|
-
if (models.some((model) => model.id === current && model.available)) return current;
|
|
558
|
-
return models.find((model) => model.available)?.id ?? CODEX_LIVE_MODEL.id;
|
|
559
|
-
});
|
|
560
|
-
};
|
|
561
|
-
const cached = readCachedRealtimeModelCatalog(client, workspaceId);
|
|
562
|
-
if (cached) {
|
|
563
|
-
const scope = catalogScopeRef.current;
|
|
564
|
-
if (
|
|
565
|
-
scope.client !== client ||
|
|
566
|
-
scope.workspaceId !== workspaceId ||
|
|
567
|
-
scope.source !== "cache"
|
|
568
|
-
) {
|
|
569
|
-
applyCatalog(cached);
|
|
570
|
-
}
|
|
571
|
-
return;
|
|
572
|
-
}
|
|
573
|
-
const loading = loadRealtimeModelCatalog(client, workspaceId);
|
|
574
|
-
if (!loading) return;
|
|
575
|
-
void loading
|
|
576
|
-
.then((models) => {
|
|
577
|
-
if (disposed) return;
|
|
578
|
-
applyCatalog(models);
|
|
579
|
-
})
|
|
580
|
-
.catch(() => undefined);
|
|
581
|
-
return () => {
|
|
582
|
-
disposed = true;
|
|
583
|
-
};
|
|
584
|
-
}, [client, workspaceId]);
|
|
585
|
-
|
|
586
|
-
useEffect(() => {
|
|
587
|
-
if (activeModel) setSelectedModelId(activeModel);
|
|
588
|
-
}, [activeModel]);
|
|
589
|
-
|
|
590
|
-
const selectedModel =
|
|
591
|
-
catalog.find((model) => model.id === selectedModelId) ??
|
|
592
|
-
({
|
|
593
|
-
...CODEX_LIVE_MODEL,
|
|
594
|
-
available: options.codexConnected,
|
|
595
|
-
unavailableReason: options.codexConnected ? null : CODEX_LIVE_MODEL.unavailableReason,
|
|
596
|
-
} satisfies RealtimeModelOption);
|
|
597
|
-
const selectModel = useCallback(
|
|
598
|
-
(value: string) => {
|
|
599
|
-
const model = catalog.find((candidate) => candidate.id === value);
|
|
600
|
-
if (!model || !model.available || activeModel) return;
|
|
601
|
-
setSelectedModelId(model.id);
|
|
602
|
-
writeRealtimeModelPreference(workspaceId, model.id);
|
|
603
|
-
},
|
|
604
|
-
[activeModel, catalog, workspaceId],
|
|
605
|
-
);
|
|
606
|
-
|
|
607
|
-
return { models: catalog, selectedModel, selectModel };
|
|
608
|
-
}
|
|
609
|
-
|
|
610
235
|
const IDLE_REALTIME_SNAPSHOT: SessionRealtimeControllerSnapshot = {
|
|
611
236
|
status: "idle",
|
|
612
237
|
realtimeId: null,
|
|
@@ -772,6 +397,7 @@ export function RealtimeVoiceControl(props: {
|
|
|
772
397
|
props.canStart,
|
|
773
398
|
props.admissionBlocker ?? null,
|
|
774
399
|
selectedModel.label,
|
|
400
|
+
selectedModel.unavailableCode ?? null,
|
|
775
401
|
);
|
|
776
402
|
const modeOwned = props.snapshot.mode?.state === "active";
|
|
777
403
|
const retryConnection =
|
|
@@ -780,6 +406,11 @@ export function RealtimeVoiceControl(props: {
|
|
|
780
406
|
props.snapshot.status !== "active" &&
|
|
781
407
|
props.snapshot.diagnostic?.recoverable === true;
|
|
782
408
|
const audioBlocked = props.snapshot.audibleOutput === "blocked" && !props.snapshot.outputMuted;
|
|
409
|
+
// A call that ended in a failure keeps its reason on screen, not only in a
|
|
410
|
+
// tooltip or the model menu, until the user starts again or changes model.
|
|
411
|
+
const startFailed = props.snapshot.status === "error" && !modeOwned;
|
|
412
|
+
const failureText =
|
|
413
|
+
status.label === "Voice unavailable" ? status.detail : `${status.label}. ${status.detail}`;
|
|
783
414
|
const mainDisabled =
|
|
784
415
|
props.snapshot.status === "stopping" ||
|
|
785
416
|
props.snapshot.status === "lost_owner" ||
|
|
@@ -791,7 +422,11 @@ export function RealtimeVoiceControl(props: {
|
|
|
791
422
|
? "Retry voice connection"
|
|
792
423
|
: modeOwned
|
|
793
424
|
? "End voice conversation"
|
|
794
|
-
:
|
|
425
|
+
: !props.canStart && status.phase === "unavailable"
|
|
426
|
+
? `${status.label}: ${status.detail}`
|
|
427
|
+
: startFailed
|
|
428
|
+
? `Try voice again with ${selectedModel.label}`
|
|
429
|
+
: `Start voice with ${selectedModel.label}`;
|
|
795
430
|
const runMainAction = audioBlocked
|
|
796
431
|
? props.onRetryAudibleOutput
|
|
797
432
|
: retryConnection
|
|
@@ -808,6 +443,20 @@ export function RealtimeVoiceControl(props: {
|
|
|
808
443
|
selectedModel.provider,
|
|
809
444
|
);
|
|
810
445
|
const [pickerDirection, setPickerDirection] = useState<1 | -1>(1);
|
|
446
|
+
const [failureDismissed, setFailureDismissed] = useState(false);
|
|
447
|
+
useEffect(() => {
|
|
448
|
+
if (!startFailed) setFailureDismissed(false);
|
|
449
|
+
}, [startFailed]);
|
|
450
|
+
const rootRef = useRef<HTMLDivElement>(null);
|
|
451
|
+
useEffect(() => {
|
|
452
|
+
if (!startFailed) return;
|
|
453
|
+
// Starting dictation in this composer supersedes a stale start failure.
|
|
454
|
+
const scope = composerVoiceEventScope(rootRef.current);
|
|
455
|
+
if (!scope) return;
|
|
456
|
+
const dismiss = () => setFailureDismissed(true);
|
|
457
|
+
scope.addEventListener(COMPOSER_VOICE_INPUT_START_EVENT, dismiss);
|
|
458
|
+
return () => scope.removeEventListener(COMPOSER_VOICE_INPUT_START_EVENT, dismiss);
|
|
459
|
+
}, [startFailed]);
|
|
811
460
|
|
|
812
461
|
useEffect(() => {
|
|
813
462
|
if (!pickerOpen) setPickerProvider(selectedModel.provider);
|
|
@@ -815,6 +464,7 @@ export function RealtimeVoiceControl(props: {
|
|
|
815
464
|
|
|
816
465
|
return (
|
|
817
466
|
<div
|
|
467
|
+
ref={rootRef}
|
|
818
468
|
role="group"
|
|
819
469
|
aria-label="Realtime voice"
|
|
820
470
|
data-picker-side={props.menuSide ?? "top"}
|
|
@@ -896,6 +546,20 @@ export function RealtimeVoiceControl(props: {
|
|
|
896
546
|
</motion.div>
|
|
897
547
|
) : null}
|
|
898
548
|
</AnimatePresence>
|
|
549
|
+
{startFailed && !failureDismissed ? (
|
|
550
|
+
<button
|
|
551
|
+
type="button"
|
|
552
|
+
data-realtime-attention=""
|
|
553
|
+
data-testid="realtime-failure-reason"
|
|
554
|
+
title="Dismiss"
|
|
555
|
+
aria-label={`Dismiss: ${failureText}`}
|
|
556
|
+
onClick={() => setFailureDismissed(true)}
|
|
557
|
+
className="og-realtime-failure mr-1.5 inline-flex min-w-0 items-center gap-1 rounded-og-sm text-right text-og-xs leading-tight text-og-status-failed outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent/45"
|
|
558
|
+
>
|
|
559
|
+
<span className="og-realtime-failure-label line-clamp-2 max-w-56">{failureText}</span>
|
|
560
|
+
<XIcon className="size-3 shrink-0 opacity-70" aria-hidden />
|
|
561
|
+
</button>
|
|
562
|
+
) : null}
|
|
899
563
|
<div className="inline-flex shrink-0 items-center">
|
|
900
564
|
<motion.button
|
|
901
565
|
type="button"
|
|
@@ -956,7 +620,7 @@ export function RealtimeVoiceControl(props: {
|
|
|
956
620
|
align="end"
|
|
957
621
|
sideOffset={8}
|
|
958
622
|
collisionPadding={12}
|
|
959
|
-
className="og-realtime-menu flex w-72 max-h-[min(20rem,var(--radix-dropdown-menu-content-available-height))] flex-col overflow-hidden
|
|
623
|
+
className="og-realtime-menu flex w-72 max-h-[min(20rem,var(--radix-dropdown-menu-content-available-height))] flex-col overflow-hidden"
|
|
960
624
|
onCloseAutoFocus={(event) => event.preventDefault()}
|
|
961
625
|
>
|
|
962
626
|
<div className="min-h-0 flex-1 overflow-y-auto overscroll-contain">
|
|
@@ -979,9 +643,15 @@ export function RealtimeVoiceControl(props: {
|
|
|
979
643
|
/>
|
|
980
644
|
</div>
|
|
981
645
|
|
|
982
|
-
{status.phase !== "idle"
|
|
646
|
+
{status.phase !== "idle" &&
|
|
647
|
+
// Say it once: the selected model's row already carries its reason.
|
|
648
|
+
!(
|
|
649
|
+
status.phase === "unavailable" &&
|
|
650
|
+
pickerProvider === selectedModel.provider &&
|
|
651
|
+
selectedModel.unavailableReason === status.detail
|
|
652
|
+
) ? (
|
|
983
653
|
<>
|
|
984
|
-
<DropdownMenuSeparator
|
|
654
|
+
<DropdownMenuSeparator />
|
|
985
655
|
<div className="px-2.5 py-2" role="status" aria-live="polite">
|
|
986
656
|
<div className="flex items-center gap-2 text-og-sm font-medium text-og-fg">
|
|
987
657
|
<RealtimeStatusDot
|
|
@@ -997,7 +667,6 @@ export function RealtimeVoiceControl(props: {
|
|
|
997
667
|
|
|
998
668
|
{audioBlocked ? (
|
|
999
669
|
<DropdownMenuItem
|
|
1000
|
-
className="rounded-og-md"
|
|
1001
670
|
onSelect={() => void props.onRetryAudibleOutput().catch(() => undefined)}
|
|
1002
671
|
>
|
|
1003
672
|
<Volume2Icon />
|
|
@@ -1005,10 +674,7 @@ export function RealtimeVoiceControl(props: {
|
|
|
1005
674
|
</DropdownMenuItem>
|
|
1006
675
|
) : null}
|
|
1007
676
|
{retryConnection ? (
|
|
1008
|
-
<DropdownMenuItem
|
|
1009
|
-
className="rounded-og-md"
|
|
1010
|
-
onSelect={() => void props.onRetry().catch(() => undefined)}
|
|
1011
|
-
>
|
|
677
|
+
<DropdownMenuItem onSelect={() => void props.onRetry().catch(() => undefined)}>
|
|
1012
678
|
<RotateCcwIcon />
|
|
1013
679
|
Retry connection
|
|
1014
680
|
</DropdownMenuItem>
|
|
@@ -1016,7 +682,6 @@ export function RealtimeVoiceControl(props: {
|
|
|
1016
682
|
{modeOwned && props.snapshot.status !== "lost_owner" ? (
|
|
1017
683
|
<DropdownMenuItem
|
|
1018
684
|
variant="destructive"
|
|
1019
|
-
className="rounded-og-md"
|
|
1020
685
|
disabled={props.snapshot.status === "stopping"}
|
|
1021
686
|
onSelect={() => void props.onStop().catch(() => undefined)}
|
|
1022
687
|
>
|
|
@@ -1056,16 +721,14 @@ export function RealtimeVoiceModelPanel(props: {
|
|
|
1056
721
|
|
|
1057
722
|
return (
|
|
1058
723
|
<div className="flex min-h-0 flex-1 flex-col" data-testid="realtime-voice-model-panel">
|
|
1059
|
-
<div className="flex shrink-0 items-
|
|
724
|
+
<div className="flex min-h-10 shrink-0 items-center gap-2 border-b border-og-border px-2 pb-2">
|
|
1060
725
|
{props.leading}
|
|
1061
|
-
<div className="min-w-0">
|
|
1062
|
-
<div className="text-og-menu font-medium text-og-fg">Voice model</div>
|
|
1063
|
-
<p className="mt-0.5 text-og-control text-og-fg-subtle">
|
|
1064
|
-
Used when you start a voice conversation.
|
|
1065
|
-
</p>
|
|
1066
|
-
</div>
|
|
726
|
+
<div className="min-w-0 flex-1 text-og-menu font-medium text-og-fg">Voice model</div>
|
|
1067
727
|
</div>
|
|
1068
|
-
<div className="min-h-0 flex-1 overflow-y-auto overscroll-contain
|
|
728
|
+
<div className="min-h-0 flex-1 overflow-y-auto overscroll-contain p-2">
|
|
729
|
+
<p className="mb-3 text-og-control text-og-fg-muted">
|
|
730
|
+
Used when you start a voice conversation.
|
|
731
|
+
</p>
|
|
1069
732
|
<RealtimeModelPickerMenu
|
|
1070
733
|
models={props.models}
|
|
1071
734
|
selectedModel={props.selectedModel}
|
|
@@ -1153,7 +816,7 @@ export function RealtimeModelPickerMenu(props: {
|
|
|
1153
816
|
const body = props.provider ? (
|
|
1154
817
|
<div data-testid="realtime-model-picker-models">
|
|
1155
818
|
<PickerBackHeader
|
|
1156
|
-
label={props.provider}
|
|
819
|
+
label={realtimeProviderLabel(props.provider)}
|
|
1157
820
|
icon={
|
|
1158
821
|
<BillingClassMark
|
|
1159
822
|
billingClass={REALTIME_PROVIDER_META[props.provider].billingClass}
|
|
@@ -1179,7 +842,9 @@ export function RealtimeModelPickerMenu(props: {
|
|
|
1179
842
|
title={model.unavailableReason ?? model.description}
|
|
1180
843
|
active={selected}
|
|
1181
844
|
showChevron={false}
|
|
1182
|
-
trailing={
|
|
845
|
+
trailing={
|
|
846
|
+
selected ? <CheckIcon className={MENU_CHECK_CLASS} aria-hidden /> : undefined
|
|
847
|
+
}
|
|
1183
848
|
testId={`realtime-model-choice-${model.id}`}
|
|
1184
849
|
onClick={() => props.onSelect(model.id)}
|
|
1185
850
|
/>
|
|
@@ -1194,7 +859,7 @@ export function RealtimeModelPickerMenu(props: {
|
|
|
1194
859
|
return (
|
|
1195
860
|
<PickerNavRow
|
|
1196
861
|
key={provider}
|
|
1197
|
-
label={provider}
|
|
862
|
+
label={realtimeProviderLabel(provider)}
|
|
1198
863
|
hint={meta.hint}
|
|
1199
864
|
icon={<BillingClassMark billingClass={meta.billingClass} aria-label="" />}
|
|
1200
865
|
active={props.selectedModel.provider === provider}
|
|
@@ -1242,12 +907,12 @@ function RealtimeDiagnosticsMenu({ snapshot }: { snapshot: SessionRealtimeContro
|
|
|
1242
907
|
|
|
1243
908
|
return (
|
|
1244
909
|
<>
|
|
1245
|
-
<DropdownMenuSeparator
|
|
910
|
+
<DropdownMenuSeparator />
|
|
1246
911
|
<DropdownMenuSub>
|
|
1247
|
-
<DropdownMenuSubTrigger className="
|
|
912
|
+
<DropdownMenuSubTrigger className="text-og-fg-muted">
|
|
1248
913
|
Realtime diagnostics
|
|
1249
914
|
</DropdownMenuSubTrigger>
|
|
1250
|
-
<DropdownMenuSubContent className="max-h-80 w-72 overflow-y-auto
|
|
915
|
+
<DropdownMenuSubContent className="max-h-80 w-72 overflow-y-auto">
|
|
1251
916
|
{rows.map(([label, value]) => (
|
|
1252
917
|
<DropdownMenuItem
|
|
1253
918
|
key={label}
|
|
@@ -1282,6 +947,7 @@ function statusContent(
|
|
|
1282
947
|
canStart: boolean,
|
|
1283
948
|
admissionBlocker: string | null,
|
|
1284
949
|
modelLabel: string,
|
|
950
|
+
unavailableCode: string | null = null,
|
|
1285
951
|
): { phase: RealtimeVisualPhase; label: string; detail: string } {
|
|
1286
952
|
if (snapshot.audibleOutput === "blocked" && !snapshot.outputMuted) {
|
|
1287
953
|
return {
|
|
@@ -1328,6 +994,13 @@ function statusContent(
|
|
|
1328
994
|
detail: "Return to the browser that started it, or wait for that connection to expire.",
|
|
1329
995
|
};
|
|
1330
996
|
case "error":
|
|
997
|
+
if (snapshot.refusal) {
|
|
998
|
+
return {
|
|
999
|
+
phase: "unavailable",
|
|
1000
|
+
label: realtimeRefusalLabel(snapshot.refusal.code) ?? "Voice unavailable",
|
|
1001
|
+
detail: snapshot.refusal.message,
|
|
1002
|
+
};
|
|
1003
|
+
}
|
|
1331
1004
|
return {
|
|
1332
1005
|
phase: "error",
|
|
1333
1006
|
label: "Voice unavailable",
|
|
@@ -1337,7 +1010,7 @@ function statusContent(
|
|
|
1337
1010
|
if (!modelAvailable) {
|
|
1338
1011
|
return {
|
|
1339
1012
|
phase: "unavailable",
|
|
1340
|
-
label: "Voice model unavailable",
|
|
1013
|
+
label: realtimeRefusalLabel(unavailableCode) ?? "Voice model unavailable",
|
|
1341
1014
|
detail: admissionBlocker ?? "Choose another voice model.",
|
|
1342
1015
|
};
|
|
1343
1016
|
}
|
|
@@ -1479,7 +1152,7 @@ function RealtimeStatusDot(props: { phase: RealtimeVisualPhase; reduceMotion: bo
|
|
|
1479
1152
|
|
|
1480
1153
|
function voiceButtonTone(phase: RealtimeVisualPhase): string {
|
|
1481
1154
|
if (phase === "listening" || phase === "speaking") {
|
|
1482
|
-
return "border border-og-
|
|
1155
|
+
return "border border-og-primary-border bg-og-primary text-og-primary-fg hover:bg-og-primary-hover";
|
|
1483
1156
|
}
|
|
1484
1157
|
if (phase === "blocked" || phase === "error") {
|
|
1485
1158
|
return "border border-og-status-waiting/35 bg-og-status-waiting/10 text-og-status-waiting hover:bg-og-status-waiting/15";
|
|
@@ -1493,7 +1166,7 @@ function voiceButtonTone(phase: RealtimeVisualPhase): string {
|
|
|
1493
1166
|
|
|
1494
1167
|
function voiceChevronTone(phase: RealtimeVisualPhase): string {
|
|
1495
1168
|
if (phase === "listening" || phase === "speaking") {
|
|
1496
|
-
return "border border-l-0 border-og-
|
|
1169
|
+
return "border border-l-0 border-og-primary-border bg-og-primary text-og-primary-fg hover:bg-og-primary-hover";
|
|
1497
1170
|
}
|
|
1498
1171
|
if (phase === "blocked" || phase === "error") {
|
|
1499
1172
|
return "border border-l-0 border-og-status-waiting/35 bg-og-status-waiting/10 text-og-status-waiting hover:bg-og-status-waiting/15";
|
|
@@ -1504,42 +1177,6 @@ function voiceChevronTone(phase: RealtimeVisualPhase): string {
|
|
|
1504
1177
|
return "text-og-fg-muted hover:bg-og-surface-2 hover:text-og-fg";
|
|
1505
1178
|
}
|
|
1506
1179
|
|
|
1507
|
-
function toRealtimeModelOption(model: WorkspaceRealtimeModelCatalogItem): RealtimeModelOption {
|
|
1508
|
-
return { ...model };
|
|
1509
|
-
}
|
|
1510
|
-
|
|
1511
|
-
function readRealtimeModelPreference(workspaceId: string): SessionRealtimeModel | null {
|
|
1512
|
-
if (typeof localStorage === "undefined") return null;
|
|
1513
|
-
try {
|
|
1514
|
-
const value = localStorage.getItem(`${REALTIME_MODEL_STORAGE_PREFIX}:${workspaceId}`);
|
|
1515
|
-
return isRealtimeModel(value) ? value : null;
|
|
1516
|
-
} catch {
|
|
1517
|
-
return null;
|
|
1518
|
-
}
|
|
1519
|
-
}
|
|
1520
|
-
|
|
1521
|
-
function writeRealtimeModelPreference(workspaceId: string, model: SessionRealtimeModel): void {
|
|
1522
|
-
if (typeof localStorage === "undefined") return;
|
|
1523
|
-
try {
|
|
1524
|
-
localStorage.setItem(`${REALTIME_MODEL_STORAGE_PREFIX}:${workspaceId}`, model);
|
|
1525
|
-
} catch {
|
|
1526
|
-
// Voice selection still works when browser storage is unavailable.
|
|
1527
|
-
}
|
|
1528
|
-
}
|
|
1529
|
-
|
|
1530
|
-
function isRealtimeModel(value: string | null): value is SessionRealtimeModel {
|
|
1531
|
-
return (
|
|
1532
|
-
value === "gpt-live-1-boulder-alpha" ||
|
|
1533
|
-
value === "opengeni-gateway/openai/gpt-realtime-2.1" ||
|
|
1534
|
-
value === "opengeni-gateway/openai/gpt-realtime-mini" ||
|
|
1535
|
-
value === "opengeni-gateway/xai/grok-voice-think-fast-2.0" ||
|
|
1536
|
-
value === "supergrok/grok-voice-think-fast-2.0" ||
|
|
1537
|
-
value === "workspace-gateway/openai/gpt-realtime-2.1" ||
|
|
1538
|
-
value === "workspace-gateway/openai/gpt-realtime-mini" ||
|
|
1539
|
-
value === "workspace-gateway/xai/grok-voice-think-fast-2.0"
|
|
1540
|
-
);
|
|
1541
|
-
}
|
|
1542
|
-
|
|
1543
1180
|
/** @deprecated Use the provider-neutral realtime names. */
|
|
1544
1181
|
export const useSessionCodexRealtime = useSessionRealtime;
|
|
1545
1182
|
/** @deprecated Use the provider-neutral realtime names. */
|