@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
package/src/timeline/registry.ts
CHANGED
|
@@ -13,7 +13,7 @@ import type { ToolCallItem } from "./types";
|
|
|
13
13
|
Resolution order (most → least specific):
|
|
14
14
|
1. exact match on `raw.type` (e.g. "apply_patch_call", "computer_call")
|
|
15
15
|
2. exact match on the tool `name` (e.g. "exec_command", "web_search_call")
|
|
16
|
-
3. leaf match after MCP `__` prefix (e.g. opengeni__environment_set_variable)
|
|
16
|
+
3. allowed leaf match after MCP `__` prefix (e.g. opengeni__environment_set_variable)
|
|
17
17
|
4. the registry's generic fallback
|
|
18
18
|
|
|
19
19
|
A consumer extends the defaults without forking by passing overrides to
|
|
@@ -48,7 +48,13 @@ export type ToolRenderer = ComponentType<ToolRendererProps>;
|
|
|
48
48
|
/** A registry entry: which key it matches and the component that renders it. */
|
|
49
49
|
export type ToolRegistryEntry =
|
|
50
50
|
| { match: "rawType"; type: string; render: ToolRenderer }
|
|
51
|
-
| {
|
|
51
|
+
| {
|
|
52
|
+
match: "name";
|
|
53
|
+
name: string;
|
|
54
|
+
render: ToolRenderer;
|
|
55
|
+
/** Disable untrusted `<server>__${name}` leaf matching for identity-sensitive renderers. */
|
|
56
|
+
matchPrefixedLeaf?: boolean | undefined;
|
|
57
|
+
};
|
|
52
58
|
|
|
53
59
|
export type ToolRegistry = {
|
|
54
60
|
/** Resolve the renderer for a call (never null — falls back to generic). */
|
|
@@ -92,6 +98,7 @@ export function createToolRegistry(
|
|
|
92
98
|
|
|
93
99
|
const byRawType = new Map<string, ToolRenderer>();
|
|
94
100
|
const byName = new Map<string, ToolRenderer>();
|
|
101
|
+
const byPrefixedLeaf = new Map<string, ToolRenderer>();
|
|
95
102
|
for (const entry of entries) {
|
|
96
103
|
if (entry.match === "rawType") {
|
|
97
104
|
if (!byRawType.has(entry.type)) {
|
|
@@ -100,6 +107,11 @@ export function createToolRegistry(
|
|
|
100
107
|
} else if (!byName.has(entry.name)) {
|
|
101
108
|
byName.set(entry.name, entry.render);
|
|
102
109
|
}
|
|
110
|
+
if (entry.match === "name" && entry.matchPrefixedLeaf !== false) {
|
|
111
|
+
if (!byPrefixedLeaf.has(entry.name)) {
|
|
112
|
+
byPrefixedLeaf.set(entry.name, entry.render);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
103
115
|
}
|
|
104
116
|
|
|
105
117
|
const resolve = (item: ToolCallItem): ToolRenderer => {
|
|
@@ -116,7 +128,7 @@ export function createToolRegistry(
|
|
|
116
128
|
}
|
|
117
129
|
const leaf = mcpToolLeaf(item.name);
|
|
118
130
|
if (leaf !== item.name) {
|
|
119
|
-
const byLeaf =
|
|
131
|
+
const byLeaf = byPrefixedLeaf.get(leaf);
|
|
120
132
|
if (byLeaf) {
|
|
121
133
|
return byLeaf;
|
|
122
134
|
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
2
|
+
import type { RetainedArtifactReference } from "@opengeni/sdk";
|
|
3
|
+
import type { ToolRendererProps } from "./registry";
|
|
4
|
+
type RetainedImageState =
|
|
5
|
+
| { kind: "loading" }
|
|
6
|
+
| { kind: "ready"; url: string }
|
|
7
|
+
| { kind: "unavailable"; label: string }
|
|
8
|
+
| { kind: "error"; message: string };
|
|
9
|
+
|
|
10
|
+
export { isRetainedImageContentType } from "./presented-image";
|
|
11
|
+
|
|
12
|
+
export function useRetainedImageObjectUrl(
|
|
13
|
+
artifact: RetainedArtifactReference,
|
|
14
|
+
load: ToolRendererProps["loadRetainedArtifact"],
|
|
15
|
+
): RetainedImageState & { retry: () => void } {
|
|
16
|
+
const [state, setState] = useState<RetainedImageState>({ kind: "loading" });
|
|
17
|
+
const [retrievalAttempt, setRetrievalAttempt] = useState(0);
|
|
18
|
+
// Retry only the immutable retained artifact; never issue a new capture or
|
|
19
|
+
// rewrite the tool receipt/model history to repair a human preview.
|
|
20
|
+
const retry = useCallback(() => setRetrievalAttempt((attempt) => attempt + 1), []);
|
|
21
|
+
// Function outputs are commonly serialized JSON. Parsing them creates a new
|
|
22
|
+
// object on every render, so depend on the immutable wire value rather than
|
|
23
|
+
// object identity; otherwise the loader can refetch after its own setState.
|
|
24
|
+
const artifactValue = retainedArtifactValue(artifact);
|
|
25
|
+
const stableArtifactRef = useRef({ value: artifactValue, artifact });
|
|
26
|
+
if (stableArtifactRef.current.value !== artifactValue) {
|
|
27
|
+
stableArtifactRef.current = { value: artifactValue, artifact };
|
|
28
|
+
}
|
|
29
|
+
const stableArtifact = stableArtifactRef.current.artifact;
|
|
30
|
+
useEffect(() => {
|
|
31
|
+
if (!load) {
|
|
32
|
+
setState({ kind: "unavailable", label: "retrieval is not configured" });
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const controller = new AbortController();
|
|
36
|
+
let objectUrl: string | null = null;
|
|
37
|
+
setState({ kind: "loading" });
|
|
38
|
+
void load(stableArtifact, controller.signal)
|
|
39
|
+
.then((source) => {
|
|
40
|
+
if (controller.signal.aborted) return;
|
|
41
|
+
if (!source) {
|
|
42
|
+
setState({ kind: "unavailable", label: "bytes are unavailable" });
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
if (!(source instanceof Uint8Array)) {
|
|
46
|
+
if (!source.url.trim()) {
|
|
47
|
+
setState({ kind: "unavailable", label: "URL is unavailable" });
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
setState({ kind: "ready", url: source.url });
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
objectUrl = URL.createObjectURL(
|
|
54
|
+
new Blob([source as unknown as BlobPart], { type: stableArtifact.contentType }),
|
|
55
|
+
);
|
|
56
|
+
setState({ kind: "ready", url: objectUrl });
|
|
57
|
+
})
|
|
58
|
+
.catch((error: unknown) => {
|
|
59
|
+
if (controller.signal.aborted) return;
|
|
60
|
+
const status =
|
|
61
|
+
error && typeof error === "object" && "status" in error
|
|
62
|
+
? Number((error as { status?: unknown }).status)
|
|
63
|
+
: null;
|
|
64
|
+
setState(
|
|
65
|
+
status === 404
|
|
66
|
+
? { kind: "unavailable", label: "deleted" }
|
|
67
|
+
: status === 410
|
|
68
|
+
? { kind: "unavailable", label: "expired or unavailable" }
|
|
69
|
+
: { kind: "error", message: "retrieval failed" },
|
|
70
|
+
);
|
|
71
|
+
});
|
|
72
|
+
return () => {
|
|
73
|
+
controller.abort();
|
|
74
|
+
if (objectUrl) URL.revokeObjectURL(objectUrl);
|
|
75
|
+
};
|
|
76
|
+
}, [stableArtifact, load, retrievalAttempt]);
|
|
77
|
+
return { ...state, retry };
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function retainedArtifactValue(artifact: RetainedArtifactReference): string {
|
|
81
|
+
return [
|
|
82
|
+
artifact.artifactId,
|
|
83
|
+
artifact.kind,
|
|
84
|
+
artifact.contentType,
|
|
85
|
+
artifact.originalBytes,
|
|
86
|
+
artifact.sha256,
|
|
87
|
+
artifact.retainedAt,
|
|
88
|
+
artifact.dimensions?.width ?? "",
|
|
89
|
+
artifact.dimensions?.height ?? "",
|
|
90
|
+
artifact.retention.policy,
|
|
91
|
+
artifact.retention.expiresAt ?? "",
|
|
92
|
+
artifact.retrieval.method,
|
|
93
|
+
artifact.retrieval.path,
|
|
94
|
+
artifact.retrieval.acceptRanges,
|
|
95
|
+
artifact.retrieval.maxRangeBytes,
|
|
96
|
+
].join("\0");
|
|
97
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { renderActivity } from "./activity-rail";
|
|
2
|
+
import { AnimatePresence, motion, useReducedMotion } from "motion/react";
|
|
3
|
+
import { WrenchIcon } from "lucide-react";
|
|
4
|
+
import { Suspense, useEffect, useState } from "react";
|
|
5
|
+
import { CompactActivityContext } from "./shared";
|
|
6
|
+
import { defaultToolRegistry } from "./tool-renderers";
|
|
7
|
+
import type { ToolRegistry } from "./registry";
|
|
8
|
+
import { toolDisplayName } from "./tool-display-name";
|
|
9
|
+
import type { ActivityItem } from "./types";
|
|
10
|
+
|
|
11
|
+
/** One stable viewport; updates replace its content without moving the conversation. */
|
|
12
|
+
export function RollingActivity({
|
|
13
|
+
items,
|
|
14
|
+
toolRegistry = defaultToolRegistry,
|
|
15
|
+
previousItem,
|
|
16
|
+
showCount = true,
|
|
17
|
+
}: {
|
|
18
|
+
items: ActivityItem[];
|
|
19
|
+
/** The standalone item visible immediately before this reel mounted. */
|
|
20
|
+
previousItem?: ActivityItem | undefined;
|
|
21
|
+
toolRegistry?: ToolRegistry;
|
|
22
|
+
/** Show "+N earlier"; off when an enclosing status line already counts steps. */
|
|
23
|
+
showCount?: boolean;
|
|
24
|
+
}) {
|
|
25
|
+
const reduced = useReducedMotion();
|
|
26
|
+
const [mounted, setMounted] = useState(false);
|
|
27
|
+
useEffect(() => setMounted(true), []);
|
|
28
|
+
// Progress notes have their own line in the status row; the reel shows steps.
|
|
29
|
+
const work = items.filter(
|
|
30
|
+
(item) => item.kind !== "startup-phase" && item.kind !== "agent-message",
|
|
31
|
+
);
|
|
32
|
+
const active = work.filter((item) =>
|
|
33
|
+
item.kind === "reasoning" ? item.streaming : "status" in item && item.status === "running",
|
|
34
|
+
);
|
|
35
|
+
// Advance with the event order; finishing a parallel tool must not replay an older one.
|
|
36
|
+
const item =
|
|
37
|
+
!mounted && previousItem && previousItem.kind !== "agent-message" ? previousItem : work.at(-1);
|
|
38
|
+
if (!item) return null;
|
|
39
|
+
const earlierCount = Math.max(
|
|
40
|
+
0,
|
|
41
|
+
work.findIndex((entry) => entry.id === item.id),
|
|
42
|
+
);
|
|
43
|
+
const fallback = (
|
|
44
|
+
<span className="og-rolling-label">
|
|
45
|
+
<WrenchIcon className="size-3.5" />
|
|
46
|
+
<span>
|
|
47
|
+
{item.kind === "tool-call" ? toolDisplayName(item.name, item.display) : "Working"}
|
|
48
|
+
</span>
|
|
49
|
+
</span>
|
|
50
|
+
);
|
|
51
|
+
return (
|
|
52
|
+
<span
|
|
53
|
+
className="og-rolling-status"
|
|
54
|
+
data-running={active.some((entry) => entry.id === item.id) ? "true" : undefined}
|
|
55
|
+
>
|
|
56
|
+
<span className="sr-only">
|
|
57
|
+
{item.kind === "tool-call"
|
|
58
|
+
? toolDisplayName(item.name, item.display)
|
|
59
|
+
: item.kind === "reasoning"
|
|
60
|
+
? "Thinking"
|
|
61
|
+
: "Working"}
|
|
62
|
+
</span>
|
|
63
|
+
<span className="og-rolling-window" aria-hidden="true">
|
|
64
|
+
<AnimatePresence initial={false} mode="sync">
|
|
65
|
+
<motion.span
|
|
66
|
+
key={item.id}
|
|
67
|
+
className="og-rolling-face"
|
|
68
|
+
initial={{
|
|
69
|
+
opacity: 0,
|
|
70
|
+
y: reduced ? 0 : 24,
|
|
71
|
+
}}
|
|
72
|
+
animate={{ opacity: 1, y: 0 }}
|
|
73
|
+
exit={{
|
|
74
|
+
opacity: 0,
|
|
75
|
+
y: reduced ? 0 : -24,
|
|
76
|
+
}}
|
|
77
|
+
transition={{ duration: reduced ? 0 : 0.4, ease: [0.22, 1, 0.36, 1] }}
|
|
78
|
+
>
|
|
79
|
+
<CompactActivityContext.Provider value={true}>
|
|
80
|
+
<Suspense fallback={fallback}>
|
|
81
|
+
{renderActivity(item, toolRegistry, undefined, undefined, undefined, undefined)}
|
|
82
|
+
</Suspense>
|
|
83
|
+
</CompactActivityContext.Provider>
|
|
84
|
+
</motion.span>
|
|
85
|
+
</AnimatePresence>
|
|
86
|
+
</span>
|
|
87
|
+
{showCount && earlierCount > 0 ? (
|
|
88
|
+
<span className="og-rolling-count">{`+${earlierCount} earlier`}</span>
|
|
89
|
+
) : null}
|
|
90
|
+
</span>
|
|
91
|
+
);
|
|
92
|
+
}
|
|
@@ -1,6 +1,14 @@
|
|
|
1
|
-
import { XIcon } from "lucide-react";
|
|
1
|
+
import { DownloadIcon, XIcon } from "lucide-react";
|
|
2
2
|
import { AnimatePresence, motion } from "motion/react";
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
createContext,
|
|
5
|
+
useCallback,
|
|
6
|
+
useContext,
|
|
7
|
+
useEffect,
|
|
8
|
+
useMemo,
|
|
9
|
+
useState,
|
|
10
|
+
type ReactNode,
|
|
11
|
+
} from "react";
|
|
4
12
|
import { Dialog } from "radix-ui";
|
|
5
13
|
import { cn } from "../lib/cn";
|
|
6
14
|
import { usePortalTokenStyle } from "../lib/use-portal-token-style";
|
|
@@ -19,7 +27,20 @@ import { usePortalTokenStyle } from "../lib/use-portal-token-style";
|
|
|
19
27
|
-------------------------------------------------------------------------- */
|
|
20
28
|
|
|
21
29
|
type LightboxController = {
|
|
22
|
-
open: (
|
|
30
|
+
open: (
|
|
31
|
+
src: string,
|
|
32
|
+
caption?: string,
|
|
33
|
+
source?: HTMLElement | null,
|
|
34
|
+
label?: string,
|
|
35
|
+
downloadFilename?: string,
|
|
36
|
+
controlLabels?: LightboxControlLabels,
|
|
37
|
+
releaseSource?: () => void,
|
|
38
|
+
) => void;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
export type LightboxControlLabels = {
|
|
42
|
+
download?: string | undefined;
|
|
43
|
+
close?: string | undefined;
|
|
23
44
|
};
|
|
24
45
|
|
|
25
46
|
const LightboxContext = createContext<LightboxController | null>(null);
|
|
@@ -40,6 +61,23 @@ export function useLightboxOptional(): LightboxController | null {
|
|
|
40
61
|
|
|
41
62
|
const NOOP: LightboxController = { open: () => {} };
|
|
42
63
|
|
|
64
|
+
/** @internal Owns one optional retained lightbox source and releases it exactly once. */
|
|
65
|
+
export function createLightboxSourceOwner() {
|
|
66
|
+
let releaseCurrent: (() => void) | null = null;
|
|
67
|
+
return {
|
|
68
|
+
replace(release?: (() => void) | undefined) {
|
|
69
|
+
const previous = releaseCurrent;
|
|
70
|
+
releaseCurrent = release ?? null;
|
|
71
|
+
previous?.();
|
|
72
|
+
},
|
|
73
|
+
release() {
|
|
74
|
+
const release = releaseCurrent;
|
|
75
|
+
releaseCurrent = null;
|
|
76
|
+
release?.();
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
|
|
43
81
|
/**
|
|
44
82
|
* The app-level screenshot lightbox. Render once near the timeline; renderers
|
|
45
83
|
* call `useLightbox().open(src)`.
|
|
@@ -63,22 +101,47 @@ function LightboxRoot({ children }: { children: ReactNode }) {
|
|
|
63
101
|
src: string;
|
|
64
102
|
caption?: string;
|
|
65
103
|
label: string;
|
|
104
|
+
downloadFilename?: string;
|
|
105
|
+
controlLabels?: LightboxControlLabels;
|
|
66
106
|
} | null>(null);
|
|
67
107
|
const [tokenSource, setTokenSource] = useState<HTMLElement | null>(null);
|
|
108
|
+
const sourceOwner = useMemo(() => createLightboxSourceOwner(), []);
|
|
68
109
|
const portalStyle = usePortalTokenStyle(tokenSource);
|
|
69
110
|
|
|
111
|
+
const releaseCurrentSource = useCallback(() => {
|
|
112
|
+
sourceOwner.release();
|
|
113
|
+
}, [sourceOwner]);
|
|
114
|
+
|
|
115
|
+
useEffect(() => releaseCurrentSource, [releaseCurrentSource]);
|
|
116
|
+
|
|
70
117
|
const open = useCallback(
|
|
71
|
-
(
|
|
118
|
+
(
|
|
119
|
+
src: string,
|
|
120
|
+
caption?: string,
|
|
121
|
+
source?: HTMLElement | null,
|
|
122
|
+
label = "Screenshot",
|
|
123
|
+
downloadFilename?: string,
|
|
124
|
+
controlLabels?: LightboxControlLabels,
|
|
125
|
+
releaseSource?: () => void,
|
|
126
|
+
) => {
|
|
127
|
+
sourceOwner.replace(releaseSource);
|
|
72
128
|
setTokenSource(source ?? null);
|
|
73
|
-
setState(
|
|
129
|
+
setState({
|
|
130
|
+
src,
|
|
131
|
+
label,
|
|
132
|
+
...(caption ? { caption } : {}),
|
|
133
|
+
...(downloadFilename ? { downloadFilename } : {}),
|
|
134
|
+
...(controlLabels ? { controlLabels } : {}),
|
|
135
|
+
});
|
|
74
136
|
},
|
|
75
|
-
[],
|
|
137
|
+
[sourceOwner],
|
|
76
138
|
);
|
|
77
139
|
|
|
78
140
|
const close = useCallback(() => {
|
|
141
|
+
releaseCurrentSource();
|
|
79
142
|
setState(null);
|
|
80
143
|
setTokenSource(null);
|
|
81
|
-
}, []);
|
|
144
|
+
}, [releaseCurrentSource]);
|
|
82
145
|
|
|
83
146
|
const controller = useMemo<LightboxController>(() => ({ open }), [open]);
|
|
84
147
|
|
|
@@ -141,16 +204,11 @@ function LightboxRoot({ children }: { children: ReactNode }) {
|
|
|
141
204
|
alt={state.caption ?? state.label}
|
|
142
205
|
className="min-h-0 max-h-[82vh] w-auto max-w-full rounded-og-md border border-white/10 object-contain shadow-og-lg"
|
|
143
206
|
/>
|
|
144
|
-
<
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
)}
|
|
150
|
-
aria-label="Close"
|
|
151
|
-
>
|
|
152
|
-
<XIcon className="size-4" />
|
|
153
|
-
</Dialog.Close>
|
|
207
|
+
<ScreenshotLightboxControls
|
|
208
|
+
src={state.src}
|
|
209
|
+
downloadFilename={state.downloadFilename}
|
|
210
|
+
controlLabels={state.controlLabels}
|
|
211
|
+
/>
|
|
154
212
|
</div>
|
|
155
213
|
{state.caption ? (
|
|
156
214
|
<figcaption className="max-w-2xl text-center font-og-mono text-og-xs text-white/55">
|
|
@@ -171,3 +229,43 @@ function LightboxRoot({ children }: { children: ReactNode }) {
|
|
|
171
229
|
</LightboxContext.Provider>
|
|
172
230
|
);
|
|
173
231
|
}
|
|
232
|
+
|
|
233
|
+
/** @internal Exact controls rendered by an open screenshot lightbox. */
|
|
234
|
+
export function ScreenshotLightboxControls({
|
|
235
|
+
src,
|
|
236
|
+
downloadFilename,
|
|
237
|
+
controlLabels,
|
|
238
|
+
}: {
|
|
239
|
+
src: string;
|
|
240
|
+
downloadFilename?: string | undefined;
|
|
241
|
+
controlLabels?: LightboxControlLabels | undefined;
|
|
242
|
+
}) {
|
|
243
|
+
return (
|
|
244
|
+
<div className="absolute -right-3 -top-3 flex items-center gap-2">
|
|
245
|
+
{downloadFilename ? (
|
|
246
|
+
<a
|
|
247
|
+
href={src}
|
|
248
|
+
download={downloadFilename}
|
|
249
|
+
className={cn(
|
|
250
|
+
"inline-flex size-9 items-center justify-center rounded-full",
|
|
251
|
+
"border border-white/15 bg-black/60 text-white/70 backdrop-blur",
|
|
252
|
+
"transition-colors hover:border-white/30 hover:text-white",
|
|
253
|
+
)}
|
|
254
|
+
aria-label={controlLabels?.download ?? `Download ${downloadFilename}`}
|
|
255
|
+
>
|
|
256
|
+
<DownloadIcon className="size-4" />
|
|
257
|
+
</a>
|
|
258
|
+
) : null}
|
|
259
|
+
<Dialog.Close
|
|
260
|
+
className={cn(
|
|
261
|
+
"inline-flex size-9 items-center justify-center rounded-full",
|
|
262
|
+
"border border-white/15 bg-black/60 text-white/70 backdrop-blur",
|
|
263
|
+
"transition-colors hover:border-white/30 hover:text-white",
|
|
264
|
+
)}
|
|
265
|
+
aria-label={controlLabels?.close ?? "Close"}
|
|
266
|
+
>
|
|
267
|
+
<XIcon className="size-4" />
|
|
268
|
+
</Dialog.Close>
|
|
269
|
+
</div>
|
|
270
|
+
);
|
|
271
|
+
}
|
package/src/timeline/shared.tsx
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { CameraIcon, CameraOffIcon, ChevronRightIcon } from "lucide-react";
|
|
2
|
-
import { createContext, useContext, useState, type ReactNode } from "react";
|
|
2
|
+
import { createContext, useContext, useEffect, useState, type ReactNode } from "react";
|
|
3
|
+
import { useTimelineSearchReveal } from "../components/timeline-search";
|
|
3
4
|
import { cn } from "../lib/cn";
|
|
4
5
|
import { stringifyPayload } from "../lib/format";
|
|
5
6
|
import { useForcedDefaultOpen } from "./disclosure-context";
|
|
@@ -55,6 +56,8 @@ export function ToolCallTruncationProvider({
|
|
|
55
56
|
}
|
|
56
57
|
|
|
57
58
|
export type ActivityDisclosureProps = {
|
|
59
|
+
/** Override the rolling preview; null keeps rapidly streaming details out of the header. */
|
|
60
|
+
compactPreview?: ReactNode;
|
|
58
61
|
icon: ReactNode;
|
|
59
62
|
/** Icon tint. Defaults to the muted foreground; renderers pass accent/failed. */
|
|
60
63
|
iconTone?: "accent" | "failed" | "running" | "muted" | undefined;
|
|
@@ -116,6 +119,8 @@ const ICON_TONE: Record<NonNullable<ActivityDisclosureProps["iconTone"]>, string
|
|
|
116
119
|
* inline media, and at most one right-gutter settle chip. Compact by default;
|
|
117
120
|
* the body mounts only when expanded.
|
|
118
121
|
*/
|
|
122
|
+
export const CompactActivityContext = createContext(false);
|
|
123
|
+
|
|
119
124
|
export function ActivityDisclosure({
|
|
120
125
|
icon,
|
|
121
126
|
iconTone: iconToneProp = "muted",
|
|
@@ -123,6 +128,7 @@ export function ActivityDisclosure({
|
|
|
123
128
|
titleMono,
|
|
124
129
|
running,
|
|
125
130
|
preview,
|
|
131
|
+
compactPreview,
|
|
126
132
|
media,
|
|
127
133
|
chip: chipProp,
|
|
128
134
|
failed,
|
|
@@ -149,7 +155,26 @@ export function ActivityDisclosure({
|
|
|
149
155
|
// absent in normal app usage, where the row starts collapsed.
|
|
150
156
|
const forcedDefaultOpen = useForcedDefaultOpen();
|
|
151
157
|
const [open, setOpen] = useState(defaultOpen ?? forcedDefaultOpen ?? false);
|
|
158
|
+
const searchReveal = useTimelineSearchReveal();
|
|
159
|
+
useEffect(() => {
|
|
160
|
+
if (searchReveal) setOpen(true);
|
|
161
|
+
}, [searchReveal]);
|
|
152
162
|
const truncation = useContext(ToolCallTruncationContext);
|
|
163
|
+
const compact = useContext(CompactActivityContext);
|
|
164
|
+
if (compact)
|
|
165
|
+
return (
|
|
166
|
+
<span className="og-rolling-label">
|
|
167
|
+
<span className={cn("shrink-0", ICON_TONE[iconTone])}>{icon}</span>
|
|
168
|
+
<span className="og-command-reel">
|
|
169
|
+
<span className="og-reel-title">{title}</span>
|
|
170
|
+
{(compactPreview === undefined ? preview : compactPreview) ? (
|
|
171
|
+
<span className="og-reel-preview text-og-fg-subtle">
|
|
172
|
+
{compactPreview === undefined ? preview : compactPreview}
|
|
173
|
+
</span>
|
|
174
|
+
) : null}
|
|
175
|
+
</span>
|
|
176
|
+
</span>
|
|
177
|
+
);
|
|
153
178
|
const hasBody = expandable && (children != null || truncation != null);
|
|
154
179
|
|
|
155
180
|
// The preview is detail-on-demand: it is suppressed once the row is open so a
|
|
@@ -189,20 +214,21 @@ export function ActivityDisclosure({
|
|
|
189
214
|
<span className="size-3.5 shrink-0" />
|
|
190
215
|
)}
|
|
191
216
|
<span className={cn("shrink-0", ICON_TONE[iconTone])}>{icon}</span>
|
|
192
|
-
<span
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
217
|
+
<span className={cn("og-command-reel", running && "og-command-reel-running")}>
|
|
218
|
+
<span
|
|
219
|
+
className={cn(
|
|
220
|
+
"min-w-0 shrink truncate text-og-base font-medium",
|
|
221
|
+
titleMono && "font-og-mono text-og-sm font-normal",
|
|
222
|
+
)}
|
|
223
|
+
>
|
|
224
|
+
{title}
|
|
225
|
+
</span>
|
|
226
|
+
{previewVisible && !media ? (
|
|
227
|
+
<span className="min-w-0 flex-1 truncate text-og-sm text-og-fg-subtle">{preview}</span>
|
|
228
|
+
) : (
|
|
229
|
+
<span className="flex-1" />
|
|
197
230
|
)}
|
|
198
|
-
>
|
|
199
|
-
{title}
|
|
200
231
|
</span>
|
|
201
|
-
{previewVisible && !media ? (
|
|
202
|
-
<span className="min-w-0 flex-1 truncate text-og-sm text-og-fg-subtle">{preview}</span>
|
|
203
|
-
) : (
|
|
204
|
-
<span className="flex-1" />
|
|
205
|
-
)}
|
|
206
232
|
{/* The right gutter carries at most ONE signal: the media thumbnail, else a
|
|
207
233
|
terse settle chip (hidden once expanded — the body owns the detail). */}
|
|
208
234
|
{media && !open ? (
|
|
@@ -509,12 +535,14 @@ export function Thumbnail({
|
|
|
509
535
|
alt = "screenshot",
|
|
510
536
|
expandLabel = "Expand screenshot",
|
|
511
537
|
lightboxLabel = "Screenshot",
|
|
538
|
+
downloadFilename,
|
|
512
539
|
}: {
|
|
513
540
|
src: string;
|
|
514
541
|
caption?: string | undefined;
|
|
515
542
|
alt?: string;
|
|
516
543
|
expandLabel?: string | undefined;
|
|
517
544
|
lightboxLabel?: string | undefined;
|
|
545
|
+
downloadFilename?: string | undefined;
|
|
518
546
|
}) {
|
|
519
547
|
const lightbox = useLightboxOptional();
|
|
520
548
|
const [failed, setFailed] = useState(false);
|
|
@@ -542,7 +570,7 @@ export function Thumbnail({
|
|
|
542
570
|
type="button"
|
|
543
571
|
onClick={(event) => {
|
|
544
572
|
event.stopPropagation();
|
|
545
|
-
lightbox.open(src, caption, event.currentTarget, lightboxLabel);
|
|
573
|
+
lightbox.open(src, caption, event.currentTarget, lightboxLabel, downloadFilename);
|
|
546
574
|
}}
|
|
547
575
|
onKeyDown={(event) => {
|
|
548
576
|
if (event.key === "Enter" || event.key === " ") {
|
|
@@ -573,12 +601,14 @@ export function ScreenshotFigure({
|
|
|
573
601
|
alt = "screenshot",
|
|
574
602
|
expandLabel = "Expand screenshot",
|
|
575
603
|
lightboxLabel = "Screenshot",
|
|
604
|
+
downloadFilename,
|
|
576
605
|
}: {
|
|
577
606
|
src: string;
|
|
578
607
|
caption?: string | undefined;
|
|
579
608
|
alt?: string;
|
|
580
609
|
expandLabel?: string | undefined;
|
|
581
610
|
lightboxLabel?: string | undefined;
|
|
611
|
+
downloadFilename?: string | undefined;
|
|
582
612
|
}) {
|
|
583
613
|
const lightbox = useLightboxOptional();
|
|
584
614
|
const [failed, setFailed] = useState(false);
|
|
@@ -602,7 +632,9 @@ export function ScreenshotFigure({
|
|
|
602
632
|
) : lightbox ? (
|
|
603
633
|
<button
|
|
604
634
|
type="button"
|
|
605
|
-
onClick={(event) =>
|
|
635
|
+
onClick={(event) =>
|
|
636
|
+
lightbox.open(src, caption, event.currentTarget, lightboxLabel, downloadFilename)
|
|
637
|
+
}
|
|
606
638
|
className={surface}
|
|
607
639
|
aria-label={expandLabel}
|
|
608
640
|
>
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { useSyncExternalStore } from "react";
|
|
2
|
+
|
|
3
|
+
const KEY = "opengeni:startup-details:v1";
|
|
4
|
+
const EVENT = "opengeni:startup-details-changed";
|
|
5
|
+
let fallback = false;
|
|
6
|
+
function snapshot() {
|
|
7
|
+
try {
|
|
8
|
+
return window.localStorage.getItem(KEY) === "true";
|
|
9
|
+
} catch {
|
|
10
|
+
return fallback;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
function subscribe(listener: () => void) {
|
|
14
|
+
window.addEventListener(EVENT, listener);
|
|
15
|
+
window.addEventListener("storage", listener);
|
|
16
|
+
return () => {
|
|
17
|
+
window.removeEventListener(EVENT, listener);
|
|
18
|
+
window.removeEventListener("storage", listener);
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export function setStartupDetails(value: boolean) {
|
|
22
|
+
fallback = value;
|
|
23
|
+
try {
|
|
24
|
+
window.localStorage.setItem(KEY, String(value));
|
|
25
|
+
} catch {
|
|
26
|
+
/* Private storage is optional. */
|
|
27
|
+
}
|
|
28
|
+
window.dispatchEvent(new Event(EVENT));
|
|
29
|
+
}
|
|
30
|
+
/** Presentation preference only. Startup evidence is always retained. */
|
|
31
|
+
export function useStartupDetails() {
|
|
32
|
+
return useSyncExternalStore(subscribe, snapshot, () => false);
|
|
33
|
+
}
|