@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,208 @@
|
|
|
1
|
+
import { useEffect, useState, type ReactNode } from "react";
|
|
2
|
+
import { createDiscoveryCache } from "./discovery-cache";
|
|
3
|
+
import { BookOpenIcon } from "lucide-react";
|
|
4
|
+
import { CapabilityCatalogRow, type CapabilityCatalogStatus } from "./capability-catalog-row";
|
|
5
|
+
|
|
6
|
+
export type SkillDiscoveryItem = {
|
|
7
|
+
id: string;
|
|
8
|
+
name: string;
|
|
9
|
+
source: string;
|
|
10
|
+
installs: number;
|
|
11
|
+
url: string;
|
|
12
|
+
};
|
|
13
|
+
export type SkillDiscoveryPage = { items: SkillDiscoveryItem[]; nextCursor: null };
|
|
14
|
+
const discoveryCache = createDiscoveryCache<SkillDiscoveryPage>();
|
|
15
|
+
|
|
16
|
+
export type SkillDiscoveryClient = {
|
|
17
|
+
searchPublicSkills(workspaceId: string, query: string): Promise<SkillDiscoveryPage>;
|
|
18
|
+
};
|
|
19
|
+
export type SkillDiscoveryProps = {
|
|
20
|
+
installedSkills?: readonly { name: string; repositoryUrl: string; sourceUrl: string }[];
|
|
21
|
+
client: SkillDiscoveryClient;
|
|
22
|
+
workspaceId: string;
|
|
23
|
+
query: string;
|
|
24
|
+
onImport: (url: string) => void;
|
|
25
|
+
canManage: boolean;
|
|
26
|
+
localSkills?: readonly {
|
|
27
|
+
id: string;
|
|
28
|
+
name: string;
|
|
29
|
+
description?: string;
|
|
30
|
+
status?: CapabilityCatalogStatus;
|
|
31
|
+
statusLabel?: string;
|
|
32
|
+
onOpen: () => void;
|
|
33
|
+
}[];
|
|
34
|
+
resultLimit?: number;
|
|
35
|
+
onShowMore?: () => void;
|
|
36
|
+
onSearch?: (() => void) | undefined;
|
|
37
|
+
/** Display name for a registry slug ("agent-browser" -> "Agent browser"). Defaults to the slug. */
|
|
38
|
+
formatName?: (name: string) => string;
|
|
39
|
+
/** The line under a remote skill ("From vercel-labs on skills.sh"). Defaults to the source. */
|
|
40
|
+
formatSource?: (source: string) => string;
|
|
41
|
+
/** The row tile. Defaults to a bare book glyph. */
|
|
42
|
+
icon?: ReactNode;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
/** Host-owned query and import flow; browse presentation is reusable independently. */
|
|
46
|
+
export function SkillDiscovery(props: SkillDiscoveryProps) {
|
|
47
|
+
const query = props.query.trim();
|
|
48
|
+
const discoveryQuery = query || "agent";
|
|
49
|
+
return (
|
|
50
|
+
<section className="og-skill-discovery" aria-label="Discover skills">
|
|
51
|
+
<header>
|
|
52
|
+
<h3>{props.resultLimit ? "Skills" : query ? "Search skills" : "Browse skills"}</h3>
|
|
53
|
+
{!props.resultLimit ? (
|
|
54
|
+
<a
|
|
55
|
+
href="https://skills.sh/"
|
|
56
|
+
target="_blank"
|
|
57
|
+
rel="noopener noreferrer"
|
|
58
|
+
className="og-skill-discovery-browse"
|
|
59
|
+
>
|
|
60
|
+
Browse skills.sh ↗
|
|
61
|
+
</a>
|
|
62
|
+
) : null}
|
|
63
|
+
</header>
|
|
64
|
+
{!query ? (
|
|
65
|
+
<p>Popular on skills.sh</p>
|
|
66
|
+
) : query.length < 2 ? (
|
|
67
|
+
<p>Enter at least two characters to search skills.sh.</p>
|
|
68
|
+
) : null}
|
|
69
|
+
<DiscoveryResults
|
|
70
|
+
key={`${props.workspaceId}:${discoveryQuery}`}
|
|
71
|
+
{...props}
|
|
72
|
+
query={discoveryQuery}
|
|
73
|
+
/>
|
|
74
|
+
</section>
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const keepText = (value: string) => value;
|
|
79
|
+
const DEFAULT_ICON = <BookOpenIcon aria-hidden="true" />;
|
|
80
|
+
const EMPTY_LOCAL_SKILLS: NonNullable<SkillDiscoveryProps["localSkills"]> = [];
|
|
81
|
+
const EMPTY_INSTALLED_SKILLS: NonNullable<SkillDiscoveryProps["installedSkills"]> = [];
|
|
82
|
+
|
|
83
|
+
function DiscoveryResults({
|
|
84
|
+
client,
|
|
85
|
+
workspaceId,
|
|
86
|
+
query,
|
|
87
|
+
canManage,
|
|
88
|
+
onImport,
|
|
89
|
+
resultLimit,
|
|
90
|
+
onShowMore,
|
|
91
|
+
localSkills = EMPTY_LOCAL_SKILLS,
|
|
92
|
+
installedSkills = EMPTY_INSTALLED_SKILLS,
|
|
93
|
+
formatName = keepText,
|
|
94
|
+
formatSource = keepText,
|
|
95
|
+
icon = DEFAULT_ICON,
|
|
96
|
+
}: SkillDiscoveryProps) {
|
|
97
|
+
const cacheKey = JSON.stringify([workspaceId, query]);
|
|
98
|
+
const cached = discoveryCache.peek(client, cacheKey);
|
|
99
|
+
const [result, setResult] = useState<SkillDiscoveryPage | null>(cached ?? null);
|
|
100
|
+
const [loading, setLoading] = useState(query.length >= 2 && !cached);
|
|
101
|
+
const [error, setError] = useState(false);
|
|
102
|
+
const [retry, setRetry] = useState(0);
|
|
103
|
+
useEffect(() => {
|
|
104
|
+
let active = true;
|
|
105
|
+
setError(false);
|
|
106
|
+
if (query.length < 2) return;
|
|
107
|
+
const existing = discoveryCache.peek(client, cacheKey);
|
|
108
|
+
setLoading(!existing);
|
|
109
|
+
let timer: ReturnType<typeof setTimeout>;
|
|
110
|
+
const search = async (attempt: number) => {
|
|
111
|
+
try {
|
|
112
|
+
const data = await discoveryCache.read(client, cacheKey, () =>
|
|
113
|
+
client.searchPublicSkills(workspaceId, query),
|
|
114
|
+
);
|
|
115
|
+
if (!active) return;
|
|
116
|
+
setResult(data);
|
|
117
|
+
setLoading(false);
|
|
118
|
+
} catch (cause) {
|
|
119
|
+
if (!active) return;
|
|
120
|
+
const status =
|
|
121
|
+
typeof cause === "object" && cause !== null && "status" in cause
|
|
122
|
+
? cause.status
|
|
123
|
+
: undefined;
|
|
124
|
+
const transient =
|
|
125
|
+
cause instanceof TypeError ||
|
|
126
|
+
(typeof status === "number" && status >= 500 && status <= 599);
|
|
127
|
+
if (attempt === 0 && transient) {
|
|
128
|
+
timer = setTimeout(() => void search(1), 750);
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
setError(true);
|
|
132
|
+
setLoading(false);
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
timer = setTimeout(() => void search(0), existing ? 0 : 300);
|
|
136
|
+
return () => {
|
|
137
|
+
active = false;
|
|
138
|
+
clearTimeout(timer);
|
|
139
|
+
};
|
|
140
|
+
}, [client, workspaceId, query, cacheKey, retry]);
|
|
141
|
+
const remoteSkills =
|
|
142
|
+
result?.items.filter(
|
|
143
|
+
(skill) =>
|
|
144
|
+
!localSkills.some((local) => local.name.toLowerCase() === skill.name.toLowerCase()),
|
|
145
|
+
) ?? [];
|
|
146
|
+
return (
|
|
147
|
+
<div aria-busy={loading}>
|
|
148
|
+
<div className="og-skill-discovery-grid">
|
|
149
|
+
{localSkills.slice(0, resultLimit).map((skill) => (
|
|
150
|
+
<CapabilityCatalogRow
|
|
151
|
+
key={skill.id}
|
|
152
|
+
name={skill.name}
|
|
153
|
+
description={skill.description}
|
|
154
|
+
icon={icon}
|
|
155
|
+
status={skill.status ?? "added"}
|
|
156
|
+
statusLabel={skill.statusLabel}
|
|
157
|
+
onOpen={skill.onOpen}
|
|
158
|
+
/>
|
|
159
|
+
))}
|
|
160
|
+
{remoteSkills
|
|
161
|
+
.slice(
|
|
162
|
+
0,
|
|
163
|
+
resultLimit === undefined ? undefined : Math.max(0, resultLimit - localSkills.length),
|
|
164
|
+
)
|
|
165
|
+
.map((skill) => {
|
|
166
|
+
const installed = installedSkills.some(
|
|
167
|
+
(entry) =>
|
|
168
|
+
entry.sourceUrl.replace(/\/$/, "").toLowerCase() === skill.url.toLowerCase() ||
|
|
169
|
+
(entry.repositoryUrl.replace(/\/$/, "").toLowerCase() ===
|
|
170
|
+
`https://github.com/${skill.source}`.toLowerCase() &&
|
|
171
|
+
entry.name.toLowerCase() === skill.name.toLowerCase()),
|
|
172
|
+
);
|
|
173
|
+
return (
|
|
174
|
+
<CapabilityCatalogRow
|
|
175
|
+
key={skill.id}
|
|
176
|
+
disabled={!canManage}
|
|
177
|
+
name={formatName(skill.name)}
|
|
178
|
+
description={formatSource(skill.source)}
|
|
179
|
+
icon={icon}
|
|
180
|
+
status={!canManage ? "unavailable" : installed ? "added" : "available"}
|
|
181
|
+
statusLabel={
|
|
182
|
+
!canManage ? "Admin required" : installed ? "Installed" : "Available to add"
|
|
183
|
+
}
|
|
184
|
+
onOpen={() => onImport(skill.url)}
|
|
185
|
+
/>
|
|
186
|
+
);
|
|
187
|
+
})}
|
|
188
|
+
</div>
|
|
189
|
+
{resultLimit && remoteSkills.length + localSkills.length > resultLimit && !loading ? (
|
|
190
|
+
<button className="og-catalog-more" type="button" onClick={onShowMore}>
|
|
191
|
+
View all skills
|
|
192
|
+
</button>
|
|
193
|
+
) : null}
|
|
194
|
+
{loading ? <p role="status">Loading skills…</p> : null}
|
|
195
|
+
{error ? (
|
|
196
|
+
<div role="alert" className="og-skill-discovery-error">
|
|
197
|
+
Could not load skills.
|
|
198
|
+
<button type="button" onClick={() => setRetry((value) => value + 1)}>
|
|
199
|
+
Retry
|
|
200
|
+
</button>
|
|
201
|
+
</div>
|
|
202
|
+
) : null}
|
|
203
|
+
{result && !remoteSkills.length && !localSkills.length && !loading && !error ? (
|
|
204
|
+
<p role="status">{`No matches for “${query}”.`}</p>
|
|
205
|
+
) : null}
|
|
206
|
+
</div>
|
|
207
|
+
);
|
|
208
|
+
}
|
package/src/terminal.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import {
|
|
2
|
+
registerSandboxTerminal,
|
|
3
|
+
type SandboxTerminalPeers,
|
|
4
|
+
type WorkbenchPeerLoader,
|
|
5
|
+
} from "./lib/workbench-peers";
|
|
6
|
+
|
|
7
|
+
export { SandboxTerminal } from "./components/sandbox-terminal";
|
|
8
|
+
export type { SandboxTerminalProps, XtermTheme } from "./components/sandbox-terminal";
|
|
9
|
+
export { registerSandboxTerminal } from "./lib/workbench-peers";
|
|
10
|
+
|
|
11
|
+
async function loadTerminal(): Promise<SandboxTerminalPeers> {
|
|
12
|
+
const [{ Terminal }, { FitAddon }, { WebLinksAddon }] = await Promise.all([
|
|
13
|
+
import("@xterm/xterm"),
|
|
14
|
+
import("@xterm/addon-fit"),
|
|
15
|
+
import("@xterm/addon-web-links"),
|
|
16
|
+
]);
|
|
17
|
+
return { Terminal, FitAddon, WebLinksAddon };
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** Opt in once on a terminal route; WebGL remains a separate optional import. */
|
|
21
|
+
export function enableSandboxTerminal(options?: { webgl?: WorkbenchPeerLoader | undefined }): void {
|
|
22
|
+
const loadWebgl = options?.webgl;
|
|
23
|
+
registerSandboxTerminal(
|
|
24
|
+
loadWebgl ? async () => ({ ...(await loadTerminal()), loadWebgl }) : loadTerminal,
|
|
25
|
+
);
|
|
26
|
+
}
|
|
@@ -1,11 +1,18 @@
|
|
|
1
|
+
import { KnowledgeReceiptRow } from "./knowledge-receipt";
|
|
2
|
+
import { AnimatePresence, motion, useReducedMotion } from "motion/react";
|
|
3
|
+
import { GenieLoading } from "./genie-loading";
|
|
4
|
+
import { useStartupDetails } from "./startup-preference";
|
|
5
|
+
import { ArrowRightIcon, BotIcon, BrainCircuitIcon, MessageSquareTextIcon } from "lucide-react";
|
|
1
6
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
createContext,
|
|
8
|
+
lazy,
|
|
9
|
+
Suspense,
|
|
10
|
+
useContext,
|
|
11
|
+
useLayoutEffect,
|
|
12
|
+
useRef,
|
|
13
|
+
useState,
|
|
14
|
+
type ReactNode,
|
|
15
|
+
} from "react";
|
|
9
16
|
import { jsx as rowJsx, jsxs as rowJsxs } from "react/jsx-runtime";
|
|
10
17
|
import { Markdown } from "../components/markdown";
|
|
11
18
|
import { cn } from "../lib/cn";
|
|
@@ -14,11 +21,18 @@ import { defaultToolRegistry } from "./tool-renderers";
|
|
|
14
21
|
import { useEntranceAnimation, useEntranceAnimationLive } from "./entrance";
|
|
15
22
|
import type { RetainedArtifactLoader, RetainedScreenshotLoader, ToolRegistry } from "./registry";
|
|
16
23
|
import { useSeenActivityIds } from "./seen-activity-ids";
|
|
17
|
-
import {
|
|
24
|
+
import {
|
|
25
|
+
BodyNote,
|
|
26
|
+
PayloadBlock,
|
|
27
|
+
ActivityDisclosure,
|
|
28
|
+
CompactActivityContext,
|
|
29
|
+
ToolCallTruncationProvider,
|
|
30
|
+
} from "./shared";
|
|
18
31
|
import { toolDisplayName } from "./tool-display-name";
|
|
19
|
-
import type { ActivityItem,
|
|
32
|
+
import type { ActivityItem, AgentMessageItem, MemoryItem, WorkerItem } from "./types";
|
|
20
33
|
|
|
21
34
|
const LazyFleetDecisionRow = lazy(() => import("./fleet-decision-row"));
|
|
35
|
+
const LazyPlatformActivityRow = lazy(() => import("./platform-activity-row"));
|
|
22
36
|
|
|
23
37
|
/* ----------------------------------------------------------------------------
|
|
24
38
|
Activity rail
|
|
@@ -33,6 +47,8 @@ const LazyFleetDecisionRow = lazy(() => import("./fleet-decision-row"));
|
|
|
33
47
|
|
|
34
48
|
export type ActivityRailProps = {
|
|
35
49
|
items: ActivityItem[];
|
|
50
|
+
/** The owning turn remains active between individual phase receipts. */
|
|
51
|
+
startupActive?: boolean;
|
|
36
52
|
/** Renderer registry for tool calls. Defaults to {@link defaultToolRegistry}. */
|
|
37
53
|
toolRegistry?: ToolRegistry | undefined;
|
|
38
54
|
/** Drill into a spawned worker session. */
|
|
@@ -65,6 +81,7 @@ function familyOf(item: ActivityItem): string {
|
|
|
65
81
|
|
|
66
82
|
export function ActivityRail({
|
|
67
83
|
items,
|
|
84
|
+
startupActive,
|
|
68
85
|
toolRegistry = defaultToolRegistry,
|
|
69
86
|
onOpenSession,
|
|
70
87
|
onMemoryClick,
|
|
@@ -73,6 +90,38 @@ export function ActivityRail({
|
|
|
73
90
|
bare,
|
|
74
91
|
className,
|
|
75
92
|
}: ActivityRailProps) {
|
|
93
|
+
const debug = useStartupDetails();
|
|
94
|
+
const reducedMotion = useReducedMotion();
|
|
95
|
+
const [detailsOpen, setDetailsOpen] = useState(false);
|
|
96
|
+
const phases = items.filter((item) => item.kind === "startup-phase");
|
|
97
|
+
// Empty reasoning envelopes can arrive before any visible model output.
|
|
98
|
+
const hasWork = items.some(
|
|
99
|
+
(item) =>
|
|
100
|
+
item.kind !== "startup-phase" && (item.kind !== "reasoning" || item.text.trim().length > 0),
|
|
101
|
+
);
|
|
102
|
+
const interrupted = phases.some(
|
|
103
|
+
(item) => item.status === "failed" || item.status === "cancelled",
|
|
104
|
+
);
|
|
105
|
+
const providerResponded = phases.some(
|
|
106
|
+
(item) => item.phase === "provider_first_byte" && item.status === "complete",
|
|
107
|
+
);
|
|
108
|
+
const responsePending = phases.some((item) => item.phase === "provider_first_byte");
|
|
109
|
+
const loading =
|
|
110
|
+
!hasWork &&
|
|
111
|
+
!interrupted &&
|
|
112
|
+
(startupActive ?? (!providerResponded && phases.some((item) => item.status === "running")));
|
|
113
|
+
const visibleItems =
|
|
114
|
+
debug || detailsOpen
|
|
115
|
+
? items
|
|
116
|
+
: items.filter((item) =>
|
|
117
|
+
item.kind === "startup-phase"
|
|
118
|
+
? item.status === "failed" || item.status === "cancelled"
|
|
119
|
+
: item.kind !== "reasoning" || item.text.trim().length > 0,
|
|
120
|
+
);
|
|
121
|
+
const startedAt = phases.reduce(
|
|
122
|
+
(first, item) => (item.startedAt < first ? item.startedAt : first),
|
|
123
|
+
phases[0]?.startedAt ?? "",
|
|
124
|
+
);
|
|
76
125
|
const enterMounted = useEntranceAnimation();
|
|
77
126
|
// Live gate: rails born during bulk capture enter=false forever; with a
|
|
78
127
|
// seen-id map we still want later live appends to fade (ids gate remounts).
|
|
@@ -107,7 +156,7 @@ export function ActivityRail({
|
|
|
107
156
|
// Rows sit TIGHT by default (gap-0.5) so a same-family run reads as one
|
|
108
157
|
// calm cluster; a family change opens real breathing room (mt-3) below,
|
|
109
158
|
// so a long rail reads as a few clusters, not a metronome of rows.
|
|
110
|
-
"flex flex-col gap-0.5",
|
|
159
|
+
"relative flex flex-col gap-0.5",
|
|
111
160
|
!bare && "border-l-2 border-og-border pl-3 sm:pl-4",
|
|
112
161
|
// Whole-rail enter: standalone rails only (no seen-id map). Inside
|
|
113
162
|
// MessageTimeline, unknown ids take per-row enter — remounts stay quiet.
|
|
@@ -115,8 +164,43 @@ export function ActivityRail({
|
|
|
115
164
|
className,
|
|
116
165
|
)}
|
|
117
166
|
>
|
|
118
|
-
|
|
119
|
-
|
|
167
|
+
<AnimatePresence initial={false}>
|
|
168
|
+
{loading && !debug ? (
|
|
169
|
+
<motion.div
|
|
170
|
+
key="startup"
|
|
171
|
+
initial={{ opacity: 0 }}
|
|
172
|
+
animate={{ opacity: 1, height: "auto" }}
|
|
173
|
+
exit={{
|
|
174
|
+
opacity: 0,
|
|
175
|
+
height: 0,
|
|
176
|
+
pointerEvents: "none",
|
|
177
|
+
}}
|
|
178
|
+
transition={{
|
|
179
|
+
height: { duration: reducedMotion ? 0 : 0.32, ease: [0.22, 1, 0.36, 1] },
|
|
180
|
+
opacity: { duration: reducedMotion ? 0 : 0.16 },
|
|
181
|
+
}}
|
|
182
|
+
style={{ overflow: "hidden" }}
|
|
183
|
+
>
|
|
184
|
+
<GenieLoading
|
|
185
|
+
startedAt={startedAt}
|
|
186
|
+
phase={responsePending ? "waiting" : "preparing"}
|
|
187
|
+
detailsOpen={detailsOpen}
|
|
188
|
+
onShowDetails={() => setDetailsOpen((open) => !open)}
|
|
189
|
+
/>
|
|
190
|
+
</motion.div>
|
|
191
|
+
) : null}
|
|
192
|
+
</AnimatePresence>
|
|
193
|
+
{detailsOpen && !debug && !loading ? (
|
|
194
|
+
<button
|
|
195
|
+
type="button"
|
|
196
|
+
className="og-genie-details self-start"
|
|
197
|
+
onClick={() => setDetailsOpen(false)}
|
|
198
|
+
>
|
|
199
|
+
Hide startup details
|
|
200
|
+
</button>
|
|
201
|
+
) : null}
|
|
202
|
+
{visibleItems.map((item, index) => {
|
|
203
|
+
const newFamily = index > 0 && familyOf(item) !== familyOf(visibleItems[index - 1]!);
|
|
120
204
|
const row = renderActivity(
|
|
121
205
|
item,
|
|
122
206
|
toolRegistry,
|
|
@@ -129,6 +213,7 @@ export function ActivityRail({
|
|
|
129
213
|
<div
|
|
130
214
|
key={item.id}
|
|
131
215
|
data-og-timeline-row-anchor=""
|
|
216
|
+
data-og-item={item.id}
|
|
132
217
|
data-og-annotation-source-key={
|
|
133
218
|
item.kind === "tool-call" ? item.annotationSource?.eventId : undefined
|
|
134
219
|
}
|
|
@@ -142,12 +227,46 @@ export function ActivityRail({
|
|
|
142
227
|
);
|
|
143
228
|
}
|
|
144
229
|
|
|
230
|
+
/**
|
|
231
|
+
* Host message renderer for progress notes inside a rail, so notes keep the
|
|
232
|
+
* host's links and formatting. Without one, notes render the library Markdown.
|
|
233
|
+
*/
|
|
234
|
+
export const ActivityNoteTextContext = createContext<
|
|
235
|
+
((text: string, item: AgentMessageItem) => ReactNode) | null
|
|
236
|
+
>(null);
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Assistant commentary folded into the rail: the agent's own words about the
|
|
240
|
+
* work, quieter than an answer and aligned with the step titles.
|
|
241
|
+
*/
|
|
242
|
+
function ActivityNoteRow({ item }: { item: AgentMessageItem }) {
|
|
243
|
+
const renderText = useContext(ActivityNoteTextContext);
|
|
244
|
+
if (!item.text.trim()) return null;
|
|
245
|
+
return (
|
|
246
|
+
<div className="flex items-start gap-2 px-1.5 py-1.5" data-og-activity-note="">
|
|
247
|
+
<span className="size-3.5 shrink-0" aria-hidden />
|
|
248
|
+
<MessageSquareTextIcon aria-hidden className="mt-1 size-3.5 shrink-0 text-og-fg-subtle" />
|
|
249
|
+
<div
|
|
250
|
+
className="min-w-0 flex-1 text-og-sm text-og-fg-muted"
|
|
251
|
+
data-og-search-item={item.id}
|
|
252
|
+
data-og-annotation-source-key={item.annotationSource?.eventId}
|
|
253
|
+
>
|
|
254
|
+
{renderText ? (
|
|
255
|
+
renderText(item.text, item)
|
|
256
|
+
) : (
|
|
257
|
+
<Markdown streaming={item.streaming}>{item.text}</Markdown>
|
|
258
|
+
)}
|
|
259
|
+
</div>
|
|
260
|
+
</div>
|
|
261
|
+
);
|
|
262
|
+
}
|
|
263
|
+
|
|
145
264
|
/** A never-reachable guard: adding an `ActivityItem` kind is now a compile error. */
|
|
146
265
|
function assertNever(item: never): never {
|
|
147
266
|
throw new Error(`ActivityRail: unhandled activity item ${JSON.stringify(item)}`);
|
|
148
267
|
}
|
|
149
268
|
|
|
150
|
-
function renderActivity(
|
|
269
|
+
export function renderActivity(
|
|
151
270
|
item: ActivityItem,
|
|
152
271
|
toolRegistry: ToolRegistry,
|
|
153
272
|
onOpenSession: ((sessionId: string) => void) | undefined,
|
|
@@ -157,7 +276,22 @@ function renderActivity(
|
|
|
157
276
|
) {
|
|
158
277
|
switch (item.kind) {
|
|
159
278
|
case "reasoning":
|
|
160
|
-
|
|
279
|
+
case "sandbox":
|
|
280
|
+
case "startup-phase":
|
|
281
|
+
return (
|
|
282
|
+
<Suspense fallback={null}>
|
|
283
|
+
<LazyPlatformActivityRow
|
|
284
|
+
item={item}
|
|
285
|
+
d={ActivityDisclosure}
|
|
286
|
+
p={PayloadBlock}
|
|
287
|
+
t={toolDisplayName}
|
|
288
|
+
b={BotIcon}
|
|
289
|
+
m={Markdown}
|
|
290
|
+
j={rowJsx}
|
|
291
|
+
s={rowJsxs}
|
|
292
|
+
/>
|
|
293
|
+
</Suspense>
|
|
294
|
+
);
|
|
161
295
|
case "tool-call": {
|
|
162
296
|
const Renderer = toolRegistry.resolve(item);
|
|
163
297
|
return (
|
|
@@ -172,10 +306,20 @@ function renderActivity(
|
|
|
172
306
|
}
|
|
173
307
|
case "worker":
|
|
174
308
|
return <WorkerRow item={item} onOpenSession={onOpenSession} />;
|
|
175
|
-
case "
|
|
176
|
-
return
|
|
309
|
+
case "knowledge":
|
|
310
|
+
return (
|
|
311
|
+
<KnowledgeReceiptRow
|
|
312
|
+
outcome={item.outcome}
|
|
313
|
+
entryId={item.entryId}
|
|
314
|
+
fileId={item.fileId}
|
|
315
|
+
title={item.filename}
|
|
316
|
+
source={Boolean(item.fileId)}
|
|
317
|
+
/>
|
|
318
|
+
);
|
|
177
319
|
case "memory":
|
|
178
320
|
return <MemoryRow item={item} onMemoryClick={onMemoryClick} />;
|
|
321
|
+
case "agent-message":
|
|
322
|
+
return <ActivityNoteRow item={item} />;
|
|
179
323
|
case "fleet-decision":
|
|
180
324
|
return (
|
|
181
325
|
<Suspense fallback={null}>
|
|
@@ -193,32 +337,6 @@ function renderActivity(
|
|
|
193
337
|
}
|
|
194
338
|
}
|
|
195
339
|
|
|
196
|
-
function ReasoningRow({ item }: { item: ReasoningItem }) {
|
|
197
|
-
// Reasoning recedes: a dimmer, lighter-weight title so action rows lead and
|
|
198
|
-
// thought rows sit a half-step back in the hierarchy. Body uses the same
|
|
199
|
-
// GFM markdown path as agent messages — Codex reasoning often carries
|
|
200
|
-
// headings/lists/bold that were previously shown as raw plaintext.
|
|
201
|
-
return (
|
|
202
|
-
<ActivityDisclosure
|
|
203
|
-
icon={<BrainIcon className="size-3.5" />}
|
|
204
|
-
iconTone="muted"
|
|
205
|
-
title={
|
|
206
|
-
item.streaming ? (
|
|
207
|
-
"Thinking"
|
|
208
|
-
) : (
|
|
209
|
-
<span className="font-normal italic text-og-fg-subtle">Thought</span>
|
|
210
|
-
)
|
|
211
|
-
}
|
|
212
|
-
running={item.streaming}
|
|
213
|
-
preview={truncate(item.text, 110)}
|
|
214
|
-
>
|
|
215
|
-
<div className="text-og-base leading-6 text-og-fg-muted [&_strong]:text-og-fg-muted">
|
|
216
|
-
<Markdown streaming={item.streaming}>{item.text}</Markdown>
|
|
217
|
-
</div>
|
|
218
|
-
</ActivityDisclosure>
|
|
219
|
-
);
|
|
220
|
-
}
|
|
221
|
-
|
|
222
340
|
/**
|
|
223
341
|
* Human labels for the memory kinds, translated at the SDK boundary so a raw
|
|
224
342
|
* enum slug never renders as UI. Kept local to the library (the app has its own
|
|
@@ -317,44 +435,6 @@ function MemoryRow({
|
|
|
317
435
|
);
|
|
318
436
|
}
|
|
319
437
|
|
|
320
|
-
/**
|
|
321
|
-
* A human title for a sandbox operation row. Named platform operations (the lazy
|
|
322
|
-
* `sandbox.provision` first-establish that now runs mid-turn) read as calm,
|
|
323
|
-
* status-aware English instead of a raw op id — the box coming up should look
|
|
324
|
-
* like "Starting sandbox", never an unexplained long-running command. Unnamed /
|
|
325
|
-
* unknown ops fall back to the generic id-to-words {@link toolDisplayName}.
|
|
326
|
-
*/
|
|
327
|
-
function sandboxRowTitle(item: SandboxItem): string {
|
|
328
|
-
if (item.name === "sandbox.provision") {
|
|
329
|
-
if (item.status === "failed") return "Sandbox didn’t start";
|
|
330
|
-
if (item.status === "running") return "Starting sandbox";
|
|
331
|
-
if (item.origin === "resumed") return "Sandbox reattached";
|
|
332
|
-
if (item.origin === "restored") return "Sandbox restored";
|
|
333
|
-
if (item.origin === "created") return "Sandbox created";
|
|
334
|
-
return "Sandbox ready";
|
|
335
|
-
}
|
|
336
|
-
return toolDisplayName(item.name);
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
function SandboxRow({ item }: { item: SandboxItem }) {
|
|
340
|
-
return (
|
|
341
|
-
<ActivityDisclosure
|
|
342
|
-
icon={<SquareTerminalIcon className="size-3.5" />}
|
|
343
|
-
iconTone={
|
|
344
|
-
item.status === "failed" ? "failed" : item.status === "running" ? "running" : "muted"
|
|
345
|
-
}
|
|
346
|
-
title={sandboxRowTitle(item)}
|
|
347
|
-
running={item.status === "running"}
|
|
348
|
-
failed={item.status === "failed"}
|
|
349
|
-
cancelled={item.status === "cancelled"}
|
|
350
|
-
preview={item.command ?? undefined}
|
|
351
|
-
>
|
|
352
|
-
{item.command ? <PayloadBlock label="Command" value={item.command} /> : null}
|
|
353
|
-
{item.output ? <PayloadBlock label="Output" value={item.output} /> : null}
|
|
354
|
-
</ActivityDisclosure>
|
|
355
|
-
);
|
|
356
|
-
}
|
|
357
|
-
|
|
358
438
|
/** Spawned/messaged worker sessions get a first-class card, not a tool row. */
|
|
359
439
|
function WorkerRow({
|
|
360
440
|
item,
|
|
@@ -363,6 +443,7 @@ function WorkerRow({
|
|
|
363
443
|
item: WorkerItem;
|
|
364
444
|
onOpenSession?: ((sessionId: string) => void) | undefined;
|
|
365
445
|
}) {
|
|
446
|
+
const compact = useContext(CompactActivityContext);
|
|
366
447
|
const running = item.status === "running";
|
|
367
448
|
const failed = item.status === "failed";
|
|
368
449
|
const cancelled = item.status === "cancelled";
|
|
@@ -382,6 +463,16 @@ function WorkerRow({
|
|
|
382
463
|
: cancelled
|
|
383
464
|
? "Worker interrupted"
|
|
384
465
|
: "Worker messaged";
|
|
466
|
+
if (compact) {
|
|
467
|
+
return (
|
|
468
|
+
<ActivityDisclosure
|
|
469
|
+
icon={<BotIcon className="size-3.5" />}
|
|
470
|
+
title={title}
|
|
471
|
+
preview={item.prompt}
|
|
472
|
+
running={running}
|
|
473
|
+
/>
|
|
474
|
+
);
|
|
475
|
+
}
|
|
385
476
|
// A worker is a first-class actor but still a STEP on the rail — a borderless
|
|
386
477
|
// row (no card), aligned to its sibling tool rows: the chevron column is an
|
|
387
478
|
// empty spacer (a worker doesn't expand), then the bot glyph, then the title
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import type { AllowanceExhaustedRefusal } from "@opengeni/sdk";
|
|
2
|
+
import { GaugeIcon } from "lucide-react";
|
|
3
|
+
import { createContext, useContext, useMemo, type ReactNode } from "react";
|
|
4
|
+
|
|
5
|
+
import { cn } from "../lib/cn";
|
|
6
|
+
import {
|
|
7
|
+
allowanceLabels,
|
|
8
|
+
allowanceResetSentence,
|
|
9
|
+
formatAllowanceInstant,
|
|
10
|
+
type AllowanceLabels,
|
|
11
|
+
} from "../usage/allowance-copy";
|
|
12
|
+
import { useEntranceAnimation } from "./entrance";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Replace the built-in "usage limit reached" row. Return `undefined` to keep
|
|
16
|
+
* the default for this refusal (for example, only customize member limits).
|
|
17
|
+
*/
|
|
18
|
+
export type RenderAllowanceExhausted = (
|
|
19
|
+
refusal: AllowanceExhaustedRefusal,
|
|
20
|
+
context: { labels: AllowanceLabels; defaultRow: ReactNode },
|
|
21
|
+
) => ReactNode | undefined;
|
|
22
|
+
|
|
23
|
+
type AllowancePresentation = {
|
|
24
|
+
render: RenderAllowanceExhausted | undefined;
|
|
25
|
+
labels: AllowanceLabels;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
const AllowancePresentationContext = createContext<AllowancePresentation>({
|
|
29
|
+
render: undefined,
|
|
30
|
+
labels: allowanceLabels(),
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
export function AllowancePresentationProvider({
|
|
34
|
+
render,
|
|
35
|
+
labels,
|
|
36
|
+
children,
|
|
37
|
+
}: {
|
|
38
|
+
render: RenderAllowanceExhausted | undefined;
|
|
39
|
+
labels: Partial<AllowanceLabels> | undefined;
|
|
40
|
+
children: ReactNode;
|
|
41
|
+
}) {
|
|
42
|
+
const value = useMemo(() => ({ render, labels: allowanceLabels(labels) }), [render, labels]);
|
|
43
|
+
return (
|
|
44
|
+
<AllowancePresentationContext.Provider value={value}>
|
|
45
|
+
{children}
|
|
46
|
+
</AllowancePresentationContext.Provider>
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* A usage ceiling stopped further work. Calm by design: nothing failed, the
|
|
52
|
+
* conversation is kept, and the row says who can raise the limit and when it
|
|
53
|
+
* resets. Never the server's prose or a member identifier.
|
|
54
|
+
*/
|
|
55
|
+
export function AllowanceExhaustedRow({ refusal }: { refusal: AllowanceExhaustedRefusal }) {
|
|
56
|
+
const { render, labels } = useContext(AllowancePresentationContext);
|
|
57
|
+
const enter = useEntranceAnimation();
|
|
58
|
+
const workspace = refusal.scope === "workspace";
|
|
59
|
+
const defaultRow = (
|
|
60
|
+
<div
|
|
61
|
+
className={cn(
|
|
62
|
+
enter && "animate-og-enter",
|
|
63
|
+
"flex items-start gap-2.5 rounded-og-md border border-og-status-waiting/35 bg-og-status-waiting/8 px-3.5 py-2.5 text-og-menu text-og-fg",
|
|
64
|
+
)}
|
|
65
|
+
role="status"
|
|
66
|
+
data-og-allowance-exhausted={refusal.scope}
|
|
67
|
+
>
|
|
68
|
+
<GaugeIcon aria-hidden className="mt-0.5 size-4 shrink-0 text-og-status-waiting" />
|
|
69
|
+
<div className="min-w-0 flex-1">
|
|
70
|
+
<p className="font-medium">
|
|
71
|
+
{workspace ? labels.workspaceLimitReachedTitle : labels.memberLimitReachedTitle}
|
|
72
|
+
</p>
|
|
73
|
+
<p className="mt-0.5 text-og-fg-muted">
|
|
74
|
+
{workspace ? labels.workspaceRemedy : labels.memberRemedy}{" "}
|
|
75
|
+
<span
|
|
76
|
+
title={refusal.resetsAt ? formatAllowanceInstant(refusal.resetsAt) : undefined}
|
|
77
|
+
className="whitespace-nowrap"
|
|
78
|
+
>
|
|
79
|
+
{allowanceResetSentence(labels, refusal.resetsAt)}
|
|
80
|
+
</span>
|
|
81
|
+
</p>
|
|
82
|
+
</div>
|
|
83
|
+
</div>
|
|
84
|
+
);
|
|
85
|
+
return <>{render?.(refusal, { labels, defaultRow }) ?? defaultRow}</>;
|
|
86
|
+
}
|