@opengeni/react 1.0.1 → 1.0.2-canary.37202341988001
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 +660 -21
- package/dist/accounts.d.ts +64 -0
- package/dist/accounts.js +822 -0
- package/dist/accounts.js.map +1 -0
- package/dist/approvals.d.ts +2 -1
- package/dist/artifacts-document.js +3 -2
- package/dist/artifacts-presentation.js +3 -2
- package/dist/artifacts-spreadsheet.js +2 -2
- package/dist/artifacts.d.ts +4 -1
- package/dist/artifacts.js +518 -42
- package/dist/artifacts.js.map +1 -1
- package/dist/browser-viewer-SHYKQRNX.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-26ZNDDLZ.js +453 -0
- package/dist/chunk-26ZNDDLZ.js.map +1 -0
- package/dist/chunk-3CTRFMAK.js +359 -0
- package/dist/chunk-3CTRFMAK.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-742CZ3L3.js +481 -0
- package/dist/chunk-742CZ3L3.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-6KLX2RH5.js → chunk-DO544OSV.js} +1075 -79
- package/dist/chunk-DO544OSV.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-HA46CYQK.js → chunk-EESD3PY3.js} +792 -537
- package/dist/chunk-EESD3PY3.js.map +1 -0
- package/dist/{chunk-5UQPNLIO.js → chunk-EN3YTHKR.js} +4117 -3896
- package/dist/chunk-EN3YTHKR.js.map +1 -0
- package/dist/chunk-ERGYJIBB.js +21 -0
- package/dist/chunk-ERGYJIBB.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-GYVRFZDY.js +2733 -0
- package/dist/chunk-GYVRFZDY.js.map +1 -0
- package/dist/{chunk-LLOLUHVG.js → chunk-HDJWDK7W.js} +1358 -2746
- package/dist/chunk-HDJWDK7W.js.map +1 -0
- package/dist/chunk-I7IWRQLN.js +1608 -0
- package/dist/chunk-I7IWRQLN.js.map +1 -0
- package/dist/chunk-IT4BJUGF.js +13055 -0
- package/dist/chunk-IT4BJUGF.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-J6DBS4T3.js +371 -0
- package/dist/chunk-J6DBS4T3.js.map +1 -0
- package/dist/{chunk-B6WPZSTT.js → chunk-JIQYUGVL.js} +1331 -1163
- package/dist/chunk-JIQYUGVL.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-PEI6RANI.js → chunk-PNY3JKBJ.js} +309 -74
- package/dist/chunk-PNY3JKBJ.js.map +1 -0
- package/dist/chunk-RHREZ7BO.js +11 -0
- package/dist/chunk-RHREZ7BO.js.map +1 -0
- package/dist/chunk-RLUSC2WA.js +299 -0
- package/dist/chunk-RLUSC2WA.js.map +1 -0
- package/dist/{chunk-IGC6A2ZI.js → chunk-RSI7XYXL.js} +777 -246
- package/dist/chunk-RSI7XYXL.js.map +1 -0
- package/dist/chunk-SCOTPE2I.js +589 -0
- package/dist/chunk-SCOTPE2I.js.map +1 -0
- package/dist/{chunk-C5ZPSSS5.js → chunk-TKOTKRWY.js} +5 -4
- package/dist/{chunk-C5ZPSSS5.js.map → chunk-TKOTKRWY.js.map} +1 -1
- 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-WGXVEJO5.js +319 -0
- package/dist/chunk-WGXVEJO5.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-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-YM2DE7BQ.js +3124 -0
- package/dist/chunk-YM2DE7BQ.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-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 +58 -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 +89 -0
- package/dist/components/session-list.d.ts +36 -0
- package/dist/components/session-mcp-capability-card.d.ts +41 -0
- package/dist/components/session-proxy-scope.d.ts +21 -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-6SRGWRUX.js +19 -0
- package/dist/computer-viewer-6SRGWRUX.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 +2238 -6201
- 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-HTRIS4KJ.js +117 -0
- package/dist/latest-question-HTRIS4KJ.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-M54ISBMN.js +14 -0
- package/dist/model-policy-picker-menu-M54ISBMN.js.map +1 -0
- package/dist/model-policy.d.ts +19 -3
- package/dist/model-policy.js +9 -1
- package/dist/older-history.d.ts +30 -0
- package/dist/platform-activity-row-627BFZ46.js +182 -0
- package/dist/platform-activity-row-627BFZ46.js.map +1 -0
- package/dist/plugin-details.d.ts +14 -0
- package/dist/plugin-discovery.d.ts +25 -0
- package/dist/provider.d.ts +13 -1
- package/dist/{queue-surface-implementation-2KVJTYXH.js → queue-surface-implementation-ZHFI5JBP.js} +131 -44
- package/dist/queue-surface-implementation-ZHFI5JBP.js.map +1 -0
- package/dist/realtime/realtime-control.d.ts +6 -3
- package/dist/realtime.js +133 -74
- package/dist/realtime.js.map +1 -1
- package/dist/sandbox-files-GORZOUUJ.js +20 -0
- package/dist/sandbox-files-GORZOUUJ.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 +34 -3
- package/dist/timeline/types.d.ts +147 -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 +2754 -665
- 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 +338 -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 +526 -0
- package/src/components/session-list.tsx +250 -0
- package/src/components/session-mcp-capability-card.tsx +680 -0
- package/src/components/session-proxy-scope.tsx +92 -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-video-artifact-playback.ts +1 -1
- package/src/hooks/use-voice-input.ts +12 -1
- package/src/hooks/use-workspace-capture.ts +3 -2
- package/src/hooks/use-workspace-edit.ts +23 -5
- package/src/hooks/use-workspace-sessions.ts +99 -11
- package/src/human-input.ts +12 -1
- package/src/identity-link-accounts.tsx +148 -0
- package/src/identity-link-consent.tsx +192 -0
- package/src/index.ts +157 -12
- package/src/interaction.ts +1 -0
- package/src/lib/error-message.ts +37 -0
- package/src/lib/format.ts +150 -14
- package/src/lib/host-theme.ts +511 -0
- package/src/lib/interaction-errors.ts +33 -0
- package/src/lib/menu-styles.ts +44 -0
- package/src/lib/pierre-diffs-loader.ts +53 -0
- package/src/lib/workbench-peers.ts +62 -0
- package/src/lib/xterm-theme.ts +23 -21
- package/src/machines.ts +9 -1
- package/src/mcp-connection-status.ts +35 -0
- package/src/model-policy.ts +223 -69
- package/src/older-history.ts +87 -0
- package/src/plugin-details.tsx +185 -0
- package/src/plugin-discovery.tsx +196 -0
- package/src/provider.tsx +55 -14
- package/src/realtime/dropdown-menu.tsx +19 -12
- package/src/realtime/realtime-control.tsx +133 -46
- package/src/session-auth-recommendation.ts +48 -0
- package/src/session-capability-policy.ts +83 -0
- package/src/session-context.ts +4 -3
- 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 +1609 -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 +218 -44
- package/src/timeline/types.ts +192 -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-SHYKQRNX.js.map} +0 -0
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { SessionHumanInputRequest, SubmitHumanInputResponseRequest } from "@opengeni/sdk";
|
|
2
2
|
import { useEffect, useMemo, useRef } from "react";
|
|
3
|
+
import { isActionableHumanInputRequest } from "../human-input";
|
|
3
4
|
import { cn } from "../lib/cn";
|
|
4
5
|
import {
|
|
5
6
|
HumanInputForm,
|
|
@@ -8,6 +9,7 @@ import {
|
|
|
8
9
|
} from "./human-input-form";
|
|
9
10
|
|
|
10
11
|
export type HumanInputSurfaceProps = {
|
|
12
|
+
loadSkillReview?: HumanInputFormProps["loadSkillReview"];
|
|
11
13
|
requests: SessionHumanInputRequest[];
|
|
12
14
|
onSubmit: (requestId: string, response: SubmitHumanInputResponseRequest) => void | Promise<void>;
|
|
13
15
|
respondingRequestId?: string | null | undefined;
|
|
@@ -16,32 +18,39 @@ export type HumanInputSurfaceProps = {
|
|
|
16
18
|
className?: string | undefined;
|
|
17
19
|
/** Forwarded to the active form. Defaults true. */
|
|
18
20
|
autoFocus?: boolean | undefined;
|
|
21
|
+
/** Forwarded to the active form: yes/no decisions as two buttons. */
|
|
22
|
+
decisionButtons?: boolean | undefined;
|
|
19
23
|
};
|
|
20
24
|
|
|
21
25
|
/**
|
|
22
26
|
* One decision shell for pending structured human-input requests. Parallel
|
|
23
|
-
* freezes are shown one at a time (oldest first) as “N of M”;
|
|
27
|
+
* freezes are shown one at a time (oldest first) as “N of M”; Send answers/Skip
|
|
24
28
|
* settles the active request and the next remaining set advances automatically
|
|
25
29
|
* when the authoritative pending list updates.
|
|
26
30
|
*/
|
|
27
31
|
export function HumanInputSurface({
|
|
28
32
|
requests,
|
|
29
33
|
onSubmit,
|
|
34
|
+
loadSkillReview,
|
|
30
35
|
respondingRequestId = null,
|
|
31
36
|
error,
|
|
32
37
|
messages,
|
|
33
38
|
className,
|
|
34
39
|
autoFocus = true,
|
|
40
|
+
decisionButtons,
|
|
35
41
|
}: HumanInputSurfaceProps) {
|
|
36
42
|
const batchTotalRef = useRef(0);
|
|
37
43
|
|
|
38
44
|
const ordered = useMemo(() => {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
+
const now = Date.now();
|
|
46
|
+
return requests
|
|
47
|
+
.filter((request) => isActionableHumanInputRequest(request, now))
|
|
48
|
+
.sort((a, b) => {
|
|
49
|
+
const aAt = a.createdAt ? Date.parse(a.createdAt) : 0;
|
|
50
|
+
const bAt = b.createdAt ? Date.parse(b.createdAt) : 0;
|
|
51
|
+
if (aAt !== bAt) return aAt - bAt;
|
|
52
|
+
return a.id.localeCompare(b.id);
|
|
53
|
+
});
|
|
45
54
|
}, [requests]);
|
|
46
55
|
|
|
47
56
|
useEffect(() => {
|
|
@@ -64,10 +73,12 @@ export function HumanInputSurface({
|
|
|
64
73
|
|
|
65
74
|
const formProps: HumanInputFormProps = {
|
|
66
75
|
request: active,
|
|
76
|
+
loadSkillReview,
|
|
67
77
|
submitting: respondingRequestId !== null,
|
|
68
78
|
error: error ?? null,
|
|
69
79
|
progressLabel,
|
|
70
80
|
autoFocus,
|
|
81
|
+
decisionButtons,
|
|
71
82
|
...(messages ? { messages } : {}),
|
|
72
83
|
onSubmit: (response) => onSubmit(active.id, response),
|
|
73
84
|
};
|
|
@@ -50,7 +50,7 @@ export function InteractionInterventionBanner({
|
|
|
50
50
|
type="button"
|
|
51
51
|
onClick={() => onOpen(intervention)}
|
|
52
52
|
disabled={mutating}
|
|
53
|
-
className="h-7 shrink-0 rounded-og-sm border border-og-border bg-og-
|
|
53
|
+
className="h-7 shrink-0 rounded-og-sm border border-og-primary-border bg-og-primary px-2.5 text-og-control font-medium text-og-primary-fg transition hover:bg-og-primary-hover disabled:opacity-50"
|
|
54
54
|
>
|
|
55
55
|
Open
|
|
56
56
|
</button>
|
|
@@ -59,7 +59,7 @@ export function InteractionInterventionBanner({
|
|
|
59
59
|
type="button"
|
|
60
60
|
onClick={() => onResolve(intervention, "completed")}
|
|
61
61
|
disabled={mutating}
|
|
62
|
-
className="inline-flex h-7 shrink-0 items-center gap-1 rounded-og-sm bg-og-
|
|
62
|
+
className="inline-flex h-7 shrink-0 items-center gap-1 rounded-og-sm border border-og-primary-border bg-og-primary text-og-primary-fg px-2.5 text-og-control font-medium transition hover:bg-og-primary-hover disabled:opacity-50"
|
|
63
63
|
>
|
|
64
64
|
{mutating ? (
|
|
65
65
|
<LoaderCircleIcon className="size-3 animate-spin" />
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
|
+
AlertTriangleIcon,
|
|
2
3
|
ArrowRightIcon,
|
|
3
4
|
CpuIcon,
|
|
5
|
+
CircleCheckIcon,
|
|
6
|
+
DownloadIcon,
|
|
4
7
|
LaptopIcon,
|
|
5
8
|
MonitorIcon,
|
|
6
9
|
MonitorOffIcon,
|
|
10
|
+
LoaderCircleIcon,
|
|
7
11
|
ServerIcon,
|
|
8
12
|
UsersIcon,
|
|
9
13
|
} from "lucide-react";
|
|
@@ -20,6 +24,9 @@ export type MachineCardProps = {
|
|
|
20
24
|
onAttach?: ((machine: MachineView) => void) | undefined;
|
|
21
25
|
/** Whether an attach/swap is currently in flight (disables the affordance). */
|
|
22
26
|
attaching?: boolean | undefined;
|
|
27
|
+
/** Start/retry the exact signed Connected Machine agent update. */
|
|
28
|
+
onUpdateAgent?: ((machine: MachineView) => void) | undefined;
|
|
29
|
+
updatingAgent?: boolean | undefined;
|
|
23
30
|
/** Short recent history (e.g. 15m) — drives the card's CPU trend + preview. */
|
|
24
31
|
series?: MetricSample[] | undefined;
|
|
25
32
|
/** Open the full per-machine telemetry detail. Makes the whole card actionable. */
|
|
@@ -29,10 +36,12 @@ export type MachineCardProps = {
|
|
|
29
36
|
};
|
|
30
37
|
|
|
31
38
|
function KindIcon({ machine }: { machine: MachineView }) {
|
|
32
|
-
if (machine.
|
|
39
|
+
if (machine.kind === "local" || machine.kind === "selfhosted")
|
|
40
|
+
return <LaptopIcon className="size-4 text-og-fg-subtle" aria-hidden />;
|
|
41
|
+
if (machine.kind === "docker" || machine.isSessionGroup)
|
|
33
42
|
return <ServerIcon className="size-4 text-og-fg-subtle" aria-hidden />;
|
|
34
43
|
if (machine.kind === "modal") return <CpuIcon className="size-4 text-og-fg-subtle" aria-hidden />;
|
|
35
|
-
return <
|
|
44
|
+
return <ServerIcon className="size-4 text-og-fg-subtle" aria-hidden />;
|
|
36
45
|
}
|
|
37
46
|
|
|
38
47
|
/**
|
|
@@ -45,6 +54,8 @@ export function MachineCard({
|
|
|
45
54
|
machine,
|
|
46
55
|
onAttach,
|
|
47
56
|
attaching,
|
|
57
|
+
onUpdateAgent,
|
|
58
|
+
updatingAgent,
|
|
48
59
|
series,
|
|
49
60
|
onOpenDetail,
|
|
50
61
|
now,
|
|
@@ -59,6 +70,44 @@ export function MachineCard({
|
|
|
59
70
|
: null;
|
|
60
71
|
const cpuPts = (series ?? []).map((s) => ({ t: new Date(s.sampledAt).getTime(), v: s.cpuPct }));
|
|
61
72
|
const openable = Boolean(onOpenDetail);
|
|
73
|
+
const runtime = machine.runtime;
|
|
74
|
+
const updateRunning = runtime?.versionState === "updating";
|
|
75
|
+
const dispatchConfirmationStalled =
|
|
76
|
+
runtime?.update?.status === "requested" &&
|
|
77
|
+
clockNow - new Date(runtime.update.updatedAt).getTime() >= 30_000;
|
|
78
|
+
const canUpdate =
|
|
79
|
+
Boolean(machine.enrollmentId && onUpdateAgent) &&
|
|
80
|
+
!offline &&
|
|
81
|
+
!runtime?.updateBlockedReason &&
|
|
82
|
+
(runtime?.versionState === "outdated" ||
|
|
83
|
+
runtime?.versionState === "update_failed" ||
|
|
84
|
+
dispatchConfirmationStalled);
|
|
85
|
+
const updateLabel = (() => {
|
|
86
|
+
const update = runtime?.update;
|
|
87
|
+
if (!update) return null;
|
|
88
|
+
switch (update.status) {
|
|
89
|
+
case "requested":
|
|
90
|
+
return dispatchConfirmationStalled ? "Agent confirmation delayed" : "Confirming with agent";
|
|
91
|
+
case "accepted":
|
|
92
|
+
return "Update accepted";
|
|
93
|
+
case "waiting_for_idle":
|
|
94
|
+
return "Waiting for current work";
|
|
95
|
+
case "downloading":
|
|
96
|
+
case "verifying":
|
|
97
|
+
case "applying":
|
|
98
|
+
return `${update.status}…`;
|
|
99
|
+
case "restarting":
|
|
100
|
+
return "Restarting agent";
|
|
101
|
+
case "succeeded":
|
|
102
|
+
return `Updated · v${update.targetVersion}`;
|
|
103
|
+
case "failed": {
|
|
104
|
+
const detail = update.errorCode?.replaceAll("_", " ");
|
|
105
|
+
return update.rolledBack
|
|
106
|
+
? `Update rolled back safely${detail ? ` · ${detail}` : ""}`
|
|
107
|
+
: `Update failed${detail ? ` · ${detail}` : ""}`;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
})();
|
|
62
111
|
|
|
63
112
|
return (
|
|
64
113
|
<div
|
|
@@ -108,10 +157,12 @@ export function MachineCard({
|
|
|
108
157
|
) : null}
|
|
109
158
|
</div>
|
|
110
159
|
<div className="mt-0.5 flex flex-wrap items-center gap-x-2 gap-y-0.5 text-og-xs text-og-fg-subtle">
|
|
111
|
-
<span className="capitalize">
|
|
112
|
-
{machine.
|
|
160
|
+
<span data-machine-scope={machine.scope} className="capitalize">
|
|
161
|
+
{machine.scope === "user" ? "personal" : machine.scope}
|
|
113
162
|
</span>
|
|
114
163
|
<span aria-hidden>·</span>
|
|
164
|
+
<span className="capitalize">{machine.kind}</span>
|
|
165
|
+
<span aria-hidden>·</span>
|
|
115
166
|
<span className="font-og-mono">
|
|
116
167
|
{machine.os}/{machine.arch}
|
|
117
168
|
</span>
|
|
@@ -146,6 +197,70 @@ export function MachineCard({
|
|
|
146
197
|
</p>
|
|
147
198
|
) : null}
|
|
148
199
|
|
|
200
|
+
{machine.connectionAuthority.duplicateRunnerDeniedCount > 0 ? (
|
|
201
|
+
<p
|
|
202
|
+
data-runner-conflict
|
|
203
|
+
className="flex items-center gap-1.5 rounded-og-md border border-og-status-failed/30 bg-og-status-failed/5 px-2.5 py-1.5 text-og-xs text-og-status-failed"
|
|
204
|
+
>
|
|
205
|
+
<AlertTriangleIcon className="size-3.5 shrink-0" aria-hidden />
|
|
206
|
+
Competing agent process blocked. Open diagnostics for details.
|
|
207
|
+
</p>
|
|
208
|
+
) : null}
|
|
209
|
+
|
|
210
|
+
{runtime ? (
|
|
211
|
+
<div
|
|
212
|
+
data-agent-runtime
|
|
213
|
+
className="flex items-center justify-between gap-3 rounded-og-md border border-og-border/70 bg-og-surface-2/35 px-2.5 py-2 text-og-xs"
|
|
214
|
+
>
|
|
215
|
+
<div className="min-w-0">
|
|
216
|
+
<div className="flex items-center gap-1.5 text-og-fg-muted">
|
|
217
|
+
{runtime.versionState === "current" ? (
|
|
218
|
+
<CircleCheckIcon className="size-3.5 text-og-status-idle" aria-hidden />
|
|
219
|
+
) : updateRunning ? (
|
|
220
|
+
<LoaderCircleIcon className="size-3.5 animate-og-spin text-og-accent" aria-hidden />
|
|
221
|
+
) : (
|
|
222
|
+
<DownloadIcon className="size-3.5" aria-hidden />
|
|
223
|
+
)}
|
|
224
|
+
<span className="truncate">
|
|
225
|
+
Agent{" "}
|
|
226
|
+
{runtime.installedVersion ? `v${runtime.installedVersion}` : "version unknown"}
|
|
227
|
+
</span>
|
|
228
|
+
</div>
|
|
229
|
+
<p className="mt-0.5 truncate text-og-fg-subtle">
|
|
230
|
+
{updateLabel ??
|
|
231
|
+
(runtime.versionState === "current"
|
|
232
|
+
? `Current · ${runtime.updateChannel ?? "channel unknown"}`
|
|
233
|
+
: runtime.desiredVersion
|
|
234
|
+
? `Promoted v${runtime.desiredVersion}`
|
|
235
|
+
: "No promoted version configured")}
|
|
236
|
+
</p>
|
|
237
|
+
{runtime.updateBlockedReason ? (
|
|
238
|
+
<p className="mt-1 text-og-fg-muted">{runtime.updateBlockedReason}</p>
|
|
239
|
+
) : null}
|
|
240
|
+
</div>
|
|
241
|
+
{canUpdate ? (
|
|
242
|
+
<button
|
|
243
|
+
type="button"
|
|
244
|
+
data-update-agent
|
|
245
|
+
disabled={updatingAgent}
|
|
246
|
+
onClick={(event) => {
|
|
247
|
+
event.stopPropagation();
|
|
248
|
+
onUpdateAgent?.(machine);
|
|
249
|
+
}}
|
|
250
|
+
className="shrink-0 rounded-og-sm border border-og-border px-2 py-1 font-medium text-og-fg-muted transition-colors hover:border-og-border-strong hover:text-og-fg disabled:cursor-not-allowed disabled:opacity-50 pointer-coarse:min-h-11"
|
|
251
|
+
>
|
|
252
|
+
{updatingAgent
|
|
253
|
+
? "Starting…"
|
|
254
|
+
: dispatchConfirmationStalled
|
|
255
|
+
? "Retry delivery"
|
|
256
|
+
: runtime.versionState === "update_failed"
|
|
257
|
+
? "Retry"
|
|
258
|
+
: "Update"}
|
|
259
|
+
</button>
|
|
260
|
+
) : null}
|
|
261
|
+
</div>
|
|
262
|
+
) : null}
|
|
263
|
+
|
|
149
264
|
<MachineMetrics metrics={machine.metrics} />
|
|
150
265
|
|
|
151
266
|
{/* CPU trend — previews the history and invites opening the detail. */}
|
|
@@ -23,7 +23,7 @@ export type MachineDockBarProps = {
|
|
|
23
23
|
* chrome (the dock-parity contract: selfhosted == Modal for the surfaces).
|
|
24
24
|
*/
|
|
25
25
|
export function MachineDockBar({ name, kind, state, className }: MachineDockBarProps) {
|
|
26
|
-
const Icon = kind === "selfhosted" ? LaptopIcon : CpuIcon;
|
|
26
|
+
const Icon = kind === "selfhosted" || kind === "local" ? LaptopIcon : CpuIcon;
|
|
27
27
|
const stateBadge = MACHINE_STATE_BADGE_META[state];
|
|
28
28
|
return (
|
|
29
29
|
<div
|
|
@@ -3,10 +3,17 @@ import type { MachineInputMember } from "../timeline/types";
|
|
|
3
3
|
export const MACHINE_INPUT_META: Record<MachineInputMember["kind"], string> = {
|
|
4
4
|
scheduled_occurrence: "Scheduled update",
|
|
5
5
|
goal_continuation: "Goal continued",
|
|
6
|
+
background_command_result: "Command result received",
|
|
7
|
+
session_wait_timeout: "Wait ended",
|
|
6
8
|
agent_message: "Agent update",
|
|
7
9
|
agent_steer_instruction: "Agent direction",
|
|
8
|
-
child_terminal_result: "Agent
|
|
10
|
+
child_terminal_result: "Agent result received",
|
|
9
11
|
media_generation_result: "Video update",
|
|
12
|
+
child_requires_action: "Agent needs input",
|
|
13
|
+
child_requires_action_resolved: "Agent unblocked",
|
|
14
|
+
child_paused: "Agent paused",
|
|
15
|
+
child_waiting_capacity: "Agent waiting for capacity",
|
|
16
|
+
child_progress: "Agent progress",
|
|
10
17
|
};
|
|
11
18
|
|
|
12
19
|
/**
|
|
@@ -23,8 +30,12 @@ export function machineInputBatchLabel(members: readonly MachineInputMember[]):
|
|
|
23
30
|
const kind = members[0]!.kind;
|
|
24
31
|
const n = members.length;
|
|
25
32
|
switch (kind) {
|
|
33
|
+
case "background_command_result":
|
|
34
|
+
return n === 1 ? "Command result received" : `${n} command results received`;
|
|
35
|
+
case "session_wait_timeout":
|
|
36
|
+
return n === 1 ? "Wait ended" : `${n} waits ended`;
|
|
26
37
|
case "child_terminal_result":
|
|
27
|
-
return n === 1 ? "Agent
|
|
38
|
+
return n === 1 ? "Agent result received" : `${n} agent results received`;
|
|
28
39
|
case "goal_continuation":
|
|
29
40
|
return n === 1 ? "Goal continued" : `${n} goal continuations`;
|
|
30
41
|
case "scheduled_occurrence":
|
|
@@ -35,6 +46,16 @@ export function machineInputBatchLabel(members: readonly MachineInputMember[]):
|
|
|
35
46
|
return n === 1 ? "Agent direction" : `${n} agent directions`;
|
|
36
47
|
case "media_generation_result":
|
|
37
48
|
return n === 1 ? "Video ready" : `${n} video updates`;
|
|
49
|
+
case "child_requires_action":
|
|
50
|
+
return n === 1 ? "Agent needs input" : `${n} agents need input`;
|
|
51
|
+
case "child_requires_action_resolved":
|
|
52
|
+
return n === 1 ? "Agent unblocked" : `${n} agents unblocked`;
|
|
53
|
+
case "child_paused":
|
|
54
|
+
return n === 1 ? "Agent paused" : `${n} agents paused`;
|
|
55
|
+
case "child_waiting_capacity":
|
|
56
|
+
return n === 1 ? "Agent waiting for capacity" : `${n} agents waiting for capacity`;
|
|
57
|
+
case "child_progress":
|
|
58
|
+
return n === 1 ? "Agent progress" : `${n} agent progress notes`;
|
|
38
59
|
}
|
|
39
60
|
}
|
|
40
61
|
const parts = [...counts.entries()].map(([kind, count]) => {
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
// `og-*` token system — no new visual language, just the missing depth.
|
|
8
8
|
// ----------------------------------------------------------------------------
|
|
9
9
|
import {
|
|
10
|
+
AlertTriangleIcon,
|
|
10
11
|
ArrowLeftIcon,
|
|
11
12
|
CpuIcon,
|
|
12
13
|
LaptopIcon,
|
|
@@ -21,6 +22,8 @@ import { deriveHealth, HEALTH_TOKEN, healthPulses } from "./health";
|
|
|
21
22
|
import { MetricHistoryChart } from "./metric-history-chart";
|
|
22
23
|
import { MetricSparkline } from "./metric-sparkline";
|
|
23
24
|
import { METRICS, METRIC_WINDOWS, pointsFor, WINDOW_LABEL, type MetricWindow } from "./series";
|
|
25
|
+
import { MachineOperationPolicyEditor } from "./machine-operation-policy";
|
|
26
|
+
import type { UpdateMachineOperationPolicyRequest } from "@opengeni/sdk";
|
|
24
27
|
|
|
25
28
|
export type MachineDetailProps = {
|
|
26
29
|
machine: MachineView;
|
|
@@ -32,14 +35,21 @@ export type MachineDetailProps = {
|
|
|
32
35
|
onBack?: (() => void) | undefined;
|
|
33
36
|
/** Open the workspace-admin removal confirmation for a self-hosted machine. */
|
|
34
37
|
onRemove?: ((machine: MachineView) => void) | undefined;
|
|
38
|
+
onUpdateOperationPolicy?:
|
|
39
|
+
| ((machine: MachineView, request: UpdateMachineOperationPolicyRequest) => Promise<unknown>)
|
|
40
|
+
| undefined;
|
|
41
|
+
updatingOperationPolicy?: boolean | undefined;
|
|
35
42
|
now?: number | undefined;
|
|
36
43
|
className?: string | undefined;
|
|
37
44
|
};
|
|
38
45
|
|
|
39
46
|
function KindIcon({ kind, session }: { kind: string; session: boolean }) {
|
|
40
|
-
if (
|
|
47
|
+
if (kind === "local" || kind === "selfhosted")
|
|
48
|
+
return <LaptopIcon className="size-4 text-og-fg-subtle" aria-hidden />;
|
|
49
|
+
if (kind === "docker" || session)
|
|
50
|
+
return <ServerIcon className="size-4 text-og-fg-subtle" aria-hidden />;
|
|
41
51
|
if (kind === "modal") return <CpuIcon className="size-4 text-og-fg-subtle" aria-hidden />;
|
|
42
|
-
return <
|
|
52
|
+
return <ServerIcon className="size-4 text-og-fg-subtle" aria-hidden />;
|
|
43
53
|
}
|
|
44
54
|
|
|
45
55
|
export function MachineDetail({
|
|
@@ -50,6 +60,8 @@ export function MachineDetail({
|
|
|
50
60
|
loadingSeries,
|
|
51
61
|
onBack,
|
|
52
62
|
onRemove,
|
|
63
|
+
onUpdateOperationPolicy,
|
|
64
|
+
updatingOperationPolicy,
|
|
53
65
|
now = Date.now(),
|
|
54
66
|
className,
|
|
55
67
|
}: MachineDetailProps) {
|
|
@@ -57,6 +69,10 @@ export function MachineDetail({
|
|
|
57
69
|
const tone = HEALTH_TOKEN[health.level];
|
|
58
70
|
const latest = machine.metrics;
|
|
59
71
|
const sampledAgo = latest ? formatRelativeTime(latest.sampledAt, new Date(now)) : null;
|
|
72
|
+
const authority = machine.connectionAuthority;
|
|
73
|
+
const duplicateDeniedAgo = authority.duplicateRunnerDeniedAt
|
|
74
|
+
? formatRelativeTime(authority.duplicateRunnerDeniedAt, new Date(now))
|
|
75
|
+
: null;
|
|
60
76
|
|
|
61
77
|
// Only render metrics that have a value (GPU is dropped on headless boxes).
|
|
62
78
|
const visible = METRICS.filter((m) => !(m.key === "gpu" && latest?.gpuUtilPct == null));
|
|
@@ -206,8 +222,42 @@ export function MachineDetail({
|
|
|
206
222
|
})}
|
|
207
223
|
</div>
|
|
208
224
|
)}
|
|
225
|
+
|
|
226
|
+
{authority.state !== "not_applicable" ? (
|
|
227
|
+
<div
|
|
228
|
+
data-connection-authority={authority.state}
|
|
229
|
+
className="flex flex-wrap items-center justify-between gap-2 rounded-og-md border border-og-border bg-og-surface-1/75 px-3 py-2 text-og-xs"
|
|
230
|
+
>
|
|
231
|
+
<span className="text-og-fg-muted">
|
|
232
|
+
Runner {authority.state.replace("_", " ")} · generation {authority.generation}
|
|
233
|
+
{authority.supersededCount > 0
|
|
234
|
+
? ` · ${authority.supersededCount} earlier ${authority.supersededCount === 1 ? "runner" : "runners"} fenced`
|
|
235
|
+
: ""}
|
|
236
|
+
</span>
|
|
237
|
+
{authority.duplicateRunnerDeniedCount > 0 ? (
|
|
238
|
+
<span className="inline-flex items-center gap-1.5 text-og-status-failed">
|
|
239
|
+
<AlertTriangleIcon className="size-3.5" aria-hidden />
|
|
240
|
+
Blocked {authority.duplicateRunnerDeniedCount} competing runner
|
|
241
|
+
{authority.duplicateRunnerDeniedCount === 1 ? "" : "s"}
|
|
242
|
+
{duplicateDeniedAgo
|
|
243
|
+
? ` · ${duplicateDeniedAgo === "now" ? "now" : `${duplicateDeniedAgo} ago`}`
|
|
244
|
+
: ""}
|
|
245
|
+
</span>
|
|
246
|
+
) : null}
|
|
247
|
+
</div>
|
|
248
|
+
) : null}
|
|
209
249
|
</div>
|
|
210
250
|
|
|
251
|
+
{onUpdateOperationPolicy && machine.enrollmentId && machine.operationPolicy ? (
|
|
252
|
+
<MachineOperationPolicyEditor
|
|
253
|
+
policy={machine.operationPolicy}
|
|
254
|
+
memorySupported={machine.runtime?.capabilities.operationResourcePolicy === true}
|
|
255
|
+
cpuSupported={machine.runtime?.capabilities.operationCpuQuota === true}
|
|
256
|
+
saving={updatingOperationPolicy}
|
|
257
|
+
onSave={(request) => onUpdateOperationPolicy(machine, request)}
|
|
258
|
+
/>
|
|
259
|
+
) : null}
|
|
260
|
+
|
|
211
261
|
{/* ── history charts ──────────────────────────────────────────────── */}
|
|
212
262
|
<div className="grid grid-cols-1 gap-3 lg:grid-cols-2">
|
|
213
263
|
{visible.map((m) => {
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { AlertTriangleIcon, Loader2Icon } from "lucide-react";
|
|
2
|
+
import { useEffect, useState, type FormEvent } from "react";
|
|
3
|
+
import type { MachineOperationPolicy, UpdateMachineOperationPolicyRequest } from "@opengeni/sdk";
|
|
4
|
+
|
|
5
|
+
export type MachineOperationPolicyEditorProps = {
|
|
6
|
+
policy: MachineOperationPolicy;
|
|
7
|
+
memorySupported: boolean;
|
|
8
|
+
cpuSupported: boolean;
|
|
9
|
+
saving?: boolean | undefined;
|
|
10
|
+
onSave: (request: UpdateMachineOperationPolicyRequest) => Promise<unknown> | unknown;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
function fieldValue(value: number | null): string {
|
|
14
|
+
return value === null ? "" : String(value);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function parseByteCount(label: string, value: string): number | null {
|
|
18
|
+
const trimmed = value.trim();
|
|
19
|
+
if (!trimmed) return null;
|
|
20
|
+
if (!/^\d+$/.test(trimmed)) {
|
|
21
|
+
throw new Error(`${label} must be a whole number of bytes or blank`);
|
|
22
|
+
}
|
|
23
|
+
const parsed = Number(trimmed);
|
|
24
|
+
if (!Number.isSafeInteger(parsed) || parsed <= 0) {
|
|
25
|
+
throw new Error(`${label} must be a positive safe-integer byte count or blank`);
|
|
26
|
+
}
|
|
27
|
+
return parsed;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function parseCpuMillicores(value: string): number | null {
|
|
31
|
+
const trimmed = value.trim();
|
|
32
|
+
if (!trimmed) return null;
|
|
33
|
+
if (!/^\d+$/.test(trimmed)) {
|
|
34
|
+
throw new Error("CPU maximum must be a whole number of millicores or blank");
|
|
35
|
+
}
|
|
36
|
+
const parsed = Number(trimmed);
|
|
37
|
+
if (!Number.isSafeInteger(parsed) || parsed <= 0 || parsed > 0xffff_ffff) {
|
|
38
|
+
throw new Error("CPU maximum must be between 1 and 4294967295 millicores or blank");
|
|
39
|
+
}
|
|
40
|
+
return parsed;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** Exact editor for the optional per-enrollment command resource policy. Blank
|
|
44
|
+
* values remain genuinely unrestricted; CPU is a period-independent ratio. */
|
|
45
|
+
export function MachineOperationPolicyEditor({
|
|
46
|
+
policy,
|
|
47
|
+
memorySupported,
|
|
48
|
+
cpuSupported,
|
|
49
|
+
saving = false,
|
|
50
|
+
onSave,
|
|
51
|
+
}: MachineOperationPolicyEditorProps) {
|
|
52
|
+
const [memoryMaxBytes, setMemoryMaxBytes] = useState(fieldValue(policy.memoryMaxBytes));
|
|
53
|
+
const [memoryHighBytes, setMemoryHighBytes] = useState(fieldValue(policy.memoryHighBytes));
|
|
54
|
+
const [cpuMaxMillicores, setCpuMaxMillicores] = useState(fieldValue(policy.cpuMaxMillicores));
|
|
55
|
+
const [validationError, setValidationError] = useState<string | null>(null);
|
|
56
|
+
|
|
57
|
+
useEffect(() => {
|
|
58
|
+
setMemoryMaxBytes(fieldValue(policy.memoryMaxBytes));
|
|
59
|
+
setMemoryHighBytes(fieldValue(policy.memoryHighBytes));
|
|
60
|
+
setCpuMaxMillicores(fieldValue(policy.cpuMaxMillicores));
|
|
61
|
+
setValidationError(null);
|
|
62
|
+
}, [policy.memoryMaxBytes, policy.memoryHighBytes, policy.cpuMaxMillicores, policy.revision]);
|
|
63
|
+
|
|
64
|
+
const submit = async (event: FormEvent<HTMLFormElement>) => {
|
|
65
|
+
event.preventDefault();
|
|
66
|
+
try {
|
|
67
|
+
const max = parseByteCount("Hard ceiling", memoryMaxBytes);
|
|
68
|
+
const high = parseByteCount("Reclaim threshold", memoryHighBytes);
|
|
69
|
+
if (max !== null && high !== null && high > max) {
|
|
70
|
+
throw new Error("Reclaim threshold cannot exceed the hard ceiling");
|
|
71
|
+
}
|
|
72
|
+
const cpuMax = parseCpuMillicores(cpuMaxMillicores);
|
|
73
|
+
setValidationError(null);
|
|
74
|
+
await onSave({
|
|
75
|
+
memoryMaxBytes: max,
|
|
76
|
+
memoryHighBytes: high,
|
|
77
|
+
cpuMaxMillicores: cpuMax,
|
|
78
|
+
expectedRevision: policy.revision,
|
|
79
|
+
});
|
|
80
|
+
} catch (error) {
|
|
81
|
+
setValidationError(error instanceof Error ? error.message : String(error));
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
const configured =
|
|
86
|
+
policy.memoryMaxBytes !== null ||
|
|
87
|
+
policy.memoryHighBytes !== null ||
|
|
88
|
+
policy.cpuMaxMillicores !== null;
|
|
89
|
+
const memoryConfigured = policy.memoryMaxBytes !== null || policy.memoryHighBytes !== null;
|
|
90
|
+
const unsupportedMemory = memoryConfigured && !memorySupported;
|
|
91
|
+
const unsupportedCpu = policy.cpuMaxMillicores !== null && (!memorySupported || !cpuSupported);
|
|
92
|
+
|
|
93
|
+
return (
|
|
94
|
+
<section
|
|
95
|
+
data-machine-operation-policy
|
|
96
|
+
className="rounded-og-lg border border-og-border bg-og-surface-1 p-4 shadow-og-sm"
|
|
97
|
+
>
|
|
98
|
+
<div className="flex flex-col gap-1">
|
|
99
|
+
<h2 className="text-og-sm font-semibold text-og-fg">Per-command resource policy</h2>
|
|
100
|
+
<p className="text-og-xs leading-relaxed text-og-fg-muted">
|
|
101
|
+
Optional limits applied separately to each newly admitted exec and Git command. Running
|
|
102
|
+
commands keep their admitted policy. Blank means unrestricted. The runner or host may
|
|
103
|
+
apply a stricter explicit policy; browser, computer-use, and terminal capabilities remain
|
|
104
|
+
unchanged.
|
|
105
|
+
</p>
|
|
106
|
+
</div>
|
|
107
|
+
|
|
108
|
+
{configured && (unsupportedMemory || unsupportedCpu) ? (
|
|
109
|
+
<div className="mt-3 flex gap-2 rounded-og-md border border-og-status-failed/40 bg-og-status-failed/5 p-3 text-og-xs text-og-status-failed">
|
|
110
|
+
<AlertTriangleIcon className="mt-0.5 size-3.5 shrink-0" aria-hidden />
|
|
111
|
+
<span>
|
|
112
|
+
{unsupportedCpu
|
|
113
|
+
? "This runner cannot enforce the configured CPU limit."
|
|
114
|
+
: "This runner cannot enforce the configured memory limit."}{" "}
|
|
115
|
+
Command execution fails closed until the current runner, OS, and service configuration
|
|
116
|
+
can enforce it, or the unsupported limit is cleared. You can still save limits now for
|
|
117
|
+
later enforcement.
|
|
118
|
+
</span>
|
|
119
|
+
</div>
|
|
120
|
+
) : null}
|
|
121
|
+
|
|
122
|
+
<form className="mt-4 grid gap-3 sm:grid-cols-2" onSubmit={submit}>
|
|
123
|
+
<label className="flex flex-col gap-1.5 text-og-xs text-og-fg-muted">
|
|
124
|
+
Hard ceiling (bytes)
|
|
125
|
+
<input
|
|
126
|
+
inputMode="numeric"
|
|
127
|
+
pattern="[0-9]*"
|
|
128
|
+
value={memoryMaxBytes}
|
|
129
|
+
onChange={(event) => setMemoryMaxBytes(event.target.value)}
|
|
130
|
+
placeholder="Unlimited"
|
|
131
|
+
disabled={saving}
|
|
132
|
+
className="min-h-9 rounded-og-sm border border-og-border bg-og-bg px-2.5 font-og-mono text-og-sm text-og-fg outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent/50 disabled:opacity-60"
|
|
133
|
+
/>
|
|
134
|
+
</label>
|
|
135
|
+
<label className="flex flex-col gap-1.5 text-og-xs text-og-fg-muted">
|
|
136
|
+
Reclaim threshold (bytes)
|
|
137
|
+
<input
|
|
138
|
+
inputMode="numeric"
|
|
139
|
+
pattern="[0-9]*"
|
|
140
|
+
value={memoryHighBytes}
|
|
141
|
+
onChange={(event) => setMemoryHighBytes(event.target.value)}
|
|
142
|
+
placeholder="Unlimited"
|
|
143
|
+
disabled={saving}
|
|
144
|
+
className="min-h-9 rounded-og-sm border border-og-border bg-og-bg px-2.5 font-og-mono text-og-sm text-og-fg outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent/50 disabled:opacity-60"
|
|
145
|
+
/>
|
|
146
|
+
</label>
|
|
147
|
+
<label className="flex flex-col gap-1.5 text-og-xs text-og-fg-muted">
|
|
148
|
+
CPU maximum (millicores)
|
|
149
|
+
<input
|
|
150
|
+
inputMode="numeric"
|
|
151
|
+
pattern="[0-9]*"
|
|
152
|
+
value={cpuMaxMillicores}
|
|
153
|
+
onChange={(event) => setCpuMaxMillicores(event.target.value)}
|
|
154
|
+
placeholder="Unlimited"
|
|
155
|
+
disabled={saving}
|
|
156
|
+
className="min-h-9 rounded-og-sm border border-og-border bg-og-bg px-2.5 font-og-mono text-og-sm text-og-fg outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent/50 disabled:opacity-60"
|
|
157
|
+
/>
|
|
158
|
+
<span>1000 millicores = one CPU core. Blank is unlimited.</span>
|
|
159
|
+
</label>
|
|
160
|
+
<div className="flex min-h-9 items-center justify-between gap-3 sm:col-span-2">
|
|
161
|
+
<span
|
|
162
|
+
role={validationError ? "alert" : undefined}
|
|
163
|
+
className="text-og-xs text-og-status-failed"
|
|
164
|
+
>
|
|
165
|
+
{validationError}
|
|
166
|
+
</span>
|
|
167
|
+
<button
|
|
168
|
+
type="submit"
|
|
169
|
+
disabled={saving}
|
|
170
|
+
className="inline-flex min-h-9 items-center gap-1.5 rounded-og-sm border border-og-primary-border bg-og-primary text-og-primary-fg px-3 py-1.5 text-og-xs font-medium transition-colors hover:bg-og-primary-hover disabled:cursor-not-allowed disabled:opacity-60"
|
|
171
|
+
>
|
|
172
|
+
{saving ? <Loader2Icon className="size-3.5 animate-spin" aria-hidden /> : null}
|
|
173
|
+
Save policy
|
|
174
|
+
</button>
|
|
175
|
+
</div>
|
|
176
|
+
</form>
|
|
177
|
+
</section>
|
|
178
|
+
);
|
|
179
|
+
}
|