@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
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
import { SESSION_SCOPE_HEADER, type ClientConfig, type OpenGeniClient } from "@opengeni/sdk";
|
|
2
|
+
import { createEditableArtifactReplicaId } from "@opengeni/sdk/editable-artifacts";
|
|
3
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
4
|
+
|
|
5
|
+
import { cn } from "../../lib/cn";
|
|
6
|
+
import { useOpenGeni, type ClientOverride } from "../../session-context";
|
|
7
|
+
import {
|
|
8
|
+
ArtifactLabelsProvider,
|
|
9
|
+
ArtifactLoading,
|
|
10
|
+
ArtifactProblem,
|
|
11
|
+
ArtifactViewerHeader,
|
|
12
|
+
artifactLoadErrorView,
|
|
13
|
+
useArtifactLabels,
|
|
14
|
+
type ArtifactKind,
|
|
15
|
+
type ArtifactLabels,
|
|
16
|
+
} from "./artifact-chrome";
|
|
17
|
+
import { EditableArtifactView, type EditableArtifactRuntimes } from "./editable-artifact-view";
|
|
18
|
+
import type { SiteToolBridgeFactory } from "./chat-interactive-block";
|
|
19
|
+
import { SiteView } from "./site-view";
|
|
20
|
+
|
|
21
|
+
/** An artifact opened from a session: the targets agent links and Site previews name. */
|
|
22
|
+
export type SessionArtifactTarget = Readonly<
|
|
23
|
+
| { kind: "editable-artifact"; artifactId: string; title?: string | undefined }
|
|
24
|
+
| { kind: "site"; artifactId: string; title?: string | undefined }
|
|
25
|
+
>;
|
|
26
|
+
|
|
27
|
+
/** Every string the viewer shows, including its Site frame and states. */
|
|
28
|
+
export type SessionArtifactViewerLabels = Partial<ArtifactLabels>;
|
|
29
|
+
|
|
30
|
+
export type SessionArtifactViewerProps = ClientOverride &
|
|
31
|
+
Readonly<{
|
|
32
|
+
/** The conversation the artifact belongs to; the proxy only serves its artifacts. */
|
|
33
|
+
sessionId: string;
|
|
34
|
+
target: SessionArtifactTarget;
|
|
35
|
+
onClose: () => void;
|
|
36
|
+
/** Show a Back control, for example to return to the conversation on phones. */
|
|
37
|
+
onBack?: (() => void) | undefined;
|
|
38
|
+
/** Browser kernels and Worker for documents, spreadsheets, and presentations. */
|
|
39
|
+
editableRuntimes?: EditableArtifactRuntimes | undefined;
|
|
40
|
+
theme?: "light" | "dark" | undefined;
|
|
41
|
+
/** Host-owned Site API access; omit it and Sites render without workspace tools. */
|
|
42
|
+
siteToolBridge?: SiteToolBridgeFactory | undefined;
|
|
43
|
+
labels?: SessionArtifactViewerLabels | undefined;
|
|
44
|
+
className?: string | undefined;
|
|
45
|
+
}>;
|
|
46
|
+
|
|
47
|
+
type ViewerClient = Pick<
|
|
48
|
+
OpenGeniClient,
|
|
49
|
+
| "withHeaders"
|
|
50
|
+
| "apiUrl"
|
|
51
|
+
| "fetchApi"
|
|
52
|
+
| "getClientConfig"
|
|
53
|
+
| "getEditableArtifact"
|
|
54
|
+
| "getWorkspaceArtifact"
|
|
55
|
+
| "getWorkspaceArtifactHtml"
|
|
56
|
+
>;
|
|
57
|
+
|
|
58
|
+
const viewerClientKeys = new WeakMap<ViewerClient, string>();
|
|
59
|
+
|
|
60
|
+
function viewerClientKey(client: ViewerClient): string {
|
|
61
|
+
let key = viewerClientKeys.get(client);
|
|
62
|
+
if (!key) {
|
|
63
|
+
key = crypto.randomUUID();
|
|
64
|
+
viewerClientKeys.set(client, key);
|
|
65
|
+
}
|
|
66
|
+
return key;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* A host-mountable viewer for one editable artifact or Site from a session,
|
|
71
|
+
* with its own header (title, Back, Close). Mount it in any sized container
|
|
72
|
+
* (a side panel, a sheet); it fills it. Data flows through the provider's
|
|
73
|
+
* client and `createSessionProxyHandler({ artifacts: true })`, scoped to
|
|
74
|
+
* `sessionId`.
|
|
75
|
+
*/
|
|
76
|
+
export function SessionArtifactViewer({ labels, ...props }: SessionArtifactViewerProps) {
|
|
77
|
+
return (
|
|
78
|
+
<ArtifactLabelsProvider labels={labels}>
|
|
79
|
+
<Viewer {...props} />
|
|
80
|
+
</ArtifactLabelsProvider>
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function Viewer({
|
|
85
|
+
client: clientOverride,
|
|
86
|
+
workspaceId: workspaceOverride,
|
|
87
|
+
sessionId,
|
|
88
|
+
target,
|
|
89
|
+
onClose,
|
|
90
|
+
onBack,
|
|
91
|
+
editableRuntimes,
|
|
92
|
+
theme,
|
|
93
|
+
siteToolBridge,
|
|
94
|
+
className,
|
|
95
|
+
}: Omit<SessionArtifactViewerProps, "labels">) {
|
|
96
|
+
const labels = useArtifactLabels();
|
|
97
|
+
const context = useOpenGeni({ client: clientOverride, workspaceId: workspaceOverride });
|
|
98
|
+
const base = context.client as unknown as ViewerClient;
|
|
99
|
+
const workspaceId = context.workspaceId;
|
|
100
|
+
const client = useMemo(
|
|
101
|
+
() => base.withHeaders({ [SESSION_SCOPE_HEADER]: sessionId }),
|
|
102
|
+
[base, sessionId],
|
|
103
|
+
);
|
|
104
|
+
const [loaded, setLoaded] = useState<{
|
|
105
|
+
key: string;
|
|
106
|
+
client: ViewerClient;
|
|
107
|
+
workspaceId: string;
|
|
108
|
+
title: string;
|
|
109
|
+
kind: ArtifactKind | null;
|
|
110
|
+
} | null>(null);
|
|
111
|
+
const targetKey = `${target.kind}:${target.artifactId}`;
|
|
112
|
+
const current =
|
|
113
|
+
loaded?.key === targetKey && loaded.client === client && loaded.workspaceId === workspaceId
|
|
114
|
+
? loaded
|
|
115
|
+
: null;
|
|
116
|
+
const kind: ArtifactKind | null = target.kind === "site" ? "site" : (current?.kind ?? null);
|
|
117
|
+
const [unavailable, setUnavailable] = useState<{
|
|
118
|
+
key: string;
|
|
119
|
+
client: ViewerClient;
|
|
120
|
+
workspaceId: string;
|
|
121
|
+
} | null>(null);
|
|
122
|
+
const markUnavailable = useCallback(
|
|
123
|
+
() => setUnavailable({ key: targetKey, client, workspaceId }),
|
|
124
|
+
[client, targetKey, workspaceId],
|
|
125
|
+
);
|
|
126
|
+
const title =
|
|
127
|
+
current?.title ??
|
|
128
|
+
target.title ??
|
|
129
|
+
(unavailable?.key === targetKey &&
|
|
130
|
+
unavailable.client === client &&
|
|
131
|
+
unavailable.workspaceId === workspaceId
|
|
132
|
+
? labels.artifact
|
|
133
|
+
: labels.opening);
|
|
134
|
+
return (
|
|
135
|
+
<section
|
|
136
|
+
aria-label={title}
|
|
137
|
+
data-og-artifact-viewer={target.kind}
|
|
138
|
+
className={cn("og-root flex h-full min-h-0 w-full min-w-0 flex-col bg-bg text-fg", className)}
|
|
139
|
+
>
|
|
140
|
+
<ArtifactViewerHeader
|
|
141
|
+
kind={kind}
|
|
142
|
+
title={title}
|
|
143
|
+
onBack={onBack}
|
|
144
|
+
backLabel={labels.back}
|
|
145
|
+
onClose={onClose}
|
|
146
|
+
closeLabel={labels.close}
|
|
147
|
+
/>
|
|
148
|
+
<div className="flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden">
|
|
149
|
+
{target.kind === "site" ? (
|
|
150
|
+
<SiteView
|
|
151
|
+
key={targetKey}
|
|
152
|
+
client={client}
|
|
153
|
+
workspaceId={workspaceId}
|
|
154
|
+
siteId={target.artifactId}
|
|
155
|
+
theme={theme}
|
|
156
|
+
toolBridge={siteToolBridge}
|
|
157
|
+
showTitle={false}
|
|
158
|
+
onTitle={(next) =>
|
|
159
|
+
setLoaded({ key: targetKey, client, workspaceId, title: next, kind: "site" })
|
|
160
|
+
}
|
|
161
|
+
/>
|
|
162
|
+
) : (
|
|
163
|
+
<EditableBody
|
|
164
|
+
key={targetKey}
|
|
165
|
+
client={client}
|
|
166
|
+
workspaceId={workspaceId}
|
|
167
|
+
sessionId={sessionId}
|
|
168
|
+
artifactId={target.artifactId}
|
|
169
|
+
runtimes={editableRuntimes}
|
|
170
|
+
onOpened={(next, modality) =>
|
|
171
|
+
setLoaded({ key: targetKey, client, workspaceId, title: next, kind: modality })
|
|
172
|
+
}
|
|
173
|
+
onUnavailable={markUnavailable}
|
|
174
|
+
/>
|
|
175
|
+
)}
|
|
176
|
+
</div>
|
|
177
|
+
</section>
|
|
178
|
+
);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
function EditableBody({
|
|
182
|
+
client,
|
|
183
|
+
workspaceId,
|
|
184
|
+
sessionId,
|
|
185
|
+
artifactId,
|
|
186
|
+
runtimes,
|
|
187
|
+
onOpened,
|
|
188
|
+
onUnavailable,
|
|
189
|
+
}: {
|
|
190
|
+
client: ViewerClient;
|
|
191
|
+
workspaceId: string;
|
|
192
|
+
sessionId: string;
|
|
193
|
+
artifactId: string;
|
|
194
|
+
runtimes: EditableArtifactRuntimes | undefined;
|
|
195
|
+
onOpened: (title: string, modality: ArtifactKind) => void;
|
|
196
|
+
onUnavailable: () => void;
|
|
197
|
+
}) {
|
|
198
|
+
const labels = useArtifactLabels();
|
|
199
|
+
const clientKey = viewerClientKey(client);
|
|
200
|
+
const [retryEpoch, setRetryEpoch] = useState(0);
|
|
201
|
+
const [configState, setConfigState] = useState<{
|
|
202
|
+
client: ViewerClient;
|
|
203
|
+
workspaceId: string;
|
|
204
|
+
sessionId: string;
|
|
205
|
+
result:
|
|
206
|
+
| { kind: "ready"; config: NonNullable<ClientConfig["artifacts"]> }
|
|
207
|
+
| { kind: "unavailable" }
|
|
208
|
+
| { kind: "error"; error: unknown };
|
|
209
|
+
} | null>(null);
|
|
210
|
+
const current =
|
|
211
|
+
configState?.client === client &&
|
|
212
|
+
configState.workspaceId === workspaceId &&
|
|
213
|
+
configState.sessionId === sessionId
|
|
214
|
+
? configState.result
|
|
215
|
+
: null;
|
|
216
|
+
const config = current?.kind === "ready" ? current.config : null;
|
|
217
|
+
const scopeRef = useRef({ client, workspaceId, sessionId });
|
|
218
|
+
scopeRef.current = { client, workspaceId, sessionId };
|
|
219
|
+
useEffect(() => {
|
|
220
|
+
let live = true;
|
|
221
|
+
setConfigState(null);
|
|
222
|
+
client.getClientConfig().then(
|
|
223
|
+
(value) =>
|
|
224
|
+
live &&
|
|
225
|
+
setConfigState({
|
|
226
|
+
client,
|
|
227
|
+
workspaceId,
|
|
228
|
+
sessionId,
|
|
229
|
+
result: value.artifacts
|
|
230
|
+
? { kind: "ready", config: value.artifacts }
|
|
231
|
+
: { kind: "unavailable" },
|
|
232
|
+
}),
|
|
233
|
+
(error: unknown) =>
|
|
234
|
+
live &&
|
|
235
|
+
setConfigState({ client, workspaceId, sessionId, result: { kind: "error", error } }),
|
|
236
|
+
);
|
|
237
|
+
return () => {
|
|
238
|
+
live = false;
|
|
239
|
+
};
|
|
240
|
+
}, [client, retryEpoch, sessionId, workspaceId]);
|
|
241
|
+
const baseUrl = useMemo(
|
|
242
|
+
() => new URL(client.apiUrl("/"), globalThis.location?.href ?? "http://localhost/"),
|
|
243
|
+
[client],
|
|
244
|
+
);
|
|
245
|
+
const transport = useMemo(() => {
|
|
246
|
+
if (!config) return undefined;
|
|
247
|
+
const socket = new URL(config.editableLiveUrl);
|
|
248
|
+
let scope = new AbortController();
|
|
249
|
+
const checkCurrent = (signal: AbortSignal) => {
|
|
250
|
+
signal.throwIfAborted();
|
|
251
|
+
if (
|
|
252
|
+
scopeRef.current.client !== client ||
|
|
253
|
+
scopeRef.current.workspaceId !== workspaceId ||
|
|
254
|
+
scopeRef.current.sessionId !== sessionId
|
|
255
|
+
) {
|
|
256
|
+
throw new DOMException("Artifact viewer scope changed", "AbortError");
|
|
257
|
+
}
|
|
258
|
+
};
|
|
259
|
+
return {
|
|
260
|
+
activate: () => {
|
|
261
|
+
if (scope.signal.aborted) scope = new AbortController();
|
|
262
|
+
},
|
|
263
|
+
abort: () => scope.abort(),
|
|
264
|
+
fetch: (async (input: RequestInfo | URL, init?: RequestInit) => {
|
|
265
|
+
const signal = AbortSignal.any([scope.signal, ...(init?.signal ? [init.signal] : [])]);
|
|
266
|
+
checkCurrent(signal);
|
|
267
|
+
const url = new URL(input instanceof Request ? input.url : input, baseUrl);
|
|
268
|
+
if (
|
|
269
|
+
init?.method === "POST" &&
|
|
270
|
+
url.pathname ===
|
|
271
|
+
new URL(
|
|
272
|
+
`v1/workspaces/${encodeURIComponent(workspaceId)}/editable-artifacts/${encodeURIComponent(artifactId)}/live-ticket`,
|
|
273
|
+
baseUrl,
|
|
274
|
+
).pathname
|
|
275
|
+
) {
|
|
276
|
+
// A reconnect must revalidate the current host principal before
|
|
277
|
+
// minting a ticket for the editor's retained cache partition.
|
|
278
|
+
const next = (await client.getClientConfig({ signal })).artifacts;
|
|
279
|
+
checkCurrent(signal);
|
|
280
|
+
if (!next || artifactCapabilityKey(next) !== artifactCapabilityKey(config)) {
|
|
281
|
+
setConfigState({
|
|
282
|
+
client,
|
|
283
|
+
workspaceId,
|
|
284
|
+
sessionId,
|
|
285
|
+
result: next ? { kind: "ready", config: next } : { kind: "unavailable" },
|
|
286
|
+
});
|
|
287
|
+
scope.abort();
|
|
288
|
+
signal.throwIfAborted();
|
|
289
|
+
}
|
|
290
|
+
const { replicaId } = (await new Request(input, init).json()) as {
|
|
291
|
+
replicaId?: unknown;
|
|
292
|
+
};
|
|
293
|
+
if (typeof replicaId !== "string") throw new TypeError("Artifact replica is required");
|
|
294
|
+
await client.getEditableArtifact(workspaceId, artifactId, { replicaId, signal });
|
|
295
|
+
checkCurrent(signal);
|
|
296
|
+
}
|
|
297
|
+
return client.fetchApi(url, { ...init, signal });
|
|
298
|
+
}) as typeof fetch,
|
|
299
|
+
webSocketUrl: socket,
|
|
300
|
+
...(isLoopback(baseUrl) && isLoopback(socket)
|
|
301
|
+
? { allowInsecureDevelopmentTransport: true }
|
|
302
|
+
: {}),
|
|
303
|
+
};
|
|
304
|
+
}, [artifactId, baseUrl, client, config, sessionId, workspaceId]);
|
|
305
|
+
useEffect(() => {
|
|
306
|
+
transport?.activate();
|
|
307
|
+
return () => transport?.abort();
|
|
308
|
+
}, [transport]);
|
|
309
|
+
const blocked = current !== null && (current.kind !== "ready" || !runtimes);
|
|
310
|
+
useEffect(() => {
|
|
311
|
+
if (blocked) onUnavailable();
|
|
312
|
+
}, [blocked, onUnavailable]);
|
|
313
|
+
if (!current) return <ArtifactLoading label={labels.opening} />;
|
|
314
|
+
if (current.kind === "error") {
|
|
315
|
+
return (
|
|
316
|
+
<ArtifactProblem
|
|
317
|
+
view={artifactLoadErrorView(current.error, "editable", labels)}
|
|
318
|
+
onRetry={() => setRetryEpoch((value) => value + 1)}
|
|
319
|
+
/>
|
|
320
|
+
);
|
|
321
|
+
}
|
|
322
|
+
if (!config || !transport) {
|
|
323
|
+
return <ArtifactProblem view={{ ...labels.viewingDisabled, retryable: false }} />;
|
|
324
|
+
}
|
|
325
|
+
if (!runtimes) {
|
|
326
|
+
return <ArtifactProblem view={{ ...labels.editorsMissing, retryable: false }} />;
|
|
327
|
+
}
|
|
328
|
+
return (
|
|
329
|
+
<EditableArtifactView
|
|
330
|
+
baseUrl={baseUrl}
|
|
331
|
+
workspaceId={workspaceId}
|
|
332
|
+
artifactId={artifactId}
|
|
333
|
+
authorityKey={JSON.stringify([clientKey, sessionId, artifactCapabilityKey(config)])}
|
|
334
|
+
runtimes={{
|
|
335
|
+
...runtimes,
|
|
336
|
+
...(isLoopback(baseUrl) ? { allowInsecureDevelopmentAssets: true } : {}),
|
|
337
|
+
}}
|
|
338
|
+
transport={transport}
|
|
339
|
+
showHeader={false}
|
|
340
|
+
open={async (signal) => {
|
|
341
|
+
const replicaId = createEditableArtifactReplicaId();
|
|
342
|
+
const artifact = await client.getEditableArtifact(workspaceId, artifactId, {
|
|
343
|
+
replicaId,
|
|
344
|
+
signal,
|
|
345
|
+
});
|
|
346
|
+
signal.throwIfAborted();
|
|
347
|
+
onOpened(artifact.title, artifact.modality);
|
|
348
|
+
return {
|
|
349
|
+
artifact,
|
|
350
|
+
replicaId,
|
|
351
|
+
authority: {
|
|
352
|
+
deploymentOrigin: baseUrl.origin,
|
|
353
|
+
workspaceId,
|
|
354
|
+
...config.cachePartition,
|
|
355
|
+
},
|
|
356
|
+
};
|
|
357
|
+
}}
|
|
358
|
+
/>
|
|
359
|
+
);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
function artifactCapabilityKey(config: NonNullable<ClientConfig["artifacts"]>): string {
|
|
363
|
+
return JSON.stringify([
|
|
364
|
+
config.editableLiveUrl,
|
|
365
|
+
config.cachePartition.accountId,
|
|
366
|
+
config.cachePartition.principalId,
|
|
367
|
+
config.cachePartition.authorizationEpoch,
|
|
368
|
+
]);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
function isLoopback(url: URL): boolean {
|
|
372
|
+
return (
|
|
373
|
+
(url.protocol === "http:" || url.protocol === "ws:") &&
|
|
374
|
+
(url.hostname === "localhost" || url.hostname === "127.0.0.1" || url.hostname === "[::1]")
|
|
375
|
+
);
|
|
376
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
2
|
+
|
|
3
|
+
import { loadSiteSnapshot } from "../../sites-ui";
|
|
4
|
+
import {
|
|
5
|
+
ArtifactLoading,
|
|
6
|
+
ArtifactProblem,
|
|
7
|
+
artifactLoadErrorView,
|
|
8
|
+
useArtifactLabels,
|
|
9
|
+
} from "./artifact-chrome";
|
|
10
|
+
import { ArtifactSandbox } from "./artifact-sandbox";
|
|
11
|
+
import type { SiteSnapshotClient, SiteToolBridgeFactory } from "./chat-interactive-block";
|
|
12
|
+
|
|
13
|
+
type Snapshot = Awaited<ReturnType<typeof loadSiteSnapshot>>;
|
|
14
|
+
|
|
15
|
+
export type SiteViewProps = {
|
|
16
|
+
client: SiteSnapshotClient;
|
|
17
|
+
workspaceId: string;
|
|
18
|
+
siteId: string;
|
|
19
|
+
/** Host-owned Site API access. Omit it and the Site renders without workspace tools. */
|
|
20
|
+
toolBridge?: SiteToolBridgeFactory | undefined;
|
|
21
|
+
theme?: "light" | "dark" | undefined;
|
|
22
|
+
/** Shown instead of the archived notice; the console links to its full page. */
|
|
23
|
+
archivedMessage?: string | undefined;
|
|
24
|
+
/** Show the Site title in the frame bar; hide it under a host header that already does. */
|
|
25
|
+
showTitle?: boolean | undefined;
|
|
26
|
+
/** Loading copy; defaults to "Loading Site…". */
|
|
27
|
+
loadingLabel?: string | undefined;
|
|
28
|
+
/** Called with the loaded title, for a host header. */
|
|
29
|
+
onTitle?: ((title: string) => void) | undefined;
|
|
30
|
+
className?: string | undefined;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* A published Site filling its container: the console's session dock and an
|
|
35
|
+
* embedding host's artifact viewer render the same view.
|
|
36
|
+
*/
|
|
37
|
+
export function SiteView({
|
|
38
|
+
client,
|
|
39
|
+
workspaceId,
|
|
40
|
+
siteId,
|
|
41
|
+
toolBridge,
|
|
42
|
+
theme,
|
|
43
|
+
archivedMessage,
|
|
44
|
+
showTitle = true,
|
|
45
|
+
loadingLabel,
|
|
46
|
+
onTitle,
|
|
47
|
+
className,
|
|
48
|
+
}: SiteViewProps) {
|
|
49
|
+
const labels = useArtifactLabels();
|
|
50
|
+
const [snapshot, setSnapshot] = useState<Snapshot | null>(null);
|
|
51
|
+
const [error, setError] = useState<unknown>(null);
|
|
52
|
+
const readAbort = useRef<AbortController | null>(null);
|
|
53
|
+
const onTitleRef = useRef(onTitle);
|
|
54
|
+
onTitleRef.current = onTitle;
|
|
55
|
+
const load = useCallback(async () => {
|
|
56
|
+
readAbort.current?.abort();
|
|
57
|
+
const abort = new AbortController();
|
|
58
|
+
readAbort.current = abort;
|
|
59
|
+
try {
|
|
60
|
+
setError(null);
|
|
61
|
+
const next = await loadSiteSnapshot(client, workspaceId, siteId, {
|
|
62
|
+
signal: abort.signal,
|
|
63
|
+
includeArchivedContent: true,
|
|
64
|
+
});
|
|
65
|
+
if (abort.signal.aborted) return;
|
|
66
|
+
setSnapshot(next);
|
|
67
|
+
onTitleRef.current?.(next.detail.artifact.title);
|
|
68
|
+
} catch (nextError) {
|
|
69
|
+
if (abort.signal.aborted) return;
|
|
70
|
+
setSnapshot(null);
|
|
71
|
+
setError(nextError);
|
|
72
|
+
}
|
|
73
|
+
}, [client, siteId, workspaceId]);
|
|
74
|
+
useEffect(() => {
|
|
75
|
+
setSnapshot(null);
|
|
76
|
+
void load();
|
|
77
|
+
return () => readAbort.current?.abort();
|
|
78
|
+
}, [load]);
|
|
79
|
+
const content = snapshot?.content;
|
|
80
|
+
const bridge = useMemo(
|
|
81
|
+
() =>
|
|
82
|
+
content
|
|
83
|
+
? toolBridge?.({
|
|
84
|
+
artifactId: siteId,
|
|
85
|
+
siteVersionId: content.versionId,
|
|
86
|
+
requestedTools: content.requestedTools,
|
|
87
|
+
})
|
|
88
|
+
: undefined,
|
|
89
|
+
[content, siteId, toolBridge],
|
|
90
|
+
);
|
|
91
|
+
if (error)
|
|
92
|
+
return (
|
|
93
|
+
<ArtifactProblem
|
|
94
|
+
view={artifactLoadErrorView(error, "site", labels)}
|
|
95
|
+
onRetry={() => void load()}
|
|
96
|
+
/>
|
|
97
|
+
);
|
|
98
|
+
if (!snapshot || !content) return <ArtifactLoading label={loadingLabel ?? labels.loadingSite} />;
|
|
99
|
+
if (snapshot.detail.artifact.status === "archived")
|
|
100
|
+
return (
|
|
101
|
+
<div className="p-4 text-sm text-fg-muted">{archivedMessage ?? labels.siteArchived}</div>
|
|
102
|
+
);
|
|
103
|
+
return (
|
|
104
|
+
<ArtifactSandbox
|
|
105
|
+
html={content.html}
|
|
106
|
+
title={snapshot.detail.artifact.title}
|
|
107
|
+
showTitle={showTitle}
|
|
108
|
+
versionLabel={`v${snapshot.detail.artifact.currentVersion?.revision}`}
|
|
109
|
+
toolBridge={bridge}
|
|
110
|
+
connectedToolCount={content.requestedTools.length}
|
|
111
|
+
theme={theme}
|
|
112
|
+
fill
|
|
113
|
+
className={className ?? "h-full rounded-none border-0"}
|
|
114
|
+
/>
|
|
115
|
+
);
|
|
116
|
+
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { formatSpreadsheetGeneralDisplay } from "./spreadsheet-general-display";
|
|
2
|
+
|
|
1
3
|
const TILE_SIZE = 256;
|
|
2
4
|
const MAX_CACHE_PHYSICAL_PIXELS = 32_000_000;
|
|
3
5
|
const MAX_CACHE_TILES = 96;
|
|
@@ -430,7 +432,7 @@ export class SpreadsheetCanvasRenderer {
|
|
|
430
432
|
|
|
431
433
|
for (const cell of cells) {
|
|
432
434
|
const value = input.projection.valueAt(cell);
|
|
433
|
-
const text =
|
|
435
|
+
const text = formatSpreadsheetGeneralDisplay(value);
|
|
434
436
|
if (!text) continue;
|
|
435
437
|
paintCellText(context, input, cell, text, tileLeft, tileTop);
|
|
436
438
|
}
|
|
@@ -550,7 +552,7 @@ function paintSelection(context: CanvasRenderingContext2D, input: SpreadsheetCan
|
|
|
550
552
|
const bottom =
|
|
551
553
|
input.columnHeaderHeight + input.rows.offsetAt(selection.bottom + 1) - input.logicalScrollTop;
|
|
552
554
|
context.save();
|
|
553
|
-
setFill(context, input.theme.accent, "#
|
|
555
|
+
setFill(context, input.theme.accent, "#545454");
|
|
554
556
|
context.globalAlpha = 0.1;
|
|
555
557
|
context.fillRect(left, top, right - left, bottom - top);
|
|
556
558
|
context.restore();
|
|
@@ -562,7 +564,7 @@ function paintSelection(context: CanvasRenderingContext2D, input: SpreadsheetCan
|
|
|
562
564
|
const activeWidth = input.columns.sizeAt(selection.focusColumn);
|
|
563
565
|
const activeHeight = input.rows.sizeAt(selection.focusRow);
|
|
564
566
|
context.save();
|
|
565
|
-
setStroke(context, input.theme.accent, "#
|
|
567
|
+
setStroke(context, input.theme.accent, "#545454");
|
|
566
568
|
context.lineWidth = 2;
|
|
567
569
|
context.strokeRect(
|
|
568
570
|
activeLeft + 1,
|
|
@@ -776,13 +778,6 @@ function finitePositive(value: number | undefined, fallback: number): number {
|
|
|
776
778
|
return value !== undefined && Number.isFinite(value) && value > 0 ? value : fallback;
|
|
777
779
|
}
|
|
778
780
|
|
|
779
|
-
function displayValue(value: unknown): string {
|
|
780
|
-
if (value === null || value === undefined) return "";
|
|
781
|
-
if (value instanceof Date) return Number.isNaN(value.getTime()) ? "" : value.toLocaleDateString();
|
|
782
|
-
if (typeof value === "boolean") return value ? "TRUE" : "FALSE";
|
|
783
|
-
return String(value);
|
|
784
|
-
}
|
|
785
|
-
|
|
786
781
|
function columnName(index: number): string {
|
|
787
782
|
let value = index + 1;
|
|
788
783
|
let result = "";
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DISPLAY-ONLY General number formatting for spreadsheet canvas and a11y
|
|
3
|
+
* labels. This is not numeric arithmetic and must never feed formula-bar /
|
|
4
|
+
* cell-edit `input`, stored cells, formula results, or serialized exports.
|
|
5
|
+
*
|
|
6
|
+
* Policy for independent review:
|
|
7
|
+
* IEEE-754 cannot represent many decimal fractions exactly, so values such as
|
|
8
|
+
* `110.00000000000001` and `0.1 + 0.2` leak binary residue through `String(n)`.
|
|
9
|
+
* General display therefore collapses a finite number to 15 significant decimal
|
|
10
|
+
* digits — the same bound spreadsheet General uses — via
|
|
11
|
+
* `String(Number(value.toPrecision(15)))`.
|
|
12
|
+
*
|
|
13
|
+
* That mapping yields `110` / `220` / `0.3` for the noisy cases while keeping
|
|
14
|
+
* exponent-scale values (`1e-20`, `1e21`) and ~15-digit legitimate precision.
|
|
15
|
+
* Integers stringify without a decimal; `-0` displays as `0`; non-finite
|
|
16
|
+
* numbers, dates, booleans, errors, and strings keep their existing labels.
|
|
17
|
+
*
|
|
18
|
+
* Do not reuse `Intl.NumberFormat({ maximumFractionDigits: 12 })` from the
|
|
19
|
+
* artifact-tool renderer: 12 fraction digits rounds `1e-20` to `0` and truncates
|
|
20
|
+
* high-precision values that General should still show.
|
|
21
|
+
*/
|
|
22
|
+
export function formatSpreadsheetGeneralDisplay(value: unknown): string {
|
|
23
|
+
if (value === null || value === undefined) return "";
|
|
24
|
+
if (value instanceof Date) return Number.isNaN(value.getTime()) ? "" : value.toLocaleDateString();
|
|
25
|
+
if (typeof value === "boolean") return value ? "TRUE" : "FALSE";
|
|
26
|
+
if (typeof value === "number") {
|
|
27
|
+
if (Object.is(value, -0) || value === 0) return "0";
|
|
28
|
+
if (!Number.isFinite(value)) return String(value);
|
|
29
|
+
const rounded = Number(value.toPrecision(15));
|
|
30
|
+
// Rounding at the finite IEEE-754 boundary can overflow. A display policy
|
|
31
|
+
// must not turn a finite source into an infinity label.
|
|
32
|
+
return String(Number.isFinite(rounded) ? rounded : value);
|
|
33
|
+
}
|
|
34
|
+
return String(value);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Exact edit/formula-bar source. Numbers stay `String(value)` with no General collapse. */
|
|
38
|
+
export function spreadsheetCellEditSource(value: unknown): string {
|
|
39
|
+
if (value === null || value === undefined) return "";
|
|
40
|
+
if (value instanceof Date) return Number.isNaN(value.getTime()) ? "" : value.toLocaleDateString();
|
|
41
|
+
if (typeof value === "boolean") return value ? "TRUE" : "FALSE";
|
|
42
|
+
return String(value);
|
|
43
|
+
}
|
|
@@ -26,6 +26,10 @@ import {
|
|
|
26
26
|
type SpreadsheetCanvasProjection,
|
|
27
27
|
type SpreadsheetCanvasTheme,
|
|
28
28
|
} from "./spreadsheet-canvas";
|
|
29
|
+
import {
|
|
30
|
+
formatSpreadsheetGeneralDisplay,
|
|
31
|
+
spreadsheetCellEditSource,
|
|
32
|
+
} from "./spreadsheet-general-display";
|
|
29
33
|
|
|
30
34
|
const MAX_ROWS = 1_048_576;
|
|
31
35
|
const MAX_COLUMNS = 16_384;
|
|
@@ -494,13 +498,6 @@ function isCellSelected(selection: SpreadsheetSelection, row: number, col: numbe
|
|
|
494
498
|
);
|
|
495
499
|
}
|
|
496
500
|
|
|
497
|
-
function displayValue(value: unknown): string {
|
|
498
|
-
if (value === null || value === undefined) return "";
|
|
499
|
-
if (value instanceof Date) return Number.isNaN(value.getTime()) ? "" : value.toLocaleDateString();
|
|
500
|
-
if (typeof value === "boolean") return value ? "TRUE" : "FALSE";
|
|
501
|
-
return String(value);
|
|
502
|
-
}
|
|
503
|
-
|
|
504
501
|
function parseCellInput(input: string): string | number | boolean | null {
|
|
505
502
|
if (input === "") return null;
|
|
506
503
|
const normalized = input.trim();
|
|
@@ -634,7 +631,7 @@ function spreadsheetCanvasTheme(element: HTMLElement): SpreadsheetCanvasTheme {
|
|
|
634
631
|
const border = computedToken(style, "--og-color-border", "#d1d5db");
|
|
635
632
|
const foreground = style.color || computedToken(style, "--og-color-fg", "#111827");
|
|
636
633
|
const mutedForeground = computedToken(style, "--og-color-fg-muted", "#6b7280");
|
|
637
|
-
const accent = computedToken(style, "--og-color-accent", "#
|
|
634
|
+
const accent = computedToken(style, "--og-color-accent", "#545454");
|
|
638
635
|
const error = computedToken(style, "--og-color-status-failed", "#dc2626");
|
|
639
636
|
const fontFamily =
|
|
640
637
|
style.fontFamily ||
|
|
@@ -816,7 +813,7 @@ export function SpreadsheetArtifactSurface({
|
|
|
816
813
|
<button
|
|
817
814
|
type="button"
|
|
818
815
|
onClick={addSheet}
|
|
819
|
-
className="mt-3 rounded-og-sm bg-og-
|
|
816
|
+
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"
|
|
820
817
|
>
|
|
821
818
|
Add worksheet
|
|
822
819
|
</button>
|
|
@@ -906,7 +903,7 @@ export function SpreadsheetGrid({
|
|
|
906
903
|
const data = worksheet.cellData(row, col);
|
|
907
904
|
return {
|
|
908
905
|
value: data.formula ? workbook.valueAt(worksheet, { row, col }) : data.value,
|
|
909
|
-
input: data.formula ??
|
|
906
|
+
input: data.formula ?? spreadsheetCellEditSource(data.value),
|
|
910
907
|
format: data.format,
|
|
911
908
|
};
|
|
912
909
|
},
|
|
@@ -2059,7 +2056,7 @@ export function SpreadsheetProjectionGrid({
|
|
|
2059
2056
|
role="gridcell"
|
|
2060
2057
|
aria-colindex={col + 1}
|
|
2061
2058
|
aria-selected={selected}
|
|
2062
|
-
aria-label={`${address}${value === null ? "" : `, ${
|
|
2059
|
+
aria-label={`${address}${value === null ? "" : `, ${formatSpreadsheetGeneralDisplay(value)}`}`}
|
|
2063
2060
|
data-og-cell={address}
|
|
2064
2061
|
className={cn(
|
|
2065
2062
|
"pointer-events-none absolute top-0 flex h-full min-w-0 overflow-hidden border-b border-r border-og-border px-1.5 text-og-fg",
|
|
@@ -2099,7 +2096,7 @@ export function SpreadsheetProjectionGrid({
|
|
|
2099
2096
|
/>
|
|
2100
2097
|
) : (
|
|
2101
2098
|
<span className="block min-w-0 overflow-hidden text-ellipsis">
|
|
2102
|
-
{
|
|
2099
|
+
{formatSpreadsheetGeneralDisplay(value)}
|
|
2103
2100
|
</span>
|
|
2104
2101
|
)}
|
|
2105
2102
|
</div>
|
|
@@ -2117,7 +2114,9 @@ export function SpreadsheetProjectionGrid({
|
|
|
2117
2114
|
aria-colindex={selection.focus.col + 1}
|
|
2118
2115
|
aria-selected="true"
|
|
2119
2116
|
aria-label={`${cellName(selection.focus)}${
|
|
2120
|
-
hiddenActiveValue == null
|
|
2117
|
+
hiddenActiveValue == null
|
|
2118
|
+
? ""
|
|
2119
|
+
: `, ${formatSpreadsheetGeneralDisplay(hiddenActiveValue)}`
|
|
2121
2120
|
}`}
|
|
2122
2121
|
/>
|
|
2123
2122
|
</div>
|