@opengeni/react 1.0.1 → 1.0.2-canary.37191796234001
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +651 -21
- package/dist/accounts.d.ts +64 -0
- package/dist/accounts.js +822 -0
- package/dist/accounts.js.map +1 -0
- package/dist/approvals.d.ts +2 -1
- package/dist/artifacts-document.js +3 -2
- package/dist/artifacts-presentation.js +3 -2
- package/dist/artifacts-spreadsheet.js +2 -2
- package/dist/artifacts.d.ts +4 -1
- package/dist/artifacts.js +518 -42
- package/dist/artifacts.js.map +1 -1
- package/dist/browser-viewer-GTR5XQ7X.js +16 -0
- package/dist/capability-catalog-row.d.ts +20 -0
- package/dist/capability-logo-fallback.d.ts +3 -0
- package/dist/chat-interactive-block-UGBTNB3L.js +11 -0
- package/dist/chat-interactive-block-UGBTNB3L.js.map +1 -0
- package/dist/{chunk-5UQPNLIO.js → chunk-23J2ZNXT.js} +4117 -3896
- package/dist/chunk-23J2ZNXT.js.map +1 -0
- package/dist/chunk-447JLCBU.js +209 -0
- package/dist/chunk-447JLCBU.js.map +1 -0
- package/dist/chunk-4RVYOY4O.js +379 -0
- package/dist/chunk-4RVYOY4O.js.map +1 -0
- package/dist/chunk-5CVXZA3Y.js +292 -0
- package/dist/chunk-5CVXZA3Y.js.map +1 -0
- package/dist/chunk-5J4FOW6Q.js +108 -0
- package/dist/chunk-5J4FOW6Q.js.map +1 -0
- package/dist/chunk-A2PI6UMY.js +41 -0
- package/dist/chunk-A2PI6UMY.js.map +1 -0
- package/dist/{chunk-7WCLAEFV.js → chunk-A4UJB2MM.js} +37 -27
- package/dist/chunk-A4UJB2MM.js.map +1 -0
- package/dist/chunk-B3V6TG77.js +41 -0
- package/dist/chunk-B3V6TG77.js.map +1 -0
- package/dist/chunk-BRM6FVZA.js +302 -0
- package/dist/chunk-BRM6FVZA.js.map +1 -0
- package/dist/chunk-C5X5AJXK.js +182 -0
- package/dist/chunk-C5X5AJXK.js.map +1 -0
- package/dist/chunk-CR7U7HAR.js +453 -0
- package/dist/chunk-CR7U7HAR.js.map +1 -0
- package/dist/{chunk-R3AZOAB5.js → chunk-DYWBUX5Q.js} +29 -123
- package/dist/chunk-DYWBUX5Q.js.map +1 -0
- package/dist/chunk-E3G7SAYZ.js +3124 -0
- package/dist/chunk-E3G7SAYZ.js.map +1 -0
- package/dist/chunk-ELCE5SXV.js +359 -0
- package/dist/chunk-ELCE5SXV.js.map +1 -0
- package/dist/chunk-ERGYJIBB.js +21 -0
- package/dist/chunk-ERGYJIBB.js.map +1 -0
- package/dist/chunk-FFA2OVOV.js +319 -0
- package/dist/chunk-FFA2OVOV.js.map +1 -0
- package/dist/chunk-FZCP527Y.js +116 -0
- package/dist/chunk-FZCP527Y.js.map +1 -0
- package/dist/chunk-GIMRELBW.js +14 -0
- package/dist/chunk-GIMRELBW.js.map +1 -0
- package/dist/{chunk-6KLX2RH5.js → chunk-H2NJQORO.js} +1069 -79
- package/dist/chunk-H2NJQORO.js.map +1 -0
- package/dist/chunk-I7IWRQLN.js +1608 -0
- package/dist/chunk-I7IWRQLN.js.map +1 -0
- package/dist/{chunk-HA46CYQK.js → chunk-IQUCRAT7.js} +792 -537
- package/dist/chunk-IQUCRAT7.js.map +1 -0
- package/dist/chunk-IWIDV7SB.js +1 -0
- package/dist/chunk-IWIDV7SB.js.map +1 -0
- package/dist/chunk-J2QWVSQY.js +312 -0
- package/dist/chunk-J2QWVSQY.js.map +1 -0
- package/dist/chunk-JFNEV4LU.js +2733 -0
- package/dist/chunk-JFNEV4LU.js.map +1 -0
- package/dist/chunk-JT4JW7BC.js +54 -0
- package/dist/chunk-JT4JW7BC.js.map +1 -0
- package/dist/chunk-K3HQAKQX.js +24 -0
- package/dist/chunk-K3HQAKQX.js.map +1 -0
- package/dist/{chunk-C5ZPSSS5.js → chunk-NEXLLTP4.js} +2 -1
- package/dist/{chunk-C5ZPSSS5.js.map → chunk-NEXLLTP4.js.map} +1 -1
- package/dist/chunk-NZUI76EM.js +371 -0
- package/dist/chunk-NZUI76EM.js.map +1 -0
- package/dist/{chunk-PEI6RANI.js → chunk-PNY3JKBJ.js} +309 -74
- package/dist/chunk-PNY3JKBJ.js.map +1 -0
- package/dist/{chunk-IGC6A2ZI.js → chunk-Q5QBEZIQ.js} +777 -246
- package/dist/chunk-Q5QBEZIQ.js.map +1 -0
- package/dist/chunk-RHREZ7BO.js +11 -0
- package/dist/chunk-RHREZ7BO.js.map +1 -0
- package/dist/chunk-SCOTPE2I.js +589 -0
- package/dist/chunk-SCOTPE2I.js.map +1 -0
- package/dist/{chunk-B6WPZSTT.js → chunk-SJZDKVW2.js} +1331 -1163
- package/dist/chunk-SJZDKVW2.js.map +1 -0
- package/dist/chunk-TMJRG4YC.js +12803 -0
- package/dist/chunk-TMJRG4YC.js.map +1 -0
- package/dist/chunk-TMYGL6X5.js +742 -0
- package/dist/chunk-TMYGL6X5.js.map +1 -0
- package/dist/chunk-UGLEYEMP.js +33 -0
- package/dist/chunk-UGLEYEMP.js.map +1 -0
- package/dist/chunk-UK4TINKT.js +27 -0
- package/dist/chunk-UK4TINKT.js.map +1 -0
- package/dist/chunk-UTRTG6LH.js +220 -0
- package/dist/chunk-UTRTG6LH.js.map +1 -0
- package/dist/chunk-WEHMPOXK.js +39 -0
- package/dist/chunk-WEHMPOXK.js.map +1 -0
- package/dist/chunk-WRHIZYZF.js +988 -0
- package/dist/chunk-WRHIZYZF.js.map +1 -0
- package/dist/{chunk-HUIKIDM5.js → chunk-WUISZ3WU.js} +223 -115
- package/dist/chunk-WUISZ3WU.js.map +1 -0
- package/dist/chunk-XCHWDJ22.js +107 -0
- package/dist/chunk-XCHWDJ22.js.map +1 -0
- package/dist/chunk-XOAMRDDK.js +481 -0
- package/dist/chunk-XOAMRDDK.js.map +1 -0
- package/dist/chunk-XUW2UWQM.js +299 -0
- package/dist/chunk-XUW2UWQM.js.map +1 -0
- package/dist/{chunk-KCGXPP5V.js → chunk-Y2PRMYLC.js} +11 -6
- package/dist/chunk-Y2PRMYLC.js.map +1 -0
- package/dist/chunk-YBXQDQFX.js +1772 -0
- package/dist/chunk-YBXQDQFX.js.map +1 -0
- package/dist/{chunk-KZ73RL76.js → chunk-YQEAA6LT.js} +7 -3
- package/dist/chunk-YQEAA6LT.js.map +1 -0
- package/dist/chunk-YV4L3ILF.js +9 -0
- package/dist/chunk-YV4L3ILF.js.map +1 -0
- package/dist/{chunk-LLOLUHVG.js → chunk-YWFG7ZX7.js} +1358 -2746
- package/dist/chunk-YWFG7ZX7.js.map +1 -0
- package/dist/chunk-ZYRGEKWS.js +216 -0
- package/dist/chunk-ZYRGEKWS.js.map +1 -0
- package/dist/client.d.ts +7 -4
- package/dist/clipboard.js +1 -0
- package/dist/commands/types.d.ts +2 -0
- package/dist/components/anthropic-mark.d.ts +3 -0
- package/dist/components/approval-surface.d.ts +15 -0
- package/dist/components/artifacts/artifact-chrome.d.ts +120 -0
- package/dist/components/artifacts/artifact-sandbox.d.ts +27 -0
- package/dist/components/artifacts/artifact-surface.d.ts +3 -1
- package/dist/components/artifacts/chat-interactive-block.d.ts +29 -0
- package/dist/components/artifacts/deferred-chat-media.d.ts +15 -0
- package/dist/components/artifacts/document-editor.d.ts +4 -2
- package/dist/components/artifacts/editable-artifact-ui.d.ts +2 -1
- package/dist/components/artifacts/editable-artifact-view.d.ts +46 -0
- package/dist/components/artifacts/editable-document.d.ts +1 -1
- package/dist/components/artifacts/editable-presentation.d.ts +2 -2
- package/dist/components/artifacts/editable-spreadsheet.d.ts +2 -1
- package/dist/components/artifacts/index.d.ts +8 -1
- package/dist/components/artifacts/inline-html-document.d.ts +2 -0
- package/dist/components/artifacts/latest-task-runner.d.ts +15 -0
- package/dist/components/artifacts/presentation-editor.d.ts +6 -2
- package/dist/components/artifacts/published-html-artifact-frame.d.ts +48 -3
- package/dist/components/artifacts/session-artifact-viewer.d.ts +39 -0
- package/dist/components/artifacts/site-view.d.ts +23 -0
- package/dist/components/artifacts/spreadsheet-general-display.d.ts +24 -0
- package/dist/components/artifacts/visualization-assets.gen.d.ts +2 -0
- package/dist/components/browser-select-control.d.ts +16 -0
- package/dist/components/browser-viewer.d.ts +10 -1
- package/dist/components/chat-composer.d.ts +21 -3
- package/dist/components/child-session-link.d.ts +5 -0
- package/dist/components/claude-mark.d.ts +3 -0
- package/dist/components/code-editor.d.ts +1 -4
- package/dist/components/composer.d.ts +45 -4
- package/dist/components/computer-viewer.d.ts +4 -1
- package/dist/components/copy-button.d.ts +3 -1
- package/dist/components/desktop-viewer.d.ts +1 -1
- package/dist/components/enrollment-consent.d.ts +6 -3
- package/dist/components/file-browser.d.ts +10 -1
- package/dist/components/fleet-tile.d.ts +2 -2
- package/dist/components/grok-mark.d.ts +26 -0
- package/dist/components/human-input-form.d.ts +21 -2
- package/dist/components/human-input-surface.d.ts +6 -3
- package/dist/components/machine-card.d.ts +4 -1
- package/dist/components/machines/machine-detail.d.ts +4 -1
- package/dist/components/machines/machine-operation-policy.d.ts +11 -0
- package/dist/components/machines-dashboard.d.ts +3 -1
- package/dist/components/markdown-table-layout.d.ts +12 -0
- package/dist/components/markdown.d.ts +47 -3
- package/dist/components/message-timeline.d.ts +72 -9
- package/dist/components/model-mark.d.ts +29 -0
- package/dist/components/model-policy-picker-menu.d.ts +9 -0
- package/dist/components/model-policy-picker.d.ts +62 -13
- package/dist/components/open-geni-chat.d.ts +55 -0
- package/dist/components/open-geni-links.d.ts +68 -0
- package/dist/components/openrouter-mark.d.ts +6 -0
- package/dist/components/pierre-file.d.ts +1 -1
- package/dist/components/preview-loading.d.ts +2 -0
- package/dist/components/queue-item-content.d.ts +9 -0
- package/dist/components/sandbox-files.d.ts +13 -2
- package/dist/components/sandbox-workspace.d.ts +43 -3
- package/dist/components/session-capability-frame.d.ts +35 -0
- package/dist/components/session-chrome.d.ts +66 -8
- package/dist/components/session-commands-panel.d.ts +6 -0
- package/dist/components/session-commands.d.ts +6 -0
- package/dist/components/session-connection-request.d.ts +8 -0
- package/dist/components/session-conversation.d.ts +86 -0
- package/dist/components/session-list.d.ts +36 -0
- package/dist/components/session-mcp-capability-card.d.ts +41 -0
- package/dist/components/timeline-anchor.d.ts +24 -0
- package/dist/components/timeline-annotation-chrome.d.ts +25 -0
- package/dist/components/timeline-annotation-layout.d.ts +42 -0
- package/dist/components/timeline-annotation-markers.d.ts +8 -0
- package/dist/components/timeline-annotation-reveal-context.d.ts +4 -0
- package/dist/components/timeline-annotation-shared.d.ts +31 -0
- package/dist/components/timeline-annotations-dialog.d.ts +3 -2
- package/dist/components/timeline-annotations.d.ts +13 -3
- package/dist/components/timeline-reading-progress.d.ts +11 -0
- package/dist/components/timeline-search.d.ts +34 -0
- package/dist/components/timeline-settlement.d.ts +16 -0
- package/dist/components/tip-follow.d.ts +16 -0
- package/dist/components/usage-limit-notice.d.ts +49 -0
- package/dist/components/usage-member-list.d.ts +91 -0
- package/dist/components/usage-meter.d.ts +73 -0
- package/dist/components/use-viewer-menu-dismiss.d.ts +2 -0
- package/dist/components/user-message-body.d.ts +10 -1
- package/dist/components/workspace-dock.d.ts +6 -2
- package/dist/composer.d.ts +5 -4
- package/dist/composer.js +15 -9
- package/dist/computer-viewer-ENHVAZ2Q.js +19 -0
- package/dist/computer-viewer-ENHVAZ2Q.js.map +1 -0
- package/dist/connect-account-identity.d.ts +8 -0
- package/dist/connect-accounts.d.ts +15 -0
- package/dist/connect-chooser.d.ts +18 -0
- package/dist/connect-panel.d.ts +18 -0
- package/dist/connect-setup.d.ts +16 -0
- package/dist/connect.d.ts +21 -0
- package/dist/connect.js +2129 -0
- package/dist/connect.js.map +1 -0
- package/dist/connection-catalog.d.ts +38 -0
- package/dist/connection-discovery.d.ts +12 -0
- package/dist/connection-installed.d.ts +17 -0
- package/dist/connection-logo.d.ts +9 -0
- package/dist/connection-service-logo.d.ts +8 -0
- package/dist/connection-service-presentation.d.ts +13 -0
- package/dist/connection-skeleton.d.ts +5 -0
- package/dist/connection-type-picker.d.ts +6 -0
- package/dist/conversation-timeline.d.ts +5 -0
- package/dist/desktop.d.ts +7 -0
- package/dist/desktop.js +26 -0
- package/dist/desktop.js.map +1 -0
- package/dist/device-authorization.d.ts +23 -0
- package/dist/diffs.d.ts +8 -0
- package/dist/diffs.js +14 -0
- package/dist/diffs.js.map +1 -0
- package/dist/discovery-cache.d.ts +5 -0
- package/dist/editor.d.ts +7 -0
- package/dist/editor.js +21 -0
- package/dist/editor.js.map +1 -0
- package/dist/embedded-session-client.d.ts +23 -0
- package/dist/file-node-visibility.d.ts +15 -0
- package/dist/{fleet-decision-row-GGCAT4E4.js → fleet-decision-row-YZ3ZKWMM.js} +2 -1
- package/dist/fleet-decision-row-YZ3ZKWMM.js.map +1 -0
- package/dist/hooks/channel-cache.d.ts +23 -0
- package/dist/hooks/latest-question.d.ts +25 -0
- package/dist/hooks/shared-machines-list.d.ts +14 -0
- package/dist/hooks/use-attached-browsers.d.ts +2 -1
- package/dist/hooks/use-browser-frame-stream.d.ts +1 -1
- package/dist/hooks/use-browser-session.d.ts +12 -1
- package/dist/hooks/use-channels.d.ts +1 -0
- package/dist/hooks/use-codex-accounts.d.ts +25 -7
- package/dist/hooks/use-composer.d.ts +45 -9
- package/dist/hooks/use-computer-frame-stream.d.ts +1 -1
- package/dist/hooks/use-computer-input-posture.d.ts +13 -0
- package/dist/hooks/use-computer-session.d.ts +2 -0
- package/dist/hooks/use-connect.d.ts +22 -0
- package/dist/hooks/use-desktop-stream.d.ts +1 -1
- package/dist/hooks/use-file-attachments.d.ts +21 -2
- package/dist/hooks/use-machine-chip.d.ts +3 -3
- package/dist/hooks/use-machines.d.ts +19 -1
- package/dist/hooks/use-sandbox-files.d.ts +5 -1
- package/dist/hooks/use-session-background-commands.d.ts +14 -0
- package/dist/hooks/use-session-events.d.ts +30 -8
- package/dist/hooks/use-session-lineage.d.ts +4 -0
- package/dist/hooks/use-session-mcp-approval-policy.d.ts +2 -2
- package/dist/hooks/use-session.d.ts +6 -0
- package/dist/hooks/use-turn-queue.d.ts +12 -0
- package/dist/hooks/use-usage.d.ts +40 -0
- package/dist/hooks/use-workspace-edit.d.ts +4 -0
- package/dist/hooks/use-workspace-sessions.d.ts +27 -5
- package/dist/human-input.d.ts +3 -1
- package/dist/identity-link-accounts.d.ts +11 -0
- package/dist/identity-link-consent.d.ts +18 -0
- package/dist/index.d.ts +60 -17
- package/dist/index.js +2237 -6200
- package/dist/index.js.map +1 -1
- package/dist/interaction.d.ts +1 -1
- package/dist/interaction.js +35 -184
- package/dist/interaction.js.map +1 -1
- package/dist/latest-question-755OW5DS.js +117 -0
- package/dist/latest-question-755OW5DS.js.map +1 -0
- package/dist/lib/error-message.d.ts +7 -0
- package/dist/lib/format.d.ts +36 -2
- package/dist/lib/host-theme.d.ts +70 -0
- package/dist/lib/interaction-errors.d.ts +6 -0
- package/dist/lib/menu-styles.d.ts +22 -0
- package/dist/lib/pierre-diffs-loader.d.ts +20 -0
- package/dist/lib/workbench-peers.d.ts +36 -0
- package/dist/lib/xterm-theme.d.ts +7 -5
- package/dist/machines.d.ts +4 -2
- package/dist/machines.js +14 -4
- package/dist/markdown-table-layout-QXSLK4BY.js +106 -0
- package/dist/markdown-table-layout-QXSLK4BY.js.map +1 -0
- package/dist/mcp-connection-status.d.ts +14 -0
- package/dist/model-policy-picker-menu-PWRI7R2X.js +14 -0
- package/dist/model-policy-picker-menu-PWRI7R2X.js.map +1 -0
- package/dist/model-policy.d.ts +19 -3
- package/dist/model-policy.js +9 -1
- package/dist/older-history.d.ts +30 -0
- package/dist/platform-activity-row-627BFZ46.js +182 -0
- package/dist/platform-activity-row-627BFZ46.js.map +1 -0
- package/dist/plugin-details.d.ts +14 -0
- package/dist/plugin-discovery.d.ts +25 -0
- package/dist/provider.d.ts +13 -1
- package/dist/{queue-surface-implementation-2KVJTYXH.js → queue-surface-implementation-ZHFI5JBP.js} +131 -44
- package/dist/queue-surface-implementation-ZHFI5JBP.js.map +1 -0
- package/dist/realtime/realtime-control.d.ts +6 -3
- package/dist/realtime.js +133 -74
- package/dist/realtime.js.map +1 -1
- package/dist/sandbox-files-BBC47SLD.js +20 -0
- package/dist/sandbox-files-BBC47SLD.js.map +1 -0
- package/dist/session-auth-recommendation.d.ts +5 -0
- package/dist/session-capability-policy.d.ts +12 -0
- package/dist/session-ui.d.ts +30 -2
- package/dist/session-ui.js +85 -7
- package/dist/session-ui.js.map +1 -1
- package/dist/session.d.ts +8 -2
- package/dist/session.js +30 -19
- package/dist/sites-ui.d.ts +34 -0
- package/dist/sites.d.ts +3 -0
- package/dist/sites.js +11 -0
- package/dist/sites.js.map +1 -0
- package/dist/skill-discovery.d.ts +47 -0
- package/dist/terminal.d.ts +8 -0
- package/dist/terminal.js +31 -0
- package/dist/terminal.js.map +1 -0
- package/dist/timeline/activity-rail.d.ts +11 -2
- package/dist/timeline/allowance-exhausted-row.d.ts +24 -0
- package/dist/timeline/compaction-copy.d.ts +10 -0
- package/dist/timeline/entrance.d.ts +13 -1
- package/dist/timeline/genie-loading.d.ts +34 -0
- package/dist/timeline/index.d.ts +6 -2
- package/dist/timeline/knowledge-receipt.d.ts +17 -0
- package/dist/timeline/platform-activity-row.d.ts +14 -0
- package/dist/timeline/presented-image.d.ts +6 -0
- package/dist/timeline/projection.d.ts +31 -2
- package/dist/timeline/registry.d.ts +2 -0
- package/dist/timeline/retained-image.d.ts +18 -0
- package/dist/timeline/rolling-activity.d.ts +11 -0
- package/dist/timeline/screenshot-lightbox.d.ts +16 -1
- package/dist/timeline/shared.d.ts +8 -3
- package/dist/timeline/startup-preference.d.ts +3 -0
- package/dist/timeline/startup-timings.d.ts +4 -0
- package/dist/timeline/tool-display-name.d.ts +2 -1
- package/dist/timeline/turn-summary.d.ts +32 -3
- package/dist/timeline/types.d.ts +141 -7
- package/dist/timeline-annotation-markers-GNDHTGBD.js +165 -0
- package/dist/timeline-annotation-markers-GNDHTGBD.js.map +1 -0
- package/dist/timeline-annotation-selection-DMLMM2TX.js +241 -0
- package/dist/timeline-annotation-selection-DMLMM2TX.js.map +1 -0
- package/dist/timeline-annotations-dialog-ELRDBHTS.js +273 -0
- package/dist/timeline-annotations-dialog-ELRDBHTS.js.map +1 -0
- package/dist/types/machines.d.ts +2 -2
- package/dist/usage/allowance-copy.d.ts +25 -0
- package/dist/usage/summary.d.ts +35 -0
- package/dist/usage.d.ts +13 -0
- package/dist/usage.js +1074 -0
- package/dist/usage.js.map +1 -0
- package/package.json +44 -4
- package/src/accounts.tsx +1072 -0
- package/src/approvals.ts +8 -1
- package/src/artifacts.ts +42 -0
- package/src/assets/README.md +8 -0
- package/src/assets/gmail.ico +0 -0
- package/src/assets/outlook.ico +0 -0
- package/src/capability-catalog-row.tsx +94 -0
- package/src/capability-logo-fallback.ts +22 -0
- package/src/client.ts +22 -13
- package/src/commands/registry.ts +18 -15
- package/src/commands/types.ts +2 -0
- package/src/components/anthropic-mark.tsx +10 -0
- package/src/components/approval-surface.tsx +171 -37
- package/src/components/artifacts/artifact-chrome.tsx +413 -0
- package/src/components/artifacts/artifact-sandbox.tsx +185 -0
- package/src/components/artifacts/artifact-surface.tsx +39 -19
- package/src/components/artifacts/chat-interactive-block.tsx +260 -0
- package/src/components/artifacts/deferred-chat-media.tsx +67 -0
- package/src/components/artifacts/document-editor.tsx +141 -16
- package/src/components/artifacts/editable-artifact-ui.tsx +4 -2
- package/src/components/artifacts/editable-artifact-view.tsx +187 -0
- package/src/components/artifacts/editable-artifact-workbench.tsx +5 -2
- package/src/components/artifacts/editable-document.tsx +37 -36
- package/src/components/artifacts/editable-presentation.tsx +36 -18
- package/src/components/artifacts/editable-spreadsheet.tsx +5 -2
- package/src/components/artifacts/index.ts +44 -0
- package/src/components/artifacts/inline-html-document.ts +24 -0
- package/src/components/artifacts/latest-task-runner.ts +49 -0
- package/src/components/artifacts/presentation-editor.tsx +323 -67
- package/src/components/artifacts/published-html-artifact-frame.tsx +338 -5
- package/src/components/artifacts/session-artifact-viewer.tsx +376 -0
- package/src/components/artifacts/site-view.tsx +116 -0
- package/src/components/artifacts/spreadsheet-canvas.ts +5 -10
- package/src/components/artifacts/spreadsheet-general-display.ts +43 -0
- package/src/components/artifacts/spreadsheet-grid.tsx +12 -13
- package/src/components/artifacts/visualization-assets/base.css +1015 -0
- package/src/components/artifacts/visualization-assets/helpers.html +349 -0
- package/src/components/artifacts/visualization-assets.gen.ts +3 -0
- package/src/components/browser-select-control.tsx +312 -0
- package/src/components/browser-viewer.tsx +1054 -314
- package/src/components/chat-composer.tsx +131 -85
- package/src/components/child-session-link.tsx +27 -0
- package/src/components/claude-mark.tsx +10 -0
- package/src/components/code-editor.tsx +13 -16
- package/src/components/composer-transcription-control.tsx +7 -5
- package/src/components/composer.tsx +376 -49
- package/src/components/computer-viewer.tsx +1041 -329
- package/src/components/copy-button.tsx +13 -5
- package/src/components/desktop-viewer.tsx +1 -1
- package/src/components/enrollment-consent.tsx +65 -7
- package/src/components/enrollment-device-flow.tsx +1 -1
- package/src/components/file-browser.tsx +158 -34
- package/src/components/fleet-tile.tsx +8 -16
- package/src/components/generated-video-player.tsx +4 -2
- package/src/components/grok-mark.tsx +33 -0
- package/src/components/human-input-form.tsx +455 -114
- package/src/components/human-input-surface.tsx +18 -7
- package/src/components/interaction-intervention-banner.tsx +2 -2
- package/src/components/machine-card.tsx +119 -4
- package/src/components/machine-dock-bar.tsx +1 -1
- package/src/components/machine-input-display.ts +23 -2
- package/src/components/machines/machine-detail.tsx +52 -2
- package/src/components/machines/machine-operation-policy.tsx +179 -0
- package/src/components/machines-dashboard.tsx +8 -17
- package/src/components/markdown-table-layout.ts +132 -0
- package/src/components/markdown.tsx +473 -44
- package/src/components/message-timeline.tsx +2498 -663
- package/src/components/model-mark.tsx +90 -0
- package/src/components/model-picker.tsx +15 -4
- package/src/components/model-policy-picker-menu.tsx +424 -0
- package/src/components/model-policy-picker.tsx +337 -381
- package/src/components/open-geni-chat.tsx +319 -0
- package/src/components/open-geni-links.tsx +179 -0
- package/src/components/openrouter-mark.tsx +13 -0
- package/src/components/pierre-diff.tsx +41 -16
- package/src/components/pierre-file.tsx +36 -11
- package/src/components/preview-loading.tsx +154 -0
- package/src/components/queue-item-content.ts +14 -0
- package/src/components/queue-surface-implementation.tsx +132 -42
- package/src/components/queue-surface-state.tsx +3 -1
- package/src/components/sandbox-files.tsx +267 -35
- package/src/components/sandbox-terminal.tsx +48 -11
- package/src/components/sandbox-workspace.tsx +337 -135
- package/src/components/session-capability-frame.tsx +192 -0
- package/src/components/session-chrome.tsx +1027 -328
- package/src/components/session-commands-panel.tsx +126 -0
- package/src/components/session-commands.tsx +18 -0
- package/src/components/session-connection-request.tsx +97 -0
- package/src/components/session-conversation.tsx +512 -0
- package/src/components/session-list.tsx +250 -0
- package/src/components/session-mcp-capability-card.tsx +680 -0
- package/src/components/session-status.tsx +1 -1
- package/src/components/timeline-anchor.tsx +119 -0
- package/src/components/timeline-annotation-chrome.tsx +196 -0
- package/src/components/timeline-annotation-layout.ts +268 -0
- package/src/components/timeline-annotation-markers.tsx +185 -0
- package/src/components/timeline-annotation-reveal-context.ts +9 -0
- package/src/components/timeline-annotation-selection.tsx +106 -54
- package/src/components/timeline-annotation-shared.ts +245 -0
- package/src/components/timeline-annotations-dialog.tsx +185 -128
- package/src/components/timeline-annotations.tsx +189 -45
- package/src/components/timeline-reading-progress.ts +80 -0
- package/src/components/timeline-search.tsx +168 -0
- package/src/components/timeline-settlement.ts +60 -0
- package/src/components/tip-follow.ts +70 -7
- package/src/components/tooltip.tsx +38 -5
- package/src/components/usage-limit-notice.tsx +179 -0
- package/src/components/usage-member-list.tsx +792 -0
- package/src/components/usage-meter.tsx +382 -0
- package/src/components/use-viewer-menu-dismiss.ts +33 -0
- package/src/components/user-message-body.tsx +194 -49
- package/src/components/workspace-dock.tsx +141 -175
- package/src/composer.ts +6 -1
- package/src/connect-account-identity.tsx +34 -0
- package/src/connect-accounts.tsx +233 -0
- package/src/connect-chooser.tsx +336 -0
- package/src/connect-panel.tsx +99 -0
- package/src/connect-setup.tsx +307 -0
- package/src/connect.ts +60 -0
- package/src/connection-assets.d.ts +4 -0
- package/src/connection-catalog.tsx +162 -0
- package/src/connection-discovery.tsx +235 -0
- package/src/connection-installed.tsx +51 -0
- package/src/connection-logo.tsx +37 -0
- package/src/connection-service-logo.tsx +55 -0
- package/src/connection-service-presentation.ts +46 -0
- package/src/connection-skeleton.tsx +16 -0
- package/src/connection-type-picker.tsx +36 -0
- package/src/conversation-timeline.ts +92 -0
- package/src/desktop.ts +24 -0
- package/src/device-authorization.tsx +98 -0
- package/src/diffs.ts +16 -0
- package/src/discovery-cache.ts +42 -0
- package/src/editor.ts +13 -0
- package/src/embedded-session-client.ts +104 -0
- package/src/file-node-visibility.ts +66 -0
- package/src/hooks/channel-cache.ts +104 -0
- package/src/hooks/internal.ts +3 -2
- package/src/hooks/latest-question.ts +164 -0
- package/src/hooks/shared-machines-list.ts +239 -0
- package/src/hooks/use-attached-browsers.ts +5 -1
- package/src/hooks/use-available-models.ts +20 -14
- package/src/hooks/use-browser-frame-stream.ts +25 -3
- package/src/hooks/use-browser-session.ts +271 -71
- package/src/hooks/use-browser-sessions.ts +7 -1
- package/src/hooks/use-channels.ts +32 -10
- package/src/hooks/use-codex-accounts.ts +78 -21
- package/src/hooks/use-composer.ts +1034 -320
- package/src/hooks/use-computer-frame-stream.ts +39 -16
- package/src/hooks/use-computer-input-posture.ts +94 -0
- package/src/hooks/use-computer-session.ts +110 -32
- package/src/hooks/use-computer-sessions.ts +8 -1
- package/src/hooks/use-connect.ts +23 -0
- package/src/hooks/use-desktop-stream.ts +19 -28
- package/src/hooks/use-file-attachments.ts +118 -10
- package/src/hooks/use-goal.ts +36 -9
- package/src/hooks/use-human-input.ts +31 -4
- package/src/hooks/use-last-started-turn-policy.ts +15 -13
- package/src/hooks/use-machine-chip.ts +23 -6
- package/src/hooks/use-machines.ts +104 -6
- package/src/hooks/use-sandbox-files.ts +253 -150
- package/src/hooks/use-sandbox-git.ts +58 -29
- package/src/hooks/use-session-background-commands.ts +67 -0
- package/src/hooks/use-session-capabilities.ts +21 -2
- package/src/hooks/use-session-events.ts +759 -433
- package/src/hooks/use-session-lineage.ts +28 -6
- package/src/hooks/use-session-mcp-approval-policy.ts +13 -5
- package/src/hooks/use-session.ts +75 -16
- package/src/hooks/use-slash-commands.ts +6 -11
- package/src/hooks/use-turn-queue.ts +113 -13
- package/src/hooks/use-usage.ts +100 -0
- package/src/hooks/use-voice-input.ts +12 -1
- package/src/hooks/use-workspace-capture.ts +3 -2
- package/src/hooks/use-workspace-edit.ts +23 -5
- package/src/hooks/use-workspace-sessions.ts +99 -11
- package/src/human-input.ts +12 -1
- package/src/identity-link-accounts.tsx +148 -0
- package/src/identity-link-consent.tsx +192 -0
- package/src/index.ts +157 -12
- package/src/interaction.ts +1 -0
- package/src/lib/error-message.ts +37 -0
- package/src/lib/format.ts +150 -14
- package/src/lib/host-theme.ts +511 -0
- package/src/lib/interaction-errors.ts +33 -0
- package/src/lib/menu-styles.ts +44 -0
- package/src/lib/pierre-diffs-loader.ts +53 -0
- package/src/lib/workbench-peers.ts +62 -0
- package/src/lib/xterm-theme.ts +23 -21
- package/src/machines.ts +9 -1
- package/src/mcp-connection-status.ts +35 -0
- package/src/model-policy.ts +223 -69
- package/src/older-history.ts +87 -0
- package/src/plugin-details.tsx +185 -0
- package/src/plugin-discovery.tsx +196 -0
- package/src/provider.tsx +55 -14
- package/src/realtime/dropdown-menu.tsx +19 -12
- package/src/realtime/realtime-control.tsx +133 -46
- package/src/session-auth-recommendation.ts +48 -0
- package/src/session-capability-policy.ts +83 -0
- package/src/session-context.ts +1 -0
- package/src/session-ui.ts +66 -2
- package/src/session.ts +18 -1
- package/src/sites-ui.tsx +402 -0
- package/src/sites.ts +3 -0
- package/src/skill-discovery.tsx +208 -0
- package/src/terminal.ts +26 -0
- package/src/timeline/activity-rail.tsx +171 -80
- package/src/timeline/allowance-exhausted-row.tsx +86 -0
- package/src/timeline/compaction-copy.ts +42 -0
- package/src/timeline/entrance.tsx +28 -3
- package/src/timeline/fleet-decision-projection.ts +2 -1
- package/src/timeline/fleet-decision-row.tsx +1 -0
- package/src/timeline/genie-loading.tsx +136 -0
- package/src/timeline/index.ts +11 -0
- package/src/timeline/knowledge-receipt.tsx +100 -0
- package/src/timeline/parsers.ts +2 -2
- package/src/timeline/platform-activity-row.tsx +216 -0
- package/src/timeline/presented-image.ts +49 -0
- package/src/timeline/projection.ts +1600 -84
- package/src/timeline/registry.ts +15 -3
- package/src/timeline/retained-image.ts +97 -0
- package/src/timeline/rolling-activity.tsx +92 -0
- package/src/timeline/screenshot-lightbox.tsx +115 -17
- package/src/timeline/shared.tsx +47 -15
- package/src/timeline/startup-preference.ts +33 -0
- package/src/timeline/startup-timings.tsx +145 -0
- package/src/timeline/tool-display-name.ts +8 -6
- package/src/timeline/tool-renderers.tsx +497 -128
- package/src/timeline/turn-summary.tsx +208 -44
- package/src/timeline/types.ts +186 -7
- package/src/types/machines.ts +10 -0
- package/src/usage/allowance-copy.ts +64 -0
- package/src/usage/summary.ts +93 -0
- package/src/usage.ts +50 -0
- package/styles/compiled.css +2098 -757
- package/styles/connect.css +284 -0
- package/styles/connect.d.ts +1 -0
- package/styles/effective-tokens.css +1 -0
- package/styles/index.css +201 -9
- package/styles/responsive.css +27 -1
- package/styles/session-capability.css +44 -0
- package/styles/tokens.css +135 -65
- package/dist/chunk-5UQPNLIO.js.map +0 -1
- package/dist/chunk-6KLX2RH5.js.map +0 -1
- package/dist/chunk-7WCLAEFV.js.map +0 -1
- package/dist/chunk-B6WPZSTT.js.map +0 -1
- package/dist/chunk-FK6VG4LL.js +0 -90
- package/dist/chunk-FK6VG4LL.js.map +0 -1
- package/dist/chunk-HA46CYQK.js.map +0 -1
- package/dist/chunk-HUIKIDM5.js.map +0 -1
- package/dist/chunk-IGC6A2ZI.js.map +0 -1
- package/dist/chunk-KCGXPP5V.js.map +0 -1
- package/dist/chunk-KZ73RL76.js.map +0 -1
- package/dist/chunk-LAKLF4PA.js +0 -141
- package/dist/chunk-LAKLF4PA.js.map +0 -1
- package/dist/chunk-LLOLUHVG.js.map +0 -1
- package/dist/chunk-MKPIAGVL.js +0 -465
- package/dist/chunk-MKPIAGVL.js.map +0 -1
- package/dist/chunk-PEI6RANI.js.map +0 -1
- package/dist/chunk-R3AZOAB5.js.map +0 -1
- package/dist/chunk-WSK7G5LE.js +0 -170
- package/dist/chunk-WSK7G5LE.js.map +0 -1
- package/dist/chunk-XBZWOM2K.js +0 -218
- package/dist/chunk-XBZWOM2K.js.map +0 -1
- package/dist/chunk-Y7OEDUJ5.js +0 -8810
- package/dist/chunk-Y7OEDUJ5.js.map +0 -1
- package/dist/fleet-decision-row-GGCAT4E4.js.map +0 -1
- package/dist/hooks/use-packs.d.ts +0 -32
- package/dist/interactive-workbench-viewers-TOHBXJEE.js +0 -15
- package/dist/queue-surface-implementation-2KVJTYXH.js.map +0 -1
- package/dist/timeline-annotation-selection-3L7LHGG2.js +0 -187
- package/dist/timeline-annotation-selection-3L7LHGG2.js.map +0 -1
- package/dist/timeline-annotations-dialog-U7EVLR75.js +0 -196
- package/dist/timeline-annotations-dialog-U7EVLR75.js.map +0 -1
- package/src/hooks/use-packs.ts +0 -157
- /package/dist/{interactive-workbench-viewers-TOHBXJEE.js.map → browser-viewer-GTR5XQ7X.js.map} +0 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { ContextCompactionItem } from "./types";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Subtitle for a settled compaction landmark. A definitive provider rejection
|
|
5
|
+
* repeats deterministically for the same conversation, so it names the
|
|
6
|
+
* rejected field and withholds the generic retry promise; every other skip
|
|
7
|
+
* keeps its existing copy.
|
|
8
|
+
*/
|
|
9
|
+
export function compactionSkipSubtitle(
|
|
10
|
+
reason: string | null,
|
|
11
|
+
providerRejection: ContextCompactionItem["providerRejection"] = null,
|
|
12
|
+
): string {
|
|
13
|
+
switch (reason) {
|
|
14
|
+
case "no_history":
|
|
15
|
+
return "No active history to compact";
|
|
16
|
+
case "replacement_not_smaller":
|
|
17
|
+
return "Checkpoint would not reduce memory size";
|
|
18
|
+
case "replacement_exceeds_model_budget":
|
|
19
|
+
return "Checkpoint exceeds this model's context budget. Chat history is unchanged.";
|
|
20
|
+
case "replacement_unchanged":
|
|
21
|
+
return "Checkpoint made no progress";
|
|
22
|
+
case "summarization_failed":
|
|
23
|
+
return providerRejection
|
|
24
|
+
? `The model provider rejected the compaction request (${describeCompactionProviderRejection(providerRejection)}). Chat history is unchanged. Repeating it fails the same way until the conversation changes; if a new message fails again, start a new session.`
|
|
25
|
+
: "Request it again to retry. Chat history is unchanged.";
|
|
26
|
+
default:
|
|
27
|
+
return "Compaction was not needed. Chat history is unchanged.";
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** `HTTP 400 invalid_request_error, param input[3].encrypted_content`; identifiers only. */
|
|
32
|
+
export function describeCompactionProviderRejection(
|
|
33
|
+
rejection: NonNullable<ContextCompactionItem["providerRejection"]>,
|
|
34
|
+
): string {
|
|
35
|
+
const parts = [
|
|
36
|
+
`HTTP ${rejection.httpStatus}${rejection.type ? ` ${rejection.type}` : ""}${
|
|
37
|
+
rejection.code ? ` ${rejection.code}` : ""
|
|
38
|
+
}`,
|
|
39
|
+
];
|
|
40
|
+
if (rejection.param) parts.push(`param ${rejection.param}`);
|
|
41
|
+
return parts.join(", ");
|
|
42
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createContext, useContext, useRef } from "react";
|
|
1
|
+
import { createContext, useContext, useRef, type ReactNode } from "react";
|
|
2
2
|
|
|
3
3
|
/* ----------------------------------------------------------------------------
|
|
4
4
|
Entrance animation gating
|
|
@@ -15,8 +15,33 @@ import { createContext, useContext, useRef } from "react";
|
|
|
15
15
|
-------------------------------------------------------------------------- */
|
|
16
16
|
|
|
17
17
|
const EntranceAnimationContext = createContext(true);
|
|
18
|
+
const EntranceAnimationLiveContext = createContext(true);
|
|
18
19
|
|
|
19
|
-
|
|
20
|
+
/**
|
|
21
|
+
* Freeze the mount-time gate for this subtree while publishing a separate live
|
|
22
|
+
* gate to activity rails that need later appends to animate after a bulk paint.
|
|
23
|
+
* MessageTimeline mounts one provider per durable group, so existing groups do
|
|
24
|
+
* not receive a context invalidation when a prepend toggles bulk mode and new
|
|
25
|
+
* groups still capture the value from the commit that created them.
|
|
26
|
+
*/
|
|
27
|
+
export function EntranceAnimationProvider({
|
|
28
|
+
value,
|
|
29
|
+
liveValue = value,
|
|
30
|
+
children,
|
|
31
|
+
}: {
|
|
32
|
+
value: boolean;
|
|
33
|
+
liveValue?: boolean | undefined;
|
|
34
|
+
children: ReactNode;
|
|
35
|
+
}) {
|
|
36
|
+
const mountedValue = useRef(value).current;
|
|
37
|
+
return (
|
|
38
|
+
<EntranceAnimationContext.Provider value={mountedValue}>
|
|
39
|
+
<EntranceAnimationLiveContext.Provider value={liveValue}>
|
|
40
|
+
{children}
|
|
41
|
+
</EntranceAnimationLiveContext.Provider>
|
|
42
|
+
</EntranceAnimationContext.Provider>
|
|
43
|
+
);
|
|
44
|
+
}
|
|
20
45
|
|
|
21
46
|
/**
|
|
22
47
|
* Live entrance gate from the nearest provider. Prefer
|
|
@@ -25,7 +50,7 @@ export const EntranceAnimationProvider = EntranceAnimationContext.Provider;
|
|
|
25
50
|
* later appends after a bulk window clears.
|
|
26
51
|
*/
|
|
27
52
|
export function useEntranceAnimationLive(): boolean {
|
|
28
|
-
return useContext(
|
|
53
|
+
return useContext(EntranceAnimationLiveContext);
|
|
29
54
|
}
|
|
30
55
|
|
|
31
56
|
/**
|
|
@@ -8,6 +8,7 @@ const FLEET_ACTUAL_REASONS = [
|
|
|
8
8
|
"rotation",
|
|
9
9
|
"active",
|
|
10
10
|
"all_capped",
|
|
11
|
+
"allocator_disabled",
|
|
11
12
|
"none",
|
|
12
13
|
] as const;
|
|
13
14
|
const FLEET_SHADOW_OUTCOMES = ["selected", "paced", "none"] as const;
|
|
@@ -334,7 +335,7 @@ function fleetDecisionSemanticsAreConsistent(input: {
|
|
|
334
335
|
input.actualOutcome === "selected"
|
|
335
336
|
? ["lease_reused", "pin", "rotation", "active"].includes(input.actualReason)
|
|
336
337
|
: input.actualOutcome === "waiting"
|
|
337
|
-
? input.actualReason
|
|
338
|
+
? ["all_capped", "allocator_disabled"].includes(input.actualReason)
|
|
338
339
|
: input.actualReason === "none";
|
|
339
340
|
const shadowConsistent =
|
|
340
341
|
input.shadowOutcome === "selected"
|
|
@@ -28,6 +28,7 @@ const FLEET_ACTUAL_REASON_LABEL: Record<FleetDecisionItem["actualReason"], strin
|
|
|
28
28
|
rotation: "Rotated for capacity",
|
|
29
29
|
active: "Used the active subscription",
|
|
30
30
|
all_capped: "All observed subscriptions were capped",
|
|
31
|
+
allocator_disabled: "The policy-selected subscription was disabled for new allocations",
|
|
31
32
|
none: "No production candidate was selected",
|
|
32
33
|
};
|
|
33
34
|
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { ThinkingOrb } from "thinking-orbs";
|
|
2
|
+
import { useThemeType } from "../lib/use-theme-type";
|
|
3
|
+
import { createContext, useContext, useEffect, useState, type ReactNode } from "react";
|
|
4
|
+
|
|
5
|
+
export type GenieLoadingRenderProps = {
|
|
6
|
+
startedAt: string;
|
|
7
|
+
phase: "preparing" | "waiting";
|
|
8
|
+
detailsOpen: boolean;
|
|
9
|
+
onShowDetails: () => void;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export type GenieLoadingOptions = {
|
|
13
|
+
/** Replace the visual while preserving SDK loading visibility and transitions. */
|
|
14
|
+
render?: (props: GenieLoadingRenderProps) => ReactNode;
|
|
15
|
+
phrases?: readonly string[];
|
|
16
|
+
/** Native copy overrides. Omitted messages retain the default English copy. */
|
|
17
|
+
messages?: {
|
|
18
|
+
status?: string;
|
|
19
|
+
slowStatus?: string;
|
|
20
|
+
slowText?: string;
|
|
21
|
+
showDetails?: string;
|
|
22
|
+
hideDetails?: string;
|
|
23
|
+
};
|
|
24
|
+
/** Public adapter options; the renderer dependency's declarations stay private. */
|
|
25
|
+
orb?: {
|
|
26
|
+
state?:
|
|
27
|
+
| "working"
|
|
28
|
+
| "searching"
|
|
29
|
+
| "solving"
|
|
30
|
+
| "listening"
|
|
31
|
+
| "connecting"
|
|
32
|
+
| "weaving"
|
|
33
|
+
| "composing"
|
|
34
|
+
| "breathing"
|
|
35
|
+
| "shaping";
|
|
36
|
+
size?: 64 | 20;
|
|
37
|
+
speed?: number;
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
export const GenieLoadingOptionsContext = createContext<GenieLoadingOptions | undefined>(undefined);
|
|
41
|
+
|
|
42
|
+
const PHRASES = [
|
|
43
|
+
"Polishing the lamp…",
|
|
44
|
+
"Consulting the carpet…",
|
|
45
|
+
"Untangling wishes…",
|
|
46
|
+
"Summoning a little cleverness…",
|
|
47
|
+
"Checking the fine print on infinity…",
|
|
48
|
+
"Warming up the abracadabra…",
|
|
49
|
+
"Rearranging the stars…",
|
|
50
|
+
"Negotiating with the lamp…",
|
|
51
|
+
"Dusting off a thousand years…",
|
|
52
|
+
"Wishful thinking…",
|
|
53
|
+
"Decanting a little magic…",
|
|
54
|
+
"Finding the good stardust…",
|
|
55
|
+
"Fluffing the magic carpet…",
|
|
56
|
+
"Putting a wish into motion…",
|
|
57
|
+
"A little hocus. A little pocus…",
|
|
58
|
+
];
|
|
59
|
+
const WAITING_PHRASES = ["Waiting for a response…"];
|
|
60
|
+
|
|
61
|
+
/** Decorative copy never substitutes for a failure or claims measurable progress. */
|
|
62
|
+
export function GenieLoading({
|
|
63
|
+
startedAt,
|
|
64
|
+
phase = "preparing",
|
|
65
|
+
onShowDetails,
|
|
66
|
+
detailsOpen = false,
|
|
67
|
+
}: {
|
|
68
|
+
startedAt: string;
|
|
69
|
+
phase?: GenieLoadingRenderProps["phase"];
|
|
70
|
+
onShowDetails: () => void;
|
|
71
|
+
detailsOpen?: boolean;
|
|
72
|
+
}) {
|
|
73
|
+
const options = useContext(GenieLoadingOptionsContext);
|
|
74
|
+
const waiting = phase === "waiting";
|
|
75
|
+
const phrases = options?.phrases?.length ? options.phrases : waiting ? WAITING_PHRASES : PHRASES;
|
|
76
|
+
const theme = useThemeType(undefined);
|
|
77
|
+
const [phrase, setPhrase] = useState(0);
|
|
78
|
+
const [showDetails, setShowDetails] = useState(false);
|
|
79
|
+
const [slow, setSlow] = useState(false);
|
|
80
|
+
useEffect(() => {
|
|
81
|
+
const update = () => {
|
|
82
|
+
setShowDetails(Date.now() - Date.parse(startedAt) >= 15_000);
|
|
83
|
+
setSlow(Date.now() - Date.parse(startedAt) >= 30_000);
|
|
84
|
+
if (!document.hidden) setPhrase(Math.floor(Math.random() * phrases.length));
|
|
85
|
+
};
|
|
86
|
+
update();
|
|
87
|
+
const timer = window.setInterval(update, 5_000);
|
|
88
|
+
return () => window.clearInterval(timer);
|
|
89
|
+
}, [startedAt, phrases]);
|
|
90
|
+
if (options?.render) return options.render({ startedAt, phase, detailsOpen, onShowDetails });
|
|
91
|
+
return (
|
|
92
|
+
<div className="og-genie-loading">
|
|
93
|
+
<div
|
|
94
|
+
className="og-genie-orb"
|
|
95
|
+
aria-hidden="true"
|
|
96
|
+
style={{
|
|
97
|
+
width: options?.orb?.size ?? 64,
|
|
98
|
+
height: options?.orb?.size ?? 64,
|
|
99
|
+
flexBasis: options?.orb?.size ?? 64,
|
|
100
|
+
}}
|
|
101
|
+
>
|
|
102
|
+
<ThinkingOrb state="searching" size={64} theme={theme} speed={0.8} {...options?.orb} />
|
|
103
|
+
</div>
|
|
104
|
+
<div className="og-genie-copy">
|
|
105
|
+
<span className="sr-only" role="status">
|
|
106
|
+
{slow
|
|
107
|
+
? (options?.messages?.slowStatus ??
|
|
108
|
+
(waiting
|
|
109
|
+
? "Waiting for a response. Taking longer than usual."
|
|
110
|
+
: "Preparing your task. Taking longer than usual."))
|
|
111
|
+
: (options?.messages?.status ??
|
|
112
|
+
(waiting ? "Waiting for a response." : "Preparing your task."))}
|
|
113
|
+
</span>
|
|
114
|
+
<span key={slow ? "slow" : phrase} className="og-genie-phrase" aria-hidden="true">
|
|
115
|
+
{slow
|
|
116
|
+
? (options?.messages?.slowText ??
|
|
117
|
+
(waiting ? "Still waiting for a response…" : "A little longer than usual…"))
|
|
118
|
+
: phrases[phrase % phrases.length]}
|
|
119
|
+
</span>
|
|
120
|
+
{showDetails || detailsOpen ? (
|
|
121
|
+
<button
|
|
122
|
+
type="button"
|
|
123
|
+
className="og-genie-details"
|
|
124
|
+
aria-expanded={detailsOpen}
|
|
125
|
+
onClick={onShowDetails}
|
|
126
|
+
>
|
|
127
|
+
{detailsOpen
|
|
128
|
+
? (options?.messages?.hideDetails ?? "Hide details")
|
|
129
|
+
: (options?.messages?.showDetails ?? (waiting ? "Show details" : "Behind the magic"))}
|
|
130
|
+
<span aria-hidden="true"> ↗</span>
|
|
131
|
+
</button>
|
|
132
|
+
) : null}
|
|
133
|
+
</div>
|
|
134
|
+
</div>
|
|
135
|
+
);
|
|
136
|
+
}
|
package/src/timeline/index.ts
CHANGED
|
@@ -26,6 +26,7 @@ export {
|
|
|
26
26
|
toolDisplayName,
|
|
27
27
|
toolMatchesLeaf,
|
|
28
28
|
} from "./projection";
|
|
29
|
+
export type { GroupTimelineOptions } from "./projection";
|
|
29
30
|
|
|
30
31
|
// item types
|
|
31
32
|
export type {
|
|
@@ -36,12 +37,17 @@ export type {
|
|
|
36
37
|
FleetDecisionItem,
|
|
37
38
|
FleetDecisionScoreItem,
|
|
38
39
|
GoalItem,
|
|
40
|
+
HumanInputAnswerSummary,
|
|
41
|
+
HumanInputItem,
|
|
39
42
|
MachineInputBatchItem,
|
|
40
43
|
MachineInputMember,
|
|
41
44
|
MemoryItem,
|
|
45
|
+
KnowledgeItem,
|
|
42
46
|
NoticeItem,
|
|
43
47
|
ReasoningItem,
|
|
44
48
|
SandboxItem,
|
|
49
|
+
StartupPhase,
|
|
50
|
+
StartupPhaseItem,
|
|
45
51
|
SessionStatusItem,
|
|
46
52
|
TimelineGroup,
|
|
47
53
|
TimelineItem,
|
|
@@ -88,6 +94,7 @@ export type { ActivityDisclosureProps, DisclosureChip } from "./shared";
|
|
|
88
94
|
|
|
89
95
|
// screenshot lightbox
|
|
90
96
|
export { LightboxProvider, useLightbox, useLightboxOptional } from "./screenshot-lightbox";
|
|
97
|
+
export type { LightboxControlLabels } from "./screenshot-lightbox";
|
|
91
98
|
|
|
92
99
|
// disclosure defaults (opt-in initial-open seed; for screenshot/test instrumentation)
|
|
93
100
|
export { DisclosureDefaultsProvider, useForcedDefaultOpen } from "./disclosure-context";
|
|
@@ -113,6 +120,7 @@ export type {
|
|
|
113
120
|
TurnSummaryFacetResult,
|
|
114
121
|
TurnSummaryOptions,
|
|
115
122
|
TurnSummaryProps,
|
|
123
|
+
TurnSummaryStatus,
|
|
116
124
|
} from "./turn-summary";
|
|
117
125
|
|
|
118
126
|
// parsers (pure, reusable by custom renderers)
|
|
@@ -134,3 +142,6 @@ export {
|
|
|
134
142
|
v4aToGitFileDiff,
|
|
135
143
|
} from "./parsers";
|
|
136
144
|
export type { ApplyPatchOperation } from "./parsers";
|
|
145
|
+
|
|
146
|
+
export { KnowledgeActivityProvider } from "./knowledge-receipt";
|
|
147
|
+
export type { KnowledgeActivityActions } from "./knowledge-receipt";
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { createContext, useContext, useState, type ReactNode } from "react";
|
|
2
|
+
import { BrainCircuitIcon } from "lucide-react";
|
|
3
|
+
import { ActivityDisclosure, BodyNote } from "./shared";
|
|
4
|
+
|
|
5
|
+
export type KnowledgeActivityActions = {
|
|
6
|
+
onInspect?: ((entryId: string) => void) | undefined;
|
|
7
|
+
onRetryFile?: ((fileId: string) => Promise<boolean | void>) | undefined;
|
|
8
|
+
retryDisabled?: boolean | undefined;
|
|
9
|
+
};
|
|
10
|
+
const KnowledgeActions = createContext<KnowledgeActivityActions>({});
|
|
11
|
+
export function KnowledgeActivityProvider({
|
|
12
|
+
children,
|
|
13
|
+
...actions
|
|
14
|
+
}: KnowledgeActivityActions & { children: ReactNode }) {
|
|
15
|
+
return <KnowledgeActions.Provider value={actions}>{children}</KnowledgeActions.Provider>;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** A saved/pending result never opens or blocks the human-input surface. */
|
|
19
|
+
export function KnowledgeReceiptRow(props: {
|
|
20
|
+
outcome: "published" | "pending" | "rejected" | "archived" | "failed";
|
|
21
|
+
entryId?: string | undefined;
|
|
22
|
+
fileId?: string | undefined;
|
|
23
|
+
title?: string | undefined;
|
|
24
|
+
source?: boolean | undefined;
|
|
25
|
+
}) {
|
|
26
|
+
const actions = useContext(KnowledgeActions);
|
|
27
|
+
const [retrying, setRetrying] = useState(false);
|
|
28
|
+
const [retrySent, setRetrySent] = useState(false);
|
|
29
|
+
const [error, setError] = useState<string | null>(null);
|
|
30
|
+
const label =
|
|
31
|
+
props.outcome === "pending"
|
|
32
|
+
? "Knowledge saved for review"
|
|
33
|
+
: props.outcome === "failed"
|
|
34
|
+
? "Source preparation failed"
|
|
35
|
+
: props.outcome === "rejected"
|
|
36
|
+
? "Source remains rejected"
|
|
37
|
+
: props.outcome === "archived"
|
|
38
|
+
? "Knowledge archived"
|
|
39
|
+
: props.source
|
|
40
|
+
? "Source saved to Knowledge"
|
|
41
|
+
: "Saved to Knowledge";
|
|
42
|
+
const actionClass =
|
|
43
|
+
"rounded-og-sm px-1 py-0.5 text-og-sm text-og-fg-muted hover:text-og-fg focus-visible:outline-2 focus-visible:outline-og-accent disabled:opacity-50";
|
|
44
|
+
return (
|
|
45
|
+
<ActivityDisclosure
|
|
46
|
+
icon={<BrainCircuitIcon className="size-3.5" />}
|
|
47
|
+
iconTone="muted"
|
|
48
|
+
title={label}
|
|
49
|
+
preview={props.title}
|
|
50
|
+
>
|
|
51
|
+
{props.outcome === "pending" ? (
|
|
52
|
+
<BodyNote>
|
|
53
|
+
Saved in Needs review. This task continues; future tasks can use it after approval.
|
|
54
|
+
</BodyNote>
|
|
55
|
+
) : null}
|
|
56
|
+
{props.outcome === "failed" ? (
|
|
57
|
+
<BodyNote>
|
|
58
|
+
The original file remains attached. Searchable text has not been retained.
|
|
59
|
+
</BodyNote>
|
|
60
|
+
) : null}
|
|
61
|
+
{props.outcome === "rejected" ? (
|
|
62
|
+
<BodyNote>Processing the file again leaves the review decision unchanged.</BodyNote>
|
|
63
|
+
) : null}
|
|
64
|
+
{props.entryId && actions.onInspect ? (
|
|
65
|
+
<button
|
|
66
|
+
className={actionClass}
|
|
67
|
+
type="button"
|
|
68
|
+
onClick={() => actions.onInspect?.(props.entryId!)}
|
|
69
|
+
>
|
|
70
|
+
{props.outcome === "pending" ? "Review in Knowledge" : "View in Knowledge"}
|
|
71
|
+
</button>
|
|
72
|
+
) : null}
|
|
73
|
+
{props.outcome === "failed" && props.fileId && actions.onRetryFile ? (
|
|
74
|
+
<button
|
|
75
|
+
className={actionClass}
|
|
76
|
+
type="button"
|
|
77
|
+
disabled={retrying || retrySent || actions.retryDisabled}
|
|
78
|
+
onClick={() => {
|
|
79
|
+
setRetrying(true);
|
|
80
|
+
setError(null);
|
|
81
|
+
void actions.onRetryFile!(props.fileId!)
|
|
82
|
+
.then((sent) => {
|
|
83
|
+
if (sent !== false) setRetrySent(true);
|
|
84
|
+
else setError("Could not start the retry. Try again when the chat is ready.");
|
|
85
|
+
})
|
|
86
|
+
.catch(() => setError("Could not start the retry. Please try again."))
|
|
87
|
+
.finally(() => setRetrying(false));
|
|
88
|
+
}}
|
|
89
|
+
>
|
|
90
|
+
{retrying ? "Starting retry…" : retrySent ? "Retry requested" : "Retry preparation"}
|
|
91
|
+
</button>
|
|
92
|
+
) : null}
|
|
93
|
+
{error ? (
|
|
94
|
+
<p role="alert" className="text-og-sm">
|
|
95
|
+
{error}
|
|
96
|
+
</p>
|
|
97
|
+
) : null}
|
|
98
|
+
</ActivityDisclosure>
|
|
99
|
+
);
|
|
100
|
+
}
|
package/src/timeline/parsers.ts
CHANGED
|
@@ -566,8 +566,8 @@ export function retainedScreenshotMetadata(out: unknown): RetainedArtifactMetada
|
|
|
566
566
|
if (!value.available) {
|
|
567
567
|
return typeof value.reason === "string" ? (value as unknown as RetainedArtifactMetadata) : null;
|
|
568
568
|
}
|
|
569
|
-
return value.kind === "computer_screenshot" &&
|
|
570
|
-
|
|
569
|
+
return (value.kind === "computer_screenshot" || value.kind === "browser_screenshot") &&
|
|
570
|
+
["image/png", "image/jpeg", "image/webp"].includes(String(value.contentType)) &&
|
|
571
571
|
typeof value.originalBytes === "number" &&
|
|
572
572
|
typeof value.sha256 === "string" &&
|
|
573
573
|
value.dimensions !== null &&
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import type { ReasoningItem, SandboxItem, StartupPhaseItem } from "./types";
|
|
2
|
+
|
|
3
|
+
type RowJsx = typeof import("react/jsx-runtime").jsx;
|
|
4
|
+
type RowJsxs = typeof import("react/jsx-runtime").jsxs;
|
|
5
|
+
|
|
6
|
+
export default function PlatformActivityRow({
|
|
7
|
+
item,
|
|
8
|
+
d: ActivityDisclosure,
|
|
9
|
+
p: PayloadBlock,
|
|
10
|
+
t: displayName,
|
|
11
|
+
b: BotIcon,
|
|
12
|
+
m: Markdown,
|
|
13
|
+
j,
|
|
14
|
+
s,
|
|
15
|
+
}: {
|
|
16
|
+
item: ReasoningItem | SandboxItem | StartupPhaseItem;
|
|
17
|
+
d: typeof import("./shared").ActivityDisclosure;
|
|
18
|
+
p: typeof import("./shared").PayloadBlock;
|
|
19
|
+
t: (name: string) => string;
|
|
20
|
+
b: typeof import("lucide-react").BotIcon;
|
|
21
|
+
m: typeof import("../components/markdown").Markdown;
|
|
22
|
+
j: RowJsx;
|
|
23
|
+
s: RowJsxs;
|
|
24
|
+
}) {
|
|
25
|
+
if (item.kind === "reasoning") {
|
|
26
|
+
return j(ActivityDisclosure, {
|
|
27
|
+
icon: brainIcon(j, s),
|
|
28
|
+
iconTone: "muted",
|
|
29
|
+
title: item.streaming
|
|
30
|
+
? "Thinking"
|
|
31
|
+
: j("span", {
|
|
32
|
+
className: "font-normal italic text-og-fg-subtle",
|
|
33
|
+
children: "Thought",
|
|
34
|
+
}),
|
|
35
|
+
running: item.streaming,
|
|
36
|
+
compactPreview: item.text.replace(/\*\*|__|`/g, "").replace(/\s+/g, " "),
|
|
37
|
+
preview: j("span", {
|
|
38
|
+
className: "og-reasoning-preview",
|
|
39
|
+
children: j(Markdown, { streaming: item.streaming, children: item.text }),
|
|
40
|
+
}),
|
|
41
|
+
children: j("div", {
|
|
42
|
+
className: "text-og-base leading-6 text-og-fg-muted [&_strong]:text-og-fg-muted",
|
|
43
|
+
children: j(Markdown, { streaming: item.streaming, children: item.text }),
|
|
44
|
+
}),
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
if (item.kind === "sandbox") {
|
|
48
|
+
return s(ActivityDisclosure, {
|
|
49
|
+
icon: terminalIcon(j, s),
|
|
50
|
+
iconTone:
|
|
51
|
+
item.status === "failed" ? "failed" : item.status === "running" ? "running" : "muted",
|
|
52
|
+
title: sandboxRowTitle(item, displayName),
|
|
53
|
+
running: item.status === "running",
|
|
54
|
+
failed: item.status === "failed",
|
|
55
|
+
cancelled: item.status === "cancelled",
|
|
56
|
+
preview: item.command ?? undefined,
|
|
57
|
+
children: [
|
|
58
|
+
item.command ? j(PayloadBlock, { label: "Command", value: item.command }, "command") : null,
|
|
59
|
+
item.output ? j(PayloadBlock, { label: "Output", value: item.output }, "output") : null,
|
|
60
|
+
],
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const failed = item.status === "failed";
|
|
65
|
+
const running = item.status === "running";
|
|
66
|
+
const duration = startupDuration(item.durationMs);
|
|
67
|
+
return j(ActivityDisclosure, {
|
|
68
|
+
icon: j(BotIcon, { className: "size-3.5" }),
|
|
69
|
+
iconTone: failed ? "failed" : running ? "running" : "muted",
|
|
70
|
+
title: item.blockedReason
|
|
71
|
+
? STARTUP_WAIT_TITLES[item.blockedReason]
|
|
72
|
+
: startupPhaseTitle(item.phase, item.status, item.outcome),
|
|
73
|
+
preview:
|
|
74
|
+
item.phase === "model_preparation"
|
|
75
|
+
? "Includes overlapping sandbox startup, custom environment setup, repository preparation, and runtime setup shown below."
|
|
76
|
+
: undefined,
|
|
77
|
+
running,
|
|
78
|
+
failed,
|
|
79
|
+
cancelled: item.status === "cancelled",
|
|
80
|
+
chip: duration ? { tone: failed ? "bad" : "muted", text: duration } : undefined,
|
|
81
|
+
expandable: false,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function brainIcon(j: RowJsx, s: RowJsxs) {
|
|
86
|
+
return lucideIcon(j, s, "brain", [
|
|
87
|
+
j("path", { d: "M 12 18V5" }, "spine"),
|
|
88
|
+
j("path", { d: "M15 13a4.17 4.17 0 0 1-3-4 4.17 4.17 0 0 1-3 4" }, "center"),
|
|
89
|
+
j("path", { d: "M17.598 6.5A3 3 0 1 0 12 5a3 3 0 1 0-5.598 1.5" }, "top"),
|
|
90
|
+
j("path", { d: "M17.997 5.125a4 4 0 0 1 2.526 5.77" }, "upper-right"),
|
|
91
|
+
j("path", { d: "M18 18a4 4 0 0 0 2-7.464" }, "right"),
|
|
92
|
+
j("path", { d: "M19.967 17.483A4 4 0 1 1 12 18a4 4 0 1 1-7.967-.517" }, "base"),
|
|
93
|
+
j("path", { d: "M6 18a4 4 0 0 1-2-7.464" }, "left"),
|
|
94
|
+
j("path", { d: "M6.003 5.125a4 4 0 0 0-2.526 5.77" }, "upper-left"),
|
|
95
|
+
]);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function terminalIcon(j: RowJsx, s: RowJsxs) {
|
|
99
|
+
return lucideIcon(j, s, "square-terminal", [
|
|
100
|
+
j("path", { d: "m7 11 2-2-2-2" }, "prompt"),
|
|
101
|
+
j("path", { d: "M11 13h4" }, "cursor"),
|
|
102
|
+
j("rect", { width: 18, height: 18, x: 3, y: 3, rx: 2, ry: 2 }, "frame"),
|
|
103
|
+
]);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function lucideIcon(j: RowJsx, s: RowJsxs, name: string, children: ReturnType<RowJsx>[]) {
|
|
107
|
+
return s("svg", {
|
|
108
|
+
"aria-hidden": "true",
|
|
109
|
+
className: `lucide lucide-${name} size-3.5`,
|
|
110
|
+
fill: "none",
|
|
111
|
+
height: 24,
|
|
112
|
+
stroke: "currentColor",
|
|
113
|
+
strokeLinecap: "round",
|
|
114
|
+
strokeLinejoin: "round",
|
|
115
|
+
strokeWidth: 2,
|
|
116
|
+
viewBox: "0 0 24 24",
|
|
117
|
+
width: 24,
|
|
118
|
+
children,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function sandboxRowTitle(item: SandboxItem, displayName: (name: string) => string): string {
|
|
123
|
+
if (item.name === "sandbox.provision") {
|
|
124
|
+
return startupPhaseTitle(
|
|
125
|
+
"sandbox",
|
|
126
|
+
item.status === "cancelled" ? "complete" : item.status,
|
|
127
|
+
item.origin ?? null,
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
return displayName(item.name);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function startupPhaseTitle(
|
|
134
|
+
phase: StartupPhaseItem["phase"],
|
|
135
|
+
status: StartupPhaseItem["status"],
|
|
136
|
+
outcome: StartupPhaseItem["outcome"],
|
|
137
|
+
): string {
|
|
138
|
+
if (status === "complete" && phase === "sandbox" && outcome && outcome !== "skipped") {
|
|
139
|
+
return `Sandbox ${outcome === "resumed" ? "reattached" : outcome}`;
|
|
140
|
+
}
|
|
141
|
+
if (status === "complete" && phase === "rig" && outcome === "skipped") {
|
|
142
|
+
return "Sandbox Environment already ready";
|
|
143
|
+
}
|
|
144
|
+
const statusIndex =
|
|
145
|
+
status === "running" ? 0 : status === "failed" ? 1 : status === "cancelled" ? 2 : 3;
|
|
146
|
+
return STARTUP_PHASE_TITLES[phase][statusIndex];
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
const STARTUP_WAIT_TITLES: Record<NonNullable<StartupPhaseItem["blockedReason"]>, string> = {
|
|
150
|
+
capture_in_progress: "Waiting for sandbox checkpoint",
|
|
151
|
+
rotation_in_progress: "Waiting for sandbox rotation",
|
|
152
|
+
provider_recovery_in_progress: "Waiting for sandbox recovery",
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
const STARTUP_PHASE_TITLES: Record<
|
|
156
|
+
StartupPhaseItem["phase"],
|
|
157
|
+
readonly [string, string, string, string]
|
|
158
|
+
> = {
|
|
159
|
+
queue: [
|
|
160
|
+
"Waiting for a worker",
|
|
161
|
+
"Worker startup failed",
|
|
162
|
+
"Worker wait interrupted",
|
|
163
|
+
"Worker started",
|
|
164
|
+
],
|
|
165
|
+
sandbox: [
|
|
166
|
+
"Starting sandbox",
|
|
167
|
+
"Sandbox didn’t start",
|
|
168
|
+
"Sandbox startup interrupted",
|
|
169
|
+
"Sandbox ready",
|
|
170
|
+
],
|
|
171
|
+
rig: [
|
|
172
|
+
"Setting up sandbox environment",
|
|
173
|
+
"Sandbox Environment setup failed",
|
|
174
|
+
"Sandbox Environment setup interrupted",
|
|
175
|
+
"Sandbox Environment ready",
|
|
176
|
+
],
|
|
177
|
+
repository: [
|
|
178
|
+
"Preparing repository",
|
|
179
|
+
"Repository preparation failed",
|
|
180
|
+
"Repository preparation interrupted",
|
|
181
|
+
"Repository ready",
|
|
182
|
+
],
|
|
183
|
+
files: [
|
|
184
|
+
"Preparing files",
|
|
185
|
+
"File preparation failed",
|
|
186
|
+
"File preparation interrupted",
|
|
187
|
+
"Files ready",
|
|
188
|
+
],
|
|
189
|
+
tools: [
|
|
190
|
+
"Connecting tools",
|
|
191
|
+
"Tool connection failed",
|
|
192
|
+
"Tool connection interrupted",
|
|
193
|
+
"Tools ready",
|
|
194
|
+
],
|
|
195
|
+
model_preparation: [
|
|
196
|
+
"Preparing runtime and model request",
|
|
197
|
+
"Runtime/model preparation failed",
|
|
198
|
+
"Runtime/model preparation interrupted",
|
|
199
|
+
"Model request dispatched",
|
|
200
|
+
],
|
|
201
|
+
provider_first_byte: [
|
|
202
|
+
"Waiting for model",
|
|
203
|
+
"Model didn’t respond",
|
|
204
|
+
"Model wait interrupted",
|
|
205
|
+
"Model started responding",
|
|
206
|
+
],
|
|
207
|
+
};
|
|
208
|
+
|
|
209
|
+
function startupDuration(durationMs: number | null): string | null {
|
|
210
|
+
if (durationMs === null || !Number.isFinite(durationMs) || durationMs < 0) return null;
|
|
211
|
+
if (durationMs < 1_000) return `${Math.round(durationMs)}ms`;
|
|
212
|
+
if (durationMs < 60_000) return `${(durationMs / 1_000).toFixed(1)}s`;
|
|
213
|
+
const minutes = Math.floor(durationMs / 60_000);
|
|
214
|
+
const seconds = Math.round((durationMs % 60_000) / 1_000);
|
|
215
|
+
return `${minutes}m ${String(seconds).padStart(2, "0")}s`;
|
|
216
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { normalizeMcpOutput, parseSandboxFileArtifactReceipt } from "@opengeni/sdk";
|
|
2
|
+
import { mcpToolLeaf } from "./tool-display-name";
|
|
3
|
+
import type { ActivityItem, TimelineGroup } from "./types";
|
|
4
|
+
|
|
5
|
+
/*
|
|
6
|
+
* Pure presentation facts shared by the projection and the renderers. Kept
|
|
7
|
+
* free of React so the session-only entry can inspect primary output without pulling
|
|
8
|
+
* in rendering code.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/** Shared browser preview allowlist; other published files remain downloads. */
|
|
12
|
+
export function isRetainedImageContentType(contentType: string): boolean {
|
|
13
|
+
return [
|
|
14
|
+
"image/png",
|
|
15
|
+
"image/jpeg",
|
|
16
|
+
"image/gif",
|
|
17
|
+
"image/webp",
|
|
18
|
+
"image/avif",
|
|
19
|
+
"image/svg+xml",
|
|
20
|
+
].includes(contentType);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** Deliberately published images are primary output, not incidental screenshots. */
|
|
24
|
+
export function activityPresentsImage(items: readonly ActivityItem[]): boolean {
|
|
25
|
+
return items.some((item) => {
|
|
26
|
+
if (item.kind !== "tool-call") return false;
|
|
27
|
+
const name = mcpToolLeaf(item.name);
|
|
28
|
+
if (name === "generate_image" || name === "image_generation_call") return true;
|
|
29
|
+
if (item.status !== "complete" || name !== "sandbox_file_publish") return false;
|
|
30
|
+
const output = normalizeMcpOutput(item.output);
|
|
31
|
+
if (output.isError) return false;
|
|
32
|
+
const receipt = parseSandboxFileArtifactReceipt(output.text);
|
|
33
|
+
return receipt !== null && isRetainedImageContentType(receipt.artifact.contentType);
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function timelineGroupContainsPresentedImage(group: TimelineGroup): boolean {
|
|
38
|
+
switch (group.kind) {
|
|
39
|
+
case "item":
|
|
40
|
+
return false;
|
|
41
|
+
case "activity":
|
|
42
|
+
return (
|
|
43
|
+
activityPresentsImage(group.items) ||
|
|
44
|
+
(group.work?.details?.some(timelineGroupContainsPresentedImage) ?? false)
|
|
45
|
+
);
|
|
46
|
+
case "turn":
|
|
47
|
+
return group.groups.some(timelineGroupContainsPresentedImage);
|
|
48
|
+
}
|
|
49
|
+
}
|