@opengeni/react 1.0.1 → 1.0.2-canary.37202341988001
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 +660 -21
- package/dist/accounts.d.ts +64 -0
- package/dist/accounts.js +822 -0
- package/dist/accounts.js.map +1 -0
- package/dist/approvals.d.ts +2 -1
- package/dist/artifacts-document.js +3 -2
- package/dist/artifacts-presentation.js +3 -2
- package/dist/artifacts-spreadsheet.js +2 -2
- package/dist/artifacts.d.ts +4 -1
- package/dist/artifacts.js +518 -42
- package/dist/artifacts.js.map +1 -1
- package/dist/browser-viewer-SHYKQRNX.js +16 -0
- package/dist/capability-catalog-row.d.ts +20 -0
- package/dist/capability-logo-fallback.d.ts +3 -0
- package/dist/chat-interactive-block-UGBTNB3L.js +11 -0
- package/dist/chat-interactive-block-UGBTNB3L.js.map +1 -0
- package/dist/chunk-26ZNDDLZ.js +453 -0
- package/dist/chunk-26ZNDDLZ.js.map +1 -0
- package/dist/chunk-3CTRFMAK.js +359 -0
- package/dist/chunk-3CTRFMAK.js.map +1 -0
- package/dist/chunk-447JLCBU.js +209 -0
- package/dist/chunk-447JLCBU.js.map +1 -0
- package/dist/chunk-4RVYOY4O.js +379 -0
- package/dist/chunk-4RVYOY4O.js.map +1 -0
- package/dist/chunk-5CVXZA3Y.js +292 -0
- package/dist/chunk-5CVXZA3Y.js.map +1 -0
- package/dist/chunk-5J4FOW6Q.js +108 -0
- package/dist/chunk-5J4FOW6Q.js.map +1 -0
- package/dist/chunk-742CZ3L3.js +481 -0
- package/dist/chunk-742CZ3L3.js.map +1 -0
- package/dist/chunk-A2PI6UMY.js +41 -0
- package/dist/chunk-A2PI6UMY.js.map +1 -0
- package/dist/{chunk-7WCLAEFV.js → chunk-A4UJB2MM.js} +37 -27
- package/dist/chunk-A4UJB2MM.js.map +1 -0
- package/dist/chunk-B3V6TG77.js +41 -0
- package/dist/chunk-B3V6TG77.js.map +1 -0
- package/dist/chunk-BRM6FVZA.js +302 -0
- package/dist/chunk-BRM6FVZA.js.map +1 -0
- package/dist/chunk-C5X5AJXK.js +182 -0
- package/dist/chunk-C5X5AJXK.js.map +1 -0
- package/dist/{chunk-6KLX2RH5.js → chunk-DO544OSV.js} +1075 -79
- package/dist/chunk-DO544OSV.js.map +1 -0
- package/dist/{chunk-R3AZOAB5.js → chunk-DYWBUX5Q.js} +29 -123
- package/dist/chunk-DYWBUX5Q.js.map +1 -0
- package/dist/{chunk-HA46CYQK.js → chunk-EESD3PY3.js} +792 -537
- package/dist/chunk-EESD3PY3.js.map +1 -0
- package/dist/{chunk-5UQPNLIO.js → chunk-EN3YTHKR.js} +4117 -3896
- package/dist/chunk-EN3YTHKR.js.map +1 -0
- package/dist/chunk-ERGYJIBB.js +21 -0
- package/dist/chunk-ERGYJIBB.js.map +1 -0
- package/dist/chunk-FZCP527Y.js +116 -0
- package/dist/chunk-FZCP527Y.js.map +1 -0
- package/dist/chunk-GIMRELBW.js +14 -0
- package/dist/chunk-GIMRELBW.js.map +1 -0
- package/dist/chunk-GYVRFZDY.js +2733 -0
- package/dist/chunk-GYVRFZDY.js.map +1 -0
- package/dist/{chunk-LLOLUHVG.js → chunk-HDJWDK7W.js} +1358 -2746
- package/dist/chunk-HDJWDK7W.js.map +1 -0
- package/dist/chunk-I7IWRQLN.js +1608 -0
- package/dist/chunk-I7IWRQLN.js.map +1 -0
- package/dist/chunk-IT4BJUGF.js +13055 -0
- package/dist/chunk-IT4BJUGF.js.map +1 -0
- package/dist/chunk-IWIDV7SB.js +1 -0
- package/dist/chunk-IWIDV7SB.js.map +1 -0
- package/dist/chunk-J2QWVSQY.js +312 -0
- package/dist/chunk-J2QWVSQY.js.map +1 -0
- package/dist/chunk-J6DBS4T3.js +371 -0
- package/dist/chunk-J6DBS4T3.js.map +1 -0
- package/dist/{chunk-B6WPZSTT.js → chunk-JIQYUGVL.js} +1331 -1163
- package/dist/chunk-JIQYUGVL.js.map +1 -0
- package/dist/chunk-JT4JW7BC.js +54 -0
- package/dist/chunk-JT4JW7BC.js.map +1 -0
- package/dist/chunk-K3HQAKQX.js +24 -0
- package/dist/chunk-K3HQAKQX.js.map +1 -0
- package/dist/{chunk-PEI6RANI.js → chunk-PNY3JKBJ.js} +309 -74
- package/dist/chunk-PNY3JKBJ.js.map +1 -0
- package/dist/chunk-RHREZ7BO.js +11 -0
- package/dist/chunk-RHREZ7BO.js.map +1 -0
- package/dist/chunk-RLUSC2WA.js +299 -0
- package/dist/chunk-RLUSC2WA.js.map +1 -0
- package/dist/{chunk-IGC6A2ZI.js → chunk-RSI7XYXL.js} +777 -246
- package/dist/chunk-RSI7XYXL.js.map +1 -0
- package/dist/chunk-SCOTPE2I.js +589 -0
- package/dist/chunk-SCOTPE2I.js.map +1 -0
- package/dist/{chunk-C5ZPSSS5.js → chunk-TKOTKRWY.js} +5 -4
- package/dist/{chunk-C5ZPSSS5.js.map → chunk-TKOTKRWY.js.map} +1 -1
- package/dist/chunk-TMYGL6X5.js +742 -0
- package/dist/chunk-TMYGL6X5.js.map +1 -0
- package/dist/chunk-UGLEYEMP.js +33 -0
- package/dist/chunk-UGLEYEMP.js.map +1 -0
- package/dist/chunk-UK4TINKT.js +27 -0
- package/dist/chunk-UK4TINKT.js.map +1 -0
- package/dist/chunk-UTRTG6LH.js +220 -0
- package/dist/chunk-UTRTG6LH.js.map +1 -0
- package/dist/chunk-WEHMPOXK.js +39 -0
- package/dist/chunk-WEHMPOXK.js.map +1 -0
- package/dist/chunk-WGXVEJO5.js +319 -0
- package/dist/chunk-WGXVEJO5.js.map +1 -0
- package/dist/chunk-WRHIZYZF.js +988 -0
- package/dist/chunk-WRHIZYZF.js.map +1 -0
- package/dist/{chunk-HUIKIDM5.js → chunk-WUISZ3WU.js} +223 -115
- package/dist/chunk-WUISZ3WU.js.map +1 -0
- package/dist/chunk-XCHWDJ22.js +107 -0
- package/dist/chunk-XCHWDJ22.js.map +1 -0
- package/dist/{chunk-KCGXPP5V.js → chunk-Y2PRMYLC.js} +11 -6
- package/dist/chunk-Y2PRMYLC.js.map +1 -0
- package/dist/chunk-YBXQDQFX.js +1772 -0
- package/dist/chunk-YBXQDQFX.js.map +1 -0
- package/dist/chunk-YM2DE7BQ.js +3124 -0
- package/dist/chunk-YM2DE7BQ.js.map +1 -0
- package/dist/{chunk-KZ73RL76.js → chunk-YQEAA6LT.js} +7 -3
- package/dist/chunk-YQEAA6LT.js.map +1 -0
- package/dist/chunk-YV4L3ILF.js +9 -0
- package/dist/chunk-YV4L3ILF.js.map +1 -0
- package/dist/chunk-ZYRGEKWS.js +216 -0
- package/dist/chunk-ZYRGEKWS.js.map +1 -0
- package/dist/client.d.ts +7 -4
- package/dist/clipboard.js +1 -0
- package/dist/commands/types.d.ts +2 -0
- package/dist/components/anthropic-mark.d.ts +3 -0
- package/dist/components/approval-surface.d.ts +15 -0
- package/dist/components/artifacts/artifact-chrome.d.ts +120 -0
- package/dist/components/artifacts/artifact-sandbox.d.ts +27 -0
- package/dist/components/artifacts/artifact-surface.d.ts +3 -1
- 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 +46 -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 +2 -1
- package/dist/components/artifacts/index.d.ts +8 -1
- 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 +48 -3
- package/dist/components/artifacts/session-artifact-viewer.d.ts +39 -0
- package/dist/components/artifacts/site-view.d.ts +23 -0
- package/dist/components/artifacts/spreadsheet-general-display.d.ts +24 -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 +10 -1
- package/dist/components/chat-composer.d.ts +21 -3
- package/dist/components/child-session-link.d.ts +5 -0
- package/dist/components/claude-mark.d.ts +3 -0
- package/dist/components/code-editor.d.ts +1 -4
- package/dist/components/composer.d.ts +45 -4
- package/dist/components/computer-viewer.d.ts +4 -1
- package/dist/components/copy-button.d.ts +3 -1
- package/dist/components/desktop-viewer.d.ts +1 -1
- package/dist/components/enrollment-consent.d.ts +6 -3
- package/dist/components/file-browser.d.ts +10 -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 +21 -2
- package/dist/components/human-input-surface.d.ts +6 -3
- package/dist/components/machine-card.d.ts +4 -1
- package/dist/components/machines/machine-detail.d.ts +4 -1
- package/dist/components/machines/machine-operation-policy.d.ts +11 -0
- package/dist/components/machines-dashboard.d.ts +3 -1
- package/dist/components/markdown-table-layout.d.ts +12 -0
- package/dist/components/markdown.d.ts +47 -3
- package/dist/components/message-timeline.d.ts +72 -9
- 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 +62 -13
- package/dist/components/open-geni-chat.d.ts +58 -0
- package/dist/components/open-geni-links.d.ts +68 -0
- package/dist/components/openrouter-mark.d.ts +6 -0
- package/dist/components/pierre-file.d.ts +1 -1
- package/dist/components/preview-loading.d.ts +2 -0
- package/dist/components/queue-item-content.d.ts +9 -0
- package/dist/components/sandbox-files.d.ts +13 -2
- package/dist/components/sandbox-workspace.d.ts +43 -3
- package/dist/components/session-capability-frame.d.ts +35 -0
- package/dist/components/session-chrome.d.ts +66 -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 +89 -0
- package/dist/components/session-list.d.ts +36 -0
- package/dist/components/session-mcp-capability-card.d.ts +41 -0
- package/dist/components/session-proxy-scope.d.ts +21 -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/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/components/workspace-dock.d.ts +6 -2
- package/dist/composer.d.ts +5 -4
- package/dist/composer.js +15 -9
- package/dist/computer-viewer-6SRGWRUX.js +19 -0
- package/dist/computer-viewer-6SRGWRUX.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 +16 -0
- package/dist/connect.d.ts +21 -0
- package/dist/connect.js +2129 -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 +26 -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 +14 -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 +21 -0
- package/dist/editor.js.map +1 -0
- package/dist/embedded-session-client.d.ts +23 -0
- package/dist/file-node-visibility.d.ts +15 -0
- package/dist/{fleet-decision-row-GGCAT4E4.js → fleet-decision-row-YZ3ZKWMM.js} +2 -1
- package/dist/fleet-decision-row-YZ3ZKWMM.js.map +1 -0
- package/dist/hooks/channel-cache.d.ts +23 -0
- package/dist/hooks/latest-question.d.ts +25 -0
- package/dist/hooks/shared-machines-list.d.ts +14 -0
- package/dist/hooks/use-attached-browsers.d.ts +2 -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-channels.d.ts +1 -0
- package/dist/hooks/use-codex-accounts.d.ts +25 -7
- package/dist/hooks/use-composer.d.ts +45 -9
- 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 +2 -0
- package/dist/hooks/use-connect.d.ts +22 -0
- package/dist/hooks/use-desktop-stream.d.ts +1 -1
- package/dist/hooks/use-file-attachments.d.ts +21 -2
- package/dist/hooks/use-machine-chip.d.ts +3 -3
- package/dist/hooks/use-machines.d.ts +19 -1
- package/dist/hooks/use-sandbox-files.d.ts +5 -1
- package/dist/hooks/use-session-background-commands.d.ts +14 -0
- package/dist/hooks/use-session-events.d.ts +30 -8
- package/dist/hooks/use-session-lineage.d.ts +4 -0
- package/dist/hooks/use-session-mcp-approval-policy.d.ts +2 -2
- package/dist/hooks/use-session.d.ts +6 -0
- package/dist/hooks/use-turn-queue.d.ts +12 -0
- package/dist/hooks/use-usage.d.ts +40 -0
- package/dist/hooks/use-workspace-edit.d.ts +4 -0
- package/dist/hooks/use-workspace-sessions.d.ts +27 -5
- package/dist/human-input.d.ts +3 -1
- package/dist/identity-link-accounts.d.ts +11 -0
- package/dist/identity-link-consent.d.ts +18 -0
- package/dist/index.d.ts +60 -17
- package/dist/index.js +2238 -6201
- package/dist/index.js.map +1 -1
- package/dist/interaction.d.ts +1 -1
- package/dist/interaction.js +35 -184
- package/dist/interaction.js.map +1 -1
- package/dist/latest-question-HTRIS4KJ.js +117 -0
- package/dist/latest-question-HTRIS4KJ.js.map +1 -0
- package/dist/lib/error-message.d.ts +7 -0
- package/dist/lib/format.d.ts +36 -2
- package/dist/lib/host-theme.d.ts +70 -0
- package/dist/lib/interaction-errors.d.ts +6 -0
- package/dist/lib/menu-styles.d.ts +22 -0
- package/dist/lib/pierre-diffs-loader.d.ts +20 -0
- package/dist/lib/workbench-peers.d.ts +36 -0
- package/dist/lib/xterm-theme.d.ts +7 -5
- package/dist/machines.d.ts +4 -2
- package/dist/machines.js +14 -4
- package/dist/markdown-table-layout-QXSLK4BY.js +106 -0
- package/dist/markdown-table-layout-QXSLK4BY.js.map +1 -0
- package/dist/mcp-connection-status.d.ts +14 -0
- package/dist/model-policy-picker-menu-M54ISBMN.js +14 -0
- package/dist/model-policy-picker-menu-M54ISBMN.js.map +1 -0
- package/dist/model-policy.d.ts +19 -3
- package/dist/model-policy.js +9 -1
- package/dist/older-history.d.ts +30 -0
- package/dist/platform-activity-row-627BFZ46.js +182 -0
- package/dist/platform-activity-row-627BFZ46.js.map +1 -0
- package/dist/plugin-details.d.ts +14 -0
- package/dist/plugin-discovery.d.ts +25 -0
- package/dist/provider.d.ts +13 -1
- package/dist/{queue-surface-implementation-2KVJTYXH.js → queue-surface-implementation-ZHFI5JBP.js} +131 -44
- package/dist/queue-surface-implementation-ZHFI5JBP.js.map +1 -0
- package/dist/realtime/realtime-control.d.ts +6 -3
- package/dist/realtime.js +133 -74
- package/dist/realtime.js.map +1 -1
- package/dist/sandbox-files-GORZOUUJ.js +20 -0
- package/dist/sandbox-files-GORZOUUJ.js.map +1 -0
- package/dist/session-auth-recommendation.d.ts +5 -0
- package/dist/session-capability-policy.d.ts +12 -0
- package/dist/session-ui.d.ts +30 -2
- package/dist/session-ui.js +85 -7
- package/dist/session-ui.js.map +1 -1
- package/dist/session.d.ts +8 -2
- package/dist/session.js +30 -19
- package/dist/sites-ui.d.ts +34 -0
- package/dist/sites.d.ts +3 -0
- package/dist/sites.js +11 -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 +31 -0
- package/dist/terminal.js.map +1 -0
- package/dist/timeline/activity-rail.d.ts +11 -2
- package/dist/timeline/allowance-exhausted-row.d.ts +24 -0
- package/dist/timeline/compaction-copy.d.ts +10 -0
- package/dist/timeline/entrance.d.ts +13 -1
- package/dist/timeline/genie-loading.d.ts +34 -0
- package/dist/timeline/index.d.ts +6 -2
- package/dist/timeline/knowledge-receipt.d.ts +17 -0
- package/dist/timeline/platform-activity-row.d.ts +14 -0
- package/dist/timeline/presented-image.d.ts +6 -0
- package/dist/timeline/projection.d.ts +31 -2
- package/dist/timeline/registry.d.ts +2 -0
- package/dist/timeline/retained-image.d.ts +18 -0
- package/dist/timeline/rolling-activity.d.ts +11 -0
- package/dist/timeline/screenshot-lightbox.d.ts +16 -1
- package/dist/timeline/shared.d.ts +8 -3
- 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 +2 -1
- package/dist/timeline/turn-summary.d.ts +34 -3
- package/dist/timeline/types.d.ts +147 -7
- package/dist/timeline-annotation-markers-GNDHTGBD.js +165 -0
- package/dist/timeline-annotation-markers-GNDHTGBD.js.map +1 -0
- package/dist/timeline-annotation-selection-DMLMM2TX.js +241 -0
- package/dist/timeline-annotation-selection-DMLMM2TX.js.map +1 -0
- package/dist/timeline-annotations-dialog-ELRDBHTS.js +273 -0
- package/dist/timeline-annotations-dialog-ELRDBHTS.js.map +1 -0
- package/dist/types/machines.d.ts +2 -2
- package/dist/usage/allowance-copy.d.ts +25 -0
- package/dist/usage/summary.d.ts +35 -0
- package/dist/usage.d.ts +13 -0
- package/dist/usage.js +1074 -0
- package/dist/usage.js.map +1 -0
- package/package.json +44 -4
- package/src/accounts.tsx +1072 -0
- package/src/approvals.ts +8 -1
- package/src/artifacts.ts +42 -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 +22 -13
- 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 +171 -37
- package/src/components/artifacts/artifact-chrome.tsx +413 -0
- package/src/components/artifacts/artifact-sandbox.tsx +185 -0
- package/src/components/artifacts/artifact-surface.tsx +39 -19
- 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 +187 -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 +5 -2
- package/src/components/artifacts/index.ts +44 -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 +338 -5
- package/src/components/artifacts/session-artifact-viewer.tsx +376 -0
- package/src/components/artifacts/site-view.tsx +116 -0
- package/src/components/artifacts/spreadsheet-canvas.ts +5 -10
- package/src/components/artifacts/spreadsheet-general-display.ts +43 -0
- package/src/components/artifacts/spreadsheet-grid.tsx +12 -13
- 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 +1054 -314
- package/src/components/chat-composer.tsx +131 -85
- package/src/components/child-session-link.tsx +27 -0
- package/src/components/claude-mark.tsx +10 -0
- package/src/components/code-editor.tsx +13 -16
- package/src/components/composer-transcription-control.tsx +7 -5
- package/src/components/composer.tsx +376 -49
- package/src/components/computer-viewer.tsx +1041 -329
- package/src/components/copy-button.tsx +13 -5
- package/src/components/desktop-viewer.tsx +1 -1
- package/src/components/enrollment-consent.tsx +65 -7
- package/src/components/enrollment-device-flow.tsx +1 -1
- package/src/components/file-browser.tsx +158 -34
- package/src/components/fleet-tile.tsx +8 -16
- package/src/components/generated-video-player.tsx +4 -2
- package/src/components/grok-mark.tsx +33 -0
- package/src/components/human-input-form.tsx +455 -114
- package/src/components/human-input-surface.tsx +18 -7
- package/src/components/interaction-intervention-banner.tsx +2 -2
- package/src/components/machine-card.tsx +119 -4
- package/src/components/machine-dock-bar.tsx +1 -1
- package/src/components/machine-input-display.ts +23 -2
- package/src/components/machines/machine-detail.tsx +52 -2
- package/src/components/machines/machine-operation-policy.tsx +179 -0
- package/src/components/machines-dashboard.tsx +8 -17
- package/src/components/markdown-table-layout.ts +132 -0
- package/src/components/markdown.tsx +473 -44
- package/src/components/message-timeline.tsx +2754 -665
- package/src/components/model-mark.tsx +90 -0
- package/src/components/model-picker.tsx +15 -4
- package/src/components/model-policy-picker-menu.tsx +424 -0
- package/src/components/model-policy-picker.tsx +337 -381
- package/src/components/open-geni-chat.tsx +338 -0
- package/src/components/open-geni-links.tsx +179 -0
- package/src/components/openrouter-mark.tsx +13 -0
- package/src/components/pierre-diff.tsx +41 -16
- package/src/components/pierre-file.tsx +36 -11
- package/src/components/preview-loading.tsx +154 -0
- package/src/components/queue-item-content.ts +14 -0
- package/src/components/queue-surface-implementation.tsx +132 -42
- package/src/components/queue-surface-state.tsx +3 -1
- package/src/components/sandbox-files.tsx +267 -35
- package/src/components/sandbox-terminal.tsx +48 -11
- package/src/components/sandbox-workspace.tsx +337 -135
- package/src/components/session-capability-frame.tsx +192 -0
- package/src/components/session-chrome.tsx +1027 -328
- 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 +526 -0
- package/src/components/session-list.tsx +250 -0
- package/src/components/session-mcp-capability-card.tsx +680 -0
- package/src/components/session-proxy-scope.tsx +92 -0
- package/src/components/session-status.tsx +1 -1
- 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 +70 -7
- 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 +194 -49
- package/src/components/workspace-dock.tsx +141 -175
- 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 +307 -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 +235 -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/embedded-session-client.ts +104 -0
- package/src/file-node-visibility.ts +66 -0
- package/src/hooks/channel-cache.ts +104 -0
- package/src/hooks/internal.ts +3 -2
- package/src/hooks/latest-question.ts +164 -0
- package/src/hooks/shared-machines-list.ts +239 -0
- package/src/hooks/use-attached-browsers.ts +5 -1
- package/src/hooks/use-available-models.ts +20 -14
- package/src/hooks/use-browser-frame-stream.ts +25 -3
- package/src/hooks/use-browser-session.ts +271 -71
- package/src/hooks/use-browser-sessions.ts +7 -1
- package/src/hooks/use-channels.ts +32 -10
- package/src/hooks/use-codex-accounts.ts +78 -21
- package/src/hooks/use-composer.ts +1034 -320
- package/src/hooks/use-computer-frame-stream.ts +39 -16
- package/src/hooks/use-computer-input-posture.ts +94 -0
- package/src/hooks/use-computer-session.ts +110 -32
- package/src/hooks/use-computer-sessions.ts +8 -1
- package/src/hooks/use-connect.ts +23 -0
- package/src/hooks/use-desktop-stream.ts +19 -28
- package/src/hooks/use-file-attachments.ts +118 -10
- package/src/hooks/use-goal.ts +36 -9
- package/src/hooks/use-human-input.ts +31 -4
- package/src/hooks/use-last-started-turn-policy.ts +15 -13
- package/src/hooks/use-machine-chip.ts +23 -6
- package/src/hooks/use-machines.ts +104 -6
- package/src/hooks/use-sandbox-files.ts +253 -150
- package/src/hooks/use-sandbox-git.ts +58 -29
- package/src/hooks/use-session-background-commands.ts +67 -0
- package/src/hooks/use-session-capabilities.ts +21 -2
- package/src/hooks/use-session-events.ts +759 -433
- package/src/hooks/use-session-lineage.ts +28 -6
- package/src/hooks/use-session-mcp-approval-policy.ts +13 -5
- package/src/hooks/use-session.ts +75 -16
- package/src/hooks/use-slash-commands.ts +6 -11
- package/src/hooks/use-turn-queue.ts +113 -13
- package/src/hooks/use-usage.ts +100 -0
- package/src/hooks/use-video-artifact-playback.ts +1 -1
- package/src/hooks/use-voice-input.ts +12 -1
- 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 +99 -11
- package/src/human-input.ts +12 -1
- package/src/identity-link-accounts.tsx +148 -0
- package/src/identity-link-consent.tsx +192 -0
- package/src/index.ts +157 -12
- package/src/interaction.ts +1 -0
- package/src/lib/error-message.ts +37 -0
- package/src/lib/format.ts +150 -14
- package/src/lib/host-theme.ts +511 -0
- package/src/lib/interaction-errors.ts +33 -0
- package/src/lib/menu-styles.ts +44 -0
- package/src/lib/pierre-diffs-loader.ts +53 -0
- package/src/lib/workbench-peers.ts +62 -0
- package/src/lib/xterm-theme.ts +23 -21
- package/src/machines.ts +9 -1
- package/src/mcp-connection-status.ts +35 -0
- package/src/model-policy.ts +223 -69
- package/src/older-history.ts +87 -0
- package/src/plugin-details.tsx +185 -0
- package/src/plugin-discovery.tsx +196 -0
- package/src/provider.tsx +55 -14
- package/src/realtime/dropdown-menu.tsx +19 -12
- package/src/realtime/realtime-control.tsx +133 -46
- package/src/session-auth-recommendation.ts +48 -0
- package/src/session-capability-policy.ts +83 -0
- package/src/session-context.ts +4 -3
- package/src/session-ui.ts +66 -2
- package/src/session.ts +18 -1
- package/src/sites-ui.tsx +402 -0
- package/src/sites.ts +3 -0
- package/src/skill-discovery.tsx +208 -0
- package/src/terminal.ts +26 -0
- package/src/timeline/activity-rail.tsx +171 -80
- package/src/timeline/allowance-exhausted-row.tsx +86 -0
- package/src/timeline/compaction-copy.ts +42 -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/genie-loading.tsx +136 -0
- package/src/timeline/index.ts +11 -0
- package/src/timeline/knowledge-receipt.tsx +100 -0
- package/src/timeline/parsers.ts +2 -2
- package/src/timeline/platform-activity-row.tsx +216 -0
- package/src/timeline/presented-image.ts +49 -0
- package/src/timeline/projection.ts +1609 -84
- package/src/timeline/registry.ts +15 -3
- package/src/timeline/retained-image.ts +97 -0
- package/src/timeline/rolling-activity.tsx +92 -0
- package/src/timeline/screenshot-lightbox.tsx +115 -17
- package/src/timeline/shared.tsx +47 -15
- package/src/timeline/startup-preference.ts +33 -0
- package/src/timeline/startup-timings.tsx +145 -0
- package/src/timeline/tool-display-name.ts +8 -6
- package/src/timeline/tool-renderers.tsx +497 -128
- package/src/timeline/turn-summary.tsx +218 -44
- package/src/timeline/types.ts +192 -7
- package/src/types/machines.ts +10 -0
- package/src/usage/allowance-copy.ts +64 -0
- package/src/usage/summary.ts +93 -0
- package/src/usage.ts +50 -0
- package/styles/compiled.css +2098 -757
- package/styles/connect.css +284 -0
- package/styles/connect.d.ts +1 -0
- package/styles/effective-tokens.css +1 -0
- package/styles/index.css +201 -9
- package/styles/responsive.css +27 -1
- package/styles/session-capability.css +44 -0
- package/styles/tokens.css +135 -65
- package/dist/chunk-5UQPNLIO.js.map +0 -1
- package/dist/chunk-6KLX2RH5.js.map +0 -1
- package/dist/chunk-7WCLAEFV.js.map +0 -1
- package/dist/chunk-B6WPZSTT.js.map +0 -1
- package/dist/chunk-FK6VG4LL.js +0 -90
- package/dist/chunk-FK6VG4LL.js.map +0 -1
- package/dist/chunk-HA46CYQK.js.map +0 -1
- package/dist/chunk-HUIKIDM5.js.map +0 -1
- package/dist/chunk-IGC6A2ZI.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-LLOLUHVG.js.map +0 -1
- package/dist/chunk-MKPIAGVL.js +0 -465
- package/dist/chunk-MKPIAGVL.js.map +0 -1
- package/dist/chunk-PEI6RANI.js.map +0 -1
- package/dist/chunk-R3AZOAB5.js.map +0 -1
- package/dist/chunk-WSK7G5LE.js +0 -170
- package/dist/chunk-WSK7G5LE.js.map +0 -1
- package/dist/chunk-XBZWOM2K.js +0 -218
- package/dist/chunk-XBZWOM2K.js.map +0 -1
- package/dist/chunk-Y7OEDUJ5.js +0 -8810
- package/dist/chunk-Y7OEDUJ5.js.map +0 -1
- package/dist/fleet-decision-row-GGCAT4E4.js.map +0 -1
- package/dist/hooks/use-packs.d.ts +0 -32
- package/dist/interactive-workbench-viewers-TOHBXJEE.js +0 -15
- package/dist/queue-surface-implementation-2KVJTYXH.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-packs.ts +0 -157
- /package/dist/{interactive-workbench-viewers-TOHBXJEE.js.map → browser-viewer-SHYKQRNX.js.map} +0 -0
|
@@ -6,8 +6,14 @@ import {
|
|
|
6
6
|
Suspense,
|
|
7
7
|
useEffect,
|
|
8
8
|
useState,
|
|
9
|
+
useSyncExternalStore,
|
|
9
10
|
} from "react";
|
|
10
11
|
import { cn } from "../lib/cn";
|
|
12
|
+
import {
|
|
13
|
+
loadPierreDiffs,
|
|
14
|
+
pierreDiffsRevision,
|
|
15
|
+
subscribePierreDiffs,
|
|
16
|
+
} from "../lib/pierre-diffs-loader";
|
|
11
17
|
|
|
12
18
|
/** Pierre `File` props subset we drive — the single-file, syntax-highlighted view
|
|
13
19
|
* (Shiki), the read counterpart of `PatchDiff`. */
|
|
@@ -25,7 +31,7 @@ type FileComponent = ComponentType<{
|
|
|
25
31
|
}>;
|
|
26
32
|
|
|
27
33
|
export type PierreFileProps = {
|
|
28
|
-
/**
|
|
34
|
+
/** Target path (used for the header + language inference). */
|
|
29
35
|
path: string;
|
|
30
36
|
/** The decoded text contents. */
|
|
31
37
|
contents: string;
|
|
@@ -44,7 +50,7 @@ export type PierreFileProps = {
|
|
|
44
50
|
// Lazy-load `@pierre/diffs/react`'s `File` so Shiki + the worker pool stay off the
|
|
45
51
|
// critical path (and out of an SSR bundle) until a file is actually viewed.
|
|
46
52
|
const LazyFile = lazy(async () => {
|
|
47
|
-
const mod = (await
|
|
53
|
+
const mod = (await loadPierreDiffs()) as { File: FileComponent };
|
|
48
54
|
return { default: mod.File };
|
|
49
55
|
});
|
|
50
56
|
|
|
@@ -65,18 +71,30 @@ export function PierreFile({
|
|
|
65
71
|
className,
|
|
66
72
|
}: PierreFileProps) {
|
|
67
73
|
const [failed, setFailed] = useState(false);
|
|
74
|
+
const [ready, setReady] = useState(false);
|
|
68
75
|
|
|
69
76
|
// Probe the import once so a hard failure (peer missing) shows `fallback`
|
|
70
77
|
// rather than a Suspense boundary that never resolves.
|
|
78
|
+
const loaderRevision = useSyncExternalStore(
|
|
79
|
+
subscribePierreDiffs,
|
|
80
|
+
pierreDiffsRevision,
|
|
81
|
+
pierreDiffsRevision,
|
|
82
|
+
);
|
|
71
83
|
useEffect(() => {
|
|
72
84
|
let cancelled = false;
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
85
|
+
setFailed(false);
|
|
86
|
+
loadPierreDiffs().then(
|
|
87
|
+
() => {
|
|
88
|
+
if (!cancelled) setReady(true);
|
|
89
|
+
},
|
|
90
|
+
() => {
|
|
91
|
+
if (!cancelled) setFailed(true);
|
|
92
|
+
},
|
|
93
|
+
);
|
|
76
94
|
return () => {
|
|
77
95
|
cancelled = true;
|
|
78
96
|
};
|
|
79
|
-
}, []);
|
|
97
|
+
}, [loaderRevision]);
|
|
80
98
|
|
|
81
99
|
const name = path.split("/").filter(Boolean).pop() ?? path;
|
|
82
100
|
|
|
@@ -108,6 +126,9 @@ export function PierreFile({
|
|
|
108
126
|
"--diffs-light-bg": "var(--og-color-bg)",
|
|
109
127
|
"--diffs-bg-buffer-override": "var(--og-color-surface-1)",
|
|
110
128
|
"--diffs-bg-separator-override": "var(--og-color-surface-1)",
|
|
129
|
+
// Pierre's default (fg mixed 65% into bg) falls under 4.5:1 on the lifted
|
|
130
|
+
// graphite separator; quiet meta text keeps AA on every diff surface.
|
|
131
|
+
"--diffs-fg-number-override": "var(--og-color-fg-subtle)",
|
|
111
132
|
"--diffs-font-size": "var(--og-code-font-size)",
|
|
112
133
|
"--diffs-line-height": "var(--og-code-line-height)",
|
|
113
134
|
} as CSSProperties;
|
|
@@ -117,11 +138,15 @@ export function PierreFile({
|
|
|
117
138
|
<Suspense fallback={loading ?? <FileSkeleton />}>
|
|
118
139
|
{/* `cacheKey` keys Pierre's worker-pool highlight cache on path+size so a
|
|
119
140
|
re-select of the same file is instant but an edited file re-highlights. */}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
141
|
+
{ready ? (
|
|
142
|
+
<LazyFile
|
|
143
|
+
file={{ name, contents }}
|
|
144
|
+
options={options}
|
|
145
|
+
{...(disableWorkerPool !== undefined ? { disableWorkerPool } : {})}
|
|
146
|
+
/>
|
|
147
|
+
) : (
|
|
148
|
+
(loading ?? <FileSkeleton />)
|
|
149
|
+
)}
|
|
125
150
|
</Suspense>
|
|
126
151
|
</div>
|
|
127
152
|
);
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { useEffect, useRef } from "react";
|
|
2
|
+
|
|
3
|
+
/** Private loading surface: never receives or executes the unfinished fence. */
|
|
4
|
+
export function PreviewLoading() {
|
|
5
|
+
const ref = useRef<HTMLCanvasElement>(null);
|
|
6
|
+
useEffect(() => {
|
|
7
|
+
const canvas = ref.current;
|
|
8
|
+
if (!canvas) return;
|
|
9
|
+
let ctx: CanvasRenderingContext2D | null;
|
|
10
|
+
try {
|
|
11
|
+
ctx = canvas.getContext("2d");
|
|
12
|
+
} catch {
|
|
13
|
+
return; // The CSS grid and status remain when canvas is unavailable.
|
|
14
|
+
}
|
|
15
|
+
if (!ctx) return;
|
|
16
|
+
const context = ctx;
|
|
17
|
+
const motion = window.matchMedia?.("(prefers-reduced-motion: reduce)");
|
|
18
|
+
let frame: number | undefined;
|
|
19
|
+
let time = 2;
|
|
20
|
+
let last: number | undefined;
|
|
21
|
+
let disposed = false;
|
|
22
|
+
// Without visibility observation, keep a static surface rather than doing
|
|
23
|
+
// unbounded work for previews that may be outside the viewport.
|
|
24
|
+
let visible = false;
|
|
25
|
+
const canAnimate = () => !disposed && visible && !document.hidden && motion?.matches === false;
|
|
26
|
+
|
|
27
|
+
function draw() {
|
|
28
|
+
const w = canvas!.clientWidth;
|
|
29
|
+
const h = canvas!.clientHeight;
|
|
30
|
+
if (!w || !h || document.hidden || disposed) return;
|
|
31
|
+
const d = Math.min(window.devicePixelRatio || 1, 2);
|
|
32
|
+
if (canvas!.width !== Math.round(w * d) || canvas!.height !== Math.round(h * d)) {
|
|
33
|
+
canvas!.width = Math.round(w * d);
|
|
34
|
+
canvas!.height = Math.round(h * d);
|
|
35
|
+
}
|
|
36
|
+
const style = getComputedStyle(canvas!);
|
|
37
|
+
const ink = style.getPropertyValue("--_og-preview-ink").trim() || "#9fdccd";
|
|
38
|
+
const glowColor = style.getPropertyValue("--_og-preview-glow").trim() || "#5fb8a3";
|
|
39
|
+
context.setTransform(d, 0, 0, d, 0, 0);
|
|
40
|
+
context.clearRect(0, 0, w, h);
|
|
41
|
+
const cx = w * (0.5 + 0.13 * Math.sin(time * 0.21));
|
|
42
|
+
const cy = h * (0.5 + 0.12 * Math.cos(time * 0.27));
|
|
43
|
+
const glow = context.createRadialGradient(cx, cy, 0, cx, cy, Math.max(w, h) * 0.65);
|
|
44
|
+
glow.addColorStop(0, glowColor);
|
|
45
|
+
glow.addColorStop(1, "transparent");
|
|
46
|
+
context.globalAlpha = 0.09;
|
|
47
|
+
context.fillStyle = glow;
|
|
48
|
+
context.fillRect(0, 0, w, h);
|
|
49
|
+
const rows = Math.ceil(h / 18) + 7;
|
|
50
|
+
const cols = Math.ceil(w / 18) + 7;
|
|
51
|
+
const points = Array.from({ length: rows }, (_row, r) =>
|
|
52
|
+
Array.from({ length: cols }, (_col, c) => {
|
|
53
|
+
const x = (c - 3) * 18;
|
|
54
|
+
const y = (r - 3) * 18;
|
|
55
|
+
const dist = Math.hypot((x - cx) * 0.8, y - cy);
|
|
56
|
+
const wave = Math.sin(dist * 0.032 - time * 0.95);
|
|
57
|
+
return {
|
|
58
|
+
x: x + ((x - cx) / Math.max(dist, 1)) * wave * 4,
|
|
59
|
+
y: y + ((y - cy) / Math.max(dist, 1)) * wave * 4,
|
|
60
|
+
l: Math.pow((wave + 1) / 2, 5),
|
|
61
|
+
};
|
|
62
|
+
}),
|
|
63
|
+
);
|
|
64
|
+
context.strokeStyle = ink;
|
|
65
|
+
context.fillStyle = ink;
|
|
66
|
+
context.lineWidth = 0.65;
|
|
67
|
+
points.forEach((row, r) =>
|
|
68
|
+
row.forEach((p, c) => {
|
|
69
|
+
context.globalAlpha = 0.035 + p.l * 0.055;
|
|
70
|
+
context.beginPath();
|
|
71
|
+
if (c + 1 < cols) {
|
|
72
|
+
context.moveTo(p.x, p.y);
|
|
73
|
+
context.lineTo(row[c + 1]!.x, row[c + 1]!.y);
|
|
74
|
+
}
|
|
75
|
+
if (r + 1 < rows) {
|
|
76
|
+
context.moveTo(p.x, p.y);
|
|
77
|
+
context.lineTo(points[r + 1]![c]!.x, points[r + 1]![c]!.y);
|
|
78
|
+
}
|
|
79
|
+
context.stroke();
|
|
80
|
+
context.globalAlpha = 0.15 + p.l * 0.55;
|
|
81
|
+
context.beginPath();
|
|
82
|
+
context.arc(p.x, p.y, 0.85 + p.l * 0.65, 0, Math.PI * 2);
|
|
83
|
+
context.fill();
|
|
84
|
+
}),
|
|
85
|
+
);
|
|
86
|
+
context.globalAlpha = 1;
|
|
87
|
+
canvas!.dataset.painted = "true";
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function stop() {
|
|
91
|
+
if (frame !== undefined) window.cancelAnimationFrame(frame);
|
|
92
|
+
frame = undefined;
|
|
93
|
+
last = undefined;
|
|
94
|
+
}
|
|
95
|
+
function tick(stamp: number) {
|
|
96
|
+
frame = undefined;
|
|
97
|
+
if (!canAnimate()) return;
|
|
98
|
+
if (last !== undefined) time += Math.min((stamp - last) / 1000, 0.05);
|
|
99
|
+
last = stamp;
|
|
100
|
+
draw();
|
|
101
|
+
frame = window.requestAnimationFrame(tick);
|
|
102
|
+
}
|
|
103
|
+
function refresh() {
|
|
104
|
+
stop();
|
|
105
|
+
if (disposed || document.hidden || (!visible && intersection)) return;
|
|
106
|
+
draw();
|
|
107
|
+
if (canAnimate() && typeof window.requestAnimationFrame === "function") {
|
|
108
|
+
frame = window.requestAnimationFrame(tick);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
const intersection =
|
|
112
|
+
typeof IntersectionObserver === "function"
|
|
113
|
+
? new IntersectionObserver(([entry]) => {
|
|
114
|
+
visible = entry?.isIntersecting === true;
|
|
115
|
+
refresh();
|
|
116
|
+
})
|
|
117
|
+
: undefined;
|
|
118
|
+
intersection?.observe(canvas);
|
|
119
|
+
const resize = typeof ResizeObserver === "function" ? new ResizeObserver(refresh) : undefined;
|
|
120
|
+
resize?.observe(canvas);
|
|
121
|
+
// Observe only ancestors, not the document subtree. This also updates the
|
|
122
|
+
// static reduced-motion canvas when a host changes its local theme.
|
|
123
|
+
const theme =
|
|
124
|
+
typeof MutationObserver === "function" ? new MutationObserver(refresh) : undefined;
|
|
125
|
+
for (let ancestor = canvas.parentElement; ancestor; ancestor = ancestor.parentElement) {
|
|
126
|
+
theme?.observe(ancestor, {
|
|
127
|
+
attributes: true,
|
|
128
|
+
attributeFilter: ["class", "style", "data-og-theme"],
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
motion?.addEventListener?.("change", refresh);
|
|
132
|
+
document.addEventListener("visibilitychange", refresh);
|
|
133
|
+
window.addEventListener("resize", refresh);
|
|
134
|
+
// Old hosts get one still frame; observed surfaces wait until onscreen.
|
|
135
|
+
if (!intersection) draw();
|
|
136
|
+
return () => {
|
|
137
|
+
disposed = true;
|
|
138
|
+
stop();
|
|
139
|
+
intersection?.disconnect();
|
|
140
|
+
resize?.disconnect();
|
|
141
|
+
theme?.disconnect();
|
|
142
|
+
motion?.removeEventListener?.("change", refresh);
|
|
143
|
+
document.removeEventListener("visibilitychange", refresh);
|
|
144
|
+
window.removeEventListener("resize", refresh);
|
|
145
|
+
};
|
|
146
|
+
}, []);
|
|
147
|
+
|
|
148
|
+
return (
|
|
149
|
+
<div className="og-preview-loading">
|
|
150
|
+
<canvas ref={ref} aria-hidden="true" />
|
|
151
|
+
<span className="og-preview-loading-label">Preparing preview…</span>
|
|
152
|
+
</div>
|
|
153
|
+
);
|
|
154
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One presentation rule for a queued item, shared by the full queue and the
|
|
3
|
+
* compact session-chrome dock so the two cannot drift. A turn with an empty
|
|
4
|
+
* prompt and timeline annotations is valid content; an item with neither is a
|
|
5
|
+
* malformed or legacy object that gets an explicit fallback, never a blank row.
|
|
6
|
+
*/
|
|
7
|
+
export type QueueItemContent = "text" | "annotations" | "unavailable";
|
|
8
|
+
|
|
9
|
+
export const QUEUE_ITEM_CONTENT_UNAVAILABLE = "Content unavailable";
|
|
10
|
+
|
|
11
|
+
export function queueItemContent(text: string, annotationCount: number): QueueItemContent {
|
|
12
|
+
if (text.length > 0) return "text";
|
|
13
|
+
return annotationCount > 0 ? "annotations" : "unavailable";
|
|
14
|
+
}
|
|
@@ -17,6 +17,7 @@ import {
|
|
|
17
17
|
} from "@dnd-kit/sortable";
|
|
18
18
|
import { CSS } from "@dnd-kit/utilities";
|
|
19
19
|
import type { SessionPendingInputPreview, SessionTurn, TimelineAnnotation } from "@opengeni/sdk";
|
|
20
|
+
import { modelDisplayName } from "@opengeni/sdk/model-display";
|
|
20
21
|
import {
|
|
21
22
|
ArrowDownToLineIcon,
|
|
22
23
|
ArrowUpToLineIcon,
|
|
@@ -37,6 +38,7 @@ import {
|
|
|
37
38
|
} from "react";
|
|
38
39
|
|
|
39
40
|
import { DropdownMenu } from "radix-ui";
|
|
41
|
+
import { MENU_ITEM_CLASS, MENU_SEPARATOR_CLASS, MENU_SURFACE_CLASS } from "../lib/menu-styles";
|
|
40
42
|
import type { ComposerState } from "../hooks/use-composer";
|
|
41
43
|
import type { QueueMutationKind, UseTurnQueueResult } from "../hooks/use-turn-queue";
|
|
42
44
|
import {
|
|
@@ -45,9 +47,13 @@ import {
|
|
|
45
47
|
usePortalTokenStyle,
|
|
46
48
|
} from "../lib/use-portal-token-style";
|
|
47
49
|
import { requestQueueDraftEdit } from "./queue-draft-policy";
|
|
50
|
+
import { QUEUE_ITEM_CONTENT_UNAVAILABLE, queueItemContent } from "./queue-item-content";
|
|
48
51
|
import { QueueErrorAlert, QueueStoppingStatus } from "./queue-surface-state";
|
|
49
52
|
import { TimelineAnnotationsChip } from "./timeline-annotations";
|
|
50
53
|
|
|
54
|
+
// Queued prompts can be long; menu rows wrap instead of truncating.
|
|
55
|
+
const QUEUE_MENU_ITEM_CLASS = `${MENU_ITEM_CLASS} whitespace-normal break-words`;
|
|
56
|
+
|
|
51
57
|
/** The sole pending-input surface: compact above Goal, Agents, and composer. */
|
|
52
58
|
type QueueSurfaceCommonProps = {
|
|
53
59
|
/** Focus the composer owned by this queue after checkout/removal. */
|
|
@@ -84,6 +90,10 @@ export function QueueSurface({
|
|
|
84
90
|
const [replaceDraftFor, setReplaceDraftFor] = useState<string | null>(null);
|
|
85
91
|
const [announcement, setAnnouncement] = useState("");
|
|
86
92
|
const [draggedTurnId, setDraggedTurnId] = useState<string | null>(null);
|
|
93
|
+
const [pendingMove, setPendingMove] = useState<{
|
|
94
|
+
baseVersion: number | null;
|
|
95
|
+
turnIds: string[];
|
|
96
|
+
} | null>(null);
|
|
87
97
|
const surface = usePortalTokenSource<HTMLDivElement>();
|
|
88
98
|
const surfaceRef = surface.currentRef;
|
|
89
99
|
const portalTokenStyle = usePortalTokenStyle(surface.source);
|
|
@@ -112,30 +122,56 @@ export function QueueSurface({
|
|
|
112
122
|
const sensors = useSensors(useSensor(PointerSensor, { activationConstraint: { distance: 6 } }));
|
|
113
123
|
|
|
114
124
|
const displayedQueue = useMemo(() => {
|
|
115
|
-
if (
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
125
|
+
if (keyboardDrag) {
|
|
126
|
+
const oldIndex = queue.queue.findIndex((turn) => turn.id === keyboardDrag.turnId);
|
|
127
|
+
if (oldIndex < 0) return queue.queue;
|
|
128
|
+
return arrayMove(queue.queue, oldIndex, keyboardDrag.projectedIndex);
|
|
129
|
+
}
|
|
130
|
+
if (
|
|
131
|
+
!pendingMove ||
|
|
132
|
+
pendingMove.baseVersion === null ||
|
|
133
|
+
queue.snapshot?.version !== pendingMove.baseVersion
|
|
134
|
+
) {
|
|
135
|
+
return queue.queue;
|
|
136
|
+
}
|
|
137
|
+
const byId = new Map(queue.queue.map((turn) => [turn.id, turn]));
|
|
138
|
+
const projected = pendingMove.turnIds.map((turnId) => byId.get(turnId));
|
|
139
|
+
// Never let an optimistic ordering projection omit or invent a row. Any
|
|
140
|
+
// concurrent authoritative membership change wins immediately.
|
|
141
|
+
if (projected.some((turn) => !turn) || projected.length !== queue.queue.length) {
|
|
142
|
+
return queue.queue;
|
|
143
|
+
}
|
|
144
|
+
return projected as SessionTurn[];
|
|
145
|
+
}, [keyboardDrag, pendingMove, queue.queue, queue.snapshot?.version]);
|
|
120
146
|
|
|
121
147
|
const ids = useMemo(() => displayedQueue.map((turn) => turn.id), [displayedQueue]);
|
|
122
148
|
const moveToIndex = useCallback(
|
|
123
149
|
async (turnId: string, nextIndex: number): Promise<void> => {
|
|
150
|
+
if (queue.mutating || pendingMove) return;
|
|
124
151
|
const oldIndex = queue.queue.findIndex((turn) => turn.id === turnId);
|
|
125
152
|
if (oldIndex < 0) return;
|
|
126
153
|
const boundedIndex = Math.max(0, Math.min(nextIndex, queue.queue.length - 1));
|
|
127
154
|
if (oldIndex === boundedIndex) return;
|
|
128
155
|
const ordered = arrayMove(queue.queue, oldIndex, boundedIndex);
|
|
129
156
|
const beforeTurnId = ordered[boundedIndex + 1]?.id ?? null;
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
157
|
+
setPendingMove({
|
|
158
|
+
baseVersion: queue.snapshot?.version ?? null,
|
|
159
|
+
turnIds: ordered.map((turn) => turn.id),
|
|
160
|
+
});
|
|
161
|
+
setAnnouncement(`Saving queued prompt at position ${boundedIndex + 1}.`);
|
|
162
|
+
try {
|
|
163
|
+
const moved = await queue.moveTurn(turnId, beforeTurnId);
|
|
164
|
+
setAnnouncement(
|
|
165
|
+
moved
|
|
166
|
+
? `Queued prompt moved to position ${boundedIndex + 1}.`
|
|
167
|
+
: "The queue changed before that prompt could be moved. Refreshed server order.",
|
|
168
|
+
);
|
|
169
|
+
if (moved) focusQueueTurn(surfaceRef.current, turnId);
|
|
170
|
+
} finally {
|
|
171
|
+
setPendingMove(null);
|
|
172
|
+
}
|
|
137
173
|
},
|
|
138
|
-
[queue, surfaceRef],
|
|
174
|
+
[pendingMove, queue, surfaceRef],
|
|
139
175
|
);
|
|
140
176
|
|
|
141
177
|
const onDragEnd = useCallback(
|
|
@@ -211,11 +247,15 @@ export function QueueSurface({
|
|
|
211
247
|
const edit = useCallback(
|
|
212
248
|
async (turn: SessionTurn, replaceDraft: boolean) => {
|
|
213
249
|
if (!composer || !canEditInComposer) return;
|
|
250
|
+
setAnnouncement("Moving queued prompt to the composer…");
|
|
214
251
|
const restored = await queue.editTurn(turn.id, {
|
|
215
252
|
expectedDraftRevision: composer.draftRevision,
|
|
216
253
|
replaceDraft,
|
|
217
254
|
});
|
|
218
|
-
if (!restored)
|
|
255
|
+
if (!restored) {
|
|
256
|
+
setAnnouncement("That prompt changed before it could be moved to the composer.");
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
219
259
|
composer.applyDraft(restored);
|
|
220
260
|
setReplaceDraftFor(null);
|
|
221
261
|
setAnnouncement("Queued prompt moved back to the composer for editing.");
|
|
@@ -358,6 +398,7 @@ export function QueueSurface({
|
|
|
358
398
|
turn.id === queue.pendingInputAttachment?.turnId ? attachedInputs : []
|
|
359
399
|
}
|
|
360
400
|
pending={queue.mutationFor(turn.id)}
|
|
401
|
+
reorderDisabled={queue.mutating || pendingMove !== null}
|
|
361
402
|
confirmingReplace={replaceDraftFor === turn.id}
|
|
362
403
|
keyboardDragging={keyboardDrag?.turnId === turn.id}
|
|
363
404
|
portalTokenStyle={portalTokenStyle}
|
|
@@ -367,6 +408,7 @@ export function QueueSurface({
|
|
|
367
408
|
onConfirmReplace={() => void edit(turn, true)}
|
|
368
409
|
onCancelReplace={() => setReplaceDraftFor(null)}
|
|
369
410
|
onSteer={() => {
|
|
411
|
+
setAnnouncement("Requesting this queued prompt as the next direction…");
|
|
370
412
|
void queue.steerTurn(turn.id).then((steered) => {
|
|
371
413
|
setAnnouncement(
|
|
372
414
|
steered
|
|
@@ -379,6 +421,7 @@ export function QueueSurface({
|
|
|
379
421
|
});
|
|
380
422
|
}}
|
|
381
423
|
onDelete={() => {
|
|
424
|
+
setAnnouncement("Deleting queued prompt…");
|
|
382
425
|
void queue.removeTurn(turn.id).then((removed) => {
|
|
383
426
|
setAnnouncement(
|
|
384
427
|
removed
|
|
@@ -492,8 +535,7 @@ type QueuePromptPreview = {
|
|
|
492
535
|
isFallback: boolean;
|
|
493
536
|
};
|
|
494
537
|
|
|
495
|
-
function
|
|
496
|
-
const summary = `${count} timeline ${count === 1 ? "annotation" : "annotations"}`;
|
|
538
|
+
function labelQueuePreview(summary: string): QueuePromptPreview {
|
|
497
539
|
return {
|
|
498
540
|
summary,
|
|
499
541
|
collapsedVisual: summary,
|
|
@@ -509,10 +551,24 @@ function queueTurnPreview(
|
|
|
509
551
|
maxCharacters: number,
|
|
510
552
|
): QueuePromptPreview {
|
|
511
553
|
if (!turn) return queuePromptPreview("", maxCharacters);
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
554
|
+
return queueContentPreview(turn.prompt, turn.annotations?.length ?? 0, maxCharacters);
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
function queueContentPreview(
|
|
558
|
+
prompt: string,
|
|
559
|
+
annotationCount: number,
|
|
560
|
+
maxCharacters: number,
|
|
561
|
+
): QueuePromptPreview {
|
|
562
|
+
switch (queueItemContent(prompt, annotationCount)) {
|
|
563
|
+
case "text":
|
|
564
|
+
return queuePromptPreview(prompt, maxCharacters);
|
|
565
|
+
case "annotations":
|
|
566
|
+
return labelQueuePreview(
|
|
567
|
+
`${annotationCount} timeline ${annotationCount === 1 ? "annotation" : "annotations"}`,
|
|
568
|
+
);
|
|
569
|
+
case "unavailable":
|
|
570
|
+
return labelQueuePreview(QUEUE_ITEM_CONTENT_UNAVAILABLE);
|
|
571
|
+
}
|
|
516
572
|
}
|
|
517
573
|
|
|
518
574
|
/**
|
|
@@ -788,11 +844,9 @@ function QueuePrompt({
|
|
|
788
844
|
}) {
|
|
789
845
|
const [expanded, setExpanded] = useState(false);
|
|
790
846
|
const fullContentId = useId();
|
|
847
|
+
const content = queueItemContent(prompt, annotations.length);
|
|
791
848
|
const preview = useMemo(
|
|
792
|
-
() =>
|
|
793
|
-
prompt.length === 0 && annotations.length > 0
|
|
794
|
-
? annotationOnlyQueuePreview(annotations.length)
|
|
795
|
-
: queuePromptPreview(prompt, QUEUE_ROW_PREVIEW_CHARACTERS),
|
|
849
|
+
() => queueContentPreview(prompt, annotations.length, QUEUE_ROW_PREVIEW_CHARACTERS),
|
|
796
850
|
[annotations.length, prompt],
|
|
797
851
|
);
|
|
798
852
|
|
|
@@ -843,6 +897,14 @@ function QueuePrompt({
|
|
|
843
897
|
className={prompt ? "mt-1" : undefined}
|
|
844
898
|
/>
|
|
845
899
|
) : null}
|
|
900
|
+
{content === "unavailable" ? (
|
|
901
|
+
<p
|
|
902
|
+
className="text-og-control leading-5 text-fg-muted italic"
|
|
903
|
+
data-testid={`queue-prompt-unavailable-${index + 1}`}
|
|
904
|
+
>
|
|
905
|
+
{QUEUE_ITEM_CONTENT_UNAVAILABLE}
|
|
906
|
+
</p>
|
|
907
|
+
) : null}
|
|
846
908
|
{prompt ? (
|
|
847
909
|
<button
|
|
848
910
|
type="button"
|
|
@@ -916,7 +978,7 @@ function ReadOnlyQueueRow({
|
|
|
916
978
|
{turn.tools.length} tool{turn.tools.length === 1 ? "" : "s"}
|
|
917
979
|
</span>
|
|
918
980
|
) : null}
|
|
919
|
-
<span className="min-w-0 truncate">{turn.model}</span>
|
|
981
|
+
<span className="min-w-0 truncate">{modelDisplayName(turn.model)}</span>
|
|
920
982
|
<span className="shrink-0">{turn.reasoningEffort}</span>
|
|
921
983
|
</div>
|
|
922
984
|
</div>
|
|
@@ -930,6 +992,7 @@ function SortableQueueRow({
|
|
|
930
992
|
count,
|
|
931
993
|
attachedInputs,
|
|
932
994
|
pending,
|
|
995
|
+
reorderDisabled,
|
|
933
996
|
confirmingReplace,
|
|
934
997
|
keyboardDragging,
|
|
935
998
|
portalTokenStyle,
|
|
@@ -947,6 +1010,7 @@ function SortableQueueRow({
|
|
|
947
1010
|
count: number;
|
|
948
1011
|
attachedInputs: SessionPendingInputPreview[];
|
|
949
1012
|
pending: QueueMutationKind | null;
|
|
1013
|
+
reorderDisabled: boolean;
|
|
950
1014
|
confirmingReplace: boolean;
|
|
951
1015
|
keyboardDragging: boolean;
|
|
952
1016
|
portalTokenStyle: PortalTokenStyle;
|
|
@@ -961,7 +1025,7 @@ function SortableQueueRow({
|
|
|
961
1025
|
}) {
|
|
962
1026
|
const sortable = useSortable({
|
|
963
1027
|
id: turn.id,
|
|
964
|
-
disabled:
|
|
1028
|
+
disabled: reorderDisabled || keyboardDragging,
|
|
965
1029
|
});
|
|
966
1030
|
return (
|
|
967
1031
|
<li
|
|
@@ -981,7 +1045,7 @@ function SortableQueueRow({
|
|
|
981
1045
|
{...sortable.attributes}
|
|
982
1046
|
{...sortable.listeners}
|
|
983
1047
|
onKeyDown={onHandleKeyDown}
|
|
984
|
-
disabled={
|
|
1048
|
+
disabled={reorderDisabled}
|
|
985
1049
|
className="col-start-1 row-start-1 mt-0.5 inline-flex size-7 shrink-0 touch-none items-center justify-center rounded-md text-fg-subtle hover:bg-surface-2 hover:text-fg focus-visible:ring-2 focus-visible:ring-ring/40 pointer-coarse:size-[44px]"
|
|
986
1050
|
aria-label={`Reorder queued prompt ${index + 1}`}
|
|
987
1051
|
title="Drag to reorder. Press Space, arrows, then Space to drop."
|
|
@@ -1012,9 +1076,23 @@ function SortableQueueRow({
|
|
|
1012
1076
|
{turn.tools.length} tool{turn.tools.length === 1 ? "" : "s"}
|
|
1013
1077
|
</span>
|
|
1014
1078
|
) : null}
|
|
1015
|
-
<span className="min-w-0 truncate">{turn.model}</span>
|
|
1079
|
+
<span className="min-w-0 truncate">{modelDisplayName(turn.model)}</span>
|
|
1016
1080
|
<span className="shrink-0">{turn.reasoningEffort}</span>
|
|
1017
1081
|
</div>
|
|
1082
|
+
{pending ? (
|
|
1083
|
+
<div
|
|
1084
|
+
role="status"
|
|
1085
|
+
aria-live="polite"
|
|
1086
|
+
className="mt-1 flex items-center gap-1.5 text-og-xs font-medium text-status-waiting"
|
|
1087
|
+
data-testid={`queue-mutation-${pending}`}
|
|
1088
|
+
>
|
|
1089
|
+
<Loader2Icon
|
|
1090
|
+
aria-hidden="true"
|
|
1091
|
+
className="size-3 shrink-0 animate-spin motion-reduce:animate-none"
|
|
1092
|
+
/>
|
|
1093
|
+
{queueMutationPendingLabel(pending)}
|
|
1094
|
+
</div>
|
|
1095
|
+
) : null}
|
|
1018
1096
|
</div>
|
|
1019
1097
|
<div className="col-span-full row-start-3 flex min-w-0 items-start justify-end gap-1.5 sm:col-span-1 sm:col-start-4 sm:row-start-1 sm:gap-2">
|
|
1020
1098
|
<button
|
|
@@ -1022,6 +1100,7 @@ function SortableQueueRow({
|
|
|
1022
1100
|
disabled={pending !== null}
|
|
1023
1101
|
onClick={onSteer}
|
|
1024
1102
|
aria-label={`Steer queued prompt ${index + 1}`}
|
|
1103
|
+
data-analytics-action="steer"
|
|
1025
1104
|
title="Steer — interrupt the current turn and send this message now"
|
|
1026
1105
|
className="inline-flex h-7 shrink-0 items-center justify-center gap-1 rounded-md px-2 text-og-control font-medium text-fg outline-hidden transition-[background-color] hover:bg-surface-2 focus-visible:ring-2 focus-visible:ring-ring/40 disabled:pointer-events-none disabled:opacity-50 pointer-coarse:min-h-[44px] pointer-coarse:min-w-[44px]"
|
|
1027
1106
|
>
|
|
@@ -1065,48 +1144,46 @@ function SortableQueueRow({
|
|
|
1065
1144
|
<DropdownMenu.Content
|
|
1066
1145
|
align="end"
|
|
1067
1146
|
sideOffset={4}
|
|
1068
|
-
|
|
1147
|
+
collisionPadding={8}
|
|
1148
|
+
className={`${MENU_SURFACE_CLASS} og-root z-50 max-h-(--radix-dropdown-menu-content-available-height) w-52 max-w-[calc(100vw-16px)] overflow-x-hidden overflow-y-auto`}
|
|
1069
1149
|
style={portalTokenStyle}
|
|
1070
1150
|
data-testid={`queue-actions-menu-${index + 1}`}
|
|
1071
1151
|
>
|
|
1072
1152
|
{onEdit ? (
|
|
1073
1153
|
<>
|
|
1074
|
-
<DropdownMenu.Item
|
|
1075
|
-
|
|
1076
|
-
onSelect={onEdit}
|
|
1077
|
-
>
|
|
1078
|
-
<PencilIcon className="size-3.5" /> Edit in composer
|
|
1154
|
+
<DropdownMenu.Item className={QUEUE_MENU_ITEM_CLASS} onSelect={onEdit}>
|
|
1155
|
+
<PencilIcon /> Edit in composer
|
|
1079
1156
|
</DropdownMenu.Item>
|
|
1080
|
-
<DropdownMenu.Separator className=
|
|
1157
|
+
<DropdownMenu.Separator className={MENU_SEPARATOR_CLASS} />
|
|
1081
1158
|
</>
|
|
1082
1159
|
) : null}
|
|
1083
1160
|
<DropdownMenu.Item
|
|
1084
|
-
className=
|
|
1161
|
+
className={QUEUE_MENU_ITEM_CLASS}
|
|
1085
1162
|
disabled={index === 0}
|
|
1086
1163
|
onSelect={() => onMove(0)}
|
|
1087
1164
|
>
|
|
1088
|
-
<ArrowUpToLineIcon
|
|
1165
|
+
<ArrowUpToLineIcon /> Move to top
|
|
1089
1166
|
</DropdownMenu.Item>
|
|
1090
1167
|
<DropdownMenu.Item
|
|
1091
|
-
className=
|
|
1168
|
+
className={QUEUE_MENU_ITEM_CLASS}
|
|
1092
1169
|
disabled={index === 0}
|
|
1093
1170
|
onSelect={() => onMove(index - 1)}
|
|
1094
1171
|
>
|
|
1095
1172
|
Move up
|
|
1096
1173
|
</DropdownMenu.Item>
|
|
1097
1174
|
<DropdownMenu.Item
|
|
1098
|
-
className=
|
|
1175
|
+
className={QUEUE_MENU_ITEM_CLASS}
|
|
1099
1176
|
disabled={index === count - 1}
|
|
1100
1177
|
onSelect={() => onMove(index + 1)}
|
|
1101
1178
|
>
|
|
1102
1179
|
Move down
|
|
1103
1180
|
</DropdownMenu.Item>
|
|
1104
1181
|
<DropdownMenu.Item
|
|
1105
|
-
className=
|
|
1182
|
+
className={QUEUE_MENU_ITEM_CLASS}
|
|
1106
1183
|
disabled={index === count - 1}
|
|
1107
1184
|
onSelect={() => onMove(count - 1)}
|
|
1108
1185
|
>
|
|
1109
|
-
<ArrowDownToLineIcon
|
|
1186
|
+
<ArrowDownToLineIcon /> Move to bottom
|
|
1110
1187
|
</DropdownMenu.Item>
|
|
1111
1188
|
</DropdownMenu.Content>
|
|
1112
1189
|
</DropdownMenu.Portal>
|
|
@@ -1130,7 +1207,7 @@ function SortableQueueRow({
|
|
|
1130
1207
|
</button>
|
|
1131
1208
|
<button
|
|
1132
1209
|
type="button"
|
|
1133
|
-
className="rounded-md bg-
|
|
1210
|
+
className="rounded-md border border-og-primary-border bg-og-primary text-og-primary-fg px-2 py-1 font-medium hover:bg-og-primary-hover focus-visible:ring-2 focus-visible:ring-ring/40"
|
|
1134
1211
|
onClick={onConfirmReplace}
|
|
1135
1212
|
>
|
|
1136
1213
|
Replace and edit
|
|
@@ -1142,6 +1219,19 @@ function SortableQueueRow({
|
|
|
1142
1219
|
);
|
|
1143
1220
|
}
|
|
1144
1221
|
|
|
1222
|
+
function queueMutationPendingLabel(kind: QueueMutationKind): string {
|
|
1223
|
+
switch (kind) {
|
|
1224
|
+
case "move":
|
|
1225
|
+
return "Saving new position…";
|
|
1226
|
+
case "edit":
|
|
1227
|
+
return "Moving to composer…";
|
|
1228
|
+
case "steer":
|
|
1229
|
+
return "Changing direction…";
|
|
1230
|
+
case "delete":
|
|
1231
|
+
return "Deleting…";
|
|
1232
|
+
}
|
|
1233
|
+
}
|
|
1234
|
+
|
|
1145
1235
|
const verticalOnly: Modifier = ({ transform }) => ({ ...transform, x: 0 });
|
|
1146
1236
|
|
|
1147
1237
|
function focusQueueTurn(surface: HTMLElement | null, turnId: string): void {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Loader2Icon, RotateCwIcon } from "lucide-react";
|
|
2
2
|
|
|
3
3
|
import type { UseTurnQueueResult } from "../hooks/use-turn-queue";
|
|
4
|
+
import { useErrorMessage } from "../lib/error-message";
|
|
4
5
|
|
|
5
6
|
type QueueStateProps = {
|
|
6
7
|
queue: UseTurnQueueResult;
|
|
@@ -60,6 +61,7 @@ export function QueueErrorAlert({
|
|
|
60
61
|
queue,
|
|
61
62
|
dividerBefore = false,
|
|
62
63
|
}: QueueStateProps & { dividerBefore?: boolean }) {
|
|
64
|
+
const formatError = useErrorMessage();
|
|
63
65
|
return (
|
|
64
66
|
<div className={`${dividerBefore ? "border-t border-border" : ""} p-2`}>
|
|
65
67
|
<div
|
|
@@ -74,7 +76,7 @@ export function QueueErrorAlert({
|
|
|
74
76
|
data-testid="queue-error-message"
|
|
75
77
|
dir="auto"
|
|
76
78
|
>
|
|
77
|
-
{(queue.mutationError ?? queue.error)
|
|
79
|
+
{formatError(queue.mutationError ?? queue.error)}
|
|
78
80
|
</span>
|
|
79
81
|
<button
|
|
80
82
|
type="button"
|