@opengeni/react 1.0.1 → 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 +651 -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-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 +6 -3
- package/dist/realtime.js +133 -74
- 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 +133 -46
- 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
|
@@ -1,24 +1,50 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Children,
|
|
3
|
+
createContext,
|
|
4
|
+
useContext,
|
|
3
5
|
isValidElement,
|
|
4
6
|
memo,
|
|
5
7
|
useEffect,
|
|
8
|
+
useMemo,
|
|
6
9
|
useReducer,
|
|
7
10
|
useRef,
|
|
8
11
|
useState,
|
|
9
12
|
type ComponentPropsWithoutRef,
|
|
10
13
|
type ReactNode,
|
|
11
14
|
} from "react";
|
|
12
|
-
import ReactMarkdown, {
|
|
15
|
+
import ReactMarkdown, {
|
|
16
|
+
defaultUrlTransform,
|
|
17
|
+
type Components,
|
|
18
|
+
type ExtraProps,
|
|
19
|
+
type UrlTransform,
|
|
20
|
+
} from "react-markdown";
|
|
13
21
|
import remarkGfm from "remark-gfm";
|
|
22
|
+
import { PanelsTopLeftIcon } from "lucide-react";
|
|
23
|
+
import { ActivityDisclosure } from "../timeline/shared";
|
|
14
24
|
import { cn } from "../lib/cn";
|
|
15
25
|
import { tableElementToTsv } from "../lib/clipboard";
|
|
16
26
|
import { prefersReducedMotion } from "../lib/motion";
|
|
17
27
|
import { MOTION_INSPECT_SCALE } from "../lib/motion-inspect";
|
|
18
28
|
import { CopyButton } from "./copy-button";
|
|
29
|
+
import { PreviewLoading } from "./preview-loading";
|
|
30
|
+
import type { observeMarkdownTableLayout } from "./markdown-table-layout";
|
|
19
31
|
import { softenStreamingMarkdown } from "./soften-streaming-markdown";
|
|
20
32
|
import { createStreamReveal, rehypeStreamReveal, type StreamReveal } from "./stream-reveal";
|
|
21
33
|
import { TooltipProvider } from "./tooltip";
|
|
34
|
+
import { searchMatchOffset, type TimelineSearchTarget } from "./timeline-search";
|
|
35
|
+
import {
|
|
36
|
+
parseOpenGeniLink,
|
|
37
|
+
parseSandboxLink,
|
|
38
|
+
parseRetainedFileReference,
|
|
39
|
+
isReservedOpenGeniLink,
|
|
40
|
+
openGeniLinkScheme,
|
|
41
|
+
type OpenGeniLinkTarget,
|
|
42
|
+
} from "@opengeni/sdk";
|
|
43
|
+
import {
|
|
44
|
+
chainLinkResolvers,
|
|
45
|
+
useOpenGeniLinkResolver,
|
|
46
|
+
type OpenGeniLinkResolver,
|
|
47
|
+
} from "./open-geni-links";
|
|
22
48
|
|
|
23
49
|
/**
|
|
24
50
|
* The default renderer for chat message bodies in {@link MessageTimeline}.
|
|
@@ -34,7 +60,25 @@ import { TooltipProvider } from "./tooltip";
|
|
|
34
60
|
* the tokens land. Consumers who want a different renderer can still pass
|
|
35
61
|
* `renderMessageText` to `MessageTimeline` to override this entirely.
|
|
36
62
|
*/
|
|
63
|
+
export type MarkdownInteractiveBlock = { kind: "html" | "site"; content: string };
|
|
64
|
+
const InteractiveContext = createContext<{
|
|
65
|
+
source: string;
|
|
66
|
+
streaming?: boolean | undefined;
|
|
67
|
+
render?: (block: MarkdownInteractiveBlock) => ReactNode;
|
|
68
|
+
renderImage?: (image: { src: string; alt: string }) => ReactNode;
|
|
69
|
+
suppressImages?: boolean;
|
|
70
|
+
}>({ source: "" });
|
|
71
|
+
|
|
37
72
|
export type MarkdownProps = {
|
|
73
|
+
/** Resolve a retained-file reference to the host's authenticated artifact page. */
|
|
74
|
+
artifactHref?: ((artifactId: string) => string) | undefined;
|
|
75
|
+
/** Reveals a bounded source excerpt; closing Find retains it until explicit restore. */
|
|
76
|
+
searchTarget?: TimelineSearchTarget | null | undefined;
|
|
77
|
+
renderImage?: ((image: { src: string; alt: string }) => ReactNode) | undefined;
|
|
78
|
+
/** Show alt text without loading image URLs (e.g. in search previews). */
|
|
79
|
+
suppressImages?: boolean | undefined;
|
|
80
|
+
/** Host opt-in for assistant-authored interactive fences. */
|
|
81
|
+
renderInteractiveBlock?: ((block: MarkdownInteractiveBlock) => ReactNode) | undefined;
|
|
38
82
|
children: string;
|
|
39
83
|
className?: string | undefined;
|
|
40
84
|
/**
|
|
@@ -46,11 +90,29 @@ export type MarkdownProps = {
|
|
|
46
90
|
* transition — that blinked the whole document).
|
|
47
91
|
*/
|
|
48
92
|
streaming?: boolean | undefined;
|
|
93
|
+
/**
|
|
94
|
+
* Open a session-local file link in the host's Files surface. The path is the
|
|
95
|
+
* exact decoded `sandbox:` payload; `line`, when present, is 1-based.
|
|
96
|
+
*/
|
|
97
|
+
onSandboxFile?: ((path: string, line?: number) => void | Promise<void>) | undefined;
|
|
98
|
+
/**
|
|
99
|
+
* Resolve OpenGeni object links (`artifact:`, `sandbox:`, editable
|
|
100
|
+
* artifacts, Sites) to a host URL or action. Asked before any
|
|
101
|
+
* {@link OpenGeniLinkProvider} above this body; `artifactHref` and
|
|
102
|
+
* `onSandboxFile` still win for their own kinds.
|
|
103
|
+
*/
|
|
104
|
+
resolveLink?: OpenGeniLinkResolver | undefined;
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
/** Exact target path plus optional 1-based line from a markdown href. */
|
|
108
|
+
export type SandboxFileLocation = {
|
|
109
|
+
path: string;
|
|
110
|
+
line: number | null;
|
|
49
111
|
};
|
|
50
112
|
|
|
51
113
|
/* --- element renderers (themed to og-* tokens) ------------------------------ */
|
|
52
114
|
|
|
53
|
-
const
|
|
115
|
+
const baseComponents: Components = {
|
|
54
116
|
h1: ({ children, ...props }) => (
|
|
55
117
|
<h1
|
|
56
118
|
className="mt-5 mb-2.5 text-xl font-semibold tracking-tight text-og-fg first:mt-0"
|
|
@@ -74,7 +136,7 @@ const components: Components = {
|
|
|
74
136
|
),
|
|
75
137
|
h4: ({ children, ...props }) => (
|
|
76
138
|
<h4
|
|
77
|
-
className="mt-4 mb-1.5 text-og-sm font-semibold uppercase tracking-[0.04em] text-og-fg
|
|
139
|
+
className="mt-4 mb-1.5 text-og-sm font-semibold uppercase tracking-[0.04em] text-og-fg first:mt-0"
|
|
78
140
|
{...props}
|
|
79
141
|
>
|
|
80
142
|
{children}
|
|
@@ -95,16 +157,6 @@ const components: Components = {
|
|
|
95
157
|
{children}
|
|
96
158
|
</em>
|
|
97
159
|
),
|
|
98
|
-
a: ({ children, ...props }) => (
|
|
99
|
-
<a
|
|
100
|
-
className="break-words font-medium text-og-accent-strong underline-offset-2 hover:underline"
|
|
101
|
-
target="_blank"
|
|
102
|
-
rel="noreferrer noopener"
|
|
103
|
-
{...props}
|
|
104
|
-
>
|
|
105
|
-
{children}
|
|
106
|
-
</a>
|
|
107
|
-
),
|
|
108
160
|
ul: ({ children, ...props }) => (
|
|
109
161
|
<ul
|
|
110
162
|
className="my-2.5 ml-5 flex list-disc flex-col gap-1 marker:text-og-fg-subtle first:mt-0 last:mb-0"
|
|
@@ -157,14 +209,14 @@ const components: Components = {
|
|
|
157
209
|
// the `pre` renderer), so a `code` reaching here is treated as inline.
|
|
158
210
|
code: ({ children, className: _className, ...props }) => (
|
|
159
211
|
<code
|
|
160
|
-
className="rounded-og-xs bg-og-surface-
|
|
212
|
+
className="rounded-og-xs bg-og-surface-2 px-1 py-0.5 font-og-mono text-og-sm text-og-fg"
|
|
161
213
|
{...props}
|
|
162
214
|
>
|
|
163
215
|
{children}
|
|
164
216
|
</code>
|
|
165
217
|
),
|
|
166
218
|
// Fenced code — quiet mono block (no card / no nested vertical scroll).
|
|
167
|
-
pre:
|
|
219
|
+
pre: InteractiveCodeBlock,
|
|
168
220
|
// Tables stay unboxed (hairline rules); hover reveals a TSV copy control.
|
|
169
221
|
table: ({ children, ...props }) => <MarkdownTable {...props}>{children}</MarkdownTable>,
|
|
170
222
|
thead: ({ children, ...props }) => <thead {...props}>{children}</thead>,
|
|
@@ -184,15 +236,227 @@ const components: Components = {
|
|
|
184
236
|
{children}
|
|
185
237
|
</td>
|
|
186
238
|
),
|
|
187
|
-
img:
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
239
|
+
img: MarkdownImage,
|
|
240
|
+
};
|
|
241
|
+
|
|
242
|
+
const MARKDOWN_LINK_CLASS =
|
|
243
|
+
"break-words font-medium text-og-accent-strong underline-offset-2 hover:underline";
|
|
244
|
+
|
|
245
|
+
// Keep renderer component types stable: rebuilding them remounts paragraphs,
|
|
246
|
+
// destroys native selections, and resets embedded media on host updates.
|
|
247
|
+
const MarkdownLinkContext = createContext<
|
|
248
|
+
Pick<MarkdownProps, "onSandboxFile" | "artifactHref" | "resolveLink">
|
|
249
|
+
>({});
|
|
250
|
+
|
|
251
|
+
const UNAVAILABLE_LABEL: Record<Exclude<OpenGeniLinkTarget["kind"], "sandbox-file">, string> = {
|
|
252
|
+
file: "This file needs a workspace-aware host to open",
|
|
253
|
+
"editable-artifact": "This artifact needs a workspace-aware host to open",
|
|
254
|
+
site: "This Site needs a workspace-aware host to open",
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
function linkActionTitle(target: OpenGeniLinkTarget): string {
|
|
258
|
+
if (target.kind === "sandbox-file") {
|
|
259
|
+
return target.line !== null
|
|
260
|
+
? `Open ${target.path} at line ${target.line}`
|
|
261
|
+
: `Open ${target.path}`;
|
|
262
|
+
}
|
|
263
|
+
return target.kind === "file"
|
|
264
|
+
? "Open file"
|
|
265
|
+
: target.kind === "site"
|
|
266
|
+
? "Open Site"
|
|
267
|
+
: "Open artifact";
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
const markdownComponents: Components = {
|
|
271
|
+
...baseComponents,
|
|
272
|
+
p: ({ children, node, ...props }) => {
|
|
273
|
+
const containsArtifact = node?.children.some(
|
|
274
|
+
(child) =>
|
|
275
|
+
child.type === "element" &&
|
|
276
|
+
child.tagName === "img" &&
|
|
277
|
+
typeof child.properties.src === "string" &&
|
|
278
|
+
retainedImageId(child.properties.src),
|
|
279
|
+
);
|
|
280
|
+
const Tag = containsArtifact ? "div" : "p";
|
|
281
|
+
return (
|
|
282
|
+
<Tag className="my-2.5 leading-7 first:mt-0 last:mb-0" {...props}>
|
|
283
|
+
{children}
|
|
284
|
+
</Tag>
|
|
285
|
+
);
|
|
286
|
+
},
|
|
287
|
+
a: ({ children, href, ...props }) => {
|
|
288
|
+
const { onSandboxFile, artifactHref, resolveLink } = useContext(MarkdownLinkContext);
|
|
289
|
+
const inherited = useOpenGeniLinkResolver();
|
|
290
|
+
const target = parseOpenGeniLink(href);
|
|
291
|
+
if (target) {
|
|
292
|
+
// Explicit per-kind props keep their historical precedence.
|
|
293
|
+
if (target.kind === "file" && target.workspaceId === null && artifactHref) {
|
|
294
|
+
const destination = defaultUrlTransform(artifactHref(target.fileId));
|
|
295
|
+
if (destination) {
|
|
296
|
+
return (
|
|
297
|
+
<a
|
|
298
|
+
className={MARKDOWN_LINK_CLASS}
|
|
299
|
+
href={destination}
|
|
300
|
+
target="_blank"
|
|
301
|
+
rel="noreferrer noopener"
|
|
302
|
+
>
|
|
303
|
+
{children}
|
|
304
|
+
</a>
|
|
305
|
+
);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
const resolution =
|
|
309
|
+
target.kind === "sandbox-file" && onSandboxFile
|
|
310
|
+
? { open: () => onSandboxFile(target.path, target.line ?? undefined) }
|
|
311
|
+
: chainLinkResolvers(resolveLink, inherited)?.(target);
|
|
312
|
+
const destination = resolution?.href ? defaultUrlTransform(resolution.href) : "";
|
|
313
|
+
if (destination) {
|
|
314
|
+
return (
|
|
315
|
+
<a
|
|
316
|
+
className={MARKDOWN_LINK_CLASS}
|
|
317
|
+
href={destination}
|
|
318
|
+
target="_blank"
|
|
319
|
+
rel="noreferrer noopener"
|
|
320
|
+
>
|
|
321
|
+
{children}
|
|
322
|
+
</a>
|
|
323
|
+
);
|
|
324
|
+
}
|
|
325
|
+
if (resolution?.open) {
|
|
326
|
+
return (
|
|
327
|
+
<ActionMarkdownLink title={linkActionTitle(target)} onOpen={resolution.open}>
|
|
328
|
+
{children}
|
|
329
|
+
</ActionMarkdownLink>
|
|
330
|
+
);
|
|
331
|
+
}
|
|
332
|
+
if (target.kind === "sandbox-file") {
|
|
333
|
+
return (
|
|
334
|
+
<span
|
|
335
|
+
className="break-words font-medium text-og-fg-subtle underline decoration-dotted underline-offset-2"
|
|
336
|
+
aria-disabled="true"
|
|
337
|
+
title="This sandbox file requires a session-aware handler"
|
|
338
|
+
>
|
|
339
|
+
{children}
|
|
340
|
+
</span>
|
|
341
|
+
);
|
|
342
|
+
}
|
|
343
|
+
// Never navigate: a console path resolves against the host origin and 404s.
|
|
344
|
+
return (
|
|
345
|
+
<span title={UNAVAILABLE_LABEL[target.kind]} data-og-link-unavailable={target.kind}>
|
|
346
|
+
{children} (artifact unavailable)
|
|
347
|
+
</span>
|
|
348
|
+
);
|
|
349
|
+
}
|
|
350
|
+
if (isReservedOpenGeniLink(href) || !href) {
|
|
351
|
+
return (
|
|
352
|
+
<span
|
|
353
|
+
className="break-words text-og-fg-subtle"
|
|
354
|
+
aria-disabled="true"
|
|
355
|
+
title={
|
|
356
|
+
isSandboxHref(href)
|
|
357
|
+
? "This sandbox file reference is invalid"
|
|
358
|
+
: "This link is unavailable"
|
|
359
|
+
}
|
|
360
|
+
>
|
|
361
|
+
{children} (link unavailable)
|
|
362
|
+
</span>
|
|
363
|
+
);
|
|
364
|
+
}
|
|
365
|
+
return (
|
|
366
|
+
<a
|
|
367
|
+
className={MARKDOWN_LINK_CLASS}
|
|
368
|
+
target="_blank"
|
|
369
|
+
rel="noreferrer noopener"
|
|
370
|
+
href={href}
|
|
371
|
+
{...props}
|
|
372
|
+
>
|
|
373
|
+
{children}
|
|
374
|
+
</a>
|
|
375
|
+
);
|
|
376
|
+
},
|
|
194
377
|
};
|
|
195
378
|
|
|
379
|
+
function ActionMarkdownLink({
|
|
380
|
+
title,
|
|
381
|
+
onOpen,
|
|
382
|
+
children,
|
|
383
|
+
}: {
|
|
384
|
+
title: string;
|
|
385
|
+
onOpen: () => void | Promise<void>;
|
|
386
|
+
children: ReactNode;
|
|
387
|
+
}) {
|
|
388
|
+
const [state, setState] = useState<"idle" | "loading" | "error">("idle");
|
|
389
|
+
return (
|
|
390
|
+
<button
|
|
391
|
+
type="button"
|
|
392
|
+
className={cn(
|
|
393
|
+
MARKDOWN_LINK_CLASS,
|
|
394
|
+
"inline-flex min-h-7 cursor-pointer items-center aria-disabled:cursor-wait aria-disabled:opacity-70 pointer-coarse:min-h-11",
|
|
395
|
+
)}
|
|
396
|
+
// Not `disabled`: disabling the focused control drops focus to the page,
|
|
397
|
+
// so a host viewer could not return focus to the link that opened it.
|
|
398
|
+
aria-disabled={state === "loading" || undefined}
|
|
399
|
+
aria-busy={state === "loading"}
|
|
400
|
+
title={state === "error" ? "Couldn't open this file. Select to retry." : title}
|
|
401
|
+
onClick={() => {
|
|
402
|
+
if (state === "loading") return;
|
|
403
|
+
setState("loading");
|
|
404
|
+
void Promise.resolve()
|
|
405
|
+
.then(onOpen)
|
|
406
|
+
.then(
|
|
407
|
+
() => setState("idle"),
|
|
408
|
+
() => setState("error"),
|
|
409
|
+
);
|
|
410
|
+
}}
|
|
411
|
+
>
|
|
412
|
+
{children}
|
|
413
|
+
{state === "loading" ? " (opening…)" : state === "error" ? " (retry)" : null}
|
|
414
|
+
</button>
|
|
415
|
+
);
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
function isSandboxHref(href: string | undefined): boolean {
|
|
419
|
+
return openGeniLinkScheme(href) === "sandbox";
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
/**
|
|
423
|
+
* Parse an OpenGeni `sandbox:` application href (plus the historical bare
|
|
424
|
+
* `/workspace/...` form). The decoded path is intentionally opaque here:
|
|
425
|
+
* target selection, path policy, and filesystem authority belong to the
|
|
426
|
+
* session-aware host and its FileSystem boundary.
|
|
427
|
+
*/
|
|
428
|
+
export function sandboxFileLocationFromHref(href: string | undefined): SandboxFileLocation | null {
|
|
429
|
+
return parseSandboxLink(href);
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
/** Return the exact decoded path for a supported sandbox-link href. */
|
|
433
|
+
export function sandboxFilePathFromHref(href: string | undefined): string | null {
|
|
434
|
+
return sandboxFileLocationFromHref(href)?.path ?? null;
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
export function retainedImageId(src: string): string | null {
|
|
438
|
+
return parseRetainedFileReference(src);
|
|
439
|
+
}
|
|
440
|
+
function MarkdownImage({ src, alt }: ComponentPropsWithoutRef<"img">) {
|
|
441
|
+
const { renderImage, suppressImages } = useContext(InteractiveContext);
|
|
442
|
+
if (suppressImages)
|
|
443
|
+
return <span data-og-image-placeholder="">{alt || "Image"} (preview unavailable)</span>;
|
|
444
|
+
if (!src) return <span>{alt ?? "Image unavailable"}</span>;
|
|
445
|
+
if (retainedImageId(src))
|
|
446
|
+
return renderImage ? (
|
|
447
|
+
<>{renderImage({ src, alt: alt ?? "" })}</>
|
|
448
|
+
) : (
|
|
449
|
+
<span>{alt || "Image"} (preview unavailable)</span>
|
|
450
|
+
);
|
|
451
|
+
return <img src={src} alt={alt ?? ""} loading="lazy" className="my-3 max-w-full rounded-og-md" />;
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
const markdownUrlTransform: UrlTransform = (url, key, node) =>
|
|
455
|
+
(key === "href" && node.tagName === "a" && isReservedOpenGeniLink(url)) ||
|
|
456
|
+
(key === "src" && node.tagName === "img" && retainedImageId(url))
|
|
457
|
+
? url
|
|
458
|
+
: defaultUrlTransform(url);
|
|
459
|
+
|
|
196
460
|
/** How long after the stream ends the reveal pipeline stays for trailing animations. */
|
|
197
461
|
/** Trailing ink window after stream end — keep ≥ {@link INK_FADE_MS}. */
|
|
198
462
|
const REVEAL_LINGER_MS = 480 * MOTION_INSPECT_SCALE;
|
|
@@ -229,6 +493,58 @@ function fenceLanguage(children: ReactNode): string | null {
|
|
|
229
493
|
return found;
|
|
230
494
|
}
|
|
231
495
|
|
|
496
|
+
function InteractiveCodeBlock({ children, node }: ComponentPropsWithoutRef<"pre"> & ExtraProps) {
|
|
497
|
+
const { source, render, streaming } = useContext(InteractiveContext);
|
|
498
|
+
const language = fenceLanguage(children);
|
|
499
|
+
if (render && (language === "opengeni-html" || language === "opengeni-site")) {
|
|
500
|
+
const start = node?.position?.start.offset;
|
|
501
|
+
const end = node?.position?.end.offset;
|
|
502
|
+
const original =
|
|
503
|
+
start !== undefined && end !== undefined && end <= source.length
|
|
504
|
+
? source.slice(start, end)
|
|
505
|
+
: "";
|
|
506
|
+
const lines = original.trimEnd().split("\n");
|
|
507
|
+
const opening = lines[0]?.match(/^ {0,3}([\x60]{3,}|~{3,})/);
|
|
508
|
+
|
|
509
|
+
const closing = lines
|
|
510
|
+
.at(-1)
|
|
511
|
+
?.replace(/^\s*(?:>\s*)+/, "")
|
|
512
|
+
.trim();
|
|
513
|
+
const complete =
|
|
514
|
+
opening &&
|
|
515
|
+
lines.length > 1 &&
|
|
516
|
+
closing &&
|
|
517
|
+
closing.length >= opening[1]!.length &&
|
|
518
|
+
[...closing].every((c) => c === opening[1]![0]);
|
|
519
|
+
if (!complete) {
|
|
520
|
+
return (
|
|
521
|
+
<div role="status" aria-live="polite" aria-busy={streaming === true} className="my-3">
|
|
522
|
+
{streaming ? (
|
|
523
|
+
<PreviewLoading />
|
|
524
|
+
) : (
|
|
525
|
+
<ActivityDisclosure
|
|
526
|
+
icon={<PanelsTopLeftIcon aria-hidden className="size-3.5" />}
|
|
527
|
+
title="Preview incomplete"
|
|
528
|
+
running={false}
|
|
529
|
+
expandable={false}
|
|
530
|
+
preview="Generation stopped before the preview was ready."
|
|
531
|
+
/>
|
|
532
|
+
)}
|
|
533
|
+
</div>
|
|
534
|
+
);
|
|
535
|
+
}
|
|
536
|
+
return (
|
|
537
|
+
<>
|
|
538
|
+
{render({
|
|
539
|
+
kind: language === "opengeni-html" ? "html" : "site",
|
|
540
|
+
content: nodeText(children).replace(/\n$/, ""),
|
|
541
|
+
})}
|
|
542
|
+
</>
|
|
543
|
+
);
|
|
544
|
+
}
|
|
545
|
+
return <MarkdownCodeBlock>{children}</MarkdownCodeBlock>;
|
|
546
|
+
}
|
|
547
|
+
|
|
232
548
|
function MarkdownCodeBlock({ children }: { children?: ReactNode }) {
|
|
233
549
|
const code = nodeText(children).replace(/\n$/, "");
|
|
234
550
|
const language = fenceLanguage(children);
|
|
@@ -259,9 +575,34 @@ function MarkdownCodeBlock({ children }: { children?: ReactNode }) {
|
|
|
259
575
|
}
|
|
260
576
|
|
|
261
577
|
function MarkdownTable({ children, className, ...props }: ComponentPropsWithoutRef<"table">) {
|
|
262
|
-
const
|
|
578
|
+
const wrapperRef = useRef<HTMLDivElement>(null);
|
|
579
|
+
const tableRef = useRef<HTMLTableElement>(null);
|
|
580
|
+
const layoutRef = useRef<ReturnType<typeof observeMarkdownTableLayout>>(undefined);
|
|
581
|
+
useEffect(() => {
|
|
582
|
+
const wrapper = wrapperRef.current;
|
|
583
|
+
const table = tableRef.current;
|
|
584
|
+
if (!wrapper?.closest("[data-og-wide-table-message]") || !table) return;
|
|
585
|
+
let disposed = false;
|
|
586
|
+
// Ordinary tables remain usable even if this optional layout chunk fails.
|
|
587
|
+
void import("./markdown-table-layout")
|
|
588
|
+
.then(({ observeMarkdownTableLayout }) => {
|
|
589
|
+
if (!disposed) layoutRef.current = observeMarkdownTableLayout(wrapper, table);
|
|
590
|
+
})
|
|
591
|
+
.catch(() => {});
|
|
592
|
+
return () => {
|
|
593
|
+
disposed = true;
|
|
594
|
+
layoutRef.current?.disconnect();
|
|
595
|
+
layoutRef.current = undefined;
|
|
596
|
+
};
|
|
597
|
+
}, []);
|
|
598
|
+
// ReactMarkdown recreates table children even when only later prose changes.
|
|
599
|
+
// Remeasure genuine content changes without collapsing the expanded wrapper
|
|
600
|
+
// between cleanup and the asynchronous observer-module import on each update.
|
|
601
|
+
useEffect(() => {
|
|
602
|
+
layoutRef.current?.measure();
|
|
603
|
+
}, [children]);
|
|
263
604
|
return (
|
|
264
|
-
<div className="group/copy relative mt-3 max-w-full first:mt-0">
|
|
605
|
+
<div ref={wrapperRef} className="group/copy relative mt-3 max-w-full first:mt-0">
|
|
265
606
|
<div className="pointer-events-none absolute top-0 right-0 z-10">
|
|
266
607
|
<div className="pointer-events-auto">
|
|
267
608
|
<CopyButton
|
|
@@ -284,7 +625,17 @@ function MarkdownTable({ children, className, ...props }: ComponentPropsWithoutR
|
|
|
284
625
|
);
|
|
285
626
|
}
|
|
286
627
|
|
|
287
|
-
function MarkdownImpl({
|
|
628
|
+
function MarkdownImpl({
|
|
629
|
+
children,
|
|
630
|
+
artifactHref,
|
|
631
|
+
className,
|
|
632
|
+
streaming = false,
|
|
633
|
+
onSandboxFile,
|
|
634
|
+
renderInteractiveBlock,
|
|
635
|
+
renderImage,
|
|
636
|
+
resolveLink,
|
|
637
|
+
suppressImages,
|
|
638
|
+
}: MarkdownProps) {
|
|
288
639
|
// Tip-ink engine for THIS body: created on the first streaming render, kept
|
|
289
640
|
// through a short linger after the stream ends (so the last age window can
|
|
290
641
|
// finish), then dropped so settled bodies pay zero cost. Observing during
|
|
@@ -373,30 +724,108 @@ function MarkdownImpl({ children, className, streaming = false }: MarkdownProps)
|
|
|
373
724
|
// fences don't snap to final GFM one commit before the crystallize morph.
|
|
374
725
|
// Reveal identity still tracks the true source (`children`).
|
|
375
726
|
const parseText = streaming || revealActive ? softenStreamingMarkdown(children) : children;
|
|
727
|
+
const linkContext = useMemo(
|
|
728
|
+
() => ({ onSandboxFile, artifactHref, resolveLink }),
|
|
729
|
+
[onSandboxFile, artifactHref, resolveLink],
|
|
730
|
+
);
|
|
731
|
+
|
|
732
|
+
const interactiveContext = useMemo(
|
|
733
|
+
() => ({
|
|
734
|
+
source: children,
|
|
735
|
+
streaming,
|
|
736
|
+
...(renderInteractiveBlock ? { render: renderInteractiveBlock } : {}),
|
|
737
|
+
...(renderImage ? { renderImage } : {}),
|
|
738
|
+
...(suppressImages ? { suppressImages } : {}),
|
|
739
|
+
}),
|
|
740
|
+
[children, streaming, renderInteractiveBlock, renderImage, suppressImages],
|
|
741
|
+
);
|
|
376
742
|
|
|
377
743
|
// `min-w-0` lets the prose shrink inside flex parents (message bubbles) so
|
|
378
744
|
// long links and code blocks wrap/scroll instead of forcing overflow.
|
|
379
745
|
return (
|
|
380
|
-
<
|
|
381
|
-
<
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
746
|
+
<MarkdownLinkContext.Provider value={linkContext}>
|
|
747
|
+
<InteractiveContext.Provider value={interactiveContext}>
|
|
748
|
+
<TooltipProvider delayDuration={400}>
|
|
749
|
+
<div
|
|
750
|
+
ref={bodyRef}
|
|
751
|
+
className={cn(
|
|
752
|
+
"og-markdown-body min-w-0 break-words",
|
|
753
|
+
settling && "og-markdown-settle",
|
|
754
|
+
className,
|
|
755
|
+
)}
|
|
756
|
+
>
|
|
757
|
+
<ReactMarkdown
|
|
758
|
+
remarkPlugins={[remarkGfm]}
|
|
759
|
+
rehypePlugins={rehypePlugins}
|
|
760
|
+
components={markdownComponents}
|
|
761
|
+
urlTransform={markdownUrlTransform}
|
|
762
|
+
>
|
|
763
|
+
{parseText}
|
|
764
|
+
</ReactMarkdown>
|
|
765
|
+
</div>
|
|
766
|
+
</TooltipProvider>
|
|
767
|
+
</InteractiveContext.Provider>
|
|
768
|
+
</MarkdownLinkContext.Provider>
|
|
398
769
|
);
|
|
399
770
|
}
|
|
400
771
|
|
|
401
772
|
/** Memoized so streaming re-renders of the parent don't re-parse settled bodies. */
|
|
402
|
-
export const Markdown = memo(
|
|
773
|
+
export const Markdown = memo(function SearchableMarkdown(props: MarkdownProps) {
|
|
774
|
+
const [retained, setRetained] = useState<{ text: string; target: TimelineSearchTarget } | null>(
|
|
775
|
+
null,
|
|
776
|
+
);
|
|
777
|
+
if (
|
|
778
|
+
props.searchTarget &&
|
|
779
|
+
(retained?.target !== props.searchTarget || retained.text !== props.children)
|
|
780
|
+
) {
|
|
781
|
+
setRetained({ text: props.children, target: props.searchTarget });
|
|
782
|
+
}
|
|
783
|
+
// Closing Find only removes the highlight. Retain the source window so a huge
|
|
784
|
+
// formatted message cannot replace it and unexpectedly move the reading point.
|
|
785
|
+
const target = props.searchTarget ?? (retained?.text === props.children ? retained.target : null);
|
|
786
|
+
if (!target) return <MarkdownImpl {...props} />;
|
|
787
|
+
const offset = searchMatchOffset(props.children, target);
|
|
788
|
+
if (offset < 0)
|
|
789
|
+
return props.searchTarget ? (
|
|
790
|
+
<div role="status">This match is no longer in the message source.</div>
|
|
791
|
+
) : (
|
|
792
|
+
<MarkdownImpl {...props} />
|
|
793
|
+
);
|
|
794
|
+
// Bound mounted text even for multi-megabyte messages. Do not split a UTF-16 pair
|
|
795
|
+
// at excerpt edges; the selected range itself is validated against the source.
|
|
796
|
+
let start = Math.max(0, offset - 240);
|
|
797
|
+
let end = Math.min(props.children.length, offset + target.query.length + 240);
|
|
798
|
+
if (start > 0 && /[\uDC00-\uDFFF]/.test(props.children[start]!)) start--;
|
|
799
|
+
if (end < props.children.length && /[\uDC00-\uDFFF]/.test(props.children[end]!)) end++;
|
|
800
|
+
const MatchTag = props.searchTarget ? "mark" : "span";
|
|
801
|
+
return (
|
|
802
|
+
<div className={cn("og-markdown-body min-w-0 break-words", props.className)}>
|
|
803
|
+
<div data-og-annotation-chrome="" className="text-xs opacity-70">
|
|
804
|
+
Match in message source · Excerpt stays in place when Find closes
|
|
805
|
+
<button
|
|
806
|
+
type="button"
|
|
807
|
+
disabled={!!props.searchTarget}
|
|
808
|
+
title={props.searchTarget ? "Close Find to show the formatted message" : undefined}
|
|
809
|
+
className="ml-2 inline-flex min-h-7 items-center rounded-og-sm px-1.5 text-og-xs font-medium text-og-fg-muted outline-hidden hover:text-og-fg focus-visible:ring-2 focus-visible:ring-og-accent/45 pointer-coarse:min-h-11 disabled:opacity-50"
|
|
810
|
+
onClick={() => setRetained(null)}
|
|
811
|
+
>
|
|
812
|
+
Show formatted message
|
|
813
|
+
</button>
|
|
814
|
+
</div>
|
|
815
|
+
<div style={{ whiteSpace: "pre-wrap", overflowWrap: "anywhere" }}>
|
|
816
|
+
{start > 0 ? "…" : ""}
|
|
817
|
+
{props.children.slice(start, offset)}
|
|
818
|
+
<MatchTag
|
|
819
|
+
data-og-search-occurrence={target.occurrence ?? 0}
|
|
820
|
+
data-og-search-sequence={target.sequence}
|
|
821
|
+
data-og-search-query={target.query}
|
|
822
|
+
data-og-search-offset={offset}
|
|
823
|
+
>
|
|
824
|
+
{props.children.slice(offset, offset + target.query.length)}
|
|
825
|
+
</MatchTag>
|
|
826
|
+
{props.children.slice(offset + target.query.length, end)}
|
|
827
|
+
{end < props.children.length ? "…" : ""}
|
|
828
|
+
</div>
|
|
829
|
+
</div>
|
|
830
|
+
);
|
|
831
|
+
});
|