@opengeni/react 0.57.0 → 1.0.2-canary.37191796234001
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +654 -22
- package/dist/accounts.d.ts +64 -0
- package/dist/accounts.js +822 -0
- package/dist/accounts.js.map +1 -0
- package/dist/approvals.d.ts +2 -1
- package/dist/artifacts-document.js +3 -2
- package/dist/artifacts-presentation.js +3 -2
- package/dist/artifacts-spreadsheet.js +2 -2
- package/dist/artifacts.d.ts +4 -1
- package/dist/artifacts.js +518 -42
- package/dist/artifacts.js.map +1 -1
- package/dist/browser-viewer-GTR5XQ7X.js +16 -0
- package/dist/capability-catalog-row.d.ts +20 -0
- package/dist/capability-logo-fallback.d.ts +3 -0
- package/dist/chat-interactive-block-UGBTNB3L.js +11 -0
- package/dist/chat-interactive-block-UGBTNB3L.js.map +1 -0
- package/dist/{chunk-5UQPNLIO.js → chunk-23J2ZNXT.js} +4117 -3896
- package/dist/chunk-23J2ZNXT.js.map +1 -0
- package/dist/chunk-447JLCBU.js +209 -0
- package/dist/chunk-447JLCBU.js.map +1 -0
- package/dist/chunk-4RVYOY4O.js +379 -0
- package/dist/chunk-4RVYOY4O.js.map +1 -0
- package/dist/chunk-5CVXZA3Y.js +292 -0
- package/dist/chunk-5CVXZA3Y.js.map +1 -0
- package/dist/chunk-5J4FOW6Q.js +108 -0
- package/dist/chunk-5J4FOW6Q.js.map +1 -0
- package/dist/chunk-A2PI6UMY.js +41 -0
- package/dist/chunk-A2PI6UMY.js.map +1 -0
- package/dist/{chunk-7WCLAEFV.js → chunk-A4UJB2MM.js} +37 -27
- package/dist/chunk-A4UJB2MM.js.map +1 -0
- package/dist/chunk-B3V6TG77.js +41 -0
- package/dist/chunk-B3V6TG77.js.map +1 -0
- package/dist/chunk-BRM6FVZA.js +302 -0
- package/dist/chunk-BRM6FVZA.js.map +1 -0
- package/dist/chunk-C5X5AJXK.js +182 -0
- package/dist/chunk-C5X5AJXK.js.map +1 -0
- package/dist/chunk-CR7U7HAR.js +453 -0
- package/dist/chunk-CR7U7HAR.js.map +1 -0
- package/dist/{chunk-R3AZOAB5.js → chunk-DYWBUX5Q.js} +29 -123
- package/dist/chunk-DYWBUX5Q.js.map +1 -0
- package/dist/chunk-E3G7SAYZ.js +3124 -0
- package/dist/chunk-E3G7SAYZ.js.map +1 -0
- package/dist/chunk-ELCE5SXV.js +359 -0
- package/dist/chunk-ELCE5SXV.js.map +1 -0
- package/dist/chunk-ERGYJIBB.js +21 -0
- package/dist/chunk-ERGYJIBB.js.map +1 -0
- package/dist/chunk-FFA2OVOV.js +319 -0
- package/dist/chunk-FFA2OVOV.js.map +1 -0
- package/dist/chunk-FZCP527Y.js +116 -0
- package/dist/chunk-FZCP527Y.js.map +1 -0
- package/dist/chunk-GIMRELBW.js +14 -0
- package/dist/chunk-GIMRELBW.js.map +1 -0
- package/dist/{chunk-6KLX2RH5.js → chunk-H2NJQORO.js} +1069 -79
- package/dist/chunk-H2NJQORO.js.map +1 -0
- package/dist/chunk-I7IWRQLN.js +1608 -0
- package/dist/chunk-I7IWRQLN.js.map +1 -0
- package/dist/{chunk-HA46CYQK.js → chunk-IQUCRAT7.js} +792 -537
- package/dist/chunk-IQUCRAT7.js.map +1 -0
- package/dist/chunk-IWIDV7SB.js +1 -0
- package/dist/chunk-IWIDV7SB.js.map +1 -0
- package/dist/chunk-J2QWVSQY.js +312 -0
- package/dist/chunk-J2QWVSQY.js.map +1 -0
- package/dist/chunk-JFNEV4LU.js +2733 -0
- package/dist/chunk-JFNEV4LU.js.map +1 -0
- package/dist/chunk-JT4JW7BC.js +54 -0
- package/dist/chunk-JT4JW7BC.js.map +1 -0
- package/dist/chunk-K3HQAKQX.js +24 -0
- package/dist/chunk-K3HQAKQX.js.map +1 -0
- package/dist/{chunk-C5ZPSSS5.js → chunk-NEXLLTP4.js} +2 -1
- package/dist/{chunk-C5ZPSSS5.js.map → chunk-NEXLLTP4.js.map} +1 -1
- package/dist/chunk-NZUI76EM.js +371 -0
- package/dist/chunk-NZUI76EM.js.map +1 -0
- package/dist/{chunk-PEI6RANI.js → chunk-PNY3JKBJ.js} +309 -74
- package/dist/chunk-PNY3JKBJ.js.map +1 -0
- package/dist/{chunk-IGC6A2ZI.js → chunk-Q5QBEZIQ.js} +777 -246
- package/dist/chunk-Q5QBEZIQ.js.map +1 -0
- package/dist/chunk-RHREZ7BO.js +11 -0
- package/dist/chunk-RHREZ7BO.js.map +1 -0
- package/dist/chunk-SCOTPE2I.js +589 -0
- package/dist/chunk-SCOTPE2I.js.map +1 -0
- package/dist/{chunk-B6WPZSTT.js → chunk-SJZDKVW2.js} +1331 -1163
- package/dist/chunk-SJZDKVW2.js.map +1 -0
- package/dist/chunk-TMJRG4YC.js +12803 -0
- package/dist/chunk-TMJRG4YC.js.map +1 -0
- package/dist/chunk-TMYGL6X5.js +742 -0
- package/dist/chunk-TMYGL6X5.js.map +1 -0
- package/dist/chunk-UGLEYEMP.js +33 -0
- package/dist/chunk-UGLEYEMP.js.map +1 -0
- package/dist/chunk-UK4TINKT.js +27 -0
- package/dist/chunk-UK4TINKT.js.map +1 -0
- package/dist/chunk-UTRTG6LH.js +220 -0
- package/dist/chunk-UTRTG6LH.js.map +1 -0
- package/dist/chunk-WEHMPOXK.js +39 -0
- package/dist/chunk-WEHMPOXK.js.map +1 -0
- package/dist/chunk-WRHIZYZF.js +988 -0
- package/dist/chunk-WRHIZYZF.js.map +1 -0
- package/dist/{chunk-HUIKIDM5.js → chunk-WUISZ3WU.js} +223 -115
- package/dist/chunk-WUISZ3WU.js.map +1 -0
- package/dist/chunk-XCHWDJ22.js +107 -0
- package/dist/chunk-XCHWDJ22.js.map +1 -0
- package/dist/chunk-XOAMRDDK.js +481 -0
- package/dist/chunk-XOAMRDDK.js.map +1 -0
- package/dist/chunk-XUW2UWQM.js +299 -0
- package/dist/chunk-XUW2UWQM.js.map +1 -0
- package/dist/{chunk-KCGXPP5V.js → chunk-Y2PRMYLC.js} +11 -6
- package/dist/chunk-Y2PRMYLC.js.map +1 -0
- package/dist/chunk-YBXQDQFX.js +1772 -0
- package/dist/chunk-YBXQDQFX.js.map +1 -0
- package/dist/{chunk-KZ73RL76.js → chunk-YQEAA6LT.js} +7 -3
- package/dist/chunk-YQEAA6LT.js.map +1 -0
- package/dist/chunk-YV4L3ILF.js +9 -0
- package/dist/chunk-YV4L3ILF.js.map +1 -0
- package/dist/{chunk-LLOLUHVG.js → chunk-YWFG7ZX7.js} +1358 -2746
- package/dist/chunk-YWFG7ZX7.js.map +1 -0
- package/dist/chunk-ZYRGEKWS.js +216 -0
- package/dist/chunk-ZYRGEKWS.js.map +1 -0
- package/dist/client.d.ts +7 -4
- package/dist/clipboard.js +1 -0
- package/dist/commands/types.d.ts +2 -0
- package/dist/components/anthropic-mark.d.ts +3 -0
- package/dist/components/approval-surface.d.ts +15 -0
- package/dist/components/artifacts/artifact-chrome.d.ts +120 -0
- package/dist/components/artifacts/artifact-sandbox.d.ts +27 -0
- package/dist/components/artifacts/artifact-surface.d.ts +3 -1
- package/dist/components/artifacts/chat-interactive-block.d.ts +29 -0
- package/dist/components/artifacts/deferred-chat-media.d.ts +15 -0
- package/dist/components/artifacts/document-editor.d.ts +4 -2
- package/dist/components/artifacts/editable-artifact-ui.d.ts +2 -1
- package/dist/components/artifacts/editable-artifact-view.d.ts +46 -0
- package/dist/components/artifacts/editable-document.d.ts +1 -1
- package/dist/components/artifacts/editable-presentation.d.ts +2 -2
- package/dist/components/artifacts/editable-spreadsheet.d.ts +2 -1
- package/dist/components/artifacts/index.d.ts +8 -1
- package/dist/components/artifacts/inline-html-document.d.ts +2 -0
- package/dist/components/artifacts/latest-task-runner.d.ts +15 -0
- package/dist/components/artifacts/presentation-editor.d.ts +6 -2
- package/dist/components/artifacts/published-html-artifact-frame.d.ts +48 -3
- package/dist/components/artifacts/session-artifact-viewer.d.ts +39 -0
- package/dist/components/artifacts/site-view.d.ts +23 -0
- package/dist/components/artifacts/spreadsheet-general-display.d.ts +24 -0
- package/dist/components/artifacts/visualization-assets.gen.d.ts +2 -0
- package/dist/components/browser-select-control.d.ts +16 -0
- package/dist/components/browser-viewer.d.ts +10 -1
- package/dist/components/chat-composer.d.ts +21 -3
- package/dist/components/child-session-link.d.ts +5 -0
- package/dist/components/claude-mark.d.ts +3 -0
- package/dist/components/code-editor.d.ts +1 -4
- package/dist/components/composer.d.ts +45 -4
- package/dist/components/computer-viewer.d.ts +4 -1
- package/dist/components/copy-button.d.ts +3 -1
- package/dist/components/desktop-viewer.d.ts +1 -1
- package/dist/components/enrollment-consent.d.ts +6 -3
- package/dist/components/file-browser.d.ts +10 -1
- package/dist/components/fleet-tile.d.ts +2 -2
- package/dist/components/grok-mark.d.ts +26 -0
- package/dist/components/human-input-form.d.ts +21 -2
- package/dist/components/human-input-surface.d.ts +6 -3
- package/dist/components/machine-card.d.ts +4 -1
- package/dist/components/machines/machine-detail.d.ts +4 -1
- package/dist/components/machines/machine-operation-policy.d.ts +11 -0
- package/dist/components/machines-dashboard.d.ts +3 -1
- package/dist/components/markdown-table-layout.d.ts +12 -0
- package/dist/components/markdown.d.ts +47 -3
- package/dist/components/message-timeline.d.ts +72 -9
- package/dist/components/model-mark.d.ts +29 -0
- package/dist/components/model-policy-picker-menu.d.ts +9 -0
- package/dist/components/model-policy-picker.d.ts +62 -13
- package/dist/components/open-geni-chat.d.ts +55 -0
- package/dist/components/open-geni-links.d.ts +68 -0
- package/dist/components/openrouter-mark.d.ts +6 -0
- package/dist/components/pierre-file.d.ts +1 -1
- package/dist/components/preview-loading.d.ts +2 -0
- package/dist/components/queue-item-content.d.ts +9 -0
- package/dist/components/sandbox-files.d.ts +13 -2
- package/dist/components/sandbox-workspace.d.ts +43 -3
- package/dist/components/session-capability-frame.d.ts +35 -0
- package/dist/components/session-chrome.d.ts +66 -8
- package/dist/components/session-commands-panel.d.ts +6 -0
- package/dist/components/session-commands.d.ts +6 -0
- package/dist/components/session-connection-request.d.ts +8 -0
- package/dist/components/session-conversation.d.ts +86 -0
- package/dist/components/session-list.d.ts +36 -0
- package/dist/components/session-mcp-capability-card.d.ts +41 -0
- package/dist/components/timeline-anchor.d.ts +24 -0
- package/dist/components/timeline-annotation-chrome.d.ts +25 -0
- package/dist/components/timeline-annotation-layout.d.ts +42 -0
- package/dist/components/timeline-annotation-markers.d.ts +8 -0
- package/dist/components/timeline-annotation-reveal-context.d.ts +4 -0
- package/dist/components/timeline-annotation-shared.d.ts +31 -0
- package/dist/components/timeline-annotations-dialog.d.ts +3 -2
- package/dist/components/timeline-annotations.d.ts +13 -3
- package/dist/components/timeline-reading-progress.d.ts +11 -0
- package/dist/components/timeline-search.d.ts +34 -0
- package/dist/components/timeline-settlement.d.ts +16 -0
- package/dist/components/tip-follow.d.ts +16 -0
- package/dist/components/usage-limit-notice.d.ts +49 -0
- package/dist/components/usage-member-list.d.ts +91 -0
- package/dist/components/usage-meter.d.ts +73 -0
- package/dist/components/use-viewer-menu-dismiss.d.ts +2 -0
- package/dist/components/user-message-body.d.ts +10 -1
- package/dist/components/workspace-dock.d.ts +6 -2
- package/dist/composer.d.ts +5 -4
- package/dist/composer.js +15 -9
- package/dist/computer-viewer-ENHVAZ2Q.js +19 -0
- package/dist/computer-viewer-ENHVAZ2Q.js.map +1 -0
- package/dist/connect-account-identity.d.ts +8 -0
- package/dist/connect-accounts.d.ts +15 -0
- package/dist/connect-chooser.d.ts +18 -0
- package/dist/connect-panel.d.ts +18 -0
- package/dist/connect-setup.d.ts +16 -0
- package/dist/connect.d.ts +21 -0
- package/dist/connect.js +2129 -0
- package/dist/connect.js.map +1 -0
- package/dist/connection-catalog.d.ts +38 -0
- package/dist/connection-discovery.d.ts +12 -0
- package/dist/connection-installed.d.ts +17 -0
- package/dist/connection-logo.d.ts +9 -0
- package/dist/connection-service-logo.d.ts +8 -0
- package/dist/connection-service-presentation.d.ts +13 -0
- package/dist/connection-skeleton.d.ts +5 -0
- package/dist/connection-type-picker.d.ts +6 -0
- package/dist/conversation-timeline.d.ts +5 -0
- package/dist/desktop.d.ts +7 -0
- package/dist/desktop.js +26 -0
- package/dist/desktop.js.map +1 -0
- package/dist/device-authorization.d.ts +23 -0
- package/dist/diffs.d.ts +8 -0
- package/dist/diffs.js +14 -0
- package/dist/diffs.js.map +1 -0
- package/dist/discovery-cache.d.ts +5 -0
- package/dist/editor.d.ts +7 -0
- package/dist/editor.js +21 -0
- package/dist/editor.js.map +1 -0
- package/dist/embedded-session-client.d.ts +23 -0
- package/dist/file-node-visibility.d.ts +15 -0
- package/dist/{fleet-decision-row-GGCAT4E4.js → fleet-decision-row-YZ3ZKWMM.js} +2 -1
- package/dist/fleet-decision-row-YZ3ZKWMM.js.map +1 -0
- package/dist/hooks/channel-cache.d.ts +23 -0
- package/dist/hooks/latest-question.d.ts +25 -0
- package/dist/hooks/shared-machines-list.d.ts +14 -0
- package/dist/hooks/use-attached-browsers.d.ts +2 -1
- package/dist/hooks/use-browser-frame-stream.d.ts +1 -1
- package/dist/hooks/use-browser-session.d.ts +12 -1
- package/dist/hooks/use-channels.d.ts +1 -0
- package/dist/hooks/use-codex-accounts.d.ts +25 -7
- package/dist/hooks/use-composer.d.ts +45 -9
- package/dist/hooks/use-computer-frame-stream.d.ts +1 -1
- package/dist/hooks/use-computer-input-posture.d.ts +13 -0
- package/dist/hooks/use-computer-session.d.ts +2 -0
- package/dist/hooks/use-connect.d.ts +22 -0
- package/dist/hooks/use-desktop-stream.d.ts +1 -1
- package/dist/hooks/use-file-attachments.d.ts +21 -2
- package/dist/hooks/use-machine-chip.d.ts +3 -3
- package/dist/hooks/use-machines.d.ts +19 -1
- package/dist/hooks/use-sandbox-files.d.ts +5 -1
- package/dist/hooks/use-session-background-commands.d.ts +14 -0
- package/dist/hooks/use-session-events.d.ts +30 -8
- package/dist/hooks/use-session-lineage.d.ts +4 -0
- package/dist/hooks/use-session-mcp-approval-policy.d.ts +2 -2
- package/dist/hooks/use-session.d.ts +6 -0
- package/dist/hooks/use-turn-queue.d.ts +12 -0
- package/dist/hooks/use-usage.d.ts +40 -0
- package/dist/hooks/use-workspace-edit.d.ts +4 -0
- package/dist/hooks/use-workspace-sessions.d.ts +27 -5
- package/dist/human-input.d.ts +3 -1
- package/dist/identity-link-accounts.d.ts +11 -0
- package/dist/identity-link-consent.d.ts +18 -0
- package/dist/index.d.ts +60 -17
- package/dist/index.js +2237 -6200
- package/dist/index.js.map +1 -1
- package/dist/interaction.d.ts +1 -1
- package/dist/interaction.js +35 -184
- package/dist/interaction.js.map +1 -1
- package/dist/latest-question-755OW5DS.js +117 -0
- package/dist/latest-question-755OW5DS.js.map +1 -0
- package/dist/lib/error-message.d.ts +7 -0
- package/dist/lib/format.d.ts +36 -2
- package/dist/lib/host-theme.d.ts +70 -0
- package/dist/lib/interaction-errors.d.ts +6 -0
- package/dist/lib/menu-styles.d.ts +22 -0
- package/dist/lib/pierre-diffs-loader.d.ts +20 -0
- package/dist/lib/workbench-peers.d.ts +36 -0
- package/dist/lib/xterm-theme.d.ts +7 -5
- package/dist/machines.d.ts +4 -2
- package/dist/machines.js +14 -4
- package/dist/markdown-table-layout-QXSLK4BY.js +106 -0
- package/dist/markdown-table-layout-QXSLK4BY.js.map +1 -0
- package/dist/mcp-connection-status.d.ts +14 -0
- package/dist/model-policy-picker-menu-PWRI7R2X.js +14 -0
- package/dist/model-policy-picker-menu-PWRI7R2X.js.map +1 -0
- package/dist/model-policy.d.ts +19 -3
- package/dist/model-policy.js +9 -1
- package/dist/older-history.d.ts +30 -0
- package/dist/platform-activity-row-627BFZ46.js +182 -0
- package/dist/platform-activity-row-627BFZ46.js.map +1 -0
- package/dist/plugin-details.d.ts +14 -0
- package/dist/plugin-discovery.d.ts +25 -0
- package/dist/provider.d.ts +13 -1
- package/dist/{queue-surface-implementation-2KVJTYXH.js → queue-surface-implementation-ZHFI5JBP.js} +131 -44
- package/dist/queue-surface-implementation-ZHFI5JBP.js.map +1 -0
- package/dist/realtime/realtime-control.d.ts +10 -3
- package/dist/realtime.js +229 -83
- package/dist/realtime.js.map +1 -1
- package/dist/sandbox-files-BBC47SLD.js +20 -0
- package/dist/sandbox-files-BBC47SLD.js.map +1 -0
- package/dist/session-auth-recommendation.d.ts +5 -0
- package/dist/session-capability-policy.d.ts +12 -0
- package/dist/session-ui.d.ts +30 -2
- package/dist/session-ui.js +85 -7
- package/dist/session-ui.js.map +1 -1
- package/dist/session.d.ts +8 -2
- package/dist/session.js +30 -19
- package/dist/sites-ui.d.ts +34 -0
- package/dist/sites.d.ts +3 -0
- package/dist/sites.js +11 -0
- package/dist/sites.js.map +1 -0
- package/dist/skill-discovery.d.ts +47 -0
- package/dist/terminal.d.ts +8 -0
- package/dist/terminal.js +31 -0
- package/dist/terminal.js.map +1 -0
- package/dist/timeline/activity-rail.d.ts +11 -2
- package/dist/timeline/allowance-exhausted-row.d.ts +24 -0
- package/dist/timeline/compaction-copy.d.ts +10 -0
- package/dist/timeline/entrance.d.ts +13 -1
- package/dist/timeline/genie-loading.d.ts +34 -0
- package/dist/timeline/index.d.ts +6 -2
- package/dist/timeline/knowledge-receipt.d.ts +17 -0
- package/dist/timeline/platform-activity-row.d.ts +14 -0
- package/dist/timeline/presented-image.d.ts +6 -0
- package/dist/timeline/projection.d.ts +31 -2
- package/dist/timeline/registry.d.ts +2 -0
- package/dist/timeline/retained-image.d.ts +18 -0
- package/dist/timeline/rolling-activity.d.ts +11 -0
- package/dist/timeline/screenshot-lightbox.d.ts +16 -1
- package/dist/timeline/shared.d.ts +8 -3
- package/dist/timeline/startup-preference.d.ts +3 -0
- package/dist/timeline/startup-timings.d.ts +4 -0
- package/dist/timeline/tool-display-name.d.ts +2 -1
- package/dist/timeline/turn-summary.d.ts +32 -3
- package/dist/timeline/types.d.ts +141 -7
- package/dist/timeline-annotation-markers-GNDHTGBD.js +165 -0
- package/dist/timeline-annotation-markers-GNDHTGBD.js.map +1 -0
- package/dist/timeline-annotation-selection-DMLMM2TX.js +241 -0
- package/dist/timeline-annotation-selection-DMLMM2TX.js.map +1 -0
- package/dist/timeline-annotations-dialog-ELRDBHTS.js +273 -0
- package/dist/timeline-annotations-dialog-ELRDBHTS.js.map +1 -0
- package/dist/types/machines.d.ts +2 -2
- package/dist/usage/allowance-copy.d.ts +25 -0
- package/dist/usage/summary.d.ts +35 -0
- package/dist/usage.d.ts +13 -0
- package/dist/usage.js +1074 -0
- package/dist/usage.js.map +1 -0
- package/package.json +44 -4
- package/src/accounts.tsx +1072 -0
- package/src/approvals.ts +8 -1
- package/src/artifacts.ts +42 -0
- package/src/assets/README.md +8 -0
- package/src/assets/gmail.ico +0 -0
- package/src/assets/outlook.ico +0 -0
- package/src/capability-catalog-row.tsx +94 -0
- package/src/capability-logo-fallback.ts +22 -0
- package/src/client.ts +22 -13
- package/src/commands/registry.ts +18 -15
- package/src/commands/types.ts +2 -0
- package/src/components/anthropic-mark.tsx +10 -0
- package/src/components/approval-surface.tsx +171 -37
- package/src/components/artifacts/artifact-chrome.tsx +413 -0
- package/src/components/artifacts/artifact-sandbox.tsx +185 -0
- package/src/components/artifacts/artifact-surface.tsx +39 -19
- package/src/components/artifacts/chat-interactive-block.tsx +260 -0
- package/src/components/artifacts/deferred-chat-media.tsx +67 -0
- package/src/components/artifacts/document-editor.tsx +141 -16
- package/src/components/artifacts/editable-artifact-ui.tsx +4 -2
- package/src/components/artifacts/editable-artifact-view.tsx +187 -0
- package/src/components/artifacts/editable-artifact-workbench.tsx +5 -2
- package/src/components/artifacts/editable-document.tsx +37 -36
- package/src/components/artifacts/editable-presentation.tsx +36 -18
- package/src/components/artifacts/editable-spreadsheet.tsx +5 -2
- package/src/components/artifacts/index.ts +44 -0
- package/src/components/artifacts/inline-html-document.ts +24 -0
- package/src/components/artifacts/latest-task-runner.ts +49 -0
- package/src/components/artifacts/presentation-editor.tsx +323 -67
- package/src/components/artifacts/published-html-artifact-frame.tsx +338 -5
- package/src/components/artifacts/session-artifact-viewer.tsx +376 -0
- package/src/components/artifacts/site-view.tsx +116 -0
- package/src/components/artifacts/spreadsheet-canvas.ts +5 -10
- package/src/components/artifacts/spreadsheet-general-display.ts +43 -0
- package/src/components/artifacts/spreadsheet-grid.tsx +12 -13
- package/src/components/artifacts/visualization-assets/base.css +1015 -0
- package/src/components/artifacts/visualization-assets/helpers.html +349 -0
- package/src/components/artifacts/visualization-assets.gen.ts +3 -0
- package/src/components/browser-select-control.tsx +312 -0
- package/src/components/browser-viewer.tsx +1054 -314
- package/src/components/chat-composer.tsx +131 -85
- package/src/components/child-session-link.tsx +27 -0
- package/src/components/claude-mark.tsx +10 -0
- package/src/components/code-editor.tsx +13 -16
- package/src/components/composer-transcription-control.tsx +7 -5
- package/src/components/composer.tsx +376 -49
- package/src/components/computer-viewer.tsx +1041 -329
- package/src/components/copy-button.tsx +13 -5
- package/src/components/desktop-viewer.tsx +1 -1
- package/src/components/enrollment-consent.tsx +65 -7
- package/src/components/enrollment-device-flow.tsx +1 -1
- package/src/components/file-browser.tsx +158 -34
- package/src/components/fleet-tile.tsx +8 -16
- package/src/components/generated-video-player.tsx +4 -2
- package/src/components/grok-mark.tsx +33 -0
- package/src/components/human-input-form.tsx +455 -114
- package/src/components/human-input-surface.tsx +18 -7
- package/src/components/interaction-intervention-banner.tsx +2 -2
- package/src/components/machine-card.tsx +119 -4
- package/src/components/machine-dock-bar.tsx +1 -1
- package/src/components/machine-input-display.ts +23 -2
- package/src/components/machines/machine-detail.tsx +52 -2
- package/src/components/machines/machine-operation-policy.tsx +179 -0
- package/src/components/machines-dashboard.tsx +8 -17
- package/src/components/markdown-table-layout.ts +132 -0
- package/src/components/markdown.tsx +473 -44
- package/src/components/message-timeline.tsx +2498 -663
- package/src/components/model-mark.tsx +90 -0
- package/src/components/model-picker.tsx +15 -4
- package/src/components/model-policy-picker-menu.tsx +424 -0
- package/src/components/model-policy-picker.tsx +337 -381
- package/src/components/open-geni-chat.tsx +319 -0
- package/src/components/open-geni-links.tsx +179 -0
- package/src/components/openrouter-mark.tsx +13 -0
- package/src/components/pierre-diff.tsx +41 -16
- package/src/components/pierre-file.tsx +36 -11
- package/src/components/preview-loading.tsx +154 -0
- package/src/components/queue-item-content.ts +14 -0
- package/src/components/queue-surface-implementation.tsx +132 -42
- package/src/components/queue-surface-state.tsx +3 -1
- package/src/components/sandbox-files.tsx +267 -35
- package/src/components/sandbox-terminal.tsx +48 -11
- package/src/components/sandbox-workspace.tsx +337 -135
- package/src/components/session-capability-frame.tsx +192 -0
- package/src/components/session-chrome.tsx +1027 -328
- package/src/components/session-commands-panel.tsx +126 -0
- package/src/components/session-commands.tsx +18 -0
- package/src/components/session-connection-request.tsx +97 -0
- package/src/components/session-conversation.tsx +512 -0
- package/src/components/session-list.tsx +250 -0
- package/src/components/session-mcp-capability-card.tsx +680 -0
- package/src/components/session-status.tsx +1 -1
- package/src/components/timeline-anchor.tsx +119 -0
- package/src/components/timeline-annotation-chrome.tsx +196 -0
- package/src/components/timeline-annotation-layout.ts +268 -0
- package/src/components/timeline-annotation-markers.tsx +185 -0
- package/src/components/timeline-annotation-reveal-context.ts +9 -0
- package/src/components/timeline-annotation-selection.tsx +106 -54
- package/src/components/timeline-annotation-shared.ts +245 -0
- package/src/components/timeline-annotations-dialog.tsx +185 -128
- package/src/components/timeline-annotations.tsx +189 -45
- package/src/components/timeline-reading-progress.ts +80 -0
- package/src/components/timeline-search.tsx +168 -0
- package/src/components/timeline-settlement.ts +60 -0
- package/src/components/tip-follow.ts +70 -7
- package/src/components/tooltip.tsx +38 -5
- package/src/components/usage-limit-notice.tsx +179 -0
- package/src/components/usage-member-list.tsx +792 -0
- package/src/components/usage-meter.tsx +382 -0
- package/src/components/use-viewer-menu-dismiss.ts +33 -0
- package/src/components/user-message-body.tsx +194 -49
- package/src/components/workspace-dock.tsx +141 -175
- package/src/composer.ts +6 -1
- package/src/connect-account-identity.tsx +34 -0
- package/src/connect-accounts.tsx +233 -0
- package/src/connect-chooser.tsx +336 -0
- package/src/connect-panel.tsx +99 -0
- package/src/connect-setup.tsx +307 -0
- package/src/connect.ts +60 -0
- package/src/connection-assets.d.ts +4 -0
- package/src/connection-catalog.tsx +162 -0
- package/src/connection-discovery.tsx +235 -0
- package/src/connection-installed.tsx +51 -0
- package/src/connection-logo.tsx +37 -0
- package/src/connection-service-logo.tsx +55 -0
- package/src/connection-service-presentation.ts +46 -0
- package/src/connection-skeleton.tsx +16 -0
- package/src/connection-type-picker.tsx +36 -0
- package/src/conversation-timeline.ts +92 -0
- package/src/desktop.ts +24 -0
- package/src/device-authorization.tsx +98 -0
- package/src/diffs.ts +16 -0
- package/src/discovery-cache.ts +42 -0
- package/src/editor.ts +13 -0
- package/src/embedded-session-client.ts +104 -0
- package/src/file-node-visibility.ts +66 -0
- package/src/hooks/channel-cache.ts +104 -0
- package/src/hooks/internal.ts +3 -2
- package/src/hooks/latest-question.ts +164 -0
- package/src/hooks/shared-machines-list.ts +239 -0
- package/src/hooks/use-attached-browsers.ts +5 -1
- package/src/hooks/use-available-models.ts +20 -14
- package/src/hooks/use-browser-frame-stream.ts +25 -3
- package/src/hooks/use-browser-session.ts +271 -71
- package/src/hooks/use-browser-sessions.ts +7 -1
- package/src/hooks/use-channels.ts +32 -10
- package/src/hooks/use-codex-accounts.ts +78 -21
- package/src/hooks/use-composer.ts +1034 -320
- package/src/hooks/use-computer-frame-stream.ts +39 -16
- package/src/hooks/use-computer-input-posture.ts +94 -0
- package/src/hooks/use-computer-session.ts +110 -32
- package/src/hooks/use-computer-sessions.ts +8 -1
- package/src/hooks/use-connect.ts +23 -0
- package/src/hooks/use-desktop-stream.ts +19 -28
- package/src/hooks/use-file-attachments.ts +118 -10
- package/src/hooks/use-goal.ts +36 -9
- package/src/hooks/use-human-input.ts +31 -4
- package/src/hooks/use-last-started-turn-policy.ts +15 -13
- package/src/hooks/use-machine-chip.ts +23 -6
- package/src/hooks/use-machines.ts +104 -6
- package/src/hooks/use-sandbox-files.ts +253 -150
- package/src/hooks/use-sandbox-git.ts +58 -29
- package/src/hooks/use-session-background-commands.ts +67 -0
- package/src/hooks/use-session-capabilities.ts +21 -2
- package/src/hooks/use-session-events.ts +759 -433
- package/src/hooks/use-session-lineage.ts +28 -6
- package/src/hooks/use-session-mcp-approval-policy.ts +13 -5
- package/src/hooks/use-session.ts +75 -16
- package/src/hooks/use-slash-commands.ts +6 -11
- package/src/hooks/use-turn-queue.ts +113 -13
- package/src/hooks/use-usage.ts +100 -0
- package/src/hooks/use-voice-input.ts +12 -1
- package/src/hooks/use-workspace-capture.ts +3 -2
- package/src/hooks/use-workspace-edit.ts +23 -5
- package/src/hooks/use-workspace-sessions.ts +99 -11
- package/src/human-input.ts +12 -1
- package/src/identity-link-accounts.tsx +148 -0
- package/src/identity-link-consent.tsx +192 -0
- package/src/index.ts +157 -12
- package/src/interaction.ts +1 -0
- package/src/lib/error-message.ts +37 -0
- package/src/lib/format.ts +150 -14
- package/src/lib/host-theme.ts +511 -0
- package/src/lib/interaction-errors.ts +33 -0
- package/src/lib/menu-styles.ts +44 -0
- package/src/lib/pierre-diffs-loader.ts +53 -0
- package/src/lib/workbench-peers.ts +62 -0
- package/src/lib/xterm-theme.ts +23 -21
- package/src/machines.ts +9 -1
- package/src/mcp-connection-status.ts +35 -0
- package/src/model-policy.ts +223 -69
- package/src/older-history.ts +87 -0
- package/src/plugin-details.tsx +185 -0
- package/src/plugin-discovery.tsx +196 -0
- package/src/provider.tsx +55 -14
- package/src/realtime/dropdown-menu.tsx +19 -12
- package/src/realtime/realtime-control.tsx +274 -60
- package/src/session-auth-recommendation.ts +48 -0
- package/src/session-capability-policy.ts +83 -0
- package/src/session-context.ts +1 -0
- package/src/session-ui.ts +66 -2
- package/src/session.ts +18 -1
- package/src/sites-ui.tsx +402 -0
- package/src/sites.ts +3 -0
- package/src/skill-discovery.tsx +208 -0
- package/src/terminal.ts +26 -0
- package/src/timeline/activity-rail.tsx +171 -80
- package/src/timeline/allowance-exhausted-row.tsx +86 -0
- package/src/timeline/compaction-copy.ts +42 -0
- package/src/timeline/entrance.tsx +28 -3
- package/src/timeline/fleet-decision-projection.ts +2 -1
- package/src/timeline/fleet-decision-row.tsx +1 -0
- package/src/timeline/genie-loading.tsx +136 -0
- package/src/timeline/index.ts +11 -0
- package/src/timeline/knowledge-receipt.tsx +100 -0
- package/src/timeline/parsers.ts +2 -2
- package/src/timeline/platform-activity-row.tsx +216 -0
- package/src/timeline/presented-image.ts +49 -0
- package/src/timeline/projection.ts +1600 -84
- package/src/timeline/registry.ts +15 -3
- package/src/timeline/retained-image.ts +97 -0
- package/src/timeline/rolling-activity.tsx +92 -0
- package/src/timeline/screenshot-lightbox.tsx +115 -17
- package/src/timeline/shared.tsx +47 -15
- package/src/timeline/startup-preference.ts +33 -0
- package/src/timeline/startup-timings.tsx +145 -0
- package/src/timeline/tool-display-name.ts +8 -6
- package/src/timeline/tool-renderers.tsx +497 -128
- package/src/timeline/turn-summary.tsx +208 -44
- package/src/timeline/types.ts +186 -7
- package/src/types/machines.ts +10 -0
- package/src/usage/allowance-copy.ts +64 -0
- package/src/usage/summary.ts +93 -0
- package/src/usage.ts +50 -0
- package/styles/compiled.css +2098 -757
- package/styles/connect.css +284 -0
- package/styles/connect.d.ts +1 -0
- package/styles/effective-tokens.css +1 -0
- package/styles/index.css +201 -9
- package/styles/responsive.css +27 -1
- package/styles/session-capability.css +44 -0
- package/styles/tokens.css +135 -65
- package/dist/chunk-5UQPNLIO.js.map +0 -1
- package/dist/chunk-6KLX2RH5.js.map +0 -1
- package/dist/chunk-7WCLAEFV.js.map +0 -1
- package/dist/chunk-B6WPZSTT.js.map +0 -1
- package/dist/chunk-FK6VG4LL.js +0 -90
- package/dist/chunk-FK6VG4LL.js.map +0 -1
- package/dist/chunk-HA46CYQK.js.map +0 -1
- package/dist/chunk-HUIKIDM5.js.map +0 -1
- package/dist/chunk-IGC6A2ZI.js.map +0 -1
- package/dist/chunk-KCGXPP5V.js.map +0 -1
- package/dist/chunk-KZ73RL76.js.map +0 -1
- package/dist/chunk-LAKLF4PA.js +0 -141
- package/dist/chunk-LAKLF4PA.js.map +0 -1
- package/dist/chunk-LLOLUHVG.js.map +0 -1
- package/dist/chunk-MKPIAGVL.js +0 -465
- package/dist/chunk-MKPIAGVL.js.map +0 -1
- package/dist/chunk-PEI6RANI.js.map +0 -1
- package/dist/chunk-R3AZOAB5.js.map +0 -1
- package/dist/chunk-WSK7G5LE.js +0 -170
- package/dist/chunk-WSK7G5LE.js.map +0 -1
- package/dist/chunk-XBZWOM2K.js +0 -218
- package/dist/chunk-XBZWOM2K.js.map +0 -1
- package/dist/chunk-Y7OEDUJ5.js +0 -8810
- package/dist/chunk-Y7OEDUJ5.js.map +0 -1
- package/dist/fleet-decision-row-GGCAT4E4.js.map +0 -1
- package/dist/hooks/use-packs.d.ts +0 -32
- package/dist/interactive-workbench-viewers-TOHBXJEE.js +0 -15
- package/dist/queue-surface-implementation-2KVJTYXH.js.map +0 -1
- package/dist/timeline-annotation-selection-3L7LHGG2.js +0 -187
- package/dist/timeline-annotation-selection-3L7LHGG2.js.map +0 -1
- package/dist/timeline-annotations-dialog-U7EVLR75.js +0 -196
- package/dist/timeline-annotations-dialog-U7EVLR75.js.map +0 -1
- package/src/hooks/use-packs.ts +0 -157
- /package/dist/{interactive-workbench-viewers-TOHBXJEE.js.map → browser-viewer-GTR5XQ7X.js.map} +0 -0
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
import type { OpenGeniClient } from "@opengeni/sdk";
|
|
2
|
+
import { ArrowUpIcon, LoaderCircleIcon, MenuIcon, XIcon } from "lucide-react";
|
|
3
|
+
import { useCallback, useRef, useState, type CSSProperties, type FormEvent } from "react";
|
|
4
|
+
import { cn } from "../lib/cn";
|
|
5
|
+
import { useErrorMessage } from "../lib/error-message";
|
|
6
|
+
import {
|
|
7
|
+
useHostTheme,
|
|
8
|
+
type HostSurfacePreference,
|
|
9
|
+
type HostThemePreference,
|
|
10
|
+
} from "../lib/host-theme";
|
|
11
|
+
import { useOpenGeni, type ClientOverride } from "../session-context";
|
|
12
|
+
import { SessionConversation, type SessionConversationProps } from "./session-conversation";
|
|
13
|
+
import { SessionList, type SessionListLabels, type SessionListProps } from "./session-list";
|
|
14
|
+
|
|
15
|
+
export type OpenGeniChatLabels = SessionListLabels & {
|
|
16
|
+
openChats: string;
|
|
17
|
+
closeChats: string;
|
|
18
|
+
newChatPlaceholder: string;
|
|
19
|
+
/** Heading above the new-chat composer; empty hides it. */
|
|
20
|
+
newChatTitle: string;
|
|
21
|
+
send: string;
|
|
22
|
+
newChatUnavailable: string;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
const DEFAULT_LABELS: Omit<OpenGeniChatLabels, keyof SessionListLabels> = {
|
|
26
|
+
openChats: "Open chats",
|
|
27
|
+
closeChats: "Close chats",
|
|
28
|
+
newChatPlaceholder: "Ask anything…",
|
|
29
|
+
newChatTitle: "How can I help?",
|
|
30
|
+
send: "Send",
|
|
31
|
+
newChatUnavailable: "New chats are not enabled for this product.",
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export type OpenGeniChatProps = ClientOverride & {
|
|
35
|
+
/** Controlled selection. `null` shows the new-chat composer. */
|
|
36
|
+
sessionId?: string | null | undefined;
|
|
37
|
+
/** Initial selection when uncontrolled. Defaults to a new chat. */
|
|
38
|
+
defaultSessionId?: string | null | undefined;
|
|
39
|
+
onSessionChange?: ((sessionId: string | null) => void) | undefined;
|
|
40
|
+
/**
|
|
41
|
+
* Create a chat from its first message. Defaults to `client.createSession`
|
|
42
|
+
* with `{ initialMessage, idempotencyKey }`, which `createSessionProxyHandler`
|
|
43
|
+
* accepts when the server supplies a `createSession` hook. Return the new id.
|
|
44
|
+
*/
|
|
45
|
+
createSession?: ((initialMessage: string, idempotencyKey: string) => Promise<string>) | undefined;
|
|
46
|
+
/** Hide the "New chat" entry point. */
|
|
47
|
+
newChat?: boolean | undefined;
|
|
48
|
+
/** Forwarded to the conversation (message rendering, tool renderers, composer...). */
|
|
49
|
+
conversationProps?: Omit<SessionConversationProps, "sessionId" | "client" | "workspaceId">;
|
|
50
|
+
/** Forwarded to the list (rename/archive toggles, page size). */
|
|
51
|
+
listProps?: Pick<SessionListProps, "rename" | "archive" | "pageSize"> | undefined;
|
|
52
|
+
labels?: Partial<OpenGeniChatLabels> | undefined;
|
|
53
|
+
className?: string | undefined;
|
|
54
|
+
/** Defaults to filling the host. */
|
|
55
|
+
height?: CSSProperties["height"];
|
|
56
|
+
/**
|
|
57
|
+
* Light or dark. Defaults to `auto`: follow the host page (an enclosing
|
|
58
|
+
* `data-og-theme`, `class="dark"`/`data-theme` on <html> or <body>, the
|
|
59
|
+
* host's `color-scheme`, then its background), not the OS setting alone.
|
|
60
|
+
*/
|
|
61
|
+
theme?: HostThemePreference | undefined;
|
|
62
|
+
/**
|
|
63
|
+
* `host` (default) derives backgrounds and cards from the host background so
|
|
64
|
+
* the chat blends in; `theme` uses the `--og-color-*` surface tokens as they
|
|
65
|
+
* are. Customized surface tokens are always kept.
|
|
66
|
+
*/
|
|
67
|
+
surface?: HostSurfacePreference | undefined;
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
type CreateClient = Partial<Pick<OpenGeniClient, "createSession">>;
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* A complete chat experience: the user's chat list plus the conversation.
|
|
74
|
+
* The list is a sidebar when the component is wide and a drawer when narrow
|
|
75
|
+
* (container-based, so it adapts inside panels as well as full pages).
|
|
76
|
+
*/
|
|
77
|
+
export function OpenGeniChat({
|
|
78
|
+
client,
|
|
79
|
+
workspaceId,
|
|
80
|
+
sessionId: controlledSessionId,
|
|
81
|
+
defaultSessionId = null,
|
|
82
|
+
onSessionChange,
|
|
83
|
+
createSession,
|
|
84
|
+
newChat = true,
|
|
85
|
+
conversationProps,
|
|
86
|
+
listProps,
|
|
87
|
+
labels: labelOverrides,
|
|
88
|
+
className,
|
|
89
|
+
height = "100%",
|
|
90
|
+
theme,
|
|
91
|
+
surface,
|
|
92
|
+
}: OpenGeniChatProps) {
|
|
93
|
+
const labels = { ...DEFAULT_LABELS, ...labelOverrides } as OpenGeniChatLabels;
|
|
94
|
+
const scope = { client, workspaceId };
|
|
95
|
+
const context = useOpenGeni(scope);
|
|
96
|
+
const [uncontrolled, setUncontrolled] = useState<string | null>(defaultSessionId);
|
|
97
|
+
const selected = controlledSessionId !== undefined ? controlledSessionId : uncontrolled;
|
|
98
|
+
const [drawerOpen, setDrawerOpen] = useState(false);
|
|
99
|
+
const [listRevision, setListRevision] = useState(0);
|
|
100
|
+
const root = useRef<HTMLDivElement>(null);
|
|
101
|
+
const hostTheme = useHostTheme(root, { theme, surface });
|
|
102
|
+
|
|
103
|
+
const select = useCallback(
|
|
104
|
+
(next: string | null) => {
|
|
105
|
+
if (controlledSessionId === undefined) setUncontrolled(next);
|
|
106
|
+
onSessionChange?.(next);
|
|
107
|
+
setDrawerOpen(false);
|
|
108
|
+
},
|
|
109
|
+
[controlledSessionId, onSessionChange],
|
|
110
|
+
);
|
|
111
|
+
|
|
112
|
+
const create = useCallback(
|
|
113
|
+
async (initialMessage: string, idempotencyKey: string): Promise<string> => {
|
|
114
|
+
if (createSession) return await createSession(initialMessage, idempotencyKey);
|
|
115
|
+
const creator = (context.client as unknown as CreateClient).createSession;
|
|
116
|
+
if (typeof creator !== "function") throw new Error(labels.newChatUnavailable);
|
|
117
|
+
const created = await creator.call(context.client, context.workspaceId, {
|
|
118
|
+
initialMessage,
|
|
119
|
+
idempotencyKey,
|
|
120
|
+
} as Parameters<NonNullable<CreateClient["createSession"]>>[1]);
|
|
121
|
+
return created.id;
|
|
122
|
+
},
|
|
123
|
+
[context.client, context.workspaceId, createSession, labels.newChatUnavailable],
|
|
124
|
+
);
|
|
125
|
+
|
|
126
|
+
const list = (
|
|
127
|
+
<SessionList
|
|
128
|
+
{...scope}
|
|
129
|
+
{...listProps}
|
|
130
|
+
labels={labels}
|
|
131
|
+
selectedSessionId={selected}
|
|
132
|
+
onSelect={select}
|
|
133
|
+
onNewChat={newChat ? () => select(null) : undefined}
|
|
134
|
+
onArchived={(archivedId) => {
|
|
135
|
+
if (archivedId === selected) select(null);
|
|
136
|
+
}}
|
|
137
|
+
refreshKey={listRevision}
|
|
138
|
+
className="h-full"
|
|
139
|
+
/>
|
|
140
|
+
);
|
|
141
|
+
|
|
142
|
+
return (
|
|
143
|
+
<div
|
|
144
|
+
ref={root}
|
|
145
|
+
className={cn(
|
|
146
|
+
"og-root og-chat relative flex min-h-0 min-w-0 bg-og-bg text-og-base text-og-fg",
|
|
147
|
+
className,
|
|
148
|
+
)}
|
|
149
|
+
style={{ ...hostTheme.style, height }}
|
|
150
|
+
data-og-theme={hostTheme.attribute}
|
|
151
|
+
data-og-host-theme=""
|
|
152
|
+
data-og-chat=""
|
|
153
|
+
>
|
|
154
|
+
<aside
|
|
155
|
+
className="og-chat-sidebar min-h-0 w-64 shrink-0 flex-col border-r border-og-border"
|
|
156
|
+
data-og-chat-sidebar=""
|
|
157
|
+
>
|
|
158
|
+
{list}
|
|
159
|
+
</aside>
|
|
160
|
+
{drawerOpen ? (
|
|
161
|
+
<div className="og-chat-drawer absolute inset-0 z-30 flex" data-og-chat-drawer="">
|
|
162
|
+
<div className="flex h-full w-[min(20rem,85%)] flex-col border-r border-og-border bg-og-bg shadow-og-lg">
|
|
163
|
+
<div className="flex justify-end p-1">
|
|
164
|
+
<button
|
|
165
|
+
type="button"
|
|
166
|
+
aria-label={labels.closeChats}
|
|
167
|
+
onClick={() => setDrawerOpen(false)}
|
|
168
|
+
className="rounded p-1.5 text-og-fg-muted hover:bg-og-surface-2"
|
|
169
|
+
>
|
|
170
|
+
<XIcon className="size-4" aria-hidden />
|
|
171
|
+
</button>
|
|
172
|
+
</div>
|
|
173
|
+
<div className="min-h-0 flex-1">{list}</div>
|
|
174
|
+
</div>
|
|
175
|
+
<button
|
|
176
|
+
type="button"
|
|
177
|
+
aria-label={labels.closeChats}
|
|
178
|
+
className="flex-1 bg-black/25"
|
|
179
|
+
onClick={() => setDrawerOpen(false)}
|
|
180
|
+
/>
|
|
181
|
+
</div>
|
|
182
|
+
) : null}
|
|
183
|
+
<main className="flex min-h-0 min-w-0 flex-1 flex-col">
|
|
184
|
+
<div className="og-chat-menu flex items-center gap-2 px-2 py-1">
|
|
185
|
+
<button
|
|
186
|
+
type="button"
|
|
187
|
+
aria-label={labels.openChats}
|
|
188
|
+
aria-expanded={drawerOpen}
|
|
189
|
+
onClick={() => setDrawerOpen(true)}
|
|
190
|
+
className="rounded p-1.5 text-og-fg-muted hover:bg-og-surface-2"
|
|
191
|
+
data-og-chat-menu=""
|
|
192
|
+
>
|
|
193
|
+
<MenuIcon className="size-4" aria-hidden />
|
|
194
|
+
</button>
|
|
195
|
+
<span className="text-og-sm font-semibold text-og-fg-muted">{labels.heading}</span>
|
|
196
|
+
</div>
|
|
197
|
+
<div className="og-chat-main min-h-0 flex-1 px-3 pb-3 pt-1">
|
|
198
|
+
{selected ? (
|
|
199
|
+
<SessionConversation
|
|
200
|
+
{...conversationProps}
|
|
201
|
+
{...scope}
|
|
202
|
+
sessionId={selected}
|
|
203
|
+
height="100%"
|
|
204
|
+
/>
|
|
205
|
+
) : (
|
|
206
|
+
<NewChat
|
|
207
|
+
labels={labels}
|
|
208
|
+
create={create}
|
|
209
|
+
onCreated={(id) => {
|
|
210
|
+
setListRevision((revision) => revision + 1);
|
|
211
|
+
select(id);
|
|
212
|
+
}}
|
|
213
|
+
/>
|
|
214
|
+
)}
|
|
215
|
+
</div>
|
|
216
|
+
</main>
|
|
217
|
+
</div>
|
|
218
|
+
);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
function NewChat({
|
|
222
|
+
labels,
|
|
223
|
+
create,
|
|
224
|
+
onCreated,
|
|
225
|
+
}: {
|
|
226
|
+
labels: OpenGeniChatLabels;
|
|
227
|
+
create: (initialMessage: string, idempotencyKey: string) => Promise<string>;
|
|
228
|
+
onCreated: (sessionId: string) => void;
|
|
229
|
+
}) {
|
|
230
|
+
const [text, setText] = useState("");
|
|
231
|
+
const [sending, setSending] = useState(false);
|
|
232
|
+
const [error, setError] = useState<{ cause: unknown } | null>(null);
|
|
233
|
+
const formatError = useErrorMessage();
|
|
234
|
+
// One key per draft, so a retried send returns the same chat.
|
|
235
|
+
const idempotencyKey = useRef(crypto.randomUUID());
|
|
236
|
+
|
|
237
|
+
const submit = async (event: FormEvent) => {
|
|
238
|
+
event.preventDefault();
|
|
239
|
+
const initialMessage = text.trim();
|
|
240
|
+
if (!initialMessage || sending) return;
|
|
241
|
+
setSending(true);
|
|
242
|
+
setError(null);
|
|
243
|
+
try {
|
|
244
|
+
const id = await create(initialMessage, idempotencyKey.current);
|
|
245
|
+
idempotencyKey.current = crypto.randomUUID();
|
|
246
|
+
setText("");
|
|
247
|
+
onCreated(id);
|
|
248
|
+
} catch (cause) {
|
|
249
|
+
setError({ cause });
|
|
250
|
+
} finally {
|
|
251
|
+
setSending(false);
|
|
252
|
+
}
|
|
253
|
+
};
|
|
254
|
+
|
|
255
|
+
return (
|
|
256
|
+
<form
|
|
257
|
+
onSubmit={(event) => void submit(event)}
|
|
258
|
+
className="mx-auto box-border flex h-full w-full max-w-3xl flex-col gap-4 p-3"
|
|
259
|
+
data-og-new-chat-composer=""
|
|
260
|
+
>
|
|
261
|
+
{/* Sits a little above center, relative to the panel rather than the page. */}
|
|
262
|
+
<div aria-hidden className="min-h-0 flex-[2]" />
|
|
263
|
+
{labels.newChatTitle ? (
|
|
264
|
+
<p className="text-center text-og-md font-medium text-og-fg">{labels.newChatTitle}</p>
|
|
265
|
+
) : null}
|
|
266
|
+
<div
|
|
267
|
+
className={cn(
|
|
268
|
+
"flex items-end gap-2 rounded-og-lg border border-og-border/90 bg-og-surface-1 p-2 pl-3.5 shadow-og-sm",
|
|
269
|
+
"transition-[border-color,box-shadow] duration-200 ease-og-out",
|
|
270
|
+
"focus-within:border-og-accent/50 focus-within:shadow-og-glow",
|
|
271
|
+
)}
|
|
272
|
+
>
|
|
273
|
+
<textarea
|
|
274
|
+
value={text}
|
|
275
|
+
onChange={(event) => setText(event.target.value)}
|
|
276
|
+
onKeyDown={(event) => {
|
|
277
|
+
if (event.key === "Enter" && !event.shiftKey && !event.nativeEvent.isComposing) {
|
|
278
|
+
event.preventDefault();
|
|
279
|
+
event.currentTarget.form?.requestSubmit();
|
|
280
|
+
}
|
|
281
|
+
}}
|
|
282
|
+
placeholder={labels.newChatPlaceholder}
|
|
283
|
+
aria-label={labels.newChatPlaceholder}
|
|
284
|
+
rows={2}
|
|
285
|
+
disabled={sending}
|
|
286
|
+
className="min-h-12 flex-1 resize-none bg-transparent py-1 text-og-composer text-og-fg outline-hidden placeholder:text-og-fg-subtle md:text-og-composer-wide"
|
|
287
|
+
/>
|
|
288
|
+
<button
|
|
289
|
+
type="submit"
|
|
290
|
+
aria-label={labels.send}
|
|
291
|
+
disabled={sending || !text.trim()}
|
|
292
|
+
className={cn(
|
|
293
|
+
"inline-flex size-8 shrink-0 items-center justify-center rounded-og-md pointer-coarse:size-11",
|
|
294
|
+
"border border-og-primary-border bg-og-primary text-og-primary-fg",
|
|
295
|
+
"transition-[background-color,transform,opacity] duration-150 ease-og-spring",
|
|
296
|
+
"hover:bg-og-primary-hover active:scale-95 disabled:cursor-not-allowed disabled:opacity-50",
|
|
297
|
+
)}
|
|
298
|
+
>
|
|
299
|
+
{sending ? (
|
|
300
|
+
<LoaderCircleIcon className="size-4 animate-og-spin" aria-hidden />
|
|
301
|
+
) : (
|
|
302
|
+
<ArrowUpIcon className="size-4" aria-hidden />
|
|
303
|
+
)}
|
|
304
|
+
</button>
|
|
305
|
+
</div>
|
|
306
|
+
{error ? (
|
|
307
|
+
<p role="alert" className="text-center text-og-sm text-og-status-failed">
|
|
308
|
+
{formatError(
|
|
309
|
+
error.cause,
|
|
310
|
+
error.cause instanceof Error && error.cause.message === labels.newChatUnavailable
|
|
311
|
+
? labels.newChatUnavailable
|
|
312
|
+
: undefined,
|
|
313
|
+
)}
|
|
314
|
+
</p>
|
|
315
|
+
) : null}
|
|
316
|
+
<div aria-hidden className="min-h-0 flex-[3]" />
|
|
317
|
+
</form>
|
|
318
|
+
);
|
|
319
|
+
}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import type { OpenGeniClient, OpenGeniLinkTarget } from "@opengeni/sdk";
|
|
2
|
+
import { createContext, useContext, useMemo, type ReactNode } from "react";
|
|
3
|
+
|
|
4
|
+
export type { OpenGeniLinkTarget };
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* How the host opens one OpenGeni object an agent linked in chat Markdown.
|
|
8
|
+
*
|
|
9
|
+
* - `{ href }` renders a real link (new tab) — use it for a host page URL.
|
|
10
|
+
* - `{ open }` renders a button that runs the action (download, open a panel,
|
|
11
|
+
* client-side navigation) with loading and retry states.
|
|
12
|
+
* - `null` / `undefined` means "not handled here": the next resolver is asked,
|
|
13
|
+
* and when none handles it the text renders as an unavailable reference —
|
|
14
|
+
* never as a navigation that would 404 inside the host.
|
|
15
|
+
*/
|
|
16
|
+
export type OpenGeniLinkResolution =
|
|
17
|
+
| { href: string; open?: undefined }
|
|
18
|
+
| { open: () => void | Promise<void>; href?: undefined };
|
|
19
|
+
|
|
20
|
+
export type OpenGeniLinkResolver = (
|
|
21
|
+
target: OpenGeniLinkTarget,
|
|
22
|
+
) => OpenGeniLinkResolution | null | undefined;
|
|
23
|
+
|
|
24
|
+
const OpenGeniLinkContext = createContext<OpenGeniLinkResolver | null>(null);
|
|
25
|
+
|
|
26
|
+
/** First resolver that handles a target wins. */
|
|
27
|
+
export function chainLinkResolvers(
|
|
28
|
+
...resolvers: ReadonlyArray<OpenGeniLinkResolver | null | undefined>
|
|
29
|
+
): OpenGeniLinkResolver | null {
|
|
30
|
+
const active = resolvers.filter((resolver): resolver is OpenGeniLinkResolver =>
|
|
31
|
+
Boolean(resolver),
|
|
32
|
+
);
|
|
33
|
+
if (active.length === 0) return null;
|
|
34
|
+
if (active.length === 1) return active[0]!;
|
|
35
|
+
return (target) => {
|
|
36
|
+
for (const resolver of active) {
|
|
37
|
+
const resolution = resolver(target);
|
|
38
|
+
if (resolution) return resolution;
|
|
39
|
+
}
|
|
40
|
+
return null;
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Resolve OpenGeni object links (`artifact:`, `sandbox:`, editable artifacts,
|
|
46
|
+
* Sites) for every {@link Markdown} body below. An inner provider is asked
|
|
47
|
+
* before an outer one, so a host can override a single kind and keep defaults.
|
|
48
|
+
*/
|
|
49
|
+
export function OpenGeniLinkProvider({
|
|
50
|
+
resolveLink,
|
|
51
|
+
children,
|
|
52
|
+
}: {
|
|
53
|
+
resolveLink: OpenGeniLinkResolver | null | undefined;
|
|
54
|
+
children: ReactNode;
|
|
55
|
+
}) {
|
|
56
|
+
const parent = useContext(OpenGeniLinkContext);
|
|
57
|
+
const value = useMemo(() => chainLinkResolvers(resolveLink, parent), [resolveLink, parent]);
|
|
58
|
+
return <OpenGeniLinkContext.Provider value={value}>{children}</OpenGeniLinkContext.Provider>;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** The effective resolver from the nearest {@link OpenGeniLinkProvider}. */
|
|
62
|
+
export function useOpenGeniLinkResolver(): OpenGeniLinkResolver | null {
|
|
63
|
+
return useContext(OpenGeniLinkContext);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Every sandbox read the proxy forwards is bounded by the API's own maximum.
|
|
67
|
+
const SANDBOX_DOWNLOAD_MAX_BYTES = 25 * 1024 * 1024;
|
|
68
|
+
|
|
69
|
+
type SessionLinkClient = Partial<Pick<OpenGeniClient, "createFileDownloadUrl" | "fsRead">>;
|
|
70
|
+
|
|
71
|
+
function saveBlob(blob: Blob, filename: string): void {
|
|
72
|
+
const url = URL.createObjectURL(blob);
|
|
73
|
+
const link = document.createElement("a");
|
|
74
|
+
link.href = url;
|
|
75
|
+
link.download = filename;
|
|
76
|
+
link.rel = "noopener";
|
|
77
|
+
document.body.append(link);
|
|
78
|
+
link.click();
|
|
79
|
+
link.remove();
|
|
80
|
+
setTimeout(() => URL.revokeObjectURL(url), 60_000);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function openUrl(url: string): void {
|
|
84
|
+
// A signed download URL is attachment-disposition; an anchor click keeps the
|
|
85
|
+
// page and survives popup blockers after the awaited URL request.
|
|
86
|
+
const link = document.createElement("a");
|
|
87
|
+
link.href = url;
|
|
88
|
+
link.rel = "noopener noreferrer";
|
|
89
|
+
link.target = "_blank";
|
|
90
|
+
document.body.append(link);
|
|
91
|
+
link.click();
|
|
92
|
+
link.remove();
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function base64Bytes(content: string): Uint8Array<ArrayBuffer> {
|
|
96
|
+
const binary = atob(content);
|
|
97
|
+
const bytes = new Uint8Array(binary.length);
|
|
98
|
+
for (let index = 0; index < binary.length; index += 1) bytes[index] = binary.charCodeAt(index);
|
|
99
|
+
return bytes;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Default resolver for a session conversation that talks to OpenGeni through
|
|
104
|
+
* the normal SDK client (for example behind `createSessionProxyHandler`):
|
|
105
|
+
*
|
|
106
|
+
* - `artifact:<file>` downloads the retained file through a short-lived URL.
|
|
107
|
+
* - `sandbox:<path>` downloads when enabled by the host proxy capability.
|
|
108
|
+
*
|
|
109
|
+
* Editable artifacts and Sites have no default: they need a host surface
|
|
110
|
+
* (see `@opengeni/react/artifacts/*` and `@opengeni/react/sites`), so they stay
|
|
111
|
+
* unavailable until the host resolves them.
|
|
112
|
+
*/
|
|
113
|
+
export function sessionLinkResolver(input: {
|
|
114
|
+
client: SessionLinkClient;
|
|
115
|
+
workspaceId: string;
|
|
116
|
+
sessionId: string;
|
|
117
|
+
sandboxFiles?: boolean;
|
|
118
|
+
}): OpenGeniLinkResolver {
|
|
119
|
+
const { client, workspaceId, sessionId } = input;
|
|
120
|
+
return (target) => {
|
|
121
|
+
if (target.kind === "file") {
|
|
122
|
+
if (target.workspaceId !== null && target.workspaceId !== workspaceId) return null;
|
|
123
|
+
if (typeof client.createFileDownloadUrl !== "function") return null;
|
|
124
|
+
return {
|
|
125
|
+
open: async () => {
|
|
126
|
+
const { url } = await client.createFileDownloadUrl!(workspaceId, target.fileId, {
|
|
127
|
+
sessionId,
|
|
128
|
+
});
|
|
129
|
+
openUrl(url);
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
if (target.kind === "sandbox-file") {
|
|
134
|
+
if (input.sandboxFiles === false) return null;
|
|
135
|
+
if (typeof client.fsRead !== "function") return null;
|
|
136
|
+
return {
|
|
137
|
+
open: async () => {
|
|
138
|
+
const file = await client.fsRead!(workspaceId, sessionId, {
|
|
139
|
+
path: target.path,
|
|
140
|
+
encoding: "base64",
|
|
141
|
+
maxBytes: SANDBOX_DOWNLOAD_MAX_BYTES,
|
|
142
|
+
});
|
|
143
|
+
if (file.truncated) throw new Error("File is too large to download here.");
|
|
144
|
+
const name = file.path.split(/[\\/]/u).at(-1) || "download";
|
|
145
|
+
const bytes =
|
|
146
|
+
file.encoding === "base64"
|
|
147
|
+
? base64Bytes(file.content)
|
|
148
|
+
: new TextEncoder().encode(file.content);
|
|
149
|
+
saveBlob(new Blob([bytes], { type: "application/octet-stream" }), name);
|
|
150
|
+
},
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
return null;
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/** An editable artifact or Site to open in a host-mounted viewer. */
|
|
158
|
+
export type OpenGeniViewerTarget = Readonly<{
|
|
159
|
+
kind: "editable-artifact" | "site";
|
|
160
|
+
artifactId: string;
|
|
161
|
+
/** The link text the agent wrote, until the viewer loads the real title. */
|
|
162
|
+
title?: string | undefined;
|
|
163
|
+
}>;
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* "Open in host viewer": resolve agent links to editable artifacts and Sites
|
|
167
|
+
* in this workspace to `open(target)`, for example to mount
|
|
168
|
+
* `SessionArtifactViewer` beside the conversation. Other targets fall through.
|
|
169
|
+
*/
|
|
170
|
+
export function viewerLinkResolver(input: {
|
|
171
|
+
workspaceId: string;
|
|
172
|
+
open: (target: OpenGeniViewerTarget) => void;
|
|
173
|
+
}): OpenGeniLinkResolver {
|
|
174
|
+
return (target) => {
|
|
175
|
+
if (target.kind !== "editable-artifact" && target.kind !== "site") return null;
|
|
176
|
+
if (target.workspaceId !== input.workspaceId) return null;
|
|
177
|
+
return { open: () => input.open({ kind: target.kind, artifactId: target.artifactId }) };
|
|
178
|
+
};
|
|
179
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { SVGProps } from "react";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Simple Icons, CC0; https://github.com/simple-icons/simple-icons
|
|
5
|
+
* Source: https://raw.githubusercontent.com/simple-icons/simple-icons/develop/icons/openrouter.svg
|
|
6
|
+
*/
|
|
7
|
+
export function OpenRouterMark(props: SVGProps<SVGSVGElement>) {
|
|
8
|
+
return (
|
|
9
|
+
<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" {...props}>
|
|
10
|
+
<path d="M16.778 1.844v1.919q-.569-.026-1.138-.032-.708-.008-1.415.037c-1.93.126-4.023.728-6.149 2.237-2.911 2.066-2.731 1.95-4.14 2.75-.396.223-1.342.574-2.185.798-.841.225-1.753.333-1.751.333v4.229s.768.108 1.61.333c.842.224 1.789.575 2.185.799 1.41.798 1.228.683 4.14 2.75 2.126 1.509 4.22 2.11 6.148 2.236.88.058 1.716.041 2.555.005v1.918l7.222-4.168-7.222-4.17v2.176c-.86.038-1.611.065-2.278.021-1.364-.09-2.417-.357-3.979-1.465-2.244-1.593-2.866-2.027-3.68-2.508.889-.518 1.449-.906 3.822-2.59 1.56-1.109 2.614-1.377 3.978-1.466.667-.044 1.418-.017 2.278.02v2.176L24 6.014Z" />
|
|
11
|
+
</svg>
|
|
12
|
+
);
|
|
13
|
+
}
|
|
@@ -7,9 +7,15 @@ import {
|
|
|
7
7
|
Suspense,
|
|
8
8
|
useEffect,
|
|
9
9
|
useState,
|
|
10
|
+
useSyncExternalStore,
|
|
10
11
|
} from "react";
|
|
11
12
|
import { cn } from "../lib/cn";
|
|
12
13
|
import { gitFileDiffToPatch } from "../lib/git-patch";
|
|
14
|
+
import {
|
|
15
|
+
loadPierreDiffs,
|
|
16
|
+
pierreDiffsRevision,
|
|
17
|
+
subscribePierreDiffs,
|
|
18
|
+
} from "../lib/pierre-diffs-loader";
|
|
13
19
|
|
|
14
20
|
/** Pierre `PatchDiff` props subset we drive. */
|
|
15
21
|
type PatchDiffComponent = ComponentType<{
|
|
@@ -50,10 +56,10 @@ export type PierreDiffProps = {
|
|
|
50
56
|
|
|
51
57
|
// Lazy-load `@pierre/diffs/react` so Shiki + the worker pool stay off the
|
|
52
58
|
// critical path (and out of an SSR bundle) until a diff is actually shown. The
|
|
53
|
-
//
|
|
54
|
-
//
|
|
59
|
+
// peer is loaded only through the host-registered loader (see
|
|
60
|
+
// `enablePierreDiffs`); without one the load rejects and we render `fallback`.
|
|
55
61
|
const LazyPatchDiff = lazy(async () => {
|
|
56
|
-
const mod = (await
|
|
62
|
+
const mod = (await loadPierreDiffs()) as {
|
|
57
63
|
PatchDiff: PatchDiffComponent;
|
|
58
64
|
};
|
|
59
65
|
return { default: mod.PatchDiff };
|
|
@@ -78,6 +84,7 @@ export function PierreDiff({
|
|
|
78
84
|
className,
|
|
79
85
|
}: PierreDiffProps) {
|
|
80
86
|
const [failed, setFailed] = useState(false);
|
|
87
|
+
const [ready, setReady] = useState(false);
|
|
81
88
|
const [forcedColors, setForcedColors] = useState(false);
|
|
82
89
|
|
|
83
90
|
// Pierre's rich renderer distinguishes additions/deletions primarily through
|
|
@@ -95,16 +102,29 @@ export function PierreDiff({
|
|
|
95
102
|
|
|
96
103
|
// Probe the import once so a hard failure (peer missing) shows `fallback`
|
|
97
104
|
// rather than a Suspense boundary that never resolves. Skipped when `plain`.
|
|
105
|
+
const loaderRevision = useSyncExternalStore(
|
|
106
|
+
subscribePierreDiffs,
|
|
107
|
+
pierreDiffsRevision,
|
|
108
|
+
pierreDiffsRevision,
|
|
109
|
+
);
|
|
98
110
|
useEffect(() => {
|
|
99
111
|
if (plain) return;
|
|
100
112
|
let cancelled = false;
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
113
|
+
setFailed(false);
|
|
114
|
+
// Mount the lazy renderer only after the peer loaded, so a missing peer
|
|
115
|
+
// never poisons React.lazy's cached result for the rest of the page.
|
|
116
|
+
loadPierreDiffs().then(
|
|
117
|
+
() => {
|
|
118
|
+
if (!cancelled) setReady(true);
|
|
119
|
+
},
|
|
120
|
+
() => {
|
|
121
|
+
if (!cancelled) setFailed(true);
|
|
122
|
+
},
|
|
123
|
+
);
|
|
104
124
|
return () => {
|
|
105
125
|
cancelled = true;
|
|
106
126
|
};
|
|
107
|
-
}, [plain]);
|
|
127
|
+
}, [plain, loaderRevision]);
|
|
108
128
|
|
|
109
129
|
if (plain || failed || forcedColors) {
|
|
110
130
|
// `plain` opts out of highlighting; `failed` = `@pierre/diffs` not installed.
|
|
@@ -147,6 +167,9 @@ export function PierreDiff({
|
|
|
147
167
|
"--diffs-light-bg": "var(--og-color-bg)",
|
|
148
168
|
"--diffs-bg-buffer-override": "var(--og-color-surface-1)",
|
|
149
169
|
"--diffs-bg-separator-override": "var(--og-color-surface-1)",
|
|
170
|
+
// Pierre's default (fg mixed 65% into bg) falls under 4.5:1 on the lifted
|
|
171
|
+
// graphite separator; quiet meta text keeps AA on every diff surface.
|
|
172
|
+
"--diffs-fg-number-override": "var(--og-color-fg-subtle)",
|
|
150
173
|
"--diffs-addition-color-override": "var(--og-color-status-idle)",
|
|
151
174
|
"--diffs-deletion-color-override": "var(--og-color-status-failed)",
|
|
152
175
|
"--diffs-fg-number-addition-override": "var(--og-color-status-idle)",
|
|
@@ -168,15 +191,17 @@ export function PierreDiff({
|
|
|
168
191
|
return (
|
|
169
192
|
<div className={cn("min-w-0", className)} data-opengeni-pierre-diff style={pierreVars}>
|
|
170
193
|
<Suspense fallback={loading ?? <DiffSkeleton />}>
|
|
171
|
-
{
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
194
|
+
{ready
|
|
195
|
+
? diff.map((file) => (
|
|
196
|
+
<div key={file.path} className="mb-2">
|
|
197
|
+
<LazyPatchDiff
|
|
198
|
+
patch={gitFileDiffToPatch(file)}
|
|
199
|
+
options={options}
|
|
200
|
+
{...(disableWorkerPool !== undefined ? { disableWorkerPool } : {})}
|
|
201
|
+
/>
|
|
202
|
+
</div>
|
|
203
|
+
))
|
|
204
|
+
: (loading ?? <DiffSkeleton />)}
|
|
180
205
|
</Suspense>
|
|
181
206
|
</div>
|
|
182
207
|
);
|