@opengeni/react 3.1.0 → 3.1.3-canary.38890816741001
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +769 -22
- package/dist/accounts.js +89 -11
- package/dist/accounts.js.map +1 -1
- package/dist/approvals.d.ts +2 -1
- package/dist/artifacts-document.js +5 -3
- package/dist/artifacts-presentation.js +5 -3
- package/dist/artifacts-spreadsheet.d.ts +1 -1
- package/dist/artifacts-spreadsheet.js +5 -3
- package/dist/artifacts.d.ts +5 -1
- package/dist/artifacts.js +536 -42
- package/dist/artifacts.js.map +1 -1
- package/dist/browser-viewer-ZWR6MWJ7.js +19 -0
- package/dist/capability-catalog-row.d.ts +20 -0
- package/dist/capability-logo-fallback.d.ts +3 -0
- package/dist/chat-interactive-block-BO2IWXVK.js +14 -0
- package/dist/chunk-2DDJ6YH6.js +41 -0
- package/dist/chunk-2DDJ6YH6.js.map +1 -0
- package/dist/chunk-2HVLQ26H.js +183 -0
- package/dist/chunk-2HVLQ26H.js.map +1 -0
- package/dist/{chunk-RGALCTWO.js → chunk-2I6R3GCZ.js} +4285 -3980
- package/dist/chunk-2I6R3GCZ.js.map +1 -0
- package/dist/{chunk-D3UIAJKY.js → chunk-2SFFYIH3.js} +1179 -166
- package/dist/chunk-2SFFYIH3.js.map +1 -0
- package/dist/chunk-3PVDYTTB.js +24 -0
- package/dist/chunk-3PVDYTTB.js.map +1 -0
- package/dist/chunk-3UZCWK46.js +298 -0
- package/dist/chunk-3UZCWK46.js.map +1 -0
- package/dist/chunk-47CKUXTW.js +293 -0
- package/dist/chunk-47CKUXTW.js.map +1 -0
- package/dist/chunk-4QYP6QUI.js +109 -0
- package/dist/chunk-4QYP6QUI.js.map +1 -0
- package/dist/chunk-5EY26VZ7.js +1053 -0
- package/dist/chunk-5EY26VZ7.js.map +1 -0
- package/dist/chunk-5I4VRWBB.js +56 -0
- package/dist/chunk-5I4VRWBB.js.map +1 -0
- package/dist/chunk-5WOR7UCL.js +191 -0
- package/dist/chunk-5WOR7UCL.js.map +1 -0
- package/dist/chunk-5YJLGOM5.js +51 -0
- package/dist/chunk-5YJLGOM5.js.map +1 -0
- package/dist/chunk-6JFN3OWG.js +386 -0
- package/dist/chunk-6JFN3OWG.js.map +1 -0
- package/dist/chunk-7QJT5O4S.js +35 -0
- package/dist/chunk-7QJT5O4S.js.map +1 -0
- package/dist/chunk-A55KV72M.js +402 -0
- package/dist/chunk-A55KV72M.js.map +1 -0
- package/dist/chunk-ADWCLI4G.js +2028 -0
- package/dist/chunk-ADWCLI4G.js.map +1 -0
- package/dist/chunk-B27E3V37.js +29 -0
- package/dist/chunk-B27E3V37.js.map +1 -0
- package/dist/chunk-B7TC2A33.js +83 -0
- package/dist/chunk-B7TC2A33.js.map +1 -0
- package/dist/chunk-BLL56F7R.js +385 -0
- package/dist/chunk-BLL56F7R.js.map +1 -0
- package/dist/chunk-BOFEQC6K.js +162 -0
- package/dist/chunk-BOFEQC6K.js.map +1 -0
- package/dist/chunk-CM7LVUKC.js +35 -0
- package/dist/chunk-CM7LVUKC.js.map +1 -0
- package/dist/chunk-CORUP6JB.js +122 -0
- package/dist/chunk-CORUP6JB.js.map +1 -0
- package/dist/chunk-CSX5FFKZ.js +35 -0
- package/dist/chunk-CSX5FFKZ.js.map +1 -0
- package/dist/chunk-EGVHJKGJ.js +3125 -0
- package/dist/chunk-EGVHJKGJ.js.map +1 -0
- package/dist/{chunk-NEXLLTP4.js → chunk-G76LSA76.js} +6 -5
- package/dist/chunk-G76LSA76.js.map +1 -0
- package/dist/{chunk-PEI6RANI.js → chunk-GQMRL52F.js} +311 -75
- package/dist/chunk-GQMRL52F.js.map +1 -0
- package/dist/{chunk-ELIYWBZR.js → chunk-GUUXOISA.js} +1113 -457
- package/dist/chunk-GUUXOISA.js.map +1 -0
- package/dist/{chunk-HUIKIDM5.js → chunk-I7X2P4FU.js} +225 -116
- package/dist/chunk-I7X2P4FU.js.map +1 -0
- package/dist/chunk-IGFZFLI2.js +1390 -0
- package/dist/chunk-IGFZFLI2.js.map +1 -0
- package/dist/{chunk-4MDLEHXL.js → chunk-IMSUVYQB.js} +26 -13
- package/dist/chunk-IMSUVYQB.js.map +1 -0
- package/dist/chunk-IOYHDEP3.js +38 -0
- package/dist/chunk-IOYHDEP3.js.map +1 -0
- package/dist/chunk-IZV5FTJC.js +55 -0
- package/dist/chunk-IZV5FTJC.js.map +1 -0
- package/dist/chunk-KF33GTWN.js +343 -0
- package/dist/chunk-KF33GTWN.js.map +1 -0
- package/dist/chunk-KSGQ5ODA.js +457 -0
- package/dist/chunk-KSGQ5ODA.js.map +1 -0
- package/dist/{chunk-OAM4WAAM.js → chunk-KZC6QRNR.js} +1513 -697
- package/dist/chunk-KZC6QRNR.js.map +1 -0
- package/dist/chunk-LJUMYUBO.js +218 -0
- package/dist/chunk-LJUMYUBO.js.map +1 -0
- package/dist/chunk-LSW2OJVV.js +380 -0
- package/dist/chunk-LSW2OJVV.js.map +1 -0
- package/dist/chunk-M357MHH3.js +2 -0
- package/dist/chunk-M357MHH3.js.map +1 -0
- package/dist/chunk-MK2TQO4Y.js +24 -0
- package/dist/chunk-MK2TQO4Y.js.map +1 -0
- package/dist/chunk-N7S72EXK.js +25 -0
- package/dist/chunk-N7S72EXK.js.map +1 -0
- package/dist/{chunk-XXWH2JLC.js → chunk-NKMYZFHA.js} +616 -621
- package/dist/chunk-NKMYZFHA.js.map +1 -0
- package/dist/chunk-NX4ADH73.js +14 -0
- package/dist/chunk-NX4ADH73.js.map +1 -0
- package/dist/chunk-O7F6UJO4.js +71 -0
- package/dist/chunk-O7F6UJO4.js.map +1 -0
- package/dist/chunk-OVB5WIG5.js +14064 -0
- package/dist/chunk-OVB5WIG5.js.map +1 -0
- package/dist/chunk-OYQQJL3J.js +16 -0
- package/dist/chunk-OYQQJL3J.js.map +1 -0
- package/dist/{chunk-H5YGYNXS.js → chunk-P4BNUO57.js} +60 -17
- package/dist/chunk-P4BNUO57.js.map +1 -0
- package/dist/{chunk-JVYQRRC4.js → chunk-PEHTX3V7.js} +21 -1
- package/dist/chunk-PEHTX3V7.js.map +1 -0
- package/dist/chunk-PMV53IMM.js +26 -0
- package/dist/chunk-PMV53IMM.js.map +1 -0
- package/dist/{chunk-KCGXPP5V.js → chunk-PYEOPA4M.js} +13 -7
- package/dist/chunk-PYEOPA4M.js.map +1 -0
- package/dist/{chunk-KZ73RL76.js → chunk-QHUE7E4N.js} +8 -3
- package/dist/chunk-QHUE7E4N.js.map +1 -0
- package/dist/chunk-QV3DJVRZ.js +11 -0
- package/dist/chunk-QV3DJVRZ.js.map +1 -0
- package/dist/chunk-R5SBNG7S.js +810 -0
- package/dist/chunk-R5SBNG7S.js.map +1 -0
- package/dist/chunk-RI42H5IU.js +326 -0
- package/dist/chunk-RI42H5IU.js.map +1 -0
- package/dist/chunk-S2QH6EZ5.js +211 -0
- package/dist/chunk-S2QH6EZ5.js.map +1 -0
- package/dist/chunk-SHLZMAJN.js +304 -0
- package/dist/chunk-SHLZMAJN.js.map +1 -0
- package/dist/chunk-TGXK4BAZ.js +293 -0
- package/dist/chunk-TGXK4BAZ.js.map +1 -0
- package/dist/{chunk-5YK2ZDIG.js → chunk-TNEZNMSN.js} +4 -10
- package/dist/chunk-TNEZNMSN.js.map +1 -0
- package/dist/{chunk-22KP6LR5.js → chunk-TXS65BB2.js} +3 -1
- package/dist/{chunk-22KP6LR5.js.map → chunk-TXS65BB2.js.map} +1 -1
- package/dist/chunk-UNJPZGNK.js +63 -0
- package/dist/chunk-UNJPZGNK.js.map +1 -0
- package/dist/{chunk-MZ2G2XBA.js → chunk-V5ZUJT2T.js} +205 -45
- package/dist/chunk-V5ZUJT2T.js.map +1 -0
- package/dist/chunk-VIUEOHXY.js +394 -0
- package/dist/chunk-VIUEOHXY.js.map +1 -0
- package/dist/chunk-WIUKB3LD.js +1911 -0
- package/dist/chunk-WIUKB3LD.js.map +1 -0
- package/dist/{chunk-ICA6R6TW.js → chunk-WNN7NO2N.js} +1451 -355
- package/dist/chunk-WNN7NO2N.js.map +1 -0
- package/dist/{chunk-YJFGAFBD.js → chunk-X5UVUIMF.js} +1892 -1223
- package/dist/chunk-X5UVUIMF.js.map +1 -0
- package/dist/chunk-XDA5QJE7.js +402 -0
- package/dist/chunk-XDA5QJE7.js.map +1 -0
- package/dist/{chunk-VZTQ73XT.js → chunk-XEA5BCMA.js} +3 -1
- package/dist/{chunk-VZTQ73XT.js.map → chunk-XEA5BCMA.js.map} +1 -1
- package/dist/chunk-XHF7OYAN.js +1150 -0
- package/dist/chunk-XHF7OYAN.js.map +1 -0
- package/dist/chunk-YSRBFJMQ.js +43 -0
- package/dist/chunk-YSRBFJMQ.js.map +1 -0
- package/dist/chunk-ZOZAPAUO.js +174 -0
- package/dist/chunk-ZOZAPAUO.js.map +1 -0
- package/dist/chunk-ZQV5W7YC.js +809 -0
- package/dist/chunk-ZQV5W7YC.js.map +1 -0
- package/dist/chunk-ZUWF4NF7.js +13 -0
- package/dist/chunk-ZUWF4NF7.js.map +1 -0
- package/dist/client.d.ts +16 -7
- package/dist/clipboard.js +3 -1
- package/dist/commands/types.d.ts +2 -0
- package/dist/components/anthropic-mark.d.ts +3 -0
- package/dist/components/approval-surface.d.ts +19 -6
- package/dist/components/artifacts/artifact-chrome.d.ts +120 -0
- package/dist/components/artifacts/artifact-sandbox.d.ts +30 -0
- package/dist/components/artifacts/artifact-surface.d.ts +4 -2
- package/dist/components/artifacts/chat-interactive-block.d.ts +29 -0
- package/dist/components/artifacts/deferred-chat-media.d.ts +15 -0
- package/dist/components/artifacts/document-editor.d.ts +4 -2
- package/dist/components/artifacts/editable-artifact-ui.d.ts +2 -1
- package/dist/components/artifacts/editable-artifact-view.d.ts +48 -0
- package/dist/components/artifacts/editable-document.d.ts +1 -1
- package/dist/components/artifacts/editable-presentation.d.ts +2 -2
- package/dist/components/artifacts/editable-spreadsheet.d.ts +8 -3
- package/dist/components/artifacts/index.d.ts +9 -2
- package/dist/components/artifacts/inline-html-document.d.ts +2 -0
- package/dist/components/artifacts/latest-task-runner.d.ts +15 -0
- package/dist/components/artifacts/presentation-editor.d.ts +6 -2
- package/dist/components/artifacts/published-html-artifact-frame.d.ts +23 -3
- package/dist/components/artifacts/session-artifact-viewer.d.ts +39 -0
- package/dist/components/artifacts/site-view.d.ts +26 -0
- package/dist/components/artifacts/spreadsheet-command-queue.d.ts +20 -0
- package/dist/components/artifacts/spreadsheet-download.d.ts +7 -0
- package/dist/components/artifacts/spreadsheet-general-display.d.ts +24 -0
- package/dist/components/artifacts/spreadsheet-grid.d.ts +10 -3
- package/dist/components/artifacts/spreadsheet-resize.d.ts +50 -0
- package/dist/components/artifacts/spreadsheet-submissions.d.ts +9 -0
- package/dist/components/artifacts/visualization-assets.gen.d.ts +2 -0
- package/dist/components/browser-select-control.d.ts +16 -0
- package/dist/components/browser-viewer.d.ts +11 -2
- package/dist/components/chat-composer.d.ts +21 -3
- package/dist/components/child-session-link.d.ts +9 -0
- package/dist/components/claude-mark.d.ts +3 -0
- package/dist/components/code-editor.d.ts +1 -4
- package/dist/components/composer-transcription-control.d.ts +7 -0
- package/dist/components/composer.d.ts +34 -67
- package/dist/components/computer-viewer.d.ts +1 -1
- package/dist/components/copy-button.d.ts +3 -1
- package/dist/components/desktop-viewer.d.ts +1 -1
- package/dist/components/fleet-tile.d.ts +2 -2
- package/dist/components/grok-mark.d.ts +26 -0
- package/dist/components/human-input-form.d.ts +28 -32
- package/dist/components/human-input-surface.d.ts +7 -2
- package/dist/components/linkified-text.d.ts +18 -0
- package/dist/components/machine-input-display.d.ts +22 -1
- package/dist/components/machines/agent-status-icon.d.ts +6 -0
- package/dist/components/machines/machine-detail.d.ts +7 -1
- package/dist/components/machines/machine-status.d.ts +48 -0
- package/dist/components/markdown-table-layout.d.ts +18 -0
- package/dist/components/markdown.d.ts +37 -4
- package/dist/components/message-timeline.d.ts +86 -7
- package/dist/components/model-mark.d.ts +29 -0
- package/dist/components/model-policy-picker-menu.d.ts +9 -0
- package/dist/components/model-policy-picker.d.ts +41 -25
- package/dist/components/new-conversation.d.ts +32 -0
- package/dist/components/open-geni-chat.d.ts +73 -0
- package/dist/components/open-geni-links.d.ts +68 -0
- package/dist/components/openrouter-mark.d.ts +6 -0
- package/dist/components/opper-mark.d.ts +7 -0
- package/dist/components/preview-loading.d.ts +2 -0
- package/dist/components/provider-recovery-notice.d.ts +16 -0
- package/dist/components/queue-item-content.d.ts +9 -0
- package/dist/components/rehype-secret-refs.d.ts +23 -0
- package/dist/components/remark-soft-line-breaks.d.ts +38 -0
- package/dist/components/sandbox-files.d.ts +3 -1
- package/dist/components/sandbox-workspace.d.ts +18 -0
- package/dist/components/secret-question-field.d.ts +31 -0
- package/dist/components/secret-ref-chip.d.ts +35 -0
- package/dist/components/session-capability-frame.d.ts +37 -0
- package/dist/components/session-chrome.d.ts +57 -8
- package/dist/components/session-commands-panel.d.ts +6 -0
- package/dist/components/session-commands.d.ts +6 -0
- package/dist/components/session-connection-request.d.ts +8 -0
- package/dist/components/session-conversation.d.ts +157 -0
- package/dist/components/session-list.d.ts +39 -0
- package/dist/components/session-mcp-capability-card.d.ts +41 -0
- package/dist/components/session-proxy-scope.d.ts +35 -0
- package/dist/components/session-status.d.ts +4 -1
- package/dist/components/session-usage-limit-notice.d.ts +39 -0
- package/dist/components/timeline-anchor.d.ts +24 -0
- package/dist/components/timeline-annotation-chrome.d.ts +25 -0
- package/dist/components/timeline-annotation-layout.d.ts +42 -0
- package/dist/components/timeline-annotation-markers.d.ts +8 -0
- package/dist/components/timeline-annotation-reveal-context.d.ts +4 -0
- package/dist/components/timeline-annotation-shared.d.ts +31 -0
- package/dist/components/timeline-annotations-dialog.d.ts +3 -2
- package/dist/components/timeline-annotations.d.ts +13 -3
- package/dist/components/timeline-reading-progress.d.ts +11 -0
- package/dist/components/timeline-search.d.ts +34 -0
- package/dist/components/timeline-settlement.d.ts +16 -0
- package/dist/components/tip-follow.d.ts +16 -0
- package/dist/components/tool-action-review.d.ts +47 -0
- package/dist/components/tool-review-history.d.ts +25 -0
- package/dist/components/usage-limit-notice.d.ts +49 -0
- package/dist/components/usage-member-list.d.ts +91 -0
- package/dist/components/usage-meter.d.ts +73 -0
- package/dist/components/use-viewer-menu-dismiss.d.ts +2 -0
- package/dist/components/user-message-body.d.ts +10 -1
- package/dist/composer-messages.d.ts +74 -0
- package/dist/composer-messages.js +9 -0
- package/dist/composer-messages.js.map +1 -0
- package/dist/composer-voice-events.d.ts +8 -0
- package/dist/composer.d.ts +5 -4
- package/dist/composer.js +26 -13
- package/dist/computer-viewer-GMLDXPON.js +20 -0
- package/dist/computer-viewer-GMLDXPON.js.map +1 -0
- package/dist/connect-account-identity.d.ts +8 -0
- package/dist/connect-accounts.d.ts +15 -0
- package/dist/connect-chooser.d.ts +18 -0
- package/dist/connect-panel.d.ts +18 -0
- package/dist/connect-setup.d.ts +18 -0
- package/dist/connect.d.ts +21 -0
- package/dist/connect.js +2149 -0
- package/dist/connect.js.map +1 -0
- package/dist/connection-catalog.d.ts +38 -0
- package/dist/connection-discovery.d.ts +12 -0
- package/dist/connection-installed.d.ts +17 -0
- package/dist/connection-logo.d.ts +9 -0
- package/dist/connection-service-logo.d.ts +8 -0
- package/dist/connection-service-presentation.d.ts +13 -0
- package/dist/connection-skeleton.d.ts +5 -0
- package/dist/connection-type-picker.d.ts +6 -0
- package/dist/conversation-timeline.d.ts +5 -0
- package/dist/desktop.d.ts +7 -0
- package/dist/desktop.js +27 -0
- package/dist/desktop.js.map +1 -0
- package/dist/device-authorization.d.ts +23 -0
- package/dist/diffs.d.ts +8 -0
- package/dist/diffs.js +15 -0
- package/dist/diffs.js.map +1 -0
- package/dist/discovery-cache.d.ts +5 -0
- package/dist/editor.d.ts +7 -0
- package/dist/editor.js +22 -0
- package/dist/editor.js.map +1 -0
- package/dist/embedded-new-voice-OCRNT6U5.js +18 -0
- package/dist/embedded-new-voice-OCRNT6U5.js.map +1 -0
- package/dist/embedded-voice-RPHPYVBT.js +18 -0
- package/dist/embedded-voice-RPHPYVBT.js.map +1 -0
- package/dist/{fleet-decision-row-GGCAT4E4.js → fleet-decision-row-SI63O5V4.js} +4 -1
- package/dist/fleet-decision-row-SI63O5V4.js.map +1 -0
- package/dist/hooks/latest-question.d.ts +25 -0
- package/dist/hooks/shared-machines-list.d.ts +4 -0
- package/dist/hooks/shared-query.d.ts +113 -0
- package/dist/hooks/use-attached-browsers.d.ts +1 -1
- package/dist/hooks/use-auth-runs.d.ts +1 -4
- package/dist/hooks/use-available-models.d.ts +1 -1
- package/dist/hooks/use-browser-frame-stream.d.ts +1 -1
- package/dist/hooks/use-browser-session.d.ts +12 -1
- package/dist/hooks/use-client-config-flags.d.ts +49 -0
- package/dist/hooks/use-codex-accounts.d.ts +59 -10
- package/dist/hooks/use-composer.d.ts +24 -2
- package/dist/hooks/use-computer-frame-stream.d.ts +1 -1
- package/dist/hooks/use-computer-input-posture.d.ts +13 -0
- package/dist/hooks/use-computer-session.d.ts +4 -0
- package/dist/hooks/use-connect.d.ts +23 -0
- package/dist/hooks/use-desktop-stream.d.ts +1 -1
- package/dist/hooks/use-file-attachments.d.ts +12 -0
- package/dist/hooks/use-goal.d.ts +2 -1
- package/dist/hooks/use-last-started-turn-policy.d.ts +5 -1
- package/dist/hooks/use-new-conversation.d.ts +56 -0
- package/dist/hooks/use-new-session-draft.d.ts +74 -0
- package/dist/hooks/use-realtime-voice-models.d.ts +7 -0
- package/dist/hooks/use-sandbox-files.d.ts +4 -1
- package/dist/hooks/use-session-conversation.d.ts +49 -0
- package/dist/hooks/use-session-events.d.ts +28 -7
- package/dist/hooks/use-session-mcp-approval-policy.d.ts +2 -2
- package/dist/hooks/use-session-model-account.d.ts +48 -0
- package/dist/hooks/use-supergrok-accounts.d.ts +7 -1
- package/dist/hooks/use-terminal-stream.d.ts +11 -5
- package/dist/hooks/use-usage.d.ts +40 -0
- package/dist/hooks/use-vaults.d.ts +53 -0
- package/dist/hooks/use-voice-input.d.ts +8 -1
- package/dist/hooks/use-workspace-edit.d.ts +4 -0
- package/dist/hooks/use-workspace-sessions.d.ts +22 -5
- package/dist/human-input-model.d.ts +122 -0
- package/dist/identity-link-accounts.d.ts +11 -0
- package/dist/identity-link-consent.d.ts +18 -0
- package/dist/index.d.ts +82 -20
- package/dist/index.js +2350 -6605
- package/dist/index.js.map +1 -1
- package/dist/interaction.d.ts +1 -1
- package/dist/interaction.js +14 -24
- package/dist/interaction.js.map +1 -1
- package/dist/latest-question-R77KWSUP.js +118 -0
- package/dist/latest-question-R77KWSUP.js.map +1 -0
- package/dist/lib/clipboard.d.ts +7 -0
- package/dist/lib/error-message.d.ts +7 -0
- package/dist/lib/format.d.ts +58 -4
- package/dist/lib/host-theme.d.ts +77 -0
- package/dist/lib/interaction-errors.d.ts +3 -0
- package/dist/lib/menu-styles.d.ts +22 -0
- package/dist/lib/notify-observer.d.ts +2 -0
- package/dist/lib/pierre-diffs-loader.d.ts +20 -0
- package/dist/lib/provider-recovery.d.ts +55 -0
- package/dist/lib/scrollbars.d.ts +11 -0
- package/dist/lib/terminal-input-readiness.d.ts +11 -0
- package/dist/lib/transient-retry.d.ts +25 -0
- package/dist/lib/workbench-peers.d.ts +36 -0
- package/dist/lib/xterm-theme.d.ts +7 -5
- package/dist/machines.js +9 -5
- package/dist/markdown-table-layout-3PV2UAAH.js +113 -0
- package/dist/markdown-table-layout-3PV2UAAH.js.map +1 -0
- package/dist/mcp-connection-status.d.ts +14 -0
- package/dist/model-mark-paths.d.ts +34 -0
- package/dist/model-mark-paths.js +16 -0
- package/dist/model-mark-paths.js.map +1 -0
- package/dist/model-picker-model.d.ts +111 -0
- package/dist/model-picker-model.js +25 -0
- package/dist/model-picker-model.js.map +1 -0
- package/dist/model-policy-picker-menu-7GJ5URPR.js +17 -0
- package/dist/model-policy-picker-menu-7GJ5URPR.js.map +1 -0
- package/dist/model-policy.d.ts +30 -3
- package/dist/model-policy.js +14 -1
- package/dist/native-previews.d.ts +28 -0
- package/dist/native-previews.js +82 -0
- package/dist/native-previews.js.map +1 -0
- package/dist/new-session-draft.d.ts +7 -0
- package/dist/new-session-draft.js +639 -0
- package/dist/new-session-draft.js.map +1 -0
- package/dist/notification-text.d.ts +27 -0
- package/dist/{noto-sans-arabic-loader-IA2T4X2A.js → noto-sans-arabic-loader-XSH2KYWJ.js} +3 -1
- package/dist/{noto-sans-arabic-loader-IA2T4X2A.js.map → noto-sans-arabic-loader-XSH2KYWJ.js.map} +1 -1
- package/dist/{noto-sans-jp-loader.generated-HFGLYBR3.js → noto-sans-jp-loader.generated-MR5L6V7K.js} +3 -1
- package/dist/{noto-sans-jp-loader.generated-HFGLYBR3.js.map → noto-sans-jp-loader.generated-MR5L6V7K.js.map} +1 -1
- package/dist/older-history.d.ts +3 -2
- package/dist/organization-model.d.ts +32 -0
- package/dist/organization-model.js +65 -0
- package/dist/organization-model.js.map +1 -0
- package/dist/{platform-activity-row-BJHUHXAT.js → platform-activity-row-5OCKOQWZ.js} +16 -78
- package/dist/platform-activity-row-5OCKOQWZ.js.map +1 -0
- package/dist/plugin-details.d.ts +14 -0
- package/dist/plugin-discovery.d.ts +25 -0
- package/dist/preview-loading-paint.d.ts +20 -0
- package/dist/provider.d.ts +25 -2
- package/dist/queue-presentation-model.d.ts +72 -0
- package/dist/queue-presentation-model.js +38 -0
- package/dist/queue-presentation-model.js.map +1 -0
- package/dist/{queue-surface-implementation-BSKUWHRI.js → queue-surface-implementation-GJBH7NKO.js} +65 -265
- package/dist/queue-surface-implementation-GJBH7NKO.js.map +1 -0
- package/dist/realtime/embedded-new-voice.d.ts +1 -0
- package/dist/realtime/embedded-voice.d.ts +1 -0
- package/dist/realtime/realtime-control.d.ts +4 -65
- package/dist/realtime/session-realtime.d.ts +78 -0
- package/dist/realtime.js +25 -1294
- package/dist/realtime.js.map +1 -1
- package/dist/sandbox-files-O27IPOZW.js +21 -0
- package/dist/sandbox-files-O27IPOZW.js.map +1 -0
- package/dist/sandbox-label-model.d.ts +30 -0
- package/dist/sandbox-label-model.js +20 -0
- package/dist/sandbox-label-model.js.map +1 -0
- package/dist/scrollbars.d.ts +1 -0
- package/dist/scrollbars.js +10 -0
- package/dist/scrollbars.js.map +1 -0
- package/dist/secret-reference-label.d.ts +14 -0
- package/dist/secrets-ui.d.ts +57 -0
- package/dist/session-agents-model.d.ts +10 -0
- package/dist/session-agents-model.js +25 -0
- package/dist/session-agents-model.js.map +1 -0
- package/dist/session-attention-model.d.ts +8 -0
- package/dist/session-attention-model.js +47 -0
- package/dist/session-attention-model.js.map +1 -0
- package/dist/session-auth-recommendation.d.ts +5 -0
- package/dist/session-capability-policy.d.ts +31 -0
- package/dist/session-feedback-model.d.ts +20 -0
- package/dist/session-feedback-model.js +56 -0
- package/dist/session-feedback-model.js.map +1 -0
- package/dist/session-list-model.d.ts +138 -0
- package/dist/session-list-model.js +274 -0
- package/dist/session-list-model.js.map +1 -0
- package/dist/session-realtime-7DJOIHQW.js +21 -0
- package/dist/session-realtime-7DJOIHQW.js.map +1 -0
- package/dist/session-realtime.d.ts +7 -0
- package/dist/session-realtime.js +19 -0
- package/dist/session-realtime.js.map +1 -0
- package/dist/session-status-model.d.ts +36 -0
- package/dist/session-ui.d.ts +39 -1
- package/dist/session-ui.js +126 -12
- package/dist/session-ui.js.map +1 -1
- package/dist/session.d.ts +8 -2
- package/dist/session.js +35 -20
- package/dist/site-snapshot.d.ts +14 -0
- package/dist/sites-ui.d.ts +24 -0
- package/dist/sites.d.ts +3 -0
- package/dist/sites.js +14 -0
- package/dist/sites.js.map +1 -0
- package/dist/skill-discovery.d.ts +47 -0
- package/dist/terminal.d.ts +8 -0
- package/dist/terminal.js +32 -0
- package/dist/terminal.js.map +1 -0
- package/dist/testing/session-scenarios.d.ts +10 -0
- package/dist/testing/session-scenarios.js +367 -0
- package/dist/testing/session-scenarios.js.map +1 -0
- package/dist/timeline/activity-rail.d.ts +11 -2
- package/dist/timeline/agent-identity.d.ts +30 -0
- package/dist/timeline/agent-row.d.ts +31 -0
- package/dist/timeline/allowance-exhausted-row.d.ts +24 -0
- package/dist/timeline/compaction-copy.d.ts +46 -0
- package/dist/timeline/entrance.d.ts +13 -1
- package/dist/timeline/focus-sequence.d.ts +9 -0
- package/dist/timeline/genie-copy.d.ts +3 -0
- package/dist/timeline/genie-loading.d.ts +47 -0
- package/dist/timeline/index.d.ts +10 -5
- package/dist/timeline/knowledge-receipt.d.ts +17 -0
- package/dist/timeline/message-sender.d.ts +19 -0
- package/dist/timeline/notice-presentation.d.ts +13 -0
- package/dist/timeline/parsers.d.ts +11 -0
- package/dist/timeline/patch-apply-command.d.ts +18 -0
- package/dist/timeline/platform-activity-presentation.d.ts +21 -0
- package/dist/timeline/platform-activity-row.d.ts +1 -2
- package/dist/timeline/presented-image.d.ts +11 -0
- package/dist/timeline/projection.d.ts +31 -2
- package/dist/timeline/provider-logo.d.ts +15 -0
- package/dist/timeline/question-nav-model.d.ts +23 -0
- package/dist/timeline/registry.d.ts +12 -1
- package/dist/timeline/retained-image.d.ts +18 -0
- package/dist/timeline/retained-loaders.d.ts +27 -0
- package/dist/timeline/rolling-activity.d.ts +11 -0
- package/dist/timeline/screenshot-lightbox.d.ts +23 -1
- package/dist/timeline/session-usage-limit-row.d.ts +11 -0
- package/dist/timeline/shared.d.ts +4 -1
- package/dist/timeline/startup-dispatch-details.d.ts +5 -0
- package/dist/timeline/startup-preference.d.ts +3 -0
- package/dist/timeline/startup-timings.d.ts +4 -0
- package/dist/timeline/tool-display-name.d.ts +5 -2
- package/dist/timeline/tool-presentation.d.ts +172 -0
- package/dist/timeline/turn-summary-model.d.ts +95 -0
- package/dist/timeline/turn-summary.d.ts +20 -54
- package/dist/timeline/types.d.ts +179 -7
- package/dist/timeline/work-presentation.d.ts +60 -0
- package/dist/timeline-annotation-markers-U3G66KUD.js +166 -0
- package/dist/timeline-annotation-markers-U3G66KUD.js.map +1 -0
- package/dist/timeline-annotation-selection-BI7QTPTZ.js +242 -0
- package/dist/timeline-annotation-selection-BI7QTPTZ.js.map +1 -0
- package/dist/timeline-annotations-dialog-FOMHSDTE.js +274 -0
- package/dist/timeline-annotations-dialog-FOMHSDTE.js.map +1 -0
- package/dist/timeline-model.d.ts +29 -0
- package/dist/timeline-model.js +254 -0
- package/dist/timeline-model.js.map +1 -0
- package/dist/usage/allowance-copy.d.ts +25 -0
- package/dist/usage/session-usage-limit.d.ts +88 -0
- package/dist/usage/summary.d.ts +35 -0
- package/dist/usage.d.ts +17 -0
- package/dist/usage.js +1187 -0
- package/dist/usage.js.map +1 -0
- package/dist/voice-recording-owner.d.ts +7 -0
- package/package.json +107 -7
- package/src/accounts.tsx +116 -14
- package/src/approvals.ts +8 -1
- package/src/artifacts-spreadsheet.ts +1 -0
- package/src/artifacts.ts +44 -0
- package/src/assets/README.md +8 -0
- package/src/assets/gmail.ico +0 -0
- package/src/assets/outlook.ico +0 -0
- package/src/capability-catalog-row.tsx +94 -0
- package/src/capability-logo-fallback.ts +22 -0
- package/src/client.ts +20 -31
- package/src/commands/registry.ts +18 -15
- package/src/commands/types.ts +2 -0
- package/src/components/anthropic-mark.tsx +10 -0
- package/src/components/approval-surface.tsx +401 -138
- package/src/components/artifacts/artifact-chrome.tsx +413 -0
- package/src/components/artifacts/artifact-sandbox.tsx +189 -0
- package/src/components/artifacts/artifact-surface.tsx +40 -20
- package/src/components/artifacts/chat-interactive-block.tsx +260 -0
- package/src/components/artifacts/deferred-chat-media.tsx +67 -0
- package/src/components/artifacts/document-editor.tsx +141 -16
- package/src/components/artifacts/editable-artifact-ui.tsx +4 -2
- package/src/components/artifacts/editable-artifact-view.tsx +197 -0
- package/src/components/artifacts/editable-artifact-workbench.tsx +5 -2
- package/src/components/artifacts/editable-document.tsx +37 -36
- package/src/components/artifacts/editable-presentation.tsx +36 -18
- package/src/components/artifacts/editable-spreadsheet.tsx +543 -103
- package/src/components/artifacts/index.ts +45 -0
- package/src/components/artifacts/inline-html-document.ts +24 -0
- package/src/components/artifacts/latest-task-runner.ts +49 -0
- package/src/components/artifacts/presentation-editor.tsx +323 -67
- package/src/components/artifacts/published-html-artifact-frame.tsx +122 -5
- package/src/components/artifacts/session-artifact-viewer.tsx +378 -0
- package/src/components/artifacts/site-view.tsx +121 -0
- package/src/components/artifacts/spreadsheet-canvas.ts +5 -10
- package/src/components/artifacts/spreadsheet-command-queue.ts +184 -0
- package/src/components/artifacts/spreadsheet-download.tsx +109 -0
- package/src/components/artifacts/spreadsheet-general-display.ts +43 -0
- package/src/components/artifacts/spreadsheet-grid.tsx +344 -144
- package/src/components/artifacts/spreadsheet-resize.tsx +421 -0
- package/src/components/artifacts/spreadsheet-submissions.tsx +46 -0
- package/src/components/artifacts/visualization-assets/base.css +1015 -0
- package/src/components/artifacts/visualization-assets/helpers.html +349 -0
- package/src/components/artifacts/visualization-assets.gen.ts +3 -0
- package/src/components/browser-select-control.tsx +312 -0
- package/src/components/browser-viewer.tsx +778 -318
- package/src/components/chat-composer.tsx +47 -5
- package/src/components/child-session-link.tsx +36 -0
- package/src/components/claude-mark.tsx +11 -0
- package/src/components/code-editor.tsx +13 -16
- package/src/components/composer-transcription-control.tsx +128 -30
- package/src/components/composer.tsx +404 -195
- package/src/components/computer-viewer.tsx +880 -253
- package/src/components/copy-button.tsx +13 -5
- package/src/components/desktop-viewer.tsx +1 -1
- package/src/components/enrollment-consent.tsx +1 -1
- package/src/components/enrollment-device-flow.tsx +1 -1
- package/src/components/file-browser.tsx +10 -14
- package/src/components/fleet-tile.tsx +9 -18
- package/src/components/generated-video-player.tsx +4 -2
- package/src/components/grok-mark.tsx +34 -0
- package/src/components/human-input-form.tsx +590 -283
- package/src/components/human-input-surface.tsx +11 -0
- package/src/components/interaction-intervention-banner.tsx +2 -2
- package/src/components/linkified-text.tsx +79 -0
- package/src/components/machine-card.tsx +35 -78
- package/src/components/machine-dock-bar.tsx +1 -1
- package/src/components/machine-input-display.ts +197 -3
- package/src/components/machines/agent-status-icon.tsx +31 -0
- package/src/components/machines/machine-detail.tsx +200 -31
- package/src/components/machines/machine-operation-policy.tsx +1 -1
- package/src/components/machines/machine-status.ts +241 -0
- package/src/components/machines-dashboard.tsx +2 -17
- package/src/components/markdown-table-layout.ts +143 -0
- package/src/components/markdown.tsx +466 -129
- package/src/components/message-timeline.tsx +2567 -728
- package/src/components/model-mark.tsx +102 -0
- package/src/components/model-picker.tsx +15 -4
- package/src/components/model-policy-picker-menu.tsx +371 -0
- package/src/components/model-policy-picker.tsx +256 -412
- package/src/components/new-conversation.tsx +221 -0
- package/src/components/open-geni-chat.tsx +309 -0
- package/src/components/open-geni-links.tsx +179 -0
- package/src/components/openrouter-mark.tsx +13 -0
- package/src/components/opper-mark.tsx +18 -0
- package/src/components/pierre-diff.tsx +41 -16
- package/src/components/pierre-file.tsx +35 -10
- package/src/components/preview-loading.tsx +109 -0
- package/src/components/provider-recovery-notice.tsx +49 -0
- package/src/components/queue-item-content.ts +14 -0
- package/src/components/queue-surface-implementation.tsx +51 -356
- package/src/components/queue-surface-state.tsx +3 -1
- package/src/components/rehype-secret-refs.ts +98 -0
- package/src/components/remark-soft-line-breaks.ts +166 -0
- package/src/components/sandbox-files.tsx +91 -15
- package/src/components/sandbox-terminal.tsx +84 -13
- package/src/components/sandbox-workspace.tsx +147 -51
- package/src/components/secret-question-field.tsx +324 -0
- package/src/components/secret-ref-chip.tsx +185 -0
- package/src/components/session-capability-frame.tsx +197 -0
- package/src/components/session-chrome.tsx +842 -251
- package/src/components/session-commands-panel.tsx +126 -0
- package/src/components/session-commands.tsx +18 -0
- package/src/components/session-connection-request.tsx +97 -0
- package/src/components/session-conversation.tsx +876 -0
- package/src/components/session-list.tsx +257 -0
- package/src/components/session-mcp-capability-card.tsx +680 -0
- package/src/components/session-proxy-scope.tsx +153 -0
- package/src/components/session-status.tsx +26 -17
- package/src/components/session-usage-limit-notice.tsx +174 -0
- package/src/components/timeline-anchor.tsx +119 -0
- package/src/components/timeline-annotation-chrome.tsx +196 -0
- package/src/components/timeline-annotation-layout.ts +268 -0
- package/src/components/timeline-annotation-markers.tsx +185 -0
- package/src/components/timeline-annotation-reveal-context.ts +9 -0
- package/src/components/timeline-annotation-selection.tsx +106 -54
- package/src/components/timeline-annotation-shared.ts +245 -0
- package/src/components/timeline-annotations-dialog.tsx +185 -128
- package/src/components/timeline-annotations.tsx +189 -45
- package/src/components/timeline-reading-progress.ts +80 -0
- package/src/components/timeline-search.tsx +168 -0
- package/src/components/timeline-settlement.ts +60 -0
- package/src/components/tip-follow.ts +52 -0
- package/src/components/tool-action-review.tsx +650 -0
- package/src/components/tool-review-history.tsx +88 -0
- package/src/components/tooltip.tsx +38 -5
- package/src/components/usage-limit-notice.tsx +179 -0
- package/src/components/usage-member-list.tsx +792 -0
- package/src/components/usage-meter.tsx +382 -0
- package/src/components/use-viewer-menu-dismiss.ts +33 -0
- package/src/components/user-message-body.tsx +27 -2
- package/src/components/workspace-dock.tsx +18 -1
- package/src/composer-messages.ts +150 -0
- package/src/composer-voice-events.ts +12 -0
- package/src/composer.ts +6 -1
- package/src/connect-account-identity.tsx +34 -0
- package/src/connect-accounts.tsx +233 -0
- package/src/connect-chooser.tsx +336 -0
- package/src/connect-panel.tsx +99 -0
- package/src/connect-setup.tsx +355 -0
- package/src/connect.ts +60 -0
- package/src/connection-assets.d.ts +4 -0
- package/src/connection-catalog.tsx +162 -0
- package/src/connection-discovery.tsx +238 -0
- package/src/connection-installed.tsx +51 -0
- package/src/connection-logo.tsx +37 -0
- package/src/connection-service-logo.tsx +55 -0
- package/src/connection-service-presentation.ts +46 -0
- package/src/connection-skeleton.tsx +16 -0
- package/src/connection-type-picker.tsx +36 -0
- package/src/conversation-timeline.ts +92 -0
- package/src/desktop.ts +24 -0
- package/src/device-authorization.tsx +98 -0
- package/src/diffs.ts +16 -0
- package/src/discovery-cache.ts +42 -0
- package/src/editor.ts +13 -0
- package/src/hooks/internal.ts +3 -2
- package/src/hooks/latest-question.ts +164 -0
- package/src/hooks/shared-machines-list.ts +34 -1
- package/src/hooks/shared-query.ts +721 -0
- package/src/hooks/use-attached-browsers.ts +1 -1
- package/src/hooks/use-auth-runs.ts +0 -27
- package/src/hooks/use-available-models.ts +21 -15
- package/src/hooks/use-browser-frame-stream.ts +19 -2
- package/src/hooks/use-browser-session.ts +680 -205
- package/src/hooks/use-browser-sessions.ts +32 -1
- package/src/hooks/use-client-config-flags.ts +118 -0
- package/src/hooks/use-codex-accounts.ts +247 -47
- package/src/hooks/use-composer.ts +276 -47
- package/src/hooks/use-computer-frame-stream.ts +25 -7
- package/src/hooks/use-computer-input-posture.ts +94 -0
- package/src/hooks/use-computer-session.ts +409 -95
- package/src/hooks/use-connect.ts +23 -0
- package/src/hooks/use-desktop-stream.ts +19 -28
- package/src/hooks/use-file-attachments.ts +80 -4
- package/src/hooks/use-goal.ts +107 -13
- package/src/hooks/use-last-started-turn-policy.ts +46 -14
- package/src/hooks/use-machines.ts +4 -0
- package/src/hooks/use-new-conversation.ts +374 -0
- package/src/hooks/use-new-session-draft.ts +813 -0
- package/src/hooks/use-realtime-voice-models.ts +46 -0
- package/src/hooks/use-sandbox-files.ts +68 -20
- package/src/hooks/use-session-background-commands.ts +22 -11
- package/src/hooks/use-session-capabilities.ts +3 -2
- package/src/hooks/use-session-conversation.ts +150 -0
- package/src/hooks/use-session-events.ts +703 -382
- package/src/hooks/use-session-lineage.ts +20 -16
- package/src/hooks/use-session-mcp-approval-policy.ts +13 -5
- package/src/hooks/use-session-model-account.ts +174 -0
- package/src/hooks/use-session.ts +53 -21
- package/src/hooks/use-slash-commands.ts +6 -11
- package/src/hooks/use-supergrok-accounts.ts +22 -8
- package/src/hooks/use-terminal-stream.ts +153 -27
- package/src/hooks/use-transcription.ts +6 -0
- package/src/hooks/use-turn-queue.ts +2 -1
- package/src/hooks/use-usage.ts +100 -0
- package/src/hooks/use-vaults.ts +153 -0
- package/src/hooks/use-video-artifact-playback.ts +1 -1
- package/src/hooks/use-voice-input.ts +127 -19
- package/src/hooks/use-workspace-capture.ts +3 -2
- package/src/hooks/use-workspace-edit.ts +23 -5
- package/src/hooks/use-workspace-sessions.ts +97 -32
- package/src/human-input-model.ts +359 -0
- package/src/identity-link-accounts.tsx +148 -0
- package/src/identity-link-consent.tsx +192 -0
- package/src/index.ts +262 -16
- package/src/interaction.ts +1 -0
- package/src/lib/clipboard.ts +29 -0
- package/src/lib/error-message.ts +37 -0
- package/src/lib/format.ts +213 -16
- package/src/lib/host-theme.ts +529 -0
- package/src/lib/interaction-errors.ts +15 -0
- package/src/lib/menu-styles.ts +44 -0
- package/src/lib/notify-observer.ts +15 -0
- package/src/lib/pierre-diffs-loader.ts +53 -0
- package/src/lib/provider-recovery.ts +243 -0
- package/src/lib/scrollbars.ts +30 -0
- package/src/lib/terminal-input-readiness.ts +51 -0
- package/src/lib/transient-retry.ts +99 -0
- package/src/lib/workbench-peers.ts +62 -0
- package/src/lib/xterm-theme.ts +23 -21
- package/src/mcp-connection-status.ts +35 -0
- package/src/model-mark-paths.ts +53 -0
- package/src/model-picker-model.ts +330 -0
- package/src/model-policy.ts +299 -74
- package/src/native-previews.ts +100 -0
- package/src/new-session-draft.ts +22 -0
- package/src/notification-text.ts +81 -0
- package/src/older-history.ts +22 -4
- package/src/organization-model.ts +118 -0
- package/src/plugin-details.tsx +185 -0
- package/src/plugin-discovery.tsx +196 -0
- package/src/preview-loading-paint.ts +68 -0
- package/src/provider.tsx +74 -15
- package/src/queue-presentation-model.ts +464 -0
- package/src/realtime/dropdown-menu.tsx +19 -12
- package/src/realtime/embedded-new-voice.tsx +1 -0
- package/src/realtime/embedded-voice.tsx +3 -0
- package/src/realtime/realtime-control.tsx +138 -501
- package/src/realtime/session-realtime.ts +566 -0
- package/src/sandbox-label-model.ts +53 -0
- package/src/scrollbars.ts +3 -0
- package/src/secret-reference-label.ts +43 -0
- package/src/secrets-ui.tsx +59 -0
- package/src/session-agents-model.ts +33 -0
- package/src/session-attention-model.ts +62 -0
- package/src/session-auth-recommendation.ts +48 -0
- package/src/session-capability-policy.ts +196 -0
- package/src/session-context.ts +3 -4
- package/src/session-feedback-model.ts +95 -0
- package/src/session-list-model.ts +434 -0
- package/src/session-realtime.ts +18 -0
- package/src/session-status-model.ts +99 -0
- package/src/session-ui.ts +98 -1
- package/src/session.ts +17 -1
- package/src/site-snapshot.ts +74 -0
- package/src/sites-ui.tsx +348 -0
- package/src/sites.ts +3 -0
- package/src/skill-discovery.tsx +208 -0
- package/src/terminal.ts +26 -0
- package/src/testing/session-scenarios.ts +404 -0
- package/src/timeline/activity-rail.tsx +242 -101
- package/src/timeline/agent-identity.tsx +84 -0
- package/src/timeline/agent-row.tsx +231 -0
- package/src/timeline/allowance-exhausted-row.tsx +86 -0
- package/src/timeline/compaction-copy.ts +115 -0
- package/src/timeline/entrance.tsx +28 -3
- package/src/timeline/fleet-decision-projection.ts +2 -1
- package/src/timeline/fleet-decision-row.tsx +1 -0
- package/src/timeline/focus-sequence.ts +44 -0
- package/src/timeline/genie-copy.ts +19 -0
- package/src/timeline/genie-loading.tsx +143 -0
- package/src/timeline/index.ts +30 -2
- package/src/timeline/knowledge-receipt.tsx +100 -0
- package/src/timeline/message-sender.tsx +71 -0
- package/src/timeline/notice-presentation.ts +48 -0
- package/src/timeline/parsers.ts +42 -2
- package/src/timeline/patch-apply-command.tsx +135 -0
- package/src/timeline/platform-activity-presentation.ts +166 -0
- package/src/timeline/platform-activity-row.tsx +15 -90
- package/src/timeline/presented-image.ts +63 -0
- package/src/timeline/projection.ts +1746 -76
- package/src/timeline/provider-logo.tsx +53 -0
- package/src/timeline/question-nav-model.ts +28 -0
- package/src/timeline/registry.ts +26 -4
- package/src/timeline/retained-image.ts +97 -0
- package/src/timeline/retained-loaders.ts +91 -0
- package/src/timeline/rolling-activity.tsx +80 -0
- package/src/timeline/screenshot-lightbox.tsx +228 -5
- package/src/timeline/session-usage-limit-row.tsx +42 -0
- package/src/timeline/shared.tsx +42 -15
- package/src/timeline/startup-dispatch-details.tsx +36 -0
- package/src/timeline/startup-preference.ts +33 -0
- package/src/timeline/startup-timings.tsx +145 -0
- package/src/timeline/tool-display-name.ts +19 -7
- package/src/timeline/tool-presentation.ts +1316 -0
- package/src/timeline/tool-renderers.tsx +835 -1138
- package/src/timeline/turn-summary-model.ts +343 -0
- package/src/timeline/turn-summary.tsx +272 -365
- package/src/timeline/types.ts +189 -6
- package/src/timeline/work-presentation.ts +189 -0
- package/src/timeline-model.ts +143 -0
- package/src/usage/allowance-copy.ts +64 -0
- package/src/usage/session-usage-limit.ts +266 -0
- package/src/usage/summary.ts +93 -0
- package/src/usage.ts +70 -0
- package/src/voice-recording-owner.ts +22 -0
- package/styles/compiled.css +2319 -748
- package/styles/connect.css +290 -0
- package/styles/connect.d.ts +1 -0
- package/styles/effective-tokens.css +1 -0
- package/styles/index.css +309 -9
- package/styles/responsive.css +99 -7
- package/styles/session-capability.css +44 -0
- package/styles/tokens.css +134 -66
- package/dist/browser-viewer-AEFHUYZK.js +0 -14
- package/dist/chunk-4MDLEHXL.js.map +0 -1
- package/dist/chunk-5YK2ZDIG.js.map +0 -1
- package/dist/chunk-D3UIAJKY.js.map +0 -1
- package/dist/chunk-ELIYWBZR.js.map +0 -1
- package/dist/chunk-H5YGYNXS.js.map +0 -1
- package/dist/chunk-HQVCKCLG.js +0 -9458
- package/dist/chunk-HQVCKCLG.js.map +0 -1
- package/dist/chunk-HUIKIDM5.js.map +0 -1
- package/dist/chunk-ICA6R6TW.js.map +0 -1
- package/dist/chunk-JVYQRRC4.js.map +0 -1
- package/dist/chunk-KCGXPP5V.js.map +0 -1
- package/dist/chunk-KZ73RL76.js.map +0 -1
- package/dist/chunk-LAKLF4PA.js +0 -141
- package/dist/chunk-LAKLF4PA.js.map +0 -1
- package/dist/chunk-MZ2G2XBA.js.map +0 -1
- package/dist/chunk-NEXLLTP4.js.map +0 -1
- package/dist/chunk-OAM4WAAM.js.map +0 -1
- package/dist/chunk-PEI6RANI.js.map +0 -1
- package/dist/chunk-RGALCTWO.js.map +0 -1
- package/dist/chunk-W6NFJXSA.js +0 -454
- package/dist/chunk-W6NFJXSA.js.map +0 -1
- package/dist/chunk-WSK7G5LE.js +0 -170
- package/dist/chunk-WSK7G5LE.js.map +0 -1
- package/dist/chunk-X4A66EWZ.js +0 -223
- package/dist/chunk-X4A66EWZ.js.map +0 -1
- package/dist/chunk-XXWH2JLC.js.map +0 -1
- package/dist/chunk-YFKJ7VZH.js +0 -268
- package/dist/chunk-YFKJ7VZH.js.map +0 -1
- package/dist/chunk-YJFGAFBD.js.map +0 -1
- package/dist/computer-viewer-FWEZISW4.js +0 -16
- package/dist/fleet-decision-row-GGCAT4E4.js.map +0 -1
- package/dist/hooks/use-environments.d.ts +0 -41
- package/dist/hooks/use-packs.d.ts +0 -32
- package/dist/platform-activity-row-BJHUHXAT.js.map +0 -1
- package/dist/queue-surface-implementation-BSKUWHRI.js.map +0 -1
- package/dist/timeline-annotation-selection-3L7LHGG2.js +0 -187
- package/dist/timeline-annotation-selection-3L7LHGG2.js.map +0 -1
- package/dist/timeline-annotations-dialog-U7EVLR75.js +0 -196
- package/dist/timeline-annotations-dialog-U7EVLR75.js.map +0 -1
- package/src/hooks/use-environments.ts +0 -182
- package/src/hooks/use-packs.ts +0 -157
- /package/dist/{browser-viewer-AEFHUYZK.js.map → browser-viewer-ZWR6MWJ7.js.map} +0 -0
- /package/dist/{computer-viewer-FWEZISW4.js.map → chat-interactive-block-BO2IWXVK.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/provider.tsx","../src/hooks/shared-query.ts"],"sourcesContent":["import {\n OpenGeniApiContractMismatchError,\n OPENGENI_API_CONTRACT_REVISION,\n type StreamConnectionState,\n type WorkspaceControlEvent,\n type WorkspaceInteractionRevisionEvent,\n} from \"@opengeni/sdk\";\nimport { useCallback, useEffect, useMemo, useRef, useState, type ReactNode } from \"react\";\nimport type { SessionClientLike } from \"./client\";\nimport { usePageLiveActivity } from \"./hooks/internal\";\nimport { retainSharedQueries } from \"./hooks/shared-query\";\nimport { OpenGeniContext } from \"./session-context\";\nimport { ErrorMessageContext, type ErrorMessageFormatter } from \"./lib/error-message\";\n\nexport type { ErrorMessageFormatter } from \"./lib/error-message\";\n\nexport { useOpenGeni, useOpenGeniClient } from \"./session-context\";\nexport type { ClientOverride, OpenGeniContextValue } from \"./session-context\";\nconst CONTRACT_RELOAD_STORAGE_PREFIX = \"opengeni.reloadForApiContract:\";\n\nexport type OpenGeniProviderProps = {\n client: SessionClientLike;\n workspaceId: string;\n onWorkspaceControlEvent?: ((event: WorkspaceControlEvent) => void) | undefined;\n onWorkspaceInteractionEvent?: ((event: WorkspaceInteractionRevisionEvent) => void) | undefined;\n /**\n * Stale-tab protection for the stock Opengeni web app: when the server's API\n * contract revision differs from this bundle's, cover the page and reload it\n * once. Off by default, because an embedded product's page must never be\n * blocked or reloaded when Opengeni deploys; there a mismatch is ignored and\n * the SDK's tolerant-reader compatibility applies.\n */\n reloadOnApiContractChange?: boolean | undefined;\n /**\n * Keep subscription account lists and usage readings (`useCodexAccounts`,\n * `useSuperGrokAccounts`) for `client` after the components that read them\n * unmount, so returning to them renders the last rows at once and re-reads\n * in the background. Off by default: then readers mounted together share one\n * request, but nothing is served to a later mount. Opt in only when every\n * signed-in person gets their own `client` object (the stock Opengeni console\n * creates a new client on every identity change). Retained rows are dropped\n * when `client` changes or this provider unmounts.\n */\n retainReadsAcrossMounts?: boolean | undefined;\n /** Host-owned error copy. Receives the original diagnostic error and neutral default copy. */\n formatError?: ErrorMessageFormatter | undefined;\n children?: ReactNode;\n};\n\n/**\n * Supplies the Opengeni client + workspace to all hooks below it. Hooks also\n * accept `{ client, workspaceId }` overrides per call for multi-workspace UIs.\n */\nexport function OpenGeniProvider({\n client,\n workspaceId,\n onWorkspaceControlEvent,\n onWorkspaceInteractionEvent,\n reloadOnApiContractChange = false,\n retainReadsAcrossMounts = false,\n formatError,\n children,\n}: OpenGeniProviderProps) {\n const [workspaceControlEvent, setWorkspaceControlEvent] = useState<WorkspaceControlEvent | null>(\n null,\n );\n const [workspaceControlConnectionState, setWorkspaceControlConnectionState] = useState<\n StreamConnectionState | \"idle\" | \"error\"\n >(\"idle\");\n const [workspaceInteractionEvent, setWorkspaceInteractionEvent] =\n useState<WorkspaceInteractionRevisionEvent | null>(null);\n const [workspaceInteractionConnectionState, setWorkspaceInteractionConnectionState] = useState<\n StreamConnectionState | \"idle\" | \"error\"\n >(\"idle\");\n const [contractMismatch, setContractMismatch] = useState<OpenGeniApiContractMismatchError | null>(\n null,\n );\n const callbackRef = useRef(onWorkspaceControlEvent);\n const interactionCallbackRef = useRef(onWorkspaceInteractionEvent);\n const reconcilersRef = useRef(new Map<string, Map<string, () => Promise<void>>>());\n const reconcileInFlightRef = useRef(new Map<string, Promise<void>>());\n const workspaceControlSequencesRef = useRef(new Map<string, number>());\n const workspaceInteractionSequencesRef = useRef(new Map<string, number>());\n const pageLive = usePageLiveActivity();\n const supportsWorkspaceLiveStream =\n \"streamWorkspaceLiveEvents\" in client && typeof client.streamWorkspaceLiveEvents === \"function\";\n callbackRef.current = onWorkspaceControlEvent;\n interactionCallbackRef.current = onWorkspaceInteractionEvent;\n\n useEffect(() => {\n if (!retainReadsAcrossMounts) return;\n return retainSharedQueries(client);\n }, [client, retainReadsAcrossMounts]);\n\n const strictContract = reloadOnApiContractChange;\n const verifyApiContract = useCallback(async (): Promise<void> => {\n try {\n const config = await client.getClientConfig();\n if (strictContract && config.apiContractRevision !== OPENGENI_API_CONTRACT_REVISION) {\n throw new OpenGeniApiContractMismatchError(\n OPENGENI_API_CONTRACT_REVISION,\n String(config.apiContractRevision || \"(missing)\"),\n );\n }\n } catch (error) {\n if (error instanceof OpenGeniApiContractMismatchError) {\n // Embedded hosts: a revision difference is not a reason to block or reload the page.\n if (!strictContract) return;\n setContractMismatch(error);\n reloadForContractMismatchOnce(error);\n }\n throw error;\n }\n }, [client, strictContract]);\n\n const registerSessionReconciler = useMemo(\n () =>\n (sessionId: string, key: string, reconcile: () => Promise<void>): (() => void) => {\n const sessionReconcilers = reconcilersRef.current.get(sessionId) ?? new Map();\n sessionReconcilers.set(key, reconcile);\n reconcilersRef.current.set(sessionId, sessionReconcilers);\n return () => {\n const current = reconcilersRef.current.get(sessionId);\n current?.delete(key);\n if (current?.size === 0) reconcilersRef.current.delete(sessionId);\n };\n },\n [],\n );\n const reconcileSession = useMemo(\n () =>\n (sessionId: string): Promise<void> => {\n const existing = reconcileInFlightRef.current.get(sessionId);\n if (existing) return existing;\n // This read also crosses the exact API-contract handshake before stale\n // state can be presented as live after a deployment.\n const promise = (async () => {\n await withTimeout(verifyApiContract(), 10_000, \"API contract reconciliation\");\n const callbacks = [...(reconcilersRef.current.get(sessionId)?.values() ?? [])];\n await withTimeout(\n Promise.all(callbacks.map((reconcile) => reconcile())).then(() => undefined),\n 15_000,\n \"session reconciliation\",\n );\n })().finally(() => {\n if (reconcileInFlightRef.current.get(sessionId) === promise) {\n reconcileInFlightRef.current.delete(sessionId);\n }\n });\n reconcileInFlightRef.current.set(sessionId, promise);\n return promise;\n },\n [verifyApiContract],\n );\n\n useEffect(() => {\n if (!supportsWorkspaceLiveStream) return;\n const openLiveStream = client.streamWorkspaceLiveEvents!;\n setWorkspaceControlEvent(null);\n setWorkspaceInteractionEvent(null);\n if (!pageLive) {\n setWorkspaceControlConnectionState(\"idle\");\n setWorkspaceInteractionConnectionState(\"idle\");\n return;\n }\n const controller = new AbortController();\n const setConnectionState = (state: StreamConnectionState) => {\n setWorkspaceControlConnectionState(state);\n setWorkspaceInteractionConnectionState(state);\n };\n setConnectionState(\"connecting\");\n void (async () => {\n try {\n await verifyApiContract();\n const workspace = await client.getWorkspace(workspaceId);\n const controlAfter = Math.max(\n workspaceControlSequencesRef.current.get(workspaceId) ?? 0,\n workspace.inferenceControl.revision,\n );\n const interactionAfter = workspaceInteractionSequencesRef.current.get(workspaceId) ?? 0;\n workspaceControlSequencesRef.current.set(workspaceId, controlAfter);\n const stream = openLiveStream.call(client, workspaceId, {\n controlAfter,\n interactionAfter,\n signal: controller.signal,\n onStateChange: setConnectionState,\n });\n for await (const event of stream) {\n if (controller.signal.aborted) return;\n if (event.type === \"workspace.control.changed\") {\n workspaceControlSequencesRef.current.set(\n workspaceId,\n Math.max(workspaceControlSequencesRef.current.get(workspaceId) ?? 0, event.sequence),\n );\n setWorkspaceControlEvent((current) =>\n !current || event.sequence > current.sequence ? event : current,\n );\n callbackRef.current?.(event);\n } else {\n workspaceInteractionSequencesRef.current.set(\n workspaceId,\n Math.max(\n workspaceInteractionSequencesRef.current.get(workspaceId) ?? 0,\n event.sequence,\n ),\n );\n setWorkspaceInteractionEvent((current) =>\n !current || event.sequence > current.sequence ? event : current,\n );\n interactionCallbackRef.current?.(event);\n }\n }\n } catch (error) {\n if (strictContract && error instanceof OpenGeniApiContractMismatchError) {\n setContractMismatch(error);\n reloadForContractMismatchOnce(error);\n }\n if (!controller.signal.aborted) {\n setWorkspaceControlConnectionState(\"error\");\n setWorkspaceInteractionConnectionState(\"error\");\n }\n }\n })();\n return () => controller.abort();\n }, [\n client,\n pageLive,\n strictContract,\n supportsWorkspaceLiveStream,\n verifyApiContract,\n workspaceId,\n ]);\n\n useEffect(() => {\n if (supportsWorkspaceLiveStream) return;\n if (!pageLive) {\n setWorkspaceControlConnectionState(\"idle\");\n return;\n }\n const controller = new AbortController();\n setWorkspaceControlConnectionState(\"connecting\");\n void (async () => {\n try {\n await verifyApiContract();\n const workspace = await client.getWorkspace(workspaceId);\n const resumeAfter = Math.max(\n workspaceControlSequencesRef.current.get(workspaceId) ?? 0,\n workspace.inferenceControl.revision,\n );\n workspaceControlSequencesRef.current.set(workspaceId, resumeAfter);\n const stream = client.streamWorkspaceControlEvents(workspaceId, {\n after: resumeAfter,\n signal: controller.signal,\n onStateChange: setWorkspaceControlConnectionState,\n });\n for await (const event of stream) {\n if (controller.signal.aborted) return;\n workspaceControlSequencesRef.current.set(\n workspaceId,\n Math.max(workspaceControlSequencesRef.current.get(workspaceId) ?? 0, event.sequence),\n );\n setWorkspaceControlEvent((current) =>\n !current || event.sequence > current.sequence ? event : current,\n );\n callbackRef.current?.(event);\n }\n } catch (error) {\n if (strictContract && error instanceof OpenGeniApiContractMismatchError) {\n setContractMismatch(error);\n reloadForContractMismatchOnce(error);\n }\n if (!controller.signal.aborted) setWorkspaceControlConnectionState(\"error\");\n }\n })();\n return () => controller.abort();\n }, [\n client,\n pageLive,\n strictContract,\n supportsWorkspaceLiveStream,\n verifyApiContract,\n workspaceId,\n ]);\n\n useEffect(() => {\n if (supportsWorkspaceLiveStream) return;\n setWorkspaceInteractionEvent(null);\n if (!pageLive) {\n setWorkspaceInteractionConnectionState(\"idle\");\n return;\n }\n const controller = new AbortController();\n setWorkspaceInteractionConnectionState(\"connecting\");\n void (async () => {\n try {\n await verifyApiContract();\n const resumeAfter = workspaceInteractionSequencesRef.current.get(workspaceId) ?? 0;\n const stream = client.streamWorkspaceInteractionRevisions(workspaceId, {\n after: resumeAfter,\n signal: controller.signal,\n onStateChange: setWorkspaceInteractionConnectionState,\n });\n for await (const event of stream) {\n if (controller.signal.aborted) return;\n workspaceInteractionSequencesRef.current.set(\n workspaceId,\n Math.max(\n workspaceInteractionSequencesRef.current.get(workspaceId) ?? 0,\n event.sequence,\n ),\n );\n setWorkspaceInteractionEvent((current) =>\n !current || event.sequence > current.sequence ? event : current,\n );\n interactionCallbackRef.current?.(event);\n }\n } catch (error) {\n if (strictContract && error instanceof OpenGeniApiContractMismatchError) {\n setContractMismatch(error);\n reloadForContractMismatchOnce(error);\n }\n if (!controller.signal.aborted) setWorkspaceInteractionConnectionState(\"error\");\n }\n })();\n return () => controller.abort();\n }, [\n client,\n pageLive,\n strictContract,\n supportsWorkspaceLiveStream,\n verifyApiContract,\n workspaceId,\n ]);\n\n const value = useMemo(\n () => ({\n client,\n workspaceId,\n workspaceControlEvent,\n workspaceControlConnectionState,\n workspaceInteractionEvent,\n workspaceInteractionConnectionState,\n registerSessionReconciler,\n reconcileSession,\n }),\n [\n client,\n workspaceId,\n workspaceControlEvent,\n workspaceControlConnectionState,\n workspaceInteractionEvent,\n workspaceInteractionConnectionState,\n registerSessionReconciler,\n reconcileSession,\n ],\n );\n return (\n <ErrorMessageContext.Provider value={formatError}>\n <OpenGeniContext.Provider value={value}>\n {children}\n {contractMismatch ? <ApiContractMismatchScreen mismatch={contractMismatch} /> : null}\n </OpenGeniContext.Provider>\n </ErrorMessageContext.Provider>\n );\n}\n\nfunction withTimeout<T>(promise: Promise<T>, timeoutMs: number, label: string): Promise<T> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n return Promise.race([\n promise,\n new Promise<T>((_resolve, reject) => {\n timer = setTimeout(\n () => reject(new Error(`${label} timed out after ${timeoutMs}ms`)),\n timeoutMs,\n );\n }),\n ]).finally(() => {\n if (timer !== undefined) clearTimeout(timer);\n });\n}\n\nfunction ApiContractMismatchScreen({ mismatch }: { mismatch: OpenGeniApiContractMismatchError }) {\n return (\n <div\n className=\"og-root fixed inset-0 z-[2147483647] grid place-items-center bg-og-bg/95 p-6 backdrop-blur-sm\"\n role=\"alert\"\n aria-live=\"assertive\"\n data-opengeni-api-contract-mismatch\n >\n <div className=\"w-full max-w-md rounded-xl border border-og-border bg-og-surface p-6 shadow-2xl\">\n <p className=\"text-og-menu font-semibold text-og-fg\">Opengeni updated</p>\n <p className=\"mt-2 text-og-menu leading-6 text-og-muted\">\n This tab cannot safely continue with the new server version. Reload it before sending or\n controlling work.\n </p>\n <p className=\"mt-3 font-mono text-og-control text-og-subtle\">\n Client {mismatch.expected} · API {mismatch.actual}\n </p>\n <button\n type=\"button\"\n className=\"mt-5 inline-flex h-9 items-center rounded-md border border-og-primary-border bg-og-primary text-og-primary-fg hover:bg-og-primary-hover px-3 text-og-menu font-medium\"\n onClick={() => window.location.reload()}\n >\n Reload now\n </button>\n </div>\n </div>\n );\n}\n\nfunction reloadForContractMismatchOnce(mismatch: OpenGeniApiContractMismatchError): void {\n if (typeof window === \"undefined\" || typeof sessionStorage === \"undefined\") return;\n const key = `${CONTRACT_RELOAD_STORAGE_PREFIX}${mismatch.actual}`;\n if (sessionStorage.getItem(key) === OPENGENI_API_CONTRACT_REVISION) return;\n sessionStorage.setItem(key, OPENGENI_API_CONTRACT_REVISION);\n window.setTimeout(() => window.location.reload(), 150);\n}\n","import { useCallback, useLayoutEffect, useReducer, useRef, useSyncExternalStore } from \"react\";\nimport { normalizeError } from \"../lib/error-message\";\nimport { usePageLiveActivity } from \"./internal\";\n\n/**\n * A small client-scoped stale-while-revalidate store for read models that many\n * surfaces show (subscription accounts, their usage limits). Internal to\n * `@opengeni/react`: hosts reach it only through the hooks built on it and the\n * `OpenGeniProvider` `retainReadsAcrossMounts` opt-in.\n *\n * Scoping:\n *\n * - Every entry lives under the exact client object that read it (a WeakMap),\n * like `createDiscoveryCache`; the key names the exact read\n * (`[\"codex-accounts\", workspaceId, \"session\", sessionId]`).\n * - By default nothing outlives its readers: mounted readers of one key share\n * one request and one snapshot, and the entry is dropped as soon as the last\n * reader unmounts. A reader renders an entry's rows only once it has\n * registered on it (layout phase, then a re-render before paint), and only\n * the reader instance that let go may take an entry back (StrictMode, effect\n * re-runs); a different reader mounting in the same commit (a host\n * re-keying its tree for another person) never renders the previous rows,\n * starts from nothing, and the earlier read and writes are discarded. Only a scope a host retains\n * (`retainSharedQueries`, used by the provider opt-in) keeps unmounted\n * entries for `retainMs`, so a host that reuses one client for different\n * people never serves one person's rows to the next mount. Ending the last\n * retention clears the scope.\n * - `clearSharedQueries(scope)` drops every row at once. Mounted readers stay\n * subscribed and read again; writes from operations that started before the\n * clear are discarded.\n *\n * Semantics:\n *\n * - A mount with retained data renders it immediately and revalidates in the\n * background once it is older than `staleTimeMs`. An enabled reader reports\n * `loading` until its key's first read completes.\n * - Page visibility pauses only polling and background revalidation of rows\n * already on screen; invalidation and `refresh()` read on a hidden page too.\n * - A loader is bound to its key when the render that supplied it commits, so a\n * render that never commits (a transition) or a key change cannot run one\n * key's loader for another key's entry.\n * - Failures are never cached. An access refusal (401/403/404) also drops the\n * retained data; another failure keeps it beside the error.\n * - `invalidateSharedQueries` supersedes any read in flight (its result is\n * discarded), re-reads mounted entries and evicts unmounted ones, so a later\n * mount never shows rows a mutation has made wrong.\n */\n\nexport type SharedQueryKey = readonly (string | number | boolean | null)[];\n\nexport type SharedQuerySnapshot<T> = {\n data: T | null;\n /** True only while there is nothing to show yet (first read for this key). */\n loading: boolean;\n /** True while any read for this key is in flight, including background ones. */\n fetching: boolean;\n error: Error | null;\n /** Epoch milliseconds of the last successful read or write, or null. */\n updatedAt: number | null;\n};\n\nexport type SharedQueryOptions = {\n /** False: never read, and show no data (not even retained rows). */\n enabled?: boolean | undefined;\n /** Poll while mounted and the page is visible. Shortest interval wins. */\n pollIntervalMs?: number | undefined;\n /** Retained data younger than this is not re-read on mount. Default 10s. */\n staleTimeMs?: number | undefined;\n /** How long an unmounted entry is retained in a retained scope. Default 10 minutes. */\n retainMs?: number | undefined;\n};\n\nexport type SharedQueryResult<T> = SharedQuerySnapshot<T> & {\n /** Force a read now (joining one queued after any in-flight read). */\n refresh: () => Promise<void>;\n};\n\n/** Records data read some other way; false when the write was refused. */\nexport type SharedQueryWriter = <T>(parts: SharedQueryKey, data: T) => boolean;\n\nconst DEFAULT_STALE_TIME_MS = 10_000;\nconst DEFAULT_RETAIN_MS = 10 * 60_000;\n\ntype Loader<T> = (signal: AbortSignal) => Promise<T>;\ntype LoaderBinding = { key: string; load: Loader<unknown> };\n\ntype Subscriber = {\n /** The hook instance; only it may take back an entry it just let go of. */\n owner: object;\n /** The committed loader and the key it reads; null for subscribe-only readers. */\n binding: { current: LoaderBinding } | null;\n enabled: boolean;\n pageLive: boolean;\n pollIntervalMs: number | undefined;\n staleTimeMs: number;\n retainMs: number;\n};\n\ntype Entry = {\n key: string;\n parts: SharedQueryKey;\n snapshot: SharedQuerySnapshot<unknown>;\n /** The scope that holds this entry; its store listeners are notified per key. */\n home: Scope;\n subscribers: Set<Subscriber>;\n inFlight: Promise<void> | null;\n trailing: Promise<void> | null;\n abort: AbortController | null;\n generation: number;\n /** The retained data may be wrong; the next reconcile re-reads. */\n invalidated: boolean;\n timer: ReturnType<typeof setTimeout> | null;\n /** The interval `timer` was armed with. */\n timerInterval: number | null;\n retainTimer: ReturnType<typeof setTimeout> | null;\n /** The reader instance that last let go of this entry while it awaits release. */\n releasedBy: object | null;\n /** When this entry last started over for a new owner (see `resetSequence`). */\n resetMark: number;\n};\n\ntype Scope = {\n entries: Map<string, Entry>;\n /**\n * Store (useSyncExternalStore) listeners per key, not per entry: a reader\n * hidden by Suspense keeps its store subscription while it is unregistered,\n * and must still hear about the entry that replaces an evicted one.\n */\n listeners: Map<string, Set<() => void>>;\n /** Bumped by every clear; writers from an earlier epoch are refused. */\n epoch: number;\n /** Active retentions; unmounted entries are kept only while positive. */\n retainers: number;\n releaseTimer: ReturnType<typeof setTimeout> | null;\n};\n\nconst scopes = new WeakMap<object, Scope>();\n/**\n * Orders writers against entries that started over for a new owner: a writer\n * created before an entry's mark never writes to it.\n */\nlet resetSequence = 0;\n\nfunction idle<T>(loading: boolean): SharedQuerySnapshot<T> {\n return { data: null, loading, fetching: false, error: null, updatedAt: null };\n}\nconst IDLE_LOADING = idle<never>(true);\nconst IDLE = idle<never>(false);\n\nfunction serialize(parts: SharedQueryKey): string {\n return JSON.stringify(parts);\n}\n\n/** A refusal that repeating the read cannot fix; retained rows must go. */\nexport function isSharedQueryAccessRefusal(cause: unknown): boolean {\n if (!cause || typeof cause !== \"object\" || !(\"status\" in cause)) return false;\n const status = (cause as { status: unknown }).status;\n return status === 401 || status === 403 || status === 404;\n}\n\nfunction scopeState(scope: object): Scope {\n let state = scopes.get(scope);\n if (!state) {\n state = {\n entries: new Map(),\n listeners: new Map(),\n epoch: 0,\n retainers: 0,\n releaseTimer: null,\n };\n scopes.set(scope, state);\n }\n return state;\n}\n\nfunction notify(state: Scope, key: string): void {\n const listeners = state.listeners.get(key);\n if (!listeners) return;\n for (const listener of [...listeners]) listener();\n}\n\nfunction setSnapshot(entry: Entry, next: SharedQuerySnapshot<unknown>): void {\n entry.snapshot = next;\n notify(entry.home, entry.key);\n}\n\n/** A store listener for a client's key, whichever entry currently holds it. */\nfunction listen(scope: object, key: string, listener: () => void): () => void {\n const state = scopeState(scope);\n let listeners = state.listeners.get(key);\n if (!listeners) {\n listeners = new Set();\n state.listeners.set(key, listeners);\n }\n listeners.add(listener);\n return () => {\n const current = state.listeners.get(key);\n if (!current) return;\n current.delete(listener);\n if (current.size === 0) state.listeners.delete(key);\n };\n}\n\n/** Readers that may read: enabled and bound to this key (visible or not). */\nfunction readers(entry: Entry): Subscriber[] {\n return [...entry.subscribers].filter(\n (each) => each.enabled && each.binding?.current.key === entry.key,\n );\n}\n\n/**\n * Registered readers keep an entry. Store listeners don't: they belong to the\n * client and key (see `Scope.listeners`), React removes them in the passive\n * phase, and a reader hidden by Suspense keeps one while it is unregistered.\n */\nfunction mounted(entry: Entry): boolean {\n return entry.subscribers.size > 0;\n}\n\nfunction stopTimer(entry: Entry): void {\n if (entry.timer !== null) {\n clearTimeout(entry.timer);\n entry.timer = null;\n }\n entry.timerInterval = null;\n}\n\nfunction stopRetainTimer(entry: Entry): void {\n if (entry.retainTimer !== null) {\n clearTimeout(entry.retainTimer);\n entry.retainTimer = null;\n }\n}\n\n/** Any read in flight or queued is superseded: its result is never stored. */\nfunction supersedeReads(entry: Entry): void {\n entry.generation += 1;\n entry.abort?.abort();\n entry.abort = null;\n entry.inFlight = null;\n entry.trailing = null;\n}\n\nfunction evict(state: Scope, entry: Entry): void {\n supersedeReads(entry);\n stopTimer(entry);\n stopRetainTimer(entry);\n if (state.entries.get(entry.key) !== entry) return;\n state.entries.delete(entry.key);\n // Store subscriptions that outlive the entry (Suspense) now read nothing.\n notify(state, entry.key);\n}\n\n/** Poll at the shortest interval among readers on a visible page; keep a timer already armed for it. */\nfunction arm(entry: Entry): void {\n let interval: number | undefined;\n for (const each of readers(entry)) {\n if (!each.pageLive) continue;\n if (each.pollIntervalMs === undefined || each.pollIntervalMs <= 0) continue;\n interval =\n interval === undefined ? each.pollIntervalMs : Math.min(interval, each.pollIntervalMs);\n }\n if (entry.timer !== null && entry.timerInterval === interval) return;\n stopTimer(entry);\n if (interval === undefined) return;\n entry.timerInterval = interval;\n entry.timer = setTimeout(() => {\n entry.timer = null;\n entry.timerInterval = null;\n void run(entry).finally(() => arm(entry));\n }, interval);\n}\n\nasync function runFresh(entry: Entry): Promise<void> {\n const subscriber = readers(entry).at(-1);\n if (!subscriber?.binding) return;\n const { load } = subscriber.binding.current;\n const ticket = ++entry.generation;\n const abort = new AbortController();\n entry.abort = abort;\n entry.invalidated = false;\n if (!entry.snapshot.fetching) setSnapshot(entry, { ...entry.snapshot, fetching: true });\n try {\n const data = await load(abort.signal);\n if (ticket !== entry.generation) return;\n setSnapshot(entry, {\n data,\n loading: false,\n fetching: false,\n error: null,\n updatedAt: Date.now(),\n });\n } catch (cause) {\n if (ticket !== entry.generation) return;\n const refused = isSharedQueryAccessRefusal(cause);\n setSnapshot(entry, {\n data: refused ? null : entry.snapshot.data,\n loading: false,\n fetching: false,\n error: normalizeError(cause),\n // A failure is never a fresh read: the next mount re-reads.\n updatedAt: null,\n });\n } finally {\n if (entry.abort === abort) entry.abort = null;\n }\n}\n\nfunction run(entry: Entry, force = false): Promise<void> {\n if (entry.inFlight) {\n if (!force) return entry.inFlight;\n // A forced read issued during another read must observe whatever changed\n // since that read started, so queue exactly one successor read.\n if (entry.trailing) return entry.trailing;\n const predecessor = entry.inFlight;\n let trailing!: Promise<void>;\n trailing = predecessor.then(() => {\n // Superseded meanwhile: the read that replaced it is the newer one.\n if (entry.trailing !== trailing) return entry.inFlight ?? undefined;\n entry.trailing = null;\n if (readers(entry).length > 0) return run(entry);\n // Nobody can read now: what the predecessor stored is not known to be\n // current, so the next mount or resume re-reads.\n entry.invalidated = true;\n return undefined;\n });\n entry.trailing = trailing;\n return trailing;\n }\n let promise!: Promise<void>;\n promise = runFresh(entry).finally(() => {\n if (entry.inFlight === promise) entry.inFlight = null;\n });\n entry.inFlight = promise;\n return promise;\n}\n\nfunction isStale(entry: Entry, staleTimeMs: number): boolean {\n const updatedAt = entry.snapshot.updatedAt;\n return entry.invalidated || updatedAt === null || Date.now() - updatedAt >= staleTimeMs;\n}\n\nfunction reconcile(entry: Entry): void {\n const active = readers(entry);\n if (active.length === 0) {\n stopTimer(entry);\n if (entry.snapshot.loading) setSnapshot(entry, { ...entry.snapshot, loading: false });\n return;\n }\n const staleTimeMs = Math.min(...active.map((each) => each.staleTimeMs));\n // A hidden page still reads what it has nothing (or nothing right) to show;\n // it only defers revalidating rows already on screen.\n const due =\n active.some((each) => each.pageLive) || entry.invalidated || entry.snapshot.data === null;\n if (due && isStale(entry, staleTimeMs)) {\n // A mount or resume never inherits an earlier failure: it reads again and\n // shows a loading state (or retained rows) until that read settles.\n if (entry.snapshot.error || (entry.snapshot.data === null && !entry.snapshot.loading)) {\n setSnapshot(entry, {\n ...entry.snapshot,\n error: null,\n loading: entry.snapshot.data === null,\n });\n }\n void run(entry).finally(() => arm(entry));\n return;\n }\n // A reader joined or left: the shortest interval may have changed.\n arm(entry);\n}\n\nfunction scheduleRelease(state: Scope, entry: Entry, retainMs: number): void {\n stopRetainTimer(entry);\n // Even an unretained entry waits one task, so StrictMode's immediate\n // unmount/remount keeps sharing the read it already started.\n entry.retainTimer = setTimeout(() => {\n entry.retainTimer = null;\n if (!mounted(entry)) evict(state, entry);\n }, retainMs);\n}\n\nfunction getOrCreate(scope: object, key: string, loading: boolean): Entry {\n const state = scopeState(scope);\n const existing = state.entries.get(key);\n if (existing) {\n stopRetainTimer(existing);\n return existing;\n }\n const created: Entry = {\n key,\n parts: JSON.parse(key) as SharedQueryKey,\n snapshot: idle(loading),\n home: state,\n subscribers: new Set(),\n inFlight: null,\n trailing: null,\n abort: null,\n generation: 0,\n invalidated: false,\n timer: null,\n timerInterval: null,\n retainTimer: null,\n releasedBy: null,\n // Without retention a new entry may be someone else's: writers created\n // before it (by an earlier, now unmounted reader) never fill it.\n resetMark: state.retainers === 0 ? ++resetSequence : 0,\n };\n state.entries.set(key, created);\n return created;\n}\n\n/**\n * Register a reader instance. In an unretained scope an entry that another\n * instance let go of in this same commit is not adopted: its rows and any read\n * in flight belonged to that reader (possibly another person), so it starts\n * over and writes to it begun before now are refused. True when it was reset.\n */\nfunction registerSubscriber(scope: object, entry: Entry, subscriber: Subscriber): boolean {\n const state = scopeState(scope);\n const foreign =\n entry.subscribers.size === 0 &&\n entry.releasedBy !== null &&\n entry.releasedBy !== subscriber.owner &&\n state.retainers === 0;\n if (foreign) {\n supersedeReads(entry);\n stopTimer(entry);\n entry.invalidated = false;\n entry.resetMark = ++resetSequence;\n setSnapshot(entry, IDLE);\n }\n entry.releasedBy = null;\n entry.subscribers.add(subscriber);\n return foreign;\n}\n\nfunction unsubscribe(scope: object, entry: Entry, subscriber: Subscriber, retainMs: number): void {\n entry.subscribers.delete(subscriber);\n if (entry.subscribers.size > 0) {\n reconcile(entry);\n return;\n }\n entry.releasedBy = subscriber.owner;\n // Only the poll stops: in a retained scope a read in flight still lands\n // for the next mount. Otherwise the entry goes with its last reader.\n stopTimer(entry);\n if (entry.snapshot.loading) setSnapshot(entry, { ...entry.snapshot, loading: false });\n const state = scopes.get(scope);\n if (!state || state.entries.get(entry.key) !== entry) return;\n scheduleRelease(state, entry, state.retainers > 0 ? retainMs : 0);\n}\n\n/**\n * The entry a reader may render. Without host retention an entry's rows belong\n * to the readers registered on it: until this reader has registered (layout\n * phase) it renders a placeholder, so a reader replacing another in one\n * commit never renders, or hands its children, the previous rows.\n */\nfunction visibleEntry(scope: object, key: string, registered: Entry | null): Entry | null {\n const state = scopes.get(scope);\n const entry = state?.entries.get(key);\n if (!state || !entry) return null;\n if (state.retainers === 0 && registered !== entry) return null;\n return entry;\n}\n\n/** The retained snapshot for a key, without subscribing or reading. */\nexport function peekSharedQuery<T>(\n scope: object,\n parts: SharedQueryKey,\n): SharedQuerySnapshot<T> | null {\n return (\n (scopes.get(scope)?.entries.get(serialize(parts))?.snapshot as\n | SharedQuerySnapshot<T>\n | undefined) ?? null\n );\n}\n\n/**\n * A writer for data read some other way (for example a live provider refresh).\n * Create it BEFORE starting that read: a clear in between refuses every write,\n * and an entry that started over for a new owner meanwhile refuses writes to\n * it, so a retired identity's late result is never recorded. Mounted readers\n * render a write at once; with no reader, only a retained scope keeps it.\n */\nexport function sharedQueryWriter(scope: object): SharedQueryWriter {\n const state = scopeState(scope);\n const epoch = state.epoch;\n const since = resetSequence;\n return <T>(parts: SharedQueryKey, data: T): boolean => {\n if (state.epoch !== epoch) return false;\n const key = serialize(parts);\n const existing = state.entries.get(key);\n if (existing && existing.resetMark > since) return false;\n if (!(existing && mounted(existing)) && state.retainers === 0) return false;\n const entry = existing ?? getOrCreate(scope, key, false);\n // A read already in flight started before this write; its result is older.\n supersedeReads(entry);\n entry.invalidated = false;\n setSnapshot(entry, {\n data,\n loading: false,\n fetching: false,\n error: null,\n updatedAt: Date.now(),\n });\n if (!mounted(entry)) scheduleRelease(state, entry, DEFAULT_RETAIN_MS);\n return true;\n };\n}\n\n/**\n * Mark every entry whose key starts with `prefix` as wrong. Reads in flight are\n * superseded. Mounted entries re-read now (keeping their rows on screen\n * meanwhile); paused ones re-read when they resume; unmounted entries are\n * evicted so the next mount never renders them.\n */\nexport function invalidateSharedQueries(scope: object, prefix: SharedQueryKey): Promise<void> {\n const state = scopes.get(scope);\n if (!state) return Promise.resolve();\n const reads: Promise<void>[] = [];\n for (const entry of [...state.entries.values()]) {\n if (!prefix.every((part, index) => entry.parts[index] === part)) continue;\n if (!mounted(entry)) {\n evict(state, entry);\n continue;\n }\n supersedeReads(entry);\n entry.invalidated = true;\n // Readers keep their rows on screen while the re-read runs, also on a\n // hidden page (a sign-in finished in another tab must not blank Settings).\n if (readers(entry).length > 0) {\n reads.push(run(entry).finally(() => arm(entry)));\n continue;\n }\n // Only disabled or subscribe-only readers: drop the rows; an enabled\n // reader reads again when it appears.\n stopTimer(entry);\n setSnapshot(entry, IDLE);\n }\n return Promise.all(reads).then(() => undefined);\n}\n\n/**\n * Drop everything retained for a client. Unmounted entries go; mounted ones\n * are reset in place (their readers stay subscribed) and active ones read\n * again. Writes from operations that began before the clear are refused.\n */\nexport function clearSharedQueries(scope: object): void {\n const state = scopes.get(scope);\n if (!state) return;\n state.epoch += 1;\n for (const entry of [...state.entries.values()]) {\n if (!mounted(entry)) {\n evict(state, entry);\n continue;\n }\n supersedeReads(entry);\n stopTimer(entry);\n stopRetainTimer(entry);\n entry.invalidated = true;\n const active = readers(entry).length > 0;\n setSnapshot(entry, active ? IDLE_LOADING : IDLE);\n if (active) void run(entry).finally(() => arm(entry));\n }\n}\n\n/**\n * Keep unmounted entries for this client until the returned release is\n * called. Releasing the last retention clears the client's entries (after one\n * task, so StrictMode's immediate remount keeps them).\n */\nexport function retainSharedQueries(scope: object): () => void {\n const state = scopeState(scope);\n state.retainers += 1;\n if (state.releaseTimer !== null) {\n clearTimeout(state.releaseTimer);\n state.releaseTimer = null;\n }\n let released = false;\n return () => {\n if (released) return;\n released = true;\n state.retainers -= 1;\n if (state.retainers > 0) return;\n if (state.releaseTimer !== null) clearTimeout(state.releaseTimer);\n state.releaseTimer = setTimeout(() => {\n state.releaseTimer = null;\n if (state.retainers === 0) clearSharedQueries(scope);\n }, 0);\n };\n}\n\n/**\n * Subscribe to one shared read. `scope` is the client object that performs\n * the read; `parts` must name every input the loader depends on.\n */\nexport function useSharedQuery<T>(\n scope: object,\n parts: SharedQueryKey,\n load: Loader<T>,\n options: SharedQueryOptions = {},\n): SharedQueryResult<T> {\n const enabled = options.enabled ?? true;\n const pageLive = usePageLiveActivity();\n const key = serialize(parts);\n // The loader is bound to its key only when the render that supplied both\n // commits: a render React discards (a transition) never rebinds it, and a\n // subscriber whose binding names another key is ignored by every read, so\n // one key's loader never fills another key's entry.\n const binding = useRef<LoaderBinding>({ key, load: load as Loader<unknown> });\n useLayoutEffect(() => {\n binding.current = { key, load: load as Loader<unknown> };\n }, [key, load]);\n const staleTimeMs = options.staleTimeMs ?? DEFAULT_STALE_TIME_MS;\n const retainMs = options.retainMs ?? DEFAULT_RETAIN_MS;\n const pollIntervalMs = options.pollIntervalMs;\n\n const subscribe = useCallback(\n (listener: () => void) => listen(scope, key, listener),\n [scope, key],\n );\n // The entry this instance is registered on (set in the layout phase).\n const registered = useRef<Entry | null>(null);\n const getSnapshot = useCallback(\n () =>\n (visibleEntry(scope, key, registered.current)?.snapshot as\n | SharedQuerySnapshot<T>\n | undefined) ?? (enabled ? IDLE_LOADING : IDLE),\n [scope, key, enabled],\n );\n const snapshot = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n const owner = useRef<object>({});\n const [, rerender] = useReducer((count: number) => count + 1, 0);\n\n // Registered in the layout phase, after any reader this commit unmounts has\n // let go, so a foreign entry is reset before the browser paints.\n useLayoutEffect(() => {\n const entry = getOrCreate(scope, key, enabled);\n const subscriber: Subscriber = {\n owner: owner.current,\n binding,\n enabled,\n pageLive,\n pollIntervalMs,\n staleTimeMs,\n retainMs,\n };\n registerSubscriber(scope, entry, subscriber);\n registered.current = entry;\n reconcile(entry);\n // Rendered before registering (a placeholder) or before a reset: show\n // what is registered now, before the browser paints.\n if (getSnapshot() !== snapshot) rerender();\n return () => {\n if (registered.current === entry) registered.current = null;\n unsubscribe(scope, entry, subscriber, retainMs);\n };\n // `snapshot` is what this commit rendered; it never re-registers a reader.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [scope, key, enabled, pageLive, pollIntervalMs, staleTimeMs, retainMs]);\n\n const refresh = useCallback((): Promise<void> => {\n const entry = scopes.get(scope)?.entries.get(key);\n if (!entry || readers(entry).length === 0) return Promise.resolve();\n return run(entry, true).finally(() => arm(entry));\n }, [scope, key]);\n\n // A disabled reader shows nothing, not even rows retained by other readers.\n if (!enabled) return { ...IDLE, refresh };\n // Enabled with nothing read yet (also the first render after enabling).\n const unread = snapshot.data === null && snapshot.error === null && snapshot.updatedAt === null;\n return { ...snapshot, loading: snapshot.loading || unread, refresh };\n}\n\n/**\n * Subscribe to an entry that is only ever written (`sharedQueryWriter`), never\n * read: it renders whatever is recorded and keeps the entry while mounted.\n */\nexport function useSharedQueryValue<T>(\n scope: object,\n parts: SharedQueryKey,\n): SharedQuerySnapshot<T> {\n const key = serialize(parts);\n const subscribe = useCallback(\n (listener: () => void) => listen(scope, key, listener),\n [scope, key],\n );\n const registered = useRef<Entry | null>(null);\n const getSnapshot = useCallback(\n () =>\n (visibleEntry(scope, key, registered.current)?.snapshot as\n | SharedQuerySnapshot<T>\n | undefined) ?? IDLE,\n [scope, key],\n );\n const snapshot = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n const owner = useRef<object>({});\n const [, rerender] = useReducer((count: number) => count + 1, 0);\n useLayoutEffect(() => {\n const entry = getOrCreate(scope, key, false);\n const subscriber: Subscriber = {\n owner: owner.current,\n binding: null,\n enabled: false,\n pageLive: true,\n pollIntervalMs: undefined,\n staleTimeMs: DEFAULT_STALE_TIME_MS,\n retainMs: DEFAULT_RETAIN_MS,\n };\n registerSubscriber(scope, entry, subscriber);\n registered.current = entry;\n if (getSnapshot() !== snapshot) rerender();\n return () => {\n if (registered.current === entry) registered.current = null;\n unsubscribe(scope, entry, subscriber, DEFAULT_RETAIN_MS);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [scope, key]);\n return snapshot;\n}\n"],"mappings":"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","names":["useCallback","useRef","useRef","useCallback","reconcile"]}
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/components/queue-item-content.ts
|
|
4
|
+
var QUEUE_ITEM_CONTENT_UNAVAILABLE = "Content unavailable";
|
|
5
|
+
function queueItemContent(text, annotationCount) {
|
|
6
|
+
if (text.length > 0) return "text";
|
|
7
|
+
return annotationCount > 0 ? "annotations" : "unavailable";
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
// src/queue-presentation-model.ts
|
|
11
|
+
var QUEUE_ROW_PREVIEW_CHARACTERS = 360;
|
|
12
|
+
var QUEUE_COLLAPSED_PREVIEW_CHARACTERS = 180;
|
|
13
|
+
var QUEUE_PREVIEW_GRAPHEME_CONTEXT_CHARACTERS = 32;
|
|
14
|
+
var QUEUE_PREVIEW_REFERENCE_SAMPLE_CHARACTERS = 32;
|
|
15
|
+
var QUEUE_VISIBLE_END_IDENTITY_CHARACTERS = 18;
|
|
16
|
+
var QUEUE_PREVIEW_SEPARATOR = " \u2026 ";
|
|
17
|
+
var queuePreviewSegmenterCache;
|
|
18
|
+
function queuePreviewSegments(sample) {
|
|
19
|
+
if (queuePreviewSegmenterCache === void 0) {
|
|
20
|
+
queuePreviewSegmenterCache = typeof Intl !== "undefined" && typeof Intl.Segmenter === "function" ? new Intl.Segmenter(void 0, { granularity: "grapheme" }) : null;
|
|
21
|
+
}
|
|
22
|
+
if (!queuePreviewSegmenterCache) return Array.from(sample);
|
|
23
|
+
return Array.from(queuePreviewSegmenterCache.segment(sample), (part) => part.segment);
|
|
24
|
+
}
|
|
25
|
+
var queuePromptNonRenderingCodePoint = /[\p{White_Space}\p{Control}\p{Default_Ignorable_Code_Point}]/u;
|
|
26
|
+
function labelQueuePreview(summary) {
|
|
27
|
+
return {
|
|
28
|
+
summary,
|
|
29
|
+
collapsedVisual: summary,
|
|
30
|
+
visibleStart: summary,
|
|
31
|
+
visibleIdentity: null,
|
|
32
|
+
visibleIdentityLabel: null,
|
|
33
|
+
isFallback: false
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function queueTurnPreview(turn, maxCharacters) {
|
|
37
|
+
if (!turn) return queuePromptPreview("", maxCharacters);
|
|
38
|
+
return queueContentPreview(turn.prompt, turn.annotations?.length ?? 0, maxCharacters);
|
|
39
|
+
}
|
|
40
|
+
function queueContentPreview(prompt, annotationCount, maxCharacters) {
|
|
41
|
+
switch (queueItemContent(prompt, annotationCount)) {
|
|
42
|
+
case "text":
|
|
43
|
+
return queuePromptPreview(prompt, maxCharacters);
|
|
44
|
+
case "annotations":
|
|
45
|
+
return labelQueuePreview(
|
|
46
|
+
`${annotationCount} timeline ${annotationCount === 1 ? "annotation" : "annotations"}`
|
|
47
|
+
);
|
|
48
|
+
case "unavailable":
|
|
49
|
+
return labelQueuePreview(QUEUE_ITEM_CONTENT_UNAVAILABLE);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function queuePromptPreview(prompt, maxCharacters) {
|
|
53
|
+
const wholePromptProbe = samplePromptStart(prompt, maxCharacters + 1);
|
|
54
|
+
if (!wholePromptProbe.truncated && wholePromptProbe.characters <= maxCharacters) {
|
|
55
|
+
const summary2 = replaceLoneSurrogates(wholePromptProbe.value);
|
|
56
|
+
return hasVisiblePromptContent(summary2) ? {
|
|
57
|
+
summary: summary2,
|
|
58
|
+
collapsedVisual: summary2,
|
|
59
|
+
visibleStart: summary2,
|
|
60
|
+
visibleIdentity: null,
|
|
61
|
+
visibleIdentityLabel: null,
|
|
62
|
+
isFallback: false
|
|
63
|
+
} : fallbackPromptPreview(prompt.length, wholePromptProbe.value, wholePromptProbe.value);
|
|
64
|
+
}
|
|
65
|
+
const suffixCharacters = Math.min(Math.floor(maxCharacters / 3), 120);
|
|
66
|
+
const prefixCharacters = maxCharacters - codePointLength(QUEUE_PREVIEW_SEPARATOR) - suffixCharacters;
|
|
67
|
+
const prefixSample = samplePromptStart(
|
|
68
|
+
prompt,
|
|
69
|
+
prefixCharacters + QUEUE_PREVIEW_GRAPHEME_CONTEXT_CHARACTERS
|
|
70
|
+
);
|
|
71
|
+
const suffixSample = samplePromptEnd(
|
|
72
|
+
prompt,
|
|
73
|
+
suffixCharacters + QUEUE_PREVIEW_GRAPHEME_CONTEXT_CHARACTERS
|
|
74
|
+
);
|
|
75
|
+
const prefixSegments = segmentPromptSample(prefixSample.value);
|
|
76
|
+
const suffixSegments = segmentPromptSample(suffixSample.value);
|
|
77
|
+
if (prefixSample.truncated) prefixSegments.pop();
|
|
78
|
+
if (suffixSample.truncated) {
|
|
79
|
+
let ambiguousSegment = suffixSegments.shift();
|
|
80
|
+
while (ambiguousSegment?.endsWith("\u200D") && suffixSegments.length > 0) {
|
|
81
|
+
ambiguousSegment = suffixSegments.shift();
|
|
82
|
+
}
|
|
83
|
+
while (suffixSegments[0] && startsWithRegionalIndicator(suffixSegments[0])) {
|
|
84
|
+
suffixSegments.shift();
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const prefix = takeWholeGraphemesFromStart(prefixSegments, prefixCharacters);
|
|
88
|
+
const suffix = takeWholeGraphemesFromEnd(suffixSegments, suffixCharacters);
|
|
89
|
+
const reference = boundedPromptSampleReference(
|
|
90
|
+
prompt.length,
|
|
91
|
+
prefixSample.value,
|
|
92
|
+
suffixSample.value
|
|
93
|
+
);
|
|
94
|
+
if (!hasVisiblePromptContent(prefix) && !hasVisiblePromptContent(suffix)) {
|
|
95
|
+
return fallbackPromptPreview(prompt.length, prefixSample.value, suffixSample.value);
|
|
96
|
+
}
|
|
97
|
+
const safeSuffix = hasVisiblePromptContent(suffix) ? suffix : promptPreviewFallbackLabel(reference);
|
|
98
|
+
const summary = `${prefix}${QUEUE_PREVIEW_SEPARATOR}${safeSuffix}`;
|
|
99
|
+
if (!hasVisiblePromptContent(prefix)) {
|
|
100
|
+
return {
|
|
101
|
+
summary,
|
|
102
|
+
collapsedVisual: summary,
|
|
103
|
+
visibleStart: safeSuffix,
|
|
104
|
+
visibleIdentity: null,
|
|
105
|
+
visibleIdentityLabel: null,
|
|
106
|
+
isFallback: false
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
const endIdentity = takeWholeGraphemesFromEnd(
|
|
110
|
+
suffixSegments,
|
|
111
|
+
QUEUE_VISIBLE_END_IDENTITY_CHARACTERS
|
|
112
|
+
);
|
|
113
|
+
return {
|
|
114
|
+
summary,
|
|
115
|
+
collapsedVisual: summary,
|
|
116
|
+
visibleStart: prefix,
|
|
117
|
+
visibleIdentity: hasVisiblePromptContent(endIdentity) ? endIdentity : `ref ${reference}`,
|
|
118
|
+
visibleIdentityLabel: hasVisiblePromptContent(endIdentity) ? "End" : "Safe boundary",
|
|
119
|
+
isFallback: false
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
function fallbackPromptPreview(promptLength, startSample, endSample) {
|
|
123
|
+
const reference = boundedPromptSampleReference(promptLength, startSample, endSample);
|
|
124
|
+
const summary = promptPreviewFallbackLabel(reference);
|
|
125
|
+
return {
|
|
126
|
+
summary,
|
|
127
|
+
collapsedVisual: `Omitted \xB7 ${reference}`,
|
|
128
|
+
// The complete fallback remains the canonical accessible summary. Narrow
|
|
129
|
+
// collapsed/row layouts paint the bounded reference in a compact truthful
|
|
130
|
+
// form so ellipsis cannot hide the only identifying portion.
|
|
131
|
+
visibleStart: `Omitted \xB7 ${reference}`,
|
|
132
|
+
visibleIdentity: null,
|
|
133
|
+
visibleIdentityLabel: null,
|
|
134
|
+
isFallback: true
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
function promptPreviewFallbackLabel(reference) {
|
|
138
|
+
return `Content omitted at safe boundary \xB7 ref ${reference}`;
|
|
139
|
+
}
|
|
140
|
+
function boundedPromptSampleReference(promptLength, startSample, endSample) {
|
|
141
|
+
const head = samplePromptStart(startSample, QUEUE_PREVIEW_REFERENCE_SAMPLE_CHARACTERS).value;
|
|
142
|
+
const tail = samplePromptEnd(endSample, QUEUE_PREVIEW_REFERENCE_SAMPLE_CHARACTERS).value;
|
|
143
|
+
let hash = 2166136261;
|
|
144
|
+
for (const value of [String(promptLength), head, tail]) {
|
|
145
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
146
|
+
hash ^= value.charCodeAt(index);
|
|
147
|
+
hash = Math.imul(hash, 16777619);
|
|
148
|
+
}
|
|
149
|
+
hash ^= 65535;
|
|
150
|
+
hash = Math.imul(hash, 16777619);
|
|
151
|
+
}
|
|
152
|
+
return (hash >>> 0).toString(16).padStart(8, "0").toUpperCase();
|
|
153
|
+
}
|
|
154
|
+
function hasVisiblePromptContent(value) {
|
|
155
|
+
for (const character of value) {
|
|
156
|
+
if (!queuePromptNonRenderingCodePoint.test(character)) return true;
|
|
157
|
+
}
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
function samplePromptStart(prompt, maxCharacters) {
|
|
161
|
+
let end = 0;
|
|
162
|
+
let characters = 0;
|
|
163
|
+
while (end < prompt.length && characters < maxCharacters) {
|
|
164
|
+
const first = prompt.charCodeAt(end);
|
|
165
|
+
end += isHighSurrogate(first) && end + 1 < prompt.length && isLowSurrogate(prompt.charCodeAt(end + 1)) ? 2 : 1;
|
|
166
|
+
characters += 1;
|
|
167
|
+
}
|
|
168
|
+
return { value: prompt.slice(0, end), characters, truncated: end < prompt.length };
|
|
169
|
+
}
|
|
170
|
+
function samplePromptEnd(prompt, maxCharacters) {
|
|
171
|
+
let start = prompt.length;
|
|
172
|
+
let characters = 0;
|
|
173
|
+
while (start > 0 && characters < maxCharacters) {
|
|
174
|
+
start -= 1;
|
|
175
|
+
if (isLowSurrogate(prompt.charCodeAt(start)) && start > 0 && isHighSurrogate(prompt.charCodeAt(start - 1))) {
|
|
176
|
+
start -= 1;
|
|
177
|
+
}
|
|
178
|
+
characters += 1;
|
|
179
|
+
}
|
|
180
|
+
return { value: prompt.slice(start), characters, truncated: start > 0 };
|
|
181
|
+
}
|
|
182
|
+
function segmentPromptSample(sample) {
|
|
183
|
+
return queuePreviewSegments(replaceLoneSurrogates(sample));
|
|
184
|
+
}
|
|
185
|
+
function replaceLoneSurrogates(value) {
|
|
186
|
+
let sanitized = "";
|
|
187
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
188
|
+
const current = value.charCodeAt(index);
|
|
189
|
+
if (isHighSurrogate(current) && index + 1 < value.length && isLowSurrogate(value.charCodeAt(index + 1))) {
|
|
190
|
+
sanitized += value.slice(index, index + 2);
|
|
191
|
+
index += 1;
|
|
192
|
+
} else if (isHighSurrogate(current) || isLowSurrogate(current)) {
|
|
193
|
+
sanitized += "\uFFFD";
|
|
194
|
+
} else {
|
|
195
|
+
sanitized += value[index];
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return sanitized;
|
|
199
|
+
}
|
|
200
|
+
function takeWholeGraphemesFromStart(segments, maxCharacters) {
|
|
201
|
+
const selected = [];
|
|
202
|
+
let characters = 0;
|
|
203
|
+
for (const segment of segments) {
|
|
204
|
+
const segmentCharacters = codePointLength(segment);
|
|
205
|
+
if (characters + segmentCharacters > maxCharacters) break;
|
|
206
|
+
selected.push(segment);
|
|
207
|
+
characters += segmentCharacters;
|
|
208
|
+
}
|
|
209
|
+
while (selected.at(-1)?.trim().length === 0) selected.pop();
|
|
210
|
+
return selected.join("");
|
|
211
|
+
}
|
|
212
|
+
function takeWholeGraphemesFromEnd(segments, maxCharacters) {
|
|
213
|
+
const selected = [];
|
|
214
|
+
let characters = 0;
|
|
215
|
+
for (let index = segments.length - 1; index >= 0; index -= 1) {
|
|
216
|
+
const segment = segments[index];
|
|
217
|
+
if (!segment) continue;
|
|
218
|
+
const segmentCharacters = codePointLength(segment);
|
|
219
|
+
if (characters + segmentCharacters > maxCharacters) break;
|
|
220
|
+
selected.unshift(segment);
|
|
221
|
+
characters += segmentCharacters;
|
|
222
|
+
}
|
|
223
|
+
while (selected[0]?.trim().length === 0) selected.shift();
|
|
224
|
+
while (selected.at(-1)?.trim().length === 0) selected.pop();
|
|
225
|
+
return selected.join("");
|
|
226
|
+
}
|
|
227
|
+
function codePointLength(value) {
|
|
228
|
+
let characters = 0;
|
|
229
|
+
for (const _character of value) characters += 1;
|
|
230
|
+
return characters;
|
|
231
|
+
}
|
|
232
|
+
function startsWithRegionalIndicator(value) {
|
|
233
|
+
const codePoint = value.codePointAt(0);
|
|
234
|
+
return codePoint !== void 0 && codePoint >= 127462 && codePoint <= 127487;
|
|
235
|
+
}
|
|
236
|
+
function isHighSurrogate(codeUnit) {
|
|
237
|
+
return codeUnit >= 55296 && codeUnit <= 56319;
|
|
238
|
+
}
|
|
239
|
+
function isLowSurrogate(codeUnit) {
|
|
240
|
+
return codeUnit >= 56320 && codeUnit <= 57343;
|
|
241
|
+
}
|
|
242
|
+
function moveQueueItem(items, from, to) {
|
|
243
|
+
const next = items.slice();
|
|
244
|
+
const [item] = next.splice(from, 1);
|
|
245
|
+
if (item === void 0) return next;
|
|
246
|
+
next.splice(to < 0 ? next.length + to : to, 0, item);
|
|
247
|
+
return next;
|
|
248
|
+
}
|
|
249
|
+
function queueMovePlan(queue, turnId, nextIndex) {
|
|
250
|
+
const oldIndex = queue.findIndex((turn) => turn.id === turnId);
|
|
251
|
+
if (oldIndex < 0) return null;
|
|
252
|
+
const index = Math.max(0, Math.min(nextIndex, queue.length - 1));
|
|
253
|
+
if (oldIndex === index) return null;
|
|
254
|
+
const ordered = moveQueueItem(queue, oldIndex, index);
|
|
255
|
+
return {
|
|
256
|
+
turnIds: ordered.map((turn) => turn.id),
|
|
257
|
+
beforeTurnId: ordered[index + 1]?.id ?? null,
|
|
258
|
+
index
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
function projectPendingQueueMove(queue, pendingMove, snapshot) {
|
|
262
|
+
if (!pendingMove || pendingMove.baseVersion === null || snapshot?.version !== pendingMove.baseVersion) {
|
|
263
|
+
return queue;
|
|
264
|
+
}
|
|
265
|
+
const byId = new Map(queue.map((turn) => [turn.id, turn]));
|
|
266
|
+
const projected = pendingMove.turnIds.map((turnId) => byId.get(turnId));
|
|
267
|
+
if (projected.some((turn) => !turn) || projected.length !== queue.length) {
|
|
268
|
+
return queue;
|
|
269
|
+
}
|
|
270
|
+
return projected;
|
|
271
|
+
}
|
|
272
|
+
var QUEUE_REPLACE_DRAFT_COPY = {
|
|
273
|
+
title: "Your composer already has a draft. Replace it with this queued prompt?",
|
|
274
|
+
detail: "The current draft will be permanently discarded; this queued prompt is preserved until you confirm.",
|
|
275
|
+
keep: "Keep current draft",
|
|
276
|
+
replace: "Replace and edit"
|
|
277
|
+
};
|
|
278
|
+
function objectValue(value) {
|
|
279
|
+
return value !== null && typeof value === "object" && !Array.isArray(value) ? value : null;
|
|
280
|
+
}
|
|
281
|
+
function queuedTurnPresentation(turn) {
|
|
282
|
+
const realtimeDelegation = objectValue(turn.metadata.realtimeDelegation);
|
|
283
|
+
const inputTranscript = realtimeDelegation?.inputTranscript;
|
|
284
|
+
if (typeof inputTranscript === "string" && inputTranscript.trim()) {
|
|
285
|
+
return { kind: "realtime_voice", text: inputTranscript.trim() };
|
|
286
|
+
}
|
|
287
|
+
if (objectValue(turn.metadata.realtimeTailFlush)) {
|
|
288
|
+
return { kind: "realtime_voice_handoff", text: "Remaining voice context" };
|
|
289
|
+
}
|
|
290
|
+
return { kind: "prompt", text: turn.prompt };
|
|
291
|
+
}
|
|
292
|
+
function isSteeringTurn(turn) {
|
|
293
|
+
return turn.metadata.delivery === "steer";
|
|
294
|
+
}
|
|
295
|
+
function isAuthoritativeQueuedTurn(turn, mutationFor) {
|
|
296
|
+
return !isSteeringTurn(turn) && mutationFor(turn.id) !== "steer";
|
|
297
|
+
}
|
|
298
|
+
function countAuthoritativeQueuedTurns(turns, mutationFor) {
|
|
299
|
+
return turns.filter((turn) => isAuthoritativeQueuedTurn(turn, mutationFor)).length;
|
|
300
|
+
}
|
|
301
|
+
function queueNeighborAnchors(turns, index) {
|
|
302
|
+
return {
|
|
303
|
+
beforeUp: index > 0 ? turns[index - 1]?.id ?? null : null,
|
|
304
|
+
beforeDown: index < turns.length - 1 ? turns[index + 2]?.id ?? null : null
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
export {
|
|
309
|
+
QUEUE_ITEM_CONTENT_UNAVAILABLE,
|
|
310
|
+
queueItemContent,
|
|
311
|
+
QUEUE_ROW_PREVIEW_CHARACTERS,
|
|
312
|
+
QUEUE_COLLAPSED_PREVIEW_CHARACTERS,
|
|
313
|
+
queueTurnPreview,
|
|
314
|
+
queueContentPreview,
|
|
315
|
+
queuePromptPreview,
|
|
316
|
+
moveQueueItem,
|
|
317
|
+
queueMovePlan,
|
|
318
|
+
projectPendingQueueMove,
|
|
319
|
+
QUEUE_REPLACE_DRAFT_COPY,
|
|
320
|
+
queuedTurnPresentation,
|
|
321
|
+
isSteeringTurn,
|
|
322
|
+
isAuthoritativeQueuedTurn,
|
|
323
|
+
countAuthoritativeQueuedTurns,
|
|
324
|
+
queueNeighborAnchors
|
|
325
|
+
};
|
|
326
|
+
//# sourceMappingURL=chunk-RI42H5IU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/queue-item-content.ts","../src/queue-presentation-model.ts"],"sourcesContent":["/**\n * One presentation rule for a queued item, shared by the full queue and the\n * compact session-chrome dock so the two cannot drift. A turn with an empty\n * prompt and timeline annotations is valid content; an item with neither is a\n * malformed or legacy object that gets an explicit fallback, never a blank row.\n */\nexport type QueueItemContent = \"text\" | \"annotations\" | \"unavailable\";\n\nexport const QUEUE_ITEM_CONTENT_UNAVAILABLE = \"Content unavailable\";\n\nexport function queueItemContent(text: string, annotationCount: number): QueueItemContent {\n if (text.length > 0) return \"text\";\n return annotationCount > 0 ? \"annotations\" : \"unavailable\";\n}\n","/**\n * Queue presentation shared by the web queue surface and native docks: the\n * bounded head/tail previews of queued prompts, and the reorder plan and its\n * optimistic projection. No DOM, no React.\n */\nimport type { SessionQueueSnapshot, SessionTurn } from \"@opengeni/sdk\";\nimport { QUEUE_ITEM_CONTENT_UNAVAILABLE, queueItemContent } from \"./components/queue-item-content\";\n\nexport { QUEUE_ITEM_CONTENT_UNAVAILABLE, queueItemContent };\n\nexport const QUEUE_ROW_PREVIEW_CHARACTERS = 360;\nexport const QUEUE_COLLAPSED_PREVIEW_CHARACTERS = 180;\nconst QUEUE_PREVIEW_GRAPHEME_CONTEXT_CHARACTERS = 32;\nconst QUEUE_PREVIEW_REFERENCE_SAMPLE_CHARACTERS = 32;\nconst QUEUE_VISIBLE_END_IDENTITY_CHARACTERS = 18;\nconst QUEUE_PREVIEW_SEPARATOR = \" … \";\n// Hermes (React Native) has no Intl.Segmenter; there, previews fall back to\n// code points, which keeps every boundary rule except grapheme joining.\nlet queuePreviewSegmenterCache: Intl.Segmenter | null | undefined;\nfunction queuePreviewSegments(sample: string): string[] {\n if (queuePreviewSegmenterCache === undefined) {\n queuePreviewSegmenterCache =\n typeof Intl !== \"undefined\" && typeof Intl.Segmenter === \"function\"\n ? new Intl.Segmenter(undefined, { granularity: \"grapheme\" })\n : null;\n }\n if (!queuePreviewSegmenterCache) return Array.from(sample);\n return Array.from(queuePreviewSegmenterCache.segment(sample), (part) => part.segment);\n}\nconst queuePromptNonRenderingCodePoint =\n /[\\p{White_Space}\\p{Control}\\p{Default_Ignorable_Code_Point}]/u;\n\ntype BoundedPromptSample = {\n value: string;\n characters: number;\n truncated: boolean;\n};\n\nexport type QueuePromptPreview = {\n summary: string;\n collapsedVisual: string;\n visibleStart: string;\n visibleIdentity: string | null;\n visibleIdentityLabel: \"End\" | \"Safe boundary\" | null;\n isFallback: boolean;\n};\n\nfunction labelQueuePreview(summary: string): QueuePromptPreview {\n return {\n summary,\n collapsedVisual: summary,\n visibleStart: summary,\n visibleIdentity: null,\n visibleIdentityLabel: null,\n isFallback: false,\n };\n}\n\nexport function queueTurnPreview(\n turn: SessionTurn | undefined,\n maxCharacters: number,\n): QueuePromptPreview {\n if (!turn) return queuePromptPreview(\"\", maxCharacters);\n return queueContentPreview(turn.prompt, turn.annotations?.length ?? 0, maxCharacters);\n}\n\nexport function queueContentPreview(\n prompt: string,\n annotationCount: number,\n maxCharacters: number,\n): QueuePromptPreview {\n switch (queueItemContent(prompt, annotationCount)) {\n case \"text\":\n return queuePromptPreview(prompt, maxCharacters);\n case \"annotations\":\n return labelQueuePreview(\n `${annotationCount} timeline ${annotationCount === 1 ? \"annotation\" : \"annotations\"}`,\n );\n case \"unavailable\":\n return labelQueuePreview(QUEUE_ITEM_CONTENT_UNAVAILABLE);\n }\n}\n\n/**\n * Build a bounded head/tail summary of an arbitrary queued prompt. Sampling\n * both ends distinguishes prompts with equal long prefixes. Each sampled edge\n * has a small amount of grapheme context so ordinary emoji/combining sequences\n * can be retained whole. A cluster that exceeds that context is omitted rather\n * than fragmented, and malformed UTF-16 is replaced only in the summary. The\n * durable prompt remains exact and no operation scans or copies it in full.\n */\nexport function queuePromptPreview(prompt: string, maxCharacters: number): QueuePromptPreview {\n const wholePromptProbe = samplePromptStart(prompt, maxCharacters + 1);\n if (!wholePromptProbe.truncated && wholePromptProbe.characters <= maxCharacters) {\n const summary = replaceLoneSurrogates(wholePromptProbe.value);\n return hasVisiblePromptContent(summary)\n ? {\n summary,\n collapsedVisual: summary,\n visibleStart: summary,\n visibleIdentity: null,\n visibleIdentityLabel: null,\n isFallback: false,\n }\n : fallbackPromptPreview(prompt.length, wholePromptProbe.value, wholePromptProbe.value);\n }\n\n const suffixCharacters = Math.min(Math.floor(maxCharacters / 3), 120);\n const prefixCharacters =\n maxCharacters - codePointLength(QUEUE_PREVIEW_SEPARATOR) - suffixCharacters;\n const prefixSample = samplePromptStart(\n prompt,\n prefixCharacters + QUEUE_PREVIEW_GRAPHEME_CONTEXT_CHARACTERS,\n );\n const suffixSample = samplePromptEnd(\n prompt,\n suffixCharacters + QUEUE_PREVIEW_GRAPHEME_CONTEXT_CHARACTERS,\n );\n const prefixSegments = segmentPromptSample(prefixSample.value);\n const suffixSegments = segmentPromptSample(suffixSample.value);\n\n // A cluster at a truncated sampling edge may continue outside the sample.\n // Prefix sampling starts at the true source start, so only its last segment\n // is ambiguous. Suffix sampling ends at the true source end, so its first is.\n if (prefixSample.truncated) prefixSegments.pop();\n if (suffixSample.truncated) {\n let ambiguousSegment = suffixSegments.shift();\n // A locally segmented leading fragment ending in ZWJ can join the next\n // pictographic segment when omitted left context supplies its base. Keep\n // backing off until that uncertainty no longer propagates to the right.\n while (ambiguousSegment?.endsWith(\"\\u200d\") && suffixSegments.length > 0) {\n ambiguousSegment = suffixSegments.shift();\n }\n // Regional Indicator pairing depends on the parity of the preceding run.\n // If that run reaches the unknown sample boundary, omit all of its visible\n // leading segments rather than potentially recombining halves of flags.\n while (suffixSegments[0] && startsWithRegionalIndicator(suffixSegments[0])) {\n suffixSegments.shift();\n }\n }\n\n const prefix = takeWholeGraphemesFromStart(prefixSegments, prefixCharacters);\n const suffix = takeWholeGraphemesFromEnd(suffixSegments, suffixCharacters);\n const reference = boundedPromptSampleReference(\n prompt.length,\n prefixSample.value,\n suffixSample.value,\n );\n\n if (!hasVisiblePromptContent(prefix) && !hasVisiblePromptContent(suffix)) {\n return fallbackPromptPreview(prompt.length, prefixSample.value, suffixSample.value);\n }\n\n const safeSuffix = hasVisiblePromptContent(suffix)\n ? suffix\n : promptPreviewFallbackLabel(reference);\n const summary = `${prefix}${QUEUE_PREVIEW_SEPARATOR}${safeSuffix}`;\n if (!hasVisiblePromptContent(prefix)) {\n return {\n summary,\n collapsedVisual: summary,\n visibleStart: safeSuffix,\n visibleIdentity: null,\n visibleIdentityLabel: null,\n isFallback: false,\n };\n }\n\n const endIdentity = takeWholeGraphemesFromEnd(\n suffixSegments,\n QUEUE_VISIBLE_END_IDENTITY_CHARACTERS,\n );\n return {\n summary,\n collapsedVisual: summary,\n visibleStart: prefix,\n visibleIdentity: hasVisiblePromptContent(endIdentity) ? endIdentity : `ref ${reference}`,\n visibleIdentityLabel: hasVisiblePromptContent(endIdentity) ? \"End\" : \"Safe boundary\",\n isFallback: false,\n };\n}\n\nfunction fallbackPromptPreview(\n promptLength: number,\n startSample: string,\n endSample: string,\n): QueuePromptPreview {\n const reference = boundedPromptSampleReference(promptLength, startSample, endSample);\n const summary = promptPreviewFallbackLabel(reference);\n return {\n summary,\n collapsedVisual: `Omitted · ${reference}`,\n // The complete fallback remains the canonical accessible summary. Narrow\n // collapsed/row layouts paint the bounded reference in a compact truthful\n // form so ellipsis cannot hide the only identifying portion.\n visibleStart: `Omitted · ${reference}`,\n visibleIdentity: null,\n visibleIdentityLabel: null,\n isFallback: true,\n };\n}\n\nfunction promptPreviewFallbackLabel(reference: string): string {\n return `Content omitted at safe boundary · ref ${reference}`;\n}\n\nfunction boundedPromptSampleReference(\n promptLength: number,\n startSample: string,\n endSample: string,\n): string {\n const head = samplePromptStart(startSample, QUEUE_PREVIEW_REFERENCE_SAMPLE_CHARACTERS).value;\n const tail = samplePromptEnd(endSample, QUEUE_PREVIEW_REFERENCE_SAMPLE_CHARACTERS).value;\n let hash = 0x811c9dc5;\n for (const value of [String(promptLength), head, tail]) {\n for (let index = 0; index < value.length; index += 1) {\n hash ^= value.charCodeAt(index);\n hash = Math.imul(hash, 0x01000193);\n }\n hash ^= 0xffff;\n hash = Math.imul(hash, 0x01000193);\n }\n return (hash >>> 0).toString(16).padStart(8, \"0\").toUpperCase();\n}\n\nfunction hasVisiblePromptContent(value: string): boolean {\n // Callers pass only the already-bounded whole/head/tail preview samples.\n // Default-ignorables and controls can survive trim() while painting no row\n // identity at all (for example ZWJ, VS16, bidi controls, and tag characters).\n for (const character of value) {\n if (!queuePromptNonRenderingCodePoint.test(character)) return true;\n }\n return false;\n}\n\nfunction samplePromptStart(prompt: string, maxCharacters: number): BoundedPromptSample {\n let end = 0;\n let characters = 0;\n while (end < prompt.length && characters < maxCharacters) {\n const first = prompt.charCodeAt(end);\n end +=\n isHighSurrogate(first) &&\n end + 1 < prompt.length &&\n isLowSurrogate(prompt.charCodeAt(end + 1))\n ? 2\n : 1;\n characters += 1;\n }\n return { value: prompt.slice(0, end), characters, truncated: end < prompt.length };\n}\n\nfunction samplePromptEnd(prompt: string, maxCharacters: number): BoundedPromptSample {\n let start = prompt.length;\n let characters = 0;\n while (start > 0 && characters < maxCharacters) {\n start -= 1;\n if (\n isLowSurrogate(prompt.charCodeAt(start)) &&\n start > 0 &&\n isHighSurrogate(prompt.charCodeAt(start - 1))\n ) {\n start -= 1;\n }\n characters += 1;\n }\n return { value: prompt.slice(start), characters, truncated: start > 0 };\n}\n\nfunction segmentPromptSample(sample: string): string[] {\n return queuePreviewSegments(replaceLoneSurrogates(sample));\n}\n\nfunction replaceLoneSurrogates(value: string): string {\n let sanitized = \"\";\n for (let index = 0; index < value.length; index += 1) {\n const current = value.charCodeAt(index);\n if (\n isHighSurrogate(current) &&\n index + 1 < value.length &&\n isLowSurrogate(value.charCodeAt(index + 1))\n ) {\n sanitized += value.slice(index, index + 2);\n index += 1;\n } else if (isHighSurrogate(current) || isLowSurrogate(current)) {\n sanitized += \"�\";\n } else {\n sanitized += value[index];\n }\n }\n return sanitized;\n}\n\nfunction takeWholeGraphemesFromStart(segments: string[], maxCharacters: number): string {\n const selected: string[] = [];\n let characters = 0;\n for (const segment of segments) {\n const segmentCharacters = codePointLength(segment);\n if (characters + segmentCharacters > maxCharacters) break;\n selected.push(segment);\n characters += segmentCharacters;\n }\n while (selected.at(-1)?.trim().length === 0) selected.pop();\n return selected.join(\"\");\n}\n\nfunction takeWholeGraphemesFromEnd(segments: string[], maxCharacters: number): string {\n const selected: string[] = [];\n let characters = 0;\n for (let index = segments.length - 1; index >= 0; index -= 1) {\n const segment = segments[index];\n if (!segment) continue;\n const segmentCharacters = codePointLength(segment);\n if (characters + segmentCharacters > maxCharacters) break;\n selected.unshift(segment);\n characters += segmentCharacters;\n }\n while (selected[0]?.trim().length === 0) selected.shift();\n while (selected.at(-1)?.trim().length === 0) selected.pop();\n return selected.join(\"\");\n}\n\nfunction codePointLength(value: string): number {\n let characters = 0;\n for (const _character of value) characters += 1;\n return characters;\n}\n\nfunction startsWithRegionalIndicator(value: string): boolean {\n const codePoint = value.codePointAt(0);\n return codePoint !== undefined && codePoint >= 0x1f1e6 && codePoint <= 0x1f1ff;\n}\n\nfunction isHighSurrogate(codeUnit: number): boolean {\n return codeUnit >= 0xd800 && codeUnit <= 0xdbff;\n}\n\nfunction isLowSurrogate(codeUnit: number): boolean {\n return codeUnit >= 0xdc00 && codeUnit <= 0xdfff;\n}\n\n/** Move one item, as dnd-kit's arrayMove does. */\nexport function moveQueueItem<T>(items: readonly T[], from: number, to: number): T[] {\n const next = items.slice();\n const [item] = next.splice(from, 1);\n if (item === undefined) return next;\n next.splice(to < 0 ? next.length + to : to, 0, item);\n return next;\n}\n\nexport type QueueMovePlan = {\n /** The turn ids in their new order. */\n turnIds: string[];\n /** The server anchor: the turn the moved one now precedes, null for last. */\n beforeTurnId: string | null;\n /** The bounded destination index. */\n index: number;\n};\n\n/** The reorder request for moving a queued turn to an index, or null for a no-op. */\nexport function queueMovePlan(\n queue: readonly SessionTurn[],\n turnId: string,\n nextIndex: number,\n): QueueMovePlan | null {\n const oldIndex = queue.findIndex((turn) => turn.id === turnId);\n if (oldIndex < 0) return null;\n const index = Math.max(0, Math.min(nextIndex, queue.length - 1));\n if (oldIndex === index) return null;\n const ordered = moveQueueItem(queue, oldIndex, index);\n return {\n turnIds: ordered.map((turn) => turn.id),\n beforeTurnId: ordered[index + 1]?.id ?? null,\n index,\n };\n}\n\nexport type PendingQueueMove = { baseVersion: number | null; turnIds: string[] };\n\n/**\n * The queue as shown while a move is in flight: the optimistic order, unless\n * any authoritative change arrived. A projection never omits or invents a row.\n */\nexport function projectPendingQueueMove(\n queue: SessionTurn[],\n pendingMove: PendingQueueMove | null,\n snapshot: Pick<SessionQueueSnapshot, \"version\"> | null,\n): SessionTurn[] {\n if (\n !pendingMove ||\n pendingMove.baseVersion === null ||\n snapshot?.version !== pendingMove.baseVersion\n ) {\n return queue;\n }\n const byId = new Map(queue.map((turn) => [turn.id, turn]));\n const projected = pendingMove.turnIds.map((turnId) => byId.get(turnId));\n if (projected.some((turn) => !turn) || projected.length !== queue.length) {\n return queue;\n }\n return projected as SessionTurn[];\n}\n\n/** Copy for the \"replace your draft with this queued prompt\" confirmation. */\nexport const QUEUE_REPLACE_DRAFT_COPY = {\n title: \"Your composer already has a draft. Replace it with this queued prompt?\",\n detail:\n \"The current draft will be permanently discarded; this queued prompt is preserved until you confirm.\",\n keep: \"Keep current draft\",\n replace: \"Replace and edit\",\n} as const;\n\nexport type QueuedTurnPresentation = {\n kind: \"prompt\" | \"realtime_voice\" | \"realtime_voice_handoff\";\n text: string;\n};\n\nfunction objectValue(value: unknown): Record<string, unknown> | null {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\n/** What a queued row shows: the prompt, or the transcript of a voice request. */\nexport function queuedTurnPresentation(turn: SessionTurn): QueuedTurnPresentation {\n const realtimeDelegation = objectValue(turn.metadata.realtimeDelegation);\n const inputTranscript = realtimeDelegation?.inputTranscript;\n if (typeof inputTranscript === \"string\" && inputTranscript.trim()) {\n return { kind: \"realtime_voice\", text: inputTranscript.trim() };\n }\n if (objectValue(turn.metadata.realtimeTailFlush)) {\n return { kind: \"realtime_voice_handoff\", text: \"Remaining voice context\" };\n }\n return { kind: \"prompt\", text: turn.prompt };\n}\n\nexport function isSteeringTurn(turn: SessionTurn): boolean {\n return turn.metadata.delivery === \"steer\";\n}\n\n/** A queued turn that is really waiting: not already a steer in flight. */\nexport function isAuthoritativeQueuedTurn(\n turn: SessionTurn,\n mutationFor: (turnId: string) => string | null,\n): boolean {\n return !isSteeringTurn(turn) && mutationFor(turn.id) !== \"steer\";\n}\n\nexport function countAuthoritativeQueuedTurns(\n turns: readonly SessionTurn[],\n mutationFor: (turnId: string) => string | null,\n): number {\n return turns.filter((turn) => isAuthoritativeQueuedTurn(turn, mutationFor)).length;\n}\n\n/** The move anchors for one row's Move up / Move down. */\nexport function queueNeighborAnchors(\n turns: readonly SessionTurn[],\n index: number,\n): { beforeUp: string | null; beforeDown: string | null } {\n return {\n beforeUp: index > 0 ? (turns[index - 1]?.id ?? null) : null,\n beforeDown: index < turns.length - 1 ? (turns[index + 2]?.id ?? null) : null,\n };\n}\n"],"mappings":"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","names":["summary"]}
|