@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
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Await-compatible older-history result with a causal commit receipt.
|
|
3
|
+
*
|
|
4
|
+
* `committed` flips synchronously before the accepted older window is exposed
|
|
5
|
+
* to React. Returning this exact object preserves the receipt directly;
|
|
6
|
+
* synchronous wrappers that discard it remain supported through receipt
|
|
7
|
+
* capture, while replacing it asynchronously with a plain promise does not.
|
|
8
|
+
*/
|
|
9
|
+
export type OlderHistoryLoadReceipt = Promise<boolean> & {
|
|
10
|
+
readonly committed: boolean;
|
|
11
|
+
readonly tailPreserved?: boolean;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Source-compatible public callback accepted by MessageTimeline.
|
|
16
|
+
*
|
|
17
|
+
* The callback historically returned `void`, which permits consumers to
|
|
18
|
+
* return any synchronous value or promise. Receipt-aware loaders opt into the
|
|
19
|
+
* stronger runtime contract by returning (or synchronously creating through a
|
|
20
|
+
* wrapper) an {@link OlderHistoryLoadReceipt}.
|
|
21
|
+
*/
|
|
22
|
+
export type OlderHistoryLoader = () => unknown;
|
|
23
|
+
|
|
24
|
+
type MutableOlderHistoryLoadReceipt = Promise<boolean> & {
|
|
25
|
+
committed: boolean;
|
|
26
|
+
tailPreserved: boolean;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
type OlderHistoryReceiptCapture = (receipt: OlderHistoryLoadReceipt) => void;
|
|
30
|
+
|
|
31
|
+
let activeReceiptCapture: OlderHistoryReceiptCapture | undefined;
|
|
32
|
+
let preserveTailForAutomaticLoad = false;
|
|
33
|
+
|
|
34
|
+
/** Bind a receipt before a synchronous forwarding stack can publish state. */
|
|
35
|
+
export function invokeOlderHistoryLoaderWithReceiptCapture(
|
|
36
|
+
load: OlderHistoryLoader,
|
|
37
|
+
capture: OlderHistoryReceiptCapture,
|
|
38
|
+
preserveTail = false,
|
|
39
|
+
): unknown {
|
|
40
|
+
const previousCapture = activeReceiptCapture;
|
|
41
|
+
const previousPreserveTail = preserveTailForAutomaticLoad;
|
|
42
|
+
activeReceiptCapture = capture;
|
|
43
|
+
preserveTailForAutomaticLoad = preserveTail;
|
|
44
|
+
try {
|
|
45
|
+
return load();
|
|
46
|
+
} finally {
|
|
47
|
+
activeReceiptCapture = previousCapture;
|
|
48
|
+
preserveTailForAutomaticLoad = previousPreserveTail;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Build an await-compatible older-history receipt for custom timeline hosts.
|
|
54
|
+
* Call `markCommitted` immediately before publishing an accepted older window.
|
|
55
|
+
*/
|
|
56
|
+
export function createOlderHistoryLoadReceipt(
|
|
57
|
+
load: (
|
|
58
|
+
markCommitted: () => void,
|
|
59
|
+
preserveTail: boolean,
|
|
60
|
+
markTailPreserved: () => void,
|
|
61
|
+
) => boolean | Promise<boolean>,
|
|
62
|
+
): OlderHistoryLoadReceipt {
|
|
63
|
+
let resolveResult!: (value: boolean | PromiseLike<boolean>) => void;
|
|
64
|
+
let rejectResult!: (reason?: unknown) => void;
|
|
65
|
+
const result = new Promise<boolean>((resolve, reject) => {
|
|
66
|
+
resolveResult = resolve;
|
|
67
|
+
rejectResult = reject;
|
|
68
|
+
}) as MutableOlderHistoryLoadReceipt;
|
|
69
|
+
result.committed = false;
|
|
70
|
+
result.tailPreserved = false;
|
|
71
|
+
activeReceiptCapture?.(result);
|
|
72
|
+
try {
|
|
73
|
+
const loaded = load(
|
|
74
|
+
() => {
|
|
75
|
+
result.committed = true;
|
|
76
|
+
},
|
|
77
|
+
preserveTailForAutomaticLoad,
|
|
78
|
+
() => {
|
|
79
|
+
result.tailPreserved = true;
|
|
80
|
+
},
|
|
81
|
+
);
|
|
82
|
+
Promise.resolve(loaded).then(resolveResult, rejectResult);
|
|
83
|
+
} catch (error) {
|
|
84
|
+
rejectResult(error);
|
|
85
|
+
}
|
|
86
|
+
return result;
|
|
87
|
+
}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { useState } from "react";
|
|
2
|
+
import { pluginMcpUnavailableReason, type PluginDiscoveryItem } from "@opengeni/sdk";
|
|
3
|
+
import { BoxesIcon } from "lucide-react";
|
|
4
|
+
import { Markdown } from "./components/markdown";
|
|
5
|
+
import { ConnectionLogo } from "./connection-logo";
|
|
6
|
+
|
|
7
|
+
const componentLabels: Record<string, string> = {
|
|
8
|
+
skills: "Skills",
|
|
9
|
+
mcp: "MCP connections",
|
|
10
|
+
apps: "Hosted apps",
|
|
11
|
+
hooks: "Hooks",
|
|
12
|
+
agents: "Agents",
|
|
13
|
+
commands: "Commands",
|
|
14
|
+
lsp: "Language servers",
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
const EMPTY_CONNECTIONS: Record<string, boolean> = {};
|
|
18
|
+
|
|
19
|
+
/** Embeddable plugin overview. Hosts own the dialog and installation actions. */
|
|
20
|
+
export function PluginDetails({
|
|
21
|
+
item,
|
|
22
|
+
onInstall,
|
|
23
|
+
busy = false,
|
|
24
|
+
installed = false,
|
|
25
|
+
error,
|
|
26
|
+
connections = EMPTY_CONNECTIONS,
|
|
27
|
+
onConnect,
|
|
28
|
+
}: {
|
|
29
|
+
item: PluginDiscoveryItem;
|
|
30
|
+
onInstall?: () => void;
|
|
31
|
+
busy?: boolean;
|
|
32
|
+
installed?: boolean;
|
|
33
|
+
error?: string | null;
|
|
34
|
+
connections?: Record<string, boolean>;
|
|
35
|
+
onConnect?: (server: { name: string; endpoint: string | null }) => void;
|
|
36
|
+
}) {
|
|
37
|
+
const supported = (server: NonNullable<PluginDiscoveryItem["mcpServers"]>[number]) =>
|
|
38
|
+
pluginMcpUnavailableReason(server) === null;
|
|
39
|
+
const contentsUnknown = item.skills == null || item.mcpServers == null;
|
|
40
|
+
const installableCount =
|
|
41
|
+
(item.skills?.length ?? 0) + (item.mcpServers?.filter(supported).length ?? 0);
|
|
42
|
+
const exceedsInstallLimit = installableCount > 64;
|
|
43
|
+
const installable = !contentsUnknown && installableCount > 0 && !exceedsInstallLimit;
|
|
44
|
+
const [expanded, setExpanded] = useState(false);
|
|
45
|
+
const description = item.longDescription || item.description;
|
|
46
|
+
const lengthy = description.length > 700;
|
|
47
|
+
const registryLabel =
|
|
48
|
+
item.provider === "openai"
|
|
49
|
+
? "OpenAI plugin registry"
|
|
50
|
+
: item.provider === "anthropic"
|
|
51
|
+
? "Anthropic plugin registry"
|
|
52
|
+
: "Custom source";
|
|
53
|
+
return (
|
|
54
|
+
<article className="og-plugin-details">
|
|
55
|
+
<header className="og-plugin-details-header">
|
|
56
|
+
<ConnectionLogo
|
|
57
|
+
src={item.logoUrl}
|
|
58
|
+
name={item.displayName}
|
|
59
|
+
fallback={<BoxesIcon aria-hidden="true" />}
|
|
60
|
+
/>
|
|
61
|
+
<div>
|
|
62
|
+
<h2>{item.displayName.replace(/-/g, " ")}</h2>
|
|
63
|
+
{item.author?.name ? <p>By {item.author.name}</p> : null}
|
|
64
|
+
</div>
|
|
65
|
+
</header>
|
|
66
|
+
<div className="og-plugin-details-meta">
|
|
67
|
+
<span>{registryLabel}</span>
|
|
68
|
+
{item.category ? <span>{item.category}</span> : null}
|
|
69
|
+
{item.version ? <span>v{item.version}</span> : null}
|
|
70
|
+
</div>
|
|
71
|
+
<section className="og-plugin-details-members">
|
|
72
|
+
<h3>
|
|
73
|
+
Skills <span>{item.skills?.length ?? "—"}</span>
|
|
74
|
+
</h3>
|
|
75
|
+
{item.skills?.length ? (
|
|
76
|
+
<ul>
|
|
77
|
+
{item.skills.map((skill) => (
|
|
78
|
+
<li key={skill.sourceUrl}>
|
|
79
|
+
<a href={skill.sourceUrl} target="_blank" rel="noopener noreferrer">
|
|
80
|
+
<strong>{skill.name}</strong>
|
|
81
|
+
<span aria-hidden="true">↗</span>
|
|
82
|
+
</a>
|
|
83
|
+
</li>
|
|
84
|
+
))}
|
|
85
|
+
</ul>
|
|
86
|
+
) : (
|
|
87
|
+
<p>
|
|
88
|
+
{item.skills
|
|
89
|
+
? "No bundled skills."
|
|
90
|
+
: "Contents haven’t been indexed for this repository."}
|
|
91
|
+
</p>
|
|
92
|
+
)}
|
|
93
|
+
<h3>
|
|
94
|
+
MCP servers <span>{item.mcpServers?.length ?? "—"}</span>
|
|
95
|
+
</h3>
|
|
96
|
+
{item.mcpServers?.length ? (
|
|
97
|
+
<ul>
|
|
98
|
+
{item.mcpServers.map((server) => {
|
|
99
|
+
const connected = Boolean(server.endpoint && connections[server.endpoint]);
|
|
100
|
+
// Existing connections remain manageable regardless of the source manifest's setup requirements.
|
|
101
|
+
const unavailableReason = connected ? null : pluginMcpUnavailableReason(server);
|
|
102
|
+
return (
|
|
103
|
+
<li
|
|
104
|
+
key={server.name}
|
|
105
|
+
className={unavailableReason ? "og-plugin-member-disabled" : undefined}
|
|
106
|
+
>
|
|
107
|
+
<div className="og-plugin-server-heading">
|
|
108
|
+
<strong>{server.name}</strong>
|
|
109
|
+
{!unavailableReason && onConnect ? (
|
|
110
|
+
<button type="button" disabled={busy} onClick={() => onConnect(server)}>
|
|
111
|
+
{connected ? "Manage" : "Connect"}
|
|
112
|
+
</button>
|
|
113
|
+
) : null}
|
|
114
|
+
</div>
|
|
115
|
+
<small>
|
|
116
|
+
{connected ? "Connected · " : ""}
|
|
117
|
+
{unavailableReason ?? server.endpoint}
|
|
118
|
+
</small>
|
|
119
|
+
</li>
|
|
120
|
+
);
|
|
121
|
+
})}
|
|
122
|
+
</ul>
|
|
123
|
+
) : (
|
|
124
|
+
<p>
|
|
125
|
+
{item.mcpServers ? "No bundled MCP servers." : "Server details haven’t been indexed."}
|
|
126
|
+
</p>
|
|
127
|
+
)}
|
|
128
|
+
{item.components?.some((component) => !["skills", "mcp"].includes(component)) ? (
|
|
129
|
+
<div className="og-plugin-details-other">
|
|
130
|
+
Not installed here:{" "}
|
|
131
|
+
{item.components
|
|
132
|
+
.filter((component) => !["skills", "mcp"].includes(component))
|
|
133
|
+
.map((component) => componentLabels[component] ?? component)
|
|
134
|
+
.join(", ")}
|
|
135
|
+
</div>
|
|
136
|
+
) : null}
|
|
137
|
+
</section>
|
|
138
|
+
<section className="og-plugin-details-overview" aria-label="Overview">
|
|
139
|
+
<div className={lengthy && !expanded ? "og-plugin-details-excerpt" : undefined}>
|
|
140
|
+
<Markdown>{description}</Markdown>
|
|
141
|
+
</div>
|
|
142
|
+
{lengthy ? (
|
|
143
|
+
<button
|
|
144
|
+
type="button"
|
|
145
|
+
className="og-plugin-details-more"
|
|
146
|
+
aria-expanded={expanded}
|
|
147
|
+
onClick={() => setExpanded((value) => !value)}
|
|
148
|
+
>
|
|
149
|
+
{expanded ? "Show less" : "Read more"}
|
|
150
|
+
</button>
|
|
151
|
+
) : null}
|
|
152
|
+
</section>
|
|
153
|
+
<footer>
|
|
154
|
+
{item.sourceUrl ? (
|
|
155
|
+
<a href={item.sourceUrl} target="_blank" rel="noopener noreferrer">
|
|
156
|
+
View repository <span aria-hidden="true">↗</span>
|
|
157
|
+
</a>
|
|
158
|
+
) : null}
|
|
159
|
+
{onInstall ? (
|
|
160
|
+
<button
|
|
161
|
+
className="og-plugin-install"
|
|
162
|
+
type="button"
|
|
163
|
+
disabled={!installable || busy || installed}
|
|
164
|
+
onClick={onInstall}
|
|
165
|
+
>
|
|
166
|
+
{installed ? "Installed" : busy ? "Installing…" : "Install plugin"}
|
|
167
|
+
</button>
|
|
168
|
+
) : null}
|
|
169
|
+
{error ? <p role="alert">{error}</p> : null}
|
|
170
|
+
{exceedsInstallLimit ? (
|
|
171
|
+
<p>This plugin exceeds the current 64-component installation limit.</p>
|
|
172
|
+
) : contentsUnknown ? (
|
|
173
|
+
<p>
|
|
174
|
+
Plugin contents are unavailable. Installation is disabled until the repository can be
|
|
175
|
+
inspected.
|
|
176
|
+
</p>
|
|
177
|
+
) : !installable ? (
|
|
178
|
+
<p>No installable skills or remote MCP servers.</p>
|
|
179
|
+
) : (
|
|
180
|
+
<p>Installs skills and adds connection references. Connect each server separately.</p>
|
|
181
|
+
)}
|
|
182
|
+
</footer>
|
|
183
|
+
</article>
|
|
184
|
+
);
|
|
185
|
+
}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { createDiscoveryCache } from "./discovery-cache";
|
|
2
|
+
import { useEffect, useRef, useState, type ReactNode } from "react";
|
|
3
|
+
import type { PluginDiscoveryItem, PluginDiscoveryPage } from "@opengeni/sdk";
|
|
4
|
+
import { BoxesIcon } from "lucide-react";
|
|
5
|
+
import { CapabilityCatalogRow } from "./capability-catalog-row";
|
|
6
|
+
import { ConnectionLogo } from "./connection-logo";
|
|
7
|
+
|
|
8
|
+
const discoveryCache = createDiscoveryCache<PluginDiscoveryPage>();
|
|
9
|
+
const spacedName = (name: string) => name.replace(/-/g, " ");
|
|
10
|
+
const EMPTY_INSTALLED_IDS: ReadonlySet<string> = new Set();
|
|
11
|
+
|
|
12
|
+
export type PluginDiscoveryProps = {
|
|
13
|
+
client: {
|
|
14
|
+
discoverPlugins(
|
|
15
|
+
workspaceId: string,
|
|
16
|
+
options?: { query?: string; provider?: string; offset?: number },
|
|
17
|
+
): Promise<PluginDiscoveryPage>;
|
|
18
|
+
};
|
|
19
|
+
workspaceId: string;
|
|
20
|
+
query: string;
|
|
21
|
+
/** Initially selected registry. Users can still switch registries or browse all. */
|
|
22
|
+
defaultProvider?: "" | "openai" | "anthropic";
|
|
23
|
+
/** Discovery identities already installed in the current workspace. */
|
|
24
|
+
installedIds?: ReadonlySet<string>;
|
|
25
|
+
resultLimit?: number;
|
|
26
|
+
onShowMore?: () => void;
|
|
27
|
+
onOpen: (item: PluginDiscoveryItem) => void;
|
|
28
|
+
/** Display name for a registry slug. Defaults to the slug with dashes as spaces. */
|
|
29
|
+
formatName?: (name: string) => string;
|
|
30
|
+
/** The row tile. Defaults to the plugin logo with a glyph fallback. */
|
|
31
|
+
renderIcon?: (item: PluginDiscoveryItem) => ReactNode;
|
|
32
|
+
};
|
|
33
|
+
export function PluginDiscovery(props: PluginDiscoveryProps) {
|
|
34
|
+
const [provider, setProvider] = useState(props.defaultProvider ?? "");
|
|
35
|
+
return (
|
|
36
|
+
<section
|
|
37
|
+
className={`og-plugin-discovery ${props.resultLimit ? "og-catalog-overview" : ""}`}
|
|
38
|
+
aria-label="Discover plugins"
|
|
39
|
+
>
|
|
40
|
+
<header>
|
|
41
|
+
<h3>{props.resultLimit ? "Plugins" : "Browse plugins"}</h3>
|
|
42
|
+
{!props.resultLimit ? (
|
|
43
|
+
<div className="og-plugin-filters" role="group" aria-label="Plugin registry">
|
|
44
|
+
{(
|
|
45
|
+
[
|
|
46
|
+
{ value: "", label: "All" },
|
|
47
|
+
{ value: "openai", label: "OpenAI plugin registry" },
|
|
48
|
+
{ value: "anthropic", label: "Anthropic plugin registry" },
|
|
49
|
+
] as const
|
|
50
|
+
).map((option) => (
|
|
51
|
+
<button
|
|
52
|
+
key={option.value}
|
|
53
|
+
type="button"
|
|
54
|
+
aria-pressed={provider === option.value}
|
|
55
|
+
onClick={() => setProvider(option.value)}
|
|
56
|
+
>
|
|
57
|
+
{option.label}
|
|
58
|
+
</button>
|
|
59
|
+
))}
|
|
60
|
+
</div>
|
|
61
|
+
) : null}
|
|
62
|
+
</header>
|
|
63
|
+
<Results
|
|
64
|
+
key={`${props.workspaceId}:${props.query}:${provider}`}
|
|
65
|
+
{...props}
|
|
66
|
+
provider={provider}
|
|
67
|
+
/>
|
|
68
|
+
</section>
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
function Results({
|
|
72
|
+
client,
|
|
73
|
+
workspaceId,
|
|
74
|
+
query,
|
|
75
|
+
provider,
|
|
76
|
+
installedIds = EMPTY_INSTALLED_IDS,
|
|
77
|
+
onOpen,
|
|
78
|
+
resultLimit,
|
|
79
|
+
onShowMore,
|
|
80
|
+
formatName = spacedName,
|
|
81
|
+
renderIcon,
|
|
82
|
+
}: PluginDiscoveryProps & { provider: string }) {
|
|
83
|
+
const initial = discoveryCache.peek(client, JSON.stringify([workspaceId, query, provider, 0]));
|
|
84
|
+
const [items, setItems] = useState<PluginDiscoveryItem[]>(initial?.items ?? []);
|
|
85
|
+
const [offset, setOffset] = useState(0);
|
|
86
|
+
const [next, setNext] = useState<number | null>(initial?.nextOffset ?? null);
|
|
87
|
+
const [total, setTotal] = useState(initial?.total ?? 0);
|
|
88
|
+
const [loading, setLoading] = useState(!initial);
|
|
89
|
+
const [error, setError] = useState(false);
|
|
90
|
+
const [retry, setRetry] = useState(0);
|
|
91
|
+
const sentinel = useRef<HTMLDivElement>(null);
|
|
92
|
+
useEffect(() => {
|
|
93
|
+
let active = true;
|
|
94
|
+
const cacheKey = JSON.stringify([workspaceId, query, provider, offset]);
|
|
95
|
+
const cached = discoveryCache.peek(client, cacheKey);
|
|
96
|
+
setLoading(!cached);
|
|
97
|
+
setError(false);
|
|
98
|
+
const timer = setTimeout(
|
|
99
|
+
() => {
|
|
100
|
+
void discoveryCache
|
|
101
|
+
.read(client, cacheKey, () =>
|
|
102
|
+
client.discoverPlugins(workspaceId, { query, provider, offset }),
|
|
103
|
+
)
|
|
104
|
+
.then(
|
|
105
|
+
(page) => {
|
|
106
|
+
if (!active) return;
|
|
107
|
+
setItems((previous) => (offset ? [...previous, ...page.items] : page.items));
|
|
108
|
+
setTotal(page.total);
|
|
109
|
+
setNext(page.nextOffset);
|
|
110
|
+
setLoading(false);
|
|
111
|
+
},
|
|
112
|
+
() => {
|
|
113
|
+
if (active) {
|
|
114
|
+
setError(true);
|
|
115
|
+
setLoading(false);
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
);
|
|
119
|
+
},
|
|
120
|
+
cached || offset ? 0 : 200,
|
|
121
|
+
);
|
|
122
|
+
return () => {
|
|
123
|
+
active = false;
|
|
124
|
+
clearTimeout(timer);
|
|
125
|
+
};
|
|
126
|
+
}, [client, workspaceId, query, provider, offset, retry]);
|
|
127
|
+
useEffect(() => {
|
|
128
|
+
if (resultLimit || loading || error || next === null || !sentinel.current) return;
|
|
129
|
+
const observer = new IntersectionObserver(
|
|
130
|
+
(entries) => {
|
|
131
|
+
if (entries.some((entry) => entry.isIntersecting)) setOffset(next);
|
|
132
|
+
},
|
|
133
|
+
{ rootMargin: "200px" },
|
|
134
|
+
);
|
|
135
|
+
observer.observe(sentinel.current);
|
|
136
|
+
return () => observer.disconnect();
|
|
137
|
+
}, [loading, error, next, resultLimit]);
|
|
138
|
+
return (
|
|
139
|
+
<>
|
|
140
|
+
{!loading && !error ? (
|
|
141
|
+
<p role="status">
|
|
142
|
+
{total
|
|
143
|
+
? "Bundles of skills and connections"
|
|
144
|
+
: query.trim()
|
|
145
|
+
? `No matches for “${query.trim()}”.`
|
|
146
|
+
: "No plugins in this registry."}
|
|
147
|
+
</p>
|
|
148
|
+
) : null}
|
|
149
|
+
<div className="og-plugin-discovery-grid">
|
|
150
|
+
{items.slice(0, resultLimit).map((item) => (
|
|
151
|
+
<CapabilityCatalogRow
|
|
152
|
+
key={item.id}
|
|
153
|
+
data-plugin-id={item.id}
|
|
154
|
+
name={formatName(item.displayName)}
|
|
155
|
+
description={item.description}
|
|
156
|
+
status={installedIds.has(item.id) ? "added" : "available"}
|
|
157
|
+
statusLabel={installedIds.has(item.id) ? "Installed" : "Available to install"}
|
|
158
|
+
onOpen={() => onOpen(item)}
|
|
159
|
+
icon={
|
|
160
|
+
renderIcon ? (
|
|
161
|
+
renderIcon(item)
|
|
162
|
+
) : (
|
|
163
|
+
<ConnectionLogo
|
|
164
|
+
src={item.logoUrl}
|
|
165
|
+
name={item.displayName}
|
|
166
|
+
fallback={<BoxesIcon aria-hidden="true" />}
|
|
167
|
+
/>
|
|
168
|
+
)
|
|
169
|
+
}
|
|
170
|
+
/>
|
|
171
|
+
))}
|
|
172
|
+
</div>
|
|
173
|
+
{loading ? <p role="status">Loading plugins…</p> : null}
|
|
174
|
+
{error ? (
|
|
175
|
+
<p role="alert">
|
|
176
|
+
Couldn’t load plugins.{" "}
|
|
177
|
+
<button type="button" onClick={() => setRetry((value) => value + 1)}>
|
|
178
|
+
Retry
|
|
179
|
+
</button>
|
|
180
|
+
</p>
|
|
181
|
+
) : null}
|
|
182
|
+
{resultLimit && !loading && !error && total > resultLimit ? (
|
|
183
|
+
<button className="og-catalog-more" type="button" onClick={onShowMore}>
|
|
184
|
+
View all plugins
|
|
185
|
+
</button>
|
|
186
|
+
) : null}
|
|
187
|
+
<div ref={sentinel}>
|
|
188
|
+
{!resultLimit && next !== null && !loading && !error ? (
|
|
189
|
+
<button className="og-plugin-more" type="button" onClick={() => setOffset(next)}>
|
|
190
|
+
Show more plugins
|
|
191
|
+
</button>
|
|
192
|
+
) : null}
|
|
193
|
+
</div>
|
|
194
|
+
</>
|
|
195
|
+
);
|
|
196
|
+
}
|
package/src/provider.tsx
CHANGED
|
@@ -9,6 +9,9 @@ import { useCallback, useEffect, useMemo, useRef, useState, type ReactNode } fro
|
|
|
9
9
|
import type { SessionClientLike } from "./client";
|
|
10
10
|
import { usePageLiveActivity } from "./hooks/internal";
|
|
11
11
|
import { OpenGeniContext } from "./session-context";
|
|
12
|
+
import { ErrorMessageContext, type ErrorMessageFormatter } from "./lib/error-message";
|
|
13
|
+
|
|
14
|
+
export type { ErrorMessageFormatter } from "./lib/error-message";
|
|
12
15
|
|
|
13
16
|
export { useOpenGeni, useOpenGeniClient } from "./session-context";
|
|
14
17
|
export type { ClientOverride, OpenGeniContextValue } from "./session-context";
|
|
@@ -19,6 +22,16 @@ export type OpenGeniProviderProps = {
|
|
|
19
22
|
workspaceId: string;
|
|
20
23
|
onWorkspaceControlEvent?: ((event: WorkspaceControlEvent) => void) | undefined;
|
|
21
24
|
onWorkspaceInteractionEvent?: ((event: WorkspaceInteractionRevisionEvent) => void) | undefined;
|
|
25
|
+
/**
|
|
26
|
+
* Stale-tab protection for the stock OpenGeni web app: when the server's API
|
|
27
|
+
* contract revision differs from this bundle's, cover the page and reload it
|
|
28
|
+
* once. Off by default, because an embedded product's page must never be
|
|
29
|
+
* blocked or reloaded when OpenGeni deploys; there a mismatch is ignored and
|
|
30
|
+
* the SDK's tolerant-reader compatibility applies.
|
|
31
|
+
*/
|
|
32
|
+
reloadOnApiContractChange?: boolean | undefined;
|
|
33
|
+
/** Host-owned error copy. Receives the original diagnostic error and neutral default copy. */
|
|
34
|
+
formatError?: ErrorMessageFormatter | undefined;
|
|
22
35
|
children?: ReactNode;
|
|
23
36
|
};
|
|
24
37
|
|
|
@@ -31,6 +44,8 @@ export function OpenGeniProvider({
|
|
|
31
44
|
workspaceId,
|
|
32
45
|
onWorkspaceControlEvent,
|
|
33
46
|
onWorkspaceInteractionEvent,
|
|
47
|
+
reloadOnApiContractChange = false,
|
|
48
|
+
formatError,
|
|
34
49
|
children,
|
|
35
50
|
}: OpenGeniProviderProps) {
|
|
36
51
|
const [workspaceControlEvent, setWorkspaceControlEvent] = useState<WorkspaceControlEvent | null>(
|
|
@@ -59,10 +74,11 @@ export function OpenGeniProvider({
|
|
|
59
74
|
callbackRef.current = onWorkspaceControlEvent;
|
|
60
75
|
interactionCallbackRef.current = onWorkspaceInteractionEvent;
|
|
61
76
|
|
|
77
|
+
const strictContract = reloadOnApiContractChange;
|
|
62
78
|
const verifyApiContract = useCallback(async (): Promise<void> => {
|
|
63
79
|
try {
|
|
64
80
|
const config = await client.getClientConfig();
|
|
65
|
-
if (config.apiContractRevision !== OPENGENI_API_CONTRACT_REVISION) {
|
|
81
|
+
if (strictContract && config.apiContractRevision !== OPENGENI_API_CONTRACT_REVISION) {
|
|
66
82
|
throw new OpenGeniApiContractMismatchError(
|
|
67
83
|
OPENGENI_API_CONTRACT_REVISION,
|
|
68
84
|
String(config.apiContractRevision || "(missing)"),
|
|
@@ -70,12 +86,14 @@ export function OpenGeniProvider({
|
|
|
70
86
|
}
|
|
71
87
|
} catch (error) {
|
|
72
88
|
if (error instanceof OpenGeniApiContractMismatchError) {
|
|
89
|
+
// Embedded hosts: a revision difference is not a reason to block or reload the page.
|
|
90
|
+
if (!strictContract) return;
|
|
73
91
|
setContractMismatch(error);
|
|
74
92
|
reloadForContractMismatchOnce(error);
|
|
75
93
|
}
|
|
76
94
|
throw error;
|
|
77
95
|
}
|
|
78
|
-
}, [client]);
|
|
96
|
+
}, [client, strictContract]);
|
|
79
97
|
|
|
80
98
|
const registerSessionReconciler = useMemo(
|
|
81
99
|
() =>
|
|
@@ -175,7 +193,7 @@ export function OpenGeniProvider({
|
|
|
175
193
|
}
|
|
176
194
|
}
|
|
177
195
|
} catch (error) {
|
|
178
|
-
if (error instanceof OpenGeniApiContractMismatchError) {
|
|
196
|
+
if (strictContract && error instanceof OpenGeniApiContractMismatchError) {
|
|
179
197
|
setContractMismatch(error);
|
|
180
198
|
reloadForContractMismatchOnce(error);
|
|
181
199
|
}
|
|
@@ -186,7 +204,14 @@ export function OpenGeniProvider({
|
|
|
186
204
|
}
|
|
187
205
|
})();
|
|
188
206
|
return () => controller.abort();
|
|
189
|
-
}, [
|
|
207
|
+
}, [
|
|
208
|
+
client,
|
|
209
|
+
pageLive,
|
|
210
|
+
strictContract,
|
|
211
|
+
supportsWorkspaceLiveStream,
|
|
212
|
+
verifyApiContract,
|
|
213
|
+
workspaceId,
|
|
214
|
+
]);
|
|
190
215
|
|
|
191
216
|
useEffect(() => {
|
|
192
217
|
if (supportsWorkspaceLiveStream) return;
|
|
@@ -222,7 +247,7 @@ export function OpenGeniProvider({
|
|
|
222
247
|
callbackRef.current?.(event);
|
|
223
248
|
}
|
|
224
249
|
} catch (error) {
|
|
225
|
-
if (error instanceof OpenGeniApiContractMismatchError) {
|
|
250
|
+
if (strictContract && error instanceof OpenGeniApiContractMismatchError) {
|
|
226
251
|
setContractMismatch(error);
|
|
227
252
|
reloadForContractMismatchOnce(error);
|
|
228
253
|
}
|
|
@@ -230,7 +255,14 @@ export function OpenGeniProvider({
|
|
|
230
255
|
}
|
|
231
256
|
})();
|
|
232
257
|
return () => controller.abort();
|
|
233
|
-
}, [
|
|
258
|
+
}, [
|
|
259
|
+
client,
|
|
260
|
+
pageLive,
|
|
261
|
+
strictContract,
|
|
262
|
+
supportsWorkspaceLiveStream,
|
|
263
|
+
verifyApiContract,
|
|
264
|
+
workspaceId,
|
|
265
|
+
]);
|
|
234
266
|
|
|
235
267
|
useEffect(() => {
|
|
236
268
|
if (supportsWorkspaceLiveStream) return;
|
|
@@ -265,7 +297,7 @@ export function OpenGeniProvider({
|
|
|
265
297
|
interactionCallbackRef.current?.(event);
|
|
266
298
|
}
|
|
267
299
|
} catch (error) {
|
|
268
|
-
if (error instanceof OpenGeniApiContractMismatchError) {
|
|
300
|
+
if (strictContract && error instanceof OpenGeniApiContractMismatchError) {
|
|
269
301
|
setContractMismatch(error);
|
|
270
302
|
reloadForContractMismatchOnce(error);
|
|
271
303
|
}
|
|
@@ -273,7 +305,14 @@ export function OpenGeniProvider({
|
|
|
273
305
|
}
|
|
274
306
|
})();
|
|
275
307
|
return () => controller.abort();
|
|
276
|
-
}, [
|
|
308
|
+
}, [
|
|
309
|
+
client,
|
|
310
|
+
pageLive,
|
|
311
|
+
strictContract,
|
|
312
|
+
supportsWorkspaceLiveStream,
|
|
313
|
+
verifyApiContract,
|
|
314
|
+
workspaceId,
|
|
315
|
+
]);
|
|
277
316
|
|
|
278
317
|
const value = useMemo(
|
|
279
318
|
() => ({
|
|
@@ -298,10 +337,12 @@ export function OpenGeniProvider({
|
|
|
298
337
|
],
|
|
299
338
|
);
|
|
300
339
|
return (
|
|
301
|
-
<
|
|
302
|
-
{
|
|
303
|
-
|
|
304
|
-
|
|
340
|
+
<ErrorMessageContext.Provider value={formatError}>
|
|
341
|
+
<OpenGeniContext.Provider value={value}>
|
|
342
|
+
{children}
|
|
343
|
+
{contractMismatch ? <ApiContractMismatchScreen mismatch={contractMismatch} /> : null}
|
|
344
|
+
</OpenGeniContext.Provider>
|
|
345
|
+
</ErrorMessageContext.Provider>
|
|
305
346
|
);
|
|
306
347
|
}
|
|
307
348
|
|
|
@@ -329,7 +370,7 @@ function ApiContractMismatchScreen({ mismatch }: { mismatch: OpenGeniApiContract
|
|
|
329
370
|
data-opengeni-api-contract-mismatch
|
|
330
371
|
>
|
|
331
372
|
<div className="w-full max-w-md rounded-xl border border-og-border bg-og-surface p-6 shadow-2xl">
|
|
332
|
-
<p className="text-og-menu font-semibold text-og-fg">
|
|
373
|
+
<p className="text-og-menu font-semibold text-og-fg">Opengeni updated</p>
|
|
333
374
|
<p className="mt-2 text-og-menu leading-6 text-og-muted">
|
|
334
375
|
This tab cannot safely continue with the new server version. Reload it before sending or
|
|
335
376
|
controlling work.
|
|
@@ -339,7 +380,7 @@ function ApiContractMismatchScreen({ mismatch }: { mismatch: OpenGeniApiContract
|
|
|
339
380
|
</p>
|
|
340
381
|
<button
|
|
341
382
|
type="button"
|
|
342
|
-
className="mt-5 inline-flex h-9 items-center rounded-md bg-og-fg px-3 text-og-menu font-medium
|
|
383
|
+
className="mt-5 inline-flex h-9 items-center rounded-md border border-og-primary-border bg-og-primary text-og-primary-fg hover:bg-og-primary-hover px-3 text-og-menu font-medium"
|
|
343
384
|
onClick={() => window.location.reload()}
|
|
344
385
|
>
|
|
345
386
|
Reload now
|