@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,80 +1,68 @@
|
|
|
1
|
+
import { ClaudeMark } from "./claude-mark";
|
|
2
|
+
import { GrokMark } from "./grok-mark";
|
|
3
|
+
import { ChatGptMark, ModelMark, modelHasMark } from "./model-mark";
|
|
4
|
+
import { modelDisplayName, modelLogoUrl } from "@opengeni/sdk/model-display";
|
|
1
5
|
import type { ClientModel, LatencyMode, ReasoningEffort } from "@opengeni/sdk";
|
|
2
6
|
import {
|
|
3
|
-
CheckIcon,
|
|
4
7
|
ChevronDownIcon,
|
|
5
8
|
ChevronLeftIcon,
|
|
6
9
|
ChevronRightIcon,
|
|
7
10
|
Globe2Icon,
|
|
8
11
|
KeyRoundIcon,
|
|
12
|
+
SparklesIcon,
|
|
9
13
|
ZapIcon,
|
|
10
14
|
} from "lucide-react";
|
|
11
15
|
import { motion, useReducedMotion } from "motion/react";
|
|
12
|
-
import { DropdownMenu } from "radix-ui";
|
|
13
16
|
import {
|
|
14
|
-
|
|
17
|
+
Suspense,
|
|
18
|
+
lazy,
|
|
15
19
|
useMemo,
|
|
16
|
-
|
|
20
|
+
useId,
|
|
17
21
|
useState,
|
|
18
22
|
type CSSProperties,
|
|
19
23
|
type ReactNode,
|
|
20
|
-
type SVGProps,
|
|
21
24
|
} from "react";
|
|
22
25
|
import { cn } from "../lib/cn";
|
|
26
|
+
import {
|
|
27
|
+
billingClassForMissingSelection,
|
|
28
|
+
defaultModelPolicyPickerMessages,
|
|
29
|
+
effectiveRows as sharedEffectiveRows,
|
|
30
|
+
groupPresentationFor,
|
|
31
|
+
SCOPED_BILLING_HINTS,
|
|
32
|
+
type ModelPickerGroupPresentation,
|
|
33
|
+
type ModelPolicyPickerMessages,
|
|
34
|
+
} from "../model-picker-model";
|
|
35
|
+
import { MENU_CHEVRON_CLASS } from "../lib/menu-styles";
|
|
23
36
|
import { usePortalTokenSource, usePortalTokenStyle } from "../lib/use-portal-token-style";
|
|
24
37
|
import {
|
|
25
|
-
effortOptionsForModel,
|
|
26
38
|
findPickerRow,
|
|
27
|
-
groupPickerRowsByBillingClass,
|
|
28
39
|
labelReasoningEffort,
|
|
29
|
-
|
|
30
|
-
runnableLatencyModesForModel,
|
|
40
|
+
modelOffersEffortChoice,
|
|
31
41
|
type PickerBillingClass,
|
|
32
42
|
type PickerModelRow,
|
|
33
43
|
} from "../model-policy";
|
|
34
44
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
45
|
+
const LazyModelPolicyPickerMenu = lazy(() =>
|
|
46
|
+
import("./model-policy-picker-menu").then(({ ModelPolicyPickerPopover }) => ({
|
|
47
|
+
default: ModelPolicyPickerPopover,
|
|
48
|
+
})),
|
|
49
|
+
);
|
|
38
50
|
|
|
39
|
-
type
|
|
40
|
-
level: NavLevel;
|
|
41
|
-
rail: PickerBillingClass | null;
|
|
42
|
-
modelId: string | null;
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
type NavUpdater = PickerNavState | ((previous: PickerNavState) => PickerNavState);
|
|
51
|
+
type ClientPickerModelRow = PickerModelRow<ClientModel>;
|
|
46
52
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
loading: string;
|
|
50
|
-
noModels: string;
|
|
51
|
-
thinking: string;
|
|
52
|
-
fast: string;
|
|
53
|
-
fastRateHint: string;
|
|
54
|
-
codexOnly: string;
|
|
55
|
-
billingHints: Record<PickerBillingClass, string>;
|
|
56
|
-
};
|
|
53
|
+
/** Presentation only; never changes model identity, billing or availability. */
|
|
54
|
+
export type ModelPolicyPickerGroupPresentation = ModelPickerGroupPresentation<ReactNode>;
|
|
57
55
|
|
|
58
|
-
export
|
|
59
|
-
|
|
60
|
-
loading: "Loading model catalog…",
|
|
61
|
-
noModels: "No models available.",
|
|
62
|
-
thinking: "Thinking",
|
|
63
|
-
fast: "Fast",
|
|
64
|
-
fastRateHint: "2× rate",
|
|
65
|
-
codexOnly: "Codex-only session",
|
|
66
|
-
billingHints: {
|
|
67
|
-
opengeni_credits: "Will use credits",
|
|
68
|
-
external: "Provider terms and limits apply",
|
|
69
|
-
codex_subscription: "ChatGPT / Codex plan",
|
|
70
|
-
supergrok_subscription: "SuperGrok / xAI plan",
|
|
71
|
-
byok: "Billed to your AI Gateway",
|
|
72
|
-
},
|
|
73
|
-
};
|
|
56
|
+
export { defaultModelPolicyPickerMessages, groupPresentationFor, SCOPED_BILLING_HINTS };
|
|
57
|
+
export type { ModelPolicyPickerMessages };
|
|
74
58
|
|
|
75
59
|
export type ModelPolicyPickerProps = {
|
|
60
|
+
/** Host branding for payment-source groups, shared by menu and trigger. */
|
|
61
|
+
groupPresentation?: ModelPolicyPickerGroupPresentation | undefined;
|
|
76
62
|
/** Lightweight deployment models. Catalog rows take precedence when supplied. */
|
|
77
63
|
models?: ClientModel[] | undefined;
|
|
64
|
+
/** Warn only when the draft actually contains images this model cannot view. */
|
|
65
|
+
hasImageAttachments?: boolean | undefined;
|
|
78
66
|
/** Catalog-backed rows with availability and billing-class truth. */
|
|
79
67
|
rows?: PickerModelRow[] | undefined;
|
|
80
68
|
model: string;
|
|
@@ -90,17 +78,37 @@ export type ModelPolicyPickerProps = {
|
|
|
90
78
|
onOpenChange?: ((open: boolean) => void) | undefined;
|
|
91
79
|
/** Non-Codex models stay visible but cannot be selected. */
|
|
92
80
|
codexOnly?: boolean | undefined;
|
|
93
|
-
/**
|
|
81
|
+
/** Identity of the current session scope. */
|
|
94
82
|
sessionKey?: string | undefined;
|
|
95
83
|
/** Prefer bottom on new-chat surfaces and top for bottom-docked composers. */
|
|
96
84
|
menuSide?: "top" | "bottom" | undefined;
|
|
85
|
+
/**
|
|
86
|
+
* Default true: show models the way people choose them, with clean names,
|
|
87
|
+
* maker marks, one "API keys" group for organization- and workspace-connected
|
|
88
|
+
* keys, and one row for identical copies. Models settings passes false to
|
|
89
|
+
* keep its scope-aware presentation (raw catalog labels, scoped groups).
|
|
90
|
+
*/
|
|
91
|
+
collapseScopes?: boolean | undefined;
|
|
97
92
|
/** Hide latency controls on surfaces whose saved policy does not include latency. */
|
|
98
93
|
allowLatencyMode?: boolean | undefined;
|
|
94
|
+
/** Hide effort and latency controls when the saved policy chooses only a model identity. */
|
|
95
|
+
allowModelOptions?: boolean | undefined;
|
|
96
|
+
/** Settings → Models. Shown when the catalog has no model that can run. */
|
|
97
|
+
connectModelsHref?: string | undefined;
|
|
99
98
|
/** Classes for the portalled menu surface. Prefer --og-* tokens for theming. */
|
|
100
99
|
contentClassName?: string | undefined;
|
|
101
100
|
/** Inline styles for the portalled menu, applied after inherited --og-* tokens. */
|
|
102
101
|
contentStyle?: CSSProperties | undefined;
|
|
103
102
|
className?: string | undefined;
|
|
103
|
+
/**
|
|
104
|
+
* "pill" (default) is the composer's quiet rounded trigger with the effort.
|
|
105
|
+
* "field" is a settings control: a bordered rectangle with the model name
|
|
106
|
+
* and `triggerMeta` (for example the payer) in muted text. The effort stays
|
|
107
|
+
* in the menu.
|
|
108
|
+
*/
|
|
109
|
+
triggerStyle?: "pill" | "field" | undefined;
|
|
110
|
+
/** Muted text after the model name in the "field" trigger. */
|
|
111
|
+
triggerMeta?: ReactNode;
|
|
104
112
|
messages?: Partial<ModelPolicyPickerMessages> | undefined;
|
|
105
113
|
onModelChange: (modelId: string) => void;
|
|
106
114
|
onEffortChange: (effort: ReasoningEffort) => void;
|
|
@@ -109,64 +117,29 @@ export type ModelPolicyPickerProps = {
|
|
|
109
117
|
|
|
110
118
|
const SLIDE_EASE = [0.22, 1, 0.36, 1] as const;
|
|
111
119
|
|
|
112
|
-
function OpenGeniMark(props: SVGProps<SVGSVGElement>) {
|
|
113
|
-
return (
|
|
114
|
-
<svg
|
|
115
|
-
viewBox="0 0 140 133"
|
|
116
|
-
fill="none"
|
|
117
|
-
stroke="currentColor"
|
|
118
|
-
strokeWidth={1.2}
|
|
119
|
-
strokeLinejoin="round"
|
|
120
|
-
aria-hidden="true"
|
|
121
|
-
{...props}
|
|
122
|
-
>
|
|
123
|
-
<g transform="translate(-17.5,-20.999893188476562) scale(1.75)">
|
|
124
|
-
<g transform="translate(0,-952.36218)">
|
|
125
|
-
<path d="m 60.7828,964.36215 27.1809,0.8834 -27.1809,25.9958 z m -1.9745,1.4513 0,26.7845 -25.2681,0 c 8.6166,-8.7334 16.8796,-17.8103 25.2681,-26.7845 z m 27.7053,3.628 3.4864,1.1989 -12.5877,7.4768 z m -68.1835,2.9656 5.5226,0 12.8654,14.0705 -5.9854,6.1204 -12.4026,0 c 9e-4,-6.7347 0,-13.4597 0,-20.1909 z m -1.9746,1.2304 0,5.8364 -6.3555,0 z m 3.363,20.9796 38.627,0 -10.7675,29.43465 z m 39.0898,4.54286 0,41.20229 -12.5878,-6.8775 c 4.1972,-11.443 8.3886,-22.879 12.5878,-34.32479 z" />
|
|
126
|
-
</g>
|
|
127
|
-
</g>
|
|
128
|
-
</svg>
|
|
129
|
-
);
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
function ChatGptMark(props: SVGProps<SVGSVGElement>) {
|
|
133
|
-
return (
|
|
134
|
-
<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" {...props}>
|
|
135
|
-
<path d="M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3653-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8414 3.3698-2.02 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.783-2.7622a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z" />
|
|
136
|
-
</svg>
|
|
137
|
-
);
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
function XaiMark(props: SVGProps<SVGSVGElement>) {
|
|
141
|
-
return (
|
|
142
|
-
<svg viewBox="0 0 466.04 516.93" fill="currentColor" aria-hidden="true" {...props}>
|
|
143
|
-
<polygon points="0.12 182.71 234.14 516.92 338.15 516.92 104.13 182.71 0.12 182.71" />
|
|
144
|
-
<polygon points="0 516.92 104.08 516.92 156.08 442.67 104.04 368.34 0 516.92" />
|
|
145
|
-
<polygon points="466.04 0 361.96 0 182.1 256.86 234.15 331.18 466.04 0" />
|
|
146
|
-
<polygon points="380.78 516.92 466.04 516.92 466.04 37.16 380.78 158.92 380.78 516.92" />
|
|
147
|
-
</svg>
|
|
148
|
-
);
|
|
149
|
-
}
|
|
150
|
-
|
|
151
120
|
export function BillingClassMark(props: {
|
|
152
121
|
billingClass: PickerBillingClass;
|
|
122
|
+
presentation?: ModelPolicyPickerGroupPresentation[PickerBillingClass] | undefined;
|
|
153
123
|
className?: string | undefined;
|
|
154
124
|
"aria-label"?: string | undefined;
|
|
155
125
|
}) {
|
|
156
126
|
const labels: Record<PickerBillingClass, string> = {
|
|
157
|
-
opengeni_credits: "
|
|
127
|
+
opengeni_credits: "Models",
|
|
158
128
|
external: "External provider",
|
|
159
129
|
codex_subscription: "Codex",
|
|
160
130
|
supergrok_subscription: "SuperGrok",
|
|
161
|
-
|
|
131
|
+
claude_subscription: "Claude",
|
|
132
|
+
byok: "API key",
|
|
133
|
+
organization_byok: "API key",
|
|
162
134
|
};
|
|
163
|
-
|
|
135
|
+
if (props.presentation?.icon === null) return null;
|
|
136
|
+
const label = props["aria-label"] ?? props.presentation?.label ?? labels[props.billingClass];
|
|
164
137
|
const accessibility =
|
|
165
138
|
label.length === 0
|
|
166
139
|
? { "aria-hidden": true as const }
|
|
167
140
|
: { role: "img" as const, "aria-label": label };
|
|
168
141
|
const shell = cn(
|
|
169
|
-
"inline-flex size-3.5 shrink-0 items-center justify-center overflow-hidden text-og-fg-subtle",
|
|
142
|
+
"inline-flex size-3.5 shrink-0 items-center justify-center overflow-hidden text-og-fg-subtle [&>svg]:size-full [&>img]:size-full",
|
|
170
143
|
props.className,
|
|
171
144
|
);
|
|
172
145
|
const mark = "size-3.5";
|
|
@@ -176,14 +149,18 @@ export function BillingClassMark(props: {
|
|
|
176
149
|
data-testid={`billing-class-icon-${props.billingClass}`}
|
|
177
150
|
{...accessibility}
|
|
178
151
|
>
|
|
179
|
-
{props.
|
|
180
|
-
|
|
152
|
+
{props.presentation?.icon !== undefined ? (
|
|
153
|
+
props.presentation.icon
|
|
154
|
+
) : props.billingClass === "opengeni_credits" ? (
|
|
155
|
+
<SparklesIcon className={mark} aria-hidden />
|
|
181
156
|
) : props.billingClass === "external" ? (
|
|
182
157
|
<Globe2Icon className={mark} aria-hidden />
|
|
183
158
|
) : props.billingClass === "codex_subscription" ? (
|
|
184
159
|
<ChatGptMark className={mark} />
|
|
160
|
+
) : props.billingClass === "claude_subscription" ? (
|
|
161
|
+
<ClaudeMark className={mark} />
|
|
185
162
|
) : props.billingClass === "supergrok_subscription" ? (
|
|
186
|
-
<
|
|
163
|
+
<GrokMark className={mark} />
|
|
187
164
|
) : (
|
|
188
165
|
<KeyRoundIcon className={mark} aria-hidden />
|
|
189
166
|
)}
|
|
@@ -191,57 +168,67 @@ export function BillingClassMark(props: {
|
|
|
191
168
|
);
|
|
192
169
|
}
|
|
193
170
|
|
|
194
|
-
|
|
195
|
-
|
|
171
|
+
/**
|
|
172
|
+
* The trigger shows who makes the chosen model. Subscription rails already
|
|
173
|
+
* carry their maker's mark (ChatGPT, Claude, Grok). Configured catalog logos win
|
|
174
|
+
* in collapsed model presentation; otherwise explicit host branding wins and models show
|
|
175
|
+
* the maker's logo instead of a generic key, falling back to the group mark.
|
|
176
|
+
*/
|
|
177
|
+
function SelectedModelMark(input: {
|
|
178
|
+
props: ModelPolicyPickerProps;
|
|
179
|
+
selected: ClientPickerModelRow | null;
|
|
180
|
+
}) {
|
|
181
|
+
const billingClass =
|
|
182
|
+
input.selected?.billingClass ?? billingClassForMissingSelection(input.props.model);
|
|
183
|
+
const presentation = groupPresentationFor(input.props, billingClass);
|
|
184
|
+
const model = input.selected?.catalog ?? input.props.model;
|
|
185
|
+
if (input.props.collapseScopes === false) {
|
|
186
|
+
return (
|
|
187
|
+
<BillingClassMark
|
|
188
|
+
billingClass={billingClass}
|
|
189
|
+
presentation={presentation}
|
|
190
|
+
aria-label={presentation?.label ?? SCOPED_MARK_LABELS[billingClass]}
|
|
191
|
+
className="text-og-fg"
|
|
192
|
+
/>
|
|
193
|
+
);
|
|
194
|
+
}
|
|
195
|
+
if (modelLogoUrl(model)) {
|
|
196
|
+
return <ModelMark model={model} className="text-og-fg" />;
|
|
197
|
+
}
|
|
198
|
+
if (
|
|
199
|
+
presentation?.icon !== undefined ||
|
|
200
|
+
BRANDED_BILLING_CLASSES.has(billingClass) ||
|
|
201
|
+
!modelHasMark(model)
|
|
202
|
+
) {
|
|
203
|
+
return (
|
|
204
|
+
<BillingClassMark
|
|
205
|
+
billingClass={billingClass}
|
|
206
|
+
presentation={presentation}
|
|
207
|
+
className="text-og-fg"
|
|
208
|
+
/>
|
|
209
|
+
);
|
|
210
|
+
}
|
|
211
|
+
return <ModelMark model={model} className="text-og-fg" />;
|
|
196
212
|
}
|
|
197
213
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
): ClientPickerModelRow[] {
|
|
203
|
-
if (!codexOnly) return rows;
|
|
204
|
-
return rows.map((row) =>
|
|
205
|
-
isCodexModel(row.catalog)
|
|
206
|
-
? row
|
|
207
|
-
: {
|
|
208
|
-
...row,
|
|
209
|
-
selectable: false,
|
|
210
|
-
unavailableReason: row.unavailableReason ?? unavailableReason,
|
|
211
|
-
},
|
|
212
|
-
);
|
|
213
|
-
}
|
|
214
|
+
const SCOPED_MARK_LABELS: Partial<Record<PickerBillingClass, string>> = {
|
|
215
|
+
byok: "Workspace provider account",
|
|
216
|
+
organization_byok: "Organization provider account",
|
|
217
|
+
};
|
|
214
218
|
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
return applyCodexOnly(rows, props.codexOnly === true, messages.codexOnly);
|
|
219
|
+
/** A selection the catalog no longer lists: its clean name (settings keep the id). */
|
|
220
|
+
function fallbackName(props: ModelPolicyPickerProps): string {
|
|
221
|
+
return props.collapseScopes === false ? props.model : modelDisplayName(props.model);
|
|
219
222
|
}
|
|
220
223
|
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
return onlyRail
|
|
227
|
-
? { level: "models", rail: onlyRail, modelId: null }
|
|
228
|
-
: { level: "providers", rail: null, modelId: null };
|
|
229
|
-
}
|
|
230
|
-
return { level: "thinking", rail: selected.billingClass, modelId: selected.id };
|
|
231
|
-
}
|
|
224
|
+
const BRANDED_BILLING_CLASSES: ReadonlySet<PickerBillingClass> = new Set([
|
|
225
|
+
"codex_subscription",
|
|
226
|
+
"claude_subscription",
|
|
227
|
+
"supergrok_subscription",
|
|
228
|
+
]);
|
|
232
229
|
|
|
233
|
-
function
|
|
234
|
-
|
|
235
|
-
rows: ClientPickerModelRow[],
|
|
236
|
-
model: string,
|
|
237
|
-
): [PickerNavState, (next: NavUpdater) => void] {
|
|
238
|
-
const [state, setState] = useState<PickerNavState>(() => defaultNavState(rows, model));
|
|
239
|
-
useEffect(() => {
|
|
240
|
-
setState(defaultNavState(rows, model));
|
|
241
|
-
// The menu deliberately preserves its drill-down while the same session is mounted.
|
|
242
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
243
|
-
}, [sessionKey]);
|
|
244
|
-
return [state, setState];
|
|
230
|
+
export function effectiveRows(props: ModelPolicyPickerProps): ClientPickerModelRow[] {
|
|
231
|
+
return sharedEffectiveRows(props);
|
|
245
232
|
}
|
|
246
233
|
|
|
247
234
|
export function PickerNavRow(props: {
|
|
@@ -252,6 +239,7 @@ export function PickerNavRow(props: {
|
|
|
252
239
|
showChevron?: boolean | undefined;
|
|
253
240
|
disabled?: boolean | undefined;
|
|
254
241
|
title?: string | undefined;
|
|
242
|
+
description?: string | undefined;
|
|
255
243
|
active?: boolean | undefined;
|
|
256
244
|
testId?: string | undefined;
|
|
257
245
|
onClick: () => void;
|
|
@@ -261,28 +249,24 @@ export function PickerNavRow(props: {
|
|
|
261
249
|
type="button"
|
|
262
250
|
disabled={props.disabled}
|
|
263
251
|
title={props.title}
|
|
252
|
+
aria-description={props.description}
|
|
264
253
|
onClick={props.onClick}
|
|
265
254
|
data-testid={props.testId}
|
|
266
255
|
className={cn(
|
|
267
|
-
|
|
256
|
+
// The one menu row (lib/menu-styles.ts), with density tokens for embedders.
|
|
257
|
+
"flex min-h-8 w-full cursor-pointer items-center gap-2.5 rounded-og-md px-[var(--og-model-picker-row-padding-x)] py-[var(--og-model-picker-row-padding-y)] text-left text-og-fg outline-hidden transition-colors duration-[120ms] hover:bg-og-hover focus-visible:bg-og-hover focus-visible:outline-2 focus-visible:-outline-offset-2! focus-visible:outline-og-accent/55 pointer-coarse:min-h-11",
|
|
268
258
|
props.disabled && "cursor-not-allowed opacity-50",
|
|
269
259
|
)}
|
|
270
260
|
>
|
|
271
261
|
{props.icon}
|
|
272
262
|
<span className="min-w-0 flex-1">
|
|
273
|
-
<span className=
|
|
274
|
-
{props.label}
|
|
275
|
-
</span>
|
|
263
|
+
<span className="block truncate text-og-menu">{props.label}</span>
|
|
276
264
|
{props.hint ? (
|
|
277
|
-
<span className="mt-0.5 block truncate text-og-
|
|
278
|
-
{props.hint}
|
|
279
|
-
</span>
|
|
265
|
+
<span className="mt-0.5 block truncate text-og-sm text-og-fg-muted">{props.hint}</span>
|
|
280
266
|
) : null}
|
|
281
267
|
</span>
|
|
282
268
|
{props.trailing ? <span className="ml-auto shrink-0">{props.trailing}</span> : null}
|
|
283
|
-
{props.showChevron === false ? null :
|
|
284
|
-
<ChevronRightIcon className="size-3.5 shrink-0 text-og-fg-subtle" />
|
|
285
|
-
)}
|
|
269
|
+
{props.showChevron === false ? null : <ChevronRightIcon className={MENU_CHEVRON_CLASS} />}
|
|
286
270
|
</button>
|
|
287
271
|
);
|
|
288
272
|
}
|
|
@@ -294,14 +278,16 @@ export function PickerBackHeader(props: {
|
|
|
294
278
|
trailing?: ReactNode;
|
|
295
279
|
}) {
|
|
296
280
|
return (
|
|
297
|
-
<div className="mb-1 flex items-center gap-
|
|
281
|
+
<div className="mb-1.5 flex min-h-9 items-center gap-1 border-b border-og-border pb-1.5">
|
|
298
282
|
<button
|
|
299
283
|
type="button"
|
|
300
284
|
onClick={props.onBack}
|
|
301
285
|
data-testid="model-picker-back"
|
|
302
|
-
className="flex min-w-0 flex-1 cursor-pointer items-center gap-1
|
|
286
|
+
className="flex min-h-8 min-w-0 flex-1 cursor-pointer items-center gap-1 rounded-og-md pr-2.5 text-left text-og-fg outline-hidden transition-colors duration-[120ms] hover:bg-og-hover focus-visible:outline-2 focus-visible:-outline-offset-2! focus-visible:outline-og-accent/55 pointer-coarse:min-h-11"
|
|
303
287
|
>
|
|
304
|
-
<
|
|
288
|
+
<span className="flex size-8 shrink-0 items-center justify-center text-og-fg-muted">
|
|
289
|
+
<ChevronLeftIcon className="size-4" />
|
|
290
|
+
</span>
|
|
305
291
|
{props.icon}
|
|
306
292
|
<span className="min-w-0 flex-1 truncate text-og-menu font-medium">{props.label}</span>
|
|
307
293
|
</button>
|
|
@@ -329,261 +315,39 @@ export function PickerAnimatedPage(props: {
|
|
|
329
315
|
);
|
|
330
316
|
}
|
|
331
317
|
|
|
332
|
-
|
|
333
|
-
props: ModelPolicyPickerProps & {
|
|
334
|
-
nav?: PickerNavState | undefined;
|
|
335
|
-
onNavChange?: ((next: NavUpdater) => void) | undefined;
|
|
336
|
-
},
|
|
337
|
-
) {
|
|
338
|
-
const messages = useMemo(
|
|
339
|
-
() => ({ ...defaultModelPolicyPickerMessages, ...props.messages }),
|
|
340
|
-
[props.messages],
|
|
341
|
-
);
|
|
342
|
-
const rows = effectiveRows(props);
|
|
343
|
-
const groups = useMemo(() => groupPickerRowsByBillingClass(rows), [rows]);
|
|
344
|
-
const [localNav, setLocalNav] = usePickerNavState(
|
|
345
|
-
props.nav === undefined ? props.sessionKey : undefined,
|
|
346
|
-
rows,
|
|
347
|
-
props.model,
|
|
348
|
-
);
|
|
349
|
-
const nav = props.nav ?? localNav;
|
|
350
|
-
const setNav = props.onNavChange ?? setLocalNav;
|
|
351
|
-
const [direction, setDirection] = useState<1 | -1>(1);
|
|
352
|
-
|
|
353
|
-
const effectiveNav =
|
|
354
|
-
nav.level === "providers" && groups.length === 1
|
|
355
|
-
? { level: "models" as const, rail: groups[0]!.billingClass, modelId: null }
|
|
356
|
-
: nav;
|
|
357
|
-
const activeGroup =
|
|
358
|
-
effectiveNav.rail === null
|
|
359
|
-
? undefined
|
|
360
|
-
: groups.find((group) => group.billingClass === effectiveNav.rail);
|
|
361
|
-
const focusModel =
|
|
362
|
-
effectiveNav.modelId === null ? undefined : findPickerRow(rows, effectiveNav.modelId);
|
|
363
|
-
const selectedRow = findPickerRow(rows, props.model);
|
|
364
|
-
|
|
365
|
-
const go = (next: PickerNavState, nextDirection: 1 | -1) => {
|
|
366
|
-
setDirection(nextDirection);
|
|
367
|
-
setNav(next);
|
|
368
|
-
};
|
|
369
|
-
|
|
370
|
-
const selectEffort = (row: ClientPickerModelRow, effort: ReasoningEffort) => {
|
|
371
|
-
if (!row.selectable) return;
|
|
372
|
-
if (row.id !== props.model) props.onModelChange(row.id);
|
|
373
|
-
props.onEffortChange(effort);
|
|
374
|
-
};
|
|
375
|
-
|
|
376
|
-
const pageKey =
|
|
377
|
-
effectiveNav.level === "providers"
|
|
378
|
-
? "providers"
|
|
379
|
-
: effectiveNav.level === "models"
|
|
380
|
-
? `models:${effectiveNav.rail ?? ""}`
|
|
381
|
-
: `thinking:${effectiveNav.modelId ?? ""}`;
|
|
382
|
-
|
|
383
|
-
let body: ReactNode;
|
|
384
|
-
if (props.loading) {
|
|
385
|
-
body = <p className="px-2 py-3 text-og-control text-og-fg-subtle">{messages.loading}</p>;
|
|
386
|
-
} else if (groups.length === 0) {
|
|
387
|
-
body = <p className="px-2 py-3 text-og-control text-og-fg-subtle">{messages.noModels}</p>;
|
|
388
|
-
} else if (effectiveNav.level === "providers") {
|
|
389
|
-
body = (
|
|
390
|
-
<div className="flex flex-col gap-0.5" data-testid="model-picker-providers">
|
|
391
|
-
{groups.map((group) => (
|
|
392
|
-
<PickerNavRow
|
|
393
|
-
key={group.billingClass}
|
|
394
|
-
label={group.label}
|
|
395
|
-
hint={messages.billingHints[group.billingClass]}
|
|
396
|
-
icon={<BillingClassMark billingClass={group.billingClass} />}
|
|
397
|
-
active={selectedRow?.billingClass === group.billingClass}
|
|
398
|
-
testId={`model-picker-rail-${group.billingClass}`}
|
|
399
|
-
onClick={() => go({ level: "models", rail: group.billingClass, modelId: null }, 1)}
|
|
400
|
-
/>
|
|
401
|
-
))}
|
|
402
|
-
</div>
|
|
403
|
-
);
|
|
404
|
-
} else if (effectiveNav.level === "models" && activeGroup) {
|
|
405
|
-
body = (
|
|
406
|
-
<div data-testid="model-picker-models">
|
|
407
|
-
{groups.length > 1 ? (
|
|
408
|
-
<PickerBackHeader
|
|
409
|
-
label={activeGroup.label}
|
|
410
|
-
icon={<BillingClassMark billingClass={activeGroup.billingClass} />}
|
|
411
|
-
onBack={() => go({ level: "providers", rail: null, modelId: null }, -1)}
|
|
412
|
-
/>
|
|
413
|
-
) : null}
|
|
414
|
-
<div className="flex flex-col gap-0.5">
|
|
415
|
-
{activeGroup.rows.map((row) => (
|
|
416
|
-
<PickerNavRow
|
|
417
|
-
key={`${row.billingClass}:${row.id}`}
|
|
418
|
-
label={row.label}
|
|
419
|
-
hint={row.unavailableReason ?? undefined}
|
|
420
|
-
disabled={!row.selectable}
|
|
421
|
-
title={row.unavailableReason ?? undefined}
|
|
422
|
-
active={row.id === props.model}
|
|
423
|
-
testId={`model-picker-choice-${row.id}`}
|
|
424
|
-
onClick={() => {
|
|
425
|
-
if (row.selectable) {
|
|
426
|
-
go({ level: "thinking", rail: row.billingClass, modelId: row.id }, 1);
|
|
427
|
-
}
|
|
428
|
-
}}
|
|
429
|
-
/>
|
|
430
|
-
))}
|
|
431
|
-
</div>
|
|
432
|
-
</div>
|
|
433
|
-
);
|
|
434
|
-
} else if (effectiveNav.level === "thinking" && focusModel) {
|
|
435
|
-
const activeModel = focusModel.id === props.model;
|
|
436
|
-
const supportsFast = runnableLatencyModesForModel(focusModel.catalog).includes("fast");
|
|
437
|
-
body = (
|
|
438
|
-
<div data-testid="model-picker-reasoning">
|
|
439
|
-
<PickerBackHeader
|
|
440
|
-
label={focusModel.label}
|
|
441
|
-
icon={<BillingClassMark billingClass={focusModel.billingClass} />}
|
|
442
|
-
onBack={() => go({ level: "models", rail: focusModel.billingClass, modelId: null }, -1)}
|
|
443
|
-
trailing={
|
|
444
|
-
supportsFast && props.allowLatencyMode !== false ? (
|
|
445
|
-
<button
|
|
446
|
-
type="button"
|
|
447
|
-
disabled={!focusModel.selectable}
|
|
448
|
-
aria-pressed={activeModel && props.latencyMode === "fast"}
|
|
449
|
-
aria-label={
|
|
450
|
-
activeModel && props.latencyMode === "fast"
|
|
451
|
-
? `Disable ${messages.fast}`
|
|
452
|
-
: `Enable ${messages.fast}`
|
|
453
|
-
}
|
|
454
|
-
title={`${messages.fast} · ${messages.fastRateHint}`}
|
|
455
|
-
data-testid="model-picker-fast"
|
|
456
|
-
onClick={() => {
|
|
457
|
-
if (!activeModel) {
|
|
458
|
-
props.onModelChange(focusModel.id);
|
|
459
|
-
}
|
|
460
|
-
props.onLatencyModeChange(
|
|
461
|
-
activeModel && props.latencyMode === "fast" ? "standard" : "fast",
|
|
462
|
-
);
|
|
463
|
-
}}
|
|
464
|
-
className={cn(
|
|
465
|
-
"flex size-8 shrink-0 cursor-pointer items-center justify-center rounded-og-sm text-og-fg-subtle outline-hidden transition-colors hover:bg-og-surface-2 focus-visible:ring-2 focus-visible:ring-og-accent/40 disabled:cursor-not-allowed disabled:opacity-50",
|
|
466
|
-
activeModel && props.latencyMode === "fast" && "text-og-fg",
|
|
467
|
-
)}
|
|
468
|
-
>
|
|
469
|
-
<ZapIcon
|
|
470
|
-
className={cn(
|
|
471
|
-
"size-3.5",
|
|
472
|
-
activeModel && props.latencyMode === "fast" && "fill-current",
|
|
473
|
-
)}
|
|
474
|
-
/>
|
|
475
|
-
</button>
|
|
476
|
-
) : null
|
|
477
|
-
}
|
|
478
|
-
/>
|
|
479
|
-
<p className="px-2.5 pt-1 pb-1 text-og-control font-medium tracking-wide text-og-fg-subtle uppercase">
|
|
480
|
-
{messages.thinking}
|
|
481
|
-
</p>
|
|
482
|
-
{focusModel.catalog.capabilities?.inputModalities.includes("image") === false ? (
|
|
483
|
-
<p className="px-2.5 pb-1.5 text-og-control leading-relaxed text-og-fg-subtle">
|
|
484
|
-
Unsupported attachments stay in the session but are hidden from this model.
|
|
485
|
-
</p>
|
|
486
|
-
) : null}
|
|
487
|
-
<div className="flex flex-col gap-0.5">
|
|
488
|
-
{effortOptionsForModel(focusModel.catalog).map((effort) => {
|
|
489
|
-
const selected = activeModel && effort === props.effort;
|
|
490
|
-
return (
|
|
491
|
-
<button
|
|
492
|
-
key={effort}
|
|
493
|
-
type="button"
|
|
494
|
-
disabled={!focusModel.selectable}
|
|
495
|
-
onClick={() => selectEffort(focusModel, effort)}
|
|
496
|
-
className={cn(
|
|
497
|
-
"flex h-[var(--og-model-picker-effort-height)] w-full cursor-pointer items-center rounded-og-sm px-[var(--og-model-picker-row-padding-x)] text-left text-og-menu text-og-fg outline-hidden transition-colors hover:bg-og-surface-2 focus-visible:ring-2 focus-visible:ring-og-accent/40 disabled:cursor-not-allowed disabled:opacity-50",
|
|
498
|
-
selected && "bg-og-surface-2",
|
|
499
|
-
)}
|
|
500
|
-
>
|
|
501
|
-
<span className="min-w-0 flex-1 truncate">{labelReasoningEffort(effort)}</span>
|
|
502
|
-
{selected ? (
|
|
503
|
-
<CheckIcon
|
|
504
|
-
className="ml-auto size-3.5 shrink-0"
|
|
505
|
-
data-testid="model-picker-effort-check"
|
|
506
|
-
/>
|
|
507
|
-
) : null}
|
|
508
|
-
</button>
|
|
509
|
-
);
|
|
510
|
-
})}
|
|
511
|
-
</div>
|
|
512
|
-
</div>
|
|
513
|
-
);
|
|
514
|
-
} else {
|
|
515
|
-
body = (
|
|
516
|
-
<div className="flex flex-col gap-0.5" data-testid="model-picker-providers">
|
|
517
|
-
{groups.map((group) => (
|
|
518
|
-
<PickerNavRow
|
|
519
|
-
key={group.billingClass}
|
|
520
|
-
label={group.label}
|
|
521
|
-
hint={messages.billingHints[group.billingClass]}
|
|
522
|
-
icon={<BillingClassMark billingClass={group.billingClass} />}
|
|
523
|
-
testId={`model-picker-rail-${group.billingClass}`}
|
|
524
|
-
onClick={() => go({ level: "models", rail: group.billingClass, modelId: null }, 1)}
|
|
525
|
-
/>
|
|
526
|
-
))}
|
|
527
|
-
</div>
|
|
528
|
-
);
|
|
529
|
-
}
|
|
530
|
-
|
|
531
|
-
return (
|
|
532
|
-
<div data-testid="model-picker-menu" className="relative overflow-hidden">
|
|
533
|
-
{props.error ? (
|
|
534
|
-
<p className="px-2 py-1 text-og-control text-og-status-failed" role="alert">
|
|
535
|
-
{props.error}
|
|
536
|
-
</p>
|
|
537
|
-
) : null}
|
|
538
|
-
<PickerAnimatedPage pageKey={pageKey} direction={direction}>
|
|
539
|
-
{body}
|
|
540
|
-
</PickerAnimatedPage>
|
|
541
|
-
</div>
|
|
542
|
-
);
|
|
543
|
-
}
|
|
544
|
-
|
|
545
|
-
/** @internal Shared state seam kept outside the Radix portal for deterministic testing. */
|
|
318
|
+
/** @internal Shared controlled/uncontrolled state seam. */
|
|
546
319
|
export function useModelPolicyPickerState(props: ModelPolicyPickerProps) {
|
|
547
320
|
const [uncontrolledOpen, setUncontrolledOpen] = useState(props.defaultOpen ?? false);
|
|
548
321
|
const open = props.open ?? uncontrolledOpen;
|
|
549
|
-
const rows = effectiveRows(props);
|
|
550
|
-
const [nav, setNav] = usePickerNavState(props.sessionKey, rows, props.model);
|
|
551
|
-
const previousControlledOpen = useRef(props.open);
|
|
552
|
-
useEffect(() => {
|
|
553
|
-
const wasOpen = previousControlledOpen.current;
|
|
554
|
-
previousControlledOpen.current = props.open;
|
|
555
|
-
if (props.open === true && wasOpen !== true) {
|
|
556
|
-
setNav(defaultNavState(rows, props.model));
|
|
557
|
-
}
|
|
558
|
-
// Reset only on the controlled closed-to-open edge; ordinary rerenders
|
|
559
|
-
// deliberately preserve the current drill-down page.
|
|
560
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
561
|
-
}, [props.open]);
|
|
562
322
|
const setOpen = (next: boolean) => {
|
|
563
|
-
if (next) {
|
|
564
|
-
setNav(defaultNavState(rows, props.model));
|
|
565
|
-
}
|
|
566
323
|
if (props.open === undefined) setUncontrolledOpen(next);
|
|
567
324
|
props.onOpenChange?.(next);
|
|
568
325
|
};
|
|
569
|
-
return { open, setOpen, rows
|
|
326
|
+
return { open, setOpen, rows: effectiveRows(props) };
|
|
570
327
|
}
|
|
571
328
|
|
|
572
329
|
export function ModelPolicyPicker(props: ModelPolicyPickerProps) {
|
|
330
|
+
const contentId = useId();
|
|
573
331
|
const trigger = usePortalTokenSource<HTMLButtonElement>();
|
|
574
332
|
const portalStyle = usePortalTokenStyle(trigger.source);
|
|
575
333
|
const messages = useMemo(
|
|
576
334
|
() => ({ ...defaultModelPolicyPickerMessages, ...props.messages }),
|
|
577
335
|
[props.messages],
|
|
578
336
|
);
|
|
579
|
-
const { open, setOpen, rows
|
|
337
|
+
const { open, setOpen, rows } = useModelPolicyPickerState(props);
|
|
580
338
|
const selected = findPickerRow(rows, props.model);
|
|
339
|
+
const needsModel =
|
|
340
|
+
!rows.some((row) => row.selectable) && (rows.length > 0 || Boolean(props.connectModelsHref));
|
|
341
|
+
const selectedDescription = needsModel
|
|
342
|
+
? messages.connectTitle
|
|
343
|
+
: [selected?.label ?? fallbackName(props), labelReasoningEffort(props.effort)].join(" · ");
|
|
581
344
|
|
|
582
345
|
if (props.loading) {
|
|
583
346
|
return (
|
|
584
347
|
<span
|
|
585
348
|
className={cn(
|
|
586
349
|
"og-root inline-flex h-8 w-40 shrink-0 animate-pulse rounded-full bg-og-surface-2",
|
|
350
|
+
props.triggerStyle === "field" && "w-[180px] rounded-og-md",
|
|
587
351
|
props.className,
|
|
588
352
|
)}
|
|
589
353
|
aria-label={messages.loading}
|
|
@@ -591,64 +355,123 @@ export function ModelPolicyPicker(props: ModelPolicyPickerProps) {
|
|
|
591
355
|
/>
|
|
592
356
|
);
|
|
593
357
|
}
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
358
|
+
if (props.triggerStyle === "field") {
|
|
359
|
+
return (
|
|
360
|
+
<>
|
|
597
361
|
<button
|
|
598
362
|
ref={trigger.ref}
|
|
599
363
|
type="button"
|
|
364
|
+
aria-haspopup="dialog"
|
|
365
|
+
aria-expanded={open}
|
|
366
|
+
aria-controls={open ? contentId : undefined}
|
|
367
|
+
data-state={open ? "open" : "closed"}
|
|
368
|
+
data-trigger-style="field"
|
|
369
|
+
onClick={() => setOpen(!open)}
|
|
600
370
|
disabled={props.disabled}
|
|
601
371
|
aria-label={messages.label}
|
|
372
|
+
aria-description={selectedDescription}
|
|
602
373
|
className={cn(
|
|
603
|
-
"og-root
|
|
374
|
+
"og-root inline-flex h-8 min-w-[180px] max-w-full items-center gap-2 rounded-og-md border border-og-border bg-og-surface px-2.5 text-sm text-og-fg outline-hidden transition-colors hover:bg-og-surface-2 focus-visible:ring-2 focus-visible:ring-og-accent/40 disabled:cursor-not-allowed disabled:opacity-50",
|
|
604
375
|
props.className,
|
|
605
376
|
)}
|
|
606
377
|
>
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
<span className="og-model-policy-label-full min-w-0 truncate font-medium text-og-fg max-sm:hidden">
|
|
615
|
-
{selected?.label ?? props.model}
|
|
616
|
-
</span>
|
|
617
|
-
<span className="og-model-policy-label-short min-w-0 truncate font-medium text-og-fg sm:hidden">
|
|
618
|
-
{selected?.shortLabel ?? selected?.label ?? props.model}
|
|
619
|
-
</span>
|
|
620
|
-
<span className="og-model-policy-effort max-sm:hidden">
|
|
621
|
-
{labelReasoningEffort(props.effort)}
|
|
378
|
+
{needsModel ? (
|
|
379
|
+
<SparklesIcon className="size-3.5 shrink-0" aria-hidden />
|
|
380
|
+
) : (
|
|
381
|
+
<SelectedModelMark props={props} selected={selected} />
|
|
382
|
+
)}
|
|
383
|
+
<span className="min-w-0 truncate font-medium">
|
|
384
|
+
{needsModel ? messages.connectTitle : (selected?.label ?? fallbackName(props))}
|
|
622
385
|
</span>
|
|
623
|
-
{props.
|
|
624
|
-
<
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
data-testid="model-picker-fast-icon"
|
|
628
|
-
/>
|
|
386
|
+
{props.triggerMeta && !needsModel ? (
|
|
387
|
+
<span className="min-w-0 shrink-[9999] truncate text-og-fg-muted">
|
|
388
|
+
{props.triggerMeta}
|
|
389
|
+
</span>
|
|
629
390
|
) : null}
|
|
630
|
-
<ChevronDownIcon className="size-3 shrink-0" />
|
|
391
|
+
<ChevronDownIcon className="ml-auto size-3.5 shrink-0 text-og-fg-muted" />
|
|
631
392
|
</button>
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
393
|
+
{open ? (
|
|
394
|
+
<Suspense fallback={null}>
|
|
395
|
+
<LazyModelPolicyPickerMenu
|
|
396
|
+
{...props}
|
|
397
|
+
anchor={trigger.currentRef}
|
|
398
|
+
contentId={contentId}
|
|
399
|
+
portalStyle={portalStyle}
|
|
400
|
+
onOpenChange={setOpen}
|
|
401
|
+
/>
|
|
402
|
+
</Suspense>
|
|
403
|
+
) : null}
|
|
404
|
+
</>
|
|
405
|
+
);
|
|
406
|
+
}
|
|
407
|
+
return (
|
|
408
|
+
<>
|
|
409
|
+
<button
|
|
410
|
+
ref={trigger.ref}
|
|
411
|
+
type="button"
|
|
412
|
+
aria-haspopup="dialog"
|
|
413
|
+
aria-expanded={open}
|
|
414
|
+
aria-controls={open ? contentId : undefined}
|
|
415
|
+
data-state={open ? "open" : "closed"}
|
|
416
|
+
onClick={() => setOpen(!open)}
|
|
417
|
+
disabled={props.disabled}
|
|
418
|
+
aria-label={messages.label}
|
|
419
|
+
aria-description={selectedDescription}
|
|
420
|
+
className={cn(
|
|
421
|
+
// Phone: the composer row also carries attach, dictate, voice, pause
|
|
422
|
+
// and send, so the pill drops its chevron and tightens its padding
|
|
423
|
+
// to keep the model's short name readable.
|
|
424
|
+
"og-root og-model-policy-trigger inline-flex h-[var(--og-model-picker-trigger-height)] min-w-0 max-w-64 items-center gap-1 rounded-full border px-2.5 text-og-control outline-hidden transition-colors focus-visible:ring-2 focus-visible:ring-og-accent/40 disabled:cursor-not-allowed disabled:opacity-50 max-sm:h-11 max-sm:max-w-[7.5rem] max-sm:gap-0.5 max-sm:px-1.5",
|
|
425
|
+
// With no usable model the pill is the one thing that unblocks the
|
|
426
|
+
// composer, so it takes the primary wash.
|
|
427
|
+
needsModel
|
|
428
|
+
? "border-og-primary-border bg-og-primary text-og-primary-fg hover:bg-og-primary-hover"
|
|
429
|
+
: "border-transparent text-og-fg-muted hover:border-og-border hover:bg-og-surface-2 hover:text-og-fg",
|
|
430
|
+
props.className,
|
|
431
|
+
)}
|
|
432
|
+
>
|
|
433
|
+
{needsModel ? (
|
|
434
|
+
<SparklesIcon className="size-3.5 shrink-0" aria-hidden />
|
|
435
|
+
) : (
|
|
436
|
+
<SelectedModelMark props={props} selected={selected} />
|
|
437
|
+
)}
|
|
438
|
+
<span className="og-model-policy-label-full min-w-0 truncate font-medium text-og-fg max-sm:hidden @max-[20rem]/model-controls:hidden">
|
|
439
|
+
{needsModel ? messages.connectTitle : (selected?.label ?? fallbackName(props))}
|
|
440
|
+
</span>
|
|
441
|
+
<span className="og-model-policy-label-short min-w-0 truncate font-medium text-og-fg sm:hidden @max-[20rem]/model-controls:block">
|
|
442
|
+
{needsModel
|
|
443
|
+
? messages.connectTitle
|
|
444
|
+
: (selected?.shortLabel ?? selected?.label ?? fallbackName(props))}
|
|
445
|
+
</span>
|
|
446
|
+
{selected && !needsModel && modelOffersEffortChoice(selected.catalog) ? (
|
|
447
|
+
<span
|
|
448
|
+
className="og-model-policy-effort min-w-0 shrink-[9999] truncate"
|
|
449
|
+
title={labelReasoningEffort(props.effort)}
|
|
450
|
+
>
|
|
451
|
+
{labelReasoningEffort(props.effort)}
|
|
452
|
+
</span>
|
|
453
|
+
) : null}
|
|
454
|
+
{props.latencyMode === "fast" && !needsModel ? (
|
|
455
|
+
<ZapIcon
|
|
456
|
+
className="size-3.5 shrink-0 fill-current stroke-current text-og-fg"
|
|
457
|
+
aria-label={messages.fast}
|
|
458
|
+
data-testid="model-picker-fast-icon"
|
|
459
|
+
/>
|
|
460
|
+
) : null}
|
|
461
|
+
<ChevronDownIcon className="og-model-policy-chevron size-3 shrink-0 max-sm:hidden" />
|
|
462
|
+
</button>
|
|
463
|
+
|
|
464
|
+
{open ? (
|
|
465
|
+
<Suspense fallback={null}>
|
|
466
|
+
<LazyModelPolicyPickerMenu
|
|
467
|
+
{...props}
|
|
468
|
+
anchor={trigger.currentRef}
|
|
469
|
+
contentId={contentId}
|
|
470
|
+
portalStyle={portalStyle}
|
|
471
|
+
onOpenChange={setOpen}
|
|
472
|
+
/>
|
|
473
|
+
</Suspense>
|
|
474
|
+
) : null}
|
|
475
|
+
</>
|
|
653
476
|
);
|
|
654
477
|
}
|