@opengeni/react 3.3.2 → 3.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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
|
@@ -71,17 +71,19 @@ export function useBrowserSessions(
|
|
|
71
71
|
id: 0,
|
|
72
72
|
controller: null,
|
|
73
73
|
});
|
|
74
|
+
const loadQueueRef = useRef<{ pending: boolean; promise: Promise<void> } | null>(null);
|
|
74
75
|
const mountedRef = useRef(true);
|
|
75
76
|
|
|
76
77
|
const visibleState = state.workspaceId === workspaceId ? state : emptyState(workspaceId, enabled);
|
|
77
78
|
|
|
78
79
|
const cancelLoad = useCallback(() => {
|
|
80
|
+
loadQueueRef.current = null;
|
|
79
81
|
const id = requestRef.current.id + 1;
|
|
80
82
|
requestRef.current.controller?.abort();
|
|
81
83
|
requestRef.current = { id, controller: null };
|
|
82
84
|
}, []);
|
|
83
85
|
|
|
84
|
-
const
|
|
86
|
+
const loadOnce = useCallback(
|
|
85
87
|
async (foreground: boolean): Promise<void> => {
|
|
86
88
|
if (!enabled) return;
|
|
87
89
|
const id = requestRef.current.id + 1;
|
|
@@ -128,6 +130,35 @@ export function useBrowserSessions(
|
|
|
128
130
|
[client, enabled, workspaceId],
|
|
129
131
|
);
|
|
130
132
|
|
|
133
|
+
const load = useCallback(
|
|
134
|
+
(foreground: boolean): Promise<void> => {
|
|
135
|
+
const current = loadQueueRef.current;
|
|
136
|
+
if (current) {
|
|
137
|
+
current.pending = true;
|
|
138
|
+
return current.promise;
|
|
139
|
+
}
|
|
140
|
+
const queue = { pending: false, promise: Promise.resolve() };
|
|
141
|
+
loadQueueRef.current = queue;
|
|
142
|
+
queue.promise = Promise.resolve()
|
|
143
|
+
.then(async () => {
|
|
144
|
+
// A slow read must be allowed to finish. Invalidations and polling
|
|
145
|
+
// coalesce into one trailing read instead of repeatedly aborting it.
|
|
146
|
+
while (loadQueueRef.current === queue) {
|
|
147
|
+
queue.pending = false;
|
|
148
|
+
await loadOnce(foreground);
|
|
149
|
+
foreground = false;
|
|
150
|
+
if (!queue.pending) break;
|
|
151
|
+
}
|
|
152
|
+
if (loadQueueRef.current === queue) loadQueueRef.current = null;
|
|
153
|
+
})
|
|
154
|
+
.finally(() => {
|
|
155
|
+
if (loadQueueRef.current === queue) loadQueueRef.current = null;
|
|
156
|
+
});
|
|
157
|
+
return queue.promise;
|
|
158
|
+
},
|
|
159
|
+
[loadOnce],
|
|
160
|
+
);
|
|
161
|
+
|
|
131
162
|
const refresh = useCallback(async () => await load(false), [load]);
|
|
132
163
|
|
|
133
164
|
useEffect(() => {
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import type { ClientVoiceInputConfig, ReasoningEffort } from "@opengeni/sdk";
|
|
2
|
+
import { useEffect, useState } from "react";
|
|
3
|
+
|
|
4
|
+
/** The client-config fields the stock conversation and chat read. */
|
|
5
|
+
export type ClientConfigFlagsSource = {
|
|
6
|
+
getClientConfig: () => Promise<{
|
|
7
|
+
fileUploads?: { enabled?: boolean };
|
|
8
|
+
modelSelection?: boolean | undefined;
|
|
9
|
+
sandboxFiles?: boolean | undefined;
|
|
10
|
+
defaultReasoningEffort?: ReasoningEffort | undefined;
|
|
11
|
+
artifacts?: unknown;
|
|
12
|
+
sessionCreation?: boolean | undefined;
|
|
13
|
+
archive?: boolean | undefined;
|
|
14
|
+
voiceInput?: ClientVoiceInputConfig | undefined;
|
|
15
|
+
realtimeVoice?: boolean | undefined;
|
|
16
|
+
}>;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export type ClientConfigFlags = {
|
|
20
|
+
/** Whether the config has loaded. Proxy capability flags stay `true` until it says otherwise. */
|
|
21
|
+
loaded: boolean;
|
|
22
|
+
uploads: boolean;
|
|
23
|
+
modelSelection: boolean;
|
|
24
|
+
sandboxFiles: boolean;
|
|
25
|
+
defaultReasoningEffort: ReasoningEffort | null;
|
|
26
|
+
/**
|
|
27
|
+
* Inline Site previews and the artifact viewer. `false` only when a session
|
|
28
|
+
* proxy says it does not serve them; native deployments omit the flag.
|
|
29
|
+
*/
|
|
30
|
+
artifacts: boolean;
|
|
31
|
+
/** Browser chat creation. `false` only when a session proxy has no `createSession` hook. */
|
|
32
|
+
sessionCreation: boolean;
|
|
33
|
+
/** Chat archive/restore. `false` only when a session proxy disables it. */
|
|
34
|
+
archive: boolean;
|
|
35
|
+
/** Native voice input when the deployment can transcribe, else null. */
|
|
36
|
+
voiceInput: ClientVoiceInputConfig | null;
|
|
37
|
+
/**
|
|
38
|
+
* Live voice. `false` until the config loads and when a session proxy turns
|
|
39
|
+
* it off; availability otherwise comes from the realtime model catalog.
|
|
40
|
+
*/
|
|
41
|
+
realtimeVoice: boolean;
|
|
42
|
+
/**
|
|
43
|
+
* The host explicitly offers live voice to end users (a session proxy with
|
|
44
|
+
* `realtimeVoice: true`). Embedded conversations show the voice button only
|
|
45
|
+
* then or when their `realtimeVoice` prop is `true`.
|
|
46
|
+
*/
|
|
47
|
+
realtimeVoiceOffered: boolean;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
const INITIAL_FLAGS: ClientConfigFlags = {
|
|
51
|
+
loaded: false,
|
|
52
|
+
uploads: false,
|
|
53
|
+
modelSelection: false,
|
|
54
|
+
sandboxFiles: false,
|
|
55
|
+
defaultReasoningEffort: null,
|
|
56
|
+
artifacts: true,
|
|
57
|
+
sessionCreation: true,
|
|
58
|
+
archive: true,
|
|
59
|
+
voiceInput: null,
|
|
60
|
+
realtimeVoice: false,
|
|
61
|
+
realtimeVoiceOffered: false,
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
type ClientConfigFlagsInput = Awaited<ReturnType<ClientConfigFlagsSource["getClientConfig"]>>;
|
|
65
|
+
|
|
66
|
+
// One read per client: the chat, its list, the new-chat composer and the
|
|
67
|
+
// conversation all ask, and behind a session proxy each read is a round trip.
|
|
68
|
+
const configReads = new WeakMap<object, Promise<ClientConfigFlagsInput>>();
|
|
69
|
+
|
|
70
|
+
function readClientConfig(client: ClientConfigFlagsSource): Promise<ClientConfigFlagsInput> {
|
|
71
|
+
let read = configReads.get(client);
|
|
72
|
+
if (!read) {
|
|
73
|
+
read = client.getClientConfig();
|
|
74
|
+
configReads.set(client, read);
|
|
75
|
+
// A failed read is retried by the next mount rather than cached.
|
|
76
|
+
read.catch(() => {
|
|
77
|
+
if (configReads.get(client) === read) configReads.delete(client);
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
return read;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** Deployment and session-proxy capabilities from the client config. */
|
|
84
|
+
export function useClientConfigFlags(
|
|
85
|
+
client: Partial<ClientConfigFlagsSource> | ClientConfigFlagsSource,
|
|
86
|
+
): ClientConfigFlags {
|
|
87
|
+
const [flags, setFlags] = useState<ClientConfigFlags>(INITIAL_FLAGS);
|
|
88
|
+
useEffect(() => {
|
|
89
|
+
// Custom clients without a config read keep the defaults.
|
|
90
|
+
if (typeof client.getClientConfig !== "function") return;
|
|
91
|
+
let live = true;
|
|
92
|
+
readClientConfig(client as ClientConfigFlagsSource).then(
|
|
93
|
+
(config) => {
|
|
94
|
+
if (live) {
|
|
95
|
+
setFlags({
|
|
96
|
+
loaded: true,
|
|
97
|
+
uploads: config.fileUploads?.enabled === true,
|
|
98
|
+
// Only an explicit offer shows end users the picker.
|
|
99
|
+
modelSelection: config.modelSelection === true,
|
|
100
|
+
sandboxFiles: config.sandboxFiles !== false,
|
|
101
|
+
defaultReasoningEffort: config.defaultReasoningEffort ?? null,
|
|
102
|
+
artifacts: config.artifacts !== false,
|
|
103
|
+
sessionCreation: config.sessionCreation !== false,
|
|
104
|
+
archive: config.archive !== false,
|
|
105
|
+
voiceInput: config.voiceInput?.available === true ? config.voiceInput : null,
|
|
106
|
+
realtimeVoice: config.realtimeVoice !== false,
|
|
107
|
+
realtimeVoiceOffered: config.realtimeVoice === true,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
() => undefined,
|
|
112
|
+
);
|
|
113
|
+
return () => {
|
|
114
|
+
live = false;
|
|
115
|
+
};
|
|
116
|
+
}, [client]);
|
|
117
|
+
return flags;
|
|
118
|
+
}
|
|
@@ -3,41 +3,158 @@ import type {
|
|
|
3
3
|
CodexAccount,
|
|
4
4
|
CodexAccountsResponse,
|
|
5
5
|
CodexRotationSettings,
|
|
6
|
+
CodexUsageMap,
|
|
7
|
+
SessionCodexAccountsResponse,
|
|
6
8
|
SessionEvent,
|
|
7
9
|
} from "@opengeni/sdk";
|
|
8
10
|
import { useOpenGeni, type ClientOverride } from "../provider";
|
|
9
11
|
import {
|
|
10
12
|
useMutationRunner,
|
|
11
|
-
usePolledValue,
|
|
12
13
|
useSessionEventTrigger,
|
|
13
14
|
type SessionEventFeedOptions,
|
|
14
15
|
} from "./internal";
|
|
16
|
+
import {
|
|
17
|
+
invalidateSharedQueries,
|
|
18
|
+
peekSharedQuery,
|
|
19
|
+
sharedQueryWriter,
|
|
20
|
+
useSharedQuery,
|
|
21
|
+
useSharedQueryValue,
|
|
22
|
+
type SharedQueryKey,
|
|
23
|
+
type SharedQueryWriter,
|
|
24
|
+
} from "./shared-query";
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Shared-cache keys for Codex reads. Every surface that reads the same thing
|
|
28
|
+
* through the same client (the session switcher, Settings > Models) shares one
|
|
29
|
+
* entry, so a revisit renders the last rows at once and re-reads quietly.
|
|
30
|
+
* Internal: not exported from the package root.
|
|
31
|
+
*/
|
|
32
|
+
export const codexAccountsQueryKey = (workspaceId: string, sessionId?: string | null) =>
|
|
33
|
+
(sessionId
|
|
34
|
+
? ["codex-accounts", workspaceId, "session", sessionId]
|
|
35
|
+
: ["codex-accounts", workspaceId]) as SharedQueryKey;
|
|
36
|
+
/** The last LIVE provider usage per account, written by every live usage read. */
|
|
37
|
+
export const codexLiveUsageQueryKey = (workspaceId: string) =>
|
|
38
|
+
["codex-live-usage", workspaceId] as SharedQueryKey;
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* The last LIVE provider reading per account and when each one was taken. Only
|
|
42
|
+
* live provider reads write it, never the server's cached limit columns.
|
|
43
|
+
*/
|
|
44
|
+
export type CodexLiveUsageSnapshot = {
|
|
45
|
+
usage: CodexUsageMap;
|
|
46
|
+
/** Epoch milliseconds of each account's reading. */
|
|
47
|
+
readAt: Record<string, number>;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Record live readings through a writer created before the read started.
|
|
52
|
+
* `replace` is a read of every account (the batch); `merge` updates only the
|
|
53
|
+
* accounts in `readings` and leaves the others' readings and times alone.
|
|
54
|
+
*/
|
|
55
|
+
export function recordCodexLiveUsage(
|
|
56
|
+
write: SharedQueryWriter,
|
|
57
|
+
scope: object,
|
|
58
|
+
workspaceId: string,
|
|
59
|
+
readings: CodexUsageMap,
|
|
60
|
+
mode: "replace" | "merge",
|
|
61
|
+
): boolean {
|
|
62
|
+
const key = codexLiveUsageQueryKey(workspaceId);
|
|
63
|
+
const previous =
|
|
64
|
+
mode === "merge" ? peekSharedQuery<CodexLiveUsageSnapshot>(scope, key)?.data : null;
|
|
65
|
+
const now = Date.now();
|
|
66
|
+
return write<CodexLiveUsageSnapshot>(key, {
|
|
67
|
+
usage: { ...previous?.usage, ...readings },
|
|
68
|
+
readAt: {
|
|
69
|
+
...previous?.readAt,
|
|
70
|
+
...Object.fromEntries(Object.keys(readings).map((id) => [id, now])),
|
|
71
|
+
},
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** When the oldest reading in the snapshot was taken (epoch ms), or null. */
|
|
76
|
+
function oldestReading(snapshot: CodexLiveUsageSnapshot | null | undefined): number | null {
|
|
77
|
+
const times = Object.values(snapshot?.readAt ?? {});
|
|
78
|
+
return times.length > 0 ? Math.min(...times) : null;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const liveUsageReads = new WeakMap<object, Map<string, Promise<CodexUsageMap>>>();
|
|
82
|
+
|
|
83
|
+
/** One live usage refresh per client + workspace at a time; joiners share it. */
|
|
84
|
+
function sharedLiveUsageRead(
|
|
85
|
+
scope: object,
|
|
86
|
+
workspaceId: string,
|
|
87
|
+
read: () => Promise<{ usage: CodexUsageMap }>,
|
|
88
|
+
): Promise<CodexUsageMap> {
|
|
89
|
+
let reads = liveUsageReads.get(scope);
|
|
90
|
+
if (!reads) {
|
|
91
|
+
reads = new Map();
|
|
92
|
+
liveUsageReads.set(scope, reads);
|
|
93
|
+
}
|
|
94
|
+
const existing = reads.get(workspaceId);
|
|
95
|
+
if (existing) return existing;
|
|
96
|
+
// Bound to the identity epoch the read starts in: a clear meanwhile drops it.
|
|
97
|
+
const write = sharedQueryWriter(scope);
|
|
98
|
+
const request = read().then((fresh) => {
|
|
99
|
+
recordCodexLiveUsage(write, scope, workspaceId, fresh.usage, "replace");
|
|
100
|
+
return fresh.usage;
|
|
101
|
+
});
|
|
102
|
+
const settle = () => {
|
|
103
|
+
if (reads!.get(workspaceId) === request) reads!.delete(workspaceId);
|
|
104
|
+
};
|
|
105
|
+
request.then(settle, settle);
|
|
106
|
+
reads.set(workspaceId, request);
|
|
107
|
+
return request;
|
|
108
|
+
}
|
|
15
109
|
|
|
16
110
|
/** Events that change which Codex account a session runs on (or just ran). */
|
|
17
111
|
export function isCodexAccountEvent(event: Pick<SessionEvent, "type">): boolean {
|
|
18
|
-
return
|
|
112
|
+
return [
|
|
113
|
+
"codex.credential.selected",
|
|
114
|
+
"codex.account.switched",
|
|
115
|
+
"codex.account.selection.changed",
|
|
116
|
+
"model_account.selection.changed",
|
|
117
|
+
"codex.capacity.waiting",
|
|
118
|
+
"codex.capacity.resumed",
|
|
119
|
+
"codex.capacity.superseded",
|
|
120
|
+
"turn.completed",
|
|
121
|
+
"turn.failed",
|
|
122
|
+
"turn.cancelled",
|
|
123
|
+
"turn.requires_action",
|
|
124
|
+
"session.status.changed",
|
|
125
|
+
].includes(event.type);
|
|
19
126
|
}
|
|
20
127
|
|
|
21
128
|
/**
|
|
22
129
|
* The structural slice of the SDK client the Codex-accounts surface needs. Method
|
|
23
130
|
* NAMES + SIGNATURES match `OpenGeniClient` so the real client satisfies it
|
|
24
131
|
* directly; declared structurally (not a hard Pick) so a test/Geni client can
|
|
25
|
-
* stand in. `
|
|
132
|
+
* stand in. `listSessionCodexAccounts` reads the accepted selection and choices
|
|
133
|
+
* atomically; `pinSessionCodexAccount`
|
|
26
134
|
* is the optional mutation (absent ⇒ the indicator hides the switch affordance).
|
|
27
135
|
*/
|
|
28
136
|
export type CodexAccountsClientLike = {
|
|
29
137
|
listCodexAccounts: (workspaceId: string) => Promise<CodexAccountsResponse>;
|
|
138
|
+
/** Required for session-scoped use; never fall back to another pool. */
|
|
139
|
+
listSessionCodexAccounts?: (
|
|
140
|
+
workspaceId: string,
|
|
141
|
+
sessionId: string,
|
|
142
|
+
) => Promise<SessionCodexAccountsResponse>;
|
|
30
143
|
getSession?: (
|
|
31
144
|
workspaceId: string,
|
|
32
145
|
sessionId: string,
|
|
33
|
-
) => Promise<{
|
|
146
|
+
) => Promise<{
|
|
147
|
+
codexPinnedCredentialId?: string | null;
|
|
148
|
+
codexLastCredentialId?: string | null;
|
|
149
|
+
codexCurrentSelection?: { credentialId: string | null; waiting: boolean } | null;
|
|
150
|
+
}>;
|
|
34
151
|
pinSessionCodexAccount?: (
|
|
35
152
|
workspaceId: string,
|
|
36
153
|
sessionId: string,
|
|
37
154
|
target: string,
|
|
38
|
-
) => Promise<{ pinned: string }>;
|
|
155
|
+
) => Promise<{ pinned: string; appliedTo?: "waiting_turn" | "next_turn" }>;
|
|
39
156
|
/** Optional (absent ⇒ the card hides live refresh): batched live /wham/usage refresh. */
|
|
40
|
-
refreshCodexUsage?: (workspaceId: string) => Promise<{ usage:
|
|
157
|
+
refreshCodexUsage?: (workspaceId: string) => Promise<{ usage: CodexUsageMap }>;
|
|
41
158
|
};
|
|
42
159
|
|
|
43
160
|
export type UseCodexAccountsOptions = ClientOverride &
|
|
@@ -51,23 +168,33 @@ export type UseCodexAccountsOptions = ClientOverride &
|
|
|
51
168
|
|
|
52
169
|
export type UseCodexAccountsResult = {
|
|
53
170
|
accounts: CodexAccount[];
|
|
54
|
-
/** The
|
|
171
|
+
/** The ACTIVE account for the retry pool, or current workspace pool for new work. */
|
|
55
172
|
activeAccountId: string | null;
|
|
56
173
|
/** The session's PINNED account (null ⇒ following workspace active). */
|
|
57
174
|
pinnedAccountId: string | null;
|
|
58
|
-
/**
|
|
175
|
+
/** Current preference only; automatic allocation can choose another account. */
|
|
59
176
|
effectiveAccountId: string | null;
|
|
177
|
+
currentSelection: { credentialId: string | null; waiting: boolean } | null;
|
|
178
|
+
/** The accepted account can differ from the choices for the next turn. */
|
|
179
|
+
currentAccount: CodexAccount | null;
|
|
180
|
+
switchAppliedTo: "waiting_turn" | "next_turn" | null;
|
|
60
181
|
/** The account the session's last turn ACTUALLY ran on (the "Running on:" source). */
|
|
61
182
|
lastAccountId: string | null;
|
|
62
183
|
settings: CodexRotationSettings;
|
|
63
184
|
loading: boolean;
|
|
185
|
+
error: Error | null;
|
|
64
186
|
refresh: () => Promise<void>;
|
|
65
187
|
/**
|
|
66
188
|
* Trigger a LIVE batched /wham/usage refresh across all accounts, then re-read
|
|
67
189
|
* the cached metadata so the new windows land on `accounts`. Modeled on `pin`.
|
|
68
190
|
* No-op (resolves false) when the client can't refresh usage.
|
|
191
|
+
* With `maxAgeMs`, live readings younger than that are reused instead.
|
|
69
192
|
*/
|
|
70
|
-
refreshUsage: () => Promise<boolean>;
|
|
193
|
+
refreshUsage: (options?: { maxAgeMs?: number | undefined }) => Promise<boolean>;
|
|
194
|
+
/** Live provider readings override stale cached labels after refreshUsage. */
|
|
195
|
+
liveUsage: CodexUsageMap;
|
|
196
|
+
/** When the live readings in `liveUsage` were taken (epoch ms), or null. */
|
|
197
|
+
liveUsageUpdatedAt: number | null;
|
|
71
198
|
/** True while a live usage refresh is in flight (drives the bar skeleton). */
|
|
72
199
|
refreshingUsage: boolean;
|
|
73
200
|
/** Pin (or unpin via "auto") the session's account; returns true on success. */
|
|
@@ -78,6 +205,8 @@ export type UseCodexAccountsResult = {
|
|
|
78
205
|
mutationError: Error | null;
|
|
79
206
|
};
|
|
80
207
|
|
|
208
|
+
const EMPTY_USAGE: CodexUsageMap = {};
|
|
209
|
+
|
|
81
210
|
const EMPTY_SETTINGS: CodexRotationSettings = {
|
|
82
211
|
rotationEnabled: false,
|
|
83
212
|
rotationStrategy: "sharded",
|
|
@@ -85,6 +214,8 @@ const EMPTY_SETTINGS: CodexRotationSettings = {
|
|
|
85
214
|
};
|
|
86
215
|
|
|
87
216
|
type CodexAccountsState = {
|
|
217
|
+
currentAccount: CodexAccount | null;
|
|
218
|
+
currentSelection: { credentialId: string | null; waiting: boolean } | null;
|
|
88
219
|
accounts: CodexAccount[];
|
|
89
220
|
activeAccountId: string | null;
|
|
90
221
|
settings: CodexRotationSettings;
|
|
@@ -93,6 +224,8 @@ type CodexAccountsState = {
|
|
|
93
224
|
};
|
|
94
225
|
|
|
95
226
|
const EMPTY_STATE: CodexAccountsState = {
|
|
227
|
+
currentAccount: null,
|
|
228
|
+
currentSelection: null,
|
|
96
229
|
accounts: [],
|
|
97
230
|
activeAccountId: null,
|
|
98
231
|
settings: EMPTY_SETTINGS,
|
|
@@ -101,10 +234,11 @@ const EMPTY_STATE: CodexAccountsState = {
|
|
|
101
234
|
};
|
|
102
235
|
|
|
103
236
|
/**
|
|
104
|
-
* The workspace's Codex accounts
|
|
105
|
-
*
|
|
106
|
-
* `
|
|
107
|
-
* `codex.account.switched` event
|
|
237
|
+
* The workspace's Codex accounts, or session-authorized retry/next-turn choices
|
|
238
|
+
* and accepted current account. Reads go through the client-scoped shared cache
|
|
239
|
+
* (`useSharedQuery`): a remount renders the retained rows at once and re-reads
|
|
240
|
+
* in the background; slow polling plus the `codex.account.switched` event
|
|
241
|
+
* trigger keep them current, and `pin` invalidates the workspace's entries.
|
|
108
242
|
* Dual-consumer safe via the structural `CodexAccountsClientLike` surface.
|
|
109
243
|
*/
|
|
110
244
|
export function useCodexAccounts(options: UseCodexAccountsOptions = {}): UseCodexAccountsResult {
|
|
@@ -113,33 +247,52 @@ export function useCodexAccounts(options: UseCodexAccountsOptions = {}): UseCode
|
|
|
113
247
|
const sessionId = options.sessionId;
|
|
114
248
|
const sharedEvents = options.events;
|
|
115
249
|
|
|
116
|
-
const load = useCallback(async (): Promise<
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
activeAccountId: acc.activeAccountId,
|
|
126
|
-
settings: acc.settings,
|
|
127
|
-
pinnedAccountId: session?.codexPinnedCredentialId ?? null,
|
|
128
|
-
lastAccountId: session?.codexLastCredentialId ?? null,
|
|
129
|
-
};
|
|
250
|
+
const load = useCallback(async (): Promise<
|
|
251
|
+
CodexAccountsResponse | SessionCodexAccountsResponse
|
|
252
|
+
> => {
|
|
253
|
+
if (sessionId) {
|
|
254
|
+
if (!codexClient.listSessionCodexAccounts)
|
|
255
|
+
throw new Error("Session Codex account projection is unavailable");
|
|
256
|
+
return await codexClient.listSessionCodexAccounts(workspaceId, sessionId);
|
|
257
|
+
}
|
|
258
|
+
return await codexClient.listCodexAccounts(workspaceId);
|
|
130
259
|
}, [codexClient, workspaceId, sessionId]);
|
|
131
260
|
|
|
132
261
|
const {
|
|
133
|
-
data:
|
|
262
|
+
data: response,
|
|
134
263
|
loading,
|
|
264
|
+
error,
|
|
135
265
|
refresh,
|
|
136
|
-
} =
|
|
266
|
+
} = useSharedQuery(codexClient, codexAccountsQueryKey(workspaceId, sessionId), load, {
|
|
137
267
|
pollIntervalMs: options.pollIntervalMs,
|
|
138
268
|
enabled: options.enabled,
|
|
139
269
|
});
|
|
270
|
+
// Never read on mount: only an explicit live refresh writes this entry.
|
|
271
|
+
const liveUsageQuery = useSharedQueryValue<CodexLiveUsageSnapshot>(
|
|
272
|
+
codexClient,
|
|
273
|
+
codexLiveUsageQueryKey(workspaceId),
|
|
274
|
+
);
|
|
275
|
+
const loadedData: CodexAccountsState | null = !response
|
|
276
|
+
? null
|
|
277
|
+
: sessionId
|
|
278
|
+
? (response as SessionCodexAccountsResponse)
|
|
279
|
+
: {
|
|
280
|
+
currentSelection: null,
|
|
281
|
+
currentAccount: null,
|
|
282
|
+
accounts: response.accounts,
|
|
283
|
+
activeAccountId: response.activeAccountId,
|
|
284
|
+
settings: response.settings,
|
|
285
|
+
pinnedAccountId: null,
|
|
286
|
+
lastAccountId: null,
|
|
287
|
+
};
|
|
140
288
|
const { run: runMutation, mutating: pinning, mutationError } = useMutationRunner();
|
|
141
289
|
const { run: runUsageMutation, mutating: refreshingUsage } = useMutationRunner();
|
|
290
|
+
const liveUsage = liveUsageQuery.data?.usage ?? EMPTY_USAGE;
|
|
142
291
|
const [pinningTarget, setPinningTarget] = useState<string | null>(null);
|
|
292
|
+
const [switchReceipt, setSwitchReceipt] = useState<{
|
|
293
|
+
sessionId: string;
|
|
294
|
+
appliedTo: "waiting_turn" | "next_turn";
|
|
295
|
+
} | null>(null);
|
|
143
296
|
|
|
144
297
|
// Refresh only after the durable post-selection event. `turn.started` is
|
|
145
298
|
// emitted before account selection settles and races this authoritative read.
|
|
@@ -161,45 +314,92 @@ export function useCodexAccounts(options: UseCodexAccountsOptions = {}): UseCode
|
|
|
161
314
|
return false;
|
|
162
315
|
}
|
|
163
316
|
setPinningTarget(target);
|
|
317
|
+
setSwitchReceipt(null);
|
|
318
|
+
const invalidated: { current: Promise<void> | null } = { current: null };
|
|
164
319
|
const result = await runMutation(async () => {
|
|
165
|
-
await codexClient.pinSessionCodexAccount!(workspaceId, sessionId, target);
|
|
320
|
+
const receipt = await codexClient.pinSessionCodexAccount!(workspaceId, sessionId, target);
|
|
321
|
+
// Every retained Codex read for this workspace may now be wrong. This
|
|
322
|
+
// runs even if the component unmounted meanwhile (the runner then
|
|
323
|
+
// resolves null), so no other surface keeps showing the old choice.
|
|
324
|
+
invalidated.current = invalidateSharedQueries(
|
|
325
|
+
codexClient,
|
|
326
|
+
codexAccountsQueryKey(workspaceId),
|
|
327
|
+
);
|
|
328
|
+
setSwitchReceipt({ sessionId, appliedTo: receipt.appliedTo ?? "next_turn" });
|
|
166
329
|
return true;
|
|
167
330
|
});
|
|
168
331
|
setPinningTarget(null);
|
|
169
|
-
if (result) await
|
|
332
|
+
if (result) await invalidated.current;
|
|
170
333
|
return result === true;
|
|
171
334
|
},
|
|
172
|
-
[codexClient, workspaceId, sessionId, runMutation
|
|
335
|
+
[codexClient, workspaceId, sessionId, runMutation],
|
|
173
336
|
);
|
|
174
337
|
|
|
175
338
|
// Live usage refresh: hit the batched provider read, then re-read cached
|
|
176
339
|
// metadata so the fresh windows land on `accounts`. The provider read writes the
|
|
177
|
-
// cache columns server-side;
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
340
|
+
// cache columns server-side; refresh() pulls them back. Concurrent callers share
|
|
341
|
+
// one provider read, and `maxAgeMs` reuses readings that are recent enough for
|
|
342
|
+
// every listed account (a single-account refresh elsewhere never counts for all).
|
|
343
|
+
const listedAccountIds = response?.accounts.map((account) => account.id).join("\n") ?? null;
|
|
344
|
+
const refreshUsage = useCallback(
|
|
345
|
+
async (refreshOptions: { maxAgeMs?: number | undefined } = {}): Promise<boolean> => {
|
|
346
|
+
if (!codexClient.refreshCodexUsage) {
|
|
347
|
+
return false;
|
|
348
|
+
}
|
|
349
|
+
const maxAgeMs = refreshOptions.maxAgeMs;
|
|
350
|
+
const retained = peekSharedQuery<CodexLiveUsageSnapshot>(
|
|
351
|
+
codexClient,
|
|
352
|
+
codexLiveUsageQueryKey(workspaceId),
|
|
353
|
+
)?.data;
|
|
354
|
+
const ids = listedAccountIds ? listedAccountIds.split("\n") : [];
|
|
355
|
+
if (
|
|
356
|
+
maxAgeMs !== undefined &&
|
|
357
|
+
retained &&
|
|
358
|
+
ids.length > 0 &&
|
|
359
|
+
ids.every((id) => {
|
|
360
|
+
const readAt = retained.readAt[id];
|
|
361
|
+
return readAt !== undefined && Date.now() - readAt < maxAgeMs;
|
|
362
|
+
})
|
|
363
|
+
) {
|
|
364
|
+
return true;
|
|
365
|
+
}
|
|
366
|
+
const result = await runUsageMutation(async () => {
|
|
367
|
+
await sharedLiveUsageRead(codexClient, workspaceId, () =>
|
|
368
|
+
codexClient.refreshCodexUsage!(workspaceId),
|
|
369
|
+
);
|
|
370
|
+
return true;
|
|
371
|
+
});
|
|
372
|
+
if (result) await refresh();
|
|
373
|
+
return result === true;
|
|
374
|
+
},
|
|
375
|
+
[codexClient, workspaceId, runUsageMutation, refresh, listedAccountIds],
|
|
376
|
+
);
|
|
377
|
+
|
|
378
|
+
// Reauthorization failure must remove a previously visible session pool.
|
|
379
|
+
const data = (sessionId && error ? null : loadedData) ?? EMPTY_STATE;
|
|
191
380
|
const effectiveAccountId = data.pinnedAccountId ?? data.activeAccountId;
|
|
381
|
+
const withLiveUsage = (account: CodexAccount): CodexAccount => {
|
|
382
|
+
const live = liveUsage[account.id]?.usage;
|
|
383
|
+
return live ? { ...account, fiveHour: live.fiveHour, weekly: live.weekly } : account;
|
|
384
|
+
};
|
|
192
385
|
|
|
193
386
|
return {
|
|
194
|
-
|
|
387
|
+
currentAccount: data.currentAccount ? withLiveUsage(data.currentAccount) : null,
|
|
388
|
+
currentSelection: data.currentSelection,
|
|
389
|
+
switchAppliedTo:
|
|
390
|
+
switchReceipt?.sessionId === sessionId ? (switchReceipt?.appliedTo ?? null) : null,
|
|
391
|
+
accounts: data.accounts.map(withLiveUsage),
|
|
195
392
|
activeAccountId: data.activeAccountId,
|
|
196
393
|
pinnedAccountId: data.pinnedAccountId,
|
|
197
394
|
effectiveAccountId,
|
|
198
395
|
lastAccountId: data.lastAccountId,
|
|
199
396
|
settings: data.settings,
|
|
200
397
|
loading,
|
|
398
|
+
error,
|
|
201
399
|
refresh,
|
|
202
400
|
refreshUsage,
|
|
401
|
+
liveUsage,
|
|
402
|
+
liveUsageUpdatedAt: oldestReading(liveUsageQuery.data),
|
|
203
403
|
refreshingUsage,
|
|
204
404
|
pin,
|
|
205
405
|
pinning,
|