@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
|
@@ -0,0 +1,721 @@
|
|
|
1
|
+
import { useCallback, useLayoutEffect, useReducer, useRef, useSyncExternalStore } from "react";
|
|
2
|
+
import { normalizeError } from "../lib/error-message";
|
|
3
|
+
import { usePageLiveActivity } from "./internal";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* A small client-scoped stale-while-revalidate store for read models that many
|
|
7
|
+
* surfaces show (subscription accounts, their usage limits). Internal to
|
|
8
|
+
* `@opengeni/react`: hosts reach it only through the hooks built on it and the
|
|
9
|
+
* `OpenGeniProvider` `retainReadsAcrossMounts` opt-in.
|
|
10
|
+
*
|
|
11
|
+
* Scoping:
|
|
12
|
+
*
|
|
13
|
+
* - Every entry lives under the exact client object that read it (a WeakMap),
|
|
14
|
+
* like `createDiscoveryCache`; the key names the exact read
|
|
15
|
+
* (`["codex-accounts", workspaceId, "session", sessionId]`).
|
|
16
|
+
* - By default nothing outlives its readers: mounted readers of one key share
|
|
17
|
+
* one request and one snapshot, and the entry is dropped as soon as the last
|
|
18
|
+
* reader unmounts. A reader renders an entry's rows only once it has
|
|
19
|
+
* registered on it (layout phase, then a re-render before paint), and only
|
|
20
|
+
* the reader instance that let go may take an entry back (StrictMode, effect
|
|
21
|
+
* re-runs); a different reader mounting in the same commit (a host
|
|
22
|
+
* re-keying its tree for another person) never renders the previous rows,
|
|
23
|
+
* starts from nothing, and the earlier read and writes are discarded. Only a scope a host retains
|
|
24
|
+
* (`retainSharedQueries`, used by the provider opt-in) keeps unmounted
|
|
25
|
+
* entries for `retainMs`, so a host that reuses one client for different
|
|
26
|
+
* people never serves one person's rows to the next mount. Ending the last
|
|
27
|
+
* retention clears the scope.
|
|
28
|
+
* - `clearSharedQueries(scope)` drops every row at once. Mounted readers stay
|
|
29
|
+
* subscribed and read again; writes from operations that started before the
|
|
30
|
+
* clear are discarded.
|
|
31
|
+
*
|
|
32
|
+
* Semantics:
|
|
33
|
+
*
|
|
34
|
+
* - A mount with retained data renders it immediately and revalidates in the
|
|
35
|
+
* background once it is older than `staleTimeMs`. An enabled reader reports
|
|
36
|
+
* `loading` until its key's first read completes.
|
|
37
|
+
* - Page visibility pauses only polling and background revalidation of rows
|
|
38
|
+
* already on screen; invalidation and `refresh()` read on a hidden page too.
|
|
39
|
+
* - A loader is bound to its key when the render that supplied it commits, so a
|
|
40
|
+
* render that never commits (a transition) or a key change cannot run one
|
|
41
|
+
* key's loader for another key's entry.
|
|
42
|
+
* - Failures are never cached. An access refusal (401/403/404) also drops the
|
|
43
|
+
* retained data; another failure keeps it beside the error.
|
|
44
|
+
* - `invalidateSharedQueries` supersedes any read in flight (its result is
|
|
45
|
+
* discarded), re-reads mounted entries and evicts unmounted ones, so a later
|
|
46
|
+
* mount never shows rows a mutation has made wrong.
|
|
47
|
+
*/
|
|
48
|
+
|
|
49
|
+
export type SharedQueryKey = readonly (string | number | boolean | null)[];
|
|
50
|
+
|
|
51
|
+
export type SharedQuerySnapshot<T> = {
|
|
52
|
+
data: T | null;
|
|
53
|
+
/** True only while there is nothing to show yet (first read for this key). */
|
|
54
|
+
loading: boolean;
|
|
55
|
+
/** True while any read for this key is in flight, including background ones. */
|
|
56
|
+
fetching: boolean;
|
|
57
|
+
error: Error | null;
|
|
58
|
+
/** Epoch milliseconds of the last successful read or write, or null. */
|
|
59
|
+
updatedAt: number | null;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
export type SharedQueryOptions = {
|
|
63
|
+
/** False: never read, and show no data (not even retained rows). */
|
|
64
|
+
enabled?: boolean | undefined;
|
|
65
|
+
/** Poll while mounted and the page is visible. Shortest interval wins. */
|
|
66
|
+
pollIntervalMs?: number | undefined;
|
|
67
|
+
/** Retained data younger than this is not re-read on mount. Default 10s. */
|
|
68
|
+
staleTimeMs?: number | undefined;
|
|
69
|
+
/** How long an unmounted entry is retained in a retained scope. Default 10 minutes. */
|
|
70
|
+
retainMs?: number | undefined;
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
export type SharedQueryResult<T> = SharedQuerySnapshot<T> & {
|
|
74
|
+
/** Force a read now (joining one queued after any in-flight read). */
|
|
75
|
+
refresh: () => Promise<void>;
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
/** Records data read some other way; false when the write was refused. */
|
|
79
|
+
export type SharedQueryWriter = <T>(parts: SharedQueryKey, data: T) => boolean;
|
|
80
|
+
|
|
81
|
+
const DEFAULT_STALE_TIME_MS = 10_000;
|
|
82
|
+
const DEFAULT_RETAIN_MS = 10 * 60_000;
|
|
83
|
+
|
|
84
|
+
type Loader<T> = (signal: AbortSignal) => Promise<T>;
|
|
85
|
+
type LoaderBinding = { key: string; load: Loader<unknown> };
|
|
86
|
+
|
|
87
|
+
type Subscriber = {
|
|
88
|
+
/** The hook instance; only it may take back an entry it just let go of. */
|
|
89
|
+
owner: object;
|
|
90
|
+
/** The committed loader and the key it reads; null for subscribe-only readers. */
|
|
91
|
+
binding: { current: LoaderBinding } | null;
|
|
92
|
+
enabled: boolean;
|
|
93
|
+
pageLive: boolean;
|
|
94
|
+
pollIntervalMs: number | undefined;
|
|
95
|
+
staleTimeMs: number;
|
|
96
|
+
retainMs: number;
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
type Entry = {
|
|
100
|
+
key: string;
|
|
101
|
+
parts: SharedQueryKey;
|
|
102
|
+
snapshot: SharedQuerySnapshot<unknown>;
|
|
103
|
+
/** The scope that holds this entry; its store listeners are notified per key. */
|
|
104
|
+
home: Scope;
|
|
105
|
+
subscribers: Set<Subscriber>;
|
|
106
|
+
inFlight: Promise<void> | null;
|
|
107
|
+
trailing: Promise<void> | null;
|
|
108
|
+
abort: AbortController | null;
|
|
109
|
+
generation: number;
|
|
110
|
+
/** The retained data may be wrong; the next reconcile re-reads. */
|
|
111
|
+
invalidated: boolean;
|
|
112
|
+
timer: ReturnType<typeof setTimeout> | null;
|
|
113
|
+
/** The interval `timer` was armed with. */
|
|
114
|
+
timerInterval: number | null;
|
|
115
|
+
retainTimer: ReturnType<typeof setTimeout> | null;
|
|
116
|
+
/** The reader instance that last let go of this entry while it awaits release. */
|
|
117
|
+
releasedBy: object | null;
|
|
118
|
+
/** When this entry last started over for a new owner (see `resetSequence`). */
|
|
119
|
+
resetMark: number;
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
type Scope = {
|
|
123
|
+
entries: Map<string, Entry>;
|
|
124
|
+
/**
|
|
125
|
+
* Store (useSyncExternalStore) listeners per key, not per entry: a reader
|
|
126
|
+
* hidden by Suspense keeps its store subscription while it is unregistered,
|
|
127
|
+
* and must still hear about the entry that replaces an evicted one.
|
|
128
|
+
*/
|
|
129
|
+
listeners: Map<string, Set<() => void>>;
|
|
130
|
+
/** Bumped by every clear; writers from an earlier epoch are refused. */
|
|
131
|
+
epoch: number;
|
|
132
|
+
/** Active retentions; unmounted entries are kept only while positive. */
|
|
133
|
+
retainers: number;
|
|
134
|
+
releaseTimer: ReturnType<typeof setTimeout> | null;
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
const scopes = new WeakMap<object, Scope>();
|
|
138
|
+
/**
|
|
139
|
+
* Orders writers against entries that started over for a new owner: a writer
|
|
140
|
+
* created before an entry's mark never writes to it.
|
|
141
|
+
*/
|
|
142
|
+
let resetSequence = 0;
|
|
143
|
+
|
|
144
|
+
function idle<T>(loading: boolean): SharedQuerySnapshot<T> {
|
|
145
|
+
return { data: null, loading, fetching: false, error: null, updatedAt: null };
|
|
146
|
+
}
|
|
147
|
+
const IDLE_LOADING = idle<never>(true);
|
|
148
|
+
const IDLE = idle<never>(false);
|
|
149
|
+
|
|
150
|
+
function serialize(parts: SharedQueryKey): string {
|
|
151
|
+
return JSON.stringify(parts);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/** A refusal that repeating the read cannot fix; retained rows must go. */
|
|
155
|
+
export function isSharedQueryAccessRefusal(cause: unknown): boolean {
|
|
156
|
+
if (!cause || typeof cause !== "object" || !("status" in cause)) return false;
|
|
157
|
+
const status = (cause as { status: unknown }).status;
|
|
158
|
+
return status === 401 || status === 403 || status === 404;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function scopeState(scope: object): Scope {
|
|
162
|
+
let state = scopes.get(scope);
|
|
163
|
+
if (!state) {
|
|
164
|
+
state = {
|
|
165
|
+
entries: new Map(),
|
|
166
|
+
listeners: new Map(),
|
|
167
|
+
epoch: 0,
|
|
168
|
+
retainers: 0,
|
|
169
|
+
releaseTimer: null,
|
|
170
|
+
};
|
|
171
|
+
scopes.set(scope, state);
|
|
172
|
+
}
|
|
173
|
+
return state;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
function notify(state: Scope, key: string): void {
|
|
177
|
+
const listeners = state.listeners.get(key);
|
|
178
|
+
if (!listeners) return;
|
|
179
|
+
for (const listener of [...listeners]) listener();
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
function setSnapshot(entry: Entry, next: SharedQuerySnapshot<unknown>): void {
|
|
183
|
+
entry.snapshot = next;
|
|
184
|
+
notify(entry.home, entry.key);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/** A store listener for a client's key, whichever entry currently holds it. */
|
|
188
|
+
function listen(scope: object, key: string, listener: () => void): () => void {
|
|
189
|
+
const state = scopeState(scope);
|
|
190
|
+
let listeners = state.listeners.get(key);
|
|
191
|
+
if (!listeners) {
|
|
192
|
+
listeners = new Set();
|
|
193
|
+
state.listeners.set(key, listeners);
|
|
194
|
+
}
|
|
195
|
+
listeners.add(listener);
|
|
196
|
+
return () => {
|
|
197
|
+
const current = state.listeners.get(key);
|
|
198
|
+
if (!current) return;
|
|
199
|
+
current.delete(listener);
|
|
200
|
+
if (current.size === 0) state.listeners.delete(key);
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/** Readers that may read: enabled and bound to this key (visible or not). */
|
|
205
|
+
function readers(entry: Entry): Subscriber[] {
|
|
206
|
+
return [...entry.subscribers].filter(
|
|
207
|
+
(each) => each.enabled && each.binding?.current.key === entry.key,
|
|
208
|
+
);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Registered readers keep an entry. Store listeners don't: they belong to the
|
|
213
|
+
* client and key (see `Scope.listeners`), React removes them in the passive
|
|
214
|
+
* phase, and a reader hidden by Suspense keeps one while it is unregistered.
|
|
215
|
+
*/
|
|
216
|
+
function mounted(entry: Entry): boolean {
|
|
217
|
+
return entry.subscribers.size > 0;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
function stopTimer(entry: Entry): void {
|
|
221
|
+
if (entry.timer !== null) {
|
|
222
|
+
clearTimeout(entry.timer);
|
|
223
|
+
entry.timer = null;
|
|
224
|
+
}
|
|
225
|
+
entry.timerInterval = null;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
function stopRetainTimer(entry: Entry): void {
|
|
229
|
+
if (entry.retainTimer !== null) {
|
|
230
|
+
clearTimeout(entry.retainTimer);
|
|
231
|
+
entry.retainTimer = null;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/** Any read in flight or queued is superseded: its result is never stored. */
|
|
236
|
+
function supersedeReads(entry: Entry): void {
|
|
237
|
+
entry.generation += 1;
|
|
238
|
+
entry.abort?.abort();
|
|
239
|
+
entry.abort = null;
|
|
240
|
+
entry.inFlight = null;
|
|
241
|
+
entry.trailing = null;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
function evict(state: Scope, entry: Entry): void {
|
|
245
|
+
supersedeReads(entry);
|
|
246
|
+
stopTimer(entry);
|
|
247
|
+
stopRetainTimer(entry);
|
|
248
|
+
if (state.entries.get(entry.key) !== entry) return;
|
|
249
|
+
state.entries.delete(entry.key);
|
|
250
|
+
// Store subscriptions that outlive the entry (Suspense) now read nothing.
|
|
251
|
+
notify(state, entry.key);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/** Poll at the shortest interval among readers on a visible page; keep a timer already armed for it. */
|
|
255
|
+
function arm(entry: Entry): void {
|
|
256
|
+
let interval: number | undefined;
|
|
257
|
+
for (const each of readers(entry)) {
|
|
258
|
+
if (!each.pageLive) continue;
|
|
259
|
+
if (each.pollIntervalMs === undefined || each.pollIntervalMs <= 0) continue;
|
|
260
|
+
interval =
|
|
261
|
+
interval === undefined ? each.pollIntervalMs : Math.min(interval, each.pollIntervalMs);
|
|
262
|
+
}
|
|
263
|
+
if (entry.timer !== null && entry.timerInterval === interval) return;
|
|
264
|
+
stopTimer(entry);
|
|
265
|
+
if (interval === undefined) return;
|
|
266
|
+
entry.timerInterval = interval;
|
|
267
|
+
entry.timer = setTimeout(() => {
|
|
268
|
+
entry.timer = null;
|
|
269
|
+
entry.timerInterval = null;
|
|
270
|
+
void run(entry).finally(() => arm(entry));
|
|
271
|
+
}, interval);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
async function runFresh(entry: Entry): Promise<void> {
|
|
275
|
+
const subscriber = readers(entry).at(-1);
|
|
276
|
+
if (!subscriber?.binding) return;
|
|
277
|
+
const { load } = subscriber.binding.current;
|
|
278
|
+
const ticket = ++entry.generation;
|
|
279
|
+
const abort = new AbortController();
|
|
280
|
+
entry.abort = abort;
|
|
281
|
+
entry.invalidated = false;
|
|
282
|
+
if (!entry.snapshot.fetching) setSnapshot(entry, { ...entry.snapshot, fetching: true });
|
|
283
|
+
try {
|
|
284
|
+
const data = await load(abort.signal);
|
|
285
|
+
if (ticket !== entry.generation) return;
|
|
286
|
+
setSnapshot(entry, {
|
|
287
|
+
data,
|
|
288
|
+
loading: false,
|
|
289
|
+
fetching: false,
|
|
290
|
+
error: null,
|
|
291
|
+
updatedAt: Date.now(),
|
|
292
|
+
});
|
|
293
|
+
} catch (cause) {
|
|
294
|
+
if (ticket !== entry.generation) return;
|
|
295
|
+
const refused = isSharedQueryAccessRefusal(cause);
|
|
296
|
+
setSnapshot(entry, {
|
|
297
|
+
data: refused ? null : entry.snapshot.data,
|
|
298
|
+
loading: false,
|
|
299
|
+
fetching: false,
|
|
300
|
+
error: normalizeError(cause),
|
|
301
|
+
// A failure is never a fresh read: the next mount re-reads.
|
|
302
|
+
updatedAt: null,
|
|
303
|
+
});
|
|
304
|
+
} finally {
|
|
305
|
+
if (entry.abort === abort) entry.abort = null;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
function run(entry: Entry, force = false): Promise<void> {
|
|
310
|
+
if (entry.inFlight) {
|
|
311
|
+
if (!force) return entry.inFlight;
|
|
312
|
+
// A forced read issued during another read must observe whatever changed
|
|
313
|
+
// since that read started, so queue exactly one successor read.
|
|
314
|
+
if (entry.trailing) return entry.trailing;
|
|
315
|
+
const predecessor = entry.inFlight;
|
|
316
|
+
let trailing!: Promise<void>;
|
|
317
|
+
trailing = predecessor.then(() => {
|
|
318
|
+
// Superseded meanwhile: the read that replaced it is the newer one.
|
|
319
|
+
if (entry.trailing !== trailing) return entry.inFlight ?? undefined;
|
|
320
|
+
entry.trailing = null;
|
|
321
|
+
if (readers(entry).length > 0) return run(entry);
|
|
322
|
+
// Nobody can read now: what the predecessor stored is not known to be
|
|
323
|
+
// current, so the next mount or resume re-reads.
|
|
324
|
+
entry.invalidated = true;
|
|
325
|
+
return undefined;
|
|
326
|
+
});
|
|
327
|
+
entry.trailing = trailing;
|
|
328
|
+
return trailing;
|
|
329
|
+
}
|
|
330
|
+
let promise!: Promise<void>;
|
|
331
|
+
promise = runFresh(entry).finally(() => {
|
|
332
|
+
if (entry.inFlight === promise) entry.inFlight = null;
|
|
333
|
+
});
|
|
334
|
+
entry.inFlight = promise;
|
|
335
|
+
return promise;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
function isStale(entry: Entry, staleTimeMs: number): boolean {
|
|
339
|
+
const updatedAt = entry.snapshot.updatedAt;
|
|
340
|
+
return entry.invalidated || updatedAt === null || Date.now() - updatedAt >= staleTimeMs;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
function reconcile(entry: Entry): void {
|
|
344
|
+
const active = readers(entry);
|
|
345
|
+
if (active.length === 0) {
|
|
346
|
+
stopTimer(entry);
|
|
347
|
+
if (entry.snapshot.loading) setSnapshot(entry, { ...entry.snapshot, loading: false });
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
const staleTimeMs = Math.min(...active.map((each) => each.staleTimeMs));
|
|
351
|
+
// A hidden page still reads what it has nothing (or nothing right) to show;
|
|
352
|
+
// it only defers revalidating rows already on screen.
|
|
353
|
+
const due =
|
|
354
|
+
active.some((each) => each.pageLive) || entry.invalidated || entry.snapshot.data === null;
|
|
355
|
+
if (due && isStale(entry, staleTimeMs)) {
|
|
356
|
+
// A mount or resume never inherits an earlier failure: it reads again and
|
|
357
|
+
// shows a loading state (or retained rows) until that read settles.
|
|
358
|
+
if (entry.snapshot.error || (entry.snapshot.data === null && !entry.snapshot.loading)) {
|
|
359
|
+
setSnapshot(entry, {
|
|
360
|
+
...entry.snapshot,
|
|
361
|
+
error: null,
|
|
362
|
+
loading: entry.snapshot.data === null,
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
void run(entry).finally(() => arm(entry));
|
|
366
|
+
return;
|
|
367
|
+
}
|
|
368
|
+
// A reader joined or left: the shortest interval may have changed.
|
|
369
|
+
arm(entry);
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
function scheduleRelease(state: Scope, entry: Entry, retainMs: number): void {
|
|
373
|
+
stopRetainTimer(entry);
|
|
374
|
+
// Even an unretained entry waits one task, so StrictMode's immediate
|
|
375
|
+
// unmount/remount keeps sharing the read it already started.
|
|
376
|
+
entry.retainTimer = setTimeout(() => {
|
|
377
|
+
entry.retainTimer = null;
|
|
378
|
+
if (!mounted(entry)) evict(state, entry);
|
|
379
|
+
}, retainMs);
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
function getOrCreate(scope: object, key: string, loading: boolean): Entry {
|
|
383
|
+
const state = scopeState(scope);
|
|
384
|
+
const existing = state.entries.get(key);
|
|
385
|
+
if (existing) {
|
|
386
|
+
stopRetainTimer(existing);
|
|
387
|
+
return existing;
|
|
388
|
+
}
|
|
389
|
+
const created: Entry = {
|
|
390
|
+
key,
|
|
391
|
+
parts: JSON.parse(key) as SharedQueryKey,
|
|
392
|
+
snapshot: idle(loading),
|
|
393
|
+
home: state,
|
|
394
|
+
subscribers: new Set(),
|
|
395
|
+
inFlight: null,
|
|
396
|
+
trailing: null,
|
|
397
|
+
abort: null,
|
|
398
|
+
generation: 0,
|
|
399
|
+
invalidated: false,
|
|
400
|
+
timer: null,
|
|
401
|
+
timerInterval: null,
|
|
402
|
+
retainTimer: null,
|
|
403
|
+
releasedBy: null,
|
|
404
|
+
// Without retention a new entry may be someone else's: writers created
|
|
405
|
+
// before it (by an earlier, now unmounted reader) never fill it.
|
|
406
|
+
resetMark: state.retainers === 0 ? ++resetSequence : 0,
|
|
407
|
+
};
|
|
408
|
+
state.entries.set(key, created);
|
|
409
|
+
return created;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
/**
|
|
413
|
+
* Register a reader instance. In an unretained scope an entry that another
|
|
414
|
+
* instance let go of in this same commit is not adopted: its rows and any read
|
|
415
|
+
* in flight belonged to that reader (possibly another person), so it starts
|
|
416
|
+
* over and writes to it begun before now are refused. True when it was reset.
|
|
417
|
+
*/
|
|
418
|
+
function registerSubscriber(scope: object, entry: Entry, subscriber: Subscriber): boolean {
|
|
419
|
+
const state = scopeState(scope);
|
|
420
|
+
const foreign =
|
|
421
|
+
entry.subscribers.size === 0 &&
|
|
422
|
+
entry.releasedBy !== null &&
|
|
423
|
+
entry.releasedBy !== subscriber.owner &&
|
|
424
|
+
state.retainers === 0;
|
|
425
|
+
if (foreign) {
|
|
426
|
+
supersedeReads(entry);
|
|
427
|
+
stopTimer(entry);
|
|
428
|
+
entry.invalidated = false;
|
|
429
|
+
entry.resetMark = ++resetSequence;
|
|
430
|
+
setSnapshot(entry, IDLE);
|
|
431
|
+
}
|
|
432
|
+
entry.releasedBy = null;
|
|
433
|
+
entry.subscribers.add(subscriber);
|
|
434
|
+
return foreign;
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
function unsubscribe(scope: object, entry: Entry, subscriber: Subscriber, retainMs: number): void {
|
|
438
|
+
entry.subscribers.delete(subscriber);
|
|
439
|
+
if (entry.subscribers.size > 0) {
|
|
440
|
+
reconcile(entry);
|
|
441
|
+
return;
|
|
442
|
+
}
|
|
443
|
+
entry.releasedBy = subscriber.owner;
|
|
444
|
+
// Only the poll stops: in a retained scope a read in flight still lands
|
|
445
|
+
// for the next mount. Otherwise the entry goes with its last reader.
|
|
446
|
+
stopTimer(entry);
|
|
447
|
+
if (entry.snapshot.loading) setSnapshot(entry, { ...entry.snapshot, loading: false });
|
|
448
|
+
const state = scopes.get(scope);
|
|
449
|
+
if (!state || state.entries.get(entry.key) !== entry) return;
|
|
450
|
+
scheduleRelease(state, entry, state.retainers > 0 ? retainMs : 0);
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
/**
|
|
454
|
+
* The entry a reader may render. Without host retention an entry's rows belong
|
|
455
|
+
* to the readers registered on it: until this reader has registered (layout
|
|
456
|
+
* phase) it renders a placeholder, so a reader replacing another in one
|
|
457
|
+
* commit never renders, or hands its children, the previous rows.
|
|
458
|
+
*/
|
|
459
|
+
function visibleEntry(scope: object, key: string, registered: Entry | null): Entry | null {
|
|
460
|
+
const state = scopes.get(scope);
|
|
461
|
+
const entry = state?.entries.get(key);
|
|
462
|
+
if (!state || !entry) return null;
|
|
463
|
+
if (state.retainers === 0 && registered !== entry) return null;
|
|
464
|
+
return entry;
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
/** The retained snapshot for a key, without subscribing or reading. */
|
|
468
|
+
export function peekSharedQuery<T>(
|
|
469
|
+
scope: object,
|
|
470
|
+
parts: SharedQueryKey,
|
|
471
|
+
): SharedQuerySnapshot<T> | null {
|
|
472
|
+
return (
|
|
473
|
+
(scopes.get(scope)?.entries.get(serialize(parts))?.snapshot as
|
|
474
|
+
| SharedQuerySnapshot<T>
|
|
475
|
+
| undefined) ?? null
|
|
476
|
+
);
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
/**
|
|
480
|
+
* A writer for data read some other way (for example a live provider refresh).
|
|
481
|
+
* Create it BEFORE starting that read: a clear in between refuses every write,
|
|
482
|
+
* and an entry that started over for a new owner meanwhile refuses writes to
|
|
483
|
+
* it, so a retired identity's late result is never recorded. Mounted readers
|
|
484
|
+
* render a write at once; with no reader, only a retained scope keeps it.
|
|
485
|
+
*/
|
|
486
|
+
export function sharedQueryWriter(scope: object): SharedQueryWriter {
|
|
487
|
+
const state = scopeState(scope);
|
|
488
|
+
const epoch = state.epoch;
|
|
489
|
+
const since = resetSequence;
|
|
490
|
+
return <T>(parts: SharedQueryKey, data: T): boolean => {
|
|
491
|
+
if (state.epoch !== epoch) return false;
|
|
492
|
+
const key = serialize(parts);
|
|
493
|
+
const existing = state.entries.get(key);
|
|
494
|
+
if (existing && existing.resetMark > since) return false;
|
|
495
|
+
if (!(existing && mounted(existing)) && state.retainers === 0) return false;
|
|
496
|
+
const entry = existing ?? getOrCreate(scope, key, false);
|
|
497
|
+
// A read already in flight started before this write; its result is older.
|
|
498
|
+
supersedeReads(entry);
|
|
499
|
+
entry.invalidated = false;
|
|
500
|
+
setSnapshot(entry, {
|
|
501
|
+
data,
|
|
502
|
+
loading: false,
|
|
503
|
+
fetching: false,
|
|
504
|
+
error: null,
|
|
505
|
+
updatedAt: Date.now(),
|
|
506
|
+
});
|
|
507
|
+
if (!mounted(entry)) scheduleRelease(state, entry, DEFAULT_RETAIN_MS);
|
|
508
|
+
return true;
|
|
509
|
+
};
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
/**
|
|
513
|
+
* Mark every entry whose key starts with `prefix` as wrong. Reads in flight are
|
|
514
|
+
* superseded. Mounted entries re-read now (keeping their rows on screen
|
|
515
|
+
* meanwhile); paused ones re-read when they resume; unmounted entries are
|
|
516
|
+
* evicted so the next mount never renders them.
|
|
517
|
+
*/
|
|
518
|
+
export function invalidateSharedQueries(scope: object, prefix: SharedQueryKey): Promise<void> {
|
|
519
|
+
const state = scopes.get(scope);
|
|
520
|
+
if (!state) return Promise.resolve();
|
|
521
|
+
const reads: Promise<void>[] = [];
|
|
522
|
+
for (const entry of [...state.entries.values()]) {
|
|
523
|
+
if (!prefix.every((part, index) => entry.parts[index] === part)) continue;
|
|
524
|
+
if (!mounted(entry)) {
|
|
525
|
+
evict(state, entry);
|
|
526
|
+
continue;
|
|
527
|
+
}
|
|
528
|
+
supersedeReads(entry);
|
|
529
|
+
entry.invalidated = true;
|
|
530
|
+
// Readers keep their rows on screen while the re-read runs, also on a
|
|
531
|
+
// hidden page (a sign-in finished in another tab must not blank Settings).
|
|
532
|
+
if (readers(entry).length > 0) {
|
|
533
|
+
reads.push(run(entry).finally(() => arm(entry)));
|
|
534
|
+
continue;
|
|
535
|
+
}
|
|
536
|
+
// Only disabled or subscribe-only readers: drop the rows; an enabled
|
|
537
|
+
// reader reads again when it appears.
|
|
538
|
+
stopTimer(entry);
|
|
539
|
+
setSnapshot(entry, IDLE);
|
|
540
|
+
}
|
|
541
|
+
return Promise.all(reads).then(() => undefined);
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
/**
|
|
545
|
+
* Drop everything retained for a client. Unmounted entries go; mounted ones
|
|
546
|
+
* are reset in place (their readers stay subscribed) and active ones read
|
|
547
|
+
* again. Writes from operations that began before the clear are refused.
|
|
548
|
+
*/
|
|
549
|
+
export function clearSharedQueries(scope: object): void {
|
|
550
|
+
const state = scopes.get(scope);
|
|
551
|
+
if (!state) return;
|
|
552
|
+
state.epoch += 1;
|
|
553
|
+
for (const entry of [...state.entries.values()]) {
|
|
554
|
+
if (!mounted(entry)) {
|
|
555
|
+
evict(state, entry);
|
|
556
|
+
continue;
|
|
557
|
+
}
|
|
558
|
+
supersedeReads(entry);
|
|
559
|
+
stopTimer(entry);
|
|
560
|
+
stopRetainTimer(entry);
|
|
561
|
+
entry.invalidated = true;
|
|
562
|
+
const active = readers(entry).length > 0;
|
|
563
|
+
setSnapshot(entry, active ? IDLE_LOADING : IDLE);
|
|
564
|
+
if (active) void run(entry).finally(() => arm(entry));
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
/**
|
|
569
|
+
* Keep unmounted entries for this client until the returned release is
|
|
570
|
+
* called. Releasing the last retention clears the client's entries (after one
|
|
571
|
+
* task, so StrictMode's immediate remount keeps them).
|
|
572
|
+
*/
|
|
573
|
+
export function retainSharedQueries(scope: object): () => void {
|
|
574
|
+
const state = scopeState(scope);
|
|
575
|
+
state.retainers += 1;
|
|
576
|
+
if (state.releaseTimer !== null) {
|
|
577
|
+
clearTimeout(state.releaseTimer);
|
|
578
|
+
state.releaseTimer = null;
|
|
579
|
+
}
|
|
580
|
+
let released = false;
|
|
581
|
+
return () => {
|
|
582
|
+
if (released) return;
|
|
583
|
+
released = true;
|
|
584
|
+
state.retainers -= 1;
|
|
585
|
+
if (state.retainers > 0) return;
|
|
586
|
+
if (state.releaseTimer !== null) clearTimeout(state.releaseTimer);
|
|
587
|
+
state.releaseTimer = setTimeout(() => {
|
|
588
|
+
state.releaseTimer = null;
|
|
589
|
+
if (state.retainers === 0) clearSharedQueries(scope);
|
|
590
|
+
}, 0);
|
|
591
|
+
};
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
/**
|
|
595
|
+
* Subscribe to one shared read. `scope` is the client object that performs
|
|
596
|
+
* the read; `parts` must name every input the loader depends on.
|
|
597
|
+
*/
|
|
598
|
+
export function useSharedQuery<T>(
|
|
599
|
+
scope: object,
|
|
600
|
+
parts: SharedQueryKey,
|
|
601
|
+
load: Loader<T>,
|
|
602
|
+
options: SharedQueryOptions = {},
|
|
603
|
+
): SharedQueryResult<T> {
|
|
604
|
+
const enabled = options.enabled ?? true;
|
|
605
|
+
const pageLive = usePageLiveActivity();
|
|
606
|
+
const key = serialize(parts);
|
|
607
|
+
// The loader is bound to its key only when the render that supplied both
|
|
608
|
+
// commits: a render React discards (a transition) never rebinds it, and a
|
|
609
|
+
// subscriber whose binding names another key is ignored by every read, so
|
|
610
|
+
// one key's loader never fills another key's entry.
|
|
611
|
+
const binding = useRef<LoaderBinding>({ key, load: load as Loader<unknown> });
|
|
612
|
+
useLayoutEffect(() => {
|
|
613
|
+
binding.current = { key, load: load as Loader<unknown> };
|
|
614
|
+
}, [key, load]);
|
|
615
|
+
const staleTimeMs = options.staleTimeMs ?? DEFAULT_STALE_TIME_MS;
|
|
616
|
+
const retainMs = options.retainMs ?? DEFAULT_RETAIN_MS;
|
|
617
|
+
const pollIntervalMs = options.pollIntervalMs;
|
|
618
|
+
|
|
619
|
+
const subscribe = useCallback(
|
|
620
|
+
(listener: () => void) => listen(scope, key, listener),
|
|
621
|
+
[scope, key],
|
|
622
|
+
);
|
|
623
|
+
// The entry this instance is registered on (set in the layout phase).
|
|
624
|
+
const registered = useRef<Entry | null>(null);
|
|
625
|
+
const getSnapshot = useCallback(
|
|
626
|
+
() =>
|
|
627
|
+
(visibleEntry(scope, key, registered.current)?.snapshot as
|
|
628
|
+
| SharedQuerySnapshot<T>
|
|
629
|
+
| undefined) ?? (enabled ? IDLE_LOADING : IDLE),
|
|
630
|
+
[scope, key, enabled],
|
|
631
|
+
);
|
|
632
|
+
const snapshot = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
|
|
633
|
+
const owner = useRef<object>({});
|
|
634
|
+
const [, rerender] = useReducer((count: number) => count + 1, 0);
|
|
635
|
+
|
|
636
|
+
// Registered in the layout phase, after any reader this commit unmounts has
|
|
637
|
+
// let go, so a foreign entry is reset before the browser paints.
|
|
638
|
+
useLayoutEffect(() => {
|
|
639
|
+
const entry = getOrCreate(scope, key, enabled);
|
|
640
|
+
const subscriber: Subscriber = {
|
|
641
|
+
owner: owner.current,
|
|
642
|
+
binding,
|
|
643
|
+
enabled,
|
|
644
|
+
pageLive,
|
|
645
|
+
pollIntervalMs,
|
|
646
|
+
staleTimeMs,
|
|
647
|
+
retainMs,
|
|
648
|
+
};
|
|
649
|
+
registerSubscriber(scope, entry, subscriber);
|
|
650
|
+
registered.current = entry;
|
|
651
|
+
reconcile(entry);
|
|
652
|
+
// Rendered before registering (a placeholder) or before a reset: show
|
|
653
|
+
// what is registered now, before the browser paints.
|
|
654
|
+
if (getSnapshot() !== snapshot) rerender();
|
|
655
|
+
return () => {
|
|
656
|
+
if (registered.current === entry) registered.current = null;
|
|
657
|
+
unsubscribe(scope, entry, subscriber, retainMs);
|
|
658
|
+
};
|
|
659
|
+
// `snapshot` is what this commit rendered; it never re-registers a reader.
|
|
660
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
661
|
+
}, [scope, key, enabled, pageLive, pollIntervalMs, staleTimeMs, retainMs]);
|
|
662
|
+
|
|
663
|
+
const refresh = useCallback((): Promise<void> => {
|
|
664
|
+
const entry = scopes.get(scope)?.entries.get(key);
|
|
665
|
+
if (!entry || readers(entry).length === 0) return Promise.resolve();
|
|
666
|
+
return run(entry, true).finally(() => arm(entry));
|
|
667
|
+
}, [scope, key]);
|
|
668
|
+
|
|
669
|
+
// A disabled reader shows nothing, not even rows retained by other readers.
|
|
670
|
+
if (!enabled) return { ...IDLE, refresh };
|
|
671
|
+
// Enabled with nothing read yet (also the first render after enabling).
|
|
672
|
+
const unread = snapshot.data === null && snapshot.error === null && snapshot.updatedAt === null;
|
|
673
|
+
return { ...snapshot, loading: snapshot.loading || unread, refresh };
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
/**
|
|
677
|
+
* Subscribe to an entry that is only ever written (`sharedQueryWriter`), never
|
|
678
|
+
* read: it renders whatever is recorded and keeps the entry while mounted.
|
|
679
|
+
*/
|
|
680
|
+
export function useSharedQueryValue<T>(
|
|
681
|
+
scope: object,
|
|
682
|
+
parts: SharedQueryKey,
|
|
683
|
+
): SharedQuerySnapshot<T> {
|
|
684
|
+
const key = serialize(parts);
|
|
685
|
+
const subscribe = useCallback(
|
|
686
|
+
(listener: () => void) => listen(scope, key, listener),
|
|
687
|
+
[scope, key],
|
|
688
|
+
);
|
|
689
|
+
const registered = useRef<Entry | null>(null);
|
|
690
|
+
const getSnapshot = useCallback(
|
|
691
|
+
() =>
|
|
692
|
+
(visibleEntry(scope, key, registered.current)?.snapshot as
|
|
693
|
+
| SharedQuerySnapshot<T>
|
|
694
|
+
| undefined) ?? IDLE,
|
|
695
|
+
[scope, key],
|
|
696
|
+
);
|
|
697
|
+
const snapshot = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
|
|
698
|
+
const owner = useRef<object>({});
|
|
699
|
+
const [, rerender] = useReducer((count: number) => count + 1, 0);
|
|
700
|
+
useLayoutEffect(() => {
|
|
701
|
+
const entry = getOrCreate(scope, key, false);
|
|
702
|
+
const subscriber: Subscriber = {
|
|
703
|
+
owner: owner.current,
|
|
704
|
+
binding: null,
|
|
705
|
+
enabled: false,
|
|
706
|
+
pageLive: true,
|
|
707
|
+
pollIntervalMs: undefined,
|
|
708
|
+
staleTimeMs: DEFAULT_STALE_TIME_MS,
|
|
709
|
+
retainMs: DEFAULT_RETAIN_MS,
|
|
710
|
+
};
|
|
711
|
+
registerSubscriber(scope, entry, subscriber);
|
|
712
|
+
registered.current = entry;
|
|
713
|
+
if (getSnapshot() !== snapshot) rerender();
|
|
714
|
+
return () => {
|
|
715
|
+
if (registered.current === entry) registered.current = null;
|
|
716
|
+
unsubscribe(scope, entry, subscriber, DEFAULT_RETAIN_MS);
|
|
717
|
+
};
|
|
718
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
719
|
+
}, [scope, key]);
|
|
720
|
+
return snapshot;
|
|
721
|
+
}
|