@opengeni/react 2.5.0-canary.2 → 3.0.1-canary.38817070914001
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 +784 -22
- package/dist/accounts.d.ts +64 -0
- package/dist/accounts.js +824 -0
- package/dist/accounts.js.map +1 -0
- package/dist/approvals.d.ts +2 -1
- package/dist/artifacts-document.js +5 -3
- package/dist/artifacts-presentation.js +5 -3
- package/dist/artifacts-spreadsheet.d.ts +1 -1
- package/dist/artifacts-spreadsheet.js +5 -3
- package/dist/artifacts.d.ts +5 -1
- package/dist/artifacts.js +536 -42
- package/dist/artifacts.js.map +1 -1
- package/dist/browser-viewer-M7BIVFTW.js +19 -0
- package/dist/capability-catalog-row.d.ts +20 -0
- package/dist/capability-logo-fallback.d.ts +3 -0
- package/dist/chat-interactive-block-BO2IWXVK.js +14 -0
- package/dist/chunk-2DDJ6YH6.js +41 -0
- package/dist/chunk-2DDJ6YH6.js.map +1 -0
- package/dist/chunk-2HVLQ26H.js +183 -0
- package/dist/chunk-2HVLQ26H.js.map +1 -0
- package/dist/chunk-3PVDYTTB.js +24 -0
- package/dist/chunk-3PVDYTTB.js.map +1 -0
- package/dist/chunk-3UZCWK46.js +298 -0
- package/dist/chunk-3UZCWK46.js.map +1 -0
- package/dist/chunk-47CKUXTW.js +293 -0
- package/dist/chunk-47CKUXTW.js.map +1 -0
- package/dist/chunk-4QYP6QUI.js +109 -0
- package/dist/chunk-4QYP6QUI.js.map +1 -0
- package/dist/chunk-5EY26VZ7.js +1053 -0
- package/dist/chunk-5EY26VZ7.js.map +1 -0
- package/dist/chunk-5I4VRWBB.js +56 -0
- package/dist/chunk-5I4VRWBB.js.map +1 -0
- package/dist/chunk-5WOR7UCL.js +191 -0
- package/dist/chunk-5WOR7UCL.js.map +1 -0
- package/dist/chunk-5XEXTWEM.js +1911 -0
- package/dist/chunk-5XEXTWEM.js.map +1 -0
- package/dist/chunk-5YJLGOM5.js +51 -0
- package/dist/chunk-5YJLGOM5.js.map +1 -0
- package/dist/chunk-6JFN3OWG.js +386 -0
- package/dist/chunk-6JFN3OWG.js.map +1 -0
- package/dist/chunk-6SNDCUPB.js +83 -0
- package/dist/chunk-6SNDCUPB.js.map +1 -0
- package/dist/chunk-7QJT5O4S.js +35 -0
- package/dist/chunk-7QJT5O4S.js.map +1 -0
- package/dist/chunk-A55KV72M.js +402 -0
- package/dist/chunk-A55KV72M.js.map +1 -0
- package/dist/chunk-B27E3V37.js +29 -0
- package/dist/chunk-B27E3V37.js.map +1 -0
- package/dist/chunk-BOFEQC6K.js +162 -0
- package/dist/chunk-BOFEQC6K.js.map +1 -0
- package/dist/chunk-CM7LVUKC.js +35 -0
- package/dist/chunk-CM7LVUKC.js.map +1 -0
- package/dist/chunk-CORUP6JB.js +122 -0
- package/dist/chunk-CORUP6JB.js.map +1 -0
- package/dist/chunk-CSX5FFKZ.js +35 -0
- package/dist/chunk-CSX5FFKZ.js.map +1 -0
- package/dist/chunk-EGVHJKGJ.js +3125 -0
- package/dist/chunk-EGVHJKGJ.js.map +1 -0
- package/dist/{chunk-NEXLLTP4.js → chunk-G76LSA76.js} +6 -5
- package/dist/chunk-G76LSA76.js.map +1 -0
- package/dist/{chunk-PEI6RANI.js → chunk-GQMRL52F.js} +311 -75
- package/dist/chunk-GQMRL52F.js.map +1 -0
- package/dist/{chunk-QGBJ6GHG.js → chunk-GUUXOISA.js} +1113 -457
- package/dist/chunk-GUUXOISA.js.map +1 -0
- package/dist/{chunk-MXJGO7LE.js → chunk-HGKELH6Z.js} +1178 -115
- package/dist/chunk-HGKELH6Z.js.map +1 -0
- package/dist/{chunk-HUIKIDM5.js → chunk-I7X2P4FU.js} +225 -116
- package/dist/chunk-I7X2P4FU.js.map +1 -0
- package/dist/chunk-IGFZFLI2.js +1390 -0
- package/dist/chunk-IGFZFLI2.js.map +1 -0
- package/dist/{chunk-4MDLEHXL.js → chunk-IMSUVYQB.js} +26 -13
- package/dist/chunk-IMSUVYQB.js.map +1 -0
- package/dist/chunk-IOYHDEP3.js +38 -0
- package/dist/chunk-IOYHDEP3.js.map +1 -0
- package/dist/{chunk-X4JAFD5R.js → chunk-ISN726VG.js} +1513 -697
- package/dist/chunk-ISN726VG.js.map +1 -0
- package/dist/chunk-IZV5FTJC.js +55 -0
- package/dist/chunk-IZV5FTJC.js.map +1 -0
- package/dist/chunk-KF33GTWN.js +343 -0
- package/dist/chunk-KF33GTWN.js.map +1 -0
- package/dist/chunk-KSGQ5ODA.js +457 -0
- package/dist/chunk-KSGQ5ODA.js.map +1 -0
- package/dist/chunk-KZENYIA2.js +382 -0
- package/dist/chunk-KZENYIA2.js.map +1 -0
- package/dist/chunk-LJUMYUBO.js +218 -0
- package/dist/chunk-LJUMYUBO.js.map +1 -0
- package/dist/chunk-LSW2OJVV.js +380 -0
- package/dist/chunk-LSW2OJVV.js.map +1 -0
- package/dist/chunk-M357MHH3.js +2 -0
- package/dist/chunk-M357MHH3.js.map +1 -0
- package/dist/chunk-N7S72EXK.js +25 -0
- package/dist/chunk-N7S72EXK.js.map +1 -0
- package/dist/chunk-NX4ADH73.js +14 -0
- package/dist/chunk-NX4ADH73.js.map +1 -0
- package/dist/chunk-O5GPRG76.js +3006 -0
- package/dist/chunk-O5GPRG76.js.map +1 -0
- package/dist/chunk-O7F6UJO4.js +71 -0
- package/dist/chunk-O7F6UJO4.js.map +1 -0
- package/dist/chunk-OYQQJL3J.js +16 -0
- package/dist/chunk-OYQQJL3J.js.map +1 -0
- package/dist/{chunk-H5YGYNXS.js → chunk-P4BNUO57.js} +60 -17
- package/dist/chunk-P4BNUO57.js.map +1 -0
- package/dist/{chunk-JVYQRRC4.js → chunk-PEHTX3V7.js} +21 -1
- package/dist/chunk-PEHTX3V7.js.map +1 -0
- package/dist/chunk-PMV53IMM.js +26 -0
- package/dist/chunk-PMV53IMM.js.map +1 -0
- package/dist/{chunk-ZUT5QSQB.js → chunk-PWCBMEV2.js} +4262 -3917
- package/dist/chunk-PWCBMEV2.js.map +1 -0
- package/dist/{chunk-KCGXPP5V.js → chunk-PYEOPA4M.js} +13 -7
- package/dist/chunk-PYEOPA4M.js.map +1 -0
- package/dist/{chunk-T7VAYG2I.js → chunk-Q26UAIXI.js} +257 -45
- package/dist/chunk-Q26UAIXI.js.map +1 -0
- package/dist/{chunk-KZ73RL76.js → chunk-QHUE7E4N.js} +8 -3
- package/dist/chunk-QHUE7E4N.js.map +1 -0
- package/dist/chunk-QV3DJVRZ.js +11 -0
- package/dist/chunk-QV3DJVRZ.js.map +1 -0
- package/dist/chunk-R5SBNG7S.js +810 -0
- package/dist/chunk-R5SBNG7S.js.map +1 -0
- package/dist/chunk-RI42H5IU.js +326 -0
- package/dist/chunk-RI42H5IU.js.map +1 -0
- package/dist/chunk-S2QH6EZ5.js +211 -0
- package/dist/chunk-S2QH6EZ5.js.map +1 -0
- package/dist/chunk-S5ZT4TBR.js +2028 -0
- package/dist/chunk-S5ZT4TBR.js.map +1 -0
- package/dist/chunk-SHLZMAJN.js +304 -0
- package/dist/chunk-SHLZMAJN.js.map +1 -0
- package/dist/chunk-TGXK4BAZ.js +293 -0
- package/dist/chunk-TGXK4BAZ.js.map +1 -0
- package/dist/{chunk-XXWH2JLC.js → chunk-TIHSXNBC.js} +616 -621
- package/dist/chunk-TIHSXNBC.js.map +1 -0
- package/dist/{chunk-5YK2ZDIG.js → chunk-TNEZNMSN.js} +4 -10
- package/dist/chunk-TNEZNMSN.js.map +1 -0
- package/dist/{chunk-22KP6LR5.js → chunk-TXS65BB2.js} +3 -1
- package/dist/{chunk-22KP6LR5.js.map → chunk-TXS65BB2.js.map} +1 -1
- package/dist/chunk-UNJPZGNK.js +63 -0
- package/dist/chunk-UNJPZGNK.js.map +1 -0
- package/dist/chunk-VIUEOHXY.js +394 -0
- package/dist/chunk-VIUEOHXY.js.map +1 -0
- package/dist/chunk-VWH3YAV7.js +14058 -0
- package/dist/chunk-VWH3YAV7.js.map +1 -0
- package/dist/{chunk-ICA6R6TW.js → chunk-WNN7NO2N.js} +1451 -355
- package/dist/chunk-WNN7NO2N.js.map +1 -0
- package/dist/chunk-XDA5QJE7.js +402 -0
- package/dist/chunk-XDA5QJE7.js.map +1 -0
- package/dist/{chunk-VZTQ73XT.js → chunk-XEA5BCMA.js} +3 -1
- package/dist/{chunk-VZTQ73XT.js.map → chunk-XEA5BCMA.js.map} +1 -1
- package/dist/chunk-XHF7OYAN.js +1150 -0
- package/dist/chunk-XHF7OYAN.js.map +1 -0
- package/dist/chunk-YSRBFJMQ.js +43 -0
- package/dist/chunk-YSRBFJMQ.js.map +1 -0
- package/dist/chunk-ZOZAPAUO.js +174 -0
- package/dist/chunk-ZOZAPAUO.js.map +1 -0
- package/dist/chunk-ZQV5W7YC.js +809 -0
- package/dist/chunk-ZQV5W7YC.js.map +1 -0
- package/dist/chunk-ZUWF4NF7.js +13 -0
- package/dist/chunk-ZUWF4NF7.js.map +1 -0
- package/dist/client.d.ts +16 -7
- package/dist/clipboard.js +3 -1
- package/dist/commands/types.d.ts +2 -0
- package/dist/components/anthropic-mark.d.ts +3 -0
- package/dist/components/approval-surface.d.ts +19 -6
- package/dist/components/artifacts/artifact-chrome.d.ts +120 -0
- package/dist/components/artifacts/artifact-sandbox.d.ts +30 -0
- package/dist/components/artifacts/artifact-surface.d.ts +4 -2
- 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 +48 -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 +8 -3
- package/dist/components/artifacts/index.d.ts +9 -2
- 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 +23 -3
- package/dist/components/artifacts/session-artifact-viewer.d.ts +39 -0
- package/dist/components/artifacts/site-view.d.ts +26 -0
- package/dist/components/artifacts/spreadsheet-command-queue.d.ts +20 -0
- package/dist/components/artifacts/spreadsheet-download.d.ts +7 -0
- package/dist/components/artifacts/spreadsheet-general-display.d.ts +24 -0
- package/dist/components/artifacts/spreadsheet-grid.d.ts +10 -3
- package/dist/components/artifacts/spreadsheet-resize.d.ts +50 -0
- package/dist/components/artifacts/spreadsheet-submissions.d.ts +9 -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 +11 -2
- package/dist/components/chat-composer.d.ts +21 -3
- package/dist/components/child-session-link.d.ts +9 -0
- package/dist/components/claude-mark.d.ts +3 -0
- package/dist/components/code-editor.d.ts +1 -4
- package/dist/components/composer-transcription-control.d.ts +7 -0
- package/dist/components/composer.d.ts +38 -63
- package/dist/components/computer-viewer.d.ts +1 -1
- package/dist/components/copy-button.d.ts +3 -1
- package/dist/components/desktop-viewer.d.ts +1 -1
- package/dist/components/file-browser.d.ts +4 -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 +28 -32
- package/dist/components/human-input-surface.d.ts +7 -2
- package/dist/components/linkified-text.d.ts +18 -0
- package/dist/components/machine-input-display.d.ts +22 -1
- package/dist/components/machines/agent-status-icon.d.ts +6 -0
- package/dist/components/machines/machine-detail.d.ts +7 -1
- package/dist/components/machines/machine-status.d.ts +48 -0
- package/dist/components/markdown-table-layout.d.ts +18 -0
- package/dist/components/markdown.d.ts +37 -4
- package/dist/components/message-timeline.d.ts +86 -7
- 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 +41 -25
- package/dist/components/new-conversation.d.ts +32 -0
- package/dist/components/open-geni-chat.d.ts +73 -0
- package/dist/components/open-geni-links.d.ts +68 -0
- package/dist/components/openrouter-mark.d.ts +6 -0
- package/dist/components/opper-mark.d.ts +7 -0
- package/dist/components/preview-loading.d.ts +2 -0
- package/dist/components/provider-recovery-notice.d.ts +16 -0
- package/dist/components/queue-item-content.d.ts +9 -0
- package/dist/components/rehype-secret-refs.d.ts +23 -0
- package/dist/components/remark-soft-line-breaks.d.ts +38 -0
- package/dist/components/sandbox-files.d.ts +6 -1
- package/dist/components/sandbox-workspace.d.ts +23 -0
- package/dist/components/secret-question-field.d.ts +31 -0
- package/dist/components/secret-ref-chip.d.ts +35 -0
- package/dist/components/session-capability-frame.d.ts +37 -0
- package/dist/components/session-chrome.d.ts +57 -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 +157 -0
- package/dist/components/session-list.d.ts +39 -0
- package/dist/components/session-mcp-capability-card.d.ts +41 -0
- package/dist/components/session-proxy-scope.d.ts +35 -0
- package/dist/components/session-status.d.ts +4 -1
- package/dist/components/session-usage-limit-notice.d.ts +39 -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/tool-action-review.d.ts +47 -0
- package/dist/components/tool-review-history.d.ts +25 -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/composer-messages.d.ts +74 -0
- package/dist/composer-messages.js +9 -0
- package/dist/composer-messages.js.map +1 -0
- package/dist/composer-voice-events.d.ts +8 -0
- package/dist/composer.d.ts +5 -4
- package/dist/composer.js +26 -13
- package/dist/computer-viewer-GMLDXPON.js +20 -0
- package/dist/computer-viewer-GMLDXPON.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 +18 -0
- package/dist/connect.d.ts +21 -0
- package/dist/connect.js +2149 -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 +27 -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 +15 -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 +22 -0
- package/dist/editor.js.map +1 -0
- package/dist/embedded-new-voice-OCRNT6U5.js +18 -0
- package/dist/embedded-new-voice-OCRNT6U5.js.map +1 -0
- package/dist/embedded-session-client.d.ts +23 -0
- package/dist/embedded-voice-RPHPYVBT.js +18 -0
- package/dist/embedded-voice-RPHPYVBT.js.map +1 -0
- package/dist/file-node-visibility.d.ts +15 -0
- package/dist/{fleet-decision-row-GGCAT4E4.js → fleet-decision-row-SI63O5V4.js} +4 -1
- package/dist/fleet-decision-row-SI63O5V4.js.map +1 -0
- package/dist/hooks/latest-question.d.ts +25 -0
- package/dist/hooks/shared-machines-list.d.ts +4 -0
- package/dist/hooks/shared-query.d.ts +113 -0
- package/dist/hooks/use-attached-browsers.d.ts +1 -1
- package/dist/hooks/use-auth-runs.d.ts +1 -4
- package/dist/hooks/use-available-models.d.ts +1 -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-client-config-flags.d.ts +49 -0
- package/dist/hooks/use-codex-accounts.d.ts +59 -10
- package/dist/hooks/use-composer.d.ts +24 -2
- 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 +4 -0
- package/dist/hooks/use-connect.d.ts +23 -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-goal.d.ts +2 -1
- package/dist/hooks/use-last-started-turn-policy.d.ts +5 -1
- package/dist/hooks/use-new-conversation.d.ts +56 -0
- package/dist/hooks/use-new-session-draft.d.ts +74 -0
- package/dist/hooks/use-realtime-voice-models.d.ts +7 -0
- package/dist/hooks/use-sandbox-files.d.ts +4 -1
- package/dist/hooks/use-session-conversation.d.ts +49 -0
- package/dist/hooks/use-session-events.d.ts +28 -7
- package/dist/hooks/use-session-mcp-approval-policy.d.ts +2 -2
- package/dist/hooks/use-session-model-account.d.ts +48 -0
- package/dist/hooks/use-supergrok-accounts.d.ts +7 -1
- package/dist/hooks/use-terminal-stream.d.ts +11 -5
- package/dist/hooks/use-usage.d.ts +40 -0
- package/dist/hooks/use-vaults.d.ts +53 -0
- package/dist/hooks/use-voice-input.d.ts +8 -1
- package/dist/hooks/use-workspace-edit.d.ts +4 -0
- package/dist/hooks/use-workspace-sessions.d.ts +22 -5
- package/dist/human-input-model.d.ts +122 -0
- 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 +85 -20
- package/dist/index.js +2371 -6544
- package/dist/index.js.map +1 -1
- package/dist/interaction.d.ts +1 -1
- package/dist/interaction.js +14 -24
- package/dist/interaction.js.map +1 -1
- package/dist/latest-question-CHE7E753.js +118 -0
- package/dist/latest-question-CHE7E753.js.map +1 -0
- package/dist/lib/clipboard.d.ts +7 -0
- package/dist/lib/error-message.d.ts +7 -0
- package/dist/lib/format.d.ts +58 -4
- package/dist/lib/host-theme.d.ts +77 -0
- package/dist/lib/interaction-errors.d.ts +3 -0
- package/dist/lib/menu-styles.d.ts +22 -0
- package/dist/lib/notify-observer.d.ts +2 -0
- package/dist/lib/pierre-diffs-loader.d.ts +20 -0
- package/dist/lib/provider-recovery.d.ts +55 -0
- package/dist/lib/terminal-input-readiness.d.ts +11 -0
- package/dist/lib/transient-retry.d.ts +25 -0
- package/dist/lib/workbench-peers.d.ts +36 -0
- package/dist/lib/xterm-theme.d.ts +7 -5
- package/dist/machines.js +9 -5
- package/dist/markdown-table-layout-3PV2UAAH.js +113 -0
- package/dist/markdown-table-layout-3PV2UAAH.js.map +1 -0
- package/dist/mcp-connection-status.d.ts +14 -0
- package/dist/model-mark-paths.d.ts +34 -0
- package/dist/model-mark-paths.js +16 -0
- package/dist/model-mark-paths.js.map +1 -0
- package/dist/model-picker-model.d.ts +111 -0
- package/dist/model-picker-model.js +25 -0
- package/dist/model-picker-model.js.map +1 -0
- package/dist/model-policy-picker-menu-7GJ5URPR.js +17 -0
- package/dist/model-policy-picker-menu-7GJ5URPR.js.map +1 -0
- package/dist/model-policy.d.ts +30 -3
- package/dist/model-policy.js +14 -1
- package/dist/native-previews.d.ts +28 -0
- package/dist/native-previews.js +82 -0
- package/dist/native-previews.js.map +1 -0
- package/dist/new-session-draft.d.ts +7 -0
- package/dist/new-session-draft.js +639 -0
- package/dist/new-session-draft.js.map +1 -0
- package/dist/notification-text.d.ts +27 -0
- package/dist/{noto-sans-arabic-loader-IA2T4X2A.js → noto-sans-arabic-loader-XSH2KYWJ.js} +3 -1
- package/dist/{noto-sans-arabic-loader-IA2T4X2A.js.map → noto-sans-arabic-loader-XSH2KYWJ.js.map} +1 -1
- package/dist/{noto-sans-jp-loader.generated-HFGLYBR3.js → noto-sans-jp-loader.generated-MR5L6V7K.js} +3 -1
- package/dist/{noto-sans-jp-loader.generated-HFGLYBR3.js.map → noto-sans-jp-loader.generated-MR5L6V7K.js.map} +1 -1
- package/dist/older-history.d.ts +3 -2
- package/dist/organization-model.d.ts +32 -0
- package/dist/organization-model.js +65 -0
- package/dist/organization-model.js.map +1 -0
- package/dist/{platform-activity-row-BJHUHXAT.js → platform-activity-row-5OCKOQWZ.js} +16 -78
- package/dist/platform-activity-row-5OCKOQWZ.js.map +1 -0
- package/dist/plugin-details.d.ts +14 -0
- package/dist/plugin-discovery.d.ts +25 -0
- package/dist/preview-loading-paint.d.ts +20 -0
- package/dist/provider.d.ts +25 -2
- package/dist/queue-presentation-model.d.ts +72 -0
- package/dist/queue-presentation-model.js +38 -0
- package/dist/queue-presentation-model.js.map +1 -0
- package/dist/{queue-surface-implementation-BSKUWHRI.js → queue-surface-implementation-GJBH7NKO.js} +65 -265
- package/dist/queue-surface-implementation-GJBH7NKO.js.map +1 -0
- package/dist/realtime/embedded-new-voice.d.ts +1 -0
- package/dist/realtime/embedded-voice.d.ts +1 -0
- package/dist/realtime/realtime-control.d.ts +4 -65
- package/dist/realtime/session-realtime.d.ts +78 -0
- package/dist/realtime.js +25 -1294
- package/dist/realtime.js.map +1 -1
- package/dist/sandbox-files-O27IPOZW.js +21 -0
- package/dist/sandbox-files-O27IPOZW.js.map +1 -0
- package/dist/sandbox-label-model.d.ts +30 -0
- package/dist/sandbox-label-model.js +20 -0
- package/dist/sandbox-label-model.js.map +1 -0
- package/dist/secret-reference-label.d.ts +14 -0
- package/dist/secrets-ui.d.ts +57 -0
- package/dist/session-agents-model.d.ts +10 -0
- package/dist/session-agents-model.js +25 -0
- package/dist/session-agents-model.js.map +1 -0
- package/dist/session-attention-model.d.ts +8 -0
- package/dist/session-attention-model.js +47 -0
- package/dist/session-attention-model.js.map +1 -0
- package/dist/session-auth-recommendation.d.ts +5 -0
- package/dist/session-capability-policy.d.ts +31 -0
- package/dist/session-feedback-model.d.ts +20 -0
- package/dist/session-feedback-model.js +56 -0
- package/dist/session-feedback-model.js.map +1 -0
- package/dist/session-list-model.d.ts +138 -0
- package/dist/session-list-model.js +274 -0
- package/dist/session-list-model.js.map +1 -0
- package/dist/session-realtime-7DJOIHQW.js +21 -0
- package/dist/session-realtime-7DJOIHQW.js.map +1 -0
- package/dist/session-realtime.d.ts +7 -0
- package/dist/session-realtime.js +19 -0
- package/dist/session-realtime.js.map +1 -0
- package/dist/session-status-model.d.ts +36 -0
- package/dist/session-ui.d.ts +39 -1
- package/dist/session-ui.js +125 -12
- package/dist/session-ui.js.map +1 -1
- package/dist/session.d.ts +10 -2
- package/dist/session.js +37 -20
- package/dist/site-snapshot.d.ts +14 -0
- package/dist/sites-ui.d.ts +24 -0
- package/dist/sites.d.ts +3 -0
- package/dist/sites.js +14 -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 +32 -0
- package/dist/terminal.js.map +1 -0
- package/dist/testing/session-scenarios.d.ts +10 -0
- package/dist/testing/session-scenarios.js +367 -0
- package/dist/testing/session-scenarios.js.map +1 -0
- package/dist/timeline/activity-rail.d.ts +11 -2
- package/dist/timeline/agent-identity.d.ts +30 -0
- package/dist/timeline/agent-row.d.ts +31 -0
- package/dist/timeline/allowance-exhausted-row.d.ts +24 -0
- package/dist/timeline/compaction-copy.d.ts +46 -0
- package/dist/timeline/entrance.d.ts +13 -1
- package/dist/timeline/focus-sequence.d.ts +9 -0
- package/dist/timeline/genie-copy.d.ts +3 -0
- package/dist/timeline/genie-loading.d.ts +47 -0
- package/dist/timeline/index.d.ts +10 -4
- package/dist/timeline/knowledge-receipt.d.ts +17 -0
- package/dist/timeline/message-sender.d.ts +19 -0
- package/dist/timeline/notice-presentation.d.ts +13 -0
- package/dist/timeline/parsers.d.ts +11 -0
- package/dist/timeline/patch-apply-command.d.ts +18 -0
- package/dist/timeline/platform-activity-presentation.d.ts +21 -0
- package/dist/timeline/platform-activity-row.d.ts +1 -2
- package/dist/timeline/presented-image.d.ts +11 -0
- package/dist/timeline/projection.d.ts +31 -2
- package/dist/timeline/provider-logo.d.ts +15 -0
- package/dist/timeline/question-nav-model.d.ts +23 -0
- package/dist/timeline/registry.d.ts +12 -1
- package/dist/timeline/retained-image.d.ts +18 -0
- package/dist/timeline/retained-loaders.d.ts +27 -0
- package/dist/timeline/rolling-activity.d.ts +11 -0
- package/dist/timeline/screenshot-lightbox.d.ts +39 -2
- package/dist/timeline/session-usage-limit-row.d.ts +11 -0
- package/dist/timeline/shared.d.ts +4 -1
- package/dist/timeline/startup-dispatch-details.d.ts +5 -0
- 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 +5 -2
- package/dist/timeline/tool-presentation.d.ts +172 -0
- package/dist/timeline/turn-summary-model.d.ts +95 -0
- package/dist/timeline/turn-summary.d.ts +20 -54
- package/dist/timeline/types.d.ts +179 -7
- package/dist/timeline/work-presentation.d.ts +60 -0
- package/dist/timeline-annotation-markers-U3G66KUD.js +166 -0
- package/dist/timeline-annotation-markers-U3G66KUD.js.map +1 -0
- package/dist/timeline-annotation-selection-BI7QTPTZ.js +242 -0
- package/dist/timeline-annotation-selection-BI7QTPTZ.js.map +1 -0
- package/dist/timeline-annotations-dialog-FOMHSDTE.js +274 -0
- package/dist/timeline-annotations-dialog-FOMHSDTE.js.map +1 -0
- package/dist/timeline-model.d.ts +29 -0
- package/dist/timeline-model.js +254 -0
- package/dist/timeline-model.js.map +1 -0
- package/dist/usage/allowance-copy.d.ts +25 -0
- package/dist/usage/session-usage-limit.d.ts +88 -0
- package/dist/usage/summary.d.ts +35 -0
- package/dist/usage.d.ts +17 -0
- package/dist/usage.js +1187 -0
- package/dist/usage.js.map +1 -0
- package/dist/voice-recording-owner.d.ts +7 -0
- package/package.json +105 -5
- package/src/accounts.tsx +1072 -0
- package/src/approvals.ts +8 -1
- package/src/artifacts-spreadsheet.ts +1 -0
- package/src/artifacts.ts +44 -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 +20 -31
- 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 +401 -138
- package/src/components/artifacts/artifact-chrome.tsx +413 -0
- package/src/components/artifacts/artifact-sandbox.tsx +189 -0
- package/src/components/artifacts/artifact-surface.tsx +40 -20
- 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 +197 -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 +543 -103
- package/src/components/artifacts/index.ts +45 -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 +122 -5
- package/src/components/artifacts/session-artifact-viewer.tsx +378 -0
- package/src/components/artifacts/site-view.tsx +121 -0
- package/src/components/artifacts/spreadsheet-canvas.ts +5 -10
- package/src/components/artifacts/spreadsheet-command-queue.ts +184 -0
- package/src/components/artifacts/spreadsheet-download.tsx +109 -0
- package/src/components/artifacts/spreadsheet-general-display.ts +43 -0
- package/src/components/artifacts/spreadsheet-grid.tsx +344 -144
- package/src/components/artifacts/spreadsheet-resize.tsx +421 -0
- package/src/components/artifacts/spreadsheet-submissions.tsx +46 -0
- 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 +778 -318
- package/src/components/chat-composer.tsx +131 -85
- package/src/components/child-session-link.tsx +36 -0
- package/src/components/claude-mark.tsx +11 -0
- package/src/components/code-editor.tsx +13 -16
- package/src/components/composer-transcription-control.tsx +128 -30
- package/src/components/composer.tsx +426 -175
- package/src/components/computer-viewer.tsx +880 -253
- package/src/components/copy-button.tsx +13 -5
- package/src/components/desktop-viewer.tsx +1 -1
- package/src/components/enrollment-consent.tsx +1 -1
- package/src/components/enrollment-device-flow.tsx +1 -1
- package/src/components/file-browser.tsx +43 -34
- package/src/components/fleet-tile.tsx +9 -18
- package/src/components/generated-video-player.tsx +4 -2
- package/src/components/grok-mark.tsx +34 -0
- package/src/components/human-input-form.tsx +590 -283
- package/src/components/human-input-surface.tsx +21 -6
- package/src/components/interaction-intervention-banner.tsx +2 -2
- package/src/components/linkified-text.tsx +79 -0
- package/src/components/machine-card.tsx +35 -78
- package/src/components/machine-dock-bar.tsx +1 -1
- package/src/components/machine-input-display.ts +197 -3
- package/src/components/machines/agent-status-icon.tsx +31 -0
- package/src/components/machines/machine-detail.tsx +200 -31
- package/src/components/machines/machine-operation-policy.tsx +1 -1
- package/src/components/machines/machine-status.ts +241 -0
- package/src/components/machines-dashboard.tsx +2 -17
- package/src/components/markdown-table-layout.ts +143 -0
- package/src/components/markdown.tsx +466 -129
- package/src/components/message-timeline.tsx +2601 -734
- package/src/components/model-mark.tsx +102 -0
- package/src/components/model-picker.tsx +15 -4
- package/src/components/model-policy-picker-menu.tsx +371 -0
- package/src/components/model-policy-picker.tsx +256 -412
- package/src/components/new-conversation.tsx +221 -0
- package/src/components/open-geni-chat.tsx +309 -0
- package/src/components/open-geni-links.tsx +179 -0
- package/src/components/openrouter-mark.tsx +13 -0
- package/src/components/opper-mark.tsx +18 -0
- package/src/components/pierre-diff.tsx +41 -16
- package/src/components/pierre-file.tsx +35 -10
- package/src/components/preview-loading.tsx +109 -0
- package/src/components/provider-recovery-notice.tsx +49 -0
- package/src/components/queue-item-content.ts +14 -0
- package/src/components/queue-surface-implementation.tsx +51 -356
- package/src/components/queue-surface-state.tsx +3 -1
- package/src/components/rehype-secret-refs.ts +98 -0
- package/src/components/remark-soft-line-breaks.ts +166 -0
- package/src/components/sandbox-files.tsx +133 -17
- package/src/components/sandbox-terminal.tsx +84 -13
- package/src/components/sandbox-workspace.tsx +157 -51
- package/src/components/secret-question-field.tsx +324 -0
- package/src/components/secret-ref-chip.tsx +185 -0
- package/src/components/session-capability-frame.tsx +197 -0
- package/src/components/session-chrome.tsx +842 -251
- 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 +876 -0
- package/src/components/session-list.tsx +257 -0
- package/src/components/session-mcp-capability-card.tsx +680 -0
- package/src/components/session-proxy-scope.tsx +153 -0
- package/src/components/session-status.tsx +26 -17
- package/src/components/session-usage-limit-notice.tsx +174 -0
- 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 +52 -0
- package/src/components/tool-action-review.tsx +650 -0
- package/src/components/tool-review-history.tsx +88 -0
- 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 +27 -2
- package/src/components/workspace-dock.tsx +18 -1
- package/src/composer-messages.ts +150 -0
- package/src/composer-voice-events.ts +12 -0
- 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 +355 -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 +238 -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/internal.ts +3 -2
- package/src/hooks/latest-question.ts +164 -0
- package/src/hooks/shared-machines-list.ts +34 -1
- package/src/hooks/shared-query.ts +721 -0
- package/src/hooks/use-attached-browsers.ts +1 -1
- package/src/hooks/use-auth-runs.ts +0 -27
- package/src/hooks/use-available-models.ts +21 -15
- package/src/hooks/use-browser-frame-stream.ts +19 -2
- package/src/hooks/use-browser-session.ts +680 -205
- package/src/hooks/use-browser-sessions.ts +32 -1
- package/src/hooks/use-client-config-flags.ts +118 -0
- package/src/hooks/use-codex-accounts.ts +247 -47
- package/src/hooks/use-composer.ts +340 -49
- package/src/hooks/use-computer-frame-stream.ts +25 -7
- package/src/hooks/use-computer-input-posture.ts +94 -0
- package/src/hooks/use-computer-session.ts +409 -95
- 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 +107 -13
- package/src/hooks/use-human-input.ts +31 -4
- package/src/hooks/use-last-started-turn-policy.ts +46 -14
- package/src/hooks/use-machines.ts +4 -0
- package/src/hooks/use-new-conversation.ts +374 -0
- package/src/hooks/use-new-session-draft.ts +813 -0
- package/src/hooks/use-realtime-voice-models.ts +46 -0
- package/src/hooks/use-sandbox-files.ts +68 -20
- package/src/hooks/use-session-background-commands.ts +22 -11
- package/src/hooks/use-session-capabilities.ts +3 -2
- package/src/hooks/use-session-conversation.ts +150 -0
- package/src/hooks/use-session-events.ts +703 -382
- package/src/hooks/use-session-lineage.ts +20 -16
- package/src/hooks/use-session-mcp-approval-policy.ts +13 -5
- package/src/hooks/use-session-model-account.ts +174 -0
- package/src/hooks/use-session.ts +53 -21
- package/src/hooks/use-slash-commands.ts +6 -11
- package/src/hooks/use-supergrok-accounts.ts +22 -8
- package/src/hooks/use-terminal-stream.ts +153 -27
- package/src/hooks/use-transcription.ts +6 -0
- package/src/hooks/use-turn-queue.ts +2 -1
- package/src/hooks/use-usage.ts +100 -0
- package/src/hooks/use-vaults.ts +153 -0
- package/src/hooks/use-video-artifact-playback.ts +1 -1
- package/src/hooks/use-voice-input.ts +127 -19
- 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 +97 -32
- package/src/human-input-model.ts +359 -0
- 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 +273 -16
- package/src/interaction.ts +1 -0
- package/src/lib/clipboard.ts +29 -0
- package/src/lib/error-message.ts +37 -0
- package/src/lib/format.ts +213 -16
- package/src/lib/host-theme.ts +524 -0
- package/src/lib/interaction-errors.ts +15 -0
- package/src/lib/menu-styles.ts +44 -0
- package/src/lib/notify-observer.ts +15 -0
- package/src/lib/pierre-diffs-loader.ts +53 -0
- package/src/lib/provider-recovery.ts +240 -0
- package/src/lib/terminal-input-readiness.ts +51 -0
- package/src/lib/transient-retry.ts +99 -0
- package/src/lib/workbench-peers.ts +62 -0
- package/src/lib/xterm-theme.ts +23 -21
- package/src/mcp-connection-status.ts +35 -0
- package/src/model-mark-paths.ts +53 -0
- package/src/model-picker-model.ts +330 -0
- package/src/model-policy.ts +299 -74
- package/src/native-previews.ts +100 -0
- package/src/new-session-draft.ts +22 -0
- package/src/notification-text.ts +81 -0
- package/src/older-history.ts +22 -4
- package/src/organization-model.ts +118 -0
- package/src/plugin-details.tsx +185 -0
- package/src/plugin-discovery.tsx +196 -0
- package/src/preview-loading-paint.ts +68 -0
- package/src/provider.tsx +74 -15
- package/src/queue-presentation-model.ts +464 -0
- package/src/realtime/dropdown-menu.tsx +19 -12
- package/src/realtime/embedded-new-voice.tsx +1 -0
- package/src/realtime/embedded-voice.tsx +3 -0
- package/src/realtime/realtime-control.tsx +138 -501
- package/src/realtime/session-realtime.ts +566 -0
- package/src/sandbox-label-model.ts +53 -0
- package/src/secret-reference-label.ts +43 -0
- package/src/secrets-ui.tsx +59 -0
- package/src/session-agents-model.ts +33 -0
- package/src/session-attention-model.ts +62 -0
- package/src/session-auth-recommendation.ts +48 -0
- package/src/session-capability-policy.ts +196 -0
- package/src/session-context.ts +3 -4
- package/src/session-feedback-model.ts +95 -0
- package/src/session-list-model.ts +434 -0
- package/src/session-realtime.ts +18 -0
- package/src/session-status-model.ts +99 -0
- package/src/session-ui.ts +98 -1
- package/src/session.ts +22 -1
- package/src/site-snapshot.ts +74 -0
- package/src/sites-ui.tsx +348 -0
- package/src/sites.ts +3 -0
- package/src/skill-discovery.tsx +208 -0
- package/src/terminal.ts +26 -0
- package/src/testing/session-scenarios.ts +404 -0
- package/src/timeline/activity-rail.tsx +242 -101
- package/src/timeline/agent-identity.tsx +84 -0
- package/src/timeline/agent-row.tsx +231 -0
- package/src/timeline/allowance-exhausted-row.tsx +86 -0
- package/src/timeline/compaction-copy.ts +115 -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/focus-sequence.ts +44 -0
- package/src/timeline/genie-copy.ts +19 -0
- package/src/timeline/genie-loading.tsx +143 -0
- package/src/timeline/index.ts +30 -1
- package/src/timeline/knowledge-receipt.tsx +100 -0
- package/src/timeline/message-sender.tsx +71 -0
- package/src/timeline/notice-presentation.ts +48 -0
- package/src/timeline/parsers.ts +42 -2
- package/src/timeline/patch-apply-command.tsx +135 -0
- package/src/timeline/platform-activity-presentation.ts +166 -0
- package/src/timeline/platform-activity-row.tsx +15 -90
- package/src/timeline/presented-image.ts +63 -0
- package/src/timeline/projection.ts +1743 -76
- package/src/timeline/provider-logo.tsx +53 -0
- package/src/timeline/question-nav-model.ts +28 -0
- package/src/timeline/registry.ts +26 -4
- package/src/timeline/retained-image.ts +97 -0
- package/src/timeline/retained-loaders.ts +91 -0
- package/src/timeline/rolling-activity.tsx +80 -0
- package/src/timeline/screenshot-lightbox.tsx +319 -32
- package/src/timeline/session-usage-limit-row.tsx +42 -0
- package/src/timeline/shared.tsx +42 -15
- package/src/timeline/startup-dispatch-details.tsx +36 -0
- package/src/timeline/startup-preference.ts +33 -0
- package/src/timeline/startup-timings.tsx +145 -0
- package/src/timeline/tool-display-name.ts +19 -7
- package/src/timeline/tool-presentation.ts +1316 -0
- package/src/timeline/tool-renderers.tsx +835 -1138
- package/src/timeline/turn-summary-model.ts +343 -0
- package/src/timeline/turn-summary.tsx +272 -365
- package/src/timeline/types.ts +189 -6
- package/src/timeline/work-presentation.ts +189 -0
- package/src/timeline-model.ts +143 -0
- package/src/usage/allowance-copy.ts +64 -0
- package/src/usage/session-usage-limit.ts +266 -0
- package/src/usage/summary.ts +93 -0
- package/src/usage.ts +70 -0
- package/src/voice-recording-owner.ts +22 -0
- package/styles/compiled.css +2303 -745
- package/styles/connect.css +290 -0
- package/styles/connect.d.ts +1 -0
- package/styles/effective-tokens.css +1 -0
- package/styles/index.css +278 -9
- package/styles/responsive.css +99 -7
- package/styles/session-capability.css +44 -0
- package/styles/tokens.css +136 -66
- package/dist/browser-viewer-GXUICIAG.js +0 -14
- package/dist/chunk-4MDLEHXL.js.map +0 -1
- package/dist/chunk-5YK2ZDIG.js.map +0 -1
- package/dist/chunk-6H6S5V4Z.js +0 -9571
- package/dist/chunk-6H6S5V4Z.js.map +0 -1
- package/dist/chunk-ATQJEWCA.js +0 -2263
- package/dist/chunk-ATQJEWCA.js.map +0 -1
- package/dist/chunk-FK6VG4LL.js +0 -90
- package/dist/chunk-FK6VG4LL.js.map +0 -1
- package/dist/chunk-H5YGYNXS.js.map +0 -1
- package/dist/chunk-HUIKIDM5.js.map +0 -1
- package/dist/chunk-ICA6R6TW.js.map +0 -1
- package/dist/chunk-JVYQRRC4.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-MXJGO7LE.js.map +0 -1
- package/dist/chunk-NEXLLTP4.js.map +0 -1
- package/dist/chunk-PEI6RANI.js.map +0 -1
- package/dist/chunk-QGBJ6GHG.js.map +0 -1
- package/dist/chunk-T7VAYG2I.js.map +0 -1
- package/dist/chunk-W6NFJXSA.js +0 -454
- package/dist/chunk-W6NFJXSA.js.map +0 -1
- package/dist/chunk-WSK7G5LE.js +0 -170
- package/dist/chunk-WSK7G5LE.js.map +0 -1
- package/dist/chunk-X4A66EWZ.js +0 -223
- package/dist/chunk-X4A66EWZ.js.map +0 -1
- package/dist/chunk-X4JAFD5R.js.map +0 -1
- package/dist/chunk-XXWH2JLC.js.map +0 -1
- package/dist/chunk-ZUT5QSQB.js.map +0 -1
- package/dist/computer-viewer-ZOP4Q7A7.js +0 -16
- package/dist/fleet-decision-row-GGCAT4E4.js.map +0 -1
- package/dist/hooks/use-environments.d.ts +0 -41
- package/dist/hooks/use-packs.d.ts +0 -32
- package/dist/platform-activity-row-BJHUHXAT.js.map +0 -1
- package/dist/queue-surface-implementation-BSKUWHRI.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-environments.ts +0 -182
- package/src/hooks/use-packs.ts +0 -157
- /package/dist/{browser-viewer-GXUICIAG.js.map → browser-viewer-M7BIVFTW.js.map} +0 -0
- /package/dist/{computer-viewer-ZOP4Q7A7.js.map → chat-interactive-block-BO2IWXVK.js.map} +0 -0
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @opengeni/react
|
|
2
2
|
|
|
3
|
-
React hooks and styled components for
|
|
3
|
+
React hooks and styled components for Opengeni, built on
|
|
4
4
|
[`@opengeni/sdk`](../sdk): live session streaming, a chat composer, a message
|
|
5
5
|
timeline that renders streaming deltas / tool calls / spawned-worker status,
|
|
6
6
|
session status badges, and fleet tiles for workspace overviews. Two opt-in
|
|
@@ -19,11 +19,308 @@ island for back-compat, deprecated per #144.)
|
|
|
19
19
|
|
|
20
20
|
Design-system-first: every visual decision routes through CSS-variable tokens
|
|
21
21
|
(`styles/tokens.css`) — color, typography, radius, shadow, motion. Dark mode is
|
|
22
|
-
the first-class default; light is an opt-in via `data-og-theme="light"` on
|
|
23
|
-
ancestor.
|
|
22
|
+
the first-class token default; light is an opt-in via `data-og-theme="light"` on
|
|
23
|
+
any ancestor. The embedded chat roots (`OpenGeniChat`, `SessionConversation`)
|
|
24
|
+
resolve light or dark from the host page instead; see
|
|
25
|
+
[Conversation UI](#conversation-ui). Components are styled with Tailwind v4 utilities mapped onto the
|
|
24
26
|
tokens, Radix primitives for behavior, and Motion for state-communicating
|
|
25
27
|
animation. Override the tokens to rebrand everything.
|
|
26
28
|
|
|
29
|
+
## Embedded connections and Sites
|
|
30
|
+
|
|
31
|
+
For a child chat's capability selection, `prepareSessionCapabilityAccess` reads
|
|
32
|
+
an ancestor-to-child access plan without writing. Show the parent chats whose
|
|
33
|
+
`request` is non-null and obtain an explicit confirmation before calling
|
|
34
|
+
`applySessionCapabilityAccess`. The plan preserves existing choices, applies
|
|
35
|
+
version-fenced updates root first, and grants no authority: each ordinary API
|
|
36
|
+
request still authorizes its caller. Invalidate the review on actor/workspace
|
|
37
|
+
changes. A partial failure may leave approved parent changes saved; prepare a
|
|
38
|
+
new plan for retry instead of rolling them back. Existing
|
|
39
|
+
`attachSessionCapability` remains a single-chat operation and never changes
|
|
40
|
+
parents implicitly.
|
|
41
|
+
|
|
42
|
+
Optional `@opengeni/react/connect` exports `useConnect`, `ConnectChooser`,
|
|
43
|
+
`ConnectSetup`, `ConnectAccounts`, and the composed `ConnectPanel`. Inject one
|
|
44
|
+
`@opengeni/connect` controller per authenticated actor/workspace and dispose it
|
|
45
|
+
when that scope changes. The controller uses your authenticated backend proxy;
|
|
46
|
+
never place an organization key in browser props. Import
|
|
47
|
+
`@opengeni/react/connect.css` for opt-in, scoped styles without Tailwind.
|
|
48
|
+
`DeviceAuthorization` also accepts an optional `render` callback for host presentation;
|
|
49
|
+
it receives shared copy state, the copy action, and the validated verification URL.
|
|
50
|
+
Omitting it preserves the default embedded presentation.
|
|
51
|
+
|
|
52
|
+
`CapabilityCatalogRow` gives connections, skills, and plugins one consistent
|
|
53
|
+
icon/name/description button with a decorative plus/check and visible exception
|
|
54
|
+
states. Supply `onOpen` and an explicit `status`; the host owns setup and
|
|
55
|
+
installation. `ConnectionCatalog` accepts the same states through each option's
|
|
56
|
+
`state`. Older callers that omit `state` keep their visible status labels, so
|
|
57
|
+
provider warnings are not hidden during migration.
|
|
58
|
+
|
|
59
|
+
`PluginDiscovery` accepts `defaultProvider="openai"` or `"anthropic"` to choose
|
|
60
|
+
the initial registry. Omitting it starts with All. Users can still switch among
|
|
61
|
+
All, OpenAI, and Anthropic; changing the search preserves their selection. The
|
|
62
|
+
Opengeni Plugins page starts with OpenAI.
|
|
63
|
+
|
|
64
|
+
```tsx
|
|
65
|
+
import { ConnectPanel } from "@opengeni/react/connect";
|
|
66
|
+
import "@opengeni/react/connect.css";
|
|
67
|
+
|
|
68
|
+
<ConnectPanel
|
|
69
|
+
controller={controller}
|
|
70
|
+
returnUrl={hostSelectedReturnUrl}
|
|
71
|
+
onAuthorize={hostAuthorizeFromClick}
|
|
72
|
+
/>;
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
The host owns synchronous popup/full-redirect navigation and pending-attempt
|
|
76
|
+
recovery. Backend state, not a popup message or URL query, proves completion.
|
|
77
|
+
Operation installation uses explicit selection; OAuth success alone is not
|
|
78
|
+
installation. Account disconnect requires an observed version and confirmation,
|
|
79
|
+
revokes local Opengeni access only, and never silently retries an unknown outcome.
|
|
80
|
+
Provider readiness is deployment-dependent; use the server catalog rather than
|
|
81
|
+
assuming every OAuth application or operator-managed provider is configured.
|
|
82
|
+
|
|
83
|
+
Optional `@opengeni/react/sites` exports `SiteList`, `SiteDetail`, and `SiteClient`.
|
|
84
|
+
Pass the public SDK client through your host proxy. `onOpen` owns list
|
|
85
|
+
navigation. Authoring buttons and prompts belong to the host and use the ordinary
|
|
86
|
+
session SDK; they are not part of the Site component API. `SiteDetail` reuses `PublishedHtmlArtifactFrame`, accepts
|
|
87
|
+
an optional authenticated/filtered tool bridge, and removes the frame after
|
|
88
|
+
read-authority refresh failure. Loaded Sites revalidate every 15 seconds;
|
|
89
|
+
downloaded HTML cannot be recalled and every tool call still needs live authority.
|
|
90
|
+
|
|
91
|
+
`canPublish` is only a presentation hint. Version-checked rollback/archive/restore
|
|
92
|
+
remain subject to backend `artifacts:publish` permission. Sites stay workspace
|
|
93
|
+
shared, even if a source session is private. See
|
|
94
|
+
[`examples/embedded-product`](../../examples/embedded-product/README.md) for the
|
|
95
|
+
runnable loopback host reference. Native route reuse and full visual acceptance
|
|
96
|
+
are not implied by these optional package surfaces.
|
|
97
|
+
## Conversation UI
|
|
98
|
+
|
|
99
|
+
For an account-aware header, `useLastStartedTurnPolicy(sessionId, { events,
|
|
100
|
+
includeServingModel: true })` overlays the latest lease-backed serving receipt
|
|
101
|
+
only when it belongs to the last started turn. This requires the optional
|
|
102
|
+
`getSessionModelAccount` client method. Without the option, the hook continues
|
|
103
|
+
to return the accepted turn policy. Neither mode changes the composer's
|
|
104
|
+
preferred model. `useSessionModelAccount` reads authorized accounts and choices;
|
|
105
|
+
pass `provider` so Automatic resets only that provider's choice. Its optional
|
|
106
|
+
`choice.serving` is the last committed placement, not a queued next-turn choice.
|
|
107
|
+
The timeline renders neutral account-switch events without exposing account
|
|
108
|
+
identity or duplicating provider compatibility events.
|
|
109
|
+
|
|
110
|
+
`OpenGeniChat` and `SessionConversation` are the default product integration.
|
|
111
|
+
Back them with `createSessionProxyHandler` from `@opengeni/sdk`, mounted on your
|
|
112
|
+
server, and pass its mount as `baseUrl`. No provider, client, or workspace id
|
|
113
|
+
is needed: the component creates the browser client and uses the workspace the
|
|
114
|
+
proxy resolved for the signed-in user (from the proxy's client config).
|
|
115
|
+
|
|
116
|
+
```tsx
|
|
117
|
+
import "@opengeni/react/compiled.css";
|
|
118
|
+
|
|
119
|
+
<OpenGeniChat baseUrl="/api/opengeni" />;
|
|
120
|
+
// or one conversation: <SessionConversation baseUrl="/api/opengeni" sessionId={sessionId} />
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Bearer-token apps pass `headers` (a function runs per request) or a custom
|
|
124
|
+
`fetch`; a `client` passed with `baseUrl` replaces the one the component
|
|
125
|
+
creates:
|
|
126
|
+
|
|
127
|
+
```tsx
|
|
128
|
+
<OpenGeniChat baseUrl="/api/opengeni" headers={() => ({ Authorization: `Bearer ${getToken()}` })} />
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
The provider form keeps working, for example for several components sharing one
|
|
132
|
+
client or the headless hooks:
|
|
133
|
+
|
|
134
|
+
```tsx
|
|
135
|
+
<OpenGeniProvider client={new OpenGeniClient({ baseUrl: "/api/opengeni" })} workspaceId={workspaceId}>
|
|
136
|
+
<SessionConversation sessionId={sessionId} />
|
|
137
|
+
</OpenGeniProvider>
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
Compose `MessageTimeline` and `ChatComposer` with the session hooks only when
|
|
141
|
+
the product needs a materially different interaction model. These components do
|
|
142
|
+
not consume the text-only `@opengeni/sdk/chat` fallback protocol.
|
|
143
|
+
|
|
144
|
+
`OpenGeniChat` adds the user's chat list to the conversation: a sidebar when
|
|
145
|
+
the component is wide and a drawer behind a menu button when narrow (measured on
|
|
146
|
+
its own container, so it works inside panels), a new-chat composer that creates
|
|
147
|
+
the session from its first message, and inline rename and archive. It is
|
|
148
|
+
composed from `SessionList` and `SessionConversation`, which you can also mount
|
|
149
|
+
separately. Pass `conversationProps` for message rendering and tool renderers,
|
|
150
|
+
`createSession` to create chats through your own endpoint, or `sessionId` /
|
|
151
|
+
`onSessionChange` to control the selection (for example from the URL).
|
|
152
|
+
|
|
153
|
+
Live voice is opt-in, because a call spends your credits and asks the browser
|
|
154
|
+
for the microphone. Turn it on with `realtimeVoice={true}` (via `OpenGeniChat`'s
|
|
155
|
+
`conversationProps` too) or `createSessionProxyHandler({ realtimeVoice: true })`.
|
|
156
|
+
The composer then shows a voice button when the workspace offers an available
|
|
157
|
+
voice model (for example hosted GPT Live with credits): the user talks, the
|
|
158
|
+
voice model answers and hands work to the agent in the same chat, and the
|
|
159
|
+
transcript lands in the timeline. It stays hidden when no model is available,
|
|
160
|
+
when the proxy sets `realtimeVoice: false`, or when you pass
|
|
161
|
+
`realtimeVoice={false}`. The voice code loads lazily on first display.
|
|
162
|
+
|
|
163
|
+
The working indicator before the first reply says "Thinking…". Pass
|
|
164
|
+
`genieLoading` (`phrases`, `messages`, `orb`, or a whole `render`) to use your
|
|
165
|
+
own copy or visual. File attachments follow the proxy: it reports them off when
|
|
166
|
+
`files: false`, and for anonymous visitors (`visitor: true` from `resolve`)
|
|
167
|
+
unless it sets `visitorUploads: true`.
|
|
168
|
+
|
|
169
|
+
`SessionConversation` and `OpenGeniChat` are built to look native inside
|
|
170
|
+
someone else's product with zero styling:
|
|
171
|
+
|
|
172
|
+
- **Theme follows the host**, not the OS: an enclosing `data-og-theme`, then
|
|
173
|
+
`class="dark"`/`data-theme` (and similar) on `<html>`/`<body>`, the host's
|
|
174
|
+
`color-scheme`, then the luminance of the background the chat sits on. Pass
|
|
175
|
+
`theme="light" | "dark"` to force one.
|
|
176
|
+
- **Surfaces blend into the host** (`surface="host"`, default): backgrounds and
|
|
177
|
+
cards are opaque mixes of the host background, so a navy app gets navy cards.
|
|
178
|
+
Host-customized `--og-color-*` tokens are kept; `surface="theme"` uses the
|
|
179
|
+
token surfaces as they are.
|
|
180
|
+
- **Run control is Stop, not Pause**: a Stop control appears only while a
|
|
181
|
+
response runs, and the next message continues a stopped conversation. Opt
|
|
182
|
+
into the console's workstream Pause with `composerProps={{ runControl: "pause" }}`
|
|
183
|
+
(`"none"` hides both).
|
|
184
|
+
- **No model picker by default**: end users rarely choose models. Pass
|
|
185
|
+
`modelPicker`, or report `modelSelection: true` from the proxy
|
|
186
|
+
(`createSessionProxyHandler({ modelSelection: true })`); `modelSelection: false`
|
|
187
|
+
also fixes the policy server-side.
|
|
188
|
+
|
|
189
|
+
Attachments appear when the deployment enables uploads (`attachments={false}`
|
|
190
|
+
opts out), the microphone appears when it reports voice input available
|
|
191
|
+
(`voiceInput={false}` opts out), generated images, video, published files and
|
|
192
|
+
screenshots display through the conversation's session scope, actions a
|
|
193
|
+
session proxy reports unavailable (`sessionCreation`, `archive`, `artifacts`)
|
|
194
|
+
are hidden, the session goal shows with Pause/Resume/Clear, sub-agent cards
|
|
195
|
+
open the child through `onOpenSession` (`OpenGeniChat` opens it in place),
|
|
196
|
+
pending tool approvals render Approve/Reject, a yes/no question
|
|
197
|
+
renders as two buttons, a failed load offers Try again, and `toolRegistry`
|
|
198
|
+
customizes tool rendering.
|
|
199
|
+
|
|
200
|
+
The root keeps all existing exports, including workbench components, but never
|
|
201
|
+
imports their optional peers. Conversation-only Next.js/Vite hosts do not need
|
|
202
|
+
terminal, desktop, editor, or diff packages. Hosts mounting those surfaces opt
|
|
203
|
+
in through the [per-surface setup entries](#optional-peer-dependencies).
|
|
204
|
+
|
|
205
|
+
Highlighted diffs use the optional `@pierre/diffs` peer only after an explicit
|
|
206
|
+
opt-in, so a host without it still builds with any bundler (Turbopack resolves
|
|
207
|
+
every reachable `import()`). Hosts that install it call `enablePierreDiffs()`
|
|
208
|
+
once; call it from the lazily loaded route that renders diffs to keep the peer
|
|
209
|
+
out of your initial bundle. Views already on screen upgrade when it registers:
|
|
210
|
+
|
|
211
|
+
```ts
|
|
212
|
+
import { enablePierreDiffs } from "@opengeni/react/diffs";
|
|
213
|
+
enablePierreDiffs();
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
Without it, diffs and file views render as plain text.
|
|
217
|
+
|
|
218
|
+
`OpenGeniProvider` never blocks or reloads the host page when Opengeni deploys
|
|
219
|
+
a new API contract revision. The stock Opengeni console opts into that
|
|
220
|
+
stale-tab protection with `reloadOnApiContractChange`; embedded products
|
|
221
|
+
should leave it off.
|
|
222
|
+
|
|
223
|
+
Subscription account lists and their usage readings (`useCodexAccounts`,
|
|
224
|
+
`useSuperGrokAccounts`) are shared per `client` object: readers mounted at the
|
|
225
|
+
same time share one request and one result, and account changes made through
|
|
226
|
+
these hooks re-read every mounted list (also when the component that made the
|
|
227
|
+
change has already unmounted). By default nothing is kept after the last reader
|
|
228
|
+
unmounts, so a host that reuses one `client` for different people never shows
|
|
229
|
+
one person's accounts to the next, also when it re-keys its tree for the next
|
|
230
|
+
person in a single render: the new reader and its children never render the
|
|
231
|
+
previous rows, and a read still in flight for the previous person is
|
|
232
|
+
discarded. (A reader joining one already on screen shows its rows before the
|
|
233
|
+
browser paints, after one extra render.) Set `retainReadsAcrossMounts` on
|
|
234
|
+
`OpenGeniProvider` to keep them across navigation instead: returning to a page
|
|
235
|
+
renders the last accounts at once and re-reads them in the background once
|
|
236
|
+
they are older than 10 seconds. Failed reads are never kept, and a
|
|
237
|
+
401/403/404 drops what was kept. Retained reads are dropped when `client`
|
|
238
|
+
changes or the provider unmounts.
|
|
239
|
+
|
|
240
|
+
> **Host action item:** only set `retainReadsAcrossMounts` when every signed-in
|
|
241
|
+
> person gets their own `client` object (create a new client on sign-in,
|
|
242
|
+
> sign-out and account switch), as the stock Opengeni console does. With a
|
|
243
|
+
> shared client, leave it off.
|
|
244
|
+
|
|
245
|
+
### Exact conversation search navigation
|
|
246
|
+
|
|
247
|
+
`useSessionEvents().initialHistoryReady` becomes true when a history window has
|
|
248
|
+
loaded successfully, including an empty tail. It stays true through later stream
|
|
249
|
+
errors, history navigation, and tip reloads, and resets for a new session/replay
|
|
250
|
+
identity. Use it rather than inferring initial success from `initialLoading` or
|
|
251
|
+
the combined `error`. A failed first load stays unready until recovery;
|
|
252
|
+
`jumpToLatest()` clears its stale error and retries. Full replay has no history
|
|
253
|
+
snapshot-completion watermark, so SSE alone does not set this flag.
|
|
254
|
+
|
|
255
|
+
`useSessionEvents(sessionId).jumpToSequence(sequence)` replaces the current
|
|
256
|
+
window with at most two bounded cursor reads around an exact durable event.
|
|
257
|
+
It resolves `true` only when that event is retained, `false` for a missing or
|
|
258
|
+
superseded target, and rejects current request errors. `loadingTarget` exposes
|
|
259
|
+
the pending state. New targets supersede older targets/pages; session/client
|
|
260
|
+
changes fence stale results. Search enters history mode; use the existing
|
|
261
|
+
`loadOlder`, `loadNewer`, and `jumpToLatest` controls to navigate onward. It does
|
|
262
|
+
not download the intervening session history.
|
|
263
|
+
Pass `jumpToSequence(sequence, { signal })` to cancel one navigation: an
|
|
264
|
+
aborted signal fences the pending jump before its fetched window is applied
|
|
265
|
+
(the underlying reads may still complete), resolves `false`, and settles
|
|
266
|
+
`loadingTarget` without disturbing any newer navigation that superseded it.
|
|
267
|
+
|
|
268
|
+
Pass the selected hit to `MessageTimeline` independently of loading:
|
|
269
|
+
|
|
270
|
+
```tsx
|
|
271
|
+
const history = useSessionEvents(sessionId);
|
|
272
|
+
const [target, setTarget] = useState<TimelineSearchTarget | null>(null);
|
|
273
|
+
|
|
274
|
+
function selectHit(hit: { sequence: number; eventId: string }, query: string, occurrence = 0) {
|
|
275
|
+
setTarget({ ...hit, query, occurrence });
|
|
276
|
+
void history.jumpToSequence(hit.sequence);
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
<MessageTimeline events={history.events} items={history.timeline} searchTarget={target} />;
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
The host owns search results, error handling, next/previous controls and query
|
|
283
|
+
state. `TimelineSearchTarget` is exported from the root and `session-ui` entry:
|
|
284
|
+
`{ sequence: number; eventId?: string; query: string; occurrence?: number; offset?: number }`.
|
|
285
|
+
Matching is literal, case-insensitive, non-overlapping; `occurrence` is zero-based
|
|
286
|
+
within the message, defaulting to zero. When the backend all-occurrence search
|
|
287
|
+
returns `messageMatchOffset`, pass it as `offset`: the zero-based UTF-16 position
|
|
288
|
+
of the match in the original message text. An explicit `offset` takes precedence
|
|
289
|
+
over `occurrence` and is validated against the query, so a stale offset simply
|
|
290
|
+
produces no highlight. `buildTimeline` supplies `sourceEvents`
|
|
291
|
+
identities so completed assistant events remain addressable when the renderer
|
|
292
|
+
keeps a first-delta ID. Hosts supplying their own items should preserve those
|
|
293
|
+
identities (or the canonical `annotationSource`).
|
|
294
|
+
|
|
295
|
+
The active message's group and long-user disclosure open persistently. Setting
|
|
296
|
+
`searchTarget={null}` removes the active highlight without collapsing content or
|
|
297
|
+
restoring a former scroll position. The package mounts its complete bounded
|
|
298
|
+
window. The default Markdown renderer shows a labeled, bounded **message source**
|
|
299
|
+
excerpt for the active match, including Markdown syntax and link destinations;
|
|
300
|
+
closing find removes the highlight but retains that excerpt and its layout.
|
|
301
|
+
An explicit **Show formatted message** action restores the full body; this can
|
|
302
|
+
expand a huge message, so it is never done automatically on closing Find.
|
|
303
|
+
Raw UTF-16 offsets are never applied
|
|
304
|
+
to rendered Markdown text. Custom hosts can use
|
|
305
|
+
`<Markdown searchTarget={searchTarget}>{text}</Markdown>` for the same behavior.
|
|
306
|
+
A custom virtualized renderer receives
|
|
307
|
+
`renderMessageText(text, item, { searchTarget })` and must materialize the exact
|
|
308
|
+
occurrence when that context is non-null. Existing two-argument renderers remain
|
|
309
|
+
compatible. If previous occurrences are omitted from the virtualized DOM, wrap
|
|
310
|
+
the materialized match in an element with `data-og-search-occurrence` (zero-based
|
|
311
|
+
index), `data-og-search-sequence` and `data-og-search-query`, each set from the
|
|
312
|
+
target; when the target carries an `offset`, set `data-og-search-offset` to it
|
|
313
|
+
alongside `data-og-search-occurrence` (which can be zero). This lets navigation
|
|
314
|
+
identify that exact occurrence without recounting an incomplete DOM. Keep the
|
|
315
|
+
materialized window when the context clears to
|
|
316
|
+
preserve position. Navigation waits for the mounted text and highlights the active
|
|
317
|
+
DOM range using the CSS Custom Highlight API, without rewriting React-owned
|
|
318
|
+
text. Explicit source-offset targets require this marker: matching characters
|
|
319
|
+
at the same rendered offset are not proof of source identity. A custom renderer
|
|
320
|
+
that omits source text or puts it in an opaque iframe must reveal that text
|
|
321
|
+
itself. Existing renderers without this mapping remain render-compatible but
|
|
322
|
+
cannot provide exact source-offset navigation.
|
|
323
|
+
|
|
27
324
|
## Editable Office artifacts
|
|
28
325
|
|
|
29
326
|
The optional artifact workbench is isolated from the ordinary session and
|
|
@@ -76,6 +373,29 @@ import { EditablePresentationArtifactSurface } from "@opengeni/react/artifacts/p
|
|
|
76
373
|
<EditablePresentationArtifactSurface session={presentationSession} title="Launch deck" />;
|
|
77
374
|
```
|
|
78
375
|
|
|
376
|
+
The spreadsheet surface supports typing, formulas, rectangular paste, clear,
|
|
377
|
+
and durable row/column resizing. Drag a header boundary for immediate visual
|
|
378
|
+
feedback and one command on release. Focus a boundary and use arrows to resize
|
|
379
|
+
(Shift for 1 px), Home to reset, or Escape to cancel. Pending saves do not block
|
|
380
|
+
typing; the sync indicator remains pending until server acknowledgement. Failed
|
|
381
|
+
independent edits stay visible, and retry cannot overwrite newer overlapping
|
|
382
|
+
edits. The same component is used in the dock and full-page artifact view;
|
|
383
|
+
dimensions and values remain authoritative in the SDK Worker.
|
|
384
|
+
The console supplies an XLSX Download action in both dock and full-page views.
|
|
385
|
+
Custom hosts can supply `download(signal): Promise<Blob>` on the spreadsheet
|
|
386
|
+
surface, or `downloadSpreadsheet(opened, signal): Promise<Blob>` on
|
|
387
|
+
`EditableArtifactView`. Use the authenticated artifact SDK to pin the saved native
|
|
388
|
+
head, materialize XLSX, poll its job, and download its bytes; never return the
|
|
389
|
+
original imported file. Forward the abort signal through every request. The
|
|
390
|
+
control waits for live sync without pending edits, shows progress and retryable
|
|
391
|
+
errors, and cancels on teardown or revoked access. Omit the callback when the host
|
|
392
|
+
does not support export; other modalities do not gain an unsupported download.
|
|
393
|
+
Double-click a sheet tab or focus it and press F2 to rename it. Enter/Save submits
|
|
394
|
+
the canonical `sheet.rename` command; Escape/Cancel discards an unsent name.
|
|
395
|
+
Validation and failed submissions keep the name editor open. Pending cell edits
|
|
396
|
+
show submitted input until the Worker projection catches up; pending formulas
|
|
397
|
+
show their source, not an invented result.
|
|
398
|
+
|
|
79
399
|
The durable document surface composes bounded summary, body, section, and
|
|
80
400
|
review queries at one native revision. Text edits become UTF-16-correct minimal
|
|
81
401
|
`paragraph.edit` commands; formatting becomes `paragraph.format`. Empty
|
|
@@ -97,7 +417,7 @@ or permissive fallback.
|
|
|
97
417
|
|
|
98
418
|
`DocumentProjectionEditor`, `PresentationProjectionEditor`, and
|
|
99
419
|
`SpreadsheetProjectionGrid` expose the same host-owned projection/async-command
|
|
100
|
-
boundary without requiring the
|
|
420
|
+
boundary without requiring the Opengeni sync session. Pending, failure, retry,
|
|
101
421
|
read-only, focus, and reconciliation behavior stays inside the components.
|
|
102
422
|
|
|
103
423
|
Projection editors use browser-safe structural views and do not load
|
|
@@ -135,6 +455,21 @@ can therefore implement only the methods used by each hook. A shared event feed
|
|
|
135
455
|
also avoids requiring a client-owned event stream at runtime. Workspace-level
|
|
136
456
|
Resume is an optional authority.
|
|
137
457
|
|
|
458
|
+
Use `createEmbeddedSessionClient(base, options)` to bind that narrow surface
|
|
459
|
+
from a full SDK client or host proxy. Delegated methods preserve their SDK
|
|
460
|
+
receiver, `options.overrides.submitComposerDraft` can route atomic submission
|
|
461
|
+
through a host-authenticated endpoint, and `mapComposerDraft` can project every
|
|
462
|
+
read/save/submit draft before React adopts it. Construction fails immediately
|
|
463
|
+
when a required method is missing, and submit returns the host/native
|
|
464
|
+
`SubmitComposerDraftResponse` unchanged apart from an explicitly configured
|
|
465
|
+
draft projection.
|
|
466
|
+
|
|
467
|
+
The styled file surfaces accept a presentation-only node predicate:
|
|
468
|
+
`FileBrowser.isNodeVisible`, `SandboxFiles.isNodeVisible`, and
|
|
469
|
+
`SandboxWorkspace.isFileNodeVisible`. Hidden parents never expose orphaned
|
|
470
|
+
children, hidden selections/reveal requests are ignored, and omitting the prop
|
|
471
|
+
preserves the complete authoritative tree. This is not an authorization seam.
|
|
472
|
+
|
|
138
473
|
The styled root surface ships with ready-to-use CSS. Import it once; the host
|
|
139
474
|
does not need Tailwind:
|
|
140
475
|
|
|
@@ -154,7 +489,7 @@ derived defaults use scoped effective values so changing a base accent, radius,
|
|
|
154
489
|
motion, or surface token updates its dependents at runtime.
|
|
155
490
|
|
|
156
491
|
The original Tailwind v4 bridge remains available for hosts that intentionally
|
|
157
|
-
want
|
|
492
|
+
want Opengeni utilities compiled into their own Tailwind entry:
|
|
158
493
|
|
|
159
494
|
```css
|
|
160
495
|
@import "tailwindcss";
|
|
@@ -295,7 +630,7 @@ export function App() {
|
|
|
295
630
|
|
|
296
631
|
## Realtime composer controls (`@opengeni/react/realtime`)
|
|
297
632
|
|
|
298
|
-
The realtime subpath is the exact
|
|
633
|
+
The realtime subpath is the exact Opengeni composer experience: model catalog
|
|
299
634
|
and selection, split-button motion, start/stop/retry states, microphone and
|
|
300
635
|
audio mute controls, diagnostics, recovery, and the same copy, ARIA, classes,
|
|
301
636
|
and styling used by the web console. It is deliberately separate from the root
|
|
@@ -361,7 +696,7 @@ The reference consumer is `demo/realtime.html`. Run `bun run demo` from
|
|
|
361
696
|
`packages/react`, then open `http://localhost:3100/realtime.html?mode=mock` for
|
|
362
697
|
deterministic selection/start/mute/stop/reconnect/error testing. Use
|
|
363
698
|
`?mode=live&workspaceId=…&sessionId=…` against the web server's same-origin
|
|
364
|
-
`/demo-api` proxy for a real local
|
|
699
|
+
`/demo-api` proxy for a real local Opengeni environment. Configure
|
|
365
700
|
`OPENGENI_DEMO_API_URL` and, only on the server, optional demo API/access
|
|
366
701
|
credentials; the browser receives neither credential. Prefer the deployment's
|
|
367
702
|
normal browser authentication. If the proxy needs a server credential, create a
|
|
@@ -386,11 +721,46 @@ through published package APIs only.
|
|
|
386
721
|
## Browser and computer surfaces (`@opengeni/react/interaction`)
|
|
387
722
|
|
|
388
723
|
The interaction subpath renders the same browser-native and semantic computer
|
|
389
|
-
surfaces used by the
|
|
724
|
+
surfaces used by the Opengeni web app. It consumes only the public SDK client:
|
|
390
725
|
workspace discovery, peer switching, tabs/windows, live frames, human input,
|
|
391
726
|
identity versions, interventions, diagnostics, reconnect, and lifecycle state do
|
|
392
727
|
not require app-private controller glue.
|
|
393
728
|
|
|
729
|
+
Managed browser actions keep the foreground tab in place. Target-local Chromium
|
|
730
|
+
focus emulation keeps animation callbacks running without an open preview;
|
|
731
|
+
explicit activation brings a tab forward. The override ends when its controller
|
|
732
|
+
detaches. Native **App controls** also work in the background where supported.
|
|
733
|
+
Physical desktop mouse/keyboard input shares the foreground seat; **Bring to front**
|
|
734
|
+
makes that change explicit.
|
|
735
|
+
Computer frames fit the dock while preserving their proportions. Resizing or
|
|
736
|
+
reopening the dock refits the visible image without changing capture resolution
|
|
737
|
+
or the coordinates sent to the computer.
|
|
738
|
+
Desktop opens a whole screen by default. Multiple screens use a compact screen
|
|
739
|
+
selector; app controls and window views are available from **Advanced**. Explicit
|
|
740
|
+
view choices survive refreshes while the target remains available.
|
|
741
|
+
|
|
742
|
+
Desktop IME candidates and their selection keys stay local; only committed text is sent.
|
|
743
|
+
|
|
744
|
+
A managed browser's attachment authority error keeps a same-browser **Reconnect**
|
|
745
|
+
action available. It obtains a fresh server-authorized attachment without creating
|
|
746
|
+
a replacement browser or replaying input. The fresh Connected Chrome instruction
|
|
747
|
+
is reserved for the selected extension-attached browser's generation loss; a
|
|
748
|
+
different lost browser in the workspace cannot change that recovery path.
|
|
749
|
+
|
|
750
|
+
The browser viewer negotiates bounded typing batches from the active controller's
|
|
751
|
+
short-lived attachment. Supporting helpers recheck the original controller,
|
|
752
|
+
target, document and frame fence before every action; old helpers retain one
|
|
753
|
+
request per action. Only queued text actions share a request (at most 16), with
|
|
754
|
+
each text/input event preserved. Keys, pointer input and clipboard operations
|
|
755
|
+
remain ordering barriers. A failed or uncertain action discards the queued suffix
|
|
756
|
+
without replay.
|
|
757
|
+
IME candidate-selection keys stay local to the viewer; only committed text is
|
|
758
|
+
sent to the remote page. A later ordinary Enter remains a remote key action.
|
|
759
|
+
Live image props use opaque byte buffers so React development timing diagnostics
|
|
760
|
+
cannot expand and retain every screenshot byte. Normal timing diagnostics remain enabled.
|
|
761
|
+
Queued inputs retain only immutable frame fences, not screenshot bytes or prior
|
|
762
|
+
render callbacks. Replacing the selected viewer invalidates its queued suffix.
|
|
763
|
+
|
|
394
764
|
```tsx
|
|
395
765
|
import { OpenGeniProvider } from "@opengeni/react";
|
|
396
766
|
import { BrowserViewer, ComputerViewer } from "@opengeni/react/interaction";
|
|
@@ -416,6 +786,33 @@ returned ComputerSession must be the exact placement/window the browser uses.
|
|
|
416
786
|
`onOpenComputer` then changes the host layout to that resource—it must not open a
|
|
417
787
|
lookalike desktop. Closing either viewer never ends its durable resource.
|
|
418
788
|
|
|
789
|
+
`ComputerViewer` disables input when its control service is unavailable, even if
|
|
790
|
+
frames keep arriving. Reconnect refreshes the selected desktop's controls and
|
|
791
|
+
frames. App accessibility inspection failures leave independent live input
|
|
792
|
+
available; `useComputerSession().controlError` reports service loss separately
|
|
793
|
+
from the hook's general `error`.
|
|
794
|
+
|
|
795
|
+
If the chat's latest browser was lost or failed, the viewer names it and explains
|
|
796
|
+
why it is unavailable instead of showing the ordinary empty state. It offers the
|
|
797
|
+
existing new-browser controls without reopening the lost controller or selecting
|
|
798
|
+
another chat's browser. Explicitly closed browsers still use the empty state;
|
|
799
|
+
older failures do not replace a newer closed browser. This loss notice also takes
|
|
800
|
+
precedence over `renderEmpty`. Preview the deadline-loss case with
|
|
801
|
+
`browser.html?mode=mock&lost=1` (add `width=360&theme=light` for a narrow light dock).
|
|
802
|
+
|
|
803
|
+
Native dropdown popups may not appear in page frames. With a controller that
|
|
804
|
+
advertises focused input observations, clicking one opens its choices beside
|
|
805
|
+
the click. Ordinary clicks use a bounded focus probe instead of a full page
|
|
806
|
+
snapshot; only a focused native dropdown (or a child-frame focus hint) requests
|
|
807
|
+
semantic options. Current controllers show no permanent **Choose option** button
|
|
808
|
+
over the page; older controllers retain that explicit fallback. **Alt+Down** opens
|
|
809
|
+
the focused dropdown and reads its options on either controller generation.
|
|
810
|
+
Selection uses the normal browser action API. The viewer retains that
|
|
811
|
+
observation's target/document/frame fence. Private, oversized, or ambiguous
|
|
812
|
+
choices remain unavailable; the page's keyboard controls still work. This
|
|
813
|
+
fallback requires a controller with focused native-select metadata support and
|
|
814
|
+
does not rewrite the page or capture the desktop.
|
|
815
|
+
|
|
419
816
|
The provider opens one shared workspace interaction-revision stream and every
|
|
420
817
|
catalog refreshes only when its revision advances; hidden or disconnected pages
|
|
421
818
|
fall back to bounded polling and reconcile from the retained cursor. Hosts that
|
|
@@ -428,6 +825,18 @@ same-origin `/demo-api` proxy and the exact published SDK/React entrypoints.
|
|
|
428
825
|
|
|
429
826
|
## Composer customization (`@opengeni/react/composer`)
|
|
430
827
|
|
|
828
|
+
`SessionChrome` accepts `onComposerFocus` for queue editing. Connect it to
|
|
829
|
+
`controller.focusInput` from `useChatComposerController`, or focus a custom
|
|
830
|
+
input through its ref. Chrome calls it after a successful checkout and
|
|
831
|
+
`composer.applyDraft`, including confirmed draft replacement; failed checkout
|
|
832
|
+
and pending/cancelled replacement do not request focus. The host retains
|
|
833
|
+
ownership of the input and no DOM selector or global focus event is needed.
|
|
834
|
+
|
|
835
|
+
When sharing `useSessionEvents().events` with `useGoal`, the hook still fetches
|
|
836
|
+
the authoritative goal on mount and target changes, even when the supplied log
|
|
837
|
+
already contains goal events. The shared log drives subsequent invalidations
|
|
838
|
+
without opening another event stream. A 404 remains a normal goal-less state.
|
|
839
|
+
|
|
431
840
|
Use `ChatComposer` for the standard layout and its `controlsStart`, `header`,
|
|
432
841
|
and `messages` props for small additions. For a different layout, import the
|
|
433
842
|
headless controller and compound primitives as a namespace. The controller is
|
|
@@ -506,7 +915,8 @@ state remains application-owned; durable draft and session state remain in
|
|
|
506
915
|
|
|
507
916
|
- `useSessionEvents(sessionId)` — loads a compact, bounded tail window by
|
|
508
917
|
default, then live-streams on the SDK's exactly-once/ordered event delivery.
|
|
509
|
-
Initial replay
|
|
918
|
+
Initial replay reads one 1000-row raw page, with at most one extra page to
|
|
919
|
+
recover a dense turn's boundary; `loadOlder` is capped at two such pages;
|
|
510
920
|
timeline group density is only an early stop. It returns the raw windowed
|
|
511
921
|
`events`, projected `timeline`, latest `sessionStatus`, connection state, and
|
|
512
922
|
older-history controls (`hasOlder`, `loadingOlder`, `loadOlder`). Pass
|
|
@@ -519,13 +929,32 @@ state remains application-owned; durable draft and session state remain in
|
|
|
519
929
|
callback return type. Custom loaders can use `createOlderHistoryLoadReceipt`
|
|
520
930
|
and call `markCommitted` immediately before publishing their accepted older
|
|
521
931
|
window.
|
|
932
|
+
- Browser retention limits are exported as `SESSION_EVENT_BROWSER_MAX_BYTES`
|
|
933
|
+
and `SESSION_EVENT_BROWSER_MAX_COUNT`; they do not change fetch page sizes.
|
|
934
|
+
The live working set is at most 16 MiB or 20,000 events. One event larger than
|
|
935
|
+
the byte target stays complete in a window of its own.
|
|
936
|
+
Live appends reuse the retained window's byte total, measuring only incoming
|
|
937
|
+
and evicted events. History still pages when either retention limit is reached.
|
|
938
|
+
- Newer history uses `hasNewer`, `loadingNewer`, and `loadNewer`. A failed
|
|
939
|
+
`loadNewer()` preserves the retained events and cursors, exposes the original
|
|
940
|
+
failure through `error`, and still rejects for the caller to handle. Pass
|
|
941
|
+
`onLoadNewer={loadNewer}` (or return its promise from your wrapper) to
|
|
942
|
+
`MessageTimeline`: it catches the request failure, shows the error and an
|
|
943
|
+
explicit **Retry later activity** action, and does not automatically retry
|
|
944
|
+
the failed boundary. A successful retry, jump to the start/latest window,
|
|
945
|
+
or session change clears that failure. Loading older rows alone does not
|
|
946
|
+
resolve a failed newer read. Late failures from a previous session are ignored.
|
|
947
|
+
A host that discards the promise must handle its own rejected request.
|
|
522
948
|
- `useComposer(sessionId, { sendExtras, effectiveControl })` — revisioned private
|
|
523
949
|
draft, Send, Steer, and workstream Pause/Resume state. `send()` appends in
|
|
524
950
|
visible queue order (including while paused); `steer()` puts the new direction
|
|
525
951
|
directly in chat and supersedes the current direction. Resume is always an
|
|
526
952
|
explicit control action and never an implicit side effect of Send. Drafts
|
|
527
953
|
autosave with optimistic concurrency, survive failed sends, and reuse one
|
|
528
|
-
`clientEventId` across retries so the server dedupes.
|
|
954
|
+
`clientEventId` across retries so the server dedupes. Draft reads retry transient
|
|
955
|
+
failures, including request timeouts, with backoff. Successful refreshes clear
|
|
956
|
+
draft-read errors without dismissing Send, Steer, or control errors; a draft
|
|
957
|
+
sync timeout does not mean the agent turn has stopped. `composer.policy` and
|
|
529
958
|
`setModel` / `setReasoningEffort` / `setLatencyMode` expose the exact policy
|
|
530
959
|
owned by that actor/session draft; policy is `null` until hydration completes.
|
|
531
960
|
`sendExtras` (object or function evaluated at send time) is only for
|
|
@@ -557,16 +986,24 @@ state remains application-owned; durable draft and session state remain in
|
|
|
557
986
|
plus the `defaultModel` to preselect (from the client config) for a picker.
|
|
558
987
|
- `useCodexAccounts()` — connected Codex (ChatGPT) accounts, the active/next-run
|
|
559
988
|
pointer, and per-session account pinning for multi-account subscriptions.
|
|
989
|
+
`refreshUsage({ maxAgeMs })` reuses live usage readings only when every
|
|
990
|
+
listed account was read within `maxAgeMs`; concurrent refreshes share one
|
|
991
|
+
provider read. `liveUsageUpdatedAt` is the time of the oldest account
|
|
992
|
+
reading. See `retainReadsAcrossMounts` above for keeping the list and
|
|
993
|
+
readings across navigation.
|
|
560
994
|
- `useSlashCommands(...)` — the slash-command palette state (registry + parsing +
|
|
561
995
|
handlers) behind `CommandPalette`.
|
|
562
996
|
- `useWorkspaceSessions()` / `useScheduledTasks()` — workspace lists for
|
|
563
|
-
fleet/manager views (optional polling).
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
997
|
+
fleet/manager views (optional polling). `useWorkspaceSessions({ projection:
|
|
998
|
+
"summary" })` returns compact list entries; omit the option for full sessions.
|
|
999
|
+
Scripted clients can omit the summary method and the hook projects full pages
|
|
1000
|
+
locally while retaining cancellation and causal read revisions.
|
|
1001
|
+
- `useVaults()` / `useVault()` / `useVaultItems()` / `useVaultItem()` /
|
|
1002
|
+
`useVaultFieldVersions()` / `useSessionSecrets()` — vaults, items, field
|
|
1003
|
+
history and a session's vault policy, metadata only. `useVaultsApi()` returns
|
|
1004
|
+
the SDK's `client.vaults(workspaceId)` routes for writes and the one audited
|
|
1005
|
+
`revealField` call; keep revealed values in component state, never in a
|
|
1006
|
+
cache. Variable Sets and `useVariableSets()` were removed in 2.0.0.
|
|
570
1007
|
- `useWorkspaces()` — the caller's workspaces with create/update (client-only;
|
|
571
1008
|
not bound to the provider's workspace).
|
|
572
1009
|
- `useBillingUsage({ accountId?, workspaceId? })` — credit balance + recent
|
|
@@ -614,22 +1051,44 @@ intentional changes should regenerate those snapshots and review the diff.
|
|
|
614
1051
|
- `MessageTimeline` — the session timeline with stick-to-bottom scrolling, a
|
|
615
1052
|
"jump to latest" affordance, streaming caret, collapsible activity clusters,
|
|
616
1053
|
and worker cards (wire `onOpenSession` to drill into a worker). Pass
|
|
617
|
-
`renderMessageText` to plug a markdown renderer.
|
|
1054
|
+
`renderMessageText` to plug a markdown renderer. The default renderer shows a
|
|
1055
|
+
single newline in a message as a line break, like other chat apps; a custom
|
|
1056
|
+
renderer gets the same result with `<Markdown softLineBreaks>{text}</Markdown>`
|
|
1057
|
+
(off by default for non-chat Markdown). Pass
|
|
618
1058
|
`loadRetainedArtifact` to render permanent generated-image receipts; a loader
|
|
619
1059
|
may return verified bytes or a short-lived signed URL. The stock web app uses
|
|
620
1060
|
the URL path to avoid copying multi-megabyte images into JavaScript memory.
|
|
1061
|
+
`createWorkspaceRetainedArtifactLoader`, `createSessionRetainedScreenshotLoader`,
|
|
1062
|
+
and `createWorkspaceRetainedVideoLoader` bind the SDK reads to a workspace
|
|
1063
|
+
(and session); `SessionConversation` uses them by default.
|
|
621
1064
|
- `UserMessageBody` — the shared lossless rendered-height disclosure for
|
|
622
1065
|
already-sent user text. Use it inside a custom `renderMessageText` user branch
|
|
623
1066
|
so attachments and voice identity remain outside the clipped Markdown region.
|
|
1067
|
+
Pass `disclosureLabels={{ showMore: "Afficher davantage", showLess: "Réduire" }}`
|
|
1068
|
+
to localize a direct instance. For the default timeline, pass the same object
|
|
1069
|
+
as `MessageTimeline.userMessageDisclosureLabels` or
|
|
1070
|
+
`SessionConversation.userMessageDisclosureLabels`; custom `UserMessageBody`
|
|
1071
|
+
renderers inside that timeline inherit these labels too. Each direct label
|
|
1072
|
+
overrides its timeline label independently, then falls back to `Show more`
|
|
1073
|
+
or `Show less`. Changing labels does not reset a message's expanded state.
|
|
1074
|
+
`UserMessageDisclosureLabels` is exported from both `@opengeni/react` and
|
|
1075
|
+
`@opengeni/react/session-ui`.
|
|
624
1076
|
- `SessionStatus` / `StatusDot` — status badges; live states breathe.
|
|
625
1077
|
- `FleetTile` — one session in a fleet grid: title, status, model, recency.
|
|
626
1078
|
- `ModelPicker` — a compact model dropdown for a composer slot, grouping the
|
|
627
1079
|
host-exposed models by provider.
|
|
628
|
-
- `ModelPolicyPicker` — the full model policy control used by the
|
|
1080
|
+
- `ModelPolicyPicker` — the full model policy control used by the Opengeni web
|
|
629
1081
|
app: provider/billing rails, model availability, reasoning effort, and
|
|
630
1082
|
runnable latency modes such as Fast. It accepts either `ClientModel[]` or
|
|
631
1083
|
catalog-backed `PickerModelRow[]`, and supports host-supplied labels.
|
|
632
1084
|
- `Markdown` — the timeline's markdown renderer (GFM), also usable standalone.
|
|
1085
|
+
Top-level assistant tables in `MessageTimeline` can expand beyond the prose
|
|
1086
|
+
column into the actual conversation panel's available space. Small tables,
|
|
1087
|
+
paragraphs, user bubbles, and nested or standalone Markdown keep their normal
|
|
1088
|
+
width; oversized tables retain table-only horizontal scrolling. No host prop
|
|
1089
|
+
or viewport-wide layout override is required.
|
|
1090
|
+
Remeasurement during host rerenders or tail streaming does not temporarily
|
|
1091
|
+
resize the live table or displace an unpinned history reader.
|
|
633
1092
|
With `onSandboxFile`, a valid `sandbox:<path>[:line]` application link becomes
|
|
634
1093
|
an in-session Open action. The callback receives the decoded path unchanged;
|
|
635
1094
|
the optional line is positive and 1-based. Invalid sandbox references render
|
|
@@ -680,6 +1139,97 @@ remaining built-ins in supplied order. Duplicate IDs keep their first
|
|
|
680
1139
|
definition; remove a built-in before adding a custom facet with the same ID.
|
|
681
1140
|
`replace` is type-exclusive with `add` and `remove`.
|
|
682
1141
|
|
|
1142
|
+
`turnSummary={{ rolling: true }}` selects the readable per-turn presentation:
|
|
1143
|
+
startup shows the preparation orb outside any disclosure, then hands over to
|
|
1144
|
+
Working without resetting the startup-inclusive elapsed clock. While work is
|
|
1145
|
+
live, assistant progress messages stay fully formatted and visible,
|
|
1146
|
+
followed by one Working or Waiting disclosure with the rolling latest step.
|
|
1147
|
+
When the turn finishes, earlier assistant messages and tools share the Worked
|
|
1148
|
+
disclosure; the final response remains visible. Expanding reveals that turn's
|
|
1149
|
+
earlier prose and activity in chronological order, not a fold of multiple turns.
|
|
1150
|
+
An already expanded or actively read view is preserved through settlement.
|
|
1151
|
+
Routine machine inputs get one compact reason per resumed turn. Normal tip-follow
|
|
1152
|
+
continues through long answers, and manual scrolling never auto-repins on new work.
|
|
1153
|
+
Expanded outer work headers stay reachable at the top of the timeline until
|
|
1154
|
+
their own details end; nested headers never stick. The contextual navigation
|
|
1155
|
+
pill stays below the sticky-header strip and avoids interactive controls. If
|
|
1156
|
+
no horizontal slot fits beside a toolbar, only the pill moves below it; the
|
|
1157
|
+
timeline's size and scroll position do not change.
|
|
1158
|
+
|
|
1159
|
+
The single **Back to your message** button returns to the loaded user prompt
|
|
1160
|
+
associated with the response or work being read: the latest prompt preceding
|
|
1161
|
+
the viewport midpoint. It appears only when that prompt's start is more than
|
|
1162
|
+
24 px above the viewport and its entire body and attachments are out of view.
|
|
1163
|
+
Clicking synchronously scrolls and focuses that exact
|
|
1164
|
+
mounted prompt near the top and leaves tip-follow. Later messages and queued
|
|
1165
|
+
prompts do not change the destination while the reader remains in older work.
|
|
1166
|
+
An older bounded window uses its own loaded context; a window with no associated
|
|
1167
|
+
prompt shows no action. Navigation never replaces the history window or looks up
|
|
1168
|
+
the globally newest message. There are no previous/next arrows.
|
|
1169
|
+
|
|
1170
|
+
`SessionConversation` includes this behavior automatically. Custom timelines
|
|
1171
|
+
need no prompt-navigation callback:
|
|
1172
|
+
|
|
1173
|
+
```tsx
|
|
1174
|
+
const events = useSessionEvents(sessionId);
|
|
1175
|
+
<MessageTimeline
|
|
1176
|
+
events={events.events}
|
|
1177
|
+
items={events.timeline}
|
|
1178
|
+
turnSummary={{ rolling: true }}
|
|
1179
|
+
hasNewer={events.hasNewer}
|
|
1180
|
+
onJumpToLatest={events.jumpToLatest}
|
|
1181
|
+
/>;
|
|
1182
|
+
```
|
|
1183
|
+
|
|
1184
|
+
`onJumpToLatest` retains its separate live-bottom behavior. The deprecated
|
|
1185
|
+
`MessageTimeline.onJumpToLatestQuestion` prop remains source-compatible but is
|
|
1186
|
+
not invoked by contextual navigation.
|
|
1187
|
+
|
|
1188
|
+
### Optional global newest-message lookup
|
|
1189
|
+
|
|
1190
|
+
The public `useSessionEvents().jumpToLatestQuestion()` hook remains available for
|
|
1191
|
+
hosts that deliberately build a **separate** global lookup action. It is not wired
|
|
1192
|
+
to `MessageTimeline` or the first-party conversation's contextual button.
|
|
1193
|
+
The hook checks the authoritative queue and normally uses one filtered forensic
|
|
1194
|
+
lookup plus, if needed, two bounded context reads. It pages past legacy worker
|
|
1195
|
+
completions and withdrawn/cancelled-before-start prompts, never substituting an
|
|
1196
|
+
arbitrary question from a loaded old page. Queued/legacy admission uses filtered
|
|
1197
|
+
lifecycle evidence to locate its real turn start. A distant prompt is retained as
|
|
1198
|
+
one projection-only witness in `events.timeline`; `events.events` remains the
|
|
1199
|
+
bounded contiguous raw window, so pass `items` as above.
|
|
1200
|
+
The optional resolver loads on its first invocation, not when opening a session.
|
|
1201
|
+
Identity and navigation guards also cover that module-loading delay.
|
|
1202
|
+
|
|
1203
|
+
Custom hosts can provide their own queue destination when invoking this hook:
|
|
1204
|
+
|
|
1205
|
+
```tsx
|
|
1206
|
+
const navigateToNewest = () => events.jumpToLatestQuestion({
|
|
1207
|
+
onQueuedQuestion: async (turn, navigation) => {
|
|
1208
|
+
await queue.refresh();
|
|
1209
|
+
if (!navigation.isCurrent()) return;
|
|
1210
|
+
// Check the host's latest queue/error state before applying its focus request.
|
|
1211
|
+
setQueueFocusTarget((previous) => ({
|
|
1212
|
+
turnId: turn.id,
|
|
1213
|
+
requestId: (previous?.requestId ?? 0) + 1,
|
|
1214
|
+
}));
|
|
1215
|
+
},
|
|
1216
|
+
});
|
|
1217
|
+
// Pass queueFocusTarget to SessionChrome; each new request opens/focuses once.
|
|
1218
|
+
```
|
|
1219
|
+
|
|
1220
|
+
A queue destination returns `null`, not an invisible transcript sequence. Without
|
|
1221
|
+
`onQueuedQuestion`, a pending prompt rejects with `LatestQuestionQueuedError`;
|
|
1222
|
+
the custom host can show guidance. Transitional queue state can be retried.
|
|
1223
|
+
Check `navigation.isCurrent()` after awaits and immediately before queue UI effects:
|
|
1224
|
+
an explicit history jump can supersede a queued lookup without changing the session.
|
|
1225
|
+
The shared projection predicate supplies execution evidence for older queued turns
|
|
1226
|
+
without `turn.started`, including tools, agent/sandbox activity, startup, recovery,
|
|
1227
|
+
and capacity events. Compact cursor coverage skips coalesced delta runs.
|
|
1228
|
+
`groupTimeline(items)` retains classic
|
|
1229
|
+
grouping; `{ readableTurns: true }` selects the new projection. The deprecated
|
|
1230
|
+
`foldExchanges` option aliases readable turns, not the removed cross-turn fold. See
|
|
1231
|
+
[`docs/design/genie-loading.md`](../../docs/design/genie-loading.md).
|
|
1232
|
+
|
|
683
1233
|
## Sandbox surfacing
|
|
684
1234
|
|
|
685
1235
|
An opt-in workbench that surfaces a session's live sandbox — files, terminal,
|
|
@@ -707,6 +1257,16 @@ capability document so every surface degrades to a reason instead of crashing.
|
|
|
707
1257
|
These surfaces pull in [optional peer dependencies](#optional-peer-dependencies)
|
|
708
1258
|
— install only the ones for surfaces you actually mount.
|
|
709
1259
|
|
|
1260
|
+
`SandboxWorkspace` keeps capture-backed file browsing passive, but an explicit
|
|
1261
|
+
live-file open acquires a viewer. Failed opens show the connection error and a
|
|
1262
|
+
retry that renegotiates the viewer instead of leaving a waking spinner running.
|
|
1263
|
+
When composing `SandboxFiles` directly, pass `workspaceError` alongside
|
|
1264
|
+
`liveWorkspaceReady` and supply an `onWakeWorkspace` callback that can retry a
|
|
1265
|
+
failed negotiation. Complete PNG, JPEG, GIF, and WebP reads render as read-only
|
|
1266
|
+
image previews; truncated reads and other binary formats remain non-editable
|
|
1267
|
+
notices. Image previews use the existing bounded file-read path and do not
|
|
1268
|
+
publish or retain additional files.
|
|
1269
|
+
|
|
710
1270
|
## Connected Machines (`@opengeni/react/machines`)
|
|
711
1271
|
|
|
712
1272
|
Bring-your-own-compute UI: the Machines dashboard, per-machine metrics, the
|
|
@@ -752,11 +1312,62 @@ function Fleet({ sessionId }: { sessionId: string }) {
|
|
|
752
1312
|
See the [Connected Machines guide](../../docs/connected-machines.md) for the
|
|
753
1313
|
end-to-end embedder story (create-on-machine, discover, swap, enroll, revoke).
|
|
754
1314
|
|
|
1315
|
+
## Usage allowances (`@opengeni/react/usage`)
|
|
1316
|
+
|
|
1317
|
+
Show people where they stand against a workspace or member usage allowance.
|
|
1318
|
+
A separate subpath, so hosts that don't meter usage never load it.
|
|
1319
|
+
|
|
1320
|
+
- `useUsage({ workspaceId? })` — the signed-in person's own `/usage/me`
|
|
1321
|
+
(through `getMyUsage` or any client with `requestJson`) plus a summary of
|
|
1322
|
+
which limit binds first. `refreshKey` re-reads when work settles.
|
|
1323
|
+
- `UsageMeter` — "38% left · Resets Nov 1". Shares only; pass `formatAmount`
|
|
1324
|
+
for money, credits or plan multiples. `density="compact"` for menus,
|
|
1325
|
+
`"hero"` to lead a page.
|
|
1326
|
+
- `UsageLimitNotice` — the calm composer line: nothing while comfortable, a
|
|
1327
|
+
dismissible heads-up near the limit, then who can raise it and when it
|
|
1328
|
+
resets. `labels` rewords it; `action` adds your own "Upgrade" button.
|
|
1329
|
+
- `UsageMemberList` — the admin roster with a share-of-budget slider,
|
|
1330
|
+
optional fixed amounts, and a visible note when shares add up to more than
|
|
1331
|
+
the pool. Save rules through your backend in `onChangeRule`.
|
|
1332
|
+
|
|
1333
|
+
```tsx
|
|
1334
|
+
import { UsageLimitNotice, UsageMeter } from "@opengeni/react/usage";
|
|
1335
|
+
|
|
1336
|
+
<UsageMeter workspaceId={workspaceId} />
|
|
1337
|
+
<SessionConversation
|
|
1338
|
+
sessionId={sessionId}
|
|
1339
|
+
composerProps={{ header: <UsageLimitNotice workspaceId={workspaceId} /> }}
|
|
1340
|
+
allowanceExhaustedLabels={{ memberRemedy: "Ask your team admin for more." }}
|
|
1341
|
+
/>
|
|
1342
|
+
```
|
|
1343
|
+
|
|
1344
|
+
The conversation's "usage limit reached" row is customized on
|
|
1345
|
+
`MessageTimeline`/`SessionConversation` with `allowanceExhaustedLabels` or
|
|
1346
|
+
replaced with `renderAllowanceExhausted`. See
|
|
1347
|
+
[usage allowances](../../docs/usage-allowances.md#react-components-and-the-console).
|
|
1348
|
+
|
|
1349
|
+
## Terminal startup input
|
|
1350
|
+
|
|
1351
|
+
`SandboxTerminal` captures bounded early typing while attaching. Supported stock
|
|
1352
|
+
sandbox images negotiate explicit Bash Readline readiness; banners and first
|
|
1353
|
+
output do not release queued commands. Silent prompts work too. If a startup
|
|
1354
|
+
profile asks for input or disables line editing, **Use manual input** clears
|
|
1355
|
+
buffered typing before enabling unguaranteed input. Old images/running ttyd
|
|
1356
|
+
daemons retain labelled **legacy input** behavior; wait for their shell startup
|
|
1357
|
+
before typing. Relay PTYs retain their existing OPEN_ACK behavior.
|
|
1358
|
+
|
|
1359
|
+
Custom consumers of `useTerminalStream` can inspect `inputReadiness` and expose
|
|
1360
|
+
`useLegacyInput()` for `waiting` states. That action discards queued typing; it
|
|
1361
|
+
is not an acknowledgement of shell readiness. A new React package alone cannot
|
|
1362
|
+
upgrade an old sandbox image. See the [native readiness contract](../../agent/native/terminal-ready/README.md)
|
|
1363
|
+
for compatibility, startup limits and coordinated release requirements.
|
|
1364
|
+
|
|
755
1365
|
## Optional peer dependencies
|
|
756
1366
|
|
|
757
|
-
The chat/timeline surface
|
|
758
|
-
|
|
759
|
-
|
|
1367
|
+
The chat/timeline surface needs only the required React/React DOM peers. All
|
|
1368
|
+
existing root exports remain available without optional workbench peers, even
|
|
1369
|
+
when a bundler resolves every reachable dynamic import. Install and enable
|
|
1370
|
+
only the surfaces you mount, once in their client route or bootstrap:
|
|
760
1371
|
|
|
761
1372
|
- Terminal (`SandboxTerminal`): `@xterm/xterm`, `@xterm/addon-fit`,
|
|
762
1373
|
`@xterm/addon-web-links`.
|
|
@@ -766,6 +1377,37 @@ what the surfaces you mount need:
|
|
|
766
1377
|
language packs you need (`css`, `html`, `javascript`, `json`, `markdown`,
|
|
767
1378
|
`python`).
|
|
768
1379
|
|
|
1380
|
+
```ts
|
|
1381
|
+
import { enableSandboxTerminal } from "@opengeni/react/terminal";
|
|
1382
|
+
import { enableDesktopViewer } from "@opengeni/react/desktop";
|
|
1383
|
+
import { enableCodeEditor } from "@opengeni/react/editor";
|
|
1384
|
+
|
|
1385
|
+
enableSandboxTerminal();
|
|
1386
|
+
enableDesktopViewer();
|
|
1387
|
+
enableCodeEditor({
|
|
1388
|
+
javascript: async () =>
|
|
1389
|
+
(await import("@codemirror/lang-javascript")).javascript({ jsx: true, typescript: true }),
|
|
1390
|
+
});
|
|
1391
|
+
```
|
|
1392
|
+
|
|
1393
|
+
Omit imports and calls for surfaces you do not use. These entries also re-export
|
|
1394
|
+
their components; root component imports continue to work after setup. The
|
|
1395
|
+
libraries load on mount, not during setup or SSR. Import the setup from a lazy
|
|
1396
|
+
route to keep its peer chunks outside the initial conversation graph.
|
|
1397
|
+
|
|
1398
|
+
For optional terminal WebGL acceleration, install `@xterm/addon-webgl` and call
|
|
1399
|
+
`enableSandboxTerminal({ webgl: () => import("@xterm/addon-webgl") })`. Without
|
|
1400
|
+
it, or if it fails, the terminal uses its DOM renderer. Only supply editor
|
|
1401
|
+
grammar loaders for packages you installed; absent/failed grammars use plain
|
|
1402
|
+
CodeMirror. Without editor setup, the existing textarea fallback remains usable.
|
|
1403
|
+
Without terminal/VNC setup, those surfaces show a setup error; relay-frame
|
|
1404
|
+
desktops and a custom `rfbFactory` need no noVNC setup.
|
|
1405
|
+
|
|
1406
|
+
Custom hosts may supply `registerSandboxTerminal`, `registerCodeEditor`, or
|
|
1407
|
+
`registerDesktopViewer` loaders from the root instead. Mounted fallbacks retry
|
|
1408
|
+
when registration changes. Do not hide peer imports behind runtime bare strings
|
|
1409
|
+
or `@vite-ignore`: browsers cannot resolve those without an import map.
|
|
1410
|
+
|
|
769
1411
|
## Demo harness
|
|
770
1412
|
|
|
771
1413
|
`bun run demo` (from this package) serves a harness that drives the real hooks
|
|
@@ -774,3 +1416,123 @@ with streaming, tool calls, and a worker spawn, plus fleet and scheduled-task
|
|
|
774
1416
|
views and a dark/light toggle. `realtime.html` is the public-package reference
|
|
775
1417
|
consumer described above, with deterministic mock and same-origin live modes.
|
|
776
1418
|
`bun run demo:build` is part of the repo gate.
|
|
1419
|
+
|
|
1420
|
+
### Model selection
|
|
1421
|
+
|
|
1422
|
+
`ModelPolicyPicker` opens a flat, searchable list grouped by payment source, with
|
|
1423
|
+
the selected model checked in its provider group. Choosing a model applies it and closes the popover.
|
|
1424
|
+
Thinking and supported speed controls remain in a fixed footer instead of a
|
|
1425
|
+
nested page. Model changes preserve supported reasoning effort and latency;
|
|
1426
|
+
unsupported effort falls back to the new model's default, and unsupported speed
|
|
1427
|
+
returns to Standard. Thinking uses inline radio choices and is hidden when the
|
|
1428
|
+
model has no adjustable reasoning levels. Availability and Codex-only session restrictions still disable choices.
|
|
1429
|
+
|
|
1430
|
+
Use `allowModelOptions={false}` for policies that save only a model identity,
|
|
1431
|
+
such as a fallback order. This hides effort and speed controls without changing
|
|
1432
|
+
the catalog, payment-source labels, or model eligibility.
|
|
1433
|
+
|
|
1434
|
+
The trigger renders immediately; the searchable popover loads when opened. Hosts
|
|
1435
|
+
can translate its search, current-selection, empty-result, attachment-warning, and
|
|
1436
|
+
thinking labels through `messages`, and override payment descriptions through
|
|
1437
|
+
`messages.billingHints`.
|
|
1438
|
+
|
|
1439
|
+
The stock deployment-provided group is labeled **Models**, with a generic model
|
|
1440
|
+
icon. It can contain both credit-backed and free models; the **Free** badge
|
|
1441
|
+
depends on the model's explicit cost, not its group. Genuine external-provider
|
|
1442
|
+
and subscription identities retain their own labels and marks.
|
|
1443
|
+
|
|
1444
|
+
Hosts can rebrand the full picker without replacing its interaction logic:
|
|
1445
|
+
|
|
1446
|
+
```tsx
|
|
1447
|
+
<ModelPolicyPicker
|
|
1448
|
+
{...pickerProps}
|
|
1449
|
+
groupPresentation={{
|
|
1450
|
+
opengeni_credits: {
|
|
1451
|
+
label: "Acme Assist",
|
|
1452
|
+
icon: <AcmeMark aria-hidden="true" />,
|
|
1453
|
+
description: "Provided by your workspace",
|
|
1454
|
+
},
|
|
1455
|
+
codex_subscription: { description: null },
|
|
1456
|
+
}}
|
|
1457
|
+
/>
|
|
1458
|
+
```
|
|
1459
|
+
|
|
1460
|
+
`groupPresentation` is a partial map keyed by `PickerBillingClass`. Labels apply
|
|
1461
|
+
to group headings, search, and trigger-icon accessibility. Icons apply to both
|
|
1462
|
+
the menu and trigger; supply decorative, non-interactive content (SVG or image)
|
|
1463
|
+
that fits the existing 14px slot. Explicit `null` hides an icon or description;
|
|
1464
|
+
omitted fields retain defaults. Descriptions override `messages.billingHints`,
|
|
1465
|
+
can also be shown for the deployment-provided group, and are searchable. Existing
|
|
1466
|
+
`rows[].billingClassLabel` remains the fallback when no label override is supplied.
|
|
1467
|
+
This is presentation only: model IDs, billing, ordering, availability and callbacks
|
|
1468
|
+
are unchanged. The type `ModelPolicyPickerGroupPresentation` is exported from
|
|
1469
|
+
both `@opengeni/react` and `@opengeni/react/composer`. The native `ModelPicker`
|
|
1470
|
+
is a separate control; this API targets the full `ModelPolicyPicker` shown above.
|
|
1471
|
+
|
|
1472
|
+
The complete conversation uses this same neutral picker. Customize its appearance
|
|
1473
|
+
without replacing composer controls through `SessionConversation.modelPickerProps`,
|
|
1474
|
+
or through `OpenGeniChat.conversationProps`:
|
|
1475
|
+
|
|
1476
|
+
```tsx
|
|
1477
|
+
<OpenGeniChat
|
|
1478
|
+
client={client}
|
|
1479
|
+
workspaceId={workspaceId}
|
|
1480
|
+
conversationProps={{
|
|
1481
|
+
modelPickerProps: {
|
|
1482
|
+
groupPresentation: {
|
|
1483
|
+
opengeni_credits: { label: "Acme Assist", icon: <AcmeMark aria-hidden="true" /> },
|
|
1484
|
+
},
|
|
1485
|
+
messages: { label: "Choose a model" },
|
|
1486
|
+
},
|
|
1487
|
+
}}
|
|
1488
|
+
/>
|
|
1489
|
+
```
|
|
1490
|
+
|
|
1491
|
+
`modelPickerProps` accepts only `groupPresentation` and `messages`; it does not
|
|
1492
|
+
enable a hidden picker or change policy, model availability or callbacks. Keep
|
|
1493
|
+
model-picker visibility controlled by `modelPicker` and the client configuration.
|
|
1494
|
+
|
|
1495
|
+
For a rendered example, open the composer-responsive demo with `?branding=host`.
|
|
1496
|
+
|
|
1497
|
+
Models always show their clean name and maker logo: picker rows carry
|
|
1498
|
+
`modelDisplayName(model)` (`claude-opus-4-8` and
|
|
1499
|
+
`organization-claude-subscription/claude-opus-5-5` read `Claude Opus 4.8` and
|
|
1500
|
+
`Claude Opus 5.5`) and a `ModelMark`. Organization- and workspace-connected API
|
|
1501
|
+
keys share one "API keys" group, and identical copies of one model in a
|
|
1502
|
+
connection group show once. Render a model anywhere else with
|
|
1503
|
+
`<ModelName model={id} />`, or `modelDisplayName` / `modelVendor` from
|
|
1504
|
+
`@opengeni/react` or `@opengeni/sdk/model-display`. The trigger keeps a host's
|
|
1505
|
+
explicit group icon; otherwise API-key models show the maker's logo.
|
|
1506
|
+
|
|
1507
|
+
Subscription descriptions appear once per provider group. Free models carry a
|
|
1508
|
+
Free badge. Pass `hasImageAttachments` for the current draft to show an image
|
|
1509
|
+
compatibility warning only when the selected model cannot view those images.
|
|
1510
|
+
|
|
1511
|
+
`MessageTimeline.renderMessageActions(item)` places host-owned controls beside
|
|
1512
|
+
Copy and the timestamp for user messages and completed assistant messages.
|
|
1513
|
+
The host owns feedback, fork authorization, and mutations; streaming assistant
|
|
1514
|
+
messages omit this slot. Use the `group/copy` hover/focus state and preserve
|
|
1515
|
+
visible touch targets when styling actions.
|
|
1516
|
+
|
|
1517
|
+
### Portable action reviews
|
|
1518
|
+
|
|
1519
|
+
`ApprovalSurface` accepts `loadReview(approval)` and `onViewDetails(review, path)`;
|
|
1520
|
+
load the versioned facts with `client.getToolActionReview`. It shows one selected
|
|
1521
|
+
action, counts and bounded fields instead of raw argument JSON. Keep
|
|
1522
|
+
`selectedApprovalId` and `onSelectedApprovalChange` in the host if a full-page
|
|
1523
|
+
detail route unmounts the surface, so returning cannot silently select a different
|
|
1524
|
+
action. The native `onApprove` / `onReject` identity is unchanged and duplicate
|
|
1525
|
+
submission is fenced until authoritative events remove the request.
|
|
1526
|
+
|
|
1527
|
+
Render `ToolActionReviewDetails` on the host's normal page with
|
|
1528
|
+
`client.getToolReviewDetails`, passing the review's `actionDigest`, path and offset.
|
|
1529
|
+
Details are immutable, authenticated, paginated, and redact protected values.
|
|
1530
|
+
Restore focus to the original `data-review-path` button on return. No web-app
|
|
1531
|
+
imports, iframe, second confirmation, or nested scrolling pane is required.
|
|
1532
|
+
The standalone fallback retains bounded details for older SDK approvals.
|
|
1533
|
+
|
|
1534
|
+
Wrap `MessageTimeline` in `ToolReviewHistoryProvider` with its visible events,
|
|
1535
|
+
authenticated `load(approvalId)` callback and `onViewDetails` to keep recorded
|
|
1536
|
+
reviews readable inside the corresponding tool activity. Historical receipts
|
|
1537
|
+
never render decision buttons. The same semantic tokens support light/dark
|
|
1538
|
+
embeds; `demo/approval-review.html` is the synthetic state gallery.
|