@opengeni/react 3.3.2 → 3.4.1-canary.38960406141001
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 +2 -0
- 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-4EUKJXUO.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-XYRDDSXF.js → chunk-2I6R3GCZ.js} +4285 -3980
- package/dist/chunk-2I6R3GCZ.js.map +1 -0
- package/dist/{chunk-JAQ5K7W6.js → chunk-2SFFYIH3.js} +1178 -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-3RJKUVCA.js +14068 -0
- package/dist/chunk-3RJKUVCA.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-ZPBTI3TE.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-YVCHAQZY.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-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-IOLVN74D.js → chunk-V5ZUJT2T.js} +175 -42
- package/dist/chunk-V5ZUJT2T.js.map +1 -0
- package/dist/chunk-WBJY57A3.js +402 -0
- package/dist/chunk-WBJY57A3.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-3AGBGTRT.js → chunk-X5UVUIMF.js} +1712 -1174
- 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/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 +35 -28
- 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/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 +26 -5
- 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 +24 -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 +2340 -6603
- 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 -1333
- 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/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 +106 -7
- 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 +193 -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 +5 -3
- 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 +2370 -667
- 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 +252 -429
- 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/tool-action-review.tsx +650 -0
- package/src/components/tool-review-history.tsx +88 -0
- 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 +2 -2
- 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 +227 -44
- 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 +79 -9
- package/src/hooks/use-last-started-turn-policy.ts +37 -11
- 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 +531 -335
- 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 +30 -2
- 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 +74 -7
- 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 +205 -10
- 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 -550
- 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/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 +1742 -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-MKKFRRRV.js +0 -14
- package/dist/chunk-2DZVYHVO.js +0 -470
- package/dist/chunk-2DZVYHVO.js.map +0 -1
- package/dist/chunk-3AGBGTRT.js.map +0 -1
- package/dist/chunk-4MDLEHXL.js.map +0 -1
- package/dist/chunk-5YK2ZDIG.js.map +0 -1
- package/dist/chunk-7EAFGICR.js +0 -302
- package/dist/chunk-7EAFGICR.js.map +0 -1
- package/dist/chunk-ELIYWBZR.js.map +0 -1
- package/dist/chunk-H5YGYNXS.js.map +0 -1
- package/dist/chunk-HUIKIDM5.js.map +0 -1
- package/dist/chunk-ICA6R6TW.js.map +0 -1
- package/dist/chunk-IOLVN74D.js.map +0 -1
- package/dist/chunk-JAQ5K7W6.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-NEXLLTP4.js.map +0 -1
- package/dist/chunk-PEI6RANI.js.map +0 -1
- package/dist/chunk-VTOREEXF.js +0 -142
- package/dist/chunk-VTOREEXF.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-XYRDDSXF.js.map +0 -1
- package/dist/chunk-YG4QEQF5.js +0 -9557
- package/dist/chunk-YG4QEQF5.js.map +0 -1
- package/dist/chunk-YVCHAQZY.js.map +0 -1
- package/dist/chunk-ZPBTI3TE.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-MKKFRRRV.js.map → browser-viewer-ZWR6MWJ7.js.map} +0 -0
- /package/dist/{computer-viewer-FWEZISW4.js.map → chat-interactive-block-4EUKJXUO.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,378 +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
|
-
| {
|
|
109
|
-
state: "loading";
|
|
110
|
-
promise: Promise<RealtimeModelOption[]>;
|
|
111
|
-
controller: AbortController;
|
|
112
|
-
consumers: number;
|
|
113
|
-
}
|
|
114
|
-
| { state: "ready"; models: RealtimeModelOption[]; expiresAt: number };
|
|
115
|
-
|
|
116
|
-
// Scope advisory availability to the exact client object and workspace. The
|
|
117
|
-
// server still authorizes every realtime operation; changing principals should
|
|
118
|
-
// replace the client just as it does for the rest of the SDK state.
|
|
119
|
-
const realtimeModelCatalogCache = new WeakMap<
|
|
120
|
-
RealtimeControllerClient,
|
|
121
|
-
Map<string, RealtimeModelCatalogCacheEntry>
|
|
122
|
-
>();
|
|
123
|
-
|
|
124
|
-
function realtimeModelFallback(codexConnected: boolean): RealtimeModelOption[] {
|
|
125
|
-
return [
|
|
126
|
-
{
|
|
127
|
-
...CODEX_LIVE_MODEL,
|
|
128
|
-
available: codexConnected,
|
|
129
|
-
unavailableReason: codexConnected ? null : CODEX_LIVE_MODEL.unavailableReason,
|
|
130
|
-
},
|
|
131
|
-
];
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
function realtimeModelCatalogCacheFor(
|
|
135
|
-
client: RealtimeControllerClient,
|
|
136
|
-
): Map<string, RealtimeModelCatalogCacheEntry> {
|
|
137
|
-
const existing = realtimeModelCatalogCache.get(client);
|
|
138
|
-
if (existing) return existing;
|
|
139
|
-
const created = new Map<string, RealtimeModelCatalogCacheEntry>();
|
|
140
|
-
realtimeModelCatalogCache.set(client, created);
|
|
141
|
-
return created;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
function readCachedRealtimeModelCatalog(
|
|
145
|
-
client: RealtimeControllerClient,
|
|
146
|
-
workspaceId: string,
|
|
147
|
-
now = Date.now(),
|
|
148
|
-
): RealtimeModelOption[] | null {
|
|
149
|
-
const cache = realtimeModelCatalogCache.get(client);
|
|
150
|
-
const entry = cache?.get(workspaceId);
|
|
151
|
-
if (!entry || entry.state === "loading") return null;
|
|
152
|
-
if (entry.expiresAt > now) return entry.models;
|
|
153
|
-
cache?.delete(workspaceId);
|
|
154
|
-
return null;
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
function pruneRealtimeModelCatalogCache(
|
|
158
|
-
cache: Map<string, RealtimeModelCatalogCacheEntry>,
|
|
159
|
-
now: number,
|
|
160
|
-
): void {
|
|
161
|
-
for (const [workspaceId, entry] of cache) {
|
|
162
|
-
if (entry.state === "ready" && entry.expiresAt <= now) cache.delete(workspaceId);
|
|
163
|
-
}
|
|
164
|
-
while (cache.size >= REALTIME_MODEL_CATALOG_CACHE_MAX_WORKSPACES) {
|
|
165
|
-
const oldestWorkspaceId = cache.keys().next().value;
|
|
166
|
-
if (oldestWorkspaceId === undefined) return;
|
|
167
|
-
cache.delete(oldestWorkspaceId);
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
function loadRealtimeModelCatalog(
|
|
172
|
-
client: RealtimeControllerClient,
|
|
173
|
-
workspaceId: string,
|
|
174
|
-
signal?: AbortSignal,
|
|
175
|
-
): Promise<RealtimeModelOption[]> | null {
|
|
176
|
-
const load = client.getWorkspaceRealtimeModelCatalog;
|
|
177
|
-
if (!load) return null;
|
|
178
|
-
if (signal?.aborted) {
|
|
179
|
-
return Promise.reject(signal.reason ?? new DOMException("Request aborted", "AbortError"));
|
|
180
|
-
}
|
|
181
|
-
const now = Date.now();
|
|
182
|
-
const cache = realtimeModelCatalogCacheFor(client);
|
|
183
|
-
const entry = cache.get(workspaceId);
|
|
184
|
-
if (entry?.state === "loading" && !entry.controller.signal.aborted) {
|
|
185
|
-
return consumeRealtimeModelCatalog(entry, signal);
|
|
186
|
-
}
|
|
187
|
-
if (entry?.state === "ready" && entry.expiresAt > now) return Promise.resolve(entry.models);
|
|
188
|
-
if (entry) cache.delete(workspaceId);
|
|
189
|
-
pruneRealtimeModelCatalogCache(cache, now);
|
|
190
|
-
|
|
191
|
-
const controller = new AbortController();
|
|
192
|
-
const promise = load
|
|
193
|
-
.call(client, workspaceId, { signal: controller.signal })
|
|
194
|
-
.then((response) => response.models.map(toRealtimeModelOption))
|
|
195
|
-
.then((models) => {
|
|
196
|
-
const current = cache.get(workspaceId);
|
|
197
|
-
if (current?.state === "loading" && current.promise === promise) {
|
|
198
|
-
cache.delete(workspaceId);
|
|
199
|
-
cache.set(workspaceId, {
|
|
200
|
-
state: "ready",
|
|
201
|
-
models,
|
|
202
|
-
expiresAt: Date.now() + REALTIME_MODEL_CATALOG_CACHE_TTL_MS,
|
|
203
|
-
});
|
|
204
|
-
}
|
|
205
|
-
return models;
|
|
206
|
-
})
|
|
207
|
-
.catch((error: unknown) => {
|
|
208
|
-
const current = cache.get(workspaceId);
|
|
209
|
-
if (current?.state === "loading" && current.promise === promise) cache.delete(workspaceId);
|
|
210
|
-
throw error;
|
|
211
|
-
});
|
|
212
|
-
const loading: RealtimeModelCatalogCacheEntry & { state: "loading" } = {
|
|
213
|
-
state: "loading",
|
|
214
|
-
promise,
|
|
215
|
-
controller,
|
|
216
|
-
consumers: 0,
|
|
217
|
-
};
|
|
218
|
-
cache.set(workspaceId, loading);
|
|
219
|
-
return consumeRealtimeModelCatalog(loading, signal);
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
function consumeRealtimeModelCatalog(
|
|
223
|
-
entry: RealtimeModelCatalogCacheEntry & { state: "loading" },
|
|
224
|
-
signal?: AbortSignal,
|
|
225
|
-
): Promise<RealtimeModelOption[]> {
|
|
226
|
-
entry.consumers += 1;
|
|
227
|
-
return new Promise((resolve, reject) => {
|
|
228
|
-
let released = false;
|
|
229
|
-
const release = (abandoned: boolean) => {
|
|
230
|
-
if (released) return;
|
|
231
|
-
released = true;
|
|
232
|
-
entry.consumers = Math.max(0, entry.consumers - 1);
|
|
233
|
-
if (abandoned && entry.consumers === 0) {
|
|
234
|
-
entry.controller.abort(
|
|
235
|
-
signal?.reason ?? new DOMException("Request abandoned", "AbortError"),
|
|
236
|
-
);
|
|
237
|
-
}
|
|
238
|
-
};
|
|
239
|
-
const onAbort = () => {
|
|
240
|
-
release(true);
|
|
241
|
-
reject(signal?.reason ?? new DOMException("Request aborted", "AbortError"));
|
|
242
|
-
};
|
|
243
|
-
signal?.addEventListener("abort", onAbort, { once: true });
|
|
244
|
-
void entry.promise.then(resolve, reject).finally(() => {
|
|
245
|
-
signal?.removeEventListener("abort", onAbort);
|
|
246
|
-
release(false);
|
|
247
|
-
});
|
|
248
|
-
});
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
export type SessionRealtimeControllerFactory = (
|
|
252
|
-
options: CreateSessionRealtimeControllerOptions,
|
|
253
|
-
) => SessionRealtimeController;
|
|
254
|
-
|
|
255
|
-
type AdmissionInput = {
|
|
256
|
-
sessionStatus: SessionStatus;
|
|
257
|
-
controlState: "active" | "paused";
|
|
258
|
-
settlement: { state: string } | null;
|
|
259
|
-
codexConnected: boolean;
|
|
260
|
-
lifecycleActive: boolean;
|
|
116
|
+
"Your Gateway": {
|
|
117
|
+
billingClass: "byok",
|
|
118
|
+
label: "Your Gateway",
|
|
119
|
+
hint: "Billed to your AI Gateway",
|
|
120
|
+
},
|
|
261
121
|
};
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
return
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
export function codexRealtimeAdmissionBlocker(input: AdmissionInput): string | null {
|
|
268
|
-
if (input.sessionStatus === "cancelled") return "This session was cancelled.";
|
|
269
|
-
if (input.controlState !== "active") return "Resume this session before starting voice.";
|
|
270
|
-
if (input.settlement !== null) return "Wait for the current session transition to finish.";
|
|
271
|
-
if (!input.codexConnected) return "Connect Codex to use this voice model.";
|
|
272
|
-
if (input.lifecycleActive) return "Voice is already active for this session.";
|
|
273
|
-
return null;
|
|
122
|
+
/** Display name; the catalog's `provider` value stays the wire identifier. */
|
|
123
|
+
function realtimeProviderLabel(provider: RealtimeModelProvider): string {
|
|
124
|
+
return provider === "OpenGeni" ? "Opengeni" : provider;
|
|
274
125
|
}
|
|
275
|
-
|
|
276
|
-
export function useSessionRealtime(options: {
|
|
277
|
-
client?: RealtimeControllerClient | undefined;
|
|
278
|
-
workspaceId?: string | undefined;
|
|
279
|
-
sessionId: string;
|
|
280
|
-
sessionStatus: SessionStatus;
|
|
281
|
-
effectiveControl: EffectiveSessionControl;
|
|
282
|
-
events: SessionEvent[];
|
|
283
|
-
eventsReady: boolean;
|
|
284
|
-
codexConnected: boolean;
|
|
285
|
-
model?: SessionRealtimeModel | undefined;
|
|
286
|
-
modelAvailable?: boolean | undefined;
|
|
287
|
-
modelUnavailableReason?: string | null | undefined;
|
|
288
|
-
/** Model-visible application context captured with each durable realtime message. */
|
|
289
|
-
getModelContext?: (() => string | undefined) | undefined;
|
|
290
|
-
/** Deterministic browser-test/demo seam. Production hosts should use the SDK default. */
|
|
291
|
-
controllerFactory?: SessionRealtimeControllerFactory | undefined;
|
|
292
|
-
}) {
|
|
293
|
-
const { client, workspaceId } = useEmbeddedRealtimeSession({
|
|
294
|
-
client: options.client,
|
|
295
|
-
workspaceId: options.workspaceId,
|
|
296
|
-
});
|
|
297
|
-
const model = options.model ?? CODEX_LIVE_MODEL.id;
|
|
298
|
-
const audioRef = useRef<HTMLAudioElement>(null);
|
|
299
|
-
const controllerRef = useRef<SessionRealtimeController | null>(null);
|
|
300
|
-
const controllerModelRef = useRef<SessionRealtimeModel | null>(null);
|
|
301
|
-
const modelContextProviderRef = useRef(options.getModelContext);
|
|
302
|
-
modelContextProviderRef.current = options.getModelContext;
|
|
303
|
-
const [snapshot, setSnapshot] = useState<SessionRealtimeControllerSnapshot>(() => ({
|
|
304
|
-
status: hasStoredSessionRealtimeOwnerProof({
|
|
305
|
-
workspaceId,
|
|
306
|
-
sessionId: options.sessionId,
|
|
307
|
-
model,
|
|
308
|
-
})
|
|
309
|
-
? "recovering"
|
|
310
|
-
: "idle",
|
|
311
|
-
realtimeId: null,
|
|
312
|
-
mode: null,
|
|
313
|
-
bridge: null,
|
|
314
|
-
microphone: "inactive",
|
|
315
|
-
inputMuted: false,
|
|
316
|
-
audibleOutput: "inactive",
|
|
317
|
-
outputMuted: false,
|
|
318
|
-
connectionGeneration: 0,
|
|
319
|
-
reconnectAttempt: 0,
|
|
320
|
-
diagnostic: null,
|
|
321
|
-
error: null,
|
|
322
|
-
}));
|
|
323
|
-
const lifecycle = useMemo(
|
|
324
|
-
() => projectSessionRealtimeLifecycle(options.events),
|
|
325
|
-
[options.events],
|
|
326
|
-
);
|
|
327
|
-
const lifecycleRef = useRef(lifecycle);
|
|
328
|
-
const eventsReadyRef = useRef(options.eventsReady);
|
|
329
|
-
lifecycleRef.current = lifecycle;
|
|
330
|
-
eventsReadyRef.current = options.eventsReady;
|
|
331
|
-
const lifecycleActive = sessionRealtimeLifecycleIsActive(lifecycle);
|
|
332
|
-
|
|
333
|
-
useEffect(() => {
|
|
334
|
-
let disposed = false;
|
|
335
|
-
let controller: SessionRealtimeController | null = null;
|
|
336
|
-
let unsubscribe: (() => void) | null = null;
|
|
337
|
-
void import("@opengeni/sdk/realtime")
|
|
338
|
-
.then(({ createSessionRealtimeController }) => {
|
|
339
|
-
if (disposed) return;
|
|
340
|
-
const controllerFactory = options.controllerFactory ?? createSessionRealtimeController;
|
|
341
|
-
controller = controllerFactory({
|
|
342
|
-
client,
|
|
343
|
-
workspaceId,
|
|
344
|
-
sessionId: options.sessionId,
|
|
345
|
-
...(audioRef.current ? { remoteAudio: audioRef.current } : {}),
|
|
346
|
-
model,
|
|
347
|
-
getModelContext: () => modelContextProviderRef.current?.(),
|
|
348
|
-
});
|
|
349
|
-
controllerRef.current = controller;
|
|
350
|
-
controllerModelRef.current = model;
|
|
351
|
-
unsubscribe = controller.subscribe(setSnapshot);
|
|
352
|
-
if (eventsReadyRef.current) {
|
|
353
|
-
void controller.observeLifecycle(lifecycleRef.current).catch(() => undefined);
|
|
354
|
-
}
|
|
355
|
-
})
|
|
356
|
-
.catch((error: unknown) => {
|
|
357
|
-
if (disposed) return;
|
|
358
|
-
setSnapshot({
|
|
359
|
-
status: "error",
|
|
360
|
-
realtimeId: null,
|
|
361
|
-
mode: null,
|
|
362
|
-
bridge: null,
|
|
363
|
-
microphone: "inactive",
|
|
364
|
-
inputMuted: false,
|
|
365
|
-
audibleOutput: "inactive",
|
|
366
|
-
outputMuted: false,
|
|
367
|
-
connectionGeneration: 0,
|
|
368
|
-
reconnectAttempt: 0,
|
|
369
|
-
diagnostic: {
|
|
370
|
-
kind: "negotiation_failure",
|
|
371
|
-
message:
|
|
372
|
-
error instanceof Error ? error.message : "Codex realtime controller failed to load",
|
|
373
|
-
recoverable: false,
|
|
374
|
-
connectionGeneration: 0,
|
|
375
|
-
attempt: 0,
|
|
376
|
-
},
|
|
377
|
-
error:
|
|
378
|
-
error instanceof Error ? error.message : "Codex realtime controller failed to load",
|
|
379
|
-
});
|
|
380
|
-
});
|
|
381
|
-
return () => {
|
|
382
|
-
disposed = true;
|
|
383
|
-
unsubscribe?.();
|
|
384
|
-
controller?.close();
|
|
385
|
-
if (controllerRef.current === controller) {
|
|
386
|
-
controllerRef.current = null;
|
|
387
|
-
controllerModelRef.current = null;
|
|
388
|
-
}
|
|
389
|
-
};
|
|
390
|
-
}, [client, model, options.controllerFactory, options.sessionId, workspaceId]);
|
|
391
|
-
|
|
392
|
-
useEffect(() => {
|
|
393
|
-
if (!options.eventsReady) return;
|
|
394
|
-
void controllerRef.current?.observeLifecycle(lifecycle).catch(() => undefined);
|
|
395
|
-
}, [lifecycle, options.eventsReady]);
|
|
396
|
-
|
|
397
|
-
const start = useCallback(async () => {
|
|
398
|
-
const controller = controllerRef.current;
|
|
399
|
-
if (!controller || controllerModelRef.current !== model) {
|
|
400
|
-
throw new Error("The selected voice model is still preparing");
|
|
401
|
-
}
|
|
402
|
-
await controller.start();
|
|
403
|
-
}, [model]);
|
|
404
|
-
const stop = useCallback(async () => {
|
|
405
|
-
await controllerRef.current?.stop();
|
|
406
|
-
}, []);
|
|
407
|
-
const retry = useCallback(async () => {
|
|
408
|
-
await controllerRef.current?.retry();
|
|
409
|
-
}, []);
|
|
410
|
-
const retryAudibleOutput = useCallback(async () => {
|
|
411
|
-
await controllerRef.current?.retryAudibleOutput();
|
|
412
|
-
}, []);
|
|
413
|
-
const setInputMuted = useCallback((muted: boolean) => {
|
|
414
|
-
controllerRef.current?.setInputMuted(muted);
|
|
415
|
-
}, []);
|
|
416
|
-
const setOutputMuted = useCallback((muted: boolean) => {
|
|
417
|
-
controllerRef.current?.setOutputMuted(muted);
|
|
418
|
-
}, []);
|
|
419
|
-
const admissionInput = {
|
|
420
|
-
sessionStatus: options.sessionStatus,
|
|
421
|
-
controlState: options.effectiveControl.state,
|
|
422
|
-
settlement: options.effectiveControl.settlement,
|
|
423
|
-
codexConnected: options.modelAvailable ?? options.codexConnected,
|
|
424
|
-
lifecycleActive,
|
|
425
|
-
} satisfies AdmissionInput;
|
|
426
|
-
const admissionBlocker =
|
|
427
|
-
options.modelAvailable === false
|
|
428
|
-
? (options.modelUnavailableReason ?? "This voice model is unavailable.")
|
|
429
|
-
: codexRealtimeAdmissionBlocker(admissionInput);
|
|
430
|
-
const canStart =
|
|
431
|
-
controllerRef.current !== null &&
|
|
432
|
-
controllerModelRef.current === model &&
|
|
433
|
-
["idle", "error"].includes(snapshot.status) &&
|
|
434
|
-
admissionBlocker === null;
|
|
435
|
-
|
|
436
|
-
return {
|
|
437
|
-
snapshot,
|
|
438
|
-
lifecycleActive,
|
|
439
|
-
canStart,
|
|
440
|
-
admissionBlocker,
|
|
441
|
-
codexConnected: options.codexConnected,
|
|
442
|
-
audioRef,
|
|
443
|
-
start,
|
|
444
|
-
stop,
|
|
445
|
-
retry,
|
|
446
|
-
retryAudibleOutput,
|
|
447
|
-
setInputMuted,
|
|
448
|
-
setOutputMuted,
|
|
449
|
-
};
|
|
450
|
-
}
|
|
451
|
-
|
|
452
|
-
function sessionRealtimeLifecycleIsActive(
|
|
453
|
-
lifecycle: SessionRealtimeLifecycleProjection | null,
|
|
454
|
-
): boolean {
|
|
455
|
-
if (lifecycle?.state !== "active") return false;
|
|
456
|
-
const leaseExpiresAt = Date.parse(lifecycle.leaseExpiresAt);
|
|
457
|
-
return !Number.isFinite(leaseExpiresAt) || leaseExpiresAt > Date.now();
|
|
458
|
-
}
|
|
459
|
-
|
|
460
126
|
export function SessionRealtimeControl(props: {
|
|
461
127
|
client?: RealtimeControllerClient | undefined;
|
|
462
128
|
workspaceId?: string | undefined;
|
|
@@ -511,6 +177,7 @@ export function SessionRealtimeControl(props: {
|
|
|
511
177
|
useEffect(() => {
|
|
512
178
|
onVoiceActiveChange?.(voiceActive);
|
|
513
179
|
}, [onVoiceActiveChange, voiceActive]);
|
|
180
|
+
useEffect(() => () => onVoiceActiveChange?.(false), [onVoiceActiveChange]);
|
|
514
181
|
|
|
515
182
|
useEffect(() => {
|
|
516
183
|
const pending = autostartModelRef.current;
|
|
@@ -523,14 +190,13 @@ export function SessionRealtimeControl(props: {
|
|
|
523
190
|
}
|
|
524
191
|
if (!canStart) return;
|
|
525
192
|
autostartStartedRef.current = true;
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
});
|
|
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);
|
|
534
200
|
}, [
|
|
535
201
|
canStart,
|
|
536
202
|
lifecycleActive,
|
|
@@ -566,96 +232,6 @@ export function SessionRealtimeControl(props: {
|
|
|
566
232
|
);
|
|
567
233
|
}
|
|
568
234
|
|
|
569
|
-
export function useRealtimeModelSelection(options: {
|
|
570
|
-
client?: RealtimeControllerClient | undefined;
|
|
571
|
-
workspaceId?: string | undefined;
|
|
572
|
-
codexConnected: boolean;
|
|
573
|
-
activeModel?: SessionRealtimeModel | null | undefined;
|
|
574
|
-
}) {
|
|
575
|
-
const { client, workspaceId } = useEmbeddedRealtimeSession({
|
|
576
|
-
client: options.client,
|
|
577
|
-
workspaceId: options.workspaceId,
|
|
578
|
-
});
|
|
579
|
-
const activeModel = options.activeModel;
|
|
580
|
-
const initialCachedCatalog = readCachedRealtimeModelCatalog(client, workspaceId);
|
|
581
|
-
const [catalog, setCatalog] = useState<RealtimeModelOption[]>(
|
|
582
|
-
() => initialCachedCatalog ?? realtimeModelFallback(options.codexConnected),
|
|
583
|
-
);
|
|
584
|
-
const catalogScopeRef = useRef({
|
|
585
|
-
client,
|
|
586
|
-
workspaceId,
|
|
587
|
-
source: initialCachedCatalog ? ("cache" as const) : ("fallback" as const),
|
|
588
|
-
});
|
|
589
|
-
const [selectedModelId, setSelectedModelId] = useState<SessionRealtimeModel>(() => {
|
|
590
|
-
const preferred = readRealtimeModelPreference(workspaceId) ?? CODEX_LIVE_MODEL.id;
|
|
591
|
-
if (!initialCachedCatalog) return preferred;
|
|
592
|
-
if (initialCachedCatalog.some((model) => model.id === preferred && model.available)) {
|
|
593
|
-
return preferred;
|
|
594
|
-
}
|
|
595
|
-
return initialCachedCatalog.find((model) => model.available)?.id ?? CODEX_LIVE_MODEL.id;
|
|
596
|
-
});
|
|
597
|
-
|
|
598
|
-
useEffect(() => {
|
|
599
|
-
let disposed = false;
|
|
600
|
-
const requestAbort = new AbortController();
|
|
601
|
-
const applyCatalog = (models: RealtimeModelOption[]) => {
|
|
602
|
-
catalogScopeRef.current = { client, workspaceId, source: "cache" };
|
|
603
|
-
setCatalog(models);
|
|
604
|
-
setSelectedModelId((current) => {
|
|
605
|
-
if (models.some((model) => model.id === current && model.available)) return current;
|
|
606
|
-
return models.find((model) => model.available)?.id ?? CODEX_LIVE_MODEL.id;
|
|
607
|
-
});
|
|
608
|
-
};
|
|
609
|
-
const cached = readCachedRealtimeModelCatalog(client, workspaceId);
|
|
610
|
-
if (cached) {
|
|
611
|
-
const scope = catalogScopeRef.current;
|
|
612
|
-
if (
|
|
613
|
-
scope.client !== client ||
|
|
614
|
-
scope.workspaceId !== workspaceId ||
|
|
615
|
-
scope.source !== "cache"
|
|
616
|
-
) {
|
|
617
|
-
applyCatalog(cached);
|
|
618
|
-
}
|
|
619
|
-
return;
|
|
620
|
-
}
|
|
621
|
-
const loading = loadRealtimeModelCatalog(client, workspaceId, requestAbort.signal);
|
|
622
|
-
if (!loading) return;
|
|
623
|
-
void loading
|
|
624
|
-
.then((models) => {
|
|
625
|
-
if (disposed) return;
|
|
626
|
-
applyCatalog(models);
|
|
627
|
-
})
|
|
628
|
-
.catch(() => undefined);
|
|
629
|
-
return () => {
|
|
630
|
-
disposed = true;
|
|
631
|
-
requestAbort.abort();
|
|
632
|
-
};
|
|
633
|
-
}, [client, workspaceId]);
|
|
634
|
-
|
|
635
|
-
useEffect(() => {
|
|
636
|
-
if (activeModel) setSelectedModelId(activeModel);
|
|
637
|
-
}, [activeModel]);
|
|
638
|
-
|
|
639
|
-
const selectedModel =
|
|
640
|
-
catalog.find((model) => model.id === selectedModelId) ??
|
|
641
|
-
({
|
|
642
|
-
...CODEX_LIVE_MODEL,
|
|
643
|
-
available: options.codexConnected,
|
|
644
|
-
unavailableReason: options.codexConnected ? null : CODEX_LIVE_MODEL.unavailableReason,
|
|
645
|
-
} satisfies RealtimeModelOption);
|
|
646
|
-
const selectModel = useCallback(
|
|
647
|
-
(value: string) => {
|
|
648
|
-
const model = catalog.find((candidate) => candidate.id === value);
|
|
649
|
-
if (!model || !model.available || activeModel) return;
|
|
650
|
-
setSelectedModelId(model.id);
|
|
651
|
-
writeRealtimeModelPreference(workspaceId, model.id);
|
|
652
|
-
},
|
|
653
|
-
[activeModel, catalog, workspaceId],
|
|
654
|
-
);
|
|
655
|
-
|
|
656
|
-
return { models: catalog, selectedModel, selectModel };
|
|
657
|
-
}
|
|
658
|
-
|
|
659
235
|
const IDLE_REALTIME_SNAPSHOT: SessionRealtimeControllerSnapshot = {
|
|
660
236
|
status: "idle",
|
|
661
237
|
realtimeId: null,
|
|
@@ -821,6 +397,7 @@ export function RealtimeVoiceControl(props: {
|
|
|
821
397
|
props.canStart,
|
|
822
398
|
props.admissionBlocker ?? null,
|
|
823
399
|
selectedModel.label,
|
|
400
|
+
selectedModel.unavailableCode ?? null,
|
|
824
401
|
);
|
|
825
402
|
const modeOwned = props.snapshot.mode?.state === "active";
|
|
826
403
|
const retryConnection =
|
|
@@ -829,6 +406,11 @@ export function RealtimeVoiceControl(props: {
|
|
|
829
406
|
props.snapshot.status !== "active" &&
|
|
830
407
|
props.snapshot.diagnostic?.recoverable === true;
|
|
831
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}`;
|
|
832
414
|
const mainDisabled =
|
|
833
415
|
props.snapshot.status === "stopping" ||
|
|
834
416
|
props.snapshot.status === "lost_owner" ||
|
|
@@ -840,7 +422,11 @@ export function RealtimeVoiceControl(props: {
|
|
|
840
422
|
? "Retry voice connection"
|
|
841
423
|
: modeOwned
|
|
842
424
|
? "End voice conversation"
|
|
843
|
-
:
|
|
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}`;
|
|
844
430
|
const runMainAction = audioBlocked
|
|
845
431
|
? props.onRetryAudibleOutput
|
|
846
432
|
: retryConnection
|
|
@@ -857,6 +443,20 @@ export function RealtimeVoiceControl(props: {
|
|
|
857
443
|
selectedModel.provider,
|
|
858
444
|
);
|
|
859
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]);
|
|
860
460
|
|
|
861
461
|
useEffect(() => {
|
|
862
462
|
if (!pickerOpen) setPickerProvider(selectedModel.provider);
|
|
@@ -864,6 +464,7 @@ export function RealtimeVoiceControl(props: {
|
|
|
864
464
|
|
|
865
465
|
return (
|
|
866
466
|
<div
|
|
467
|
+
ref={rootRef}
|
|
867
468
|
role="group"
|
|
868
469
|
aria-label="Realtime voice"
|
|
869
470
|
data-picker-side={props.menuSide ?? "top"}
|
|
@@ -945,6 +546,20 @@ export function RealtimeVoiceControl(props: {
|
|
|
945
546
|
</motion.div>
|
|
946
547
|
) : null}
|
|
947
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}
|
|
948
563
|
<div className="inline-flex shrink-0 items-center">
|
|
949
564
|
<motion.button
|
|
950
565
|
type="button"
|
|
@@ -1005,7 +620,7 @@ export function RealtimeVoiceControl(props: {
|
|
|
1005
620
|
align="end"
|
|
1006
621
|
sideOffset={8}
|
|
1007
622
|
collisionPadding={12}
|
|
1008
|
-
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"
|
|
1009
624
|
onCloseAutoFocus={(event) => event.preventDefault()}
|
|
1010
625
|
>
|
|
1011
626
|
<div className="min-h-0 flex-1 overflow-y-auto overscroll-contain">
|
|
@@ -1028,9 +643,15 @@ export function RealtimeVoiceControl(props: {
|
|
|
1028
643
|
/>
|
|
1029
644
|
</div>
|
|
1030
645
|
|
|
1031
|
-
{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
|
+
) ? (
|
|
1032
653
|
<>
|
|
1033
|
-
<DropdownMenuSeparator
|
|
654
|
+
<DropdownMenuSeparator />
|
|
1034
655
|
<div className="px-2.5 py-2" role="status" aria-live="polite">
|
|
1035
656
|
<div className="flex items-center gap-2 text-og-sm font-medium text-og-fg">
|
|
1036
657
|
<RealtimeStatusDot
|
|
@@ -1046,7 +667,6 @@ export function RealtimeVoiceControl(props: {
|
|
|
1046
667
|
|
|
1047
668
|
{audioBlocked ? (
|
|
1048
669
|
<DropdownMenuItem
|
|
1049
|
-
className="rounded-og-md"
|
|
1050
670
|
onSelect={() => void props.onRetryAudibleOutput().catch(() => undefined)}
|
|
1051
671
|
>
|
|
1052
672
|
<Volume2Icon />
|
|
@@ -1054,10 +674,7 @@ export function RealtimeVoiceControl(props: {
|
|
|
1054
674
|
</DropdownMenuItem>
|
|
1055
675
|
) : null}
|
|
1056
676
|
{retryConnection ? (
|
|
1057
|
-
<DropdownMenuItem
|
|
1058
|
-
className="rounded-og-md"
|
|
1059
|
-
onSelect={() => void props.onRetry().catch(() => undefined)}
|
|
1060
|
-
>
|
|
677
|
+
<DropdownMenuItem onSelect={() => void props.onRetry().catch(() => undefined)}>
|
|
1061
678
|
<RotateCcwIcon />
|
|
1062
679
|
Retry connection
|
|
1063
680
|
</DropdownMenuItem>
|
|
@@ -1065,7 +682,6 @@ export function RealtimeVoiceControl(props: {
|
|
|
1065
682
|
{modeOwned && props.snapshot.status !== "lost_owner" ? (
|
|
1066
683
|
<DropdownMenuItem
|
|
1067
684
|
variant="destructive"
|
|
1068
|
-
className="rounded-og-md"
|
|
1069
685
|
disabled={props.snapshot.status === "stopping"}
|
|
1070
686
|
onSelect={() => void props.onStop().catch(() => undefined)}
|
|
1071
687
|
>
|
|
@@ -1105,16 +721,14 @@ export function RealtimeVoiceModelPanel(props: {
|
|
|
1105
721
|
|
|
1106
722
|
return (
|
|
1107
723
|
<div className="flex min-h-0 flex-1 flex-col" data-testid="realtime-voice-model-panel">
|
|
1108
|
-
<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">
|
|
1109
725
|
{props.leading}
|
|
1110
|
-
<div className="min-w-0">
|
|
1111
|
-
<div className="text-og-menu font-medium text-og-fg">Voice model</div>
|
|
1112
|
-
<p className="mt-0.5 text-og-control text-og-fg-subtle">
|
|
1113
|
-
Used when you start a voice conversation.
|
|
1114
|
-
</p>
|
|
1115
|
-
</div>
|
|
726
|
+
<div className="min-w-0 flex-1 text-og-menu font-medium text-og-fg">Voice model</div>
|
|
1116
727
|
</div>
|
|
1117
|
-
<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>
|
|
1118
732
|
<RealtimeModelPickerMenu
|
|
1119
733
|
models={props.models}
|
|
1120
734
|
selectedModel={props.selectedModel}
|
|
@@ -1202,7 +816,7 @@ export function RealtimeModelPickerMenu(props: {
|
|
|
1202
816
|
const body = props.provider ? (
|
|
1203
817
|
<div data-testid="realtime-model-picker-models">
|
|
1204
818
|
<PickerBackHeader
|
|
1205
|
-
label={props.provider}
|
|
819
|
+
label={realtimeProviderLabel(props.provider)}
|
|
1206
820
|
icon={
|
|
1207
821
|
<BillingClassMark
|
|
1208
822
|
billingClass={REALTIME_PROVIDER_META[props.provider].billingClass}
|
|
@@ -1228,7 +842,9 @@ export function RealtimeModelPickerMenu(props: {
|
|
|
1228
842
|
title={model.unavailableReason ?? model.description}
|
|
1229
843
|
active={selected}
|
|
1230
844
|
showChevron={false}
|
|
1231
|
-
trailing={
|
|
845
|
+
trailing={
|
|
846
|
+
selected ? <CheckIcon className={MENU_CHECK_CLASS} aria-hidden /> : undefined
|
|
847
|
+
}
|
|
1232
848
|
testId={`realtime-model-choice-${model.id}`}
|
|
1233
849
|
onClick={() => props.onSelect(model.id)}
|
|
1234
850
|
/>
|
|
@@ -1243,7 +859,7 @@ export function RealtimeModelPickerMenu(props: {
|
|
|
1243
859
|
return (
|
|
1244
860
|
<PickerNavRow
|
|
1245
861
|
key={provider}
|
|
1246
|
-
label={provider}
|
|
862
|
+
label={realtimeProviderLabel(provider)}
|
|
1247
863
|
hint={meta.hint}
|
|
1248
864
|
icon={<BillingClassMark billingClass={meta.billingClass} aria-label="" />}
|
|
1249
865
|
active={props.selectedModel.provider === provider}
|
|
@@ -1291,12 +907,12 @@ function RealtimeDiagnosticsMenu({ snapshot }: { snapshot: SessionRealtimeContro
|
|
|
1291
907
|
|
|
1292
908
|
return (
|
|
1293
909
|
<>
|
|
1294
|
-
<DropdownMenuSeparator
|
|
910
|
+
<DropdownMenuSeparator />
|
|
1295
911
|
<DropdownMenuSub>
|
|
1296
|
-
<DropdownMenuSubTrigger className="
|
|
912
|
+
<DropdownMenuSubTrigger className="text-og-fg-muted">
|
|
1297
913
|
Realtime diagnostics
|
|
1298
914
|
</DropdownMenuSubTrigger>
|
|
1299
|
-
<DropdownMenuSubContent className="max-h-80 w-72 overflow-y-auto
|
|
915
|
+
<DropdownMenuSubContent className="max-h-80 w-72 overflow-y-auto">
|
|
1300
916
|
{rows.map(([label, value]) => (
|
|
1301
917
|
<DropdownMenuItem
|
|
1302
918
|
key={label}
|
|
@@ -1331,6 +947,7 @@ function statusContent(
|
|
|
1331
947
|
canStart: boolean,
|
|
1332
948
|
admissionBlocker: string | null,
|
|
1333
949
|
modelLabel: string,
|
|
950
|
+
unavailableCode: string | null = null,
|
|
1334
951
|
): { phase: RealtimeVisualPhase; label: string; detail: string } {
|
|
1335
952
|
if (snapshot.audibleOutput === "blocked" && !snapshot.outputMuted) {
|
|
1336
953
|
return {
|
|
@@ -1377,6 +994,13 @@ function statusContent(
|
|
|
1377
994
|
detail: "Return to the browser that started it, or wait for that connection to expire.",
|
|
1378
995
|
};
|
|
1379
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
|
+
}
|
|
1380
1004
|
return {
|
|
1381
1005
|
phase: "error",
|
|
1382
1006
|
label: "Voice unavailable",
|
|
@@ -1386,7 +1010,7 @@ function statusContent(
|
|
|
1386
1010
|
if (!modelAvailable) {
|
|
1387
1011
|
return {
|
|
1388
1012
|
phase: "unavailable",
|
|
1389
|
-
label: "Voice model unavailable",
|
|
1013
|
+
label: realtimeRefusalLabel(unavailableCode) ?? "Voice model unavailable",
|
|
1390
1014
|
detail: admissionBlocker ?? "Choose another voice model.",
|
|
1391
1015
|
};
|
|
1392
1016
|
}
|
|
@@ -1528,7 +1152,7 @@ function RealtimeStatusDot(props: { phase: RealtimeVisualPhase; reduceMotion: bo
|
|
|
1528
1152
|
|
|
1529
1153
|
function voiceButtonTone(phase: RealtimeVisualPhase): string {
|
|
1530
1154
|
if (phase === "listening" || phase === "speaking") {
|
|
1531
|
-
return "border border-og-
|
|
1155
|
+
return "border border-og-primary-border bg-og-primary text-og-primary-fg hover:bg-og-primary-hover";
|
|
1532
1156
|
}
|
|
1533
1157
|
if (phase === "blocked" || phase === "error") {
|
|
1534
1158
|
return "border border-og-status-waiting/35 bg-og-status-waiting/10 text-og-status-waiting hover:bg-og-status-waiting/15";
|
|
@@ -1542,7 +1166,7 @@ function voiceButtonTone(phase: RealtimeVisualPhase): string {
|
|
|
1542
1166
|
|
|
1543
1167
|
function voiceChevronTone(phase: RealtimeVisualPhase): string {
|
|
1544
1168
|
if (phase === "listening" || phase === "speaking") {
|
|
1545
|
-
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";
|
|
1546
1170
|
}
|
|
1547
1171
|
if (phase === "blocked" || phase === "error") {
|
|
1548
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";
|
|
@@ -1553,42 +1177,6 @@ function voiceChevronTone(phase: RealtimeVisualPhase): string {
|
|
|
1553
1177
|
return "text-og-fg-muted hover:bg-og-surface-2 hover:text-og-fg";
|
|
1554
1178
|
}
|
|
1555
1179
|
|
|
1556
|
-
function toRealtimeModelOption(model: WorkspaceRealtimeModelCatalogItem): RealtimeModelOption {
|
|
1557
|
-
return { ...model };
|
|
1558
|
-
}
|
|
1559
|
-
|
|
1560
|
-
function readRealtimeModelPreference(workspaceId: string): SessionRealtimeModel | null {
|
|
1561
|
-
if (typeof localStorage === "undefined") return null;
|
|
1562
|
-
try {
|
|
1563
|
-
const value = localStorage.getItem(`${REALTIME_MODEL_STORAGE_PREFIX}:${workspaceId}`);
|
|
1564
|
-
return isRealtimeModel(value) ? value : null;
|
|
1565
|
-
} catch {
|
|
1566
|
-
return null;
|
|
1567
|
-
}
|
|
1568
|
-
}
|
|
1569
|
-
|
|
1570
|
-
function writeRealtimeModelPreference(workspaceId: string, model: SessionRealtimeModel): void {
|
|
1571
|
-
if (typeof localStorage === "undefined") return;
|
|
1572
|
-
try {
|
|
1573
|
-
localStorage.setItem(`${REALTIME_MODEL_STORAGE_PREFIX}:${workspaceId}`, model);
|
|
1574
|
-
} catch {
|
|
1575
|
-
// Voice selection still works when browser storage is unavailable.
|
|
1576
|
-
}
|
|
1577
|
-
}
|
|
1578
|
-
|
|
1579
|
-
function isRealtimeModel(value: string | null): value is SessionRealtimeModel {
|
|
1580
|
-
return (
|
|
1581
|
-
value === "gpt-live-1-boulder-alpha" ||
|
|
1582
|
-
value === "opengeni-gateway/openai/gpt-realtime-2.1" ||
|
|
1583
|
-
value === "opengeni-gateway/openai/gpt-realtime-mini" ||
|
|
1584
|
-
value === "opengeni-gateway/xai/grok-voice-think-fast-2.0" ||
|
|
1585
|
-
value === "supergrok/grok-voice-think-fast-2.0" ||
|
|
1586
|
-
value === "workspace-gateway/openai/gpt-realtime-2.1" ||
|
|
1587
|
-
value === "workspace-gateway/openai/gpt-realtime-mini" ||
|
|
1588
|
-
value === "workspace-gateway/xai/grok-voice-think-fast-2.0"
|
|
1589
|
-
);
|
|
1590
|
-
}
|
|
1591
|
-
|
|
1592
1180
|
/** @deprecated Use the provider-neutral realtime names. */
|
|
1593
1181
|
export const useSessionCodexRealtime = useSessionRealtime;
|
|
1594
1182
|
/** @deprecated Use the provider-neutral realtime names. */
|