@opengeni/react 0.57.0 → 1.0.2-canary.37191796234001
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 +654 -22
- 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-GTR5XQ7X.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-5UQPNLIO.js → chunk-23J2ZNXT.js} +4117 -3896
- package/dist/chunk-23J2ZNXT.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-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-CR7U7HAR.js +453 -0
- package/dist/chunk-CR7U7HAR.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-E3G7SAYZ.js +3124 -0
- package/dist/chunk-E3G7SAYZ.js.map +1 -0
- package/dist/chunk-ELCE5SXV.js +359 -0
- package/dist/chunk-ELCE5SXV.js.map +1 -0
- package/dist/chunk-ERGYJIBB.js +21 -0
- package/dist/chunk-ERGYJIBB.js.map +1 -0
- package/dist/chunk-FFA2OVOV.js +319 -0
- package/dist/chunk-FFA2OVOV.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-6KLX2RH5.js → chunk-H2NJQORO.js} +1069 -79
- package/dist/chunk-H2NJQORO.js.map +1 -0
- package/dist/chunk-I7IWRQLN.js +1608 -0
- package/dist/chunk-I7IWRQLN.js.map +1 -0
- package/dist/{chunk-HA46CYQK.js → chunk-IQUCRAT7.js} +792 -537
- package/dist/chunk-IQUCRAT7.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-JFNEV4LU.js +2733 -0
- package/dist/chunk-JFNEV4LU.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-C5ZPSSS5.js → chunk-NEXLLTP4.js} +2 -1
- package/dist/{chunk-C5ZPSSS5.js.map → chunk-NEXLLTP4.js.map} +1 -1
- package/dist/chunk-NZUI76EM.js +371 -0
- package/dist/chunk-NZUI76EM.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-IGC6A2ZI.js → chunk-Q5QBEZIQ.js} +777 -246
- package/dist/chunk-Q5QBEZIQ.js.map +1 -0
- package/dist/chunk-RHREZ7BO.js +11 -0
- package/dist/chunk-RHREZ7BO.js.map +1 -0
- package/dist/chunk-SCOTPE2I.js +589 -0
- package/dist/chunk-SCOTPE2I.js.map +1 -0
- package/dist/{chunk-B6WPZSTT.js → chunk-SJZDKVW2.js} +1331 -1163
- package/dist/chunk-SJZDKVW2.js.map +1 -0
- package/dist/chunk-TMJRG4YC.js +12803 -0
- package/dist/chunk-TMJRG4YC.js.map +1 -0
- 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-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-XOAMRDDK.js +481 -0
- package/dist/chunk-XOAMRDDK.js.map +1 -0
- package/dist/chunk-XUW2UWQM.js +299 -0
- package/dist/chunk-XUW2UWQM.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-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-LLOLUHVG.js → chunk-YWFG7ZX7.js} +1358 -2746
- package/dist/chunk-YWFG7ZX7.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 +55 -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 +86 -0
- package/dist/components/session-list.d.ts +36 -0
- package/dist/components/session-mcp-capability-card.d.ts +41 -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-ENHVAZ2Q.js +19 -0
- package/dist/computer-viewer-ENHVAZ2Q.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 +2237 -6200
- 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-755OW5DS.js +117 -0
- package/dist/latest-question-755OW5DS.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-PWRI7R2X.js +14 -0
- package/dist/model-policy-picker-menu-PWRI7R2X.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 +10 -3
- package/dist/realtime.js +229 -83
- package/dist/realtime.js.map +1 -1
- package/dist/sandbox-files-BBC47SLD.js +20 -0
- package/dist/sandbox-files-BBC47SLD.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 +32 -3
- package/dist/timeline/types.d.ts +141 -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 +2498 -663
- 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 +319 -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 +512 -0
- package/src/components/session-list.tsx +250 -0
- package/src/components/session-mcp-capability-card.tsx +680 -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-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 +274 -60
- package/src/session-auth-recommendation.ts +48 -0
- package/src/session-capability-policy.ts +83 -0
- package/src/session-context.ts +1 -0
- 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 +1600 -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 +208 -44
- package/src/timeline/types.ts +186 -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-GTR5XQ7X.js.map} +0 -0
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
import type { OpenGeniClient, ToolGatewayIdentity } from "@opengeni/sdk";
|
|
2
|
+
import { useEffect, useMemo, useState } from "react";
|
|
3
|
+
|
|
4
|
+
import { loadSiteSnapshot } from "../../sites-ui";
|
|
5
|
+
import { useOpenGeniLinkResolver } from "../open-geni-links";
|
|
6
|
+
import {
|
|
7
|
+
ArtifactButton,
|
|
8
|
+
ArtifactLabelsProvider,
|
|
9
|
+
ArtifactSelect,
|
|
10
|
+
useArtifactLabels,
|
|
11
|
+
type ArtifactLabels,
|
|
12
|
+
} from "./artifact-chrome";
|
|
13
|
+
import { ArtifactSandbox } from "./artifact-sandbox";
|
|
14
|
+
import { DeferredChatMedia } from "./deferred-chat-media";
|
|
15
|
+
import { inlineHtmlDocument } from "./inline-html-document";
|
|
16
|
+
import type { PublishedHtmlArtifactToolBridge } from "./published-html-artifact-frame";
|
|
17
|
+
|
|
18
|
+
// Fixed chat viewports keep async Site loads and fragment resize messages from
|
|
19
|
+
// moving the conversation. Full-screen remains available for larger content.
|
|
20
|
+
const INLINE_PREVIEW_HEIGHT = 360;
|
|
21
|
+
const SITE_PREVIEW_HEIGHT = 400;
|
|
22
|
+
const PREVIEW_CHROME_HEIGHT = 50;
|
|
23
|
+
|
|
24
|
+
/** Reads a Site needs to render; the console client, the SDK client, or a proxy. */
|
|
25
|
+
export type SiteSnapshotClient = Pick<
|
|
26
|
+
OpenGeniClient,
|
|
27
|
+
"getWorkspaceArtifact" | "getWorkspaceArtifactHtml"
|
|
28
|
+
> &
|
|
29
|
+
Partial<Pick<OpenGeniClient, "getWorkspaceArtifactContent">>;
|
|
30
|
+
|
|
31
|
+
/** The exact saved Site a tool bridge is pinned to (absent for inline HTML). */
|
|
32
|
+
export type SiteToolScope = {
|
|
33
|
+
artifactId: string;
|
|
34
|
+
siteVersionId: string;
|
|
35
|
+
requestedTools: readonly ToolGatewayIdentity[];
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
/** Host-owned Site API access. Omit it and Sites render without workspace tools. */
|
|
39
|
+
export type SiteToolBridgeFactory = (
|
|
40
|
+
site?: SiteToolScope,
|
|
41
|
+
) => PublishedHtmlArtifactToolBridge | undefined;
|
|
42
|
+
|
|
43
|
+
export type ChatInteractiveBlockProps = {
|
|
44
|
+
workspaceId: string;
|
|
45
|
+
kind: "html" | "site";
|
|
46
|
+
content: string;
|
|
47
|
+
client: SiteSnapshotClient;
|
|
48
|
+
toolBridge?: SiteToolBridgeFactory | undefined;
|
|
49
|
+
theme?: "light" | "dark" | undefined;
|
|
50
|
+
/** Translations for the preview's copy; defaults to English. */
|
|
51
|
+
labels?: Partial<ArtifactLabels> | undefined;
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Inline preview for an assistant `opengeni-html` or `opengeni-site` fence, as
|
|
56
|
+
* the OpenGeni console renders it. "Open Site" goes through the nearest
|
|
57
|
+
* `resolveLink`, so a host decides where a Site opens.
|
|
58
|
+
*/
|
|
59
|
+
export function ChatInteractiveBlock({ labels, ...props }: ChatInteractiveBlockProps) {
|
|
60
|
+
return (
|
|
61
|
+
<ArtifactLabelsProvider labels={labels}>
|
|
62
|
+
<InteractiveBlock {...props} />
|
|
63
|
+
</ArtifactLabelsProvider>
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function InteractiveBlock(props: ChatInteractiveBlockProps) {
|
|
68
|
+
const labels = useArtifactLabels();
|
|
69
|
+
const height =
|
|
70
|
+
(props.kind === "html" ? INLINE_PREVIEW_HEIGHT : SITE_PREVIEW_HEIGHT) + PREVIEW_CHROME_HEIGHT;
|
|
71
|
+
return (
|
|
72
|
+
<DeferredChatMedia
|
|
73
|
+
key={`${props.workspaceId}:${props.kind}:${props.kind === "site" ? props.content : "inline"}`}
|
|
74
|
+
height={height}
|
|
75
|
+
actionLabel={props.kind === "html" ? labels.loadPreview : labels.loadSitePreview}
|
|
76
|
+
>
|
|
77
|
+
<div style={{ height }}>
|
|
78
|
+
<LoadedChatInteractiveBlock {...props} />
|
|
79
|
+
</div>
|
|
80
|
+
</DeferredChatMedia>
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function LoadedChatInteractiveBlock(props: ChatInteractiveBlockProps) {
|
|
85
|
+
const labels = useArtifactLabels();
|
|
86
|
+
if (props.kind === "html") return <InlineHtml {...props} />;
|
|
87
|
+
try {
|
|
88
|
+
const value = JSON.parse(props.content);
|
|
89
|
+
if (
|
|
90
|
+
!value ||
|
|
91
|
+
typeof value.siteId !== "string" ||
|
|
92
|
+
!/^[0-9a-f-]{36}$/i.test(value.siteId) ||
|
|
93
|
+
(value.versionId !== undefined &&
|
|
94
|
+
(typeof value.versionId !== "string" || !/^[0-9a-f-]{36}$/i.test(value.versionId)))
|
|
95
|
+
)
|
|
96
|
+
throw new Error("Invalid Site reference");
|
|
97
|
+
return (
|
|
98
|
+
<SiteEmbed
|
|
99
|
+
key={`${props.workspaceId}:${value.siteId}:${value.versionId ?? "current"}`}
|
|
100
|
+
{...props}
|
|
101
|
+
siteId={value.siteId}
|
|
102
|
+
initialVersionId={value.versionId}
|
|
103
|
+
/>
|
|
104
|
+
);
|
|
105
|
+
} catch {
|
|
106
|
+
return <p role="alert">{labels.siteReferenceInvalid}</p>;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function InlineHtml({ content, toolBridge, theme }: ChatInteractiveBlockProps) {
|
|
111
|
+
const labels = useArtifactLabels();
|
|
112
|
+
const html = useMemo(() => inlineHtmlDocument(content), [content]);
|
|
113
|
+
const bridge = useMemo(() => toolBridge?.(), [toolBridge]);
|
|
114
|
+
return (
|
|
115
|
+
<ArtifactSandbox
|
|
116
|
+
title={labels.preview}
|
|
117
|
+
showTitle={false}
|
|
118
|
+
showLiveStatus={false}
|
|
119
|
+
html={html}
|
|
120
|
+
toolBridge={bridge}
|
|
121
|
+
height={INLINE_PREVIEW_HEIGHT}
|
|
122
|
+
className="h-full"
|
|
123
|
+
fill
|
|
124
|
+
theme={theme}
|
|
125
|
+
/>
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function SiteEmbed(
|
|
130
|
+
props: ChatInteractiveBlockProps & { siteId: string; initialVersionId?: string },
|
|
131
|
+
) {
|
|
132
|
+
const [versionId, setVersionId] = useState(props.initialVersionId);
|
|
133
|
+
return (
|
|
134
|
+
<SiteEmbedContent
|
|
135
|
+
key={versionId ?? "current"}
|
|
136
|
+
{...props}
|
|
137
|
+
versionId={versionId}
|
|
138
|
+
onVersionChange={setVersionId}
|
|
139
|
+
/>
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
function SiteEmbedContent({
|
|
144
|
+
workspaceId,
|
|
145
|
+
client,
|
|
146
|
+
toolBridge,
|
|
147
|
+
theme,
|
|
148
|
+
siteId,
|
|
149
|
+
versionId,
|
|
150
|
+
onVersionChange,
|
|
151
|
+
}: ChatInteractiveBlockProps & {
|
|
152
|
+
siteId: string;
|
|
153
|
+
versionId?: string | undefined;
|
|
154
|
+
onVersionChange: (id: string) => void;
|
|
155
|
+
}) {
|
|
156
|
+
const [loaded, setLoaded] = useState<{
|
|
157
|
+
client: SiteSnapshotClient;
|
|
158
|
+
snapshot: Awaited<ReturnType<typeof loadSiteSnapshot>>;
|
|
159
|
+
} | null>(null);
|
|
160
|
+
const snapshot = loaded?.client === client ? loaded.snapshot : null;
|
|
161
|
+
const [error, setError] = useState(false);
|
|
162
|
+
const [retry, setRetry] = useState(0);
|
|
163
|
+
useEffect(() => {
|
|
164
|
+
const abort = new AbortController();
|
|
165
|
+
setError(false);
|
|
166
|
+
setLoaded(null);
|
|
167
|
+
void loadSiteSnapshot(client, workspaceId, siteId, {
|
|
168
|
+
signal: abort.signal,
|
|
169
|
+
...(versionId ? { versionId } : {}),
|
|
170
|
+
})
|
|
171
|
+
.then((value) => {
|
|
172
|
+
if (!abort.signal.aborted) setLoaded({ client, snapshot: value });
|
|
173
|
+
})
|
|
174
|
+
.catch(() => {
|
|
175
|
+
if (!abort.signal.aborted) setError(true);
|
|
176
|
+
});
|
|
177
|
+
return () => abort.abort();
|
|
178
|
+
}, [client, workspaceId, siteId, versionId, retry]);
|
|
179
|
+
const content = snapshot?.content;
|
|
180
|
+
const bridge = useMemo(
|
|
181
|
+
() =>
|
|
182
|
+
content
|
|
183
|
+
? toolBridge?.({
|
|
184
|
+
artifactId: siteId,
|
|
185
|
+
siteVersionId: content.versionId,
|
|
186
|
+
requestedTools: content.requestedTools,
|
|
187
|
+
})
|
|
188
|
+
: undefined,
|
|
189
|
+
[toolBridge, siteId, content],
|
|
190
|
+
);
|
|
191
|
+
const open = useOpenGeniLinkResolver()?.({ kind: "site", artifactId: siteId, workspaceId });
|
|
192
|
+
const labels = useArtifactLabels();
|
|
193
|
+
if (error)
|
|
194
|
+
return (
|
|
195
|
+
<p role="alert">
|
|
196
|
+
{labels.siteLoadFailed}{" "}
|
|
197
|
+
<ArtifactButton size="sm" onClick={() => setRetry((v) => v + 1)}>
|
|
198
|
+
{labels.retry}
|
|
199
|
+
</ArtifactButton>
|
|
200
|
+
</p>
|
|
201
|
+
);
|
|
202
|
+
if (!snapshot) return <p role="status">{labels.loadingSite}</p>;
|
|
203
|
+
if (!content) return <p>{labels.siteUnpublished}</p>;
|
|
204
|
+
return (
|
|
205
|
+
<ArtifactSandbox
|
|
206
|
+
title={snapshot.detail.artifact.title}
|
|
207
|
+
html={content.html}
|
|
208
|
+
toolBridge={bridge}
|
|
209
|
+
height={SITE_PREVIEW_HEIGHT}
|
|
210
|
+
className="h-full"
|
|
211
|
+
fill
|
|
212
|
+
theme={theme}
|
|
213
|
+
headerControls={
|
|
214
|
+
<>
|
|
215
|
+
{/* One published version has nothing to choose; keep the bar for the title. */}
|
|
216
|
+
{snapshot.detail.versions.length > 1 ||
|
|
217
|
+
!snapshot.detail.versions.some((v) => v.id === content.versionId) ? (
|
|
218
|
+
<ArtifactSelect
|
|
219
|
+
aria-label={labels.siteVersion}
|
|
220
|
+
className="bg-transparent text-xs"
|
|
221
|
+
value={content.versionId}
|
|
222
|
+
onChange={(e) => onVersionChange(e.target.value)}
|
|
223
|
+
>
|
|
224
|
+
{!snapshot.detail.versions.some((v) => v.id === content.versionId) && (
|
|
225
|
+
<option value={content.versionId}>{labels.savedVersion}</option>
|
|
226
|
+
)}
|
|
227
|
+
{snapshot.detail.versions.map((v) => (
|
|
228
|
+
<option key={v.id} value={v.id}>
|
|
229
|
+
{labels.version(v.revision)}
|
|
230
|
+
</option>
|
|
231
|
+
))}
|
|
232
|
+
</ArtifactSelect>
|
|
233
|
+
) : null}
|
|
234
|
+
{open?.href ? (
|
|
235
|
+
<a
|
|
236
|
+
className="shrink-0 whitespace-nowrap text-xs underline"
|
|
237
|
+
href={open.href}
|
|
238
|
+
data-og-open-site=""
|
|
239
|
+
>
|
|
240
|
+
{labels.openSite}
|
|
241
|
+
</a>
|
|
242
|
+
) : open?.open ? (
|
|
243
|
+
<button
|
|
244
|
+
type="button"
|
|
245
|
+
className="shrink-0 cursor-pointer whitespace-nowrap text-xs underline"
|
|
246
|
+
data-og-open-site=""
|
|
247
|
+
onClick={() =>
|
|
248
|
+
void Promise.resolve()
|
|
249
|
+
.then(open.open)
|
|
250
|
+
.catch(() => undefined)
|
|
251
|
+
}
|
|
252
|
+
>
|
|
253
|
+
{labels.openSite}
|
|
254
|
+
</button>
|
|
255
|
+
) : null}
|
|
256
|
+
</>
|
|
257
|
+
}
|
|
258
|
+
/>
|
|
259
|
+
);
|
|
260
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { useEffect, useRef, useState, type ReactNode } from "react";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Reserve the chat slot before starting expensive media work. Activation is
|
|
5
|
+
* one-way: scrolling away must not discard an interactive preview's state.
|
|
6
|
+
* The timeline parks at its initial tip in layout effects before this observer
|
|
7
|
+
* is attached, so historical previews above the entry viewport stay dormant.
|
|
8
|
+
*/
|
|
9
|
+
export function DeferredChatMedia({
|
|
10
|
+
children,
|
|
11
|
+
height,
|
|
12
|
+
label,
|
|
13
|
+
actionLabel,
|
|
14
|
+
}: {
|
|
15
|
+
children: ReactNode;
|
|
16
|
+
height: number;
|
|
17
|
+
/** What is loading, as in "Load {label}". */
|
|
18
|
+
label?: string | undefined;
|
|
19
|
+
/** The complete (translated) activation label; overrides `label`. */
|
|
20
|
+
actionLabel?: string | undefined;
|
|
21
|
+
}) {
|
|
22
|
+
const host = useRef<HTMLDivElement>(null);
|
|
23
|
+
const [active, setActive] = useState(false);
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
const node = host.current;
|
|
26
|
+
if (active || !node) return;
|
|
27
|
+
if (typeof IntersectionObserver === "undefined") {
|
|
28
|
+
setActive(true);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
let disposed = false;
|
|
32
|
+
const observer = new IntersectionObserver(
|
|
33
|
+
(entries) => {
|
|
34
|
+
if (disposed || !entries.some((entry) => entry.isIntersecting)) return;
|
|
35
|
+
setActive(true);
|
|
36
|
+
observer.disconnect();
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
root: node.closest("[data-og-timeline-scroller]"),
|
|
40
|
+
rootMargin: "200px 0px",
|
|
41
|
+
},
|
|
42
|
+
);
|
|
43
|
+
observer.observe(node);
|
|
44
|
+
return () => {
|
|
45
|
+
disposed = true;
|
|
46
|
+
observer.disconnect();
|
|
47
|
+
};
|
|
48
|
+
}, [active]);
|
|
49
|
+
|
|
50
|
+
return (
|
|
51
|
+
<div ref={host} data-chat-media={active ? "active" : "deferred"}>
|
|
52
|
+
{active ? (
|
|
53
|
+
children
|
|
54
|
+
) : (
|
|
55
|
+
<div className="flex w-full items-center justify-center" style={{ height }}>
|
|
56
|
+
<button
|
|
57
|
+
type="button"
|
|
58
|
+
className="rounded-md px-3 py-2 text-sm text-fg-muted hover:text-fg focus-visible:outline-2 focus-visible:outline-ring"
|
|
59
|
+
onClick={() => setActive(true)}
|
|
60
|
+
>
|
|
61
|
+
{actionLabel ?? `Load ${label ?? "media"}`}
|
|
62
|
+
</button>
|
|
63
|
+
</div>
|
|
64
|
+
)}
|
|
65
|
+
</div>
|
|
66
|
+
);
|
|
67
|
+
}
|
|
@@ -204,6 +204,7 @@ export type DocumentProjectionArtifactSurfaceProps = Omit<
|
|
|
204
204
|
"ariaLabel" | "className"
|
|
205
205
|
> & {
|
|
206
206
|
title: string;
|
|
207
|
+
showHeader?: boolean | undefined;
|
|
207
208
|
subtitle?: ReactNode | undefined;
|
|
208
209
|
busy?: boolean | undefined;
|
|
209
210
|
className?: string | undefined;
|
|
@@ -212,6 +213,7 @@ export type DocumentProjectionArtifactSurfaceProps = Omit<
|
|
|
212
213
|
|
|
213
214
|
export type DocumentArtifactSurfaceProps = Omit<DocumentEditorProps, "ariaLabel" | "className"> & {
|
|
214
215
|
title: string;
|
|
216
|
+
showHeader?: boolean | undefined;
|
|
215
217
|
subtitle?: ReactNode | undefined;
|
|
216
218
|
busy?: boolean | undefined;
|
|
217
219
|
className?: string | undefined;
|
|
@@ -899,7 +901,7 @@ function DocumentEditorCore({
|
|
|
899
901
|
<button
|
|
900
902
|
type="button"
|
|
901
903
|
onClick={addFirstParagraph}
|
|
902
|
-
className="mt-3 rounded-og-md border border-og-border bg-og-
|
|
904
|
+
className="mt-3 rounded-og-md border border-og-primary-border bg-og-primary px-3 py-1.5 text-og-sm text-og-primary-fg hover:bg-og-primary-hover focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent"
|
|
903
905
|
>
|
|
904
906
|
Start writing
|
|
905
907
|
</button>
|
|
@@ -907,10 +909,27 @@ function DocumentEditorCore({
|
|
|
907
909
|
</div>
|
|
908
910
|
</div>
|
|
909
911
|
) : (
|
|
910
|
-
<div
|
|
912
|
+
<div
|
|
913
|
+
className="relative min-w-full"
|
|
914
|
+
style={{
|
|
915
|
+
height: axis.total,
|
|
916
|
+
minWidth:
|
|
917
|
+
layout === "paginated"
|
|
918
|
+
? pages.reduce(
|
|
919
|
+
(width, page) =>
|
|
920
|
+
Math.max(
|
|
921
|
+
width,
|
|
922
|
+
page.page.widthPt * POINT_TO_CSS_PIXEL * page.renderScale + 32,
|
|
923
|
+
),
|
|
924
|
+
0,
|
|
925
|
+
)
|
|
926
|
+
: undefined,
|
|
927
|
+
}}
|
|
928
|
+
>
|
|
911
929
|
{mountedIndexes.map((pageIndex) => {
|
|
912
930
|
const page = pages[pageIndex]!;
|
|
913
931
|
const top = axis.offsets[pageIndex]!;
|
|
932
|
+
const pageWidth = page.page.widthPt * POINT_TO_CSS_PIXEL * page.renderScale;
|
|
914
933
|
return (
|
|
915
934
|
<article
|
|
916
935
|
key={page.key}
|
|
@@ -923,19 +942,23 @@ function DocumentEditorCore({
|
|
|
923
942
|
className={cn(
|
|
924
943
|
"absolute overflow-hidden",
|
|
925
944
|
layout === "paginated"
|
|
926
|
-
? "
|
|
945
|
+
? "border shadow-og-sm"
|
|
927
946
|
: "left-0 right-0 border-b border-og-border bg-og-surface-1 text-og-fg",
|
|
928
947
|
)}
|
|
929
948
|
style={{
|
|
930
949
|
top,
|
|
950
|
+
// Center against the visible viewport, not the shared width
|
|
951
|
+
// reserved for the widest section in this document.
|
|
952
|
+
left:
|
|
953
|
+
layout === "paginated"
|
|
954
|
+
? Math.max(16, (measuredViewport.width - pageWidth) / 2)
|
|
955
|
+
: undefined,
|
|
931
956
|
color: layout === "paginated" ? "#171717" : undefined,
|
|
932
957
|
backgroundColor: layout === "paginated" ? "#fff" : undefined,
|
|
933
958
|
borderColor: layout === "paginated" ? "#0000001a" : undefined,
|
|
934
|
-
width:
|
|
935
|
-
layout === "paginated"
|
|
936
|
-
? page.page.widthPt * POINT_TO_CSS_PIXEL * page.renderScale
|
|
937
|
-
: undefined,
|
|
959
|
+
width: layout === "paginated" ? pageWidth : undefined,
|
|
938
960
|
height: page.height,
|
|
961
|
+
containerType: layout === "continuous" ? "inline-size" : undefined,
|
|
939
962
|
}}
|
|
940
963
|
>
|
|
941
964
|
<MeasuredPageBody
|
|
@@ -998,6 +1021,7 @@ function DocumentEditorCore({
|
|
|
998
1021
|
export function DocumentArtifactSurface({
|
|
999
1022
|
document,
|
|
1000
1023
|
title,
|
|
1024
|
+
showHeader,
|
|
1001
1025
|
subtitle,
|
|
1002
1026
|
busy,
|
|
1003
1027
|
className,
|
|
@@ -1008,6 +1032,7 @@ export function DocumentArtifactSurface({
|
|
|
1008
1032
|
<ArtifactSurface
|
|
1009
1033
|
modality="document"
|
|
1010
1034
|
title={title}
|
|
1035
|
+
showHeader={showHeader}
|
|
1011
1036
|
subtitle={subtitle}
|
|
1012
1037
|
busy={busy}
|
|
1013
1038
|
className={className}
|
|
@@ -1026,6 +1051,7 @@ export function DocumentArtifactSurface({
|
|
|
1026
1051
|
export function DocumentProjectionArtifactSurface({
|
|
1027
1052
|
projection,
|
|
1028
1053
|
title,
|
|
1054
|
+
showHeader,
|
|
1029
1055
|
subtitle,
|
|
1030
1056
|
busy,
|
|
1031
1057
|
className,
|
|
@@ -1036,6 +1062,7 @@ export function DocumentProjectionArtifactSurface({
|
|
|
1036
1062
|
<ArtifactSurface
|
|
1037
1063
|
modality="document"
|
|
1038
1064
|
title={title}
|
|
1065
|
+
showHeader={showHeader}
|
|
1039
1066
|
subtitle={subtitle}
|
|
1040
1067
|
busy={busy}
|
|
1041
1068
|
className={className}
|
|
@@ -1261,6 +1288,7 @@ const ParagraphLeaf = memo(
|
|
|
1261
1288
|
onKeyDown,
|
|
1262
1289
|
}: ParagraphLeafProps) {
|
|
1263
1290
|
const composing = useRef(false);
|
|
1291
|
+
const suppressNextEnter = useRef(false);
|
|
1264
1292
|
const Tag = headingTag(paragraph.style.headingLevel);
|
|
1265
1293
|
const label =
|
|
1266
1294
|
paragraph.style.list?.kind === "number"
|
|
@@ -1292,6 +1320,15 @@ const ParagraphLeaf = memo(
|
|
|
1292
1320
|
}}
|
|
1293
1321
|
onCompositionEnd={(event) => {
|
|
1294
1322
|
composing.current = false;
|
|
1323
|
+
// IME commit Enter often arrives in the same turn as compositionend.
|
|
1324
|
+
// Suppress that key so it cannot also insert a trailing newline, but
|
|
1325
|
+
// clear before the next task so a later explicit Enter still works.
|
|
1326
|
+
suppressNextEnter.current = true;
|
|
1327
|
+
queueMicrotask(() => {
|
|
1328
|
+
suppressNextEnter.current = false;
|
|
1329
|
+
});
|
|
1330
|
+
syncTrailingBreak(event.currentTarget);
|
|
1331
|
+
stabilizeCaretAfterTrailingNewline(event.currentTarget);
|
|
1295
1332
|
onInput(paragraph, event.currentTarget.textContent ?? "");
|
|
1296
1333
|
onSelection(paragraph);
|
|
1297
1334
|
}}
|
|
@@ -1316,15 +1353,18 @@ const ParagraphLeaf = memo(
|
|
|
1316
1353
|
onKeyDown={(event) => {
|
|
1317
1354
|
onKeyDown(event, paragraph);
|
|
1318
1355
|
if (event.defaultPrevented || readOnly) return;
|
|
1319
|
-
if (event.key
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1356
|
+
if (event.key !== "Enter" || event.metaKey || event.ctrlKey || event.altKey) return;
|
|
1357
|
+
if (isDocumentImeComposing(event, composing.current)) return;
|
|
1358
|
+
event.preventDefault();
|
|
1359
|
+
if (suppressNextEnter.current) return;
|
|
1360
|
+
insertPlainText(event.currentTarget, "\n");
|
|
1361
|
+
onInput(paragraph, event.currentTarget.textContent ?? "");
|
|
1362
|
+
onSelection(paragraph);
|
|
1325
1363
|
}}
|
|
1326
1364
|
onInput={(event) => {
|
|
1327
1365
|
if (!composing.current && !(event.nativeEvent as InputEvent).isComposing) {
|
|
1366
|
+
syncTrailingBreak(event.currentTarget);
|
|
1367
|
+
stabilizeCaretAfterTrailingNewline(event.currentTarget);
|
|
1328
1368
|
onInput(paragraph, event.currentTarget.textContent ?? "");
|
|
1329
1369
|
}
|
|
1330
1370
|
}}
|
|
@@ -1348,6 +1388,9 @@ const ParagraphLeaf = memo(
|
|
|
1348
1388
|
{segment.text}
|
|
1349
1389
|
</span>
|
|
1350
1390
|
))}
|
|
1391
|
+
{segments.at(-1)?.text.endsWith("\n") ? (
|
|
1392
|
+
<br data-og-trailing-break="" aria-hidden="true" />
|
|
1393
|
+
) : null}
|
|
1351
1394
|
</Tag>
|
|
1352
1395
|
);
|
|
1353
1396
|
},
|
|
@@ -1366,11 +1409,12 @@ function DocumentTableView({
|
|
|
1366
1409
|
viewBlockId: string;
|
|
1367
1410
|
}) {
|
|
1368
1411
|
const columnWidths = table.style.columnWidthsPt;
|
|
1412
|
+
const headerColor = tableHeaderTextColor(table.style.headerFill);
|
|
1369
1413
|
return (
|
|
1370
1414
|
<div
|
|
1371
1415
|
data-og-document-block={viewBlockId}
|
|
1372
1416
|
data-og-block-kind="table"
|
|
1373
|
-
className="overflow-x-auto py-2"
|
|
1417
|
+
className="w-full max-w-full overflow-x-auto py-2"
|
|
1374
1418
|
>
|
|
1375
1419
|
<table
|
|
1376
1420
|
className="w-full border-collapse text-left"
|
|
@@ -1406,6 +1450,8 @@ function DocumentTableView({
|
|
|
1406
1450
|
style={{
|
|
1407
1451
|
borderColor: table.style.borderColor ?? "#d1d5db",
|
|
1408
1452
|
background: header ? (table.style.headerFill ?? "#f3f4f6") : undefined,
|
|
1453
|
+
// An explicitly colored run still owns its authored text style.
|
|
1454
|
+
color: header ? headerColor : undefined,
|
|
1409
1455
|
padding: `${table.style.cellPaddingPt ?? 6}pt`,
|
|
1410
1456
|
}}
|
|
1411
1457
|
>
|
|
@@ -1427,6 +1473,42 @@ function DocumentTableView({
|
|
|
1427
1473
|
);
|
|
1428
1474
|
}
|
|
1429
1475
|
|
|
1476
|
+
/** Choose a theme-independent header color only when both light and dark backdrops allow one. */
|
|
1477
|
+
function tableHeaderTextColor(fill: string | undefined): string | undefined {
|
|
1478
|
+
if (!fill) return "#171717";
|
|
1479
|
+
const hex = /^#([\da-f]{3}|[\da-f]{6}|[\da-f]{8})$/i.exec(fill)?.[1];
|
|
1480
|
+
if (!hex) return undefined;
|
|
1481
|
+
const channels =
|
|
1482
|
+
hex.length === 3
|
|
1483
|
+
? [...hex].map((digit) => Number.parseInt(digit + digit, 16))
|
|
1484
|
+
: [0, 2, 4].map((index) => Number.parseInt(hex.slice(index, index + 2), 16));
|
|
1485
|
+
const alpha = hex.length === 8 ? Number.parseInt(hex.slice(6), 16) / 255 : 1;
|
|
1486
|
+
const luminanceOn = (backdrop: number) => {
|
|
1487
|
+
const linear = channels.map((channel) => {
|
|
1488
|
+
const normalized = (channel * alpha + backdrop * (1 - alpha)) / 255;
|
|
1489
|
+
return normalized <= 0.04045 ? normalized / 12.92 : ((normalized + 0.055) / 1.055) ** 2.4;
|
|
1490
|
+
});
|
|
1491
|
+
return linear[0]! * 0.2126 + linear[1]! * 0.7152 + linear[2]! * 0.0722;
|
|
1492
|
+
};
|
|
1493
|
+
// A paginated page is white; a continuous page follows its theme. For alpha
|
|
1494
|
+
// fills, choose a fixed foreground only if it contrasts on both extremes.
|
|
1495
|
+
const backdrops = alpha < 1 ? [luminanceOn(0), luminanceOn(255)] : [luminanceOn(255)];
|
|
1496
|
+
const darkTextLuminance = ((23 / 255 + 0.055) / 1.055) ** 2.4;
|
|
1497
|
+
const whiteContrast = Math.min(...backdrops.map((value) => 1.05 / (value + 0.05)));
|
|
1498
|
+
const darkContrast = Math.min(
|
|
1499
|
+
...backdrops.map(
|
|
1500
|
+
(value) =>
|
|
1501
|
+
(Math.max(value, darkTextLuminance) + 0.05) / (Math.min(value, darkTextLuminance) + 0.05),
|
|
1502
|
+
),
|
|
1503
|
+
);
|
|
1504
|
+
if (Math.max(whiteContrast, darkContrast) < 4.5) {
|
|
1505
|
+
// Opaque midtones need pure black where the softer #171717 cannot meet
|
|
1506
|
+
// normal-text contrast. Translucent fills inherit the theme's text color.
|
|
1507
|
+
return alpha < 1 ? undefined : "#000";
|
|
1508
|
+
}
|
|
1509
|
+
return whiteContrast > darkContrast ? "#fff" : "#171717";
|
|
1510
|
+
}
|
|
1511
|
+
|
|
1430
1512
|
function ToolbarButton({
|
|
1431
1513
|
label,
|
|
1432
1514
|
shortcut,
|
|
@@ -1617,7 +1699,9 @@ function responsiveDocumentPageScale(
|
|
|
1617
1699
|
): number {
|
|
1618
1700
|
if (viewportWidth <= 0) return 1;
|
|
1619
1701
|
const naturalWidth = page.widthPt * POINT_TO_CSS_PIXEL;
|
|
1620
|
-
|
|
1702
|
+
// Below this scale the page text becomes too small to read in a narrow dock.
|
|
1703
|
+
// The viewport can pan horizontally without changing the chosen layout.
|
|
1704
|
+
return Math.min(1, Math.max(0.75, (viewportWidth - 32) / naturalWidth));
|
|
1621
1705
|
}
|
|
1622
1706
|
|
|
1623
1707
|
function pageContentStyle(
|
|
@@ -1626,7 +1710,7 @@ function pageContentStyle(
|
|
|
1626
1710
|
): CSSProperties {
|
|
1627
1711
|
if (layout === "continuous") {
|
|
1628
1712
|
return {
|
|
1629
|
-
padding: "24px clamp(
|
|
1713
|
+
padding: "24px clamp(12px, 4cqw, 72px)",
|
|
1630
1714
|
};
|
|
1631
1715
|
}
|
|
1632
1716
|
return {
|
|
@@ -1753,6 +1837,45 @@ function selectionOffsets(root: HTMLElement | undefined): { start: number; end:
|
|
|
1753
1837
|
};
|
|
1754
1838
|
}
|
|
1755
1839
|
|
|
1840
|
+
const TRAILING_BREAK_ATTR = "data-og-trailing-break";
|
|
1841
|
+
|
|
1842
|
+
function isDocumentImeComposing(
|
|
1843
|
+
event: ReactKeyboardEvent<HTMLElement>,
|
|
1844
|
+
composing: boolean,
|
|
1845
|
+
): boolean {
|
|
1846
|
+
const native = event.nativeEvent;
|
|
1847
|
+
return composing || native.isComposing === true || native.keyCode === 229;
|
|
1848
|
+
}
|
|
1849
|
+
|
|
1850
|
+
function syncTrailingBreak(root: HTMLElement): void {
|
|
1851
|
+
const existing = root.querySelector(`br[${TRAILING_BREAK_ATTR}]`);
|
|
1852
|
+
const needsBreak = (root.textContent ?? "").endsWith("\n");
|
|
1853
|
+
if (needsBreak && !existing) {
|
|
1854
|
+
const br = globalThis.document.createElement("br");
|
|
1855
|
+
br.setAttribute(TRAILING_BREAK_ATTR, "");
|
|
1856
|
+
br.setAttribute("aria-hidden", "true");
|
|
1857
|
+
root.appendChild(br);
|
|
1858
|
+
} else if (!needsBreak && existing) {
|
|
1859
|
+
existing.remove();
|
|
1860
|
+
}
|
|
1861
|
+
}
|
|
1862
|
+
|
|
1863
|
+
function stabilizeCaretAfterTrailingNewline(root: HTMLElement): void {
|
|
1864
|
+
const text = root.textContent ?? "";
|
|
1865
|
+
if (!text.endsWith("\n")) return;
|
|
1866
|
+
const selection = globalThis.getSelection?.();
|
|
1867
|
+
if (!selection || selection.rangeCount === 0 || !selection.isCollapsed) return;
|
|
1868
|
+
const offsets = selectionOffsets(root);
|
|
1869
|
+
if (!offsets || offsets.start !== text.length) return;
|
|
1870
|
+
const br = root.querySelector(`br[${TRAILING_BREAK_ATTR}]`);
|
|
1871
|
+
if (!br) return;
|
|
1872
|
+
const range = globalThis.document.createRange();
|
|
1873
|
+
range.setStartBefore(br);
|
|
1874
|
+
range.collapse(true);
|
|
1875
|
+
selection.removeAllRanges();
|
|
1876
|
+
selection.addRange(range);
|
|
1877
|
+
}
|
|
1878
|
+
|
|
1756
1879
|
function insertPlainText(root: HTMLElement, text: string): void {
|
|
1757
1880
|
const selection = globalThis.getSelection?.();
|
|
1758
1881
|
if (!selection || selection.rangeCount === 0) return;
|
|
@@ -1761,10 +1884,12 @@ function insertPlainText(root: HTMLElement, text: string): void {
|
|
|
1761
1884
|
range.deleteContents();
|
|
1762
1885
|
const node = globalThis.document.createTextNode(text);
|
|
1763
1886
|
range.insertNode(node);
|
|
1887
|
+
syncTrailingBreak(root);
|
|
1764
1888
|
range.setStartAfter(node);
|
|
1765
1889
|
range.collapse(true);
|
|
1766
1890
|
selection.removeAllRanges();
|
|
1767
1891
|
selection.addRange(range);
|
|
1892
|
+
stabilizeCaretAfterTrailingNewline(root);
|
|
1768
1893
|
}
|
|
1769
1894
|
|
|
1770
1895
|
function restoreSelection(
|
|
@@ -60,10 +60,12 @@ export function EditableArtifactMessage({
|
|
|
60
60
|
title,
|
|
61
61
|
detail,
|
|
62
62
|
retry,
|
|
63
|
+
retryLabel = "Retry",
|
|
63
64
|
}: {
|
|
64
65
|
title: string;
|
|
65
66
|
detail: string;
|
|
66
67
|
retry?: (() => void) | undefined;
|
|
68
|
+
retryLabel?: string | undefined;
|
|
67
69
|
}) {
|
|
68
70
|
return (
|
|
69
71
|
<div className="grid h-full min-h-56 place-items-center bg-og-bg p-6 text-center">
|
|
@@ -74,9 +76,9 @@ export function EditableArtifactMessage({
|
|
|
74
76
|
<button
|
|
75
77
|
type="button"
|
|
76
78
|
onClick={retry}
|
|
77
|
-
className="mt-3 rounded-og-sm bg-og-
|
|
79
|
+
className="mt-3 rounded-og-sm border border-og-primary-border bg-og-primary text-og-primary-fg px-3 py-1.5 text-og-sm font-medium hover:bg-og-primary-hover outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent"
|
|
78
80
|
>
|
|
79
|
-
|
|
81
|
+
{retryLabel}
|
|
80
82
|
</button>
|
|
81
83
|
) : null}
|
|
82
84
|
</div>
|