@opengeni/react 0.57.0 → 1.0.2-canary.37191796234001
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +654 -22
- package/dist/accounts.d.ts +64 -0
- package/dist/accounts.js +822 -0
- package/dist/accounts.js.map +1 -0
- package/dist/approvals.d.ts +2 -1
- package/dist/artifacts-document.js +3 -2
- package/dist/artifacts-presentation.js +3 -2
- package/dist/artifacts-spreadsheet.js +2 -2
- package/dist/artifacts.d.ts +4 -1
- package/dist/artifacts.js +518 -42
- package/dist/artifacts.js.map +1 -1
- package/dist/browser-viewer-GTR5XQ7X.js +16 -0
- package/dist/capability-catalog-row.d.ts +20 -0
- package/dist/capability-logo-fallback.d.ts +3 -0
- package/dist/chat-interactive-block-UGBTNB3L.js +11 -0
- package/dist/chat-interactive-block-UGBTNB3L.js.map +1 -0
- package/dist/{chunk-5UQPNLIO.js → chunk-23J2ZNXT.js} +4117 -3896
- package/dist/chunk-23J2ZNXT.js.map +1 -0
- package/dist/chunk-447JLCBU.js +209 -0
- package/dist/chunk-447JLCBU.js.map +1 -0
- package/dist/chunk-4RVYOY4O.js +379 -0
- package/dist/chunk-4RVYOY4O.js.map +1 -0
- package/dist/chunk-5CVXZA3Y.js +292 -0
- package/dist/chunk-5CVXZA3Y.js.map +1 -0
- package/dist/chunk-5J4FOW6Q.js +108 -0
- package/dist/chunk-5J4FOW6Q.js.map +1 -0
- package/dist/chunk-A2PI6UMY.js +41 -0
- package/dist/chunk-A2PI6UMY.js.map +1 -0
- package/dist/{chunk-7WCLAEFV.js → chunk-A4UJB2MM.js} +37 -27
- package/dist/chunk-A4UJB2MM.js.map +1 -0
- package/dist/chunk-B3V6TG77.js +41 -0
- package/dist/chunk-B3V6TG77.js.map +1 -0
- package/dist/chunk-BRM6FVZA.js +302 -0
- package/dist/chunk-BRM6FVZA.js.map +1 -0
- package/dist/chunk-C5X5AJXK.js +182 -0
- package/dist/chunk-C5X5AJXK.js.map +1 -0
- package/dist/chunk-CR7U7HAR.js +453 -0
- package/dist/chunk-CR7U7HAR.js.map +1 -0
- package/dist/{chunk-R3AZOAB5.js → chunk-DYWBUX5Q.js} +29 -123
- package/dist/chunk-DYWBUX5Q.js.map +1 -0
- package/dist/chunk-E3G7SAYZ.js +3124 -0
- package/dist/chunk-E3G7SAYZ.js.map +1 -0
- package/dist/chunk-ELCE5SXV.js +359 -0
- package/dist/chunk-ELCE5SXV.js.map +1 -0
- package/dist/chunk-ERGYJIBB.js +21 -0
- package/dist/chunk-ERGYJIBB.js.map +1 -0
- package/dist/chunk-FFA2OVOV.js +319 -0
- package/dist/chunk-FFA2OVOV.js.map +1 -0
- package/dist/chunk-FZCP527Y.js +116 -0
- package/dist/chunk-FZCP527Y.js.map +1 -0
- package/dist/chunk-GIMRELBW.js +14 -0
- package/dist/chunk-GIMRELBW.js.map +1 -0
- package/dist/{chunk-6KLX2RH5.js → chunk-H2NJQORO.js} +1069 -79
- package/dist/chunk-H2NJQORO.js.map +1 -0
- package/dist/chunk-I7IWRQLN.js +1608 -0
- package/dist/chunk-I7IWRQLN.js.map +1 -0
- package/dist/{chunk-HA46CYQK.js → chunk-IQUCRAT7.js} +792 -537
- package/dist/chunk-IQUCRAT7.js.map +1 -0
- package/dist/chunk-IWIDV7SB.js +1 -0
- package/dist/chunk-IWIDV7SB.js.map +1 -0
- package/dist/chunk-J2QWVSQY.js +312 -0
- package/dist/chunk-J2QWVSQY.js.map +1 -0
- package/dist/chunk-JFNEV4LU.js +2733 -0
- package/dist/chunk-JFNEV4LU.js.map +1 -0
- package/dist/chunk-JT4JW7BC.js +54 -0
- package/dist/chunk-JT4JW7BC.js.map +1 -0
- package/dist/chunk-K3HQAKQX.js +24 -0
- package/dist/chunk-K3HQAKQX.js.map +1 -0
- package/dist/{chunk-C5ZPSSS5.js → chunk-NEXLLTP4.js} +2 -1
- package/dist/{chunk-C5ZPSSS5.js.map → chunk-NEXLLTP4.js.map} +1 -1
- package/dist/chunk-NZUI76EM.js +371 -0
- package/dist/chunk-NZUI76EM.js.map +1 -0
- package/dist/{chunk-PEI6RANI.js → chunk-PNY3JKBJ.js} +309 -74
- package/dist/chunk-PNY3JKBJ.js.map +1 -0
- package/dist/{chunk-IGC6A2ZI.js → chunk-Q5QBEZIQ.js} +777 -246
- package/dist/chunk-Q5QBEZIQ.js.map +1 -0
- package/dist/chunk-RHREZ7BO.js +11 -0
- package/dist/chunk-RHREZ7BO.js.map +1 -0
- package/dist/chunk-SCOTPE2I.js +589 -0
- package/dist/chunk-SCOTPE2I.js.map +1 -0
- package/dist/{chunk-B6WPZSTT.js → chunk-SJZDKVW2.js} +1331 -1163
- package/dist/chunk-SJZDKVW2.js.map +1 -0
- package/dist/chunk-TMJRG4YC.js +12803 -0
- package/dist/chunk-TMJRG4YC.js.map +1 -0
- package/dist/chunk-TMYGL6X5.js +742 -0
- package/dist/chunk-TMYGL6X5.js.map +1 -0
- package/dist/chunk-UGLEYEMP.js +33 -0
- package/dist/chunk-UGLEYEMP.js.map +1 -0
- package/dist/chunk-UK4TINKT.js +27 -0
- package/dist/chunk-UK4TINKT.js.map +1 -0
- package/dist/chunk-UTRTG6LH.js +220 -0
- package/dist/chunk-UTRTG6LH.js.map +1 -0
- package/dist/chunk-WEHMPOXK.js +39 -0
- package/dist/chunk-WEHMPOXK.js.map +1 -0
- package/dist/chunk-WRHIZYZF.js +988 -0
- package/dist/chunk-WRHIZYZF.js.map +1 -0
- package/dist/{chunk-HUIKIDM5.js → chunk-WUISZ3WU.js} +223 -115
- package/dist/chunk-WUISZ3WU.js.map +1 -0
- package/dist/chunk-XCHWDJ22.js +107 -0
- package/dist/chunk-XCHWDJ22.js.map +1 -0
- package/dist/chunk-XOAMRDDK.js +481 -0
- package/dist/chunk-XOAMRDDK.js.map +1 -0
- package/dist/chunk-XUW2UWQM.js +299 -0
- package/dist/chunk-XUW2UWQM.js.map +1 -0
- package/dist/{chunk-KCGXPP5V.js → chunk-Y2PRMYLC.js} +11 -6
- package/dist/chunk-Y2PRMYLC.js.map +1 -0
- package/dist/chunk-YBXQDQFX.js +1772 -0
- package/dist/chunk-YBXQDQFX.js.map +1 -0
- package/dist/{chunk-KZ73RL76.js → chunk-YQEAA6LT.js} +7 -3
- package/dist/chunk-YQEAA6LT.js.map +1 -0
- package/dist/chunk-YV4L3ILF.js +9 -0
- package/dist/chunk-YV4L3ILF.js.map +1 -0
- package/dist/{chunk-LLOLUHVG.js → chunk-YWFG7ZX7.js} +1358 -2746
- package/dist/chunk-YWFG7ZX7.js.map +1 -0
- package/dist/chunk-ZYRGEKWS.js +216 -0
- package/dist/chunk-ZYRGEKWS.js.map +1 -0
- package/dist/client.d.ts +7 -4
- package/dist/clipboard.js +1 -0
- package/dist/commands/types.d.ts +2 -0
- package/dist/components/anthropic-mark.d.ts +3 -0
- package/dist/components/approval-surface.d.ts +15 -0
- package/dist/components/artifacts/artifact-chrome.d.ts +120 -0
- package/dist/components/artifacts/artifact-sandbox.d.ts +27 -0
- package/dist/components/artifacts/artifact-surface.d.ts +3 -1
- package/dist/components/artifacts/chat-interactive-block.d.ts +29 -0
- package/dist/components/artifacts/deferred-chat-media.d.ts +15 -0
- package/dist/components/artifacts/document-editor.d.ts +4 -2
- package/dist/components/artifacts/editable-artifact-ui.d.ts +2 -1
- package/dist/components/artifacts/editable-artifact-view.d.ts +46 -0
- package/dist/components/artifacts/editable-document.d.ts +1 -1
- package/dist/components/artifacts/editable-presentation.d.ts +2 -2
- package/dist/components/artifacts/editable-spreadsheet.d.ts +2 -1
- package/dist/components/artifacts/index.d.ts +8 -1
- package/dist/components/artifacts/inline-html-document.d.ts +2 -0
- package/dist/components/artifacts/latest-task-runner.d.ts +15 -0
- package/dist/components/artifacts/presentation-editor.d.ts +6 -2
- package/dist/components/artifacts/published-html-artifact-frame.d.ts +48 -3
- package/dist/components/artifacts/session-artifact-viewer.d.ts +39 -0
- package/dist/components/artifacts/site-view.d.ts +23 -0
- package/dist/components/artifacts/spreadsheet-general-display.d.ts +24 -0
- package/dist/components/artifacts/visualization-assets.gen.d.ts +2 -0
- package/dist/components/browser-select-control.d.ts +16 -0
- package/dist/components/browser-viewer.d.ts +10 -1
- package/dist/components/chat-composer.d.ts +21 -3
- package/dist/components/child-session-link.d.ts +5 -0
- package/dist/components/claude-mark.d.ts +3 -0
- package/dist/components/code-editor.d.ts +1 -4
- package/dist/components/composer.d.ts +45 -4
- package/dist/components/computer-viewer.d.ts +4 -1
- package/dist/components/copy-button.d.ts +3 -1
- package/dist/components/desktop-viewer.d.ts +1 -1
- package/dist/components/enrollment-consent.d.ts +6 -3
- package/dist/components/file-browser.d.ts +10 -1
- package/dist/components/fleet-tile.d.ts +2 -2
- package/dist/components/grok-mark.d.ts +26 -0
- package/dist/components/human-input-form.d.ts +21 -2
- package/dist/components/human-input-surface.d.ts +6 -3
- package/dist/components/machine-card.d.ts +4 -1
- package/dist/components/machines/machine-detail.d.ts +4 -1
- package/dist/components/machines/machine-operation-policy.d.ts +11 -0
- package/dist/components/machines-dashboard.d.ts +3 -1
- package/dist/components/markdown-table-layout.d.ts +12 -0
- package/dist/components/markdown.d.ts +47 -3
- package/dist/components/message-timeline.d.ts +72 -9
- package/dist/components/model-mark.d.ts +29 -0
- package/dist/components/model-policy-picker-menu.d.ts +9 -0
- package/dist/components/model-policy-picker.d.ts +62 -13
- package/dist/components/open-geni-chat.d.ts +55 -0
- package/dist/components/open-geni-links.d.ts +68 -0
- package/dist/components/openrouter-mark.d.ts +6 -0
- package/dist/components/pierre-file.d.ts +1 -1
- package/dist/components/preview-loading.d.ts +2 -0
- package/dist/components/queue-item-content.d.ts +9 -0
- package/dist/components/sandbox-files.d.ts +13 -2
- package/dist/components/sandbox-workspace.d.ts +43 -3
- package/dist/components/session-capability-frame.d.ts +35 -0
- package/dist/components/session-chrome.d.ts +66 -8
- package/dist/components/session-commands-panel.d.ts +6 -0
- package/dist/components/session-commands.d.ts +6 -0
- package/dist/components/session-connection-request.d.ts +8 -0
- package/dist/components/session-conversation.d.ts +86 -0
- package/dist/components/session-list.d.ts +36 -0
- package/dist/components/session-mcp-capability-card.d.ts +41 -0
- package/dist/components/timeline-anchor.d.ts +24 -0
- package/dist/components/timeline-annotation-chrome.d.ts +25 -0
- package/dist/components/timeline-annotation-layout.d.ts +42 -0
- package/dist/components/timeline-annotation-markers.d.ts +8 -0
- package/dist/components/timeline-annotation-reveal-context.d.ts +4 -0
- package/dist/components/timeline-annotation-shared.d.ts +31 -0
- package/dist/components/timeline-annotations-dialog.d.ts +3 -2
- package/dist/components/timeline-annotations.d.ts +13 -3
- package/dist/components/timeline-reading-progress.d.ts +11 -0
- package/dist/components/timeline-search.d.ts +34 -0
- package/dist/components/timeline-settlement.d.ts +16 -0
- package/dist/components/tip-follow.d.ts +16 -0
- package/dist/components/usage-limit-notice.d.ts +49 -0
- package/dist/components/usage-member-list.d.ts +91 -0
- package/dist/components/usage-meter.d.ts +73 -0
- package/dist/components/use-viewer-menu-dismiss.d.ts +2 -0
- package/dist/components/user-message-body.d.ts +10 -1
- package/dist/components/workspace-dock.d.ts +6 -2
- package/dist/composer.d.ts +5 -4
- package/dist/composer.js +15 -9
- package/dist/computer-viewer-ENHVAZ2Q.js +19 -0
- package/dist/computer-viewer-ENHVAZ2Q.js.map +1 -0
- package/dist/connect-account-identity.d.ts +8 -0
- package/dist/connect-accounts.d.ts +15 -0
- package/dist/connect-chooser.d.ts +18 -0
- package/dist/connect-panel.d.ts +18 -0
- package/dist/connect-setup.d.ts +16 -0
- package/dist/connect.d.ts +21 -0
- package/dist/connect.js +2129 -0
- package/dist/connect.js.map +1 -0
- package/dist/connection-catalog.d.ts +38 -0
- package/dist/connection-discovery.d.ts +12 -0
- package/dist/connection-installed.d.ts +17 -0
- package/dist/connection-logo.d.ts +9 -0
- package/dist/connection-service-logo.d.ts +8 -0
- package/dist/connection-service-presentation.d.ts +13 -0
- package/dist/connection-skeleton.d.ts +5 -0
- package/dist/connection-type-picker.d.ts +6 -0
- package/dist/conversation-timeline.d.ts +5 -0
- package/dist/desktop.d.ts +7 -0
- package/dist/desktop.js +26 -0
- package/dist/desktop.js.map +1 -0
- package/dist/device-authorization.d.ts +23 -0
- package/dist/diffs.d.ts +8 -0
- package/dist/diffs.js +14 -0
- package/dist/diffs.js.map +1 -0
- package/dist/discovery-cache.d.ts +5 -0
- package/dist/editor.d.ts +7 -0
- package/dist/editor.js +21 -0
- package/dist/editor.js.map +1 -0
- package/dist/embedded-session-client.d.ts +23 -0
- package/dist/file-node-visibility.d.ts +15 -0
- package/dist/{fleet-decision-row-GGCAT4E4.js → fleet-decision-row-YZ3ZKWMM.js} +2 -1
- package/dist/fleet-decision-row-YZ3ZKWMM.js.map +1 -0
- package/dist/hooks/channel-cache.d.ts +23 -0
- package/dist/hooks/latest-question.d.ts +25 -0
- package/dist/hooks/shared-machines-list.d.ts +14 -0
- package/dist/hooks/use-attached-browsers.d.ts +2 -1
- package/dist/hooks/use-browser-frame-stream.d.ts +1 -1
- package/dist/hooks/use-browser-session.d.ts +12 -1
- package/dist/hooks/use-channels.d.ts +1 -0
- package/dist/hooks/use-codex-accounts.d.ts +25 -7
- package/dist/hooks/use-composer.d.ts +45 -9
- package/dist/hooks/use-computer-frame-stream.d.ts +1 -1
- package/dist/hooks/use-computer-input-posture.d.ts +13 -0
- package/dist/hooks/use-computer-session.d.ts +2 -0
- package/dist/hooks/use-connect.d.ts +22 -0
- package/dist/hooks/use-desktop-stream.d.ts +1 -1
- package/dist/hooks/use-file-attachments.d.ts +21 -2
- package/dist/hooks/use-machine-chip.d.ts +3 -3
- package/dist/hooks/use-machines.d.ts +19 -1
- package/dist/hooks/use-sandbox-files.d.ts +5 -1
- package/dist/hooks/use-session-background-commands.d.ts +14 -0
- package/dist/hooks/use-session-events.d.ts +30 -8
- package/dist/hooks/use-session-lineage.d.ts +4 -0
- package/dist/hooks/use-session-mcp-approval-policy.d.ts +2 -2
- package/dist/hooks/use-session.d.ts +6 -0
- package/dist/hooks/use-turn-queue.d.ts +12 -0
- package/dist/hooks/use-usage.d.ts +40 -0
- package/dist/hooks/use-workspace-edit.d.ts +4 -0
- package/dist/hooks/use-workspace-sessions.d.ts +27 -5
- package/dist/human-input.d.ts +3 -1
- package/dist/identity-link-accounts.d.ts +11 -0
- package/dist/identity-link-consent.d.ts +18 -0
- package/dist/index.d.ts +60 -17
- package/dist/index.js +2237 -6200
- package/dist/index.js.map +1 -1
- package/dist/interaction.d.ts +1 -1
- package/dist/interaction.js +35 -184
- package/dist/interaction.js.map +1 -1
- package/dist/latest-question-755OW5DS.js +117 -0
- package/dist/latest-question-755OW5DS.js.map +1 -0
- package/dist/lib/error-message.d.ts +7 -0
- package/dist/lib/format.d.ts +36 -2
- package/dist/lib/host-theme.d.ts +70 -0
- package/dist/lib/interaction-errors.d.ts +6 -0
- package/dist/lib/menu-styles.d.ts +22 -0
- package/dist/lib/pierre-diffs-loader.d.ts +20 -0
- package/dist/lib/workbench-peers.d.ts +36 -0
- package/dist/lib/xterm-theme.d.ts +7 -5
- package/dist/machines.d.ts +4 -2
- package/dist/machines.js +14 -4
- package/dist/markdown-table-layout-QXSLK4BY.js +106 -0
- package/dist/markdown-table-layout-QXSLK4BY.js.map +1 -0
- package/dist/mcp-connection-status.d.ts +14 -0
- package/dist/model-policy-picker-menu-PWRI7R2X.js +14 -0
- package/dist/model-policy-picker-menu-PWRI7R2X.js.map +1 -0
- package/dist/model-policy.d.ts +19 -3
- package/dist/model-policy.js +9 -1
- package/dist/older-history.d.ts +30 -0
- package/dist/platform-activity-row-627BFZ46.js +182 -0
- package/dist/platform-activity-row-627BFZ46.js.map +1 -0
- package/dist/plugin-details.d.ts +14 -0
- package/dist/plugin-discovery.d.ts +25 -0
- package/dist/provider.d.ts +13 -1
- package/dist/{queue-surface-implementation-2KVJTYXH.js → queue-surface-implementation-ZHFI5JBP.js} +131 -44
- package/dist/queue-surface-implementation-ZHFI5JBP.js.map +1 -0
- package/dist/realtime/realtime-control.d.ts +10 -3
- package/dist/realtime.js +229 -83
- package/dist/realtime.js.map +1 -1
- package/dist/sandbox-files-BBC47SLD.js +20 -0
- package/dist/sandbox-files-BBC47SLD.js.map +1 -0
- package/dist/session-auth-recommendation.d.ts +5 -0
- package/dist/session-capability-policy.d.ts +12 -0
- package/dist/session-ui.d.ts +30 -2
- package/dist/session-ui.js +85 -7
- package/dist/session-ui.js.map +1 -1
- package/dist/session.d.ts +8 -2
- package/dist/session.js +30 -19
- package/dist/sites-ui.d.ts +34 -0
- package/dist/sites.d.ts +3 -0
- package/dist/sites.js +11 -0
- package/dist/sites.js.map +1 -0
- package/dist/skill-discovery.d.ts +47 -0
- package/dist/terminal.d.ts +8 -0
- package/dist/terminal.js +31 -0
- package/dist/terminal.js.map +1 -0
- package/dist/timeline/activity-rail.d.ts +11 -2
- package/dist/timeline/allowance-exhausted-row.d.ts +24 -0
- package/dist/timeline/compaction-copy.d.ts +10 -0
- package/dist/timeline/entrance.d.ts +13 -1
- package/dist/timeline/genie-loading.d.ts +34 -0
- package/dist/timeline/index.d.ts +6 -2
- package/dist/timeline/knowledge-receipt.d.ts +17 -0
- package/dist/timeline/platform-activity-row.d.ts +14 -0
- package/dist/timeline/presented-image.d.ts +6 -0
- package/dist/timeline/projection.d.ts +31 -2
- package/dist/timeline/registry.d.ts +2 -0
- package/dist/timeline/retained-image.d.ts +18 -0
- package/dist/timeline/rolling-activity.d.ts +11 -0
- package/dist/timeline/screenshot-lightbox.d.ts +16 -1
- package/dist/timeline/shared.d.ts +8 -3
- package/dist/timeline/startup-preference.d.ts +3 -0
- package/dist/timeline/startup-timings.d.ts +4 -0
- package/dist/timeline/tool-display-name.d.ts +2 -1
- package/dist/timeline/turn-summary.d.ts +32 -3
- package/dist/timeline/types.d.ts +141 -7
- package/dist/timeline-annotation-markers-GNDHTGBD.js +165 -0
- package/dist/timeline-annotation-markers-GNDHTGBD.js.map +1 -0
- package/dist/timeline-annotation-selection-DMLMM2TX.js +241 -0
- package/dist/timeline-annotation-selection-DMLMM2TX.js.map +1 -0
- package/dist/timeline-annotations-dialog-ELRDBHTS.js +273 -0
- package/dist/timeline-annotations-dialog-ELRDBHTS.js.map +1 -0
- package/dist/types/machines.d.ts +2 -2
- package/dist/usage/allowance-copy.d.ts +25 -0
- package/dist/usage/summary.d.ts +35 -0
- package/dist/usage.d.ts +13 -0
- package/dist/usage.js +1074 -0
- package/dist/usage.js.map +1 -0
- package/package.json +44 -4
- package/src/accounts.tsx +1072 -0
- package/src/approvals.ts +8 -1
- package/src/artifacts.ts +42 -0
- package/src/assets/README.md +8 -0
- package/src/assets/gmail.ico +0 -0
- package/src/assets/outlook.ico +0 -0
- package/src/capability-catalog-row.tsx +94 -0
- package/src/capability-logo-fallback.ts +22 -0
- package/src/client.ts +22 -13
- package/src/commands/registry.ts +18 -15
- package/src/commands/types.ts +2 -0
- package/src/components/anthropic-mark.tsx +10 -0
- package/src/components/approval-surface.tsx +171 -37
- package/src/components/artifacts/artifact-chrome.tsx +413 -0
- package/src/components/artifacts/artifact-sandbox.tsx +185 -0
- package/src/components/artifacts/artifact-surface.tsx +39 -19
- package/src/components/artifacts/chat-interactive-block.tsx +260 -0
- package/src/components/artifacts/deferred-chat-media.tsx +67 -0
- package/src/components/artifacts/document-editor.tsx +141 -16
- package/src/components/artifacts/editable-artifact-ui.tsx +4 -2
- package/src/components/artifacts/editable-artifact-view.tsx +187 -0
- package/src/components/artifacts/editable-artifact-workbench.tsx +5 -2
- package/src/components/artifacts/editable-document.tsx +37 -36
- package/src/components/artifacts/editable-presentation.tsx +36 -18
- package/src/components/artifacts/editable-spreadsheet.tsx +5 -2
- package/src/components/artifacts/index.ts +44 -0
- package/src/components/artifacts/inline-html-document.ts +24 -0
- package/src/components/artifacts/latest-task-runner.ts +49 -0
- package/src/components/artifacts/presentation-editor.tsx +323 -67
- package/src/components/artifacts/published-html-artifact-frame.tsx +338 -5
- package/src/components/artifacts/session-artifact-viewer.tsx +376 -0
- package/src/components/artifacts/site-view.tsx +116 -0
- package/src/components/artifacts/spreadsheet-canvas.ts +5 -10
- package/src/components/artifacts/spreadsheet-general-display.ts +43 -0
- package/src/components/artifacts/spreadsheet-grid.tsx +12 -13
- package/src/components/artifacts/visualization-assets/base.css +1015 -0
- package/src/components/artifacts/visualization-assets/helpers.html +349 -0
- package/src/components/artifacts/visualization-assets.gen.ts +3 -0
- package/src/components/browser-select-control.tsx +312 -0
- package/src/components/browser-viewer.tsx +1054 -314
- package/src/components/chat-composer.tsx +131 -85
- package/src/components/child-session-link.tsx +27 -0
- package/src/components/claude-mark.tsx +10 -0
- package/src/components/code-editor.tsx +13 -16
- package/src/components/composer-transcription-control.tsx +7 -5
- package/src/components/composer.tsx +376 -49
- package/src/components/computer-viewer.tsx +1041 -329
- package/src/components/copy-button.tsx +13 -5
- package/src/components/desktop-viewer.tsx +1 -1
- package/src/components/enrollment-consent.tsx +65 -7
- package/src/components/enrollment-device-flow.tsx +1 -1
- package/src/components/file-browser.tsx +158 -34
- package/src/components/fleet-tile.tsx +8 -16
- package/src/components/generated-video-player.tsx +4 -2
- package/src/components/grok-mark.tsx +33 -0
- package/src/components/human-input-form.tsx +455 -114
- package/src/components/human-input-surface.tsx +18 -7
- package/src/components/interaction-intervention-banner.tsx +2 -2
- package/src/components/machine-card.tsx +119 -4
- package/src/components/machine-dock-bar.tsx +1 -1
- package/src/components/machine-input-display.ts +23 -2
- package/src/components/machines/machine-detail.tsx +52 -2
- package/src/components/machines/machine-operation-policy.tsx +179 -0
- package/src/components/machines-dashboard.tsx +8 -17
- package/src/components/markdown-table-layout.ts +132 -0
- package/src/components/markdown.tsx +473 -44
- package/src/components/message-timeline.tsx +2498 -663
- package/src/components/model-mark.tsx +90 -0
- package/src/components/model-picker.tsx +15 -4
- package/src/components/model-policy-picker-menu.tsx +424 -0
- package/src/components/model-policy-picker.tsx +337 -381
- package/src/components/open-geni-chat.tsx +319 -0
- package/src/components/open-geni-links.tsx +179 -0
- package/src/components/openrouter-mark.tsx +13 -0
- package/src/components/pierre-diff.tsx +41 -16
- package/src/components/pierre-file.tsx +36 -11
- package/src/components/preview-loading.tsx +154 -0
- package/src/components/queue-item-content.ts +14 -0
- package/src/components/queue-surface-implementation.tsx +132 -42
- package/src/components/queue-surface-state.tsx +3 -1
- package/src/components/sandbox-files.tsx +267 -35
- package/src/components/sandbox-terminal.tsx +48 -11
- package/src/components/sandbox-workspace.tsx +337 -135
- package/src/components/session-capability-frame.tsx +192 -0
- package/src/components/session-chrome.tsx +1027 -328
- package/src/components/session-commands-panel.tsx +126 -0
- package/src/components/session-commands.tsx +18 -0
- package/src/components/session-connection-request.tsx +97 -0
- package/src/components/session-conversation.tsx +512 -0
- package/src/components/session-list.tsx +250 -0
- package/src/components/session-mcp-capability-card.tsx +680 -0
- package/src/components/session-status.tsx +1 -1
- package/src/components/timeline-anchor.tsx +119 -0
- package/src/components/timeline-annotation-chrome.tsx +196 -0
- package/src/components/timeline-annotation-layout.ts +268 -0
- package/src/components/timeline-annotation-markers.tsx +185 -0
- package/src/components/timeline-annotation-reveal-context.ts +9 -0
- package/src/components/timeline-annotation-selection.tsx +106 -54
- package/src/components/timeline-annotation-shared.ts +245 -0
- package/src/components/timeline-annotations-dialog.tsx +185 -128
- package/src/components/timeline-annotations.tsx +189 -45
- package/src/components/timeline-reading-progress.ts +80 -0
- package/src/components/timeline-search.tsx +168 -0
- package/src/components/timeline-settlement.ts +60 -0
- package/src/components/tip-follow.ts +70 -7
- package/src/components/tooltip.tsx +38 -5
- package/src/components/usage-limit-notice.tsx +179 -0
- package/src/components/usage-member-list.tsx +792 -0
- package/src/components/usage-meter.tsx +382 -0
- package/src/components/use-viewer-menu-dismiss.ts +33 -0
- package/src/components/user-message-body.tsx +194 -49
- package/src/components/workspace-dock.tsx +141 -175
- package/src/composer.ts +6 -1
- package/src/connect-account-identity.tsx +34 -0
- package/src/connect-accounts.tsx +233 -0
- package/src/connect-chooser.tsx +336 -0
- package/src/connect-panel.tsx +99 -0
- package/src/connect-setup.tsx +307 -0
- package/src/connect.ts +60 -0
- package/src/connection-assets.d.ts +4 -0
- package/src/connection-catalog.tsx +162 -0
- package/src/connection-discovery.tsx +235 -0
- package/src/connection-installed.tsx +51 -0
- package/src/connection-logo.tsx +37 -0
- package/src/connection-service-logo.tsx +55 -0
- package/src/connection-service-presentation.ts +46 -0
- package/src/connection-skeleton.tsx +16 -0
- package/src/connection-type-picker.tsx +36 -0
- package/src/conversation-timeline.ts +92 -0
- package/src/desktop.ts +24 -0
- package/src/device-authorization.tsx +98 -0
- package/src/diffs.ts +16 -0
- package/src/discovery-cache.ts +42 -0
- package/src/editor.ts +13 -0
- package/src/embedded-session-client.ts +104 -0
- package/src/file-node-visibility.ts +66 -0
- package/src/hooks/channel-cache.ts +104 -0
- package/src/hooks/internal.ts +3 -2
- package/src/hooks/latest-question.ts +164 -0
- package/src/hooks/shared-machines-list.ts +239 -0
- package/src/hooks/use-attached-browsers.ts +5 -1
- package/src/hooks/use-available-models.ts +20 -14
- package/src/hooks/use-browser-frame-stream.ts +25 -3
- package/src/hooks/use-browser-session.ts +271 -71
- package/src/hooks/use-browser-sessions.ts +7 -1
- package/src/hooks/use-channels.ts +32 -10
- package/src/hooks/use-codex-accounts.ts +78 -21
- package/src/hooks/use-composer.ts +1034 -320
- package/src/hooks/use-computer-frame-stream.ts +39 -16
- package/src/hooks/use-computer-input-posture.ts +94 -0
- package/src/hooks/use-computer-session.ts +110 -32
- package/src/hooks/use-computer-sessions.ts +8 -1
- package/src/hooks/use-connect.ts +23 -0
- package/src/hooks/use-desktop-stream.ts +19 -28
- package/src/hooks/use-file-attachments.ts +118 -10
- package/src/hooks/use-goal.ts +36 -9
- package/src/hooks/use-human-input.ts +31 -4
- package/src/hooks/use-last-started-turn-policy.ts +15 -13
- package/src/hooks/use-machine-chip.ts +23 -6
- package/src/hooks/use-machines.ts +104 -6
- package/src/hooks/use-sandbox-files.ts +253 -150
- package/src/hooks/use-sandbox-git.ts +58 -29
- package/src/hooks/use-session-background-commands.ts +67 -0
- package/src/hooks/use-session-capabilities.ts +21 -2
- package/src/hooks/use-session-events.ts +759 -433
- package/src/hooks/use-session-lineage.ts +28 -6
- package/src/hooks/use-session-mcp-approval-policy.ts +13 -5
- package/src/hooks/use-session.ts +75 -16
- package/src/hooks/use-slash-commands.ts +6 -11
- package/src/hooks/use-turn-queue.ts +113 -13
- package/src/hooks/use-usage.ts +100 -0
- package/src/hooks/use-voice-input.ts +12 -1
- package/src/hooks/use-workspace-capture.ts +3 -2
- package/src/hooks/use-workspace-edit.ts +23 -5
- package/src/hooks/use-workspace-sessions.ts +99 -11
- package/src/human-input.ts +12 -1
- package/src/identity-link-accounts.tsx +148 -0
- package/src/identity-link-consent.tsx +192 -0
- package/src/index.ts +157 -12
- package/src/interaction.ts +1 -0
- package/src/lib/error-message.ts +37 -0
- package/src/lib/format.ts +150 -14
- package/src/lib/host-theme.ts +511 -0
- package/src/lib/interaction-errors.ts +33 -0
- package/src/lib/menu-styles.ts +44 -0
- package/src/lib/pierre-diffs-loader.ts +53 -0
- package/src/lib/workbench-peers.ts +62 -0
- package/src/lib/xterm-theme.ts +23 -21
- package/src/machines.ts +9 -1
- package/src/mcp-connection-status.ts +35 -0
- package/src/model-policy.ts +223 -69
- package/src/older-history.ts +87 -0
- package/src/plugin-details.tsx +185 -0
- package/src/plugin-discovery.tsx +196 -0
- package/src/provider.tsx +55 -14
- package/src/realtime/dropdown-menu.tsx +19 -12
- package/src/realtime/realtime-control.tsx +274 -60
- package/src/session-auth-recommendation.ts +48 -0
- package/src/session-capability-policy.ts +83 -0
- package/src/session-context.ts +1 -0
- package/src/session-ui.ts +66 -2
- package/src/session.ts +18 -1
- package/src/sites-ui.tsx +402 -0
- package/src/sites.ts +3 -0
- package/src/skill-discovery.tsx +208 -0
- package/src/terminal.ts +26 -0
- package/src/timeline/activity-rail.tsx +171 -80
- package/src/timeline/allowance-exhausted-row.tsx +86 -0
- package/src/timeline/compaction-copy.ts +42 -0
- package/src/timeline/entrance.tsx +28 -3
- package/src/timeline/fleet-decision-projection.ts +2 -1
- package/src/timeline/fleet-decision-row.tsx +1 -0
- package/src/timeline/genie-loading.tsx +136 -0
- package/src/timeline/index.ts +11 -0
- package/src/timeline/knowledge-receipt.tsx +100 -0
- package/src/timeline/parsers.ts +2 -2
- package/src/timeline/platform-activity-row.tsx +216 -0
- package/src/timeline/presented-image.ts +49 -0
- package/src/timeline/projection.ts +1600 -84
- package/src/timeline/registry.ts +15 -3
- package/src/timeline/retained-image.ts +97 -0
- package/src/timeline/rolling-activity.tsx +92 -0
- package/src/timeline/screenshot-lightbox.tsx +115 -17
- package/src/timeline/shared.tsx +47 -15
- package/src/timeline/startup-preference.ts +33 -0
- package/src/timeline/startup-timings.tsx +145 -0
- package/src/timeline/tool-display-name.ts +8 -6
- package/src/timeline/tool-renderers.tsx +497 -128
- package/src/timeline/turn-summary.tsx +208 -44
- package/src/timeline/types.ts +186 -7
- package/src/types/machines.ts +10 -0
- package/src/usage/allowance-copy.ts +64 -0
- package/src/usage/summary.ts +93 -0
- package/src/usage.ts +50 -0
- package/styles/compiled.css +2098 -757
- package/styles/connect.css +284 -0
- package/styles/connect.d.ts +1 -0
- package/styles/effective-tokens.css +1 -0
- package/styles/index.css +201 -9
- package/styles/responsive.css +27 -1
- package/styles/session-capability.css +44 -0
- package/styles/tokens.css +135 -65
- package/dist/chunk-5UQPNLIO.js.map +0 -1
- package/dist/chunk-6KLX2RH5.js.map +0 -1
- package/dist/chunk-7WCLAEFV.js.map +0 -1
- package/dist/chunk-B6WPZSTT.js.map +0 -1
- package/dist/chunk-FK6VG4LL.js +0 -90
- package/dist/chunk-FK6VG4LL.js.map +0 -1
- package/dist/chunk-HA46CYQK.js.map +0 -1
- package/dist/chunk-HUIKIDM5.js.map +0 -1
- package/dist/chunk-IGC6A2ZI.js.map +0 -1
- package/dist/chunk-KCGXPP5V.js.map +0 -1
- package/dist/chunk-KZ73RL76.js.map +0 -1
- package/dist/chunk-LAKLF4PA.js +0 -141
- package/dist/chunk-LAKLF4PA.js.map +0 -1
- package/dist/chunk-LLOLUHVG.js.map +0 -1
- package/dist/chunk-MKPIAGVL.js +0 -465
- package/dist/chunk-MKPIAGVL.js.map +0 -1
- package/dist/chunk-PEI6RANI.js.map +0 -1
- package/dist/chunk-R3AZOAB5.js.map +0 -1
- package/dist/chunk-WSK7G5LE.js +0 -170
- package/dist/chunk-WSK7G5LE.js.map +0 -1
- package/dist/chunk-XBZWOM2K.js +0 -218
- package/dist/chunk-XBZWOM2K.js.map +0 -1
- package/dist/chunk-Y7OEDUJ5.js +0 -8810
- package/dist/chunk-Y7OEDUJ5.js.map +0 -1
- package/dist/fleet-decision-row-GGCAT4E4.js.map +0 -1
- package/dist/hooks/use-packs.d.ts +0 -32
- package/dist/interactive-workbench-viewers-TOHBXJEE.js +0 -15
- package/dist/queue-surface-implementation-2KVJTYXH.js.map +0 -1
- package/dist/timeline-annotation-selection-3L7LHGG2.js +0 -187
- package/dist/timeline-annotation-selection-3L7LHGG2.js.map +0 -1
- package/dist/timeline-annotations-dialog-U7EVLR75.js +0 -196
- package/dist/timeline-annotations-dialog-U7EVLR75.js.map +0 -1
- package/src/hooks/use-packs.ts +0 -157
- /package/dist/{interactive-workbench-viewers-TOHBXJEE.js.map → browser-viewer-GTR5XQ7X.js.map} +0 -0
|
@@ -1,15 +1,114 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import type { TimelineAnnotationSource } from "@opengeni/sdk";
|
|
2
|
+
import { QuoteIcon, XIcon } from "lucide-react";
|
|
3
|
+
import {
|
|
4
|
+
Suspense,
|
|
5
|
+
lazy,
|
|
6
|
+
useEffect,
|
|
7
|
+
useLayoutEffect,
|
|
8
|
+
useRef,
|
|
9
|
+
useState,
|
|
10
|
+
type ReactNode,
|
|
11
|
+
type RefObject,
|
|
12
|
+
} from "react";
|
|
7
13
|
import { cn } from "../lib/cn";
|
|
14
|
+
import {
|
|
15
|
+
AnnotationAccentRow,
|
|
16
|
+
AnnotationNotePreview,
|
|
17
|
+
AnnotationQuoteSourceButton,
|
|
18
|
+
type TimelineAnnotationLike,
|
|
19
|
+
} from "./timeline-annotation-chrome";
|
|
20
|
+
import { ANNOTATION_CARD_STACK_SCROLL_AT } from "./timeline-annotation-layout";
|
|
21
|
+
import {
|
|
22
|
+
TimelineAnnotationSourceRootContext,
|
|
23
|
+
useTimelineAnnotationSourceRoot,
|
|
24
|
+
} from "./timeline-annotation-reveal-context";
|
|
25
|
+
import {
|
|
26
|
+
annotationDisplayOrdinal,
|
|
27
|
+
annotationHasNote,
|
|
28
|
+
resolveAnnotationRevealRoot,
|
|
29
|
+
} from "./timeline-annotation-shared";
|
|
8
30
|
|
|
9
|
-
export type TimelineAnnotationLike
|
|
31
|
+
export type { TimelineAnnotationLike } from "./timeline-annotation-chrome";
|
|
10
32
|
|
|
11
33
|
const TimelineAnnotationsDialog = lazy(() => import("./timeline-annotations-dialog"));
|
|
12
34
|
|
|
35
|
+
function AnnotationSourceRootBridge({
|
|
36
|
+
triggerRef,
|
|
37
|
+
children,
|
|
38
|
+
}: {
|
|
39
|
+
triggerRef: RefObject<HTMLElement | null>;
|
|
40
|
+
children: ReactNode;
|
|
41
|
+
}) {
|
|
42
|
+
const inheritedRoot = useTimelineAnnotationSourceRoot();
|
|
43
|
+
const conversationRootRef = useRef<HTMLElement | null>(null);
|
|
44
|
+
if (!inheritedRoot) {
|
|
45
|
+
conversationRootRef.current = resolveAnnotationRevealRoot(triggerRef.current);
|
|
46
|
+
}
|
|
47
|
+
useLayoutEffect(() => {
|
|
48
|
+
if (inheritedRoot) return;
|
|
49
|
+
conversationRootRef.current = resolveAnnotationRevealRoot(triggerRef.current);
|
|
50
|
+
});
|
|
51
|
+
if (inheritedRoot) return children;
|
|
52
|
+
return (
|
|
53
|
+
<TimelineAnnotationSourceRootContext.Provider value={conversationRootRef}>
|
|
54
|
+
{children}
|
|
55
|
+
</TimelineAnnotationSourceRootContext.Provider>
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export function TimelineAnnotationCards({
|
|
60
|
+
annotations,
|
|
61
|
+
onRevealSource,
|
|
62
|
+
className,
|
|
63
|
+
}: {
|
|
64
|
+
annotations: readonly TimelineAnnotationLike[];
|
|
65
|
+
onRevealSource?: ((source: TimelineAnnotationSource) => boolean) | undefined;
|
|
66
|
+
className?: string | undefined;
|
|
67
|
+
}) {
|
|
68
|
+
const [unavailableId, setUnavailableId] = useState<string | null>(null);
|
|
69
|
+
if (annotations.length === 0) return null;
|
|
70
|
+
return (
|
|
71
|
+
<div
|
|
72
|
+
data-og-annotation-cards=""
|
|
73
|
+
className={cn(
|
|
74
|
+
"grid gap-2",
|
|
75
|
+
annotations.length >= ANNOTATION_CARD_STACK_SCROLL_AT &&
|
|
76
|
+
"max-h-[min(28rem,55vh)] overflow-x-hidden overflow-y-auto overscroll-contain pr-1",
|
|
77
|
+
className,
|
|
78
|
+
)}
|
|
79
|
+
>
|
|
80
|
+
{annotations.map((annotation, index) => {
|
|
81
|
+
const ordinal = annotationDisplayOrdinal(annotation, index);
|
|
82
|
+
return (
|
|
83
|
+
<section key={annotation.id} aria-label={`Annotation ${ordinal}`}>
|
|
84
|
+
<AnnotationAccentRow>
|
|
85
|
+
<p className="mb-0.5 text-og-xs font-medium tabular-nums text-og-fg-subtle">
|
|
86
|
+
Annotation {ordinal}
|
|
87
|
+
</p>
|
|
88
|
+
<AnnotationQuoteSourceButton
|
|
89
|
+
annotation={annotation}
|
|
90
|
+
lines={2}
|
|
91
|
+
onRevealSource={onRevealSource}
|
|
92
|
+
onUnavailable={setUnavailableId}
|
|
93
|
+
/>
|
|
94
|
+
{unavailableId === annotation.id ? (
|
|
95
|
+
<p role="status" className="text-og-xs text-og-status-waiting">
|
|
96
|
+
Source is outside the loaded timeline window.
|
|
97
|
+
</p>
|
|
98
|
+
) : null}
|
|
99
|
+
<AnnotationNotePreview
|
|
100
|
+
note={annotation.note}
|
|
101
|
+
annotationId={annotation.id}
|
|
102
|
+
ordinal={ordinal}
|
|
103
|
+
/>
|
|
104
|
+
</AnnotationAccentRow>
|
|
105
|
+
</section>
|
|
106
|
+
);
|
|
107
|
+
})}
|
|
108
|
+
</div>
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
|
|
13
112
|
export function TimelineAnnotationsChip({
|
|
14
113
|
annotations,
|
|
15
114
|
editable = false,
|
|
@@ -19,6 +118,8 @@ export function TimelineAnnotationsChip({
|
|
|
19
118
|
onRemove,
|
|
20
119
|
onRevealSource,
|
|
21
120
|
className,
|
|
121
|
+
compact = false,
|
|
122
|
+
onCommit,
|
|
22
123
|
}: {
|
|
23
124
|
annotations: readonly TimelineAnnotationLike[];
|
|
24
125
|
editable?: boolean | undefined;
|
|
@@ -26,58 +127,101 @@ export function TimelineAnnotationsChip({
|
|
|
26
127
|
onFocusConsumed?: (() => void) | undefined;
|
|
27
128
|
onUpdate?: ((id: string, note: string) => void) | undefined;
|
|
28
129
|
onRemove?: ((id: string) => void) | undefined;
|
|
130
|
+
/** Return focus to the owning input after all notes are completed with Enter. */
|
|
131
|
+
onCommit?: (() => void) | undefined;
|
|
29
132
|
onRevealSource?: ((source: TimelineAnnotationSource) => boolean) | undefined;
|
|
30
133
|
className?: string | undefined;
|
|
134
|
+
/** Dense trigger for single-line rows such as the compact queue dock. */
|
|
135
|
+
compact?: boolean | undefined;
|
|
31
136
|
}) {
|
|
32
|
-
const [open, setOpen] = useState(false);
|
|
33
|
-
const triggerRef = useRef<HTMLButtonElement | null>(null);
|
|
34
|
-
|
|
35
|
-
if (annotations.length === 0) return null;
|
|
36
137
|
const focusRequested = Boolean(
|
|
37
138
|
focusAnnotationId && annotations.some((item) => item.id === focusAnnotationId),
|
|
38
139
|
);
|
|
39
|
-
const
|
|
140
|
+
const [open, setOpen] = useState(focusRequested);
|
|
141
|
+
const triggerRef = useRef<HTMLButtonElement | null>(null);
|
|
142
|
+
const openedFocusId = useRef<string | null>(focusRequested ? (focusAnnotationId ?? null) : null);
|
|
143
|
+
|
|
144
|
+
useEffect(() => {
|
|
145
|
+
if (!focusRequested || !focusAnnotationId) {
|
|
146
|
+
if (!focusRequested) openedFocusId.current = null;
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
if (openedFocusId.current === focusAnnotationId) return;
|
|
150
|
+
openedFocusId.current = focusAnnotationId;
|
|
151
|
+
setOpen(true);
|
|
152
|
+
}, [focusAnnotationId, focusRequested]);
|
|
153
|
+
|
|
154
|
+
if (annotations.length === 0) return null;
|
|
40
155
|
const countLabel = `${annotations.length} ${annotations.length === 1 ? "annotation" : "annotations"}`;
|
|
156
|
+
const incomplete = annotations.some((annotation) => !annotationHasNote(annotation.note));
|
|
157
|
+
const canClear = Boolean(editable && onRemove);
|
|
158
|
+
|
|
159
|
+
const dismiss = (restoreFocus: boolean) => {
|
|
160
|
+
setOpen(false);
|
|
161
|
+
onFocusConsumed?.();
|
|
162
|
+
if (restoreFocus) triggerRef.current?.focus();
|
|
163
|
+
};
|
|
41
164
|
|
|
42
165
|
return (
|
|
43
|
-
|
|
44
|
-
<
|
|
45
|
-
ref={triggerRef}
|
|
46
|
-
type="button"
|
|
166
|
+
<span className={cn("inline-flex max-w-full items-center", className)}>
|
|
167
|
+
<span
|
|
47
168
|
className={cn(
|
|
48
|
-
"inline-flex
|
|
49
|
-
|
|
169
|
+
"inline-flex max-w-full items-center rounded-full border bg-og-surface-1 text-og-fg-muted",
|
|
170
|
+
incomplete ? "border-og-accent/45 bg-og-accent-soft/50" : "border-og-border",
|
|
50
171
|
)}
|
|
51
|
-
aria-label={`Review ${countLabel}`}
|
|
52
|
-
aria-haspopup="dialog"
|
|
53
|
-
aria-expanded={visible}
|
|
54
|
-
onClick={() => setOpen((current) => !current)}
|
|
55
172
|
>
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
173
|
+
<button
|
|
174
|
+
ref={triggerRef}
|
|
175
|
+
type="button"
|
|
176
|
+
className={cn(
|
|
177
|
+
"inline-flex min-w-0 max-w-full items-center gap-1.5 rounded-full border-0 bg-transparent font-medium outline-hidden transition hover:text-og-fg focus-visible:ring-2 focus-visible:ring-og-accent pointer-coarse:min-h-[44px]",
|
|
178
|
+
compact ? "min-h-6 py-0.5 text-og-xs" : "min-h-8 py-1 text-og-sm",
|
|
179
|
+
canClear ? "pr-1 pl-2.5" : "px-2.5",
|
|
180
|
+
)}
|
|
181
|
+
aria-label={`Review ${countLabel}`}
|
|
182
|
+
aria-haspopup="dialog"
|
|
183
|
+
aria-expanded={open}
|
|
184
|
+
onClick={() => setOpen((current) => !current)}
|
|
185
|
+
>
|
|
186
|
+
<QuoteIcon className="size-3.5 shrink-0 text-og-accent" aria-hidden="true" />
|
|
187
|
+
<span className="min-w-0 truncate">{countLabel}</span>
|
|
188
|
+
</button>
|
|
189
|
+
{canClear ? (
|
|
190
|
+
<button
|
|
191
|
+
type="button"
|
|
192
|
+
className="inline-flex size-7 shrink-0 items-center justify-center rounded-full border-0 bg-transparent text-og-fg-subtle outline-hidden hover:text-og-status-failed focus-visible:ring-2 focus-visible:ring-og-accent pointer-coarse:size-11"
|
|
193
|
+
aria-label="Remove all annotations"
|
|
194
|
+
onClick={() => {
|
|
195
|
+
for (const annotation of annotations) onRemove?.(annotation.id);
|
|
76
196
|
}}
|
|
77
|
-
|
|
78
|
-
|
|
197
|
+
>
|
|
198
|
+
<XIcon className="size-3.5" aria-hidden="true" />
|
|
199
|
+
</button>
|
|
200
|
+
) : null}
|
|
201
|
+
</span>
|
|
202
|
+
{open ? (
|
|
203
|
+
<AnnotationSourceRootBridge triggerRef={triggerRef}>
|
|
204
|
+
<Suspense fallback={null}>
|
|
205
|
+
<TimelineAnnotationsDialog
|
|
206
|
+
annotations={annotations}
|
|
207
|
+
editable={editable}
|
|
208
|
+
focusAnnotationId={focusAnnotationId}
|
|
209
|
+
onFocusConsumed={onFocusConsumed}
|
|
210
|
+
onUpdate={onUpdate}
|
|
211
|
+
onRemove={onRemove}
|
|
212
|
+
onRevealSource={onRevealSource}
|
|
213
|
+
triggerRef={triggerRef}
|
|
214
|
+
countLabel={countLabel}
|
|
215
|
+
onDismiss={dismiss}
|
|
216
|
+
onCommit={() => {
|
|
217
|
+
dismiss(!onCommit);
|
|
218
|
+
onCommit?.();
|
|
219
|
+
}}
|
|
220
|
+
/>
|
|
221
|
+
</Suspense>
|
|
222
|
+
</AnnotationSourceRootBridge>
|
|
79
223
|
) : null}
|
|
80
|
-
|
|
224
|
+
</span>
|
|
81
225
|
);
|
|
82
226
|
}
|
|
83
227
|
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { useCallback, useLayoutEffect, useMemo, useRef, useState } from "react";
|
|
2
|
+
import type { TimelineGroup } from "../timeline/types";
|
|
3
|
+
import { timelineHasReader } from "./timeline-anchor";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Settlement may compact history, but cannot remove prose beneath a reader.
|
|
7
|
+
* Keep only progress that was already primary on the preceding commit; loading
|
|
8
|
+
* settled history never expands it. An explicit work toggle or tip return ends
|
|
9
|
+
* the protection. Keeping the original sibling keys also preserves selection.
|
|
10
|
+
*/
|
|
11
|
+
export function useReadingProgress(
|
|
12
|
+
projected: TimelineGroup[],
|
|
13
|
+
pinned: boolean,
|
|
14
|
+
scroller: HTMLElement | null,
|
|
15
|
+
) {
|
|
16
|
+
const following = pinned && !timelineHasReader(scroller);
|
|
17
|
+
const previous = useRef<TimelineGroup[]>([]);
|
|
18
|
+
const [released, setReleased] = useState<ReadonlySet<string>>(() => new Set());
|
|
19
|
+
const groups = useMemo(() => {
|
|
20
|
+
if (following) return projected;
|
|
21
|
+
const key = (group: TimelineGroup) => (group.kind === "item" ? group.item.id : group.id);
|
|
22
|
+
const visible = new Set(previous.current.map(key));
|
|
23
|
+
const retained = new Map<string, TimelineGroup>();
|
|
24
|
+
const compact = projected.map((group): TimelineGroup => {
|
|
25
|
+
if (group.kind !== "activity" || !group.work?.endedAt || released.has(group.id)) {
|
|
26
|
+
return group;
|
|
27
|
+
}
|
|
28
|
+
const progress = group.work.details.filter(
|
|
29
|
+
(child) =>
|
|
30
|
+
child.kind === "item" &&
|
|
31
|
+
child.item.kind === "agent-message" &&
|
|
32
|
+
visible.has(child.item.id),
|
|
33
|
+
);
|
|
34
|
+
if (!progress.length) return group;
|
|
35
|
+
for (const child of progress) retained.set(key(child), child);
|
|
36
|
+
return {
|
|
37
|
+
...group,
|
|
38
|
+
work: {
|
|
39
|
+
...group.work,
|
|
40
|
+
details: group.work.details.filter((child) => !retained.has(key(child))),
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
});
|
|
44
|
+
if (!retained.size) return compact;
|
|
45
|
+
// Keep prose before the same retained sibling, including attention rows.
|
|
46
|
+
// Merely hoisting it before Work would still move its DOM across those rows
|
|
47
|
+
// and invalidate a browser selection despite retaining React keys.
|
|
48
|
+
const current = new Set(compact.map(key));
|
|
49
|
+
const before = new Map<string | null, TimelineGroup[]>();
|
|
50
|
+
let next: string | null = null;
|
|
51
|
+
for (let index = previous.current.length - 1; index >= 0; index--) {
|
|
52
|
+
const id = key(previous.current[index]!);
|
|
53
|
+
const child = retained.get(id);
|
|
54
|
+
if (child) before.set(next, [child, ...(before.get(next) ?? [])]);
|
|
55
|
+
else if (current.has(id)) next = id;
|
|
56
|
+
}
|
|
57
|
+
return [
|
|
58
|
+
...compact.flatMap((group) => [...(before.get(key(group)) ?? []), group]),
|
|
59
|
+
...(before.get(null) ?? []),
|
|
60
|
+
];
|
|
61
|
+
}, [projected, following, released]);
|
|
62
|
+
useLayoutEffect(() => {
|
|
63
|
+
previous.current = groups;
|
|
64
|
+
if (following && released.size) setReleased(new Set());
|
|
65
|
+
}, [groups, following, released]);
|
|
66
|
+
const release = useCallback(
|
|
67
|
+
(id: string | null) => {
|
|
68
|
+
if (
|
|
69
|
+
!id ||
|
|
70
|
+
!projected.some(
|
|
71
|
+
(group) => group.kind === "activity" && group.id === id && group.work?.endedAt,
|
|
72
|
+
)
|
|
73
|
+
)
|
|
74
|
+
return;
|
|
75
|
+
setReleased((current) => (current.has(id) ? current : new Set([...current, id])));
|
|
76
|
+
},
|
|
77
|
+
[projected],
|
|
78
|
+
);
|
|
79
|
+
return { groups, release };
|
|
80
|
+
}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { createContext, useContext, useLayoutEffect, useRef, type RefObject } from "react";
|
|
2
|
+
import type { TimelineItem } from "../timeline/types";
|
|
3
|
+
import { annotatableText, rangeFromOffsets, visibleClientRect } from "./timeline-annotation-shared";
|
|
4
|
+
|
|
5
|
+
export type TimelineSearchTarget = {
|
|
6
|
+
sequence: number;
|
|
7
|
+
eventId?: string | undefined;
|
|
8
|
+
/** Literal, case-insensitive text. No regex interpretation. */
|
|
9
|
+
query: string;
|
|
10
|
+
/** Zero-based occurrence within the source message. Defaults to zero. */
|
|
11
|
+
occurrence?: number | undefined;
|
|
12
|
+
/**
|
|
13
|
+
* Zero-based UTF-16 offset of the match in the original message text, as
|
|
14
|
+
* reported by backend all-occurrence search (messageMatchOffset). When set
|
|
15
|
+
* it takes precedence over `occurrence` and is validated against `query`,
|
|
16
|
+
* so a stale offset degrades to no highlight rather than a wrong one.
|
|
17
|
+
*/
|
|
18
|
+
offset?: number | undefined;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
/** Scoped to the target's group; disclosure expansion persists after closing find. */
|
|
22
|
+
export const TimelineSearchRevealContext = createContext<string | null>(null);
|
|
23
|
+
export const useTimelineSearchReveal = () => useContext(TimelineSearchRevealContext);
|
|
24
|
+
|
|
25
|
+
export function isTimelineSearchTarget(item: TimelineItem, target: TimelineSearchTarget): boolean {
|
|
26
|
+
const sources =
|
|
27
|
+
item.sourceEvents ??
|
|
28
|
+
("annotationSource" in item && item.annotationSource ? [item.annotationSource] : []);
|
|
29
|
+
return sources.some(
|
|
30
|
+
(source) =>
|
|
31
|
+
source.sequence === target.sequence && (!target.eventId || source.eventId === target.eventId),
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** Scan without allocating an offset array proportional to a huge message. */
|
|
36
|
+
export function literalSearchOffset(text: string, query: string, occurrence = 0): number {
|
|
37
|
+
if (!query || !Number.isSafeInteger(occurrence) || occurrence < 0) return -1;
|
|
38
|
+
// Regex escaping preserves UTF-16 offsets even for case folds whose lowercase
|
|
39
|
+
// string representation changes length (for example dotted capital I).
|
|
40
|
+
const pattern = new RegExp(query.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "giu");
|
|
41
|
+
let match: RegExpExecArray | null;
|
|
42
|
+
let index = 0;
|
|
43
|
+
while ((match = pattern.exec(text))) {
|
|
44
|
+
if (index++ === occurrence) return match.index;
|
|
45
|
+
}
|
|
46
|
+
return -1;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Validate a caller-supplied UTF-16 offset against the text and query. The
|
|
51
|
+
* sticky flag pins the match to exactly `offset`; like literalSearchOffset,
|
|
52
|
+
* regex escaping keeps offsets in UTF-16 units even for length-changing case
|
|
53
|
+
* folds. Returns -1 when the offset is stale or the text no longer matches.
|
|
54
|
+
*/
|
|
55
|
+
export function matchAtOffset(text: string, query: string, offset: number): number {
|
|
56
|
+
if (!query || !Number.isSafeInteger(offset) || offset < 0 || offset > text.length) return -1;
|
|
57
|
+
const pattern = new RegExp(query.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "iyu");
|
|
58
|
+
pattern.lastIndex = offset;
|
|
59
|
+
// Unicode regex engines may rewind a lastIndex inside a surrogate pair.
|
|
60
|
+
return pattern.exec(text)?.index === offset ? offset : -1;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Resolve a target to a UTF-16 offset: explicit offset wins, else the ordinal scan. */
|
|
64
|
+
export function searchMatchOffset(text: string, target: TimelineSearchTarget): number {
|
|
65
|
+
if (target.offset != null) return matchAtOffset(text, target.query, target.offset);
|
|
66
|
+
return literalSearchOffset(text, target.query, target.occurrence);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
type HighlightRegistry = { set(name: string, value: unknown): void; delete(name: string): void };
|
|
70
|
+
let nextHighlightId = 0;
|
|
71
|
+
|
|
72
|
+
/** Range highlighting does not mutate React-owned text or its layout. */
|
|
73
|
+
export function useTimelineSearchNavigation(
|
|
74
|
+
root: RefObject<HTMLDivElement | null>,
|
|
75
|
+
itemId: string | undefined,
|
|
76
|
+
target: TimelineSearchTarget | null | undefined,
|
|
77
|
+
releasePin: () => void,
|
|
78
|
+
revision: unknown,
|
|
79
|
+
) {
|
|
80
|
+
const highlightName = useRef("");
|
|
81
|
+
if (!highlightName.current) highlightName.current = `og-search-${++nextHighlightId}`;
|
|
82
|
+
const key = target
|
|
83
|
+
? JSON.stringify([
|
|
84
|
+
itemId,
|
|
85
|
+
target.sequence,
|
|
86
|
+
target.eventId,
|
|
87
|
+
target.query,
|
|
88
|
+
target.occurrence ?? 0,
|
|
89
|
+
target.offset ?? null,
|
|
90
|
+
])
|
|
91
|
+
: null;
|
|
92
|
+
const navigated = useRef<string | null>(null);
|
|
93
|
+
useLayoutEffect(() => {
|
|
94
|
+
if (!key) navigated.current = null;
|
|
95
|
+
if (!key || !target || !itemId || !root.current) return;
|
|
96
|
+
releasePin();
|
|
97
|
+
const scroller = root.current;
|
|
98
|
+
const registry = (
|
|
99
|
+
globalThis.CSS as (typeof CSS & { highlights?: HighlightRegistry }) | undefined
|
|
100
|
+
)?.highlights;
|
|
101
|
+
const HighlightClass = (
|
|
102
|
+
globalThis as unknown as { Highlight?: new (...ranges: Range[]) => unknown }
|
|
103
|
+
).Highlight;
|
|
104
|
+
const style = document.createElement("style");
|
|
105
|
+
style.textContent = `::highlight(${highlightName.current}) { background: var(--og-color-accent-deep); color: var(--og-color-accent-fg); }`;
|
|
106
|
+
scroller.append(style);
|
|
107
|
+
let frame = 0;
|
|
108
|
+
const update = () => {
|
|
109
|
+
const source = [...scroller.querySelectorAll<HTMLElement>("[data-og-search-item]")].find(
|
|
110
|
+
(element) => element.dataset.ogSearchItem === itemId,
|
|
111
|
+
);
|
|
112
|
+
if (!source) return;
|
|
113
|
+
// A virtualized renderer can explicitly identify the selected occurrence
|
|
114
|
+
// when earlier occurrences are not mounted. Never accept a stale marker
|
|
115
|
+
// belonging to a different sequence, occurrence, or query.
|
|
116
|
+
const materialized = [
|
|
117
|
+
...source.querySelectorAll<HTMLElement>("[data-og-search-occurrence]"),
|
|
118
|
+
].find(
|
|
119
|
+
(element) =>
|
|
120
|
+
element.dataset.ogSearchSequence === String(target.sequence) &&
|
|
121
|
+
element.dataset.ogSearchQuery === target.query &&
|
|
122
|
+
(target.offset != null
|
|
123
|
+
? element.dataset.ogSearchOffset === String(target.offset)
|
|
124
|
+
: element.dataset.ogSearchOccurrence === String(target.occurrence ?? 0)),
|
|
125
|
+
);
|
|
126
|
+
const { text, spans } = annotatableText(materialized ?? source);
|
|
127
|
+
// Inside a materialized chunk the match starts at the chunk start.
|
|
128
|
+
// Raw source offsets must NEVER be interpreted as rendered DOM offsets:
|
|
129
|
+
// even matching characters can identify a different repeated occurrence.
|
|
130
|
+
const offset = materialized
|
|
131
|
+
? matchAtOffset(text, target.query, 0)
|
|
132
|
+
: target.offset != null
|
|
133
|
+
? -1
|
|
134
|
+
: searchMatchOffset(text, target);
|
|
135
|
+
const range =
|
|
136
|
+
offset < 0 ? null : rangeFromOffsets(spans, offset, offset + target.query.length);
|
|
137
|
+
if (range && registry && HighlightClass)
|
|
138
|
+
registry.set(highlightName.current, new HighlightClass(range));
|
|
139
|
+
else registry?.delete(highlightName.current);
|
|
140
|
+
const rect = range ? visibleClientRect(range) : null;
|
|
141
|
+
// A custom renderer may mount the message body later (or materialize a
|
|
142
|
+
// virtualized chunk in response to renderMessageText's search context).
|
|
143
|
+
// Finding its empty shell is not proof that the occurrence was revealed.
|
|
144
|
+
if (navigated.current === key || !range || !rect) return;
|
|
145
|
+
const box = rect;
|
|
146
|
+
if (!box.height && !box.width) return;
|
|
147
|
+
scroller.scrollTop +=
|
|
148
|
+
box.top - scroller.getBoundingClientRect().top - scroller.clientHeight / 2;
|
|
149
|
+
navigated.current = key;
|
|
150
|
+
};
|
|
151
|
+
const schedule = () => {
|
|
152
|
+
cancelAnimationFrame(frame);
|
|
153
|
+
frame = requestAnimationFrame(update);
|
|
154
|
+
};
|
|
155
|
+
const observer = new MutationObserver(schedule);
|
|
156
|
+
observer.observe(scroller, { childList: true, subtree: true, characterData: true });
|
|
157
|
+
const resize = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(schedule);
|
|
158
|
+
resize?.observe(scroller);
|
|
159
|
+
schedule();
|
|
160
|
+
return () => {
|
|
161
|
+
observer.disconnect();
|
|
162
|
+
resize?.disconnect();
|
|
163
|
+
cancelAnimationFrame(frame);
|
|
164
|
+
registry?.delete(highlightName.current);
|
|
165
|
+
style.remove();
|
|
166
|
+
};
|
|
167
|
+
}, [key, root, itemId, target, releasePin, revision]);
|
|
168
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { TimelineGroup } from "../timeline/types";
|
|
2
|
+
import { timelineHasReader } from "./timeline-anchor";
|
|
3
|
+
|
|
4
|
+
export type TimelineSettlement = { element: HTMLElement; top: number };
|
|
5
|
+
|
|
6
|
+
/** Capture only a retained answer at a real live→settled boundary, never history load. */
|
|
7
|
+
export function captureTimelineSettlement(
|
|
8
|
+
scroller: HTMLElement,
|
|
9
|
+
groups: readonly { key: string; group: TimelineGroup }[],
|
|
10
|
+
): TimelineSettlement | null {
|
|
11
|
+
// Selectionchange can arrive after this commit. Inspect ownership directly
|
|
12
|
+
// as well as the caller's pin latch so that race cannot move selected text.
|
|
13
|
+
if (timelineHasReader(scroller)) return null;
|
|
14
|
+
const live = Array.from(
|
|
15
|
+
scroller.querySelectorAll(
|
|
16
|
+
'[data-og-exchange-status="working"], [data-og-exchange-status="waiting"]',
|
|
17
|
+
),
|
|
18
|
+
);
|
|
19
|
+
// At the live tip the newest retained answer owns the transition. An older
|
|
20
|
+
// waiting/incomplete row must not mask it, including batched settlements.
|
|
21
|
+
for (const status of live.reverse()) {
|
|
22
|
+
const row = status.closest<HTMLElement>("[data-og-group-key]");
|
|
23
|
+
const index = groups.findIndex(({ key }) => key === row?.dataset.ogGroupKey);
|
|
24
|
+
const work = groups[index]?.group;
|
|
25
|
+
const answer = groups[index + 1];
|
|
26
|
+
if (
|
|
27
|
+
work?.kind !== "activity" ||
|
|
28
|
+
!work.work?.endedAt ||
|
|
29
|
+
answer?.group.kind !== "item" ||
|
|
30
|
+
answer.group.item.kind !== "agent-message"
|
|
31
|
+
)
|
|
32
|
+
continue;
|
|
33
|
+
const element = Array.from(scroller.querySelectorAll<HTMLElement>("[data-og-group-key]")).find(
|
|
34
|
+
(node) => node.dataset.ogGroupKey === answer.key,
|
|
35
|
+
);
|
|
36
|
+
if (element) return { element, top: element.getBoundingClientRect().top };
|
|
37
|
+
}
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Folding earlier prose can clamp scrollTop before paint. Keep the retained
|
|
43
|
+
* answer visually continuous after the normal scroll authority has run. This
|
|
44
|
+
* is one local position transition, not a new scroll writer or a presence tree.
|
|
45
|
+
*/
|
|
46
|
+
export function animateTimelineSettlement(snapshot: TimelineSettlement): Animation | null {
|
|
47
|
+
const { element, top } = snapshot;
|
|
48
|
+
if (!element.isConnected || typeof element.animate !== "function") return null;
|
|
49
|
+
const delta = top - element.getBoundingClientRect().top;
|
|
50
|
+
if (Math.abs(delta) < 1) return null;
|
|
51
|
+
return element.animate(
|
|
52
|
+
[{ transform: `translateY(${delta}px)` }, { transform: "translateY(0)" }],
|
|
53
|
+
{
|
|
54
|
+
id: "og-timeline-settlement",
|
|
55
|
+
// Match the existing activity-rail collapse; reduced motion is gated by the caller.
|
|
56
|
+
duration: 320,
|
|
57
|
+
easing: "cubic-bezier(0.22, 1, 0.36, 1)",
|
|
58
|
+
},
|
|
59
|
+
);
|
|
60
|
+
}
|