@harness-mix/cli 0.1.10 → 0.1.12
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/CHANGELOG.md +21 -0
- package/NOTICE +16 -2
- package/README.md +265 -3
- package/docs/cross-platform.md +3 -3
- package/docs/multi-agent-collaboration.md +37 -23
- package/docs/native-acp.md +2 -2
- package/docs/native-codex.md +5 -5
- package/docs/{superpowers/specs → specs}/2026-09-13-native-hardening-design.md +2 -2
- package/docs/storage-verification-design.md +5 -5
- package/licenses/lobe-icons-MIT.txt +21 -0
- package/output/native-build/desktop-controller.mjs +24 -24
- package/output/native-build/harness-mix-secret.exe +0 -0
- package/output/native-build/harness-mix-shim.exe +0 -0
- package/output/native-build/renderer-extension.js +1325 -658
- package/package.json +8 -8
- package/scripts/adapters-test.cjs +9 -1
- package/scripts/antigravity-adapter-test.cjs +381 -284
- package/scripts/build-native.cjs +64 -46
- package/scripts/codex-accounts-test.cjs +1 -1
- package/scripts/codex-accounts-ui-smoke.cjs +1 -1
- package/scripts/collaboration-recovery-test.cjs +11 -2
- package/scripts/collaboration-test.cjs +114 -27
- package/scripts/collaboration-ui-smoke.cjs +45 -8
- package/scripts/concurrency-layers-test.cjs +5 -0
- package/scripts/diagnostics.cjs +1 -1
- package/scripts/e2e-native-host.cjs +13 -13
- package/scripts/error-kind-test.cjs +3 -3
- package/scripts/integrations-test.cjs +2 -2
- package/scripts/integrations-ui-smoke.cjs +6 -6
- package/scripts/native-config-test.cjs +6 -6
- package/scripts/native-job-object-test.cjs +1 -1
- package/scripts/native-protocol-test.cjs +44 -38
- package/scripts/native-rollback-test.cjs +1 -1
- package/scripts/native-secret-test.cjs +1 -1
- package/scripts/native-shim-test.cjs +1 -1
- package/scripts/native-sidebar-test.cjs +4 -4
- package/scripts/native-ui-smoke.cjs +12 -12
- package/scripts/pets-test.cjs +223 -3
- package/scripts/platform-test.cjs +6 -6
- package/scripts/publish-native-package.cjs +1 -1
- package/scripts/test-live-mentions.cjs +2 -2
- package/scripts/workspace-test.cjs +4 -2
- package/src/assets/icons/PROVENANCE.md +92 -0
- package/src/main/adapters/antigravity.js +1415 -1368
- package/src/main/adapters/claude.js +1 -1
- package/src/main/adapters/codex-app-server.js +1 -1
- package/src/main/adapters/dsh.js +1 -1
- package/src/main/adapters/index.js +1 -1
- package/src/main/adapters/pi-usage.js +2 -2
- package/src/main/harness-adapter/error-kind.js +1 -1
- package/src/main/harness-adapter/manifest.js +7 -1
- package/src/main/host/collaboration-tools.js +8 -1
- package/src/main/host/collaboration-worktree.js +27 -1
- package/src/main/host/collaboration.js +348 -15
- package/src/main/host/runtime.js +23 -15
- package/src/main/native/codex-accounts.js +1 -1
- package/src/main/native/config.js +9 -9
- package/src/main/native/host.js +1 -1
- package/src/main/native/launcher.js +10 -8
- package/src/main/native/pets.js +188 -49
- package/src/main/native/platform.js +19 -9
- package/src/main/native/protocol.js +83 -80
- package/src/main/native/rs/crates/appx/Cargo.toml +1 -1
- package/src/main/native/rs/crates/secret/Cargo.toml +1 -1
- package/src/main/native/rs/crates/secret/src/main.rs +3 -3
- package/src/main/native/rs/crates/shim/Cargo.toml +1 -1
- package/src/main/native/rs/crates/shim/src/main.rs +2 -2
- package/src/main/native/thread-list.js +1 -1
- package/src/main/shared-contracts/capability.js +3 -1
- package/src/main/workspace/core-review.js +4 -3
- package/src/native-ui/README.md +2 -2
- package/src/native-ui/desktop-control/dist/contract-audit.js +4 -4
- package/src/native-ui/desktop-control/dist/index.d.ts +1 -1
- package/src/native-ui/desktop-control/dist/index.js +2 -2
- package/src/native-ui/desktop-control/dist/index.js.map +1 -1
- package/src/native-ui/desktop-control/dist/main-process-title-policy.js +5 -5
- package/src/native-ui/desktop-control/dist/main-process-title-policy.js.map +1 -1
- package/src/native-ui/desktop-control/dist/production-controller.js +3 -3
- package/src/native-ui/desktop-control/dist/production-controller.js.map +1 -1
- package/src/native-ui/desktop-control/dist/release-main.js +1 -1
- package/src/native-ui/desktop-control/dist/release-main.js.map +1 -1
- package/src/native-ui/desktop-control/dist/renderer-cdp-control-session.js +1 -1
- package/src/native-ui/desktop-control/dist/renderer-cdp-control-session.js.map +1 -1
- package/src/native-ui/desktop-control/dist/renderer-control-session.js +3 -3
- package/src/native-ui/desktop-control/dist/renderer-control-session.js.map +1 -1
- package/src/native-ui/desktop-control/dist/renderer-draft-prewarm-runtime.js +25 -25
- package/src/native-ui/desktop-control/dist/renderer-draft-prewarm-runtime.js.map +1 -1
- package/src/native-ui/desktop-control/dist/tsconfig.tsbuildinfo +1 -1
- package/src/native-ui/desktop-control/package.json +2 -2
- package/src/native-ui/desktop-control/scripts/build-release.mjs +2 -2
- package/src/native-ui/desktop-control/src/contract-audit.ts +4 -4
- package/src/native-ui/desktop-control/src/index.ts +2 -2
- package/src/native-ui/desktop-control/src/main-process-title-policy.ts +5 -5
- package/src/native-ui/desktop-control/src/production-controller.ts +3 -3
- package/src/native-ui/desktop-control/src/release-main.ts +1 -1
- package/src/native-ui/desktop-control/src/renderer-cdp-control-session.ts +1 -1
- package/src/native-ui/desktop-control/src/renderer-control-session.ts +3 -3
- package/src/native-ui/desktop-control/src/renderer-draft-prewarm-runtime.ts +25 -25
- package/src/native-ui/desktop-control/test/index.test.ts +1 -1
- package/src/native-ui/desktop-control/test/production-controller.test.ts +1 -1
- package/src/native-ui/desktop-control/test/renderer-cdp-control-session.test.ts +1 -1
- package/src/native-ui/desktop-control/test/renderer-draft-prewarm-policy.test.ts +43 -43
- package/src/native-ui/renderer-extension/dist/types/agent-group-preference.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/agent-group-preference.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/agent-selection-state.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/agent-selection-state.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/contract-audit.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/contract-audit.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/index.d.ts +3 -1
- package/src/native-ui/renderer-extension/dist/types/index.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/production-entry.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/production-entry.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-agent-picker.d.ts +2 -2
- package/src/native-ui/renderer-extension/dist/types/renderer-agent-picker.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-binding-probe.d.ts +3 -3
- package/src/native-ui/renderer-extension/dist/types/renderer-binding-probe.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-codex-account-options.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-codex-account-options.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-codex-account-state.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-codex-account-state.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-collab-cards.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-collab-cards.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-composer-dom.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-composer-dom.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-credits-control.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-credits-control.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-fork-control.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-fork-control.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-harness-command-claim.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-harness-command-claim.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-harness-command-control.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-harness-command-control.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-harness-handoff.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-harness-handoff.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-harness-localization.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-harness-localization.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-harness-mentions.d.ts +1 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-harness-mentions.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-model-client.d.ts +36 -31
- package/src/native-ui/renderer-extension/dist/types/renderer-model-client.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-model-picker.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-model-picker.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-new-thread-preference.d.ts +2 -2
- package/src/native-ui/renderer-extension/dist/types/renderer-new-thread-preference.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-permission-mode-picker.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-permission-mode-picker.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-permission-mode-preference.d.ts +2 -2
- package/src/native-ui/renderer-extension/dist/types/renderer-permission-mode-preference.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-request-sender.d.ts +18 -2
- package/src/native-ui/renderer-extension/dist/types/renderer-request-sender.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-session-import-client.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-session-import-client.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-sidebar-agent-icons.d.ts +2 -2
- package/src/native-ui/renderer-extension/dist/types/renderer-sidebar-agent-icons.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-team-cards.d.ts +58 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-team-cards.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-transcript-dom.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-trigger-chip-style.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-trigger-chip-style.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-usage-control.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-usage-control.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/settings/accounts-list.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/settings/accounts-list.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/settings/accounts-page.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/settings/accounts-page.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/settings/accounts-usage.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/settings/accounts-usage.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/settings/connections-page.d.ts +3 -3
- package/src/native-ui/renderer-extension/dist/types/settings/connections-page.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/settings/harness-accounts.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/settings/harness-accounts.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/settings/pages.d.ts +4 -4
- package/src/native-ui/renderer-extension/dist/types/settings/pages.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/settings/pet-market.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/settings/session-import-list-controls.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/settings/session-import-list-controls.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/settings/session-import-page.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/settings/session-import-page.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/settings/shell.d.ts +2 -2
- package/src/native-ui/renderer-extension/dist/types/settings/shell.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/settings/trigger.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/settings/trigger.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/tsconfig.tsbuildinfo +1 -1
- package/src/native-ui/renderer-extension/dist/types/versioned-renderer-adapter.d.ts +18 -18
- package/src/native-ui/renderer-extension/dist/types/versioned-renderer-adapter.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/package.json +2 -2
- package/src/native-ui/renderer-extension/src/agent-group-preference.ts +1 -1
- package/src/native-ui/renderer-extension/src/agent-selection-state.ts +31 -16
- package/src/native-ui/renderer-extension/src/audit-entry.ts +1 -1
- package/src/native-ui/renderer-extension/src/contract-audit.ts +4 -4
- package/src/native-ui/renderer-extension/src/index.ts +4 -2
- package/src/native-ui/renderer-extension/src/install-renderer-binding.ts +2 -2
- package/src/native-ui/renderer-extension/src/production-entry.ts +3 -3
- package/src/native-ui/renderer-extension/src/renderer-agent-picker.ts +7 -7
- package/src/native-ui/renderer-extension/src/renderer-binding-probe.ts +112 -89
- package/src/native-ui/renderer-extension/src/renderer-codex-account-options.ts +1 -1
- package/src/native-ui/renderer-extension/src/renderer-codex-account-state.ts +1 -1
- package/src/native-ui/renderer-extension/src/renderer-collab-cards.ts +1 -1
- package/src/native-ui/renderer-extension/src/renderer-composer-dom.ts +12 -12
- package/src/native-ui/renderer-extension/src/renderer-credits-control.ts +7 -7
- package/src/native-ui/renderer-extension/src/renderer-external-steering.ts +3 -3
- package/src/native-ui/renderer-extension/src/renderer-fork-control.ts +1 -1
- package/src/native-ui/renderer-extension/src/renderer-harness-command-claim.ts +1 -1
- package/src/native-ui/renderer-extension/src/renderer-harness-command-control.ts +3 -3
- package/src/native-ui/renderer-extension/src/renderer-harness-handoff.ts +1 -1
- package/src/native-ui/renderer-extension/src/renderer-harness-localization.ts +1 -1
- package/src/native-ui/renderer-extension/src/renderer-harness-mentions.ts +4 -0
- package/src/native-ui/renderer-extension/src/renderer-integrations-client.ts +5 -5
- package/src/native-ui/renderer-extension/src/renderer-model-client.ts +63 -42
- package/src/native-ui/renderer-extension/src/renderer-model-picker.ts +16 -16
- package/src/native-ui/renderer-extension/src/renderer-new-thread-preference.ts +2 -2
- package/src/native-ui/renderer-extension/src/renderer-permission-mode-picker.ts +3 -3
- package/src/native-ui/renderer-extension/src/renderer-permission-mode-preference.ts +2 -2
- package/src/native-ui/renderer-extension/src/renderer-request-sender.ts +46 -3
- package/src/native-ui/renderer-extension/src/renderer-session-import-client.ts +4 -4
- package/src/native-ui/renderer-extension/src/renderer-sidebar-agent-icons.ts +24 -20
- package/src/native-ui/renderer-extension/src/renderer-team-cards.ts +312 -0
- package/src/native-ui/renderer-extension/src/renderer-transcript-dom.ts +1 -1
- package/src/native-ui/renderer-extension/src/renderer-trigger-chip-style.ts +2 -2
- package/src/native-ui/renderer-extension/src/renderer-usage-control.ts +4 -4
- package/src/native-ui/renderer-extension/src/settings/accounts-list.ts +1 -1
- package/src/native-ui/renderer-extension/src/settings/accounts-page.ts +1 -1
- package/src/native-ui/renderer-extension/src/settings/accounts-usage.ts +1 -1
- package/src/native-ui/renderer-extension/src/settings/connections-page.ts +7 -7
- package/src/native-ui/renderer-extension/src/settings/harness-accounts.ts +1 -1
- package/src/native-ui/renderer-extension/src/settings/icons.ts +2 -2
- package/src/native-ui/renderer-extension/src/settings/pages.ts +11 -11
- package/src/native-ui/renderer-extension/src/settings/pet-market.css +33 -0
- package/src/native-ui/renderer-extension/src/settings/pet-market.ts +173 -91
- package/src/native-ui/renderer-extension/src/settings/pets-client.ts +5 -5
- package/src/native-ui/renderer-extension/src/settings/release-notes.ts +1 -1
- package/src/native-ui/renderer-extension/src/settings/session-import-list-controls.ts +1 -1
- package/src/native-ui/renderer-extension/src/settings/session-import-page.ts +1 -1
- package/src/native-ui/renderer-extension/src/settings/shell.css +15 -15
- package/src/native-ui/renderer-extension/src/settings/shell.ts +11 -11
- package/src/native-ui/renderer-extension/src/settings/skin-runtime.ts +17 -17
- package/src/native-ui/renderer-extension/src/settings/trigger.ts +1 -1
- package/src/native-ui/renderer-extension/src/versioned-renderer-adapter.ts +20 -20
- package/src/native-ui/renderer-extension/test/agent-selection-state.test.ts +60 -1
- package/src/native-ui/renderer-extension/test/codebuddy-migration.test.ts +1 -1
- package/src/native-ui/renderer-extension/test/renderer-agent-picker.test.ts +1 -1
- package/src/native-ui/renderer-extension/test/renderer-binding-probe-host-catalog.test.ts +15 -9
- package/src/native-ui/renderer-extension/test/renderer-binding-probe.test.ts +15 -15
- package/src/native-ui/renderer-extension/test/renderer-codex-account-state.test.ts +1 -1
- package/src/native-ui/renderer-extension/test/renderer-composer-permissions.test.ts +4 -4
- package/src/native-ui/renderer-extension/test/renderer-external-steering-rpc.test.ts +2 -2
- package/src/native-ui/renderer-extension/test/renderer-external-steering.test.ts +3 -3
- package/src/native-ui/renderer-extension/test/renderer-fork-control.test.ts +4 -4
- package/src/native-ui/renderer-extension/test/renderer-harness-command-claim.test.ts +1 -1
- package/src/native-ui/renderer-extension/test/renderer-harness-command-control.test.ts +1 -1
- package/src/native-ui/renderer-extension/test/renderer-model-client.test.ts +12 -11
- package/src/native-ui/renderer-extension/test/renderer-model-picker.test.ts +1 -1
- package/src/native-ui/renderer-extension/test/renderer-native-thread-ownership.test.ts +6 -6
- package/src/native-ui/renderer-extension/test/renderer-new-thread-preference.test.ts +1 -1
- package/src/native-ui/renderer-extension/test/renderer-permission-mode-picker.test.ts +1 -1
- package/src/native-ui/renderer-extension/test/renderer-permission-mode-preference.test.ts +1 -1
- package/src/native-ui/renderer-extension/test/renderer-request-timeout.test.ts +80 -0
- package/src/native-ui/renderer-extension/test/renderer-settings-lifecycle.test.ts +2 -2
- package/src/native-ui/renderer-extension/test/renderer-sidebar-agent-icons.test.ts +10 -3
- package/src/native-ui/renderer-extension/test/renderer-unsupported-methods.test.ts +1 -1
- package/src/native-ui/renderer-extension/test/settings/pages.test.ts +5 -5
- package/src/native-ui/renderer-extension/test/settings/release-notes.test.ts +9 -9
- package/src/native-ui/renderer-extension/test/versioned-renderer-adapter.test.ts +3 -3
- package/src/native-ui/shared-contracts/dist/errors.d.ts +2 -2
- package/src/native-ui/shared-contracts/dist/errors.d.ts.map +1 -1
- package/src/native-ui/shared-contracts/dist/errors.js +1 -1
- package/src/native-ui/shared-contracts/dist/errors.js.map +1 -1
- package/src/native-ui/shared-contracts/dist/harness-models.d.ts +40 -0
- package/src/native-ui/shared-contracts/dist/harness-models.d.ts.map +1 -1
- package/src/native-ui/shared-contracts/dist/harness-models.js +23 -2
- package/src/native-ui/shared-contracts/dist/harness-models.js.map +1 -1
- package/src/native-ui/shared-contracts/dist/harness-route.d.ts +1 -1
- package/src/native-ui/shared-contracts/dist/harness-route.d.ts.map +1 -1
- package/src/native-ui/shared-contracts/dist/harness-route.js +1 -1
- package/src/native-ui/shared-contracts/dist/harness-route.js.map +1 -1
- package/src/native-ui/shared-contracts/dist/harness-session-import.d.ts +1 -1
- package/src/native-ui/shared-contracts/dist/harness-session-import.d.ts.map +1 -1
- package/src/native-ui/shared-contracts/dist/harness-session-import.js +1 -1
- package/src/native-ui/shared-contracts/dist/harness-session-import.js.map +1 -1
- package/src/native-ui/shared-contracts/dist/index.d.ts +3 -3
- package/src/native-ui/shared-contracts/dist/index.d.ts.map +1 -1
- package/src/native-ui/shared-contracts/dist/index.js +2 -2
- package/src/native-ui/shared-contracts/dist/index.js.map +1 -1
- package/src/native-ui/shared-contracts/dist/tsconfig.tsbuildinfo +1 -1
- package/src/native-ui/shared-contracts/dist/updates.js +1 -1
- package/src/native-ui/shared-contracts/dist/updates.js.map +1 -1
- package/src/native-ui/shared-contracts/package.json +1 -1
- package/src/native-ui/shared-contracts/src/errors.ts +3 -3
- package/src/native-ui/shared-contracts/src/harness-models.ts +23 -2
- package/src/native-ui/shared-contracts/src/harness-route.ts +1 -1
- package/src/native-ui/shared-contracts/src/harness-session-import.ts +1 -1
- package/src/native-ui/shared-contracts/src/index.ts +3 -3
- package/src/native-ui/shared-contracts/src/updates.ts +1 -1
- package/src/native-ui/shared-contracts/test/browser-bundle.test.ts +3 -3
- package/src/native-ui/shared-contracts/test/deepseek-modern-sessions.test.ts +1 -1
- package/src/native-ui/shared-contracts/test/errors.test.ts +9 -9
- package/src/native-ui/shared-contracts/test/harness-commands.test.ts +1 -1
- package/src/native-ui/shared-contracts/test/harness-models.test.ts +3 -3
- package/src/native-ui/shared-contracts/test/harness-permission-modes.test.ts +1 -1
- package/src/native-ui/shared-contracts/test/harness-plugins.test.ts +1 -1
- package/src/native-ui/shared-contracts/test/harness-session-import.test.ts +1 -1
- package/src/native-ui/shared-contracts/test/index.test.ts +3 -3
- package/src/native-ui/shared-contracts/test/json-rpc.test.ts +1 -1
- package/src/native-ui/shared-contracts/test/thread-usage.test.ts +1 -1
- package/src/native-ui/shared-contracts/test/updates.test.ts +4 -4
- /package/licenses/{codex-host-MIT.txt → bytepioneer-MIT.txt} +0 -0
|
@@ -49,7 +49,7 @@ globalThis.__HARNESS_MIX_ICONS__={"models":{"gemini":{"label":"Gemini","svg":"<s
|
|
|
49
49
|
"codex-harness"
|
|
50
50
|
];
|
|
51
51
|
function defaultIdFactory(sequence) {
|
|
52
|
-
return `
|
|
52
|
+
return `harnessmix-composer-${Date.now().toString(36)}-${sequence.toString(36)}`;
|
|
53
53
|
}
|
|
54
54
|
function isDefaultTarget(target) {
|
|
55
55
|
return target?.[0] === "default";
|
|
@@ -74,6 +74,7 @@ globalThis.__HARNESS_MIX_ICONS__={"models":{"gemini":{"label":"Gemini","svg":"<s
|
|
|
74
74
|
#modelRequestGenerations = /* @__PURE__ */ new WeakMap();
|
|
75
75
|
#ownershipRequestGenerations = /* @__PURE__ */ new WeakMap();
|
|
76
76
|
#states = /* @__PURE__ */ new WeakMap();
|
|
77
|
+
#interactedDrafts = /* @__PURE__ */ new WeakSet();
|
|
77
78
|
#switching = /* @__PURE__ */ new Set();
|
|
78
79
|
#pendingSubmissions = /* @__PURE__ */ new Set();
|
|
79
80
|
#composerSequence = 0;
|
|
@@ -137,17 +138,22 @@ globalThis.__HARNESS_MIX_ICONS__={"models":{"gemini":{"label":"Gemini","svg":"<s
|
|
|
137
138
|
rebindTarget(composer, target, preferredNewThreadAgent) {
|
|
138
139
|
if (!isComposerTarget(target)) return null;
|
|
139
140
|
const previous = this.#state(composer);
|
|
140
|
-
this.#pendingSubmissions.delete(previous);
|
|
141
|
+
const pendingSubmission = this.#pendingSubmissions.delete(previous);
|
|
141
142
|
this.#modelRequestGenerations.set(previous, ++this.#modelRequestSequence);
|
|
142
143
|
this.#ownershipRequestGenerations.set(previous, ++this.#ownershipRequestSequence);
|
|
143
144
|
let state = this.#targetState(target);
|
|
144
145
|
if (!state) {
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
146
|
+
if (isDefaultTarget(target) && previous.phase === "draft" && this.#interactedDrafts.has(previous)) {
|
|
147
|
+
state = previous;
|
|
148
|
+
if (pendingSubmission) this.#pendingSubmissions.add(state);
|
|
149
|
+
} else {
|
|
150
|
+
const preferredAgent = isDefaultTarget(target) && preferredNewThreadAgent && this.#enabledAgents.has(preferredNewThreadAgent) ? preferredNewThreadAgent : isDefaultTarget(target) ? this.#lastSubmittedAgent : "codex";
|
|
151
|
+
state = {
|
|
152
|
+
agent: preferredAgent,
|
|
153
|
+
phase: "draft",
|
|
154
|
+
composerId: this.#idFactory(++this.#composerSequence)
|
|
155
|
+
};
|
|
156
|
+
}
|
|
151
157
|
if (isRestorableTarget(target)) this.#targetStates.push({ target, state });
|
|
152
158
|
}
|
|
153
159
|
this.#states.set(composer, state);
|
|
@@ -307,6 +313,7 @@ globalThis.__HARNESS_MIX_ICONS__={"models":{"gemini":{"label":"Gemini","svg":"<s
|
|
|
307
313
|
...state.permissionModeByAgent,
|
|
308
314
|
[agent]: permissionModeId
|
|
309
315
|
};
|
|
316
|
+
if (state.phase === "draft") this.#interactedDrafts.add(state);
|
|
310
317
|
return state;
|
|
311
318
|
}
|
|
312
319
|
setExternalModel(composer, agent, model) {
|
|
@@ -328,6 +335,7 @@ globalThis.__HARNESS_MIX_ICONS__={"models":{"gemini":{"label":"Gemini","svg":"<s
|
|
|
328
335
|
else if (agent === "cursor-cli") state.cursorModel = model;
|
|
329
336
|
else if (agent === "cline") state.clineModel = model;
|
|
330
337
|
else if (agent === "codex-harness") state.codexHarnessModel = model;
|
|
338
|
+
if (state.phase === "draft") this.#interactedDrafts.add(state);
|
|
331
339
|
return state;
|
|
332
340
|
}
|
|
333
341
|
setPiConfiguration(composer, model, thinkingOptionId) {
|
|
@@ -335,6 +343,7 @@ globalThis.__HARNESS_MIX_ICONS__={"models":{"gemini":{"label":"Gemini","svg":"<s
|
|
|
335
343
|
state.piModel = model;
|
|
336
344
|
if (thinkingOptionId) state.piThinkingOptionId = thinkingOptionId;
|
|
337
345
|
else delete state.piThinkingOptionId;
|
|
346
|
+
if (state.phase === "draft") this.#interactedDrafts.add(state);
|
|
338
347
|
return state;
|
|
339
348
|
}
|
|
340
349
|
setPiModel(composer, model) {
|
|
@@ -405,6 +414,7 @@ globalThis.__HARNESS_MIX_ICONS__={"models":{"gemini":{"label":"Gemini","svg":"<s
|
|
|
405
414
|
} else if (agent === "codex-harness") {
|
|
406
415
|
delete state.codexHarnessThinkingOptionId;
|
|
407
416
|
}
|
|
417
|
+
if (state.phase === "draft") this.#interactedDrafts.add(state);
|
|
408
418
|
return state;
|
|
409
419
|
}
|
|
410
420
|
setPiThinkingOption(composer, thinkingOptionId) {
|
|
@@ -479,6 +489,7 @@ globalThis.__HARNESS_MIX_ICONS__={"models":{"gemini":{"label":"Gemini","svg":"<s
|
|
|
479
489
|
return false;
|
|
480
490
|
}
|
|
481
491
|
state.agent = nextAgent;
|
|
492
|
+
this.#interactedDrafts.add(state);
|
|
482
493
|
return true;
|
|
483
494
|
} finally {
|
|
484
495
|
this.#switching.delete(state);
|
|
@@ -1752,7 +1763,7 @@ globalThis.__HARNESS_MIX_ICONS__={"models":{"gemini":{"label":"Gemini","svg":"<s
|
|
|
1752
1763
|
function cleanEnum(obj) {
|
|
1753
1764
|
return Object.entries(obj).filter(([k, _]) => {
|
|
1754
1765
|
return Number.isNaN(Number.parseInt(k, 10));
|
|
1755
|
-
}).map((
|
|
1766
|
+
}).map((el2) => el2[1]);
|
|
1756
1767
|
}
|
|
1757
1768
|
function base64ToUint8Array(base643) {
|
|
1758
1769
|
const binaryString = atob(base643);
|
|
@@ -1846,15 +1857,15 @@ globalThis.__HARNESS_MIX_ICONS__={"models":{"gemini":{"label":"Gemini","svg":"<s
|
|
|
1846
1857
|
let curr = fieldErrors;
|
|
1847
1858
|
let i = 0;
|
|
1848
1859
|
while (i < fullpath.length) {
|
|
1849
|
-
const
|
|
1860
|
+
const el2 = fullpath[i];
|
|
1850
1861
|
const terminal = i === fullpath.length - 1;
|
|
1851
1862
|
if (!terminal) {
|
|
1852
|
-
curr[
|
|
1863
|
+
curr[el2] = curr[el2] || { _errors: [] };
|
|
1853
1864
|
} else {
|
|
1854
|
-
curr[
|
|
1855
|
-
curr[
|
|
1865
|
+
curr[el2] = curr[el2] || { _errors: [] };
|
|
1866
|
+
curr[el2]._errors.push(mapper(issue2));
|
|
1856
1867
|
}
|
|
1857
|
-
curr = curr[
|
|
1868
|
+
curr = curr[el2];
|
|
1858
1869
|
i++;
|
|
1859
1870
|
}
|
|
1860
1871
|
}
|
|
@@ -1884,16 +1895,16 @@ globalThis.__HARNESS_MIX_ICONS__={"models":{"gemini":{"label":"Gemini","svg":"<s
|
|
|
1884
1895
|
let curr = result;
|
|
1885
1896
|
let i = 0;
|
|
1886
1897
|
while (i < fullpath.length) {
|
|
1887
|
-
const
|
|
1898
|
+
const el2 = fullpath[i];
|
|
1888
1899
|
const terminal = i === fullpath.length - 1;
|
|
1889
|
-
if (typeof
|
|
1900
|
+
if (typeof el2 === "string") {
|
|
1890
1901
|
curr.properties ?? (curr.properties = {});
|
|
1891
|
-
(_a3 = curr.properties)[
|
|
1892
|
-
curr = curr.properties[
|
|
1902
|
+
(_a3 = curr.properties)[el2] ?? (_a3[el2] = { errors: [] });
|
|
1903
|
+
curr = curr.properties[el2];
|
|
1893
1904
|
} else {
|
|
1894
1905
|
curr.items ?? (curr.items = []);
|
|
1895
|
-
(_b = curr.items)[
|
|
1896
|
-
curr = curr.items[
|
|
1906
|
+
(_b = curr.items)[el2] ?? (_b[el2] = { errors: [] });
|
|
1907
|
+
curr = curr.items[el2];
|
|
1897
1908
|
}
|
|
1898
1909
|
if (terminal) {
|
|
1899
1910
|
curr.errors.push(mapper(issue2));
|
|
@@ -3558,10 +3569,10 @@ globalThis.__HARNESS_MIX_ICONS__={"models":{"gemini":{"label":"Gemini","svg":"<s
|
|
|
3558
3569
|
const proms = [];
|
|
3559
3570
|
const shape = value.shape;
|
|
3560
3571
|
for (const key of value.keys) {
|
|
3561
|
-
const
|
|
3562
|
-
const isOptionalIn =
|
|
3563
|
-
const isOptionalOut =
|
|
3564
|
-
const r =
|
|
3572
|
+
const el2 = shape[key];
|
|
3573
|
+
const isOptionalIn = el2._zod.optin === "optional";
|
|
3574
|
+
const isOptionalOut = el2._zod.optout === "optional";
|
|
3575
|
+
const r = el2._zod.run({ value: input[key], issues: [] }, ctx);
|
|
3565
3576
|
if (r instanceof Promise) {
|
|
3566
3577
|
proms.push(r.then((r2) => handlePropertyResult(r2, payload, key, input, isOptionalIn, isOptionalOut)));
|
|
3567
3578
|
} else {
|
|
@@ -4039,9 +4050,9 @@ globalThis.__HARNESS_MIX_ICONS__={"models":{"gemini":{"label":"Gemini","svg":"<s
|
|
|
4039
4050
|
if (def.rest) {
|
|
4040
4051
|
let i = items.length - 1;
|
|
4041
4052
|
const rest = input.slice(items.length);
|
|
4042
|
-
for (const
|
|
4053
|
+
for (const el2 of rest) {
|
|
4043
4054
|
i++;
|
|
4044
|
-
const result = def.rest._zod.run({ value:
|
|
4055
|
+
const result = def.rest._zod.run({ value: el2, issues: [] }, ctx);
|
|
4045
4056
|
if (result instanceof Promise) {
|
|
4046
4057
|
proms.push(result.then((r) => handleTupleResult(r, payload, i)));
|
|
4047
4058
|
} else {
|
|
@@ -8139,8 +8150,8 @@ globalThis.__HARNESS_MIX_ICONS__={"models":{"gemini":{"label":"Gemini","svg":"<s
|
|
|
8139
8150
|
}
|
|
8140
8151
|
|
|
8141
8152
|
// node_modules/zod/v4/locales/lt.js
|
|
8142
|
-
var capitalizeFirstCharacter = (
|
|
8143
|
-
return
|
|
8153
|
+
var capitalizeFirstCharacter = (text2) => {
|
|
8154
|
+
return text2.charAt(0).toUpperCase() + text2.slice(1);
|
|
8144
8155
|
};
|
|
8145
8156
|
function getUnitTypeFromNumber(number4) {
|
|
8146
8157
|
const abs = Math.abs(number4);
|
|
@@ -15198,7 +15209,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
15198
15209
|
);
|
|
15199
15210
|
|
|
15200
15211
|
// src/native-ui/shared-contracts/src/errors.ts
|
|
15201
|
-
var
|
|
15212
|
+
var harnessmixErrorSchema = external_exports.strictObject({
|
|
15202
15213
|
code: external_exports.string().min(1),
|
|
15203
15214
|
message: external_exports.string().min(1),
|
|
15204
15215
|
retryable: external_exports.boolean(),
|
|
@@ -15361,6 +15372,13 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
15361
15372
|
permissionModeScope: harnessPermissionModeScopeSchema.default("live")
|
|
15362
15373
|
}).strict(),
|
|
15363
15374
|
history: harnessHistoryCapabilitiesSchema,
|
|
15375
|
+
workspace: external_exports.object({
|
|
15376
|
+
git: external_exports.literal(true),
|
|
15377
|
+
worktree: external_exports.literal(true),
|
|
15378
|
+
finalDiff: external_exports.literal(true),
|
|
15379
|
+
nativeDiff: external_exports.boolean(),
|
|
15380
|
+
nativePatch: external_exports.boolean()
|
|
15381
|
+
}).strict().optional(),
|
|
15364
15382
|
subagents: external_exports.object({
|
|
15365
15383
|
observe: external_exports.boolean(),
|
|
15366
15384
|
readTranscript: external_exports.boolean()
|
|
@@ -15406,7 +15424,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
15406
15424
|
});
|
|
15407
15425
|
var failedHarnessInspectionSchema = external_exports.object({
|
|
15408
15426
|
status: external_exports.enum(["notInstalled", "unavailable", "error"]),
|
|
15409
|
-
error:
|
|
15427
|
+
error: harnessmixErrorSchema
|
|
15410
15428
|
}).strict();
|
|
15411
15429
|
var harnessInspectionSchema = external_exports.union([
|
|
15412
15430
|
readyHarnessInspectionSchema,
|
|
@@ -15447,6 +15465,14 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
15447
15465
|
availableThinkingOptions: harnessThinkingOptionsSchema.optional(),
|
|
15448
15466
|
effectivePermissionModeId: harnessPermissionModeIdSchema.optional(),
|
|
15449
15467
|
history: harnessHistoryCapabilitiesSchema,
|
|
15468
|
+
workspace: external_exports.object({
|
|
15469
|
+
hostManaged: external_exports.literal(true),
|
|
15470
|
+
git: external_exports.object({ available: external_exports.boolean(), root: external_exports.string().optional(), head: external_exports.string().optional(), branch: external_exports.string().nullable().optional(), dirty: external_exports.boolean().optional(), reason: external_exports.enum(["not-a-git-repository", "git-unavailable"]).optional() }).strict(),
|
|
15471
|
+
worktree: external_exports.object({ available: external_exports.boolean(), active: external_exports.boolean(), branch: external_exports.string().optional(), root: external_exports.string().optional() }).strict(),
|
|
15472
|
+
finalDiff: external_exports.object({ available: external_exports.literal(true), source: external_exports.literal("snapshot") }).strict(),
|
|
15473
|
+
nativeDiff: external_exports.boolean(),
|
|
15474
|
+
nativePatch: external_exports.boolean()
|
|
15475
|
+
}).strict().optional(),
|
|
15450
15476
|
usage: threadUsageSnapshotSchema.optional(),
|
|
15451
15477
|
accountCredits: accountCreditsSnapshotSchema.optional(),
|
|
15452
15478
|
locked: external_exports.literal(true)
|
|
@@ -15546,7 +15572,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
15546
15572
|
});
|
|
15547
15573
|
|
|
15548
15574
|
// src/native-ui/shared-contracts/src/harness-route.ts
|
|
15549
|
-
var HARNESS_PLUGIN_ROUTE_PREFIX = "
|
|
15575
|
+
var HARNESS_PLUGIN_ROUTE_PREFIX = "harnessmix/plugin-v1@";
|
|
15550
15576
|
var MAX_ROUTE_LENGTH = 4096;
|
|
15551
15577
|
var harnessPluginRouteSchema = external_exports.object({
|
|
15552
15578
|
harnessId: harnessPluginIdSchema,
|
|
@@ -15919,7 +15945,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
15919
15945
|
});
|
|
15920
15946
|
var updateEmptyParamsSchema = external_exports.strictObject({});
|
|
15921
15947
|
var githubReleaseNotesUrlSchema = external_exports.string().max(300).regex(
|
|
15922
|
-
/^https:\/\/github\.com\/
|
|
15948
|
+
/^https:\/\/github\.com\/emo-xiaoyu\/harness-mix\/releases\/tag\/v[0-9A-Za-z.+-]+$/u,
|
|
15923
15949
|
"release notes URL must identify a Harness Mix GitHub Release"
|
|
15924
15950
|
);
|
|
15925
15951
|
var updateCheckResultSchema = external_exports.strictObject({
|
|
@@ -15944,7 +15970,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
15944
15970
|
var workspaceContractVersionSchema = external_exports.literal(WORKSPACE_CONTRACT_VERSION);
|
|
15945
15971
|
|
|
15946
15972
|
// src/native-ui/renderer-extension/src/agent-group-preference.ts
|
|
15947
|
-
var AGENT_GROUP_PREFERENCE_STORAGE_KEY = "
|
|
15973
|
+
var AGENT_GROUP_PREFERENCE_STORAGE_KEY = "harnessmix.agentGroupPreference.v1";
|
|
15948
15974
|
var EXTERNAL_AGENTS = KNOWN_RENDERER_AGENTS.filter(
|
|
15949
15975
|
(agent) => agent !== "codex"
|
|
15950
15976
|
);
|
|
@@ -16433,7 +16459,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
16433
16459
|
}
|
|
16434
16460
|
|
|
16435
16461
|
// src/native-ui/renderer-extension/src/renderer-new-thread-preference.ts
|
|
16436
|
-
var RENDERER_NEW_THREAD_PREFERENCE_KEY = "
|
|
16462
|
+
var RENDERER_NEW_THREAD_PREFERENCE_KEY = "harnessmix.new-thread-preference.v1";
|
|
16437
16463
|
function rendererStorage() {
|
|
16438
16464
|
try {
|
|
16439
16465
|
return window.localStorage;
|
|
@@ -16970,7 +16996,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
16970
16996
|
"aria-hidden": "true",
|
|
16971
16997
|
focusable: "false"
|
|
16972
16998
|
});
|
|
16973
|
-
icon2.classList.add("
|
|
16999
|
+
icon2.classList.add("harnessmix-settings-icon");
|
|
16974
17000
|
return icon2;
|
|
16975
17001
|
}
|
|
16976
17002
|
function createRendererSettingsBrandIcon(size = 22, ownerDocument) {
|
|
@@ -16986,12 +17012,12 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
16986
17012
|
icon2.style.width = `${size}px`;
|
|
16987
17013
|
icon2.style.height = `${size}px`;
|
|
16988
17014
|
icon2.style.objectFit = "contain";
|
|
16989
|
-
icon2.classList.add("
|
|
17015
|
+
icon2.classList.add("harnessmix-settings-icon");
|
|
16990
17016
|
return icon2;
|
|
16991
17017
|
}
|
|
16992
17018
|
|
|
16993
17019
|
// src/native-ui/renderer-extension/src/settings/connections-page.ts
|
|
16994
|
-
var
|
|
17020
|
+
var HARNESSMIX_GITHUB_ISSUES_NEW_URL = "https://github.com/emo-xiaoyu/harness-mix/issues/new";
|
|
16995
17021
|
var HARNESS_INSTALL_COMMANDS = Object.freeze({
|
|
16996
17022
|
qoder: { command: "npm install -g @qoder-ai/qodercli" },
|
|
16997
17023
|
codex: { command: "npm install -g @openai/codex" },
|
|
@@ -17046,7 +17072,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
17046
17072
|
function diagnosticText(hostId, item) {
|
|
17047
17073
|
const error51 = item.error;
|
|
17048
17074
|
return [
|
|
17049
|
-
"
|
|
17075
|
+
"harnessmix connection diagnostics",
|
|
17050
17076
|
`host: ${hostId}`,
|
|
17051
17077
|
`agent: ${item.name}`,
|
|
17052
17078
|
`status: ${item.availability}`,
|
|
@@ -17352,10 +17378,10 @@ ${error51.stderrTail}`] : []
|
|
|
17352
17378
|
copyBtn.className = "settings-command-button settings-command-button--secondary";
|
|
17353
17379
|
copyBtn.append(createRendererSettingsIcon("copy", 15), messages.copyInstallCommand);
|
|
17354
17380
|
copyBtn.addEventListener("click", () => {
|
|
17355
|
-
const
|
|
17381
|
+
const text2 = commandInfo.command;
|
|
17356
17382
|
const clipboard = document2.defaultView?.navigator?.clipboard;
|
|
17357
17383
|
if (clipboard) {
|
|
17358
|
-
void clipboard.writeText(
|
|
17384
|
+
void clipboard.writeText(text2).then(() => {
|
|
17359
17385
|
copyBtn.replaceChildren(createRendererSettingsIcon("check", 15), messages.installCommandCopied);
|
|
17360
17386
|
document2.defaultView?.setTimeout(() => {
|
|
17361
17387
|
copyBtn.replaceChildren(createRendererSettingsIcon("copy", 15), messages.copyInstallCommand);
|
|
@@ -17378,8 +17404,8 @@ ${error51.stderrTail}`] : []
|
|
|
17378
17404
|
feedback.className = "settings-install-feedback";
|
|
17379
17405
|
const run = async () => {
|
|
17380
17406
|
if (!diagnostics?.installHarness) {
|
|
17381
|
-
const
|
|
17382
|
-
await document2.defaultView?.navigator?.clipboard?.writeText(
|
|
17407
|
+
const text2 = commandInfo.command;
|
|
17408
|
+
await document2.defaultView?.navigator?.clipboard?.writeText(text2);
|
|
17383
17409
|
feedback.className = "settings-install-feedback settings-feedback-warning";
|
|
17384
17410
|
feedback.textContent = messages.oneClickInstallFailed;
|
|
17385
17411
|
installBtn.disabled = false;
|
|
@@ -17618,7 +17644,7 @@ ${error51.stderrTail}`] : []
|
|
|
17618
17644
|
actions.className = "settings-connection-error-actions";
|
|
17619
17645
|
const issue2 = document2.createElement("a");
|
|
17620
17646
|
issue2.className = "settings-command-button settings-command-button--secondary";
|
|
17621
|
-
issue2.href =
|
|
17647
|
+
issue2.href = HARNESSMIX_GITHUB_ISSUES_NEW_URL;
|
|
17622
17648
|
issue2.target = "_blank";
|
|
17623
17649
|
issue2.rel = "noopener noreferrer";
|
|
17624
17650
|
issue2.append(messages.connectionOpenIssue, createRendererSettingsIcon("external-link", 14));
|
|
@@ -17821,7 +17847,7 @@ ${error51.stderrTail}`] : []
|
|
|
17821
17847
|
tabs.setAttribute("role", "tablist");
|
|
17822
17848
|
tabs.setAttribute("aria-label", messages.connectionHosts);
|
|
17823
17849
|
const scrollRight = createHostScrollButton(document2, "right", messages);
|
|
17824
|
-
const panelId = "
|
|
17850
|
+
const panelId = "harnessmix-settings-connection-host-panel";
|
|
17825
17851
|
snapshot.hosts.forEach((host, index) => {
|
|
17826
17852
|
const tab = document2.createElement("button");
|
|
17827
17853
|
tab.type = "button";
|
|
@@ -18611,7 +18637,7 @@ ${error51.stderrTail}`] : []
|
|
|
18611
18637
|
};
|
|
18612
18638
|
}
|
|
18613
18639
|
function openSettingsPage(pageId, opener) {
|
|
18614
|
-
const shell = window.
|
|
18640
|
+
const shell = window.__harnessmixSettingsShellV1;
|
|
18615
18641
|
shell?.openSettings(opener, pageId);
|
|
18616
18642
|
}
|
|
18617
18643
|
function openConnectionsSettings(opener) {
|
|
@@ -18636,7 +18662,7 @@ ${error51.stderrTail}`] : []
|
|
|
18636
18662
|
cline: "https://docs.cline.bot/usage/cli-overview",
|
|
18637
18663
|
"codex-harness": "https://developers.openai.com/codex/"
|
|
18638
18664
|
};
|
|
18639
|
-
var CONTROL_ATTRIBUTE = "data-
|
|
18665
|
+
var CONTROL_ATTRIBUTE = "data-harnessmix-agent-control";
|
|
18640
18666
|
var AGENT_MENU_WIDTH = 224;
|
|
18641
18667
|
var AGENT_GROUP_CTA_THRESHOLD = 5;
|
|
18642
18668
|
function rendererAgentMenuPlacement(triggerRect, viewport, windowZoom) {
|
|
@@ -19055,7 +19081,7 @@ ${error51.stderrTail}`] : []
|
|
|
19055
19081
|
}
|
|
19056
19082
|
mainGroup.replaceChildren(...mainChildren);
|
|
19057
19083
|
moreRows.replaceChildren(
|
|
19058
|
-
...moreAgents.map((agent) => rowsByAgent.get(agent)).filter((
|
|
19084
|
+
...moreAgents.map((agent) => rowsByAgent.get(agent)).filter((el2) => !!el2)
|
|
19059
19085
|
);
|
|
19060
19086
|
const showMoreGroup = moreAgents.length > 0;
|
|
19061
19087
|
const showCta = !showMoreGroup && enabledAgents.length > AGENT_GROUP_CTA_THRESHOLD;
|
|
@@ -19268,8 +19294,8 @@ ${error51.stderrTail}`] : []
|
|
|
19268
19294
|
}
|
|
19269
19295
|
|
|
19270
19296
|
// src/native-ui/renderer-extension/src/renderer-trigger-chip-style.ts
|
|
19271
|
-
var STYLE_ATTRIBUTE = "data-
|
|
19272
|
-
var TRIGGER_CHIP_CLASS = "
|
|
19297
|
+
var STYLE_ATTRIBUTE = "data-harnessmix-trigger-chip-style";
|
|
19298
|
+
var TRIGGER_CHIP_CLASS = "harnessmix-trigger-chip";
|
|
19273
19299
|
function ensureRendererTriggerChipStyle(ownerDocument) {
|
|
19274
19300
|
if (ownerDocument.querySelector(`style[${STYLE_ATTRIBUTE}]`)) return;
|
|
19275
19301
|
const style = ownerDocument.createElement("style");
|
|
@@ -19310,7 +19336,7 @@ ${error51.stderrTail}`] : []
|
|
|
19310
19336
|
var OPTION_CLASSES = "flex w-full cursor-interaction items-center gap-2 rounded-lg px-2 py-2 text-left text-sm text-token-foreground outline-none enabled:hover:bg-token-list-hover-background enabled:active:bg-token-foreground/15 disabled:cursor-not-allowed disabled:opacity-40";
|
|
19311
19337
|
var HEADING_CLASSES = "px-2 pb-1 pt-1.5 text-sm text-token-text-tertiary";
|
|
19312
19338
|
var MODEL_TRIGGER_MAX_WIDTH = "min(200px, 26vw)";
|
|
19313
|
-
var MODEL_SCROLLBAR_STYLE_ATTRIBUTE = "data-
|
|
19339
|
+
var MODEL_SCROLLBAR_STYLE_ATTRIBUTE = "data-harnessmix-model-picker-scrollbar";
|
|
19314
19340
|
function popoverOpen2(menu) {
|
|
19315
19341
|
return menu.matches(":popover-open");
|
|
19316
19342
|
}
|
|
@@ -19319,28 +19345,28 @@ ${error51.stderrTail}`] : []
|
|
|
19319
19345
|
const style = ownerDocument.createElement("style");
|
|
19320
19346
|
style.setAttribute(MODEL_SCROLLBAR_STYLE_ATTRIBUTE, "true");
|
|
19321
19347
|
style.textContent = `
|
|
19322
|
-
[data-
|
|
19348
|
+
[data-harnessmix-model-scrollable] {
|
|
19323
19349
|
scrollbar-width: thin;
|
|
19324
19350
|
scrollbar-color: rgba(255, 255, 255, 0.28) transparent;
|
|
19325
19351
|
}
|
|
19326
|
-
[data-
|
|
19352
|
+
[data-harnessmix-model-scrollable]::-webkit-scrollbar {
|
|
19327
19353
|
width: 6px;
|
|
19328
19354
|
height: 6px;
|
|
19329
19355
|
}
|
|
19330
|
-
[data-
|
|
19356
|
+
[data-harnessmix-model-scrollable]::-webkit-scrollbar-track {
|
|
19331
19357
|
background: transparent;
|
|
19332
19358
|
}
|
|
19333
|
-
[data-
|
|
19359
|
+
[data-harnessmix-model-scrollable]::-webkit-scrollbar-thumb {
|
|
19334
19360
|
min-height: 28px;
|
|
19335
19361
|
border: 1px solid transparent;
|
|
19336
19362
|
border-radius: 999px;
|
|
19337
19363
|
background: rgba(255, 255, 255, 0.28);
|
|
19338
19364
|
background-clip: padding-box;
|
|
19339
19365
|
}
|
|
19340
|
-
[data-
|
|
19366
|
+
[data-harnessmix-model-scrollable]::-webkit-scrollbar-thumb:hover {
|
|
19341
19367
|
background: rgba(255, 255, 255, 0.42);
|
|
19342
19368
|
}
|
|
19343
|
-
[data-
|
|
19369
|
+
[data-harnessmix-model-scrollable]::-webkit-scrollbar-button {
|
|
19344
19370
|
display: none;
|
|
19345
19371
|
width: 0;
|
|
19346
19372
|
height: 0;
|
|
@@ -19388,7 +19414,7 @@ ${error51.stderrTail}`] : []
|
|
|
19388
19414
|
}
|
|
19389
19415
|
function positionMenu(control) {
|
|
19390
19416
|
const triggerRect = control.trigger.getBoundingClientRect();
|
|
19391
|
-
const thinkingColumn = control.menu.querySelector("[data-
|
|
19417
|
+
const thinkingColumn = control.menu.querySelector("[data-harnessmix-thinking-column]");
|
|
19392
19418
|
const twoColumn = control.thinkingExpanded && thinkingColumn !== null;
|
|
19393
19419
|
if (thinkingColumn) thinkingColumn.style.display = twoColumn ? "flex" : "none";
|
|
19394
19420
|
control.menu.dataset.twoColumn = String(twoColumn);
|
|
@@ -19405,7 +19431,7 @@ ${error51.stderrTail}`] : []
|
|
|
19405
19431
|
control.menu.style.top = "auto";
|
|
19406
19432
|
control.menu.style.bottom = `${placement.bottom}px`;
|
|
19407
19433
|
const listMaxHeight = placement.maxHeight ?? 320;
|
|
19408
|
-
for (const column of control.menu.querySelectorAll("[data-
|
|
19434
|
+
for (const column of control.menu.querySelectorAll("[data-harnessmix-model-scrollable]")) {
|
|
19409
19435
|
column.style.maxHeight = `${listMaxHeight}px`;
|
|
19410
19436
|
}
|
|
19411
19437
|
}
|
|
@@ -19423,16 +19449,16 @@ ${error51.stderrTail}`] : []
|
|
|
19423
19449
|
check2.style.flex = "none";
|
|
19424
19450
|
return check2;
|
|
19425
19451
|
}
|
|
19426
|
-
function createHeading(
|
|
19452
|
+
function createHeading(text2) {
|
|
19427
19453
|
const heading = document.createElement("div");
|
|
19428
|
-
heading.textContent =
|
|
19454
|
+
heading.textContent = text2;
|
|
19429
19455
|
heading.className = HEADING_CLASSES;
|
|
19430
19456
|
heading.setAttribute("role", "presentation");
|
|
19431
19457
|
return heading;
|
|
19432
19458
|
}
|
|
19433
|
-
function syncRendererLabelText(element,
|
|
19434
|
-
if (element.textContent ===
|
|
19435
|
-
element.textContent =
|
|
19459
|
+
function syncRendererLabelText(element, text2) {
|
|
19460
|
+
if (element.textContent === text2) return false;
|
|
19461
|
+
element.textContent = text2;
|
|
19436
19462
|
return true;
|
|
19437
19463
|
}
|
|
19438
19464
|
function applyModelSearchFilter(control) {
|
|
@@ -19448,7 +19474,7 @@ ${error51.stderrTail}`] : []
|
|
|
19448
19474
|
function mountRendererModelPicker(composerId, onSelectModel, onSelectThinking) {
|
|
19449
19475
|
ensureRendererTriggerChipStyle(document);
|
|
19450
19476
|
const root = document.createElement("div");
|
|
19451
|
-
root.setAttribute("data-
|
|
19477
|
+
root.setAttribute("data-harnessmix-model-control", composerId);
|
|
19452
19478
|
root.className = "relative min-w-0";
|
|
19453
19479
|
root.style.display = "none";
|
|
19454
19480
|
const trigger = document.createElement("button");
|
|
@@ -19506,7 +19532,7 @@ ${error51.stderrTail}`] : []
|
|
|
19506
19532
|
searchHeader.style.padding = "4px";
|
|
19507
19533
|
searchHeader.style.backgroundColor = "Canvas";
|
|
19508
19534
|
const searchEmpty = document.createElement("div");
|
|
19509
|
-
searchEmpty.dataset.
|
|
19535
|
+
searchEmpty.dataset.harnessmixModelSearchEmpty = "true";
|
|
19510
19536
|
searchEmpty.textContent = "No matching models";
|
|
19511
19537
|
searchEmpty.className = "block px-2 py-2 text-sm text-token-text-tertiary";
|
|
19512
19538
|
searchEmpty.hidden = true;
|
|
@@ -19657,7 +19683,7 @@ ${error51.stderrTail}`] : []
|
|
|
19657
19683
|
modelColumn.style.width = `${RENDERER_MODEL_PICKER_MAIN_MENU_WIDTH}px`;
|
|
19658
19684
|
modelColumn.style.minWidth = "0";
|
|
19659
19685
|
const modelList = document.createElement("div");
|
|
19660
|
-
modelList.setAttribute("data-
|
|
19686
|
+
modelList.setAttribute("data-harnessmix-model-scrollable", "true");
|
|
19661
19687
|
modelList.style.overflowY = "auto";
|
|
19662
19688
|
modelList.style.minHeight = "0";
|
|
19663
19689
|
modelColumn.append(createHeading("Model"), control.searchHeader, control.searchEmpty, modelList);
|
|
@@ -19667,12 +19693,12 @@ ${error51.stderrTail}`] : []
|
|
|
19667
19693
|
button.dataset.modelId = model.ref.id;
|
|
19668
19694
|
button.setAttribute("role", "menuitemradio");
|
|
19669
19695
|
button.className = OPTION_CLASSES;
|
|
19670
|
-
const
|
|
19671
|
-
|
|
19672
|
-
|
|
19673
|
-
|
|
19696
|
+
const text2 = document.createElement("span");
|
|
19697
|
+
text2.textContent = model.label;
|
|
19698
|
+
text2.className = "min-w-0 flex-1 truncate";
|
|
19699
|
+
text2.title = model.label;
|
|
19674
19700
|
const check2 = createCheck();
|
|
19675
|
-
button.append(projectModelIcon(model.label, button.ownerDocument),
|
|
19701
|
+
button.append(projectModelIcon(model.label, button.ownerDocument), text2, check2);
|
|
19676
19702
|
control.options.set(model.ref.id, {
|
|
19677
19703
|
button,
|
|
19678
19704
|
check: check2,
|
|
@@ -19687,7 +19713,7 @@ ${error51.stderrTail}`] : []
|
|
|
19687
19713
|
columns.append(modelColumn);
|
|
19688
19714
|
if (presentation.showThinkingSection) {
|
|
19689
19715
|
const thinkingColumn = document.createElement("div");
|
|
19690
|
-
thinkingColumn.dataset.
|
|
19716
|
+
thinkingColumn.dataset.harnessmixThinkingColumn = "true";
|
|
19691
19717
|
thinkingColumn.className = "flex min-w-0 flex-col";
|
|
19692
19718
|
thinkingColumn.style.display = control.thinkingExpanded ? "flex" : "none";
|
|
19693
19719
|
thinkingColumn.style.flexDirection = "column";
|
|
@@ -19697,7 +19723,7 @@ ${error51.stderrTail}`] : []
|
|
|
19697
19723
|
thinkingColumn.style.paddingLeft = "4px";
|
|
19698
19724
|
thinkingColumn.append(createHeading("Thinking"));
|
|
19699
19725
|
const thinkingList = document.createElement("div");
|
|
19700
|
-
thinkingList.setAttribute("data-
|
|
19726
|
+
thinkingList.setAttribute("data-harnessmix-model-scrollable", "true");
|
|
19701
19727
|
thinkingList.style.overflowY = "auto";
|
|
19702
19728
|
thinkingList.style.minHeight = "0";
|
|
19703
19729
|
for (const option of presentation.thinkingOptions) {
|
|
@@ -19706,11 +19732,11 @@ ${error51.stderrTail}`] : []
|
|
|
19706
19732
|
button.dataset.thinkingOptionId = option.id;
|
|
19707
19733
|
button.setAttribute("role", "menuitemradio");
|
|
19708
19734
|
button.className = OPTION_CLASSES;
|
|
19709
|
-
const
|
|
19710
|
-
|
|
19711
|
-
|
|
19735
|
+
const text2 = document.createElement("span");
|
|
19736
|
+
text2.textContent = option.label;
|
|
19737
|
+
text2.className = "min-w-0 flex-1 truncate";
|
|
19712
19738
|
const check2 = createCheck();
|
|
19713
|
-
button.append(
|
|
19739
|
+
button.append(text2, check2);
|
|
19714
19740
|
control.thinkingOptions.set(option.id, { button, check: check2 });
|
|
19715
19741
|
thinkingList.append(button);
|
|
19716
19742
|
}
|
|
@@ -19981,7 +20007,7 @@ ${error51.stderrTail}`] : []
|
|
|
19981
20007
|
function mountRendererPermissionModePicker(composerId, onSelect, locale = "en") {
|
|
19982
20008
|
ensureRendererTriggerChipStyle(document);
|
|
19983
20009
|
const root = document.createElement("div");
|
|
19984
|
-
root.setAttribute("data-
|
|
20010
|
+
root.setAttribute("data-harnessmix-permission-mode-control", composerId);
|
|
19985
20011
|
root.className = "relative min-w-0";
|
|
19986
20012
|
root.style.display = "none";
|
|
19987
20013
|
const trigger = document.createElement("button");
|
|
@@ -20450,7 +20476,7 @@ ${error51.stderrTail}`] : []
|
|
|
20450
20476
|
ensureRendererTriggerChipStyle(document);
|
|
20451
20477
|
const messages = rendererUsageMessages(locale);
|
|
20452
20478
|
const root = document.createElement("div");
|
|
20453
|
-
root.dataset.
|
|
20479
|
+
root.dataset.harnessmixUsageControl = composerId;
|
|
20454
20480
|
root.className = "relative min-w-0";
|
|
20455
20481
|
root.style.display = "none";
|
|
20456
20482
|
root.style.alignItems = "center";
|
|
@@ -20477,7 +20503,7 @@ ${error51.stderrTail}`] : []
|
|
|
20477
20503
|
trigger.style.fontVariantNumeric = "tabular-nums";
|
|
20478
20504
|
trigger.style.letterSpacing = "0";
|
|
20479
20505
|
const ringSlot = document.createElement("span");
|
|
20480
|
-
ringSlot.dataset.
|
|
20506
|
+
ringSlot.dataset.harnessmixUsageRing = "";
|
|
20481
20507
|
ringSlot.style.display = "inline-flex";
|
|
20482
20508
|
ringSlot.style.flex = "0 0 auto";
|
|
20483
20509
|
ringSlot.style.alignItems = "center";
|
|
@@ -20583,7 +20609,7 @@ ${error51.stderrTail}`] : []
|
|
|
20583
20609
|
closePopover(control);
|
|
20584
20610
|
return false;
|
|
20585
20611
|
}
|
|
20586
|
-
const ringSlot = control.trigger.querySelector("[data-
|
|
20612
|
+
const ringSlot = control.trigger.querySelector("[data-harnessmix-usage-ring]");
|
|
20587
20613
|
const contextPercent = usage?.contextUsagePercent !== void 0 ? usage.contextUsagePercent : hasContext && usage?.contextWindowTokens !== void 0 && usage.contextWindowTokens > 0 ? Math.round(100 * (usage.contextUsedTokens ?? 0) / usage.contextWindowTokens * 10) / 10 : void 0;
|
|
20588
20614
|
if (contextPercent !== void 0) {
|
|
20589
20615
|
const tone = contextPercent >= 90 ? "hot" : contextPercent >= 70 ? "warn" : "ok";
|
|
@@ -20719,7 +20745,7 @@ ${error51.stderrTail}`] : []
|
|
|
20719
20745
|
}
|
|
20720
20746
|
function renderCreditsBar(usagePercent, color) {
|
|
20721
20747
|
const track = document.createElement("div");
|
|
20722
|
-
track.dataset.
|
|
20748
|
+
track.dataset.harnessmixCreditsBar = "";
|
|
20723
20749
|
track.style.height = "6px";
|
|
20724
20750
|
track.style.borderRadius = "9999px";
|
|
20725
20751
|
track.style.background = "color-mix(in srgb, currentColor 12%, transparent)";
|
|
@@ -20886,7 +20912,7 @@ ${error51.stderrTail}`] : []
|
|
|
20886
20912
|
function mountRendererCreditsControl(composerId) {
|
|
20887
20913
|
ensureRendererTriggerChipStyle(document);
|
|
20888
20914
|
const root = document.createElement("div");
|
|
20889
|
-
root.dataset.
|
|
20915
|
+
root.dataset.harnessmixCreditsControl = composerId;
|
|
20890
20916
|
root.className = "relative min-w-0";
|
|
20891
20917
|
root.style.display = "none";
|
|
20892
20918
|
root.style.alignItems = "center";
|
|
@@ -20912,11 +20938,11 @@ ${error51.stderrTail}`] : []
|
|
|
20912
20938
|
trigger.style.fontVariantNumeric = "tabular-nums";
|
|
20913
20939
|
trigger.style.letterSpacing = "0";
|
|
20914
20940
|
const ringSlot = document.createElement("span");
|
|
20915
|
-
ringSlot.dataset.
|
|
20941
|
+
ringSlot.dataset.harnessmixCreditsRing = "";
|
|
20916
20942
|
ringSlot.style.display = "inline-flex";
|
|
20917
20943
|
ringSlot.style.flex = "0 0 auto";
|
|
20918
20944
|
const label = document.createElement("span");
|
|
20919
|
-
label.dataset.
|
|
20945
|
+
label.dataset.harnessmixCreditsLabel = "";
|
|
20920
20946
|
label.style.display = "inline-block";
|
|
20921
20947
|
label.style.maxWidth = "100%";
|
|
20922
20948
|
label.style.overflow = "hidden";
|
|
@@ -21007,8 +21033,8 @@ ${error51.stderrTail}`] : []
|
|
|
21007
21033
|
const percent = formatRendererCreditsPercent(remaining);
|
|
21008
21034
|
const title = `${creditsPeriodLabel(accountCredits.periodType)} ${percent}`;
|
|
21009
21035
|
const tone = rendererCreditsTone(accountCredits.usedPercent);
|
|
21010
|
-
const ringSlot = control.trigger.querySelector("[data-
|
|
21011
|
-
const label = control.trigger.querySelector("[data-
|
|
21036
|
+
const ringSlot = control.trigger.querySelector("[data-harnessmix-credits-ring]");
|
|
21037
|
+
const label = control.trigger.querySelector("[data-harnessmix-credits-label]");
|
|
21012
21038
|
if (ringSlot) {
|
|
21013
21039
|
ringSlot.replaceChildren(
|
|
21014
21040
|
createRendererUsageRing(remaining, {
|
|
@@ -21027,12 +21053,12 @@ ${error51.stderrTail}`] : []
|
|
|
21027
21053
|
}
|
|
21028
21054
|
|
|
21029
21055
|
// src/native-ui/renderer-extension/src/renderer-harness-command-claim.ts
|
|
21030
|
-
function inputEvent(editor,
|
|
21056
|
+
function inputEvent(editor, text2) {
|
|
21031
21057
|
const view = editor.ownerDocument.defaultView;
|
|
21032
21058
|
return view?.InputEvent ? new view.InputEvent("input", {
|
|
21033
21059
|
bubbles: true,
|
|
21034
21060
|
composed: true,
|
|
21035
|
-
data:
|
|
21061
|
+
data: text2,
|
|
21036
21062
|
inputType: "insertText"
|
|
21037
21063
|
}) : new (view?.Event ?? Event)("input", { bubbles: true, composed: true });
|
|
21038
21064
|
}
|
|
@@ -21079,8 +21105,8 @@ ${error51.stderrTail}`] : []
|
|
|
21079
21105
|
}
|
|
21080
21106
|
|
|
21081
21107
|
// src/native-ui/renderer-extension/src/renderer-harness-command-control.ts
|
|
21082
|
-
var CONTROL_ATTRIBUTE2 = "data-
|
|
21083
|
-
var MENU_ATTRIBUTE = "data-
|
|
21108
|
+
var CONTROL_ATTRIBUTE2 = "data-harnessmix-harness-command-control";
|
|
21109
|
+
var MENU_ATTRIBUTE = "data-harnessmix-harness-command-menu";
|
|
21084
21110
|
var MENU_WIDTH = 320;
|
|
21085
21111
|
var VIEWPORT_MARGIN = 8;
|
|
21086
21112
|
var MENU_GAP = 8;
|
|
@@ -21557,11 +21583,11 @@ ${error51.stderrTail}`] : []
|
|
|
21557
21583
|
const input = document.createElement("input");
|
|
21558
21584
|
input.type = "checkbox";
|
|
21559
21585
|
input.checked = true;
|
|
21560
|
-
const
|
|
21561
|
-
row.append(input,
|
|
21586
|
+
const text2 = document.createTextNode("");
|
|
21587
|
+
row.append(input, text2);
|
|
21562
21588
|
includeGrid.append(row);
|
|
21563
21589
|
includeInputs[key] = input;
|
|
21564
|
-
includeLabels[key] =
|
|
21590
|
+
includeLabels[key] = text2;
|
|
21565
21591
|
}
|
|
21566
21592
|
includeSection.append(includeGrid);
|
|
21567
21593
|
const label = document.createElement("label");
|
|
@@ -21623,9 +21649,9 @@ ${error51.stderrTail}`] : []
|
|
|
21623
21649
|
labelText.textContent = messages.noteLabel;
|
|
21624
21650
|
intentLabelText.textContent = messages.intentLabel;
|
|
21625
21651
|
includeLegend.textContent = messages.includeLabel;
|
|
21626
|
-
for (const [value,
|
|
21652
|
+
for (const [value, text2] of Object.entries(messages.intentOptions)) {
|
|
21627
21653
|
const option = [...intent.options].find((candidate) => candidate.value === value);
|
|
21628
|
-
if (option) option.textContent =
|
|
21654
|
+
if (option) option.textContent = text2;
|
|
21629
21655
|
}
|
|
21630
21656
|
for (const key of Object.keys(includeInputs)) includeLabels[key].data = messages.includeOptions[key];
|
|
21631
21657
|
note.placeholder = messages.notePlaceholder;
|
|
@@ -21725,7 +21751,7 @@ ${error51.stderrTail}`] : []
|
|
|
21725
21751
|
return controlDescription(button);
|
|
21726
21752
|
}
|
|
21727
21753
|
function isOwnedRendererControl(element) {
|
|
21728
|
-
return element.hasAttribute(CONTROL_ATTRIBUTE) || element.hasAttribute("data-
|
|
21754
|
+
return element.hasAttribute(CONTROL_ATTRIBUTE) || element.hasAttribute("data-harnessmix-model-control") || element.hasAttribute("data-harnessmix-permission-mode-control") || element.hasAttribute("data-harnessmix-usage-control") || element.hasAttribute("data-harnessmix-credits-control") || element.hasAttribute("data-harnessmix-harness-command-control");
|
|
21729
21755
|
}
|
|
21730
21756
|
function isComposerSubmitButton(button) {
|
|
21731
21757
|
if (button.type === "submit") return true;
|
|
@@ -21805,7 +21831,7 @@ ${error51.stderrTail}`] : []
|
|
|
21805
21831
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
21806
21832
|
}
|
|
21807
21833
|
function isNativeModelControlCandidate(element) {
|
|
21808
|
-
if (element.hasAttribute(CONTROL_ATTRIBUTE) || element.hasAttribute("data-
|
|
21834
|
+
if (element.hasAttribute(CONTROL_ATTRIBUTE) || element.hasAttribute("data-harnessmix-model-control") || !element.matches('button[aria-haspopup="menu"]')) {
|
|
21809
21835
|
return false;
|
|
21810
21836
|
}
|
|
21811
21837
|
if (element.getAttribute("data-codex-intelligence-trigger") === "true" && element.getAttribute("data-composer-navigation-target") === "reasoning") {
|
|
@@ -21826,7 +21852,7 @@ ${error51.stderrTail}`] : []
|
|
|
21826
21852
|
return false;
|
|
21827
21853
|
}
|
|
21828
21854
|
function isNativePermissionModeControlCandidate(element) {
|
|
21829
|
-
if (element.hasAttribute(CONTROL_ATTRIBUTE) || element.hasAttribute("data-
|
|
21855
|
+
if (element.hasAttribute(CONTROL_ATTRIBUTE) || element.hasAttribute("data-harnessmix-permission-mode-control") || !element.matches('button[aria-haspopup="menu"][data-composer-navigation-target="permissions"]')) {
|
|
21830
21856
|
return false;
|
|
21831
21857
|
}
|
|
21832
21858
|
const fiberName = Object.getOwnPropertyNames(element).find(
|
|
@@ -21855,7 +21881,7 @@ ${error51.stderrTail}`] : []
|
|
|
21855
21881
|
...composer.querySelectorAll(
|
|
21856
21882
|
'button[aria-haspopup="menu"][data-composer-navigation-target="permissions"]'
|
|
21857
21883
|
)
|
|
21858
|
-
].filter((element) => !element.hasAttribute("data-
|
|
21884
|
+
].filter((element) => !element.hasAttribute("data-harnessmix-permission-mode-control"));
|
|
21859
21885
|
return candidates.length === 1 ? candidates[0] ?? null : null;
|
|
21860
21886
|
}
|
|
21861
21887
|
function nativePermissionModeControlForComposer(composer) {
|
|
@@ -21869,7 +21895,7 @@ ${error51.stderrTail}`] : []
|
|
|
21869
21895
|
return candidates.length === 1 ? candidates[0] ?? null : null;
|
|
21870
21896
|
}
|
|
21871
21897
|
function isNativeContextUsageControlCandidate(element) {
|
|
21872
|
-
if (element.hasAttribute("data-
|
|
21898
|
+
if (element.hasAttribute("data-harnessmix-usage-control") || element.hasAttribute("data-harnessmix-credits-control")) {
|
|
21873
21899
|
return false;
|
|
21874
21900
|
}
|
|
21875
21901
|
return element.matches('span[role="img"][aria-label]') && element.querySelectorAll("svg > circle").length === 2;
|
|
@@ -22179,21 +22205,49 @@ ${error51.stderrTail}`] : []
|
|
|
22179
22205
|
method;
|
|
22180
22206
|
code = -32601;
|
|
22181
22207
|
};
|
|
22208
|
+
var RendererRequestTimeoutError = class extends Error {
|
|
22209
|
+
constructor(method, timeoutMs) {
|
|
22210
|
+
super(`${method} did not answer within ${timeoutMs} ms`, { cause: void 0 });
|
|
22211
|
+
this.method = method;
|
|
22212
|
+
this.timeoutMs = timeoutMs;
|
|
22213
|
+
this.name = "RendererRequestTimeoutError";
|
|
22214
|
+
}
|
|
22215
|
+
method;
|
|
22216
|
+
timeoutMs;
|
|
22217
|
+
code = -32098;
|
|
22218
|
+
};
|
|
22219
|
+
var RENDERER_REQUEST_TIMEOUT_DEFAULT_MS = 2e4;
|
|
22182
22220
|
function isUnsupportedMethod(error51, method) {
|
|
22183
22221
|
if (typeof error51 !== "object" || error51 === null) return false;
|
|
22184
22222
|
const code = "code" in error51 ? error51.code : void 0;
|
|
22185
22223
|
const message = "message" in error51 ? error51.message : void 0;
|
|
22186
22224
|
return code === -32601 || code === -32600 && typeof message === "string" && message.startsWith(`Invalid request: unknown variant \`${method}\``);
|
|
22187
22225
|
}
|
|
22188
|
-
function createRendererRequestSender(send) {
|
|
22226
|
+
function createRendererRequestSender(send, options = {}) {
|
|
22189
22227
|
const unsupported = /* @__PURE__ */ new Map();
|
|
22228
|
+
const timeoutMs = options.timeoutMs ?? RENDERER_REQUEST_TIMEOUT_DEFAULT_MS;
|
|
22190
22229
|
return async (method, params) => {
|
|
22191
22230
|
const known = unsupported.get(method);
|
|
22192
22231
|
if (known) throw known;
|
|
22193
22232
|
try {
|
|
22194
|
-
|
|
22233
|
+
const attempt = Promise.resolve(send(method, params));
|
|
22234
|
+
if (timeoutMs <= 0 || options.isTimeoutExempt?.(method)) return await attempt;
|
|
22235
|
+
let timer;
|
|
22236
|
+
try {
|
|
22237
|
+
return await Promise.race([
|
|
22238
|
+
attempt,
|
|
22239
|
+
new Promise((_resolve, reject) => {
|
|
22240
|
+
timer = setTimeout(
|
|
22241
|
+
() => reject(new RendererRequestTimeoutError(method, timeoutMs)),
|
|
22242
|
+
timeoutMs
|
|
22243
|
+
);
|
|
22244
|
+
})
|
|
22245
|
+
]);
|
|
22246
|
+
} finally {
|
|
22247
|
+
if (timer !== void 0) clearTimeout(timer);
|
|
22248
|
+
}
|
|
22195
22249
|
} catch (error51) {
|
|
22196
|
-
if (!method.startsWith("
|
|
22250
|
+
if (!method.startsWith("harnessmix/") || !isUnsupportedMethod(error51, method)) throw error51;
|
|
22197
22251
|
const unavailable = new RendererMethodUnavailableError(method, error51);
|
|
22198
22252
|
unsupported.set(method, unavailable);
|
|
22199
22253
|
throw unavailable;
|
|
@@ -22206,7 +22260,7 @@ ${error51.stderrTail}`] : []
|
|
|
22206
22260
|
var SIDEBAR_THREAD_ROW_SELECTOR = `[${SIDEBAR_THREAD_ROW_ATTRIBUTE}]`;
|
|
22207
22261
|
var SIDEBAR_THREAD_ID_ATTRIBUTE = "data-app-action-sidebar-thread-id";
|
|
22208
22262
|
var SIDEBAR_THREAD_HOST_ID_ATTRIBUTE = "data-app-action-sidebar-thread-host-id";
|
|
22209
|
-
var SIDEBAR_AGENT_ICON_ATTRIBUTE = "data-
|
|
22263
|
+
var SIDEBAR_AGENT_ICON_ATTRIBUTE = "data-harnessmix-sidebar-agent-icon";
|
|
22210
22264
|
var OWNERSHIP_RETRY_DELAYS_MS = [100, 300, 800, 1500, 3e3];
|
|
22211
22265
|
function isRecord3(value) {
|
|
22212
22266
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
@@ -22232,22 +22286,23 @@ ${error51.stderrTail}`] : []
|
|
|
22232
22286
|
const fiberNames = Object.getOwnPropertyNames(element).filter(
|
|
22233
22287
|
(name) => name.startsWith("__reactFiber$")
|
|
22234
22288
|
);
|
|
22235
|
-
|
|
22236
|
-
if (fiberNames.length !== 1 || !fiberName) return null;
|
|
22237
|
-
const firstFiber2 = Object.getOwnPropertyDescriptor(element, fiberName)?.value;
|
|
22238
|
-
if (!isRecord3(firstFiber2)) return null;
|
|
22289
|
+
if (fiberNames.length === 0) return null;
|
|
22239
22290
|
const candidates = /* @__PURE__ */ new Set();
|
|
22240
|
-
|
|
22241
|
-
|
|
22242
|
-
|
|
22243
|
-
|
|
22244
|
-
|
|
22245
|
-
const
|
|
22246
|
-
if (
|
|
22247
|
-
|
|
22291
|
+
for (const fiberName of fiberNames) {
|
|
22292
|
+
const firstFiber2 = Object.getOwnPropertyDescriptor(element, fiberName)?.value;
|
|
22293
|
+
if (!isRecord3(firstFiber2)) continue;
|
|
22294
|
+
let fiber = firstFiber2;
|
|
22295
|
+
for (let depth = 0; fiber && depth < 16; depth += 1) {
|
|
22296
|
+
const props = fiber.memoizedProps;
|
|
22297
|
+
if (isRecord3(props) && isRecord3(props.dataAttributes)) {
|
|
22298
|
+
const dataAttributes = props.dataAttributes;
|
|
22299
|
+
const threadId = hostThreadIdSchema.safeParse(props.conversationId);
|
|
22300
|
+
if (threadId.success && dataAttributes[SIDEBAR_THREAD_ROW_ATTRIBUTE] === rowMarker && dataAttributes[SIDEBAR_THREAD_ID_ATTRIBUTE] === taskKey && dataAttributes[SIDEBAR_THREAD_HOST_ID_ATTRIBUTE] === hostId) {
|
|
22301
|
+
candidates.add(threadId.data);
|
|
22302
|
+
}
|
|
22248
22303
|
}
|
|
22304
|
+
fiber = isRecord3(fiber.return) ? fiber.return : null;
|
|
22249
22305
|
}
|
|
22250
|
-
fiber = isRecord3(fiber.return) ? fiber.return : null;
|
|
22251
22306
|
}
|
|
22252
22307
|
return candidates.size === 1 ? candidates.values().next().value ?? null : null;
|
|
22253
22308
|
}
|
|
@@ -22855,7 +22910,7 @@ ${error51.stderrTail}`] : []
|
|
|
22855
22910
|
} catch {
|
|
22856
22911
|
}
|
|
22857
22912
|
const ownership = threadOwnershipListResultSchema.parse(
|
|
22858
|
-
await originalSend.call(manager, "
|
|
22913
|
+
await originalSend.call(manager, "harnessmix/thread/ownership/list", {
|
|
22859
22914
|
threadIds: [threadId]
|
|
22860
22915
|
})
|
|
22861
22916
|
);
|
|
@@ -22927,7 +22982,7 @@ ${error51.stderrTail}`] : []
|
|
|
22927
22982
|
try {
|
|
22928
22983
|
resumeQueue();
|
|
22929
22984
|
} catch {
|
|
22930
|
-
console.error("
|
|
22985
|
+
console.error("harnessmix could not restore follow-up queue state after steering");
|
|
22931
22986
|
}
|
|
22932
22987
|
return { turnId: response.turn.id };
|
|
22933
22988
|
}).finally(() => {
|
|
@@ -22976,11 +23031,11 @@ ${error51.stderrTail}`] : []
|
|
|
22976
23031
|
var catalogSchema = external_exports.object({ harnesses: external_exports.array(external_exports.object({ id: external_exports.string(), name: external_exports.string(), available: external_exports.boolean(), mcp: external_exports.boolean(), skills: external_exports.boolean() })) });
|
|
22977
23032
|
function createRendererIntegrationsClient(send) {
|
|
22978
23033
|
return {
|
|
22979
|
-
integrationCatalog: async () => catalogSchema.parse(await send("
|
|
22980
|
-
listIntegrations: async (input) => snapshotSchema.parse(await send("
|
|
22981
|
-
saveMcp: (input) => send("
|
|
22982
|
-
removeMcp: (input) => send("
|
|
22983
|
-
changeSkill: (input) => send("
|
|
23034
|
+
integrationCatalog: async () => catalogSchema.parse(await send("harnessmix/integrations/catalog", {})),
|
|
23035
|
+
listIntegrations: async (input) => snapshotSchema.parse(await send("harnessmix/integrations/list", input)),
|
|
23036
|
+
saveMcp: (input) => send("harnessmix/integrations/mcp/save", input),
|
|
23037
|
+
removeMcp: (input) => send("harnessmix/integrations/mcp/remove", input),
|
|
23038
|
+
changeSkill: (input) => send("harnessmix/integrations/skill/change", input)
|
|
22984
23039
|
};
|
|
22985
23040
|
}
|
|
22986
23041
|
|
|
@@ -23005,13 +23060,13 @@ ${error51.stderrTail}`] : []
|
|
|
23005
23060
|
return {
|
|
23006
23061
|
async listSessionImportSources() {
|
|
23007
23062
|
return harnessSessionImportSourcesResultSchema.parse(
|
|
23008
|
-
await request("
|
|
23063
|
+
await request("harnessmix/harness/session-import/sources", {})
|
|
23009
23064
|
);
|
|
23010
23065
|
},
|
|
23011
23066
|
async listHarnessSessions(input) {
|
|
23012
23067
|
const params = harnessSessionListParamsSchema.parse(input);
|
|
23013
23068
|
return harnessSessionListResultSchema.parse(
|
|
23014
|
-
await request("
|
|
23069
|
+
await request("harnessmix/harness/session-import/list", params)
|
|
23015
23070
|
);
|
|
23016
23071
|
},
|
|
23017
23072
|
async importHarnessSession(input) {
|
|
@@ -23019,7 +23074,7 @@ ${error51.stderrTail}`] : []
|
|
|
23019
23074
|
const key = JSON.stringify([params.harnessId, params.nativeSessionId]);
|
|
23020
23075
|
const existing = pending.get(key);
|
|
23021
23076
|
if (existing) return existing;
|
|
23022
|
-
const operation = request("
|
|
23077
|
+
const operation = request("harnessmix/harness/session-import/import", params).then((value) => harnessSessionImportResultSchema.parse(value)).finally(() => {
|
|
23023
23078
|
if (pending.get(key) === operation) pending.delete(key);
|
|
23024
23079
|
});
|
|
23025
23080
|
pending.set(key, operation);
|
|
@@ -23031,47 +23086,48 @@ ${error51.stderrTail}`] : []
|
|
|
23031
23086
|
// src/native-ui/renderer-extension/src/settings/pets-client.ts
|
|
23032
23087
|
function createRendererPetsClient(send) {
|
|
23033
23088
|
return {
|
|
23034
|
-
catalog: async () => await send("
|
|
23035
|
-
community: async (query = {}) => await send("
|
|
23036
|
-
preview: async (id) => await send("
|
|
23037
|
-
install: async (params) => await send("
|
|
23038
|
-
uninstall: async (id) => await send("
|
|
23089
|
+
catalog: async () => await send("harnessmix/pets/catalog", {}),
|
|
23090
|
+
community: async (query = {}) => await send("harnessmix/pets/community", query),
|
|
23091
|
+
preview: async (id) => await send("harnessmix/pets/preview", { id }),
|
|
23092
|
+
install: async (params) => await send("harnessmix/pets/install", params),
|
|
23093
|
+
uninstall: async (id) => await send("harnessmix/pets/uninstall", { id })
|
|
23039
23094
|
};
|
|
23040
23095
|
}
|
|
23041
23096
|
|
|
23042
23097
|
// src/native-ui/renderer-extension/src/renderer-model-client.ts
|
|
23043
|
-
var HARNESS_INSPECT_METHOD = "
|
|
23044
|
-
var HARNESS_INSTALL_METHOD = "
|
|
23045
|
-
var HARNESS_PLUGIN_LIST_METHOD = "
|
|
23046
|
-
var HARNESS_WEB_UI_OPEN_METHOD = "
|
|
23047
|
-
var THREAD_FORK_METHOD = "
|
|
23048
|
-
var THREAD_HARNESS_SWITCH_METHOD = "
|
|
23049
|
-
var THREAD_INSPECT_METHOD = "
|
|
23050
|
-
var HARNESS_COMMANDS_INSPECT_METHOD = "
|
|
23051
|
-
var THREAD_COMMANDS_INSPECT_METHOD = "
|
|
23052
|
-
var THREAD_COMMAND_EXECUTE_METHOD = "
|
|
23053
|
-
var THREAD_DELEGATE_METHOD = "
|
|
23054
|
-
var THREAD_MESSAGE_METHOD = "
|
|
23055
|
-
var THREAD_MODEL_SELECT_METHOD = "
|
|
23056
|
-
var THREAD_THINKING_SELECT_METHOD = "
|
|
23057
|
-
var THREAD_PERMISSION_MODE_SELECT_METHOD = "
|
|
23058
|
-
var THREAD_OWNERSHIP_LIST_METHOD = "
|
|
23059
|
-
var THREAD_USAGE_INSPECT_METHOD = "
|
|
23060
|
-
var
|
|
23098
|
+
var HARNESS_INSPECT_METHOD = "harnessmix/harness/inspect";
|
|
23099
|
+
var HARNESS_INSTALL_METHOD = "harnessmix/harness/install";
|
|
23100
|
+
var HARNESS_PLUGIN_LIST_METHOD = "harnessmix/harness/plugins/list";
|
|
23101
|
+
var HARNESS_WEB_UI_OPEN_METHOD = "harnessmix/harness/web-ui/open";
|
|
23102
|
+
var THREAD_FORK_METHOD = "harnessmix/thread/fork";
|
|
23103
|
+
var THREAD_HARNESS_SWITCH_METHOD = "harnessmix/thread/harness/switch";
|
|
23104
|
+
var THREAD_INSPECT_METHOD = "harnessmix/thread/inspect";
|
|
23105
|
+
var HARNESS_COMMANDS_INSPECT_METHOD = "harnessmix/harness/commands/inspect";
|
|
23106
|
+
var THREAD_COMMANDS_INSPECT_METHOD = "harnessmix/thread/commands/inspect";
|
|
23107
|
+
var THREAD_COMMAND_EXECUTE_METHOD = "harnessmix/thread/command/execute";
|
|
23108
|
+
var THREAD_DELEGATE_METHOD = "harnessmix/thread/delegate";
|
|
23109
|
+
var THREAD_MESSAGE_METHOD = "harnessmix/thread/message";
|
|
23110
|
+
var THREAD_MODEL_SELECT_METHOD = "harnessmix/thread/model/select";
|
|
23111
|
+
var THREAD_THINKING_SELECT_METHOD = "harnessmix/thread/thinking/select";
|
|
23112
|
+
var THREAD_PERMISSION_MODE_SELECT_METHOD = "harnessmix/thread/permission-mode/select";
|
|
23113
|
+
var THREAD_OWNERSHIP_LIST_METHOD = "harnessmix/thread/ownership/list";
|
|
23114
|
+
var THREAD_USAGE_INSPECT_METHOD = "harnessmix/thread/usage/inspect";
|
|
23115
|
+
var THREAD_TEAM_INSPECT_METHOD = "harnessmix/thread/team/inspect";
|
|
23116
|
+
var THREAD_USAGE_UPDATED_METHOD = "harnessmix/thread/usage/updated";
|
|
23061
23117
|
var THREAD_TOKEN_USAGE_UPDATED_METHOD = "thread/tokenUsage/updated";
|
|
23062
|
-
var UPDATE_CHECK_METHOD = "
|
|
23063
|
-
var UPDATE_START_METHOD = "
|
|
23064
|
-
var UPDATE_STATUS_METHOD = "
|
|
23118
|
+
var UPDATE_CHECK_METHOD = "harnessmix/update/check";
|
|
23119
|
+
var UPDATE_START_METHOD = "harnessmix/update/start";
|
|
23120
|
+
var UPDATE_STATUS_METHOD = "harnessmix/update/status";
|
|
23065
23121
|
var RUNTIME_VERSION_METHOD = "harness-mix/runtime/version";
|
|
23066
|
-
var CODEX_ACCOUNT_LIST_METHOD = "
|
|
23067
|
-
var CODEX_ACCOUNT_REFRESH_METHOD = "
|
|
23068
|
-
var CODEX_ACCOUNT_CREATE_METHOD = "
|
|
23069
|
-
var CODEX_ACCOUNT_DELETE_METHOD = "
|
|
23070
|
-
var CODEX_ACCOUNT_ACTIVATE_METHOD = "
|
|
23071
|
-
var CODEX_ACCOUNT_LOGIN_START_METHOD = "
|
|
23072
|
-
var CODEX_ACCOUNT_LOGIN_CANCEL_METHOD = "
|
|
23073
|
-
var CODEX_ACCOUNT_LOGIN_COMPLETED_METHOD = "
|
|
23074
|
-
var CODEX_ACCOUNT_RESET_CREDIT_CONSUME_METHOD = "
|
|
23122
|
+
var CODEX_ACCOUNT_LIST_METHOD = "harnessmix/account/list";
|
|
23123
|
+
var CODEX_ACCOUNT_REFRESH_METHOD = "harnessmix/account/refresh";
|
|
23124
|
+
var CODEX_ACCOUNT_CREATE_METHOD = "harnessmix/account/create";
|
|
23125
|
+
var CODEX_ACCOUNT_DELETE_METHOD = "harnessmix/account/delete";
|
|
23126
|
+
var CODEX_ACCOUNT_ACTIVATE_METHOD = "harnessmix/account/activate";
|
|
23127
|
+
var CODEX_ACCOUNT_LOGIN_START_METHOD = "harnessmix/account/login/start";
|
|
23128
|
+
var CODEX_ACCOUNT_LOGIN_CANCEL_METHOD = "harnessmix/account/login/cancel";
|
|
23129
|
+
var CODEX_ACCOUNT_LOGIN_COMPLETED_METHOD = "harnessmix/account/login/completed";
|
|
23130
|
+
var CODEX_ACCOUNT_RESET_CREDIT_CONSUME_METHOD = "harnessmix/account/rate-limit-reset/consume";
|
|
23075
23131
|
function isRecord6(value) {
|
|
23076
23132
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
23077
23133
|
}
|
|
@@ -23119,6 +23175,16 @@ ${error51.stderrTail}`] : []
|
|
|
23119
23175
|
}
|
|
23120
23176
|
};
|
|
23121
23177
|
}
|
|
23178
|
+
var REQUEST_TIMEOUT_EXEMPT_METHODS = /* @__PURE__ */ new Set([
|
|
23179
|
+
HARNESS_INSTALL_METHOD,
|
|
23180
|
+
THREAD_FORK_METHOD,
|
|
23181
|
+
THREAD_HARNESS_SWITCH_METHOD,
|
|
23182
|
+
THREAD_COMMAND_EXECUTE_METHOD,
|
|
23183
|
+
THREAD_DELEGATE_METHOD,
|
|
23184
|
+
THREAD_MESSAGE_METHOD,
|
|
23185
|
+
UPDATE_START_METHOD,
|
|
23186
|
+
CODEX_ACCOUNT_LOGIN_START_METHOD
|
|
23187
|
+
]);
|
|
23122
23188
|
function createRendererModelClient(candidates) {
|
|
23123
23189
|
const managers = candidates.filter(
|
|
23124
23190
|
(candidate) => typeof candidate.sendRequest === "function"
|
|
@@ -23127,7 +23193,8 @@ ${error51.stderrTail}`] : []
|
|
|
23127
23193
|
if (managers.length !== 1 || !source) return null;
|
|
23128
23194
|
const manager = {
|
|
23129
23195
|
sendRequest: createRendererRequestSender(
|
|
23130
|
-
(method, params) => source.sendRequest(method, params)
|
|
23196
|
+
(method, params) => source.sendRequest(method, params),
|
|
23197
|
+
{ isTimeoutExempt: (method) => REQUEST_TIMEOUT_EXEMPT_METHODS.has(method) }
|
|
23131
23198
|
)
|
|
23132
23199
|
};
|
|
23133
23200
|
const inspectHarness = async (input) => {
|
|
@@ -23172,13 +23239,13 @@ ${error51.stderrTail}`] : []
|
|
|
23172
23239
|
};
|
|
23173
23240
|
return Object.freeze({
|
|
23174
23241
|
async inspectStorage() {
|
|
23175
|
-
return await manager.sendRequest("
|
|
23242
|
+
return await manager.sendRequest("harnessmix/storage/inspect", {});
|
|
23176
23243
|
},
|
|
23177
23244
|
async optimizeStorage() {
|
|
23178
|
-
return await manager.sendRequest("
|
|
23245
|
+
return await manager.sendRequest("harnessmix/storage/optimize", {});
|
|
23179
23246
|
},
|
|
23180
23247
|
async listCollaborationAgents() {
|
|
23181
|
-
const result = await manager.sendRequest("
|
|
23248
|
+
const result = await manager.sendRequest("harnessmix/collaboration/agents", {});
|
|
23182
23249
|
if (!Array.isArray(result) || !result.every((a) => a && typeof a.id === "string" && typeof a.name === "string" && typeof a.available === "boolean" && typeof a.lead === "boolean")) throw new Error("Invalid collaboration catalog");
|
|
23183
23250
|
return result;
|
|
23184
23251
|
},
|
|
@@ -23215,7 +23282,7 @@ ${error51.stderrTail}`] : []
|
|
|
23215
23282
|
return result;
|
|
23216
23283
|
},
|
|
23217
23284
|
async loginHarnessAccount(input) {
|
|
23218
|
-
const result = await manager.sendRequest("
|
|
23285
|
+
const result = await manager.sendRequest("harnessmix/harness/account/login", input);
|
|
23219
23286
|
return result;
|
|
23220
23287
|
},
|
|
23221
23288
|
async listHarnessPlugins() {
|
|
@@ -23240,7 +23307,7 @@ ${error51.stderrTail}`] : []
|
|
|
23240
23307
|
includeTurns: false
|
|
23241
23308
|
});
|
|
23242
23309
|
const thread = isRecord6(native) ? native.thread : null;
|
|
23243
|
-
if (!isRecord6(thread) || thread.id !== params.threadId || typeof thread.modelProvider !== "string" || !thread.modelProvider || thread.modelProvider === "
|
|
23310
|
+
if (!isRecord6(thread) || thread.id !== params.threadId || typeof thread.modelProvider !== "string" || !thread.modelProvider || thread.modelProvider === "harnessmix" || typeof thread.cliVersion !== "string" || !thread.cliVersion || thread.cliVersion === "harnessmix") {
|
|
23244
23311
|
throw new Error("Native Thread response cannot establish Codex ownership");
|
|
23245
23312
|
}
|
|
23246
23313
|
return { owner: "codex", locked: true };
|
|
@@ -23260,6 +23327,10 @@ ${error51.stderrTail}`] : []
|
|
|
23260
23327
|
return result;
|
|
23261
23328
|
},
|
|
23262
23329
|
inspectThreadUsage,
|
|
23330
|
+
async inspectThreadTeam(input) {
|
|
23331
|
+
const threadId = hostThreadIdSchema.parse(input.threadId);
|
|
23332
|
+
return manager.sendRequest(THREAD_TEAM_INSPECT_METHOD, { threadId, ...input.teamId ? { teamId: input.teamId } : {} });
|
|
23333
|
+
},
|
|
23263
23334
|
subscribeThreadUsage(listener) {
|
|
23264
23335
|
const notifications = notificationTarget(source);
|
|
23265
23336
|
if (!notifications?.addNotificationCallback) {
|
|
@@ -23319,7 +23390,7 @@ ${error51.stderrTail}`] : []
|
|
|
23319
23390
|
},
|
|
23320
23391
|
async inspectCodexAccountUsage(input) {
|
|
23321
23392
|
const result = await manager.sendRequest(
|
|
23322
|
-
"
|
|
23393
|
+
"harnessmix/account/usage/inspect",
|
|
23323
23394
|
codexAccountUsageParamsSchema.parse(input)
|
|
23324
23395
|
);
|
|
23325
23396
|
return codexAccountUsageResultSchema.parse(result);
|
|
@@ -23333,7 +23404,7 @@ ${error51.stderrTail}`] : []
|
|
|
23333
23404
|
},
|
|
23334
23405
|
async listHarnessAccounts() {
|
|
23335
23406
|
return harnessAccountListResultSchema.parse(
|
|
23336
|
-
await manager.sendRequest("
|
|
23407
|
+
await manager.sendRequest("harnessmix/harness/accounts/list", {})
|
|
23337
23408
|
);
|
|
23338
23409
|
},
|
|
23339
23410
|
async listCodexAccounts() {
|
|
@@ -23380,7 +23451,7 @@ ${error51.stderrTail}`] : []
|
|
|
23380
23451
|
return codexAccountLoginCancelResultSchema.parse(result);
|
|
23381
23452
|
},
|
|
23382
23453
|
async logoutCodexAccount() {
|
|
23383
|
-
const result = await manager.sendRequest("
|
|
23454
|
+
const result = await manager.sendRequest("harnessmix/account/logout", {});
|
|
23384
23455
|
return codexAccountMutationResultSchema.parse(result);
|
|
23385
23456
|
},
|
|
23386
23457
|
subscribeCodexAccountLogin(listener) {
|
|
@@ -23403,19 +23474,19 @@ ${error51.stderrTail}`] : []
|
|
|
23403
23474
|
}
|
|
23404
23475
|
|
|
23405
23476
|
// src/native-ui/renderer-extension/src/versioned-renderer-adapter.ts
|
|
23406
|
-
var PI_TRANSPORT_MODEL_ID = "
|
|
23477
|
+
var PI_TRANSPORT_MODEL_ID = "harnessmix/pi-native";
|
|
23407
23478
|
var PI_TRANSPORT_MODEL_PREFIX = `${PI_TRANSPORT_MODEL_ID}@`;
|
|
23408
|
-
var CLAUDE_CODE_TRANSPORT_MODEL_ID = "
|
|
23479
|
+
var CLAUDE_CODE_TRANSPORT_MODEL_ID = "harnessmix/claude-code-native";
|
|
23409
23480
|
var CLAUDE_CODE_TRANSPORT_MODEL_PREFIX = `${CLAUDE_CODE_TRANSPORT_MODEL_ID}@`;
|
|
23410
|
-
var DEEPSEEK_HARNESS_TRANSPORT_MODEL_ID = "
|
|
23481
|
+
var DEEPSEEK_HARNESS_TRANSPORT_MODEL_ID = "harnessmix/deepseek-harness-native";
|
|
23411
23482
|
var DEEPSEEK_HARNESS_TRANSPORT_MODEL_PREFIX = `${DEEPSEEK_HARNESS_TRANSPORT_MODEL_ID}@`;
|
|
23412
|
-
var OPENCODE_TRANSPORT_MODEL_ID = "
|
|
23483
|
+
var OPENCODE_TRANSPORT_MODEL_ID = "harnessmix/opencode-native";
|
|
23413
23484
|
var OPENCODE_TRANSPORT_MODEL_PREFIX = `${OPENCODE_TRANSPORT_MODEL_ID}@`;
|
|
23414
|
-
var GROK_TRANSPORT_MODEL_ID = "
|
|
23485
|
+
var GROK_TRANSPORT_MODEL_ID = "harnessmix/grok-native";
|
|
23415
23486
|
var GROK_TRANSPORT_MODEL_PREFIX = `${GROK_TRANSPORT_MODEL_ID}@`;
|
|
23416
|
-
var OMP_TRANSPORT_MODEL_ID = "
|
|
23487
|
+
var OMP_TRANSPORT_MODEL_ID = "harnessmix/omp-native";
|
|
23417
23488
|
var OMP_TRANSPORT_MODEL_PREFIX = `${OMP_TRANSPORT_MODEL_ID}@`;
|
|
23418
|
-
var ANTIGRAVITY_TRANSPORT_MODEL_ID = "
|
|
23489
|
+
var ANTIGRAVITY_TRANSPORT_MODEL_ID = "harnessmix/antigravity-native";
|
|
23419
23490
|
var ANTIGRAVITY_TRANSPORT_MODEL_PREFIX = `${ANTIGRAVITY_TRANSPORT_MODEL_ID}@`;
|
|
23420
23491
|
function transitionRendererAdapterStatus(current, next, publish) {
|
|
23421
23492
|
if (current.state === next.state && current.reason === next.reason && current.hook === next.hook) {
|
|
@@ -23885,7 +23956,7 @@ ${error51.stderrTail}`] : []
|
|
|
23885
23956
|
async function waitForRendererDraftPrewarmPolicy(target) {
|
|
23886
23957
|
const deadline = Date.now() + DRAFT_PREWARM_POLICY_WAIT_TIMEOUT_MS;
|
|
23887
23958
|
while (true) {
|
|
23888
|
-
const policy = target.
|
|
23959
|
+
const policy = target.__harnessmixDraftPrewarmPolicyV1;
|
|
23889
23960
|
if (isDraftPrewarmPolicyReady(policy)) return policy;
|
|
23890
23961
|
const remaining = deadline - Date.now();
|
|
23891
23962
|
if (remaining <= 0) throw new Error("Renderer draft prewarm policy is unavailable");
|
|
@@ -23920,12 +23991,12 @@ ${error51.stderrTail}`] : []
|
|
|
23920
23991
|
const updateStatus = (state, reason, hook) => {
|
|
23921
23992
|
liveStatus.modelUpdates = modelUpdates;
|
|
23922
23993
|
transitionRendererAdapterStatus(liveStatus, { state, reason, hook }, () => {
|
|
23923
|
-
window.dispatchEvent(new CustomEvent("
|
|
23994
|
+
window.dispatchEvent(new CustomEvent("harnessmix:renderer-adapter-status"));
|
|
23924
23995
|
});
|
|
23925
23996
|
};
|
|
23926
23997
|
const usageSubscription = createThreadUsageSubscriptionRelay();
|
|
23927
23998
|
const requestRouteResolver = createRendererRequestRouteResolver(
|
|
23928
|
-
() => window.
|
|
23999
|
+
() => window.__harnessmixDraftPrewarmPolicyV1,
|
|
23929
24000
|
() => findActivePrewarmTargets(document)
|
|
23930
24001
|
);
|
|
23931
24002
|
const clientsByTarget = /* @__PURE__ */ new WeakMap();
|
|
@@ -23973,7 +24044,7 @@ ${error51.stderrTail}`] : []
|
|
|
23973
24044
|
const route = currentRequestRoute();
|
|
23974
24045
|
if (route?.policy.hostId === hostId)
|
|
23975
24046
|
return modelClientForTargets(route.targets, route.policy);
|
|
23976
|
-
const policy = window.
|
|
24047
|
+
const policy = window.__harnessmixDraftPrewarmPolicyV1;
|
|
23977
24048
|
if (isDraftPrewarmPolicyReady(policy) && hasPolicyRequestTarget(policy)) return null;
|
|
23978
24049
|
const targets = rendererRequestTargetsForHost(findActivePrewarmTargets(document), hostId);
|
|
23979
24050
|
return modelClientForTargets(targets ?? []);
|
|
@@ -24032,7 +24103,7 @@ ${error51.stderrTail}`] : []
|
|
|
24032
24103
|
getClient: () => modelControl,
|
|
24033
24104
|
reportError: (error51) => {
|
|
24034
24105
|
console.error(
|
|
24035
|
-
"
|
|
24106
|
+
"harnessmix external Thread Fork failed",
|
|
24036
24107
|
error51 instanceof Error ? error51.name : "UnknownError"
|
|
24037
24108
|
);
|
|
24038
24109
|
}
|
|
@@ -24092,7 +24163,7 @@ ${error51.stderrTail}`] : []
|
|
|
24092
24163
|
};
|
|
24093
24164
|
if (!captureRoutingPolicy()) {
|
|
24094
24165
|
updateStatus("installing", "draft-routing-policy-unavailable", null);
|
|
24095
|
-
const policy = window.
|
|
24166
|
+
const policy = window.__harnessmixDraftPrewarmPolicyV1;
|
|
24096
24167
|
if (!isDraftPrewarmPolicyReady(policy) || !hasPolicyRequestTarget(policy)) {
|
|
24097
24168
|
startPolicyCapture();
|
|
24098
24169
|
}
|
|
@@ -24100,7 +24171,7 @@ ${error51.stderrTail}`] : []
|
|
|
24100
24171
|
const handleRoutingPolicyChange = () => {
|
|
24101
24172
|
stopPolicyRecapture();
|
|
24102
24173
|
if (captureRoutingPolicy()) return;
|
|
24103
|
-
const policy = window.
|
|
24174
|
+
const policy = window.__harnessmixDraftPrewarmPolicyV1;
|
|
24104
24175
|
if (isDraftPrewarmPolicyReady(policy) && hasPolicyRequestTarget(policy)) {
|
|
24105
24176
|
stopPolicyCapture();
|
|
24106
24177
|
}
|
|
@@ -24110,7 +24181,7 @@ ${error51.stderrTail}`] : []
|
|
|
24110
24181
|
startPolicyRecapture();
|
|
24111
24182
|
}
|
|
24112
24183
|
};
|
|
24113
|
-
window.addEventListener("
|
|
24184
|
+
window.addEventListener("harnessmix:draft-prewarm-policy-changed", handleRoutingPolicyChange);
|
|
24114
24185
|
const applyAgent = (agent, model, thinkingOptionId, permissionModeId) => {
|
|
24115
24186
|
if (disposed) return false;
|
|
24116
24187
|
const selection = modelSelectionForAgent(
|
|
@@ -24150,7 +24221,7 @@ ${error51.stderrTail}`] : []
|
|
|
24150
24221
|
stopPolicyCapture();
|
|
24151
24222
|
stopPolicyRecapture();
|
|
24152
24223
|
window.removeEventListener(
|
|
24153
|
-
"
|
|
24224
|
+
"harnessmix:draft-prewarm-policy-changed",
|
|
24154
24225
|
handleRoutingPolicyChange
|
|
24155
24226
|
);
|
|
24156
24227
|
const activeRoutingPolicy = routingPolicy;
|
|
@@ -24174,7 +24245,7 @@ ${error51.stderrTail}`] : []
|
|
|
24174
24245
|
}
|
|
24175
24246
|
|
|
24176
24247
|
// src/native-ui/renderer-extension/src/renderer-permission-mode-preference.ts
|
|
24177
|
-
var CLAUDE_PERMISSION_MODE_PREFERENCE_KEY = "
|
|
24248
|
+
var CLAUDE_PERMISSION_MODE_PREFERENCE_KEY = "harnessmix.claude-code.permission-mode.v1";
|
|
24178
24249
|
function rendererStorage2() {
|
|
24179
24250
|
try {
|
|
24180
24251
|
return window.localStorage;
|
|
@@ -24713,11 +24784,11 @@ ${error51.stderrTail}`] : []
|
|
|
24713
24784
|
const injectMentionsInto = (target) => {
|
|
24714
24785
|
const perEditor = selectionsFor(target);
|
|
24715
24786
|
if (!perEditor || perEditor.size === 0) return false;
|
|
24716
|
-
const
|
|
24717
|
-
if (!
|
|
24787
|
+
const text2 = [...perEditor.values()].map(entryLiteral).join("");
|
|
24788
|
+
if (!text2) return false;
|
|
24718
24789
|
target.focus();
|
|
24719
24790
|
if (target instanceof HTMLTextAreaElement) {
|
|
24720
|
-
target.value = `${
|
|
24791
|
+
target.value = `${text2}${target.value}`;
|
|
24721
24792
|
target.dispatchEvent(new Event("input", { bubbles: true }));
|
|
24722
24793
|
target.dispatchEvent(new Event("change", { bubbles: true }));
|
|
24723
24794
|
} else {
|
|
@@ -24728,7 +24799,7 @@ ${error51.stderrTail}`] : []
|
|
|
24728
24799
|
selection?.removeAllRanges();
|
|
24729
24800
|
selection?.addRange(fresh);
|
|
24730
24801
|
document.dispatchEvent(new Event("selectionchange"));
|
|
24731
|
-
document.execCommand("insertText", false,
|
|
24802
|
+
document.execCommand("insertText", false, text2);
|
|
24732
24803
|
}
|
|
24733
24804
|
perEditor.clear();
|
|
24734
24805
|
syncBadges(target);
|
|
@@ -24763,8 +24834,8 @@ ${error51.stderrTail}`] : []
|
|
|
24763
24834
|
if (!shouldSync) return;
|
|
24764
24835
|
const composers = document.querySelectorAll("[data-codex-composer-root]");
|
|
24765
24836
|
for (const composer of composers) {
|
|
24766
|
-
const
|
|
24767
|
-
if (
|
|
24837
|
+
const el2 = findEditorIn(composer);
|
|
24838
|
+
if (el2) syncBadges(el2);
|
|
24768
24839
|
}
|
|
24769
24840
|
});
|
|
24770
24841
|
try {
|
|
@@ -24786,14 +24857,18 @@ ${error51.stderrTail}`] : []
|
|
|
24786
24857
|
sync(target) {
|
|
24787
24858
|
syncBadges(target);
|
|
24788
24859
|
},
|
|
24860
|
+
prepareSubmission(composer) {
|
|
24861
|
+
const editorEl = findEditorIn(composer);
|
|
24862
|
+
return !!editorEl && injectMentionsInto(editorEl);
|
|
24863
|
+
},
|
|
24789
24864
|
dispose() {
|
|
24790
24865
|
disposed = true;
|
|
24791
24866
|
close();
|
|
24792
24867
|
menu.remove();
|
|
24793
24868
|
style.remove();
|
|
24794
24869
|
observer.disconnect();
|
|
24795
|
-
for (const
|
|
24796
|
-
|
|
24870
|
+
for (const el2 of document.querySelectorAll("[data-harness-mix-has-mentions]")) {
|
|
24871
|
+
el2.removeAttribute("data-harness-mix-has-mentions");
|
|
24797
24872
|
}
|
|
24798
24873
|
for (const strip of badges.values()) strip.remove();
|
|
24799
24874
|
badges.clear();
|
|
@@ -24809,11 +24884,11 @@ ${error51.stderrTail}`] : []
|
|
|
24809
24884
|
}
|
|
24810
24885
|
|
|
24811
24886
|
// src/native-ui/renderer-extension/src/renderer-collab-cards.ts
|
|
24812
|
-
function parseCollabPayload(
|
|
24813
|
-
if (!
|
|
24887
|
+
function parseCollabPayload(text2) {
|
|
24888
|
+
if (!text2 || !text2.includes("child_thread_id") && !text2.includes("task_id") && !text2.includes("Agent \u534F\u4F5C")) {
|
|
24814
24889
|
return null;
|
|
24815
24890
|
}
|
|
24816
|
-
const match = /\{[\s\S]*?"task_id"[\s\S]*?\}/.exec(
|
|
24891
|
+
const match = /\{[\s\S]*?"task_id"[\s\S]*?\}/.exec(text2);
|
|
24817
24892
|
if (!match) return null;
|
|
24818
24893
|
try {
|
|
24819
24894
|
const parsed = JSON.parse(match[0]);
|
|
@@ -24947,12 +25022,12 @@ ${error51.stderrTail}`] : []
|
|
|
24947
25022
|
const candidates = document.querySelectorAll(
|
|
24948
25023
|
'[data-local-conversation-item-target-ids], [data-turn-key], [data-testid*="tool"], .prose, pre'
|
|
24949
25024
|
);
|
|
24950
|
-
for (const
|
|
24951
|
-
if (enhancedElements.has(
|
|
24952
|
-
const
|
|
24953
|
-
const payload = parseCollabPayload(
|
|
25025
|
+
for (const el2 of candidates) {
|
|
25026
|
+
if (enhancedElements.has(el2)) continue;
|
|
25027
|
+
const text2 = el2.textContent || "";
|
|
25028
|
+
const payload = parseCollabPayload(text2);
|
|
24954
25029
|
if (payload) {
|
|
24955
|
-
enhanceElement(
|
|
25030
|
+
enhanceElement(el2, payload);
|
|
24956
25031
|
}
|
|
24957
25032
|
}
|
|
24958
25033
|
};
|
|
@@ -24967,9 +25042,523 @@ ${error51.stderrTail}`] : []
|
|
|
24967
25042
|
dispose() {
|
|
24968
25043
|
disposed = true;
|
|
24969
25044
|
observer.disconnect();
|
|
24970
|
-
document.querySelectorAll(".harness-mix-collab-actions").forEach((
|
|
25045
|
+
document.querySelectorAll(".harness-mix-collab-actions").forEach((el2) => el2.remove());
|
|
25046
|
+
}
|
|
25047
|
+
};
|
|
25048
|
+
}
|
|
25049
|
+
|
|
25050
|
+
// src/native-ui/renderer-extension/src/renderer-team-cards.ts
|
|
25051
|
+
function jsonObjectAt(value, start) {
|
|
25052
|
+
let depth = 0, quoted = false, escaped = false;
|
|
25053
|
+
for (let index = start; index < value.length; index++) {
|
|
25054
|
+
const char = value[index];
|
|
25055
|
+
if (quoted) {
|
|
25056
|
+
if (escaped) escaped = false;
|
|
25057
|
+
else if (char === "\\") escaped = true;
|
|
25058
|
+
else if (char === '"') quoted = false;
|
|
25059
|
+
continue;
|
|
25060
|
+
}
|
|
25061
|
+
if (char === '"') quoted = true;
|
|
25062
|
+
else if (char === "{") depth++;
|
|
25063
|
+
else if (char === "}" && --depth === 0) return value.slice(start, index + 1);
|
|
25064
|
+
}
|
|
25065
|
+
return null;
|
|
25066
|
+
}
|
|
25067
|
+
function isTeam(value) {
|
|
25068
|
+
if (!value || typeof value !== "object") return false;
|
|
25069
|
+
const team = value;
|
|
25070
|
+
return typeof team.team_id === "string" && typeof team.name === "string" && Array.isArray(team.members) && Array.isArray(team.tasks) && Array.isArray(team.messages);
|
|
25071
|
+
}
|
|
25072
|
+
function parseTeamPayload(value) {
|
|
25073
|
+
if (!value.includes('"team_id"') || !value.includes('"members"') || !value.includes('"tasks"')) return null;
|
|
25074
|
+
for (let start = value.indexOf("{"); start >= 0; start = value.indexOf("{", start + 1)) {
|
|
25075
|
+
const candidate = jsonObjectAt(value, start);
|
|
25076
|
+
if (!candidate?.includes('"team_id"')) continue;
|
|
25077
|
+
try {
|
|
25078
|
+
const parsed = JSON.parse(candidate);
|
|
25079
|
+
if (isTeam(parsed)) return parsed;
|
|
25080
|
+
} catch {
|
|
25081
|
+
}
|
|
25082
|
+
}
|
|
25083
|
+
return null;
|
|
25084
|
+
}
|
|
25085
|
+
function parseInspection(value) {
|
|
25086
|
+
if (!value || typeof value !== "object") return null;
|
|
25087
|
+
const result = value;
|
|
25088
|
+
if (!isTeam(result.team) || !Array.isArray(result.snapshots)) return null;
|
|
25089
|
+
return { team: result.team, snapshots: result.snapshots.filter((entry) => entry && typeof entry === "object" && isTeam(entry.team)) };
|
|
25090
|
+
}
|
|
25091
|
+
var stateColor = (status) => ({ ready: "#8b8b8b", pending: "#8b8b8b", working: "#2878e3", in_progress: "#2878e3", active: "#2878e3", completed: "#1f9d68", blocked: "#c17022", failed: "#d14343", interrupted: "#c17022" })[status ?? ""] ?? "#8b8b8b";
|
|
25092
|
+
var stateLabel = (status) => ({ ready: "\u5C31\u7EEA", pending: "\u5F85\u5F00\u59CB", working: "\u5DE5\u4F5C\u4E2D", in_progress: "\u8FDB\u884C\u4E2D", completed: "\u5DF2\u5B8C\u6210", blocked: "\u7B49\u5F85\u4F9D\u8D56", failed: "\u5931\u8D25", interrupted: "\u5DF2\u4E2D\u65AD", active: "\u534F\u4F5C\u4E2D" })[status ?? ""] ?? status ?? "\u672A\u77E5";
|
|
25093
|
+
var actionLabel = (action) => ({ team_created: "\u56E2\u961F\u5EFA\u7ACB", task_assigned: "\u4EFB\u52A1\u5206\u914D", task_updated: "\u4EFB\u52A1\u66F4\u65B0", message_sent: "\u56E2\u961F\u901A\u4FE1", task_started: "\u5F00\u59CB\u6267\u884C", member_session_ready: "\u4F1A\u8BDD\u5C31\u7EEA", task_settled: "\u4EFB\u52A1\u7ED3\u7B97", task_failed: "\u4EFB\u52A1\u5931\u8D25", task_cancelled: "\u4EFB\u52A1\u53D6\u6D88", task_interrupted: "\u4EFB\u52A1\u4E2D\u65AD", task_resumed: "\u6062\u590D\u6267\u884C", task_followup: "\u7EE7\u7EED\u6267\u884C" })[action ?? ""] ?? action ?? "\u5B9E\u65F6\u72B6\u6001";
|
|
25094
|
+
var memberPalette = ["#3b82f6", "#f59e0b", "#10b981", "#8b5cf6", "#f97316", "#ec4899", "#14b8a6", "#6366f1"];
|
|
25095
|
+
var memberColor = (index) => memberPalette[index % memberPalette.length];
|
|
25096
|
+
function el(tag, className, css) {
|
|
25097
|
+
const node = document.createElement(tag);
|
|
25098
|
+
if (className) node.className = className;
|
|
25099
|
+
if (css) node.style.cssText = css;
|
|
25100
|
+
return node;
|
|
25101
|
+
}
|
|
25102
|
+
function text(tag, value, css) {
|
|
25103
|
+
const node = el(tag, void 0, css);
|
|
25104
|
+
node.textContent = value;
|
|
25105
|
+
return node;
|
|
25106
|
+
}
|
|
25107
|
+
var TEAM_STYLE = `
|
|
25108
|
+
.harness-mix-team-scroll{scrollbar-width:none}
|
|
25109
|
+
.harness-mix-team-scroll::-webkit-scrollbar{display:none}
|
|
25110
|
+
.harness-mix-team-workbench{container-type:inline-size}
|
|
25111
|
+
.harness-mix-team-body{display:grid;grid-template-columns:minmax(0,1fr) clamp(228px,24vw,300px);min-height:0;overflow:hidden}
|
|
25112
|
+
.harness-mix-team-lanes{display:flex;gap:16px;min-height:0;box-sizing:border-box;overflow-x:auto;overflow-y:hidden;padding:18px 16px 10px;justify-content:safe center;scroll-snap-type:x proximity}
|
|
25113
|
+
.harness-mix-team-lane{position:relative;flex:1 1 0;min-width:216px;max-width:300px;display:flex;flex-direction:column;min-height:0;padding-top:16px;scroll-snap-align:start}
|
|
25114
|
+
.harness-mix-team-lane::before{content:'';position:absolute;top:0;left:50%;height:16px;border-left:2px dashed color-mix(in srgb,currentColor 20%,transparent)}
|
|
25115
|
+
.harness-mix-team-lane::after{content:'';position:absolute;top:0;left:-9px;right:-9px;border-top:2px dashed color-mix(in srgb,currentColor 20%,transparent)}
|
|
25116
|
+
.harness-mix-team-lane:first-child::after{left:calc(50% - 1px)}
|
|
25117
|
+
.harness-mix-team-lane:last-child::after{right:calc(50% - 1px)}
|
|
25118
|
+
.harness-mix-team-lane:only-child::after{display:none}
|
|
25119
|
+
.harness-mix-team-task-list{display:flex;flex-direction:column;gap:6px;flex:1;min-height:0;overflow-y:auto;padding:2px 8px 8px;scrollbar-width:none}
|
|
25120
|
+
.harness-mix-team-task-list::-webkit-scrollbar{display:none}
|
|
25121
|
+
.harness-mix-team-feed{display:flex;flex-direction:column;min-height:0;min-width:0;border-left:1px solid color-mix(in srgb,currentColor 9%,transparent)}
|
|
25122
|
+
.harness-mix-team-feed-list{flex:1;min-height:0;overflow-y:auto;padding:0 12px 10px;scrollbar-width:thin}
|
|
25123
|
+
.harness-mix-team-clamp2{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
|
|
25124
|
+
.harness-mix-team-clickable{transition:border-color .15s ease,box-shadow .15s ease}
|
|
25125
|
+
.harness-mix-team-clickable:hover{border-color:color-mix(in srgb,currentColor 28%,transparent)!important;box-shadow:0 4px 14px color-mix(in srgb,#000 10%,transparent)!important}
|
|
25126
|
+
@container (max-width:720px){
|
|
25127
|
+
.harness-mix-team-body{grid-template-columns:minmax(0,1fr);grid-template-rows:minmax(0,1fr) auto}
|
|
25128
|
+
.harness-mix-team-feed{border-left:0;border-top:1px solid color-mix(in srgb,currentColor 9%,transparent);max-height:136px}
|
|
25129
|
+
}`;
|
|
25130
|
+
function metrics(payload) {
|
|
25131
|
+
const node = el("div", "harness-mix-team-metrics", "display:flex;gap:18px;align-items:center");
|
|
25132
|
+
const values = [[`${payload.tasks.filter((task) => task.status === "completed").length}/${payload.tasks.length}`, "\u5B8C\u6210", "#1f9d68"], [`${payload.tasks.filter((task) => task.status === "in_progress").length}`, "\u8FDB\u884C\u4E2D", "#2878e3"], [`${payload.tasks.filter((task) => task.status === "blocked").length}`, "\u7B49\u5F85", "#c17022"]];
|
|
25133
|
+
for (const [value, label, color] of values) {
|
|
25134
|
+
const item = el("span", void 0, "display:grid;justify-items:center;line-height:1.1");
|
|
25135
|
+
item.append(text("strong", value, `font-size:14px;color:${color}`), text("small", label, "font-size:10px;margin-top:3px;opacity:.55"));
|
|
25136
|
+
node.append(item);
|
|
25137
|
+
}
|
|
25138
|
+
return node;
|
|
25139
|
+
}
|
|
25140
|
+
var completionOf = (payload) => {
|
|
25141
|
+
const total = payload.tasks.length;
|
|
25142
|
+
const done = payload.tasks.filter((task) => task.status === "completed").length;
|
|
25143
|
+
return { done, total, pct: total ? Math.round(done / total * 100) : 0 };
|
|
25144
|
+
};
|
|
25145
|
+
function statItem(value, label, color) {
|
|
25146
|
+
const item = el("span", void 0, "display:grid;justify-items:center;line-height:1.1;min-width:30px");
|
|
25147
|
+
item.append(text("strong", value, `font-size:15px;font-weight:750;color:${color}`), text("small", label, "font-size:8.5px;margin-top:2px;opacity:.55;white-space:nowrap"));
|
|
25148
|
+
return item;
|
|
25149
|
+
}
|
|
25150
|
+
function headerStats(payload) {
|
|
25151
|
+
const items = [
|
|
25152
|
+
statItem(String(payload.tasks.length), "\u4EFB\u52A1\u603B\u6570", "inherit"),
|
|
25153
|
+
statItem(String(payload.tasks.filter((task) => task.status === "in_progress").length), "\u8FDB\u884C\u4E2D", "#2878e3"),
|
|
25154
|
+
statItem(String(completionOf(payload).done), "\u5DF2\u5B8C\u6210", "#1f9d68"),
|
|
25155
|
+
statItem(String(payload.tasks.filter((task) => task.status === "blocked" || task.status === "pending").length), "\u7B49\u5F85", "#c17022")
|
|
25156
|
+
];
|
|
25157
|
+
const failed = payload.tasks.filter((task) => task.status === "failed").length;
|
|
25158
|
+
if (failed) items.push(statItem(String(failed), "\u5931\u8D25", "#d14343"));
|
|
25159
|
+
return items;
|
|
25160
|
+
}
|
|
25161
|
+
var pillCss = (status) => {
|
|
25162
|
+
const color = stateColor(status);
|
|
25163
|
+
return `font-size:8px;font-weight:750;padding:2px 7px;border-radius:99px;white-space:nowrap;color:${color};background:color-mix(in srgb,${color} 15%,transparent)`;
|
|
25164
|
+
};
|
|
25165
|
+
function statusPill(status) {
|
|
25166
|
+
return text("span", stateLabel(status), pillCss(status));
|
|
25167
|
+
}
|
|
25168
|
+
function statusDot(status, size = 7) {
|
|
25169
|
+
return el("span", void 0, `width:${size}px;height:${size}px;border-radius:50%;flex:none;background:${stateColor(status)}`);
|
|
25170
|
+
}
|
|
25171
|
+
function renderBoard(payload, openThread) {
|
|
25172
|
+
const board = el("main", "harness-mix-team-board harness-mix-team-body", "height:100%;min-height:0;color:inherit");
|
|
25173
|
+
const lead = payload.lead ?? { id: "lead", name: "Team Lead", role: "\u534F\u8C03\u4E0E\u9A8C\u6536", agent: "codex", display_status: "working" };
|
|
25174
|
+
const tasksOf = (memberId) => payload.tasks.filter((task) => task.assignee === memberId);
|
|
25175
|
+
const leadCard = () => {
|
|
25176
|
+
const button = el("button", "harness-mix-team-lead", "appearance:none;border:1px solid color-mix(in srgb,#c35b24 34%,transparent);background:color-mix(in srgb,#c35b24 7%,transparent);box-shadow:0 2px 10px color-mix(in srgb,#c35b24 10%,transparent);color:inherit;font:inherit;display:flex;align-items:center;gap:10px;padding:8px 16px;border-radius:13px;cursor:default");
|
|
25177
|
+
button.type = "button";
|
|
25178
|
+
button.dataset.agent = lead.agent;
|
|
25179
|
+
const childId = lead.childId ?? lead.child_thread_id;
|
|
25180
|
+
if (childId && openThread) {
|
|
25181
|
+
button.style.cursor = "pointer";
|
|
25182
|
+
button.classList.add("harness-mix-team-clickable");
|
|
25183
|
+
button.title = `\u6253\u5F00 ${lead.name} \u7684\u539F\u751F Harness \u4F1A\u8BDD`;
|
|
25184
|
+
button.addEventListener("click", () => void openThread(childId));
|
|
25185
|
+
}
|
|
25186
|
+
const avatar = el("span", void 0, "position:relative;display:grid;place-items:center;width:42px;height:42px;flex:none;border-radius:12px;border:2px solid color-mix(in srgb,#c35b24 45%,transparent);background:Canvas");
|
|
25187
|
+
avatar.append(collaborationIcon(lead.agent, lead.name, 32), text("span", "\u{1F451}", "position:absolute;top:-12px;right:-10px;font-size:13px;filter:drop-shadow(0 1px 1px rgb(0 0 0/.25))"));
|
|
25188
|
+
const copy = el("span", void 0, "display:grid;min-width:0;text-align:left;line-height:1.3");
|
|
25189
|
+
copy.append(text("span", "\u4E3B\u5BFC\u8005", "font-size:8.5px;font-weight:800;letter-spacing:.14em;color:#c35b24"), text("strong", lead.name, "font-size:13px;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap"));
|
|
25190
|
+
const status = el("span", void 0, "display:flex;align-items:center;gap:5px;margin-top:1px");
|
|
25191
|
+
status.append(statusDot(lead.display_status), text("span", stateLabel(lead.display_status), `font-size:9px;color:${stateColor(lead.display_status)}`));
|
|
25192
|
+
copy.append(status);
|
|
25193
|
+
button.append(avatar, copy);
|
|
25194
|
+
return button;
|
|
25195
|
+
};
|
|
25196
|
+
const memberCard = (member, index) => {
|
|
25197
|
+
const color = memberColor(index), assigned = tasksOf(member.id), done = assigned.filter((task) => task.status === "completed").length;
|
|
25198
|
+
const button = el("button", "harness-mix-team-member", "appearance:none;width:100%;box-sizing:border-box;border:1px solid color-mix(in srgb,currentColor 10%,transparent);background:color-mix(in srgb,Canvas 92%,transparent);box-shadow:0 2px 8px color-mix(in srgb,#000 6%,transparent);color:inherit;font:inherit;display:grid;grid-template-columns:40px minmax(0,1fr);align-items:center;gap:9px;padding:9px 10px;border-radius:12px;text-align:left;cursor:default");
|
|
25199
|
+
button.type = "button";
|
|
25200
|
+
button.dataset.agent = member.agent;
|
|
25201
|
+
const childId = member.childId ?? member.child_thread_id;
|
|
25202
|
+
if (childId && openThread) {
|
|
25203
|
+
button.style.cursor = "pointer";
|
|
25204
|
+
button.classList.add("harness-mix-team-clickable");
|
|
25205
|
+
button.title = `\u6253\u5F00 ${member.name} \u7684\u539F\u751F Harness \u4F1A\u8BDD`;
|
|
25206
|
+
button.addEventListener("click", () => void openThread(childId));
|
|
25207
|
+
}
|
|
25208
|
+
const avatar = el("span", void 0, `position:relative;display:grid;place-items:center;width:40px;height:40px;flex:none;border-radius:11px;border:2px solid ${color};background:Canvas`);
|
|
25209
|
+
avatar.append(collaborationIcon(member.agent, member.name, 30), el("span", void 0, `position:absolute;right:-4px;bottom:-4px;width:11px;height:11px;box-sizing:border-box;border-radius:50%;background:${stateColor(member.display_status)};border:2.5px solid Canvas`));
|
|
25210
|
+
const copy = el("span", void 0, "display:grid;min-width:0;line-height:1.25;gap:2px");
|
|
25211
|
+
copy.append(text("strong", member.name, "font-size:12px;font-weight:680;overflow:hidden;text-overflow:ellipsis;white-space:nowrap"));
|
|
25212
|
+
const status = el("span", void 0, "display:flex;align-items:center;gap:5px;min-width:0");
|
|
25213
|
+
status.append(text("span", stateLabel(member.display_status), `font-size:9px;color:${stateColor(member.display_status)};white-space:nowrap`), text("span", `${done}/${assigned.length}`, "font-size:9px;font-weight:650;opacity:.5;margin-left:auto"));
|
|
25214
|
+
copy.append(status);
|
|
25215
|
+
const progress = el("progress");
|
|
25216
|
+
progress.max = Math.max(1, assigned.length);
|
|
25217
|
+
progress.value = done;
|
|
25218
|
+
progress.style.cssText = `width:100%;height:4px;margin:0;accent-color:${color}`;
|
|
25219
|
+
progress.title = `${done}/${assigned.length} \u4E2A\u4EFB\u52A1\u5B8C\u6210`;
|
|
25220
|
+
copy.append(progress);
|
|
25221
|
+
button.append(avatar, copy);
|
|
25222
|
+
return button;
|
|
25223
|
+
};
|
|
25224
|
+
const laneOf = (member, index) => {
|
|
25225
|
+
const color = memberColor(index), assigned = tasksOf(member.id), done = assigned.filter((task) => task.status === "completed").length;
|
|
25226
|
+
const lane = el("div", "harness-mix-team-lane");
|
|
25227
|
+
lane.dataset.memberId = member.id;
|
|
25228
|
+
lane.append(memberCard(member, index));
|
|
25229
|
+
const column = el("div", void 0, `margin-top:9px;flex:1;min-height:0;display:flex;flex-direction:column;border-radius:12px;border:1px solid color-mix(in srgb,${color} 30%,transparent);background:color-mix(in srgb,${color} 7%,transparent)`);
|
|
25230
|
+
const columnHead = el("div", void 0, "display:flex;align-items:flex-start;gap:6px;padding:8px 10px 5px");
|
|
25231
|
+
const role = text("span", member.role, "font-size:9.5px;font-weight:650;line-height:1.35;min-width:0;opacity:.78");
|
|
25232
|
+
role.className = "harness-mix-team-clamp2";
|
|
25233
|
+
role.title = member.role;
|
|
25234
|
+
columnHead.append(el("span", void 0, `width:7px;height:7px;border-radius:2.5px;background:${color};flex:none;margin-top:3px`), role, text("span", `${done}/${assigned.length}`, `margin-left:auto;font-size:8.5px;font-weight:750;color:${color};background:color-mix(in srgb,${color} 15%,transparent);padding:1px 6px;border-radius:99px;white-space:nowrap`));
|
|
25235
|
+
column.append(columnHead);
|
|
25236
|
+
const list = el("div", "harness-mix-team-task-list");
|
|
25237
|
+
for (const task of assigned) {
|
|
25238
|
+
const card = el("article", "harness-mix-team-task", "display:grid;gap:5px;padding:7px 8px;border-radius:9px;border:1px solid color-mix(in srgb,currentColor 8%,transparent);background:color-mix(in srgb,Canvas 94%,transparent)");
|
|
25239
|
+
card.dataset.taskId = task.id;
|
|
25240
|
+
card.dataset.taskStatus = task.status;
|
|
25241
|
+
const topRow = el("div", void 0, "display:flex;align-items:center;gap:6px;min-width:0");
|
|
25242
|
+
const pill = statusPill(task.status);
|
|
25243
|
+
pill.style.marginLeft = "auto";
|
|
25244
|
+
topRow.append(text("span", `#${task.id}`, "font-family:ui-monospace,monospace;font-size:8px;opacity:.45;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:92px"), pill);
|
|
25245
|
+
const title = text("div", task.title, "font-size:10.5px;font-weight:620;line-height:1.35");
|
|
25246
|
+
title.className = "harness-mix-team-clamp2";
|
|
25247
|
+
title.title = task.title;
|
|
25248
|
+
card.append(topRow, title);
|
|
25249
|
+
if ((task.dependsOn?.length ?? 0) > 0) card.append(text("div", `\u4F9D\u8D56 ${task.dependsOn.length} \u9879\u4EFB\u52A1`, "font-size:8px;opacity:.45"));
|
|
25250
|
+
list.append(card);
|
|
25251
|
+
}
|
|
25252
|
+
if (!assigned.length) list.append(text("div", "\u7B49\u5F85\u4E3B\u5BFC\u8005\u5206\u914D\u4EFB\u52A1", "font-size:9px;opacity:.42;padding:10px 2px;text-align:center"));
|
|
25253
|
+
column.append(list);
|
|
25254
|
+
lane.append(column);
|
|
25255
|
+
return lane;
|
|
25256
|
+
};
|
|
25257
|
+
const left = el("section", void 0, "display:grid;grid-template-rows:auto minmax(0,1fr);min-width:0;min-height:0");
|
|
25258
|
+
const org = el("div", "harness-mix-team-org", "display:flex;flex-direction:column;align-items:center;gap:5px;padding:10px 14px 0");
|
|
25259
|
+
org.append(leadCard(), text("div", "\u4EFB\u52A1\u62C6\u89E3 \xB7 \u8FDB\u5EA6\u534F\u8C03 \xB7 \u8D28\u91CF\u9A8C\u6536 \xB7 \u6700\u7EC8\u4EA4\u4ED8", "font-size:8.5px;opacity:.45;letter-spacing:.04em"));
|
|
25260
|
+
const lanes = el("div", "harness-mix-team-lanes harness-mix-team-scroll");
|
|
25261
|
+
if (payload.members.length) payload.members.forEach((member, index) => lanes.append(laneOf(member, index)));
|
|
25262
|
+
else lanes.append(text("div", "\u5C1A\u672A\u6DFB\u52A0\u56E2\u961F\u6210\u5458\u3002", "font-size:11px;opacity:.5"));
|
|
25263
|
+
left.append(org, lanes);
|
|
25264
|
+
const feed = el("aside", "harness-mix-team-feed");
|
|
25265
|
+
const feedHead = el("div", void 0, "display:flex;align-items:center;gap:6px;padding:11px 12px 8px;flex:none");
|
|
25266
|
+
feedHead.append(text("span", "\u56E2\u961F\u52A8\u6001", "font-size:10px;font-weight:720;letter-spacing:.06em;opacity:.55"), text("span", String(payload.messages.length), "font-size:8.5px;font-weight:700;opacity:.6;background:color-mix(in srgb,currentColor 8%,transparent);border-radius:99px;padding:1px 7px"));
|
|
25267
|
+
const feedList = el("div", "harness-mix-team-feed-list");
|
|
25268
|
+
for (const message of payload.messages.slice().reverse()) {
|
|
25269
|
+
const item = el("article", void 0, "padding:9px 0;border-top:1px solid color-mix(in srgb,currentColor 7%,transparent)");
|
|
25270
|
+
const sender = message.from === "lead" ? lead : payload.members.find((member) => member.id === message.from), receiver = message.to === "lead" ? lead : payload.members.find((member) => member.id === message.to);
|
|
25271
|
+
const route = el("div", void 0, "display:flex;align-items:center;gap:5px;min-width:0;font-size:10.5px;font-weight:700");
|
|
25272
|
+
if (sender) route.append(collaborationIcon(sender.agent, sender.name, 16));
|
|
25273
|
+
route.append(text("span", message.fromName ?? sender?.name ?? message.from, "opacity:.75;overflow:hidden;text-overflow:ellipsis;white-space:nowrap"), text("span", "\u2192", "opacity:.4;font-weight:400"));
|
|
25274
|
+
if (receiver) route.append(collaborationIcon(receiver.agent, receiver.name, 16));
|
|
25275
|
+
route.append(text("span", message.to === "*" ? "\u5168\u4F53" : receiver?.name ?? message.to, "opacity:.75;overflow:hidden;text-overflow:ellipsis;white-space:nowrap"));
|
|
25276
|
+
if (message.at > 0) route.append(text("span", new Date(message.at).toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" }), "margin-left:auto;font-size:8.5px;font-weight:400;opacity:.4;flex:none"));
|
|
25277
|
+
item.append(route, text("div", message.body, "font-size:11px;line-height:1.5;margin-top:4px;white-space:pre-wrap;overflow-wrap:anywhere;opacity:.88"));
|
|
25278
|
+
feedList.append(item);
|
|
25279
|
+
}
|
|
25280
|
+
if (!payload.messages.length) feedList.append(text("div", "\u6210\u5458\u4EA4\u63A5\u3001\u5BA1\u67E5\u8BF7\u6C42\u548C\u7ED3\u679C\u4F1A\u5B9E\u65F6\u663E\u793A\u5728\u8FD9\u91CC\u3002", "font-size:10px;line-height:1.5;opacity:.45;padding:10px 0"));
|
|
25281
|
+
feed.append(feedHead, feedList);
|
|
25282
|
+
board.append(left, feed);
|
|
25283
|
+
return board;
|
|
25284
|
+
}
|
|
25285
|
+
function renderSummary(payload, open) {
|
|
25286
|
+
const panel = el("section", "harness-mix-team-panel", 'box-sizing:border-box;border:1px solid color-mix(in srgb,currentColor 12%,transparent);border-radius:14px;background:color-mix(in srgb,Canvas 90%,transparent);box-shadow:0 8px 28px color-mix(in srgb,#000 7%,transparent);backdrop-filter:blur(18px);color:inherit;font:13px/1.4 system-ui,-apple-system,"Segoe UI",sans-serif;padding:12px 14px;display:grid;gap:10px;min-width:0');
|
|
25287
|
+
panel.dataset.teamId = payload.team_id;
|
|
25288
|
+
panel.dataset.teamStatus = payload.status;
|
|
25289
|
+
const top = el("div", void 0, "display:flex;align-items:center;gap:12px;min-width:0");
|
|
25290
|
+
const identity = el("div", void 0, "display:grid;grid-template-columns:38px minmax(0,1fr);align-items:center;gap:10px;min-width:0;flex:1");
|
|
25291
|
+
const lead = payload.lead ?? { id: "lead", name: "Team Lead", role: "\u534F\u8C03\u4E0E\u9A8C\u6536", agent: "codex", display_status: "working" };
|
|
25292
|
+
const leadIcon = el("span", void 0, "position:relative;display:grid;place-items:center;width:38px;height:38px;flex:none;border:2px solid color-mix(in srgb,#c35b24 40%,transparent);border-radius:11px;background:Canvas");
|
|
25293
|
+
leadIcon.append(collaborationIcon(lead.agent, lead.name, 28), text("span", "\u{1F451}", "position:absolute;top:-11px;right:-9px;font-size:11px"));
|
|
25294
|
+
const copy = el("span", void 0, "display:grid;min-width:0;gap:1px"), eyebrow = text("span", `AGENT TEAM \xB7 ${stateLabel(payload.status)}`, `font-size:9px;font-weight:760;letter-spacing:.11em;color:${stateColor(payload.status)}`), title = text("strong", payload.name, "font-size:13px;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap");
|
|
25295
|
+
title.className = "harness-mix-team-name";
|
|
25296
|
+
const goal = text("span", payload.goal, "font-size:10px;opacity:.5;overflow:hidden;text-overflow:ellipsis;white-space:nowrap");
|
|
25297
|
+
goal.title = payload.goal;
|
|
25298
|
+
copy.append(eyebrow, title, goal);
|
|
25299
|
+
identity.append(leadIcon, copy);
|
|
25300
|
+
const button = el("button", "harness-mix-team-open", "border:1px solid color-mix(in srgb,currentColor 13%,transparent);border-radius:8px;background:color-mix(in srgb,currentColor 5%,transparent);color:inherit;font:650 11px system-ui;padding:7px 10px;cursor:pointer;white-space:nowrap");
|
|
25301
|
+
button.type = "button";
|
|
25302
|
+
button.textContent = "\u5C55\u5F00\u8BE6\u60C5";
|
|
25303
|
+
button.addEventListener("click", open);
|
|
25304
|
+
top.append(identity, metrics(payload), button);
|
|
25305
|
+
const members = el("div", "harness-mix-team-summary-members harness-mix-team-scroll", "display:flex;align-items:center;gap:6px;min-width:0;overflow-x:auto;padding-bottom:1px");
|
|
25306
|
+
payload.members.forEach((member, index) => {
|
|
25307
|
+
const color = memberColor(index);
|
|
25308
|
+
const chip = el("span", void 0, "display:grid;grid-template-columns:26px minmax(0,1fr);align-items:center;gap:7px;min-width:128px;max-width:190px;padding:5px 9px;border-radius:10px;border:1px solid color-mix(in srgb,currentColor 8%,transparent);background:color-mix(in srgb,currentColor 3%,transparent)");
|
|
25309
|
+
chip.title = `${member.name} \xB7 ${member.role}`;
|
|
25310
|
+
const icon2 = el("span", void 0, `position:relative;display:grid;place-items:center;width:26px;height:26px;flex:none;border-radius:8px;border:1.5px solid ${color};background:Canvas`);
|
|
25311
|
+
icon2.append(collaborationIcon(member.agent, member.name, 18), el("span", void 0, `position:absolute;right:-3px;bottom:-3px;width:8px;height:8px;box-sizing:border-box;border-radius:50%;background:${stateColor(member.display_status)};border:2px solid Canvas`));
|
|
25312
|
+
const label = el("span", void 0, "display:grid;min-width:0;line-height:1.2");
|
|
25313
|
+
label.append(text("strong", member.name, "font-size:10px;font-weight:650;overflow:hidden;text-overflow:ellipsis;white-space:nowrap"), text("span", member.role, "font-size:8.5px;opacity:.52;overflow:hidden;text-overflow:ellipsis;white-space:nowrap"), text("span", stateLabel(member.display_status), `font-size:8.5px;color:${stateColor(member.display_status)}`));
|
|
25314
|
+
chip.append(icon2, label);
|
|
25315
|
+
members.append(chip);
|
|
25316
|
+
});
|
|
25317
|
+
const completed = payload.tasks.filter((task) => task.status === "completed").length, progress = el("progress");
|
|
25318
|
+
progress.max = Math.max(1, payload.tasks.length);
|
|
25319
|
+
progress.value = completed;
|
|
25320
|
+
progress.style.cssText = "width:72px;height:5px;accent-color:#1f9d68;margin-left:auto;flex:none";
|
|
25321
|
+
progress.title = `${completed}/${payload.tasks.length} \u4E2A\u4EFB\u52A1\u5B8C\u6210`;
|
|
25322
|
+
members.append(progress, text("span", `${completed}/${payload.tasks.length}`, "font-size:9px;font-weight:700;opacity:.52;white-space:nowrap"));
|
|
25323
|
+
panel.append(top, members);
|
|
25324
|
+
return panel;
|
|
25325
|
+
}
|
|
25326
|
+
function installTeamCards(options = {}) {
|
|
25327
|
+
if (typeof document === "undefined") return { scan: () => {
|
|
25328
|
+
}, dispose: () => {
|
|
25329
|
+
} };
|
|
25330
|
+
const style = el("style");
|
|
25331
|
+
style.dataset.harnessMixTeamStyle = "true";
|
|
25332
|
+
style.textContent = TEAM_STYLE;
|
|
25333
|
+
(document.head || document.documentElement).append(style);
|
|
25334
|
+
let disposed = false, workbench = null, refreshTimer = null, playTimer = null, activeTimer = null;
|
|
25335
|
+
let activePanel = null, activeSignature = "", activeThreadId = "", activeRefreshPending = false;
|
|
25336
|
+
const signatures = /* @__PURE__ */ new WeakMap();
|
|
25337
|
+
const close = () => {
|
|
25338
|
+
workbench?.remove();
|
|
25339
|
+
workbench = null;
|
|
25340
|
+
if (refreshTimer) clearInterval(refreshTimer);
|
|
25341
|
+
refreshTimer = null;
|
|
25342
|
+
if (playTimer) clearInterval(playTimer);
|
|
25343
|
+
playTimer = null;
|
|
25344
|
+
};
|
|
25345
|
+
const open = (seed) => {
|
|
25346
|
+
if (workbench?.dataset.teamId === seed.team_id) {
|
|
25347
|
+
close();
|
|
25348
|
+
return;
|
|
25349
|
+
}
|
|
25350
|
+
close();
|
|
25351
|
+
const source = [...document.querySelectorAll(".harness-mix-team-panel")].find((node) => node.dataset.teamId === seed.team_id);
|
|
25352
|
+
if (!source?.parentElement) return;
|
|
25353
|
+
workbench = el("section", "harness-mix-team-workbench", 'box-sizing:border-box;margin:8px 0 12px;border:1px solid color-mix(in srgb,currentColor 11%,transparent);border-radius:14px;background:color-mix(in srgb,Canvas 94%,transparent);box-shadow:0 12px 34px color-mix(in srgb,#000 8%,transparent);backdrop-filter:blur(20px);color:inherit;font:13px/1.4 system-ui,-apple-system,"Segoe UI",sans-serif;display:grid;grid-template-rows:auto minmax(0,1fr);height:clamp(340px,64vh,660px);min-height:300px;overflow:hidden');
|
|
25354
|
+
workbench.dataset.teamId = seed.team_id;
|
|
25355
|
+
workbench.dataset.teamSource = source.dataset.teamSource ?? "tool";
|
|
25356
|
+
let current = seed, snapshots = [], index = -1;
|
|
25357
|
+
const header = el("header", void 0, "display:flex;align-items:center;gap:14px;flex-wrap:wrap;row-gap:8px;min-height:56px;padding:8px 14px;border-bottom:1px solid color-mix(in srgb,currentColor 9%,transparent);background:color-mix(in srgb,currentColor 2%,transparent)");
|
|
25358
|
+
const title = el("div", void 0, "display:grid;gap:1px;min-width:150px;max-width:min(320px,30vw)");
|
|
25359
|
+
const nameRow = el("div", void 0, "display:flex;align-items:center;gap:7px;min-width:0");
|
|
25360
|
+
const teamName = text("strong", current.name, "font-size:13px;font-weight:750;overflow:hidden;text-overflow:ellipsis;white-space:nowrap");
|
|
25361
|
+
teamName.className = "harness-mix-team-name";
|
|
25362
|
+
const teamPill = statusPill(current.status);
|
|
25363
|
+
nameRow.append(teamName, teamPill);
|
|
25364
|
+
const subtitle = text("div", current.goal, "font-size:9px;opacity:.5;overflow:hidden;text-overflow:ellipsis;white-space:nowrap");
|
|
25365
|
+
subtitle.title = current.goal;
|
|
25366
|
+
title.append(nameRow, subtitle);
|
|
25367
|
+
const statsWrap = el("div", void 0, "display:flex;align-items:center;gap:15px;flex-wrap:wrap");
|
|
25368
|
+
const progressWrap = el("div", void 0, "display:flex;align-items:center;gap:7px;flex:none");
|
|
25369
|
+
progressWrap.append(text("span", "\u6574\u4F53\u8FDB\u5EA6", "font-size:9px;opacity:.55;white-space:nowrap"));
|
|
25370
|
+
const progressBar = el("progress");
|
|
25371
|
+
progressBar.style.cssText = "width:92px;height:5px;accent-color:#1f9d68";
|
|
25372
|
+
const progressPct = text("strong", "0%", "font-size:11px;font-weight:750;color:#1f9d68;min-width:30px");
|
|
25373
|
+
progressWrap.append(progressBar, progressPct);
|
|
25374
|
+
const timeline = el("div", "harness-mix-team-timeline", "display:flex;align-items:center;gap:6px;margin-left:auto;min-width:0"), event = text("span", "\u5B9E\u65F6\u72B6\u6001", "font-size:9px;opacity:.55;min-width:60px;text-align:right"), range = el("input");
|
|
25375
|
+
range.type = "range";
|
|
25376
|
+
range.min = "0";
|
|
25377
|
+
range.max = "0";
|
|
25378
|
+
range.value = "0";
|
|
25379
|
+
range.style.cssText = "width:min(120px,16vw);accent-color:#2878e3";
|
|
25380
|
+
const live = el("button", void 0, "border:1px solid color-mix(in srgb,currentColor 15%,transparent);border-radius:7px;background:transparent;color:inherit;font:600 10px system-ui;padding:5px 7px;cursor:pointer");
|
|
25381
|
+
live.type = "button";
|
|
25382
|
+
live.textContent = "\u5B9E\u65F6";
|
|
25383
|
+
const play = el("button", void 0, "border:1px solid color-mix(in srgb,currentColor 15%,transparent);border-radius:7px;background:color-mix(in srgb,currentColor 6%,transparent);color:inherit;font:600 10px system-ui;padding:5px 8px;cursor:pointer");
|
|
25384
|
+
play.type = "button";
|
|
25385
|
+
play.textContent = "\u56DE\u653E";
|
|
25386
|
+
const collapse = el("button", "harness-mix-team-back", "border:0;background:transparent;color:inherit;font:650 10px system-ui;cursor:pointer;padding:6px 7px;opacity:.68");
|
|
25387
|
+
collapse.type = "button";
|
|
25388
|
+
collapse.textContent = "\u6536\u8D77\u8BE6\u60C5";
|
|
25389
|
+
collapse.addEventListener("click", close);
|
|
25390
|
+
timeline.append(event, range, live, play, collapse);
|
|
25391
|
+
header.append(title, statsWrap, progressWrap, timeline);
|
|
25392
|
+
const content = el("div", void 0, "min-height:0");
|
|
25393
|
+
workbench.append(header, content);
|
|
25394
|
+
source.after(workbench);
|
|
25395
|
+
const render = () => {
|
|
25396
|
+
const snapshot = index >= 0 ? snapshots[index] : void 0;
|
|
25397
|
+
const visible = snapshot?.team ?? current;
|
|
25398
|
+
content.replaceChildren(renderBoard(visible, async (threadId) => {
|
|
25399
|
+
close();
|
|
25400
|
+
await options.openThread?.(threadId);
|
|
25401
|
+
}));
|
|
25402
|
+
teamName.textContent = visible.name;
|
|
25403
|
+
subtitle.textContent = visible.goal;
|
|
25404
|
+
subtitle.title = visible.goal;
|
|
25405
|
+
teamPill.textContent = stateLabel(visible.status);
|
|
25406
|
+
teamPill.style.cssText = pillCss(visible.status);
|
|
25407
|
+
statsWrap.replaceChildren(...headerStats(visible));
|
|
25408
|
+
const completion = completionOf(visible);
|
|
25409
|
+
progressBar.max = Math.max(1, completion.total);
|
|
25410
|
+
progressBar.value = completion.done;
|
|
25411
|
+
progressPct.textContent = `${completion.pct}%`;
|
|
25412
|
+
range.max = String(Math.max(0, snapshots.length - 1));
|
|
25413
|
+
range.value = String(index >= 0 ? index : Math.max(0, snapshots.length - 1));
|
|
25414
|
+
event.textContent = snapshot ? `${actionLabel(snapshot.action)} \xB7 ${new Date(snapshot.at).toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" })}` : "\u25CF \u5B9E\u65F6\u72B6\u6001";
|
|
25415
|
+
};
|
|
25416
|
+
range.addEventListener("input", () => {
|
|
25417
|
+
index = Number(range.value);
|
|
25418
|
+
render();
|
|
25419
|
+
});
|
|
25420
|
+
live.addEventListener("click", () => {
|
|
25421
|
+
index = -1;
|
|
25422
|
+
render();
|
|
25423
|
+
});
|
|
25424
|
+
play.addEventListener("click", () => {
|
|
25425
|
+
if (playTimer) {
|
|
25426
|
+
clearInterval(playTimer);
|
|
25427
|
+
playTimer = null;
|
|
25428
|
+
play.textContent = "\u56DE\u653E";
|
|
25429
|
+
return;
|
|
25430
|
+
}
|
|
25431
|
+
index = index < 0 ? 0 : index;
|
|
25432
|
+
play.textContent = "\u6682\u505C";
|
|
25433
|
+
render();
|
|
25434
|
+
playTimer = setInterval(() => {
|
|
25435
|
+
if (index >= snapshots.length - 1) {
|
|
25436
|
+
if (playTimer) clearInterval(playTimer);
|
|
25437
|
+
playTimer = null;
|
|
25438
|
+
index = -1;
|
|
25439
|
+
play.textContent = "\u56DE\u653E";
|
|
25440
|
+
} else index++;
|
|
25441
|
+
render();
|
|
25442
|
+
}, 800);
|
|
25443
|
+
});
|
|
25444
|
+
const refresh = async () => {
|
|
25445
|
+
if (!options.inspectTeam || !seed.lead_thread_id || !workbench) return;
|
|
25446
|
+
try {
|
|
25447
|
+
const result = parseInspection(await options.inspectTeam(seed.lead_thread_id, seed.team_id));
|
|
25448
|
+
if (!result || !workbench) return;
|
|
25449
|
+
current = result.team;
|
|
25450
|
+
snapshots = result.snapshots;
|
|
25451
|
+
render();
|
|
25452
|
+
} catch {
|
|
25453
|
+
}
|
|
25454
|
+
};
|
|
25455
|
+
render();
|
|
25456
|
+
void refresh();
|
|
25457
|
+
refreshTimer = setInterval(() => void refresh(), 1500);
|
|
25458
|
+
};
|
|
25459
|
+
const onKey = (event) => {
|
|
25460
|
+
if (event.key === "Escape" && workbench) close();
|
|
25461
|
+
};
|
|
25462
|
+
document.addEventListener("keydown", onKey);
|
|
25463
|
+
const scan = () => {
|
|
25464
|
+
if (disposed) return;
|
|
25465
|
+
const selector = '[data-testid*="tool"], [data-turn-key], [data-local-conversation-item-target-ids], pre[data-testid*="tool"]';
|
|
25466
|
+
for (const candidate of document.querySelectorAll(selector)) {
|
|
25467
|
+
if (candidate.closest(".harness-mix-team-panel,.harness-mix-team-workbench")) continue;
|
|
25468
|
+
const payload = parseTeamPayload(candidate.textContent ?? "");
|
|
25469
|
+
if (!payload) continue;
|
|
25470
|
+
if ([...candidate.querySelectorAll(selector)].some((child) => parseTeamPayload(child.textContent ?? ""))) continue;
|
|
25471
|
+
const signature = `${payload.updated_at ?? 0}:${payload.tasks.length}:${payload.messages.length}`;
|
|
25472
|
+
if (signatures.get(candidate) === signature) continue;
|
|
25473
|
+
const panel = renderSummary(payload, () => open(payload));
|
|
25474
|
+
if (candidate.tagName === "PRE") {
|
|
25475
|
+
if (!candidate.dataset.harnessMixTeamDisplay) candidate.dataset.harnessMixTeamDisplay = candidate.style.display || "__empty__";
|
|
25476
|
+
candidate.style.display = "none";
|
|
25477
|
+
if (candidate.nextElementSibling?.classList.contains("harness-mix-team-panel")) candidate.nextElementSibling.remove();
|
|
25478
|
+
candidate.after(panel);
|
|
25479
|
+
} else {
|
|
25480
|
+
candidate.querySelector(":scope > .harness-mix-team-panel")?.remove();
|
|
25481
|
+
candidate.append(panel);
|
|
25482
|
+
}
|
|
25483
|
+
signatures.set(candidate, signature);
|
|
25484
|
+
}
|
|
25485
|
+
};
|
|
25486
|
+
const removeActivePanel = () => {
|
|
25487
|
+
if (workbench?.dataset.teamSource === "active-thread") close();
|
|
25488
|
+
activePanel?.remove();
|
|
25489
|
+
activePanel = null;
|
|
25490
|
+
activeSignature = "";
|
|
25491
|
+
activeThreadId = "";
|
|
25492
|
+
};
|
|
25493
|
+
const refreshActiveTeam = async () => {
|
|
25494
|
+
if (disposed || activeRefreshPending || !options.inspectTeam || !options.activeThread) return;
|
|
25495
|
+
const context = options.activeThread();
|
|
25496
|
+
if (!context?.anchor.isConnected) {
|
|
25497
|
+
removeActivePanel();
|
|
25498
|
+
return;
|
|
25499
|
+
}
|
|
25500
|
+
activeRefreshPending = true;
|
|
25501
|
+
try {
|
|
25502
|
+
const result = parseInspection(await options.inspectTeam(context.threadId));
|
|
25503
|
+
if (disposed) return;
|
|
25504
|
+
const latest = options.activeThread();
|
|
25505
|
+
if (!latest || latest.threadId !== context.threadId || !latest.anchor.isConnected) {
|
|
25506
|
+
removeActivePanel();
|
|
25507
|
+
return;
|
|
25508
|
+
}
|
|
25509
|
+
if (!result) {
|
|
25510
|
+
removeActivePanel();
|
|
25511
|
+
return;
|
|
25512
|
+
}
|
|
25513
|
+
const payload = result.team;
|
|
25514
|
+
const signature = `${context.threadId}:${payload.team_id}:${payload.updated_at ?? 0}:${payload.tasks.length}:${payload.messages.length}`;
|
|
25515
|
+
const inlinePanel = [...document.querySelectorAll(".harness-mix-team-panel")].find((node) => node !== activePanel && node.dataset.teamId === payload.team_id);
|
|
25516
|
+
if (inlinePanel) {
|
|
25517
|
+
removeActivePanel();
|
|
25518
|
+
return;
|
|
25519
|
+
}
|
|
25520
|
+
if (activePanel?.isConnected && activeSignature === signature && activeThreadId === context.threadId) return;
|
|
25521
|
+
const reopen = workbench?.dataset.teamId === payload.team_id && workbench.dataset.teamSource === "active-thread";
|
|
25522
|
+
removeActivePanel();
|
|
25523
|
+
activePanel = renderSummary(payload, () => open(payload));
|
|
25524
|
+
activePanel.classList.add("harness-mix-team-launcher");
|
|
25525
|
+
activePanel.dataset.teamSource = "active-thread";
|
|
25526
|
+
activePanel.style.cssText += ";margin:8px 16px 0;flex:none;position:relative;z-index:11";
|
|
25527
|
+
const parent = latest.anchor.parentElement;
|
|
25528
|
+
if (!parent) {
|
|
25529
|
+
removeActivePanel();
|
|
25530
|
+
return;
|
|
25531
|
+
}
|
|
25532
|
+
parent.insertBefore(activePanel, latest.anchor);
|
|
25533
|
+
activeSignature = signature;
|
|
25534
|
+
activeThreadId = context.threadId;
|
|
25535
|
+
if (reopen) open(payload);
|
|
25536
|
+
} catch {
|
|
25537
|
+
removeActivePanel();
|
|
25538
|
+
} finally {
|
|
25539
|
+
activeRefreshPending = false;
|
|
24971
25540
|
}
|
|
24972
25541
|
};
|
|
25542
|
+
const observer = new MutationObserver(scan);
|
|
25543
|
+
observer.observe(document.body || document.documentElement, { childList: true, subtree: true, characterData: true });
|
|
25544
|
+
scan();
|
|
25545
|
+
void refreshActiveTeam();
|
|
25546
|
+
activeTimer = setInterval(() => void refreshActiveTeam(), 1500);
|
|
25547
|
+
return { scan, close, dispose() {
|
|
25548
|
+
disposed = true;
|
|
25549
|
+
observer.disconnect();
|
|
25550
|
+
if (activeTimer) clearInterval(activeTimer);
|
|
25551
|
+
activeTimer = null;
|
|
25552
|
+
removeActivePanel();
|
|
25553
|
+
close();
|
|
25554
|
+
style.remove();
|
|
25555
|
+
document.removeEventListener("keydown", onKey);
|
|
25556
|
+
document.querySelectorAll(".harness-mix-team-panel").forEach((node) => node.remove());
|
|
25557
|
+
document.querySelectorAll("[data-harness-mix-team-display]").forEach((node) => {
|
|
25558
|
+
node.style.display = node.dataset.harnessMixTeamDisplay === "__empty__" ? "" : node.dataset.harnessMixTeamDisplay ?? "";
|
|
25559
|
+
delete node.dataset.harnessMixTeamDisplay;
|
|
25560
|
+
});
|
|
25561
|
+
} };
|
|
24973
25562
|
}
|
|
24974
25563
|
|
|
24975
25564
|
// src/native-ui/renderer-extension/src/codex-locale-adapter.ts
|
|
@@ -25382,10 +25971,10 @@ ${error51.stderrTail}`] : []
|
|
|
25382
25971
|
return status;
|
|
25383
25972
|
}
|
|
25384
25973
|
function createAccessibleText(document2, message) {
|
|
25385
|
-
const
|
|
25386
|
-
|
|
25387
|
-
|
|
25388
|
-
return
|
|
25974
|
+
const text2 = document2.createElement("span");
|
|
25975
|
+
text2.className = "settings-visually-hidden";
|
|
25976
|
+
text2.textContent = message;
|
|
25977
|
+
return text2;
|
|
25389
25978
|
}
|
|
25390
25979
|
function createSessionImportSettingsPage(messages, getClient, openImportedThread) {
|
|
25391
25980
|
return Object.freeze({
|
|
@@ -25901,11 +26490,11 @@ ${error51.stderrTail}`] : []
|
|
|
25901
26490
|
root.append(paragraph);
|
|
25902
26491
|
return index;
|
|
25903
26492
|
}
|
|
25904
|
-
function appendInline(document2, parent,
|
|
26493
|
+
function appendInline(document2, parent, text2) {
|
|
25905
26494
|
let lastIndex = 0;
|
|
25906
|
-
for (const match of
|
|
26495
|
+
for (const match of text2.matchAll(INLINE_PATTERN)) {
|
|
25907
26496
|
const index = match.index ?? 0;
|
|
25908
|
-
if (index > lastIndex) parent.append(
|
|
26497
|
+
if (index > lastIndex) parent.append(text2.slice(lastIndex, index));
|
|
25909
26498
|
if (match[2] !== void 0) {
|
|
25910
26499
|
const code = document2.createElement("code");
|
|
25911
26500
|
code.textContent = match[2];
|
|
@@ -25929,11 +26518,11 @@ ${error51.stderrTail}`] : []
|
|
|
25929
26518
|
}
|
|
25930
26519
|
lastIndex = index + match[0].length;
|
|
25931
26520
|
}
|
|
25932
|
-
if (lastIndex <
|
|
26521
|
+
if (lastIndex < text2.length) parent.append(text2.slice(lastIndex));
|
|
25933
26522
|
}
|
|
25934
26523
|
function isSafeLink(href) {
|
|
25935
26524
|
try {
|
|
25936
|
-
const url2 = new URL(href, "https://
|
|
26525
|
+
const url2 = new URL(href, "https://harnessmix.invalid");
|
|
25937
26526
|
return url2.protocol === "http:" || url2.protocol === "https:";
|
|
25938
26527
|
} catch {
|
|
25939
26528
|
return false;
|
|
@@ -25954,37 +26543,37 @@ ${error51.stderrTail}`] : []
|
|
|
25954
26543
|
return context.signal.aborted;
|
|
25955
26544
|
} };
|
|
25956
26545
|
const doc = content.ownerDocument;
|
|
25957
|
-
const
|
|
26546
|
+
const el2 = (tag, text2 = "") => {
|
|
25958
26547
|
const node = doc.createElement(tag);
|
|
25959
|
-
node.textContent =
|
|
26548
|
+
node.textContent = text2;
|
|
25960
26549
|
return node;
|
|
25961
26550
|
};
|
|
25962
|
-
const title =
|
|
25963
|
-
const note =
|
|
26551
|
+
const title = el2("h2", kind === "mcp" ? "MCP" : "Skills");
|
|
26552
|
+
const note = el2("p", kind === "mcp" ? tr("\u6309 Harness \u7BA1\u7406 MCP \u670D\u52A1\u5668\u3002\u914D\u7F6E\u4F1A\u5728\u4E0B\u6B21\u6253\u5F00\u539F\u751F\u4F1A\u8BDD\u65F6\u4F20\u5165\u3002", "Manage MCP servers per Harness. Configuration is passed to the next native session.") : tr("\u628A\u6280\u80FD\u6587\u4EF6\u6216\u5B8C\u6574\u6280\u80FD\u6587\u4EF6\u5939\u62D6\u5230\u8FD9\u91CC\uFF0C\u76F4\u63A5\u5B89\u88C5\u5230\u539F\u751F\u6280\u80FD\u76EE\u5F55\u3002", "Drop a skill file or a complete skill folder here to install it in the native skill directory."));
|
|
25964
26553
|
note.className = "settings-page-description";
|
|
25965
|
-
const controls =
|
|
26554
|
+
const controls = el2("div");
|
|
25966
26555
|
controls.className = "settings-integrations-controls";
|
|
25967
|
-
const harness =
|
|
26556
|
+
const harness = el2("select");
|
|
25968
26557
|
harness.setAttribute("aria-label", "Harness");
|
|
25969
|
-
const level =
|
|
26558
|
+
const level = el2("select");
|
|
25970
26559
|
level.setAttribute("aria-label", tr("\u4F5C\u7528\u8303\u56F4", "Scope"));
|
|
25971
26560
|
for (const [value, label] of [["global", tr("\u5168\u5C40", "Global")], ["project", tr("\u9879\u76EE", "Project")]]) {
|
|
25972
|
-
const option =
|
|
26561
|
+
const option = el2("option", label);
|
|
25973
26562
|
option.value = value;
|
|
25974
26563
|
level.append(option);
|
|
25975
26564
|
}
|
|
25976
|
-
const cwd =
|
|
26565
|
+
const cwd = el2("input");
|
|
25977
26566
|
cwd.placeholder = tr("\u9879\u76EE\u7EDD\u5BF9\u8DEF\u5F84", "Absolute project path");
|
|
25978
26567
|
cwd.setAttribute("aria-label", cwd.placeholder);
|
|
25979
26568
|
cwd.hidden = true;
|
|
25980
|
-
const refreshButton =
|
|
26569
|
+
const refreshButton = el2("button", tr("\u5237\u65B0", "Refresh"));
|
|
25981
26570
|
refreshButton.type = "button";
|
|
25982
26571
|
refreshButton.className = "settings-command-button settings-command-button--secondary";
|
|
25983
|
-
const status =
|
|
26572
|
+
const status = el2("p");
|
|
25984
26573
|
status.className = "settings-integrations-status";
|
|
25985
26574
|
status.setAttribute("role", "status");
|
|
25986
26575
|
status.setAttribute("aria-live", "polite");
|
|
25987
|
-
const body =
|
|
26576
|
+
const body = el2("div");
|
|
25988
26577
|
body.className = "settings-integrations-body";
|
|
25989
26578
|
let busy = false;
|
|
25990
26579
|
const selectedScope = () => ({ harnessId: harness.value, scope: level.value === "project" ? "project" : "global", ...level.value === "project" ? { cwd: cwd.value.trim() } : {} });
|
|
@@ -26003,7 +26592,7 @@ ${error51.stderrTail}`] : []
|
|
|
26003
26592
|
for (const node of content.querySelectorAll("button, input, select, textarea")) node.disabled = value || node.dataset.readonly === "true";
|
|
26004
26593
|
};
|
|
26005
26594
|
const button = (label, action, primary = false) => {
|
|
26006
|
-
const node =
|
|
26595
|
+
const node = el2("button", label);
|
|
26007
26596
|
node.type = "button";
|
|
26008
26597
|
node.className = `settings-command-button ${primary ? "settings-command-button--primary" : "settings-command-button--secondary"}`;
|
|
26009
26598
|
node.addEventListener("click", action, { signal: lifecycle.signal });
|
|
@@ -26097,7 +26686,7 @@ ${error51.stderrTail}`] : []
|
|
|
26097
26686
|
return { name, files };
|
|
26098
26687
|
};
|
|
26099
26688
|
const field = (form, label, node) => {
|
|
26100
|
-
const wrap =
|
|
26689
|
+
const wrap = el2("label", label);
|
|
26101
26690
|
wrap.className = "settings-integrations-field";
|
|
26102
26691
|
wrap.append(node);
|
|
26103
26692
|
form.append(wrap);
|
|
@@ -26133,15 +26722,15 @@ ${error51.stderrTail}`] : []
|
|
|
26133
26722
|
};
|
|
26134
26723
|
};
|
|
26135
26724
|
const renderMcp = (snapshot) => {
|
|
26136
|
-
const toolbar =
|
|
26725
|
+
const toolbar = el2("div");
|
|
26137
26726
|
toolbar.className = "settings-integrations-toolbar";
|
|
26138
|
-
const search =
|
|
26727
|
+
const search = el2("input");
|
|
26139
26728
|
search.type = "search";
|
|
26140
26729
|
search.placeholder = tr("\u641C\u7D22 MCP \u670D\u52A1\u5668", "Search MCP servers");
|
|
26141
26730
|
search.setAttribute("aria-label", search.placeholder);
|
|
26142
|
-
const list =
|
|
26731
|
+
const list = el2("div");
|
|
26143
26732
|
list.className = "settings-integrations-list";
|
|
26144
|
-
const editor =
|
|
26733
|
+
const editor = el2("div");
|
|
26145
26734
|
editor.className = "settings-mcp-editor";
|
|
26146
26735
|
editor.hidden = true;
|
|
26147
26736
|
const showList = () => {
|
|
@@ -26154,11 +26743,11 @@ ${error51.stderrTail}`] : []
|
|
|
26154
26743
|
editor.hidden = false;
|
|
26155
26744
|
list.hidden = true;
|
|
26156
26745
|
toolbar.hidden = true;
|
|
26157
|
-
const heading =
|
|
26746
|
+
const heading = el2("div");
|
|
26158
26747
|
heading.className = "settings-integrations-editor-head";
|
|
26159
26748
|
const backBtn = button(tr("\u2039 \u8FD4\u56DE", "\u2039 Back"), showList);
|
|
26160
|
-
const title2 =
|
|
26161
|
-
const docsLink =
|
|
26749
|
+
const title2 = el2("h3", server ? tr(`\u66F4\u65B0 ${server.name} MCP`, `Update ${server.name} MCP`) : tr("\u8FDE\u63A5\u81F3\u81EA\u5B9A\u4E49 MCP", "Connect to a custom MCP"));
|
|
26750
|
+
const docsLink = el2("a", tr("\u6587\u6863 \u2197", "Docs \u2197"));
|
|
26162
26751
|
docsLink.href = "https://modelcontextprotocol.io/introduction";
|
|
26163
26752
|
docsLink.target = "_blank";
|
|
26164
26753
|
docsLink.rel = "noreferrer noopener";
|
|
@@ -26175,7 +26764,7 @@ ${error51.stderrTail}`] : []
|
|
|
26175
26764
|
heading.append(uninstallBtn);
|
|
26176
26765
|
}
|
|
26177
26766
|
const createTrashBtn = (onRemove) => {
|
|
26178
|
-
const btn =
|
|
26767
|
+
const btn = el2("button");
|
|
26179
26768
|
btn.type = "button";
|
|
26180
26769
|
btn.className = "settings-mcp-icon-btn";
|
|
26181
26770
|
btn.setAttribute("aria-label", tr("\u79FB\u9664", "Remove"));
|
|
@@ -26185,52 +26774,52 @@ ${error51.stderrTail}`] : []
|
|
|
26185
26774
|
return btn;
|
|
26186
26775
|
};
|
|
26187
26776
|
let transportType = server?.transportType === "streamable_http" || !!server?.url ? "streamable_http" : "stdio";
|
|
26188
|
-
const form =
|
|
26777
|
+
const form = el2("form");
|
|
26189
26778
|
form.className = "settings-integrations-form";
|
|
26190
|
-
const basicCard =
|
|
26779
|
+
const basicCard = el2("div");
|
|
26191
26780
|
basicCard.className = "settings-integrations-form--card";
|
|
26192
|
-
const name =
|
|
26781
|
+
const name = el2("input");
|
|
26193
26782
|
name.required = true;
|
|
26194
26783
|
name.pattern = "[a-zA-Z0-9](?:[a-zA-Z0-9_]|-){0,63}";
|
|
26195
26784
|
name.placeholder = "MCP server name";
|
|
26196
26785
|
name.value = server?.name ?? "";
|
|
26197
26786
|
field(basicCard, tr("\u540D\u79F0", "Name"), name);
|
|
26198
|
-
const typeField =
|
|
26787
|
+
const typeField = el2("div");
|
|
26199
26788
|
typeField.className = "settings-integrations-field";
|
|
26200
|
-
typeField.append(
|
|
26201
|
-
const toggle =
|
|
26789
|
+
typeField.append(el2("span", tr("\u7C7B\u578B", "Type")));
|
|
26790
|
+
const toggle = el2("div");
|
|
26202
26791
|
toggle.className = "settings-mcp-type-toggle";
|
|
26203
|
-
const stdioBtn =
|
|
26792
|
+
const stdioBtn = el2("button", "STDIO");
|
|
26204
26793
|
stdioBtn.type = "button";
|
|
26205
26794
|
stdioBtn.className = "settings-mcp-type-btn";
|
|
26206
|
-
const httpBtn =
|
|
26795
|
+
const httpBtn = el2("button", tr("\u6D41\u5F0F HTTP", "Streamable HTTP"));
|
|
26207
26796
|
httpBtn.type = "button";
|
|
26208
26797
|
httpBtn.className = "settings-mcp-type-btn";
|
|
26209
26798
|
toggle.append(stdioBtn, httpBtn);
|
|
26210
26799
|
typeField.append(toggle);
|
|
26211
26800
|
basicCard.append(typeField);
|
|
26212
26801
|
if (server) {
|
|
26213
|
-
const switchNotice =
|
|
26802
|
+
const switchNotice = el2("p", tr("\u5982\u9700\u5207\u6362 MCP \u670D\u52A1\u5668\u7C7B\u578B\uFF0C\u8BF7\u5148\u5378\u8F7D\u5F53\u524D\u914D\u7F6E\u3002", "If you would like to switch MCP server type, please uninstall first."));
|
|
26214
26803
|
switchNotice.className = "settings-mcp-notice";
|
|
26215
26804
|
basicCard.append(switchNotice);
|
|
26216
26805
|
}
|
|
26217
|
-
const transportCard =
|
|
26806
|
+
const transportCard = el2("div");
|
|
26218
26807
|
transportCard.className = "settings-integrations-form--card settings-mcp-transport-card";
|
|
26219
|
-
const stdioSection =
|
|
26808
|
+
const stdioSection = el2("div");
|
|
26220
26809
|
stdioSection.className = "settings-mcp-section";
|
|
26221
|
-
const command =
|
|
26810
|
+
const command = el2("input");
|
|
26222
26811
|
command.placeholder = "openai-dev-mcp serve-sqlite";
|
|
26223
26812
|
command.value = server?.command ?? "";
|
|
26224
26813
|
field(stdioSection, tr("\u542F\u52A8\u547D\u4EE4", "Command to launch"), command);
|
|
26225
|
-
const argsField =
|
|
26814
|
+
const argsField = el2("div");
|
|
26226
26815
|
argsField.className = "settings-integrations-field";
|
|
26227
|
-
argsField.append(
|
|
26228
|
-
const argsList =
|
|
26816
|
+
argsField.append(el2("span", tr("\u53C2\u6570", "Arguments")));
|
|
26817
|
+
const argsList = el2("div");
|
|
26229
26818
|
argsList.className = "settings-mcp-args";
|
|
26230
26819
|
const addArg = (value = "") => {
|
|
26231
|
-
const row =
|
|
26820
|
+
const row = el2("div");
|
|
26232
26821
|
row.className = "settings-mcp-arg";
|
|
26233
|
-
const input =
|
|
26822
|
+
const input = el2("input");
|
|
26234
26823
|
input.value = value;
|
|
26235
26824
|
input.placeholder = tr("\u547D\u4EE4\u53C2\u6570", "Command argument");
|
|
26236
26825
|
row.append(input, createTrashBtn(() => row.remove()));
|
|
@@ -26241,18 +26830,18 @@ ${error51.stderrTail}`] : []
|
|
|
26241
26830
|
addArgBtn.classList.add("settings-mcp-add-arg");
|
|
26242
26831
|
argsField.append(argsList, addArgBtn);
|
|
26243
26832
|
stdioSection.append(argsField);
|
|
26244
|
-
const envField =
|
|
26833
|
+
const envField = el2("div");
|
|
26245
26834
|
envField.className = "settings-integrations-field";
|
|
26246
|
-
envField.append(
|
|
26247
|
-
const envList =
|
|
26835
|
+
envField.append(el2("span", tr("\u73AF\u5883\u53D8\u91CF", "Environment variables")));
|
|
26836
|
+
const envList = el2("div");
|
|
26248
26837
|
envList.className = "settings-mcp-args";
|
|
26249
26838
|
const addEnv = (key = "", val = "") => {
|
|
26250
|
-
const row =
|
|
26839
|
+
const row = el2("div");
|
|
26251
26840
|
row.className = "settings-mcp-kv-row";
|
|
26252
|
-
const keyInput =
|
|
26841
|
+
const keyInput = el2("input");
|
|
26253
26842
|
keyInput.value = key;
|
|
26254
26843
|
keyInput.placeholder = tr("\u952E", "Key");
|
|
26255
|
-
const valInput =
|
|
26844
|
+
const valInput = el2("input");
|
|
26256
26845
|
valInput.value = val;
|
|
26257
26846
|
valInput.placeholder = tr("\u503C", "Value");
|
|
26258
26847
|
row.append(keyInput, valInput, createTrashBtn(() => row.remove()));
|
|
@@ -26265,15 +26854,15 @@ ${error51.stderrTail}`] : []
|
|
|
26265
26854
|
addEnvBtn.classList.add("settings-mcp-add-arg");
|
|
26266
26855
|
envField.append(envList, addEnvBtn);
|
|
26267
26856
|
stdioSection.append(envField);
|
|
26268
|
-
const envPassField =
|
|
26857
|
+
const envPassField = el2("div");
|
|
26269
26858
|
envPassField.className = "settings-integrations-field";
|
|
26270
|
-
envPassField.append(
|
|
26271
|
-
const envPassList =
|
|
26859
|
+
envPassField.append(el2("span", tr("\u73AF\u5883\u53D8\u91CF\u4F20\u9012", "Environment variable passthrough")));
|
|
26860
|
+
const envPassList = el2("div");
|
|
26272
26861
|
envPassList.className = "settings-mcp-args";
|
|
26273
26862
|
const addEnvPass = (value = "") => {
|
|
26274
|
-
const row =
|
|
26863
|
+
const row = el2("div");
|
|
26275
26864
|
row.className = "settings-mcp-arg";
|
|
26276
|
-
const input =
|
|
26865
|
+
const input = el2("input");
|
|
26277
26866
|
input.value = value;
|
|
26278
26867
|
input.placeholder = tr("\u53D8\u91CF\u540D\uFF0C\u4F8B\u5982\uFF1AGITHUB_TOKEN", "Variable name, e.g. GITHUB_TOKEN");
|
|
26279
26868
|
row.append(input, createTrashBtn(() => row.remove()));
|
|
@@ -26286,32 +26875,32 @@ ${error51.stderrTail}`] : []
|
|
|
26286
26875
|
addEnvPassBtn.classList.add("settings-mcp-add-arg");
|
|
26287
26876
|
envPassField.append(envPassList, addEnvPassBtn);
|
|
26288
26877
|
stdioSection.append(envPassField);
|
|
26289
|
-
const cwd2 =
|
|
26878
|
+
const cwd2 = el2("input");
|
|
26290
26879
|
cwd2.placeholder = "~/code";
|
|
26291
26880
|
cwd2.value = server?.cwd ?? "";
|
|
26292
26881
|
field(stdioSection, tr("\u5DE5\u4F5C\u76EE\u5F55", "Working directory"), cwd2);
|
|
26293
|
-
const httpSection =
|
|
26882
|
+
const httpSection = el2("div");
|
|
26294
26883
|
httpSection.className = "settings-mcp-section";
|
|
26295
|
-
const url2 =
|
|
26884
|
+
const url2 = el2("input");
|
|
26296
26885
|
url2.placeholder = "https://mcp.example.com/mcp";
|
|
26297
26886
|
url2.value = server?.url ?? "";
|
|
26298
26887
|
field(httpSection, "URL", url2);
|
|
26299
|
-
const bearerToken =
|
|
26888
|
+
const bearerToken = el2("input");
|
|
26300
26889
|
bearerToken.placeholder = "MCP_BEARER_TOKEN";
|
|
26301
26890
|
bearerToken.value = server?.bearer_token_env_var ?? "";
|
|
26302
26891
|
field(httpSection, tr("Bearer \u4EE4\u724C\u73AF\u5883\u53D8\u91CF", "Bearer token env var"), bearerToken);
|
|
26303
|
-
const headersField =
|
|
26892
|
+
const headersField = el2("div");
|
|
26304
26893
|
headersField.className = "settings-integrations-field";
|
|
26305
|
-
headersField.append(
|
|
26306
|
-
const headersList =
|
|
26894
|
+
headersField.append(el2("span", tr("\u6807\u5934", "Headers")));
|
|
26895
|
+
const headersList = el2("div");
|
|
26307
26896
|
headersList.className = "settings-mcp-args";
|
|
26308
26897
|
const addHeader = (key = "", val = "") => {
|
|
26309
|
-
const row =
|
|
26898
|
+
const row = el2("div");
|
|
26310
26899
|
row.className = "settings-mcp-kv-row";
|
|
26311
|
-
const keyInput =
|
|
26900
|
+
const keyInput = el2("input");
|
|
26312
26901
|
keyInput.value = key;
|
|
26313
26902
|
keyInput.placeholder = tr("\u952E", "Key");
|
|
26314
|
-
const valInput =
|
|
26903
|
+
const valInput = el2("input");
|
|
26315
26904
|
valInput.value = val;
|
|
26316
26905
|
valInput.placeholder = tr("\u503C", "Value");
|
|
26317
26906
|
row.append(keyInput, valInput, createTrashBtn(() => row.remove()));
|
|
@@ -26324,18 +26913,18 @@ ${error51.stderrTail}`] : []
|
|
|
26324
26913
|
addHeaderBtn.classList.add("settings-mcp-add-arg");
|
|
26325
26914
|
headersField.append(headersList, addHeaderBtn);
|
|
26326
26915
|
httpSection.append(headersField);
|
|
26327
|
-
const envHeadersField =
|
|
26916
|
+
const envHeadersField = el2("div");
|
|
26328
26917
|
envHeadersField.className = "settings-integrations-field";
|
|
26329
|
-
envHeadersField.append(
|
|
26330
|
-
const envHeadersList =
|
|
26918
|
+
envHeadersField.append(el2("span", tr("\u6765\u81EA\u73AF\u5883\u53D8\u91CF\u7684\u6807\u5934", "Headers from environment variables")));
|
|
26919
|
+
const envHeadersList = el2("div");
|
|
26331
26920
|
envHeadersList.className = "settings-mcp-args";
|
|
26332
26921
|
const addEnvHeader = (key = "", val = "") => {
|
|
26333
|
-
const row =
|
|
26922
|
+
const row = el2("div");
|
|
26334
26923
|
row.className = "settings-mcp-kv-row";
|
|
26335
|
-
const keyInput =
|
|
26924
|
+
const keyInput = el2("input");
|
|
26336
26925
|
keyInput.value = key;
|
|
26337
26926
|
keyInput.placeholder = tr("\u6807\u5934\u540D\u79F0", "Header name");
|
|
26338
|
-
const valInput =
|
|
26927
|
+
const valInput = el2("input");
|
|
26339
26928
|
valInput.value = val;
|
|
26340
26929
|
valInput.placeholder = tr("\u73AF\u5883\u53D8\u91CF\u540D\u79F0", "Environment variable name");
|
|
26341
26930
|
row.append(keyInput, valInput, createTrashBtn(() => row.remove()));
|
|
@@ -26366,7 +26955,7 @@ ${error51.stderrTail}`] : []
|
|
|
26366
26955
|
});
|
|
26367
26956
|
updateTypeView();
|
|
26368
26957
|
transportCard.append(stdioSection, httpSection);
|
|
26369
|
-
const security =
|
|
26958
|
+
const security = el2("p", tr("\u51ED\u636E\u548C\u73AF\u5883\u53D8\u91CF\u5C06\u5728\u539F\u751F Harness \u8FD0\u884C\u73AF\u5883\u4E2D\u89E3\u6790\u4E0E\u6CE8\u5165\uFF0C\u4E0D\u4F1A\u6CC4\u9732\u5728\u5BBF\u4E3B\u8FDB\u7A0B\u4E2D\u3002", "Credentials and environment variables are resolved and injected within the native Harness environment."));
|
|
26370
26959
|
security.className = "settings-integrations-callout";
|
|
26371
26960
|
const save = button(tr("\u4FDD\u5B58 MCP", "Save MCP"), () => {
|
|
26372
26961
|
}, true);
|
|
@@ -26437,9 +27026,9 @@ ${error51.stderrTail}`] : []
|
|
|
26437
27026
|
const addButton = button(tr("\uFF0B \u6DFB\u52A0 MCP", "+ Add MCP"), () => showEditor(), true);
|
|
26438
27027
|
toolbar.append(search, addButton);
|
|
26439
27028
|
for (const native of snapshot.native) {
|
|
26440
|
-
const row =
|
|
27029
|
+
const row = el2("section");
|
|
26441
27030
|
row.className = "settings-integrations-row settings-integrations-row--native";
|
|
26442
|
-
row.append(
|
|
27031
|
+
row.append(el2("strong", `${tr("\u539F\u751F\u72B6\u6001", "Native status")} \xB7 ${native.name || native.sessionId}`), el2("span", native.status), el2("code", native.tools.join(", ")));
|
|
26443
27032
|
list.append(row);
|
|
26444
27033
|
}
|
|
26445
27034
|
const toManaged = (s, newEnabled) => ({
|
|
@@ -26459,15 +27048,15 @@ ${error51.stderrTail}`] : []
|
|
|
26459
27048
|
});
|
|
26460
27049
|
const serverRows = [];
|
|
26461
27050
|
for (const server of snapshot.servers) {
|
|
26462
|
-
const row =
|
|
27051
|
+
const row = el2("section");
|
|
26463
27052
|
row.className = "settings-integrations-row";
|
|
26464
27053
|
const isHttp = server.transportType === "streamable_http" || !!server.url;
|
|
26465
27054
|
row.dataset.search = `${server.name} ${server.command || ""} ${server.url || ""}`.toLowerCase();
|
|
26466
|
-
const detail =
|
|
27055
|
+
const detail = el2("div");
|
|
26467
27056
|
const state = !server.effective ? tr("\u88AB\u9879\u76EE\u914D\u7F6E\u8986\u76D6", "Overridden by project") : !server.enabled ? tr("\u5DF2\u505C\u7528", "Disabled") : server.appliedSessions ? tr(`\u5DF2\u4F20\u5165 ${server.appliedSessions} \u4E2A\u4F1A\u8BDD`, `Passed to ${server.appliedSessions} sessions`) : tr("\u5DF2\u914D\u7F6E", "Configured");
|
|
26468
27057
|
const typeTag = isHttp ? " [HTTP]" : "";
|
|
26469
27058
|
const summary = isHttp ? server.url || "" : [server.command, ...server.args || []].filter(Boolean).join(" ");
|
|
26470
|
-
detail.append(
|
|
27059
|
+
detail.append(el2("strong", `${server.name}${typeTag}`), el2("p", `${server.scope === "global" ? tr("\u5168\u5C40", "Global") : tr("\u9879\u76EE", "Project")} \xB7 ${state}`), el2("code", summary));
|
|
26471
27060
|
row.append(detail);
|
|
26472
27061
|
if (server.editable) {
|
|
26473
27062
|
const editBtn = button(tr("\u7F16\u8F91", "Edit"), () => showEditor(server));
|
|
@@ -26489,7 +27078,7 @@ ${error51.stderrTail}`] : []
|
|
|
26489
27078
|
serverRows.push(row);
|
|
26490
27079
|
}
|
|
26491
27080
|
if (!snapshot.servers.length) {
|
|
26492
|
-
const empty =
|
|
27081
|
+
const empty = el2("div", tr("\u8FD8\u6CA1\u6709 MCP \u670D\u52A1\u5668\uFF0C\u70B9\u51FB\u201C\u6DFB\u52A0 MCP\u201D\u5F00\u59CB\u914D\u7F6E\u3002", "No MCP servers yet. Select \u201CAdd MCP\u201D to configure one."));
|
|
26493
27082
|
empty.className = "settings-integrations-empty";
|
|
26494
27083
|
list.append(empty);
|
|
26495
27084
|
}
|
|
@@ -26499,7 +27088,7 @@ ${error51.stderrTail}`] : []
|
|
|
26499
27088
|
}, { signal: lifecycle.signal });
|
|
26500
27089
|
if (!snapshot.mcpSupported) {
|
|
26501
27090
|
addButton.disabled = true;
|
|
26502
|
-
const unavailable =
|
|
27091
|
+
const unavailable = el2("div", tr("\u6B64 Harness \u5C1A\u65E0\u5DF2\u786E\u8BA4\u7684 MCP \u914D\u7F6E\u63A5\u53E3\u3002", "This Harness has no verified MCP configuration interface."));
|
|
26503
27092
|
unavailable.className = "settings-integrations-callout";
|
|
26504
27093
|
list.prepend(unavailable);
|
|
26505
27094
|
}
|
|
@@ -26510,17 +27099,17 @@ ${error51.stderrTail}`] : []
|
|
|
26510
27099
|
fail(new Error(tr("\u6CA1\u6709\u5176\u4ED6\u652F\u6301 MCP \u7684\u539F\u751F Harness \u53EF\u4F9B\u540C\u6B65\u3002", "No other native Harnesses support MCP for sync.")));
|
|
26511
27100
|
return;
|
|
26512
27101
|
}
|
|
26513
|
-
const modal =
|
|
27102
|
+
const modal = el2("dialog");
|
|
26514
27103
|
modal.className = "settings-skills-sync-modal settings-mcp-sync-modal";
|
|
26515
|
-
const mTitle =
|
|
27104
|
+
const mTitle = el2("h3", tr(`\u540C\u6B65 MCP\u3010${server.name}\u3011`, `Sync MCP [${server.name}]`));
|
|
26516
27105
|
const isHttp = server.transportType === "streamable_http" || !!server.url;
|
|
26517
27106
|
const summary = isHttp ? server.url || "" : [server.command, ...server.args || []].filter(Boolean).join(" ");
|
|
26518
|
-
const mDesc =
|
|
27107
|
+
const mDesc = el2("p", tr(
|
|
26519
27108
|
`\u4ECE ${sourceHarness.name} \u590D\u5236\u8BE5 MCP \u914D\u7F6E\uFF08${isHttp ? "HTTP" : "stdio"}\uFF1A${summary}\uFF09\u5230\u9009\u4E2D\u7684 Harness\uFF1A`,
|
|
26520
27109
|
`Copy MCP configuration (${isHttp ? "HTTP" : "stdio"}: ${summary}) from ${sourceHarness.name} to selected Harnesses:`
|
|
26521
27110
|
));
|
|
26522
|
-
const form =
|
|
26523
|
-
const checkList =
|
|
27111
|
+
const form = el2("form");
|
|
27112
|
+
const checkList = el2("div");
|
|
26524
27113
|
checkList.style.display = "grid";
|
|
26525
27114
|
checkList.style.gap = "8px";
|
|
26526
27115
|
checkList.style.margin = "12px 0";
|
|
@@ -26528,20 +27117,20 @@ ${error51.stderrTail}`] : []
|
|
|
26528
27117
|
checkList.style.overflowY = "auto";
|
|
26529
27118
|
const checkboxes = [];
|
|
26530
27119
|
for (const h of targetHarnesses) {
|
|
26531
|
-
const label =
|
|
27120
|
+
const label = el2("label");
|
|
26532
27121
|
label.style.display = "flex";
|
|
26533
27122
|
label.style.gap = "8px";
|
|
26534
27123
|
label.style.alignItems = "center";
|
|
26535
27124
|
label.style.cursor = "pointer";
|
|
26536
|
-
const cb =
|
|
27125
|
+
const cb = el2("input");
|
|
26537
27126
|
cb.type = "checkbox";
|
|
26538
27127
|
cb.value = h.id;
|
|
26539
27128
|
cb.checked = true;
|
|
26540
27129
|
checkboxes.push(cb);
|
|
26541
|
-
label.append(cb,
|
|
27130
|
+
label.append(cb, el2("span", h.name));
|
|
26542
27131
|
checkList.append(label);
|
|
26543
27132
|
}
|
|
26544
|
-
const btnRow =
|
|
27133
|
+
const btnRow = el2("div");
|
|
26545
27134
|
btnRow.style.display = "flex";
|
|
26546
27135
|
btnRow.style.gap = "8px";
|
|
26547
27136
|
btnRow.style.justifyContent = "flex-end";
|
|
@@ -26593,51 +27182,51 @@ ${error51.stderrTail}`] : []
|
|
|
26593
27182
|
fail(new Error(tr("\u6CA1\u6709\u652F\u6301 MCP \u6CE8\u5165\u7684\u539F\u751F Harness\u3002", "No native Harnesses support MCP injection.")));
|
|
26594
27183
|
return;
|
|
26595
27184
|
}
|
|
26596
|
-
const modal =
|
|
27185
|
+
const modal = el2("dialog");
|
|
26597
27186
|
modal.className = "settings-mcp-distribute-modal";
|
|
26598
|
-
const mTitle =
|
|
26599
|
-
const mDesc =
|
|
26600
|
-
const form =
|
|
27187
|
+
const mTitle = el2("h3", tr("\u65B0\u5EFA\u5E76\u6279\u91CF\u5206\u53D1 MCP", "Create & Distribute MCP"));
|
|
27188
|
+
const mDesc = el2("p", tr("\u914D\u7F6E MCP \u670D\u52A1\u5668\uFF0C\u5E76\u4E00\u6B21\u6027\u4FDD\u5B58\u5206\u53D1\u81F3\u9009\u4E2D\u7684\u6240\u6709 Harness\u3002", "Configure MCP server once and distribute to all selected Harnesses."));
|
|
27189
|
+
const form = el2("form");
|
|
26601
27190
|
form.className = "settings-integrations-form";
|
|
26602
27191
|
let transportType = "stdio";
|
|
26603
|
-
const typeToggle =
|
|
27192
|
+
const typeToggle = el2("div");
|
|
26604
27193
|
typeToggle.className = "settings-mcp-type-toggle";
|
|
26605
|
-
const stdioBtn =
|
|
27194
|
+
const stdioBtn = el2("button", tr("\u6807\u51C6\u8F93\u5165\u8F93\u51FA (stdio)", "Standard I/O (stdio)"));
|
|
26606
27195
|
stdioBtn.type = "button";
|
|
26607
27196
|
stdioBtn.className = "settings-mcp-type-btn";
|
|
26608
27197
|
stdioBtn.dataset.active = "true";
|
|
26609
|
-
const httpBtn =
|
|
27198
|
+
const httpBtn = el2("button", tr("\u6D41\u5F0F HTTP (SSE)", "Streamable HTTP (SSE)"));
|
|
26610
27199
|
httpBtn.type = "button";
|
|
26611
27200
|
httpBtn.className = "settings-mcp-type-btn";
|
|
26612
27201
|
typeToggle.append(stdioBtn, httpBtn);
|
|
26613
|
-
const nameInput =
|
|
27202
|
+
const nameInput = el2("input");
|
|
26614
27203
|
nameInput.required = true;
|
|
26615
27204
|
nameInput.placeholder = "my-mcp-server";
|
|
26616
27205
|
nameInput.pattern = "[a-zA-Z0-9](?:[a-zA-Z0-9_]|-){0,63}";
|
|
26617
27206
|
field(form, tr("MCP \u670D\u52A1\u5668\u540D\u79F0\uFF08\u5FC5\u586B\uFF09", "MCP server name (required)"), nameInput);
|
|
26618
|
-
const typeField =
|
|
27207
|
+
const typeField = el2("div");
|
|
26619
27208
|
typeField.className = "settings-integrations-field";
|
|
26620
|
-
typeField.append(
|
|
27209
|
+
typeField.append(el2("span", tr("\u4F20\u8F93\u534F\u8BAE", "Transport Protocol")), typeToggle);
|
|
26621
27210
|
form.append(typeField);
|
|
26622
|
-
const stdioCard =
|
|
27211
|
+
const stdioCard = el2("div");
|
|
26623
27212
|
stdioCard.className = "settings-integrations-form--card";
|
|
26624
|
-
const cmdInput =
|
|
27213
|
+
const cmdInput = el2("input");
|
|
26625
27214
|
cmdInput.placeholder = "npx / uvx / node / ...";
|
|
26626
27215
|
field(stdioCard, tr("\u53EF\u6267\u884C\u547D\u4EE4 (Command)", "Executable Command"), cmdInput);
|
|
26627
|
-
const argsInput =
|
|
27216
|
+
const argsInput = el2("input");
|
|
26628
27217
|
argsInput.placeholder = "-y @modelcontextprotocol/server-filesystem D:/data";
|
|
26629
27218
|
field(stdioCard, tr("\u53C2\u6570\uFF08\u7A7A\u683C\u5206\u9694\uFF0C\u652F\u6301\u5F15\u53F7\uFF09", "Arguments (space separated, quotes supported)"), argsInput);
|
|
26630
|
-
const envInput =
|
|
27219
|
+
const envInput = el2("input");
|
|
26631
27220
|
envInput.placeholder = "KEY1=val1, KEY2=val2";
|
|
26632
27221
|
field(stdioCard, tr("\u73AF\u5883\u53D8\u91CF\uFF08\u53EF\u9009\uFF0CKEY=VAL \u9017\u53F7\u6216\u6362\u884C\u5206\u9694\uFF09", "Environment variables (optional, KEY=VAL separated)"), envInput);
|
|
26633
|
-
const httpCard =
|
|
27222
|
+
const httpCard = el2("div");
|
|
26634
27223
|
httpCard.className = "settings-integrations-form--card";
|
|
26635
27224
|
httpCard.hidden = true;
|
|
26636
|
-
const urlInput =
|
|
27225
|
+
const urlInput = el2("input");
|
|
26637
27226
|
urlInput.type = "url";
|
|
26638
27227
|
urlInput.placeholder = "https://mcp.example.com/sse";
|
|
26639
27228
|
field(httpCard, tr("MCP \u670D\u52A1\u5668 URL", "MCP Server URL"), urlInput);
|
|
26640
|
-
const tokenInput =
|
|
27229
|
+
const tokenInput = el2("input");
|
|
26641
27230
|
tokenInput.placeholder = "API_KEY_ENV_NAME";
|
|
26642
27231
|
field(httpCard, tr("Bearer Token \u73AF\u5883\u53D8\u91CF\u540D\uFF08\u53EF\u9009\uFF09", "Bearer token env var name (optional)"), tokenInput);
|
|
26643
27232
|
stdioBtn.addEventListener("click", () => {
|
|
@@ -26655,40 +27244,40 @@ ${error51.stderrTail}`] : []
|
|
|
26655
27244
|
httpCard.hidden = false;
|
|
26656
27245
|
});
|
|
26657
27246
|
form.append(stdioCard, httpCard);
|
|
26658
|
-
const targetSection =
|
|
27247
|
+
const targetSection = el2("div");
|
|
26659
27248
|
targetSection.className = "settings-integrations-form--card";
|
|
26660
|
-
const targetHead =
|
|
27249
|
+
const targetHead = el2("div");
|
|
26661
27250
|
targetHead.style.display = "flex";
|
|
26662
27251
|
targetHead.style.justifyContent = "space-between";
|
|
26663
27252
|
targetHead.style.alignItems = "center";
|
|
26664
27253
|
targetHead.style.marginBottom = "8px";
|
|
26665
|
-
const targetTitle =
|
|
27254
|
+
const targetTitle = el2("strong", tr("\u5206\u53D1\u76EE\u6807 Harness\uFF1A", "Target Harnesses:"));
|
|
26666
27255
|
targetTitle.style.fontSize = "12px";
|
|
26667
|
-
const toggleAllBtn =
|
|
27256
|
+
const toggleAllBtn = el2("button", tr("\u5168\u9009 / \u53D6\u6D88\u5168\u9009", "Select / Deselect All"));
|
|
26668
27257
|
toggleAllBtn.type = "button";
|
|
26669
27258
|
toggleAllBtn.className = "settings-command-button settings-command-button--secondary";
|
|
26670
27259
|
toggleAllBtn.style.fontSize = "11px";
|
|
26671
27260
|
toggleAllBtn.style.padding = "3px 8px";
|
|
26672
27261
|
targetHead.append(targetTitle, toggleAllBtn);
|
|
26673
27262
|
targetSection.append(targetHead);
|
|
26674
|
-
const checkList =
|
|
27263
|
+
const checkList = el2("div");
|
|
26675
27264
|
checkList.style.display = "grid";
|
|
26676
27265
|
checkList.style.gridTemplateColumns = "repeat(auto-fill, minmax(130px, 1fr))";
|
|
26677
27266
|
checkList.style.gap = "8px";
|
|
26678
27267
|
const checkboxes = [];
|
|
26679
27268
|
for (const h of targetHarnesses) {
|
|
26680
|
-
const label =
|
|
27269
|
+
const label = el2("label");
|
|
26681
27270
|
label.style.display = "flex";
|
|
26682
27271
|
label.style.gap = "6px";
|
|
26683
27272
|
label.style.alignItems = "center";
|
|
26684
27273
|
label.style.cursor = "pointer";
|
|
26685
27274
|
label.style.fontSize = "12px";
|
|
26686
|
-
const cb =
|
|
27275
|
+
const cb = el2("input");
|
|
26687
27276
|
cb.type = "checkbox";
|
|
26688
27277
|
cb.value = h.id;
|
|
26689
27278
|
cb.checked = true;
|
|
26690
27279
|
checkboxes.push(cb);
|
|
26691
|
-
label.append(cb,
|
|
27280
|
+
label.append(cb, el2("span", h.name));
|
|
26692
27281
|
checkList.append(label);
|
|
26693
27282
|
}
|
|
26694
27283
|
targetSection.append(checkList);
|
|
@@ -26697,7 +27286,7 @@ ${error51.stderrTail}`] : []
|
|
|
26697
27286
|
const anyChecked = checkboxes.some((cb) => cb.checked);
|
|
26698
27287
|
for (const cb of checkboxes) cb.checked = !anyChecked;
|
|
26699
27288
|
});
|
|
26700
|
-
const btnRow =
|
|
27289
|
+
const btnRow = el2("div");
|
|
26701
27290
|
btnRow.style.display = "flex";
|
|
26702
27291
|
btnRow.style.gap = "8px";
|
|
26703
27292
|
btnRow.style.justifyContent = "flex-end";
|
|
@@ -26706,7 +27295,7 @@ ${error51.stderrTail}`] : []
|
|
|
26706
27295
|
modal.close();
|
|
26707
27296
|
modal.remove();
|
|
26708
27297
|
});
|
|
26709
|
-
const submitBtn =
|
|
27298
|
+
const submitBtn = el2("button", tr("\u786E\u8BA4\u5E76\u5206\u53D1", "Confirm & Distribute"));
|
|
26710
27299
|
submitBtn.type = "submit";
|
|
26711
27300
|
submitBtn.className = "settings-command-button settings-command-button--primary";
|
|
26712
27301
|
btnRow.append(cancelBtn, submitBtn);
|
|
@@ -26809,26 +27398,26 @@ ${error51.stderrTail}`] : []
|
|
|
26809
27398
|
totalNativeCount += item.snapshot.native.length;
|
|
26810
27399
|
}
|
|
26811
27400
|
}
|
|
26812
|
-
const statsBar =
|
|
27401
|
+
const statsBar = el2("div");
|
|
26813
27402
|
statsBar.className = "settings-skills-overview-stats settings-mcp-overview-stats";
|
|
26814
|
-
const statsSummary =
|
|
27403
|
+
const statsSummary = el2("span", tr(
|
|
26815
27404
|
`\u{1F4CA} \u5171 ${items.length} \u4E2A Harness \xB7 ${supported.length} \u4E2A\u652F\u6301\u539F\u751F MCP \u6CE8\u5165 \xB7 \u5DF2\u914D\u7F6E ${uniqueServers.size} \u79CD\u72EC\u7ACB MCP\uFF08\u5171 ${totalServersCount} \u4E2A\u5B9E\u4F8B\uFF09${totalNativeCount ? ` \xB7 ${totalNativeCount} \u4E2A\u6D3B\u8DC3\u539F\u751F\u8FDE\u63A5` : ""}`,
|
|
26816
27405
|
`\u{1F4CA} ${items.length} Harnesses \xB7 ${supported.length} with native MCP injection \xB7 ${uniqueServers.size} unique MCPs (${totalServersCount} instances)${totalNativeCount ? ` \xB7 ${totalNativeCount} active native connections` : ""}`
|
|
26817
27406
|
));
|
|
26818
27407
|
statsBar.append(statsSummary);
|
|
26819
|
-
const toolbar =
|
|
27408
|
+
const toolbar = el2("div");
|
|
26820
27409
|
toolbar.className = "settings-integrations-toolbar";
|
|
26821
|
-
const searchInput =
|
|
27410
|
+
const searchInput = el2("input");
|
|
26822
27411
|
searchInput.type = "search";
|
|
26823
27412
|
searchInput.placeholder = tr("\u6309\u540D\u79F0\u3001\u547D\u4EE4\u6216 URL \u8FC7\u6EE4 MCP \u670D\u52A1\u5668\u2026", "Filter MCP servers by name, command, or URL\u2026");
|
|
26824
27413
|
searchInput.setAttribute("aria-label", searchInput.placeholder);
|
|
26825
|
-
const tabsWrap =
|
|
27414
|
+
const tabsWrap = el2("div");
|
|
26826
27415
|
tabsWrap.className = "settings-skills-tabs settings-mcp-tabs";
|
|
26827
|
-
const btnByHarness =
|
|
27416
|
+
const btnByHarness = el2("button", tr("\u6309 Harness \u67E5\u770B", "By Harness"));
|
|
26828
27417
|
btnByHarness.type = "button";
|
|
26829
27418
|
btnByHarness.className = "settings-skills-tab-btn";
|
|
26830
27419
|
btnByHarness.dataset.active = "true";
|
|
26831
|
-
const btnByServer =
|
|
27420
|
+
const btnByServer = el2("button", tr("\u6309 Server \u6C47\u603B", "By Server"));
|
|
26832
27421
|
btnByServer.type = "button";
|
|
26833
27422
|
btnByServer.className = "settings-skills-tab-btn";
|
|
26834
27423
|
tabsWrap.append(btnByHarness, btnByServer);
|
|
@@ -26836,14 +27425,14 @@ ${error51.stderrTail}`] : []
|
|
|
26836
27425
|
showMcpDistributeDialog(supported.map((i) => i.harness));
|
|
26837
27426
|
}, true);
|
|
26838
27427
|
toolbar.append(searchInput, tabsWrap, distributeBtn);
|
|
26839
|
-
const viewsContainer =
|
|
27428
|
+
const viewsContainer = el2("div");
|
|
26840
27429
|
viewsContainer.className = "settings-skills-views settings-mcp-views";
|
|
26841
27430
|
let activeTab = "harness";
|
|
26842
27431
|
const updateView = () => {
|
|
26843
27432
|
viewsContainer.replaceChildren();
|
|
26844
27433
|
const query = searchInput.value.trim().toLowerCase();
|
|
26845
27434
|
if (activeTab === "harness") {
|
|
26846
|
-
const grid =
|
|
27435
|
+
const grid = el2("div");
|
|
26847
27436
|
grid.className = "settings-skills-overview-grid settings-mcp-overview-grid";
|
|
26848
27437
|
for (const item of items) {
|
|
26849
27438
|
const allServers = item.snapshot?.servers || [];
|
|
@@ -26857,70 +27446,70 @@ ${error51.stderrTail}`] : []
|
|
|
26857
27446
|
if (query && !item.harness.name.toLowerCase().includes(query) && matchingServers.length === 0 && matchingNative.length === 0) {
|
|
26858
27447
|
continue;
|
|
26859
27448
|
}
|
|
26860
|
-
const card =
|
|
27449
|
+
const card = el2("section");
|
|
26861
27450
|
card.className = "settings-skills-harness-card settings-mcp-harness-card";
|
|
26862
|
-
const head =
|
|
27451
|
+
const head = el2("div");
|
|
26863
27452
|
head.className = "settings-skills-harness-head settings-mcp-harness-head";
|
|
26864
|
-
const hTitle =
|
|
26865
|
-
const badge =
|
|
27453
|
+
const hTitle = el2("strong", item.harness.name);
|
|
27454
|
+
const badge = el2("span");
|
|
26866
27455
|
badge.className = `settings-skills-badge ${item.harness.mcp ? "settings-skills-badge--active" : ""}`;
|
|
26867
27456
|
badge.textContent = item.harness.mcp ? tr(`${allServers.length} \u4E2A MCP`, `${allServers.length} MCPs`) : tr("\u672A\u63D0\u4F9B MCP \u63A5\u53E3", "No native MCP interface");
|
|
26868
27457
|
head.append(hTitle, badge);
|
|
26869
27458
|
card.append(head);
|
|
26870
27459
|
if (!item.harness.mcp) {
|
|
26871
|
-
const note2 =
|
|
27460
|
+
const note2 = el2("p", tr("\u6B64 Harness \u5C1A\u65E0\u5DF2\u786E\u8BA4\u7684 MCP \u914D\u7F6E\u63A5\u53E3\u3002", "This Harness has no verified MCP configuration interface."));
|
|
26872
27461
|
note2.className = "settings-mcp-notice";
|
|
26873
27462
|
card.append(note2);
|
|
26874
27463
|
} else if (item.error) {
|
|
26875
|
-
const errNote =
|
|
27464
|
+
const errNote = el2("p", item.error);
|
|
26876
27465
|
errNote.className = "settings-mcp-notice";
|
|
26877
27466
|
errNote.style.color = "#ef4444";
|
|
26878
27467
|
card.append(errNote);
|
|
26879
27468
|
} else {
|
|
26880
27469
|
if (matchingNative.length > 0) {
|
|
26881
|
-
const nativeBox =
|
|
27470
|
+
const nativeBox = el2("div");
|
|
26882
27471
|
nativeBox.className = "settings-mcp-native-box";
|
|
26883
|
-
const nativeTitle =
|
|
27472
|
+
const nativeTitle = el2("div");
|
|
26884
27473
|
nativeTitle.className = "settings-mcp-native-title";
|
|
26885
27474
|
nativeTitle.textContent = tr(`\u{1F7E2} \u539F\u751F\u8FD0\u884C\u65F6\u6D3B\u8DC3 (${matchingNative.length})`, `\u{1F7E2} Active Native Sessions (${matchingNative.length})`);
|
|
26886
27475
|
nativeBox.append(nativeTitle);
|
|
26887
27476
|
for (const n of matchingNative) {
|
|
26888
|
-
const nRow =
|
|
27477
|
+
const nRow = el2("div");
|
|
26889
27478
|
nRow.className = "settings-mcp-native-item";
|
|
26890
|
-
const nHeader =
|
|
27479
|
+
const nHeader = el2("div");
|
|
26891
27480
|
nHeader.append(
|
|
26892
|
-
|
|
26893
|
-
|
|
27481
|
+
el2("strong", n.name || n.sessionId),
|
|
27482
|
+
el2("span", ` \xB7 ${n.status}${n.tools?.length ? ` \xB7 ${n.tools.length} ${tr("\u5DE5\u5177", "tools")}` : ""}`)
|
|
26894
27483
|
);
|
|
26895
27484
|
nRow.append(nHeader);
|
|
26896
27485
|
if (n.tools?.length) {
|
|
26897
27486
|
const toolPreview = n.tools.slice(0, 4).join(", ") + (n.tools.length > 4 ? ` +${n.tools.length - 4}` : "");
|
|
26898
|
-
nRow.append(
|
|
27487
|
+
nRow.append(el2("code", toolPreview));
|
|
26899
27488
|
}
|
|
26900
27489
|
nativeBox.append(nRow);
|
|
26901
27490
|
}
|
|
26902
27491
|
card.append(nativeBox);
|
|
26903
27492
|
}
|
|
26904
27493
|
if (matchingServers.length === 0) {
|
|
26905
|
-
const empty =
|
|
27494
|
+
const empty = el2("p", query ? tr("\u65E0\u5339\u914D MCP \u670D\u52A1\u5668", "No matching MCP servers") : tr("\u6682\u672A\u914D\u7F6E MCP \u670D\u52A1\u5668", "No MCP servers configured"));
|
|
26906
27495
|
empty.className = "settings-mcp-notice";
|
|
26907
27496
|
card.append(empty);
|
|
26908
27497
|
} else {
|
|
26909
|
-
const list =
|
|
27498
|
+
const list = el2("div");
|
|
26910
27499
|
list.className = "settings-skills-list-compact settings-mcp-list-compact";
|
|
26911
27500
|
for (const s of matchingServers) {
|
|
26912
|
-
const row =
|
|
27501
|
+
const row = el2("div");
|
|
26913
27502
|
row.className = "settings-skills-item-row settings-mcp-item-row";
|
|
26914
27503
|
const isHttp = s.transportType === "streamable_http" || !!s.url;
|
|
26915
27504
|
const summary = isHttp ? s.url || "" : [s.command, ...s.args || []].filter(Boolean).join(" ");
|
|
26916
27505
|
const stateText = !s.effective ? tr(" \xB7 \u88AB\u9879\u76EE\u8986\u76D6", " \xB7 Overridden") : !s.enabled ? tr(" \xB7 \u5DF2\u505C\u7528", " \xB7 Disabled") : s.appliedSessions ? tr(` \xB7 \u4F20\u5165 ${s.appliedSessions} \u4F1A\u8BDD`, ` \xB7 ${s.appliedSessions} sessions`) : tr(" \xB7 \u5DF2\u914D\u7F6E", " \xB7 Configured");
|
|
26917
|
-
const info =
|
|
27506
|
+
const info = el2("div");
|
|
26918
27507
|
info.append(
|
|
26919
|
-
|
|
26920
|
-
|
|
26921
|
-
|
|
27508
|
+
el2("strong", `${s.name}${isHttp ? " [HTTP]" : " [stdio]"}`),
|
|
27509
|
+
el2("span", stateText),
|
|
27510
|
+
el2("code", summary)
|
|
26922
27511
|
);
|
|
26923
|
-
const actions =
|
|
27512
|
+
const actions = el2("div");
|
|
26924
27513
|
actions.className = "settings-skills-item-actions settings-mcp-item-actions";
|
|
26925
27514
|
actions.append(button(s.enabled ? tr("\u505C\u7528", "Disable") : tr("\u542F\u7528", "Enable"), () => {
|
|
26926
27515
|
void mutateCustom(async (c) => {
|
|
@@ -26952,7 +27541,7 @@ ${error51.stderrTail}`] : []
|
|
|
26952
27541
|
}
|
|
26953
27542
|
card.append(list);
|
|
26954
27543
|
}
|
|
26955
|
-
const cardFooter =
|
|
27544
|
+
const cardFooter = el2("div");
|
|
26956
27545
|
cardFooter.className = "settings-mcp-card-footer";
|
|
26957
27546
|
const addBtn = button(tr("\uFF0B \u6DFB\u52A0 MCP", "\uFF0B Add MCP"), () => {
|
|
26958
27547
|
editInHarness(item.harness.id, "__new__");
|
|
@@ -26964,7 +27553,7 @@ ${error51.stderrTail}`] : []
|
|
|
26964
27553
|
}
|
|
26965
27554
|
viewsContainer.append(grid);
|
|
26966
27555
|
} else {
|
|
26967
|
-
const matrixList =
|
|
27556
|
+
const matrixList = el2("div");
|
|
26968
27557
|
matrixList.className = "settings-skills-matrix-list settings-mcp-matrix-list";
|
|
26969
27558
|
let matchedCount = 0;
|
|
26970
27559
|
for (const [serverName, installations] of uniqueServers.entries()) {
|
|
@@ -26975,38 +27564,38 @@ ${error51.stderrTail}`] : []
|
|
|
26975
27564
|
continue;
|
|
26976
27565
|
}
|
|
26977
27566
|
matchedCount++;
|
|
26978
|
-
const card =
|
|
27567
|
+
const card = el2("section");
|
|
26979
27568
|
card.className = "settings-skills-matrix-card settings-mcp-matrix-card";
|
|
26980
|
-
const head =
|
|
27569
|
+
const head = el2("div");
|
|
26981
27570
|
head.className = "settings-skills-matrix-head settings-mcp-matrix-head";
|
|
26982
|
-
const titleWrap =
|
|
27571
|
+
const titleWrap = el2("div");
|
|
26983
27572
|
titleWrap.style.display = "flex";
|
|
26984
27573
|
titleWrap.style.alignItems = "center";
|
|
26985
27574
|
titleWrap.style.gap = "8px";
|
|
26986
|
-
titleWrap.append(
|
|
27575
|
+
titleWrap.append(el2("strong", serverName), el2("span", `[${isHttp ? "HTTP" : "stdio"}]`));
|
|
26987
27576
|
head.append(
|
|
26988
27577
|
titleWrap,
|
|
26989
|
-
|
|
27578
|
+
el2("span", tr(`\u5DF2\u5728 ${installations.length} \u4E2A Harness \u914D\u7F6E`, `Configured in ${installations.length} harnesses`))
|
|
26990
27579
|
);
|
|
26991
|
-
const codeSummary =
|
|
27580
|
+
const codeSummary = el2("code");
|
|
26992
27581
|
codeSummary.style.fontSize = "11px";
|
|
26993
27582
|
codeSummary.style.color = "var(--settings-muted)";
|
|
26994
27583
|
codeSummary.style.overflowWrap = "anywhere";
|
|
26995
27584
|
codeSummary.textContent = summary;
|
|
26996
|
-
const tags =
|
|
27585
|
+
const tags = el2("div");
|
|
26997
27586
|
tags.className = "settings-skills-tags settings-mcp-tags";
|
|
26998
27587
|
for (const inst of installations) {
|
|
26999
|
-
const tag =
|
|
27588
|
+
const tag = el2("span");
|
|
27000
27589
|
tag.className = `settings-skills-tag settings-mcp-tag ${inst.server.enabled ? "" : "settings-mcp-tag--disabled"}`;
|
|
27001
27590
|
tag.textContent = `\u2713 ${inst.harness.name}${inst.server.enabled ? "" : tr(" (\u5DF2\u505C\u7528)", " (disabled)")}`;
|
|
27002
27591
|
tags.append(tag);
|
|
27003
27592
|
}
|
|
27004
27593
|
const installedIds = new Set(installations.map((i) => i.harness.id));
|
|
27005
27594
|
const missingHarnesses = supported.filter((h) => !installedIds.has(h.harness.id));
|
|
27006
|
-
const syncRow =
|
|
27595
|
+
const syncRow = el2("div");
|
|
27007
27596
|
syncRow.className = "settings-skills-sync-actions settings-mcp-sync-actions";
|
|
27008
27597
|
if (missingHarnesses.length > 0) {
|
|
27009
|
-
const label =
|
|
27598
|
+
const label = el2("span", tr("\u672A\u914D\u7F6E\u4E8E\uFF1A", "Not configured in: "));
|
|
27010
27599
|
label.style.fontSize = "11px";
|
|
27011
27600
|
label.style.color = "var(--settings-muted)";
|
|
27012
27601
|
syncRow.append(label);
|
|
@@ -27050,7 +27639,7 @@ ${error51.stderrTail}`] : []
|
|
|
27050
27639
|
syncRow.append(installAllBtn);
|
|
27051
27640
|
}
|
|
27052
27641
|
} else {
|
|
27053
|
-
const complete =
|
|
27642
|
+
const complete = el2("span", tr("\u2713 \u5DF2\u5728\u6240\u6709\u652F\u6301\u7684 Harness \u4E2D\u914D\u7F6E\u5C31\u7EEA", "\u2713 Ready across all supported Harnesses"));
|
|
27054
27643
|
complete.style.fontSize = "11px";
|
|
27055
27644
|
complete.style.color = "#10a37f";
|
|
27056
27645
|
syncRow.append(complete);
|
|
@@ -27059,7 +27648,7 @@ ${error51.stderrTail}`] : []
|
|
|
27059
27648
|
matrixList.append(card);
|
|
27060
27649
|
}
|
|
27061
27650
|
if (matchedCount === 0) {
|
|
27062
|
-
const empty =
|
|
27651
|
+
const empty = el2("div", tr("\u672A\u5339\u914D\u5230\u4EFB\u4F55 MCP \u670D\u52A1\u5668\u3002", "No MCP servers matched the search."));
|
|
27063
27652
|
empty.className = "settings-integrations-empty";
|
|
27064
27653
|
matrixList.append(empty);
|
|
27065
27654
|
}
|
|
@@ -27090,31 +27679,31 @@ ${error51.stderrTail}`] : []
|
|
|
27090
27679
|
fail(new Error(tr("\u6CA1\u6709\u5176\u4ED6\u652F\u6301\u6280\u80FD\u7684\u539F\u751F Harness \u53EF\u4F9B\u540C\u6B65\u3002", "No other native Harnesses support skills for sync.")));
|
|
27091
27680
|
return;
|
|
27092
27681
|
}
|
|
27093
|
-
const modal =
|
|
27682
|
+
const modal = el2("dialog");
|
|
27094
27683
|
modal.className = "settings-skills-sync-modal";
|
|
27095
|
-
const mTitle =
|
|
27096
|
-
const mDesc =
|
|
27097
|
-
const form =
|
|
27098
|
-
const checkList =
|
|
27684
|
+
const mTitle = el2("h3", tr(`\u540C\u6B65\u6280\u80FD\u3010${skill.name}\u3011`, `Sync skill [${skill.name}]`));
|
|
27685
|
+
const mDesc = el2("p", tr(`\u4ECE ${sourceHarness.name} \u590D\u5236\u8BE5\u6280\u80FD\u5230\u4EE5\u4E0B\u9009\u4E2D\u7684 Harness\uFF1A`, `Copy skill from ${sourceHarness.name} to selected Harnesses:`));
|
|
27686
|
+
const form = el2("form");
|
|
27687
|
+
const checkList = el2("div");
|
|
27099
27688
|
checkList.style.display = "grid";
|
|
27100
27689
|
checkList.style.gap = "8px";
|
|
27101
27690
|
checkList.style.margin = "12px 0";
|
|
27102
27691
|
const checkboxes = [];
|
|
27103
27692
|
for (const h of targetHarnesses) {
|
|
27104
|
-
const label =
|
|
27693
|
+
const label = el2("label");
|
|
27105
27694
|
label.style.display = "flex";
|
|
27106
27695
|
label.style.gap = "8px";
|
|
27107
27696
|
label.style.alignItems = "center";
|
|
27108
27697
|
label.style.cursor = "pointer";
|
|
27109
|
-
const cb =
|
|
27698
|
+
const cb = el2("input");
|
|
27110
27699
|
cb.type = "checkbox";
|
|
27111
27700
|
cb.value = h.id;
|
|
27112
27701
|
cb.checked = true;
|
|
27113
27702
|
checkboxes.push(cb);
|
|
27114
|
-
label.append(cb,
|
|
27703
|
+
label.append(cb, el2("span", h.name));
|
|
27115
27704
|
checkList.append(label);
|
|
27116
27705
|
}
|
|
27117
|
-
const btnRow =
|
|
27706
|
+
const btnRow = el2("div");
|
|
27118
27707
|
btnRow.style.display = "flex";
|
|
27119
27708
|
btnRow.style.gap = "8px";
|
|
27120
27709
|
btnRow.style.justifyContent = "flex-end";
|
|
@@ -27162,20 +27751,20 @@ ${error51.stderrTail}`] : []
|
|
|
27162
27751
|
modal.showModal();
|
|
27163
27752
|
};
|
|
27164
27753
|
const renderSkills = (snapshot) => {
|
|
27165
|
-
const drop =
|
|
27754
|
+
const drop = el2("div");
|
|
27166
27755
|
drop.className = "settings-skill-dropzone";
|
|
27167
27756
|
drop.tabIndex = 0;
|
|
27168
27757
|
drop.setAttribute("role", "button");
|
|
27169
|
-
const dropTitle =
|
|
27170
|
-
const dropHint =
|
|
27171
|
-
const picker =
|
|
27758
|
+
const dropTitle = el2("strong", tr("\u62D6\u62FD\u6280\u80FD\u5230\u8FD9\u91CC", "Drop a skill here"));
|
|
27759
|
+
const dropHint = el2("span", tr("\u652F\u6301\u5355\u4E2A Markdown \u6587\u4EF6\u6216\u5305\u542B SKILL.md \u7684\u6587\u4EF6\u5939 \xB7 \u6700\u5927 10 MB / 500 \u4E2A\u6587\u4EF6", "Supports one Markdown file or a folder containing SKILL.md \xB7 up to 10 MB / 500 files"));
|
|
27760
|
+
const picker = el2("input");
|
|
27172
27761
|
picker.type = "file";
|
|
27173
27762
|
picker.multiple = true;
|
|
27174
27763
|
picker.hidden = true;
|
|
27175
27764
|
picker.setAttribute("webkitdirectory", "");
|
|
27176
27765
|
const choose = button(tr("\u9009\u62E9\u6280\u80FD\u6587\u4EF6\u5939", "Choose skill folder"), () => picker.click());
|
|
27177
27766
|
drop.append(dropTitle, dropHint, choose, picker);
|
|
27178
|
-
const list =
|
|
27767
|
+
const list = el2("div");
|
|
27179
27768
|
list.className = "settings-integrations-list";
|
|
27180
27769
|
const installFiles = async (incoming) => {
|
|
27181
27770
|
const parsed = await parseDroppedSkills(incoming);
|
|
@@ -27217,17 +27806,17 @@ ${error51.stderrTail}`] : []
|
|
|
27217
27806
|
dropHint.textContent = tr("\u6B64 Harness \u7684\u539F\u751F\u6280\u80FD\u76EE\u5F55\u5C1A\u672A\u786E\u8BA4\u3002", "This Harness has no verified native skill directory.");
|
|
27218
27807
|
}
|
|
27219
27808
|
for (const skill of snapshot.skills) {
|
|
27220
|
-
const row =
|
|
27809
|
+
const row = el2("section");
|
|
27221
27810
|
row.className = "settings-integrations-row";
|
|
27222
|
-
const detail =
|
|
27223
|
-
detail.append(
|
|
27811
|
+
const detail = el2("div");
|
|
27812
|
+
detail.append(el2("strong", skill.name), el2("p", skill.enabled ? tr("\u5DF2\u5B89\u88C5 \xB7 \u52A0\u8F7D\u72B6\u6001\u672A\u62A5\u544A", "Installed \xB7 load status unreported") : tr("\u5DF2\u505C\u7528 \xB7 \u6587\u4EF6\u5DF2\u4FDD\u7559", "Disabled \xB7 files retained")), el2("code", skill.path));
|
|
27224
27813
|
row.append(detail);
|
|
27225
27814
|
if (skill.writable) {
|
|
27226
27815
|
row.append(button(skill.enabled ? tr("\u505C\u7528", "Disable") : tr("\u6062\u590D", "Restore"), () => {
|
|
27227
27816
|
void mutate((value, selected) => value.changeSkill({ ...selected, name: skill.name, root: skill.root, action: skill.enabled ? "disable" : "enable" }));
|
|
27228
27817
|
}));
|
|
27229
27818
|
} else {
|
|
27230
|
-
row.append(
|
|
27819
|
+
row.append(el2("span", tr("\u94FE\u63A5\u76EE\u5F55\uFF0C\u53EA\u8BFB", "Linked directory, read-only")));
|
|
27231
27820
|
}
|
|
27232
27821
|
const syncBtn = button(tr("\u540C\u6B65\u5230\u2026", "Sync to\u2026"), () => {
|
|
27233
27822
|
void lifecycle.runLatest(() => client().integrationCatalog(), {
|
|
@@ -27242,35 +27831,35 @@ ${error51.stderrTail}`] : []
|
|
|
27242
27831
|
list.append(row);
|
|
27243
27832
|
}
|
|
27244
27833
|
if (!snapshot.skills.length) {
|
|
27245
|
-
const empty =
|
|
27834
|
+
const empty = el2("div", tr("\u8FD8\u6CA1\u6709\u53D1\u73B0\u6280\u80FD\u3002\u62D6\u5165\u6587\u4EF6\u5373\u53EF\u5B89\u88C5\u3002", "No skills found. Drop files above to install one."));
|
|
27246
27835
|
empty.className = "settings-integrations-empty";
|
|
27247
27836
|
list.append(empty);
|
|
27248
27837
|
}
|
|
27249
27838
|
body.append(drop, list);
|
|
27250
27839
|
};
|
|
27251
27840
|
const renderSkillsOverview = (catalog, items) => {
|
|
27252
|
-
const drop =
|
|
27841
|
+
const drop = el2("div");
|
|
27253
27842
|
drop.className = "settings-skill-dropzone";
|
|
27254
27843
|
drop.tabIndex = 0;
|
|
27255
27844
|
drop.setAttribute("role", "button");
|
|
27256
|
-
const dropTitle =
|
|
27257
|
-
const dropHint =
|
|
27258
|
-
const targetRow =
|
|
27845
|
+
const dropTitle = el2("strong", tr("\u62D6\u62FD\u6280\u80FD\u5230\u8FD9\u91CC\uFF0C\u4E00\u952E\u5206\u53D1\u5B89\u88C5", "Drop a skill here to distribute and install"));
|
|
27846
|
+
const dropHint = el2("span", tr("\u652F\u6301\u5355\u4E2A Markdown \u6587\u4EF6\u6216\u5305\u542B SKILL.md \u7684\u6587\u4EF6\u5939 \xB7 \u81EA\u52A8\u5B89\u88C5\u81F3\u6240\u9009 Harness", "Supports one Markdown file or folder with SKILL.md \xB7 Installs to target Harnesses"));
|
|
27847
|
+
const targetRow = el2("div");
|
|
27259
27848
|
targetRow.className = "settings-skills-target-row";
|
|
27260
|
-
const targetLabel =
|
|
27261
|
-
const targetSelect =
|
|
27849
|
+
const targetLabel = el2("span", tr("\u5B89\u88C5\u76EE\u6807\uFF1A", "Target: "));
|
|
27850
|
+
const targetSelect = el2("select");
|
|
27262
27851
|
targetSelect.setAttribute("aria-label", tr("\u9009\u62E9\u76EE\u6807 Harness", "Select target Harness"));
|
|
27263
|
-
const allOption =
|
|
27852
|
+
const allOption = el2("option", tr("\u5168\u90E8\u652F\u6301\u7684 Harness", "All supported Harnesses"));
|
|
27264
27853
|
allOption.value = "__all__";
|
|
27265
27854
|
targetSelect.append(allOption);
|
|
27266
27855
|
for (const item of items) {
|
|
27267
27856
|
if (item.harness.skills) {
|
|
27268
|
-
const opt =
|
|
27857
|
+
const opt = el2("option", item.harness.name);
|
|
27269
27858
|
opt.value = item.harness.id;
|
|
27270
27859
|
targetSelect.append(opt);
|
|
27271
27860
|
}
|
|
27272
27861
|
}
|
|
27273
|
-
const picker =
|
|
27862
|
+
const picker = el2("input");
|
|
27274
27863
|
picker.type = "file";
|
|
27275
27864
|
picker.multiple = true;
|
|
27276
27865
|
picker.hidden = true;
|
|
@@ -27346,38 +27935,38 @@ ${error51.stderrTail}`] : []
|
|
|
27346
27935
|
uniqueSkills.set(s.name, list);
|
|
27347
27936
|
}
|
|
27348
27937
|
}
|
|
27349
|
-
const statsBar =
|
|
27938
|
+
const statsBar = el2("div");
|
|
27350
27939
|
statsBar.className = "settings-skills-overview-stats";
|
|
27351
|
-
const statsSummary =
|
|
27940
|
+
const statsSummary = el2("span", tr(
|
|
27352
27941
|
`\u{1F4CA} \u5171 ${items.length} \u4E2A Harness \xB7 ${supported.length} \u4E2A\u5DF2\u914D\u7F6E\u539F\u751F\u6280\u80FD\u76EE\u5F55 \xB7 \u53D1\u73B0 ${uniqueSkills.size} \u4E2A\u53BB\u91CD\u6280\u80FD`,
|
|
27353
27942
|
`\u{1F4CA} ${items.length} Harnesses \xB7 ${supported.length} with native skills \xB7 ${uniqueSkills.size} unique skills found`
|
|
27354
27943
|
));
|
|
27355
27944
|
statsBar.append(statsSummary);
|
|
27356
|
-
const toolbar =
|
|
27945
|
+
const toolbar = el2("div");
|
|
27357
27946
|
toolbar.className = "settings-integrations-toolbar";
|
|
27358
|
-
const searchInput =
|
|
27947
|
+
const searchInput = el2("input");
|
|
27359
27948
|
searchInput.type = "search";
|
|
27360
27949
|
searchInput.placeholder = tr("\u6309\u540D\u79F0\u8FC7\u6EE4\u6280\u80FD\u2026", "Filter skills by name\u2026");
|
|
27361
27950
|
searchInput.setAttribute("aria-label", searchInput.placeholder);
|
|
27362
|
-
const tabsWrap =
|
|
27951
|
+
const tabsWrap = el2("div");
|
|
27363
27952
|
tabsWrap.className = "settings-skills-tabs";
|
|
27364
|
-
const btnByHarness =
|
|
27953
|
+
const btnByHarness = el2("button", tr("\u6309 Harness \u67E5\u770B", "By Harness"));
|
|
27365
27954
|
btnByHarness.type = "button";
|
|
27366
27955
|
btnByHarness.className = "settings-skills-tab-btn";
|
|
27367
27956
|
btnByHarness.dataset.active = "true";
|
|
27368
|
-
const btnBySkill =
|
|
27957
|
+
const btnBySkill = el2("button", tr("\u6309 Skill \u6C47\u603B", "By Skill"));
|
|
27369
27958
|
btnBySkill.type = "button";
|
|
27370
27959
|
btnBySkill.className = "settings-skills-tab-btn";
|
|
27371
27960
|
tabsWrap.append(btnByHarness, btnBySkill);
|
|
27372
27961
|
toolbar.append(searchInput, tabsWrap);
|
|
27373
|
-
const viewsContainer =
|
|
27962
|
+
const viewsContainer = el2("div");
|
|
27374
27963
|
viewsContainer.className = "settings-skills-views";
|
|
27375
27964
|
let activeTab = "harness";
|
|
27376
27965
|
const updateView = () => {
|
|
27377
27966
|
viewsContainer.replaceChildren();
|
|
27378
27967
|
const query = searchInput.value.trim().toLowerCase();
|
|
27379
27968
|
if (activeTab === "harness") {
|
|
27380
|
-
const grid =
|
|
27969
|
+
const grid = el2("div");
|
|
27381
27970
|
grid.className = "settings-skills-overview-grid";
|
|
27382
27971
|
for (const item of items) {
|
|
27383
27972
|
const allSkills = item.snapshot?.skills || [];
|
|
@@ -27385,37 +27974,37 @@ ${error51.stderrTail}`] : []
|
|
|
27385
27974
|
if (query && !item.harness.name.toLowerCase().includes(query) && matchingSkills.length === 0) {
|
|
27386
27975
|
continue;
|
|
27387
27976
|
}
|
|
27388
|
-
const card =
|
|
27977
|
+
const card = el2("section");
|
|
27389
27978
|
card.className = "settings-skills-harness-card";
|
|
27390
|
-
const head =
|
|
27979
|
+
const head = el2("div");
|
|
27391
27980
|
head.className = "settings-skills-harness-head";
|
|
27392
|
-
const hTitle =
|
|
27393
|
-
const badge =
|
|
27981
|
+
const hTitle = el2("strong", item.harness.name);
|
|
27982
|
+
const badge = el2("span");
|
|
27394
27983
|
badge.className = `settings-skills-badge ${item.harness.skills ? "settings-skills-badge--active" : ""}`;
|
|
27395
27984
|
badge.textContent = item.harness.skills ? tr(`${allSkills.length} \u4E2A\u6280\u80FD`, `${allSkills.length} skills`) : tr("\u672A\u914D\u7F6E\u76EE\u5F55", "No native directory");
|
|
27396
27985
|
head.append(hTitle, badge);
|
|
27397
27986
|
card.append(head);
|
|
27398
27987
|
if (!item.harness.skills) {
|
|
27399
|
-
const note2 =
|
|
27988
|
+
const note2 = el2("p", tr("\u6B64 Harness \u6682\u672A\u914D\u7F6E\u539F\u751F\u6280\u80FD\u76EE\u5F55\u3002", "This Harness has no verified native skill directory."));
|
|
27400
27989
|
note2.className = "settings-mcp-notice";
|
|
27401
27990
|
card.append(note2);
|
|
27402
27991
|
} else if (matchingSkills.length === 0) {
|
|
27403
|
-
const empty =
|
|
27992
|
+
const empty = el2("p", query ? tr("\u65E0\u5339\u914D\u6280\u80FD", "No matching skills") : tr("\u6682\u672A\u5B89\u88C5\u6280\u80FD", "No skills installed"));
|
|
27404
27993
|
empty.className = "settings-mcp-notice";
|
|
27405
27994
|
card.append(empty);
|
|
27406
27995
|
} else {
|
|
27407
|
-
const list =
|
|
27996
|
+
const list = el2("div");
|
|
27408
27997
|
list.className = "settings-skills-list-compact";
|
|
27409
27998
|
for (const s of matchingSkills) {
|
|
27410
|
-
const row =
|
|
27999
|
+
const row = el2("div");
|
|
27411
28000
|
row.className = "settings-skills-item-row";
|
|
27412
|
-
const info =
|
|
28001
|
+
const info = el2("div");
|
|
27413
28002
|
info.append(
|
|
27414
|
-
|
|
27415
|
-
|
|
27416
|
-
|
|
28003
|
+
el2("strong", s.name),
|
|
28004
|
+
el2("span", s.enabled ? tr(" \xB7 \u5DF2\u5B89\u88C5", " \xB7 Installed") : tr(" \xB7 \u5DF2\u505C\u7528", " \xB7 Disabled")),
|
|
28005
|
+
el2("code", s.path)
|
|
27417
28006
|
);
|
|
27418
|
-
const actions =
|
|
28007
|
+
const actions = el2("div");
|
|
27419
28008
|
actions.className = "settings-skills-item-actions";
|
|
27420
28009
|
if (s.writable) {
|
|
27421
28010
|
actions.append(button(s.enabled ? tr("\u505C\u7528", "Disable") : tr("\u6062\u590D", "Restore"), () => {
|
|
@@ -27449,7 +28038,7 @@ ${error51.stderrTail}`] : []
|
|
|
27449
28038
|
}
|
|
27450
28039
|
viewsContainer.append(grid);
|
|
27451
28040
|
} else {
|
|
27452
|
-
const matrixList =
|
|
28041
|
+
const matrixList = el2("div");
|
|
27453
28042
|
matrixList.className = "settings-skills-matrix-list";
|
|
27454
28043
|
let matchedCount = 0;
|
|
27455
28044
|
for (const [skillName, installations] of uniqueSkills.entries()) {
|
|
@@ -27457,28 +28046,28 @@ ${error51.stderrTail}`] : []
|
|
|
27457
28046
|
continue;
|
|
27458
28047
|
}
|
|
27459
28048
|
matchedCount++;
|
|
27460
|
-
const card =
|
|
28049
|
+
const card = el2("section");
|
|
27461
28050
|
card.className = "settings-skills-matrix-card";
|
|
27462
|
-
const head =
|
|
28051
|
+
const head = el2("div");
|
|
27463
28052
|
head.className = "settings-skills-matrix-head";
|
|
27464
28053
|
head.append(
|
|
27465
|
-
|
|
27466
|
-
|
|
28054
|
+
el2("strong", skillName),
|
|
28055
|
+
el2("span", tr(`\u5DF2\u5728 ${installations.length} \u4E2A Harness \u5B89\u88C5`, `Installed in ${installations.length} harnesses`))
|
|
27467
28056
|
);
|
|
27468
|
-
const tags =
|
|
28057
|
+
const tags = el2("div");
|
|
27469
28058
|
tags.className = "settings-skills-tags";
|
|
27470
28059
|
for (const inst of installations) {
|
|
27471
|
-
const tag =
|
|
28060
|
+
const tag = el2("span");
|
|
27472
28061
|
tag.className = "settings-skills-tag";
|
|
27473
28062
|
tag.textContent = `\u2713 ${inst.harness.name}${inst.skill.enabled ? "" : tr(" (\u5DF2\u505C\u7528)", " (disabled)")}`;
|
|
27474
28063
|
tags.append(tag);
|
|
27475
28064
|
}
|
|
27476
28065
|
const installedIds = new Set(installations.map((i) => i.harness.id));
|
|
27477
28066
|
const missingHarnesses = supported.filter((h) => !installedIds.has(h.harness.id));
|
|
27478
|
-
const syncRow =
|
|
28067
|
+
const syncRow = el2("div");
|
|
27479
28068
|
syncRow.className = "settings-skills-sync-actions";
|
|
27480
28069
|
if (missingHarnesses.length > 0) {
|
|
27481
|
-
const label =
|
|
28070
|
+
const label = el2("span", tr("\u672A\u5B89\u88C5\u4E8E\uFF1A", "Not installed in: "));
|
|
27482
28071
|
label.style.fontSize = "11px";
|
|
27483
28072
|
label.style.color = "var(--settings-muted)";
|
|
27484
28073
|
syncRow.append(label);
|
|
@@ -27528,7 +28117,7 @@ ${error51.stderrTail}`] : []
|
|
|
27528
28117
|
syncRow.append(installAllBtn);
|
|
27529
28118
|
}
|
|
27530
28119
|
} else {
|
|
27531
|
-
const complete =
|
|
28120
|
+
const complete = el2("span", tr("\u5DF2\u5728\u6240\u6709\u652F\u6301\u7684 Harness \u4E2D\u5C31\u7EEA", "Ready across all supported Harnesses"));
|
|
27532
28121
|
complete.style.fontSize = "11px";
|
|
27533
28122
|
complete.style.color = "#10a37f";
|
|
27534
28123
|
syncRow.append(complete);
|
|
@@ -27537,7 +28126,7 @@ ${error51.stderrTail}`] : []
|
|
|
27537
28126
|
matrixList.append(card);
|
|
27538
28127
|
}
|
|
27539
28128
|
if (matchedCount === 0) {
|
|
27540
|
-
const empty =
|
|
28129
|
+
const empty = el2("div", tr("\u672A\u5339\u914D\u5230\u4EFB\u4F55\u6280\u80FD\u3002", "No skills matched the search."));
|
|
27541
28130
|
empty.className = "settings-integrations-empty";
|
|
27542
28131
|
matrixList.append(empty);
|
|
27543
28132
|
}
|
|
@@ -27634,11 +28223,11 @@ ${error51.stderrTail}`] : []
|
|
|
27634
28223
|
void refresh();
|
|
27635
28224
|
}, { signal: lifecycle.signal });
|
|
27636
28225
|
void lifecycle.runLatest(() => client().integrationCatalog(), { success: (data) => {
|
|
27637
|
-
const allOption =
|
|
28226
|
+
const allOption = el2("option", tr("\u5168\u90E8 Harness\uFF08\u603B\u89C8\uFF09", "All Harnesses (Overview)"));
|
|
27638
28227
|
allOption.value = "__all__";
|
|
27639
28228
|
harness.append(allOption);
|
|
27640
28229
|
for (const item of data.harnesses) {
|
|
27641
|
-
const option =
|
|
28230
|
+
const option = el2("option", `${item.name}${item.available ? "" : tr(" \xB7 \u672A\u5C31\u7EEA", " \xB7 not ready")}`);
|
|
27642
28231
|
option.value = item.id;
|
|
27643
28232
|
harness.append(option);
|
|
27644
28233
|
}
|
|
@@ -28951,13 +29540,13 @@ ${error51.stderrTail}`] : []
|
|
|
28951
29540
|
return isRendererSkinId(active) ? active : readRendererSkin(documentSkinStorage(ownerDocument));
|
|
28952
29541
|
}
|
|
28953
29542
|
function skinCss(skin) {
|
|
28954
|
-
const [surface, secondary, accent,
|
|
29543
|
+
const [surface, secondary, accent, text2] = skin.palette;
|
|
28955
29544
|
const image = skin.heroUrl ? `url("${skin.heroUrl}")` : skin.preview;
|
|
28956
29545
|
const sidebarVeil = skin.dark ? `color-mix(in srgb, ${surface} 91%, transparent)` : `color-mix(in srgb, ${surface} 88%, transparent)`;
|
|
28957
29546
|
const lowerVeil = skin.dark ? `color-mix(in srgb, ${surface} 68%, transparent)` : `color-mix(in srgb, ${surface} 72%, transparent)`;
|
|
28958
29547
|
const panelOpacity = skin.dark ? "84%" : "82%";
|
|
28959
|
-
const secondaryText = `color-mix(in srgb, ${
|
|
28960
|
-
const tertiaryText = `color-mix(in srgb, ${
|
|
29548
|
+
const secondaryText = `color-mix(in srgb, ${text2} 72%, transparent)`;
|
|
29549
|
+
const tertiaryText = `color-mix(in srgb, ${text2} 54%, transparent)`;
|
|
28961
29550
|
const logoCss = skin.logoUrl ? `
|
|
28962
29551
|
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] .app-shell-left-panel button[aria-haspopup="menu"][aria-label*="ChatGPT"],
|
|
28963
29552
|
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] .app-shell-left-panel button[aria-haspopup="menu"][aria-label*="Codex"] {
|
|
@@ -28972,7 +29561,7 @@ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] body::after {
|
|
|
28972
29561
|
content: ""; position: fixed; right: clamp(12px, 2vw, 24px); bottom: clamp(72px, 11vh, 108px);
|
|
28973
29562
|
width: clamp(108px, 11.5vw, 168px); aspect-ratio: 2 / 3;
|
|
28974
29563
|
background: url("${skin.polaroidUrl}") center / contain no-repeat;
|
|
28975
|
-
filter: drop-shadow(0 12px 26px color-mix(in srgb, ${
|
|
29564
|
+
filter: drop-shadow(0 12px 26px color-mix(in srgb, ${text2} 24%, transparent));
|
|
28976
29565
|
pointer-events: none; z-index: 15;
|
|
28977
29566
|
}
|
|
28978
29567
|
@media (max-width: 760px) {
|
|
@@ -28984,28 +29573,28 @@ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] {
|
|
|
28984
29573
|
color-scheme: ${skin.dark ? "dark" : "light"};
|
|
28985
29574
|
--codex-titlebar-tint: transparent !important;
|
|
28986
29575
|
--header-tint: transparent !important;
|
|
28987
|
-
--color-text: ${
|
|
28988
|
-
--color-token-foreground: ${
|
|
28989
|
-
--color-text-primary-surface: ${
|
|
28990
|
-
--color-text-primary-soft-alt: ${
|
|
28991
|
-
--color-text-primary-ghost-hover: ${
|
|
28992
|
-
--color-text-primary-outline-hover: ${
|
|
29576
|
+
--color-text: ${text2}; --color-text-primary: ${text2}; --color-token-text-primary: ${text2};
|
|
29577
|
+
--color-token-foreground: ${text2}; --color-text-prose: ${text2}; --color-text-emphasis: ${text2};
|
|
29578
|
+
--color-text-primary-surface: ${text2}; --color-text-primary-soft: ${text2};
|
|
29579
|
+
--color-text-primary-soft-alt: ${text2}; --color-text-primary-ghost: ${text2};
|
|
29580
|
+
--color-text-primary-ghost-hover: ${text2}; --color-text-primary-outline: ${text2};
|
|
29581
|
+
--color-text-primary-outline-hover: ${text2};
|
|
28993
29582
|
--color-text-secondary: ${secondaryText}; --color-token-text-secondary: ${secondaryText};
|
|
28994
29583
|
--color-text-secondary-soft: ${secondaryText}; --color-text-secondary-soft-alt: ${secondaryText};
|
|
28995
|
-
--color-text-secondary-ghost: ${secondaryText}; --color-text-secondary-ghost-hover: ${
|
|
28996
|
-
--color-text-secondary-outline: ${secondaryText}; --color-text-secondary-outline-hover: ${
|
|
29584
|
+
--color-text-secondary-ghost: ${secondaryText}; --color-text-secondary-ghost-hover: ${text2};
|
|
29585
|
+
--color-text-secondary-outline: ${secondaryText}; --color-text-secondary-outline-hover: ${text2};
|
|
28997
29586
|
--color-text-secondary-solid: ${secondaryText};
|
|
28998
29587
|
--color-text-tertiary: ${tertiaryText}; --color-token-text-tertiary: ${tertiaryText};
|
|
28999
29588
|
--color-token-description-foreground: ${tertiaryText};
|
|
29000
|
-
--color-token-dropdown-foreground: ${
|
|
29001
|
-
--app-color-text-foreground: ${
|
|
29589
|
+
--color-token-dropdown-foreground: ${text2};
|
|
29590
|
+
--app-color-text-foreground: ${text2}; --app-color-text-foreground-secondary: ${secondaryText};
|
|
29002
29591
|
--app-color-text-foreground-tertiary: ${tertiaryText};
|
|
29003
|
-
--app-color-foreground-application-menu: ${
|
|
29004
|
-
--app-color-text-button-secondary: ${
|
|
29005
|
-
--wb-text-primary: ${
|
|
29006
|
-
--color-control-thumb-foreground: ${
|
|
29592
|
+
--app-color-foreground-application-menu: ${text2};
|
|
29593
|
+
--app-color-text-button-secondary: ${text2}; --app-color-text-button-tertiary: ${tertiaryText};
|
|
29594
|
+
--wb-text-primary: ${text2}; --wb-text-secondary: ${secondaryText}; --wb-text-tertiary: ${tertiaryText};
|
|
29595
|
+
--color-control-thumb-foreground: ${text2};
|
|
29007
29596
|
--color-text-mode-toggle-inactive: ${secondaryText};
|
|
29008
|
-
--color-text-user-message: ${
|
|
29597
|
+
--color-text-user-message: ${text2} !important;
|
|
29009
29598
|
--color-surface: color-mix(in srgb, ${surface} 92%, transparent);
|
|
29010
29599
|
--color-surface-secondary: color-mix(in srgb, ${surface} 88%, transparent);
|
|
29011
29600
|
--color-surface-tertiary: color-mix(in srgb, ${surface} 94%, transparent);
|
|
@@ -29022,26 +29611,26 @@ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] {
|
|
|
29022
29611
|
--color-background-primary-soft-alpha: color-mix(in srgb, ${surface} 88%, transparent);
|
|
29023
29612
|
--color-background-primary-soft-hover: color-mix(in srgb, ${surface} 80%, ${accent});
|
|
29024
29613
|
--color-background-primary-soft-active: color-mix(in srgb, ${surface} 72%, ${accent});
|
|
29025
|
-
--color-background-primary-ghost-hover: color-mix(in srgb, ${
|
|
29026
|
-
--color-background-secondary-soft: color-mix(in srgb, ${
|
|
29027
|
-
--color-background-secondary-soft-alpha: color-mix(in srgb, ${
|
|
29028
|
-
--color-background-secondary-soft-hover: color-mix(in srgb, ${
|
|
29614
|
+
--color-background-primary-ghost-hover: color-mix(in srgb, ${text2} 8%, transparent);
|
|
29615
|
+
--color-background-secondary-soft: color-mix(in srgb, ${text2} 7%, transparent);
|
|
29616
|
+
--color-background-secondary-soft-alpha: color-mix(in srgb, ${text2} 7%, transparent);
|
|
29617
|
+
--color-background-secondary-soft-hover: color-mix(in srgb, ${text2} 11%, transparent);
|
|
29029
29618
|
--color-background-other-user-message: color-mix(in srgb, ${surface} 76%, transparent);
|
|
29030
29619
|
--color-background-user-message: color-mix(in srgb, ${surface} 92%, transparent) !important;
|
|
29031
29620
|
--color-background-user-message-compact: color-mix(in srgb, ${surface} 88%, transparent);
|
|
29032
|
-
--color-border: color-mix(in srgb, ${
|
|
29033
|
-
--color-border-subtle: color-mix(in srgb, ${
|
|
29034
|
-
--color-border-strong: color-mix(in srgb, ${
|
|
29621
|
+
--color-border: color-mix(in srgb, ${text2} 16%, transparent);
|
|
29622
|
+
--color-border-subtle: color-mix(in srgb, ${text2} 8%, transparent);
|
|
29623
|
+
--color-border-strong: color-mix(in srgb, ${text2} 20%, transparent);
|
|
29035
29624
|
--color-token-main-surface-primary: color-mix(in srgb, ${surface} 92%, transparent);
|
|
29036
29625
|
--color-token-dropdown-background: color-mix(in srgb, ${surface} 96%, transparent);
|
|
29037
|
-
--color-token-list-hover-background: color-mix(in srgb, ${
|
|
29038
|
-
--color-token-border: color-mix(in srgb, ${
|
|
29039
|
-
--color-token-border-default: color-mix(in srgb, ${
|
|
29040
|
-
--color-token-border-light: color-mix(in srgb, ${
|
|
29041
|
-
--color-token-border-heavy: color-mix(in srgb, ${
|
|
29042
|
-
--color-token-input-border: color-mix(in srgb, ${
|
|
29043
|
-
--color-codex-diff-surface: color-mix(in srgb, ${surface} 94%, ${
|
|
29044
|
-
--color-token-diff-surface: color-mix(in srgb, ${surface} 94%, ${
|
|
29626
|
+
--color-token-list-hover-background: color-mix(in srgb, ${text2} 8%, transparent);
|
|
29627
|
+
--color-token-border: color-mix(in srgb, ${text2} 16%, transparent);
|
|
29628
|
+
--color-token-border-default: color-mix(in srgb, ${text2} 16%, transparent);
|
|
29629
|
+
--color-token-border-light: color-mix(in srgb, ${text2} 9%, transparent);
|
|
29630
|
+
--color-token-border-heavy: color-mix(in srgb, ${text2} 22%, transparent);
|
|
29631
|
+
--color-token-input-border: color-mix(in srgb, ${text2} 20%, transparent);
|
|
29632
|
+
--color-codex-diff-surface: color-mix(in srgb, ${surface} 94%, ${text2});
|
|
29633
|
+
--color-token-diff-surface: color-mix(in srgb, ${surface} 94%, ${text2});
|
|
29045
29634
|
--color-codex-editor-inline-code-background: color-mix(in srgb, ${surface} 92%, transparent);
|
|
29046
29635
|
--color-codex-terminal-background: ${surface};
|
|
29047
29636
|
--codex-base-surface: ${surface};
|
|
@@ -29054,41 +29643,41 @@ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] {
|
|
|
29054
29643
|
--app-color-background-elevated-secondary-opaque: ${surface};
|
|
29055
29644
|
--app-color-background-editor-opaque: ${surface};
|
|
29056
29645
|
--app-color-background-application-menu: color-mix(in srgb, ${surface} 96%, transparent);
|
|
29057
|
-
--app-color-background-button-secondary: color-mix(in srgb, ${
|
|
29058
|
-
--app-color-background-button-secondary-hover: color-mix(in srgb, ${
|
|
29059
|
-
--app-color-border: color-mix(in srgb, ${
|
|
29060
|
-
--app-color-border-light: color-mix(in srgb, ${
|
|
29061
|
-
--app-color-border-heavy: color-mix(in srgb, ${
|
|
29646
|
+
--app-color-background-button-secondary: color-mix(in srgb, ${text2} 7%, transparent);
|
|
29647
|
+
--app-color-background-button-secondary-hover: color-mix(in srgb, ${text2} 11%, transparent);
|
|
29648
|
+
--app-color-border: color-mix(in srgb, ${text2} 16%, transparent);
|
|
29649
|
+
--app-color-border-light: color-mix(in srgb, ${text2} 9%, transparent);
|
|
29650
|
+
--app-color-border-heavy: color-mix(in srgb, ${text2} 22%, transparent);
|
|
29062
29651
|
--wb-surface-primary: color-mix(in srgb, ${surface} 92%, transparent);
|
|
29063
29652
|
--wb-surface-secondary: color-mix(in srgb, ${surface} 88%, transparent);
|
|
29064
|
-
--wb-border: color-mix(in srgb, ${
|
|
29065
|
-
--wb-border-hover: color-mix(in srgb, ${
|
|
29066
|
-
--vscode-foreground: ${
|
|
29067
|
-
--vscode-editor-foreground: ${
|
|
29653
|
+
--wb-border: color-mix(in srgb, ${text2} 16%, transparent);
|
|
29654
|
+
--wb-border-hover: color-mix(in srgb, ${text2} 22%, transparent);
|
|
29655
|
+
--vscode-foreground: ${text2}; --vscode-descriptionForeground: ${secondaryText};
|
|
29656
|
+
--vscode-editor-foreground: ${text2}; --vscode-input-foreground: ${text2};
|
|
29068
29657
|
--vscode-editor-background: ${surface}; --vscode-editorPane-background: ${surface};
|
|
29069
29658
|
--vscode-input-background: color-mix(in srgb, ${surface} 96%, transparent);
|
|
29070
29659
|
--vscode-dropdown-background: color-mix(in srgb, ${surface} 96%, transparent);
|
|
29071
29660
|
--vscode-menu-background: color-mix(in srgb, ${surface} 96%, transparent);
|
|
29072
29661
|
--vscode-panel-background: color-mix(in srgb, ${surface} 96%, transparent);
|
|
29073
29662
|
--vscode-terminal-background: ${surface};
|
|
29074
|
-
--vscode-list-hoverBackground: color-mix(in srgb, ${
|
|
29663
|
+
--vscode-list-hoverBackground: color-mix(in srgb, ${text2} 8%, transparent);
|
|
29075
29664
|
--vscode-list-activeSelectionBackground: color-mix(in srgb, ${accent} 24%, transparent);
|
|
29076
|
-
--vscode-list-activeSelectionForeground: ${
|
|
29665
|
+
--vscode-list-activeSelectionForeground: ${text2};
|
|
29077
29666
|
--vscode-list-inactiveSelectionBackground: color-mix(in srgb, ${accent} 16%, transparent);
|
|
29078
|
-
--vscode-list-inactiveSelectionForeground: ${
|
|
29667
|
+
--vscode-list-inactiveSelectionForeground: ${text2};
|
|
29079
29668
|
--background: color-mix(in srgb, ${surface} ${panelOpacity}, transparent);
|
|
29080
|
-
--foreground: ${
|
|
29081
|
-
--card-foreground: ${
|
|
29082
|
-
--popover-foreground: ${
|
|
29083
|
-
--secondary: color-mix(in srgb, ${surface} 82%, ${secondary}); --secondary-foreground: ${
|
|
29669
|
+
--foreground: ${text2}; --card: color-mix(in srgb, ${surface} 88%, transparent);
|
|
29670
|
+
--card-foreground: ${text2}; --popover: color-mix(in srgb, ${surface} 94%, transparent);
|
|
29671
|
+
--popover-foreground: ${text2}; --primary: ${accent}; --primary-foreground: ${surface};
|
|
29672
|
+
--secondary: color-mix(in srgb, ${surface} 82%, ${secondary}); --secondary-foreground: ${text2};
|
|
29084
29673
|
--muted: color-mix(in srgb, ${surface} 88%, ${secondary});
|
|
29085
|
-
--muted-foreground: color-mix(in srgb, ${
|
|
29086
|
-
--accent: color-mix(in srgb, ${surface} 74%, ${accent}); --accent-foreground: ${
|
|
29087
|
-
--border: color-mix(in srgb, ${
|
|
29674
|
+
--muted-foreground: color-mix(in srgb, ${text2} 68%, ${surface});
|
|
29675
|
+
--accent: color-mix(in srgb, ${surface} 74%, ${accent}); --accent-foreground: ${text2};
|
|
29676
|
+
--border: color-mix(in srgb, ${text2} 16%, transparent); --input: color-mix(in srgb, ${text2} 18%, transparent); --ring: ${accent};
|
|
29088
29677
|
--sidebar: color-mix(in srgb, ${surface} 88%, transparent); --sidebar-background: color-mix(in srgb, ${surface} 88%, transparent);
|
|
29089
|
-
--sidebar-foreground: ${
|
|
29090
|
-
--sidebar-accent: color-mix(in srgb, ${surface} 74%, ${accent}); --sidebar-accent-foreground: ${
|
|
29091
|
-
--sidebar-border: color-mix(in srgb, ${
|
|
29678
|
+
--sidebar-foreground: ${text2}; --sidebar-primary: ${accent}; --sidebar-primary-foreground: ${surface};
|
|
29679
|
+
--sidebar-accent: color-mix(in srgb, ${surface} 74%, ${accent}); --sidebar-accent-foreground: ${text2};
|
|
29680
|
+
--sidebar-border: color-mix(in srgb, ${text2} 14%, transparent); --sidebar-ring: ${accent};
|
|
29092
29681
|
--main-surface-primary: color-mix(in srgb, ${surface} 84%, transparent);
|
|
29093
29682
|
--main-surface-secondary: color-mix(in srgb, ${surface} 72%, transparent);
|
|
29094
29683
|
--sidebar-surface-primary: color-mix(in srgb, ${surface} 88%, transparent);
|
|
@@ -29097,10 +29686,10 @@ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] {
|
|
|
29097
29686
|
--composer-surface: color-mix(in srgb, ${surface} 88%, transparent);
|
|
29098
29687
|
}
|
|
29099
29688
|
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] body {
|
|
29100
|
-
color: ${
|
|
29689
|
+
color: ${text2}; background: ${surface} !important;
|
|
29101
29690
|
}
|
|
29102
29691
|
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] body > #root {
|
|
29103
|
-
min-height: 100vh; color: ${
|
|
29692
|
+
min-height: 100vh; color: ${text2} !important;
|
|
29104
29693
|
background-color: transparent !important;
|
|
29105
29694
|
background-image:
|
|
29106
29695
|
linear-gradient(90deg, ${sidebarVeil} 0 22%, transparent 46%),
|
|
@@ -29131,12 +29720,12 @@ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] :where(
|
|
|
29131
29720
|
[data-local-conversation-final-assistant]:not(:has([data-response-annotation-conversation]))
|
|
29132
29721
|
) {
|
|
29133
29722
|
box-sizing: border-box;
|
|
29134
|
-
color: ${
|
|
29723
|
+
color: ${text2} !important;
|
|
29135
29724
|
background: color-mix(in srgb, ${surface} 96%, transparent) !important;
|
|
29136
29725
|
border: 1px solid color-mix(in srgb, ${accent} 16%, transparent) !important;
|
|
29137
29726
|
border-radius: 18px;
|
|
29138
29727
|
padding: 14px 16px 12px;
|
|
29139
|
-
box-shadow: 0 8px 24px color-mix(in srgb, ${
|
|
29728
|
+
box-shadow: 0 8px 24px color-mix(in srgb, ${text2} 8%, transparent) !important;
|
|
29140
29729
|
backdrop-filter: blur(16px) saturate(120%) !important;
|
|
29141
29730
|
}
|
|
29142
29731
|
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] :where(
|
|
@@ -29160,7 +29749,7 @@ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] :where(
|
|
|
29160
29749
|
) {
|
|
29161
29750
|
border: 1px solid color-mix(in srgb, ${accent} 24%, transparent) !important;
|
|
29162
29751
|
border-radius: 12px !important;
|
|
29163
|
-
box-shadow: 0 4px 20px color-mix(in srgb, ${
|
|
29752
|
+
box-shadow: 0 4px 20px color-mix(in srgb, ${text2} 8%, transparent) !important;
|
|
29164
29753
|
overflow: hidden !important;
|
|
29165
29754
|
}
|
|
29166
29755
|
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] :where(
|
|
@@ -29170,7 +29759,7 @@ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] :where(
|
|
|
29170
29759
|
) {
|
|
29171
29760
|
background-color: color-mix(in srgb, ${surface} 98%, transparent) !important;
|
|
29172
29761
|
border-bottom: 2px solid color-mix(in srgb, ${accent} 28%, transparent) !important;
|
|
29173
|
-
color: ${
|
|
29762
|
+
color: ${text2} !important;
|
|
29174
29763
|
font-weight: 600 !important;
|
|
29175
29764
|
padding: 8px 14px !important;
|
|
29176
29765
|
}
|
|
@@ -29180,9 +29769,9 @@ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] :where(
|
|
|
29180
29769
|
[data-response-annotation-conversation] td,
|
|
29181
29770
|
[data-response-annotation-conversation] :where(th, td)
|
|
29182
29771
|
) {
|
|
29183
|
-
border-bottom: 1px solid color-mix(in srgb, ${
|
|
29184
|
-
border-right: 1px solid color-mix(in srgb, ${
|
|
29185
|
-
color: ${
|
|
29772
|
+
border-bottom: 1px solid color-mix(in srgb, ${text2} 12%, transparent) !important;
|
|
29773
|
+
border-right: 1px solid color-mix(in srgb, ${text2} 6%, transparent) !important;
|
|
29774
|
+
color: ${text2} !important;
|
|
29186
29775
|
padding: 8px 14px !important;
|
|
29187
29776
|
}
|
|
29188
29777
|
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] :where(
|
|
@@ -29198,7 +29787,7 @@ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] :where(
|
|
|
29198
29787
|
background-color: color-mix(in srgb, ${accent} 10%, transparent) !important;
|
|
29199
29788
|
}
|
|
29200
29789
|
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] :where(.composer-surface-chrome, [data-user-message-bubble], [data-codex-approval-surface]) {
|
|
29201
|
-
color: ${
|
|
29790
|
+
color: ${text2} !important;
|
|
29202
29791
|
background: color-mix(in srgb, ${surface} 92%, transparent) !important;
|
|
29203
29792
|
border-color: color-mix(in srgb, ${accent} 24%, transparent) !important;
|
|
29204
29793
|
box-shadow: 0 8px 24px color-mix(in srgb, ${accent} 12%, transparent) !important;
|
|
@@ -29213,7 +29802,7 @@ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-user-message-bubble] :where(
|
|
|
29213
29802
|
a,
|
|
29214
29803
|
code
|
|
29215
29804
|
) {
|
|
29216
|
-
color: ${
|
|
29805
|
+
color: ${text2} !important;
|
|
29217
29806
|
}
|
|
29218
29807
|
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] :where(
|
|
29219
29808
|
header,
|
|
@@ -29250,7 +29839,7 @@ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-page-header] > [da
|
|
|
29250
29839
|
border-radius: 0 !important;
|
|
29251
29840
|
box-shadow: none !important;
|
|
29252
29841
|
backdrop-filter: none !important;
|
|
29253
|
-
color: color-mix(in srgb, ${
|
|
29842
|
+
color: color-mix(in srgb, ${text2} 82%, ${accent}) !important;
|
|
29254
29843
|
font-size: 13px !important;
|
|
29255
29844
|
font-weight: 500 !important;
|
|
29256
29845
|
text-shadow: 0 1px 2px color-mix(in srgb, ${surface} 72%, transparent) !important;
|
|
@@ -29268,19 +29857,19 @@ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-page-header] > [da
|
|
|
29268
29857
|
font-size: inherit !important;
|
|
29269
29858
|
font-weight: inherit !important;
|
|
29270
29859
|
}
|
|
29271
|
-
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] header button:not([data-
|
|
29272
|
-
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-pip-obstacle="app-shell-header"] button:not([data-
|
|
29273
|
-
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-obstacle] button:not([data-
|
|
29274
|
-
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-testid="app-shell-header-context-menu-surface"] button:not([data-
|
|
29275
|
-
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-toolbar] button:not([data-
|
|
29276
|
-
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] header [role="button"]:not([data-
|
|
29860
|
+
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] header button:not([data-harnessmix-settings-trigger] *),
|
|
29861
|
+
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-pip-obstacle="app-shell-header"] button:not([data-harnessmix-settings-trigger] *),
|
|
29862
|
+
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-obstacle] button:not([data-harnessmix-settings-trigger] *),
|
|
29863
|
+
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-testid="app-shell-header-context-menu-surface"] button:not([data-harnessmix-settings-trigger] *),
|
|
29864
|
+
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-toolbar] button:not([data-harnessmix-settings-trigger] *),
|
|
29865
|
+
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] header [role="button"]:not([data-harnessmix-settings-trigger] *) {
|
|
29277
29866
|
background: transparent !important;
|
|
29278
29867
|
background-color: transparent !important;
|
|
29279
29868
|
border-color: transparent !important;
|
|
29280
29869
|
box-shadow: none !important;
|
|
29281
29870
|
}
|
|
29282
29871
|
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-page-header] > [data-app-shell-header-toolbar] > button[aria-haspopup="menu"] {
|
|
29283
|
-
color: color-mix(in srgb, ${
|
|
29872
|
+
color: color-mix(in srgb, ${text2} 62%, transparent) !important;
|
|
29284
29873
|
background: transparent !important;
|
|
29285
29874
|
background-color: transparent !important;
|
|
29286
29875
|
border-color: transparent !important;
|
|
@@ -29288,17 +29877,17 @@ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-page-header] > [da
|
|
|
29288
29877
|
filter: none !important;
|
|
29289
29878
|
outline: none !important;
|
|
29290
29879
|
}
|
|
29291
|
-
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] header button:not([data-
|
|
29292
|
-
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-pip-obstacle="app-shell-header"] button:not([data-
|
|
29293
|
-
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-obstacle] button:not([data-
|
|
29294
|
-
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-testid="app-shell-header-context-menu-surface"] button:not([data-
|
|
29295
|
-
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-toolbar] button:not([data-
|
|
29296
|
-
background: color-mix(in srgb, ${
|
|
29297
|
-
background-color: color-mix(in srgb, ${
|
|
29880
|
+
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] header button:not([data-harnessmix-settings-trigger] *):hover,
|
|
29881
|
+
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-pip-obstacle="app-shell-header"] button:not([data-harnessmix-settings-trigger] *):hover,
|
|
29882
|
+
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-obstacle] button:not([data-harnessmix-settings-trigger] *):hover,
|
|
29883
|
+
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-testid="app-shell-header-context-menu-surface"] button:not([data-harnessmix-settings-trigger] *):hover,
|
|
29884
|
+
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-toolbar] button:not([data-harnessmix-settings-trigger] *):hover {
|
|
29885
|
+
background: color-mix(in srgb, ${text2} 12%, transparent) !important;
|
|
29886
|
+
background-color: color-mix(in srgb, ${text2} 12%, transparent) !important;
|
|
29298
29887
|
}
|
|
29299
29888
|
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-page-header] > [data-app-shell-header-toolbar] > button[aria-haspopup="menu"]:hover,
|
|
29300
29889
|
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-page-header] > [data-app-shell-header-toolbar] > button[aria-haspopup="menu"]:focus-visible {
|
|
29301
|
-
color: ${
|
|
29890
|
+
color: ${text2} !important;
|
|
29302
29891
|
background: transparent !important;
|
|
29303
29892
|
background-color: transparent !important;
|
|
29304
29893
|
border-color: transparent !important;
|
|
@@ -29306,17 +29895,17 @@ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-page-header] > [da
|
|
|
29306
29895
|
filter: none !important;
|
|
29307
29896
|
outline: none !important;
|
|
29308
29897
|
}
|
|
29309
|
-
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] header button:not([data-
|
|
29310
|
-
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-pip-obstacle="app-shell-header"] button:not([data-
|
|
29311
|
-
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-obstacle] button:not([data-
|
|
29312
|
-
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-testid="app-shell-header-context-menu-surface"] button:not([data-
|
|
29313
|
-
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-toolbar] button:not([data-
|
|
29314
|
-
background: color-mix(in srgb, ${
|
|
29315
|
-
background-color: color-mix(in srgb, ${
|
|
29898
|
+
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] header button:not([data-harnessmix-settings-trigger] *):active,
|
|
29899
|
+
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-pip-obstacle="app-shell-header"] button:not([data-harnessmix-settings-trigger] *):active,
|
|
29900
|
+
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-obstacle] button:not([data-harnessmix-settings-trigger] *):active,
|
|
29901
|
+
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-testid="app-shell-header-context-menu-surface"] button:not([data-harnessmix-settings-trigger] *):active,
|
|
29902
|
+
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-toolbar] button:not([data-harnessmix-settings-trigger] *):active {
|
|
29903
|
+
background: color-mix(in srgb, ${text2} 18%, transparent) !important;
|
|
29904
|
+
background-color: color-mix(in srgb, ${text2} 18%, transparent) !important;
|
|
29316
29905
|
}
|
|
29317
29906
|
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-page-header] > [data-app-shell-header-toolbar] > button[aria-haspopup="menu"]:active,
|
|
29318
29907
|
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-page-header] > [data-app-shell-header-toolbar] > button[aria-haspopup="menu"][data-state="open"] {
|
|
29319
|
-
color: ${
|
|
29908
|
+
color: ${text2} !important;
|
|
29320
29909
|
background: transparent !important;
|
|
29321
29910
|
background-color: transparent !important;
|
|
29322
29911
|
border-color: transparent !important;
|
|
@@ -29376,17 +29965,17 @@ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-tab-id] :where([class*="max-
|
|
|
29376
29965
|
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-action-sidebar-thread-active="true"] {
|
|
29377
29966
|
background: linear-gradient(90deg, color-mix(in srgb, ${accent} 22%, transparent), color-mix(in srgb, ${secondary} 16%, transparent)) !important;
|
|
29378
29967
|
}
|
|
29379
|
-
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] :where(.border-border, .border-sidebar-border) { border-color: color-mix(in srgb, ${
|
|
29380
|
-
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-
|
|
29968
|
+
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] :where(.border-border, .border-sidebar-border) { border-color: color-mix(in srgb, ${text2} 14%, transparent) !important; }
|
|
29969
|
+
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-harnessmix-settings-shell] {
|
|
29381
29970
|
--settings-bg: color-mix(in srgb, ${surface} 90%, transparent);
|
|
29382
29971
|
--settings-sidebar: color-mix(in srgb, ${surface} 86%, ${secondary});
|
|
29383
29972
|
--settings-panel: color-mix(in srgb, ${surface} 90%, transparent);
|
|
29384
29973
|
--settings-surface: color-mix(in srgb, ${surface} 82%, ${secondary});
|
|
29385
29974
|
--settings-surface-hover: color-mix(in srgb, ${surface} 72%, ${accent});
|
|
29386
29975
|
--settings-inset: color-mix(in srgb, ${surface} 92%, ${secondary});
|
|
29387
|
-
--settings-text: ${
|
|
29388
|
-
--settings-subtle: color-mix(in srgb, ${
|
|
29389
|
-
--settings-border: color-mix(in srgb, ${
|
|
29976
|
+
--settings-text: ${text2}; --settings-muted: color-mix(in srgb, ${text2} 68%, ${surface});
|
|
29977
|
+
--settings-subtle: color-mix(in srgb, ${text2} 52%, ${surface});
|
|
29978
|
+
--settings-border: color-mix(in srgb, ${text2} 14%, transparent); --settings-focus: ${accent};
|
|
29390
29979
|
--settings-primary: ${accent}; --settings-primary-hover: color-mix(in srgb, ${accent} 82%, white);
|
|
29391
29980
|
--settings-primary-text: ${surface};
|
|
29392
29981
|
}
|
|
@@ -29598,6 +30187,9 @@ ${logoCss}${polaroidCss}
|
|
|
29598
30187
|
installedBadge: "Installed",
|
|
29599
30188
|
uninstall: "Uninstall",
|
|
29600
30189
|
uninstalling: "Removing...",
|
|
30190
|
+
retry: "Retry",
|
|
30191
|
+
installFailed: "Install failed",
|
|
30192
|
+
uninstallFailed: "Uninstall failed",
|
|
29601
30193
|
tip: "Select in Appearance > Pets or type /pet to wake",
|
|
29602
30194
|
empty: "No pets match the current filter.",
|
|
29603
30195
|
officialBadge: "Official",
|
|
@@ -29618,6 +30210,9 @@ ${logoCss}${polaroidCss}
|
|
|
29618
30210
|
installedBadge: "\u5DF2\u5B89\u88C5",
|
|
29619
30211
|
uninstall: "\u5378\u8F7D",
|
|
29620
30212
|
uninstalling: "\u5378\u8F7D\u4E2D...",
|
|
30213
|
+
retry: "\u91CD\u8BD5",
|
|
30214
|
+
installFailed: "\u5B89\u88C5\u5931\u8D25",
|
|
30215
|
+
uninstallFailed: "\u5378\u8F7D\u5931\u8D25",
|
|
29621
30216
|
tip: "\u5B89\u88C5\u540E\u5728\u5B98\u65B9\u8BBE\u7F6E\u300C\u5916\u89C2 > \u684C\u5BA0\u300D\u6216\u8F93\u5165 /pet \u6307\u4EE4\u5524\u9192\u4F34\u4FA3",
|
|
29622
30217
|
empty: "\u6CA1\u6709\u627E\u5230\u7B26\u5408\u6761\u4EF6\u7684\u684C\u5BA0\u3002",
|
|
29623
30218
|
officialBadge: "\u5B98\u65B9\u9884\u8F7D",
|
|
@@ -29634,6 +30229,7 @@ ${logoCss}${polaroidCss}
|
|
|
29634
30229
|
element.style.backgroundPosition = "0% 0%";
|
|
29635
30230
|
let currentFrame = 0;
|
|
29636
30231
|
let timer = null;
|
|
30232
|
+
let idleTimeout = null;
|
|
29637
30233
|
let isHovered = false;
|
|
29638
30234
|
const tick = () => {
|
|
29639
30235
|
currentFrame = (currentFrame + 1) % SPRITE_FRAMES;
|
|
@@ -29670,12 +30266,20 @@ ${logoCss}${polaroidCss}
|
|
|
29670
30266
|
const idleInterval = window.setInterval(() => {
|
|
29671
30267
|
if (!isHovered && timer === null) {
|
|
29672
30268
|
startLoop();
|
|
29673
|
-
|
|
30269
|
+
if (idleTimeout !== null) window.clearTimeout(idleTimeout);
|
|
30270
|
+
idleTimeout = window.setTimeout(() => {
|
|
30271
|
+
idleTimeout = null;
|
|
30272
|
+
stopLoop();
|
|
30273
|
+
}, FRAME_DURATION_MS * SPRITE_FRAMES);
|
|
29674
30274
|
}
|
|
29675
30275
|
}, 4e3 + Math.random() * 3e3);
|
|
29676
30276
|
return () => {
|
|
29677
30277
|
stopLoop();
|
|
29678
30278
|
clearInterval(idleInterval);
|
|
30279
|
+
if (idleTimeout !== null) {
|
|
30280
|
+
window.clearTimeout(idleTimeout);
|
|
30281
|
+
idleTimeout = null;
|
|
30282
|
+
}
|
|
29679
30283
|
if (parentCard) {
|
|
29680
30284
|
parentCard.removeEventListener("mouseenter", onMouseEnter);
|
|
29681
30285
|
parentCard.removeEventListener("mouseleave", onMouseLeave);
|
|
@@ -29734,7 +30338,44 @@ ${logoCss}${polaroidCss}
|
|
|
29734
30338
|
context.content.append(heading, intro, safety, toolbar, grid);
|
|
29735
30339
|
let allPets = [];
|
|
29736
30340
|
const imageCache = /* @__PURE__ */ new Map();
|
|
30341
|
+
const petStates = /* @__PURE__ */ new Map();
|
|
30342
|
+
let renderEpoch = 0;
|
|
30343
|
+
const runPetOperation = (pet, op) => {
|
|
30344
|
+
const client2 = getClient();
|
|
30345
|
+
const current = petStates.get(pet.id);
|
|
30346
|
+
if (!client2 || current && current.status !== "failed") return;
|
|
30347
|
+
petStates.set(pet.id, {
|
|
30348
|
+
status: op === "install" ? "installing" : "uninstalling"
|
|
30349
|
+
});
|
|
30350
|
+
renderGrid();
|
|
30351
|
+
const settle = (installed, failure) => {
|
|
30352
|
+
if (failure === null) {
|
|
30353
|
+
petStates.delete(pet.id);
|
|
30354
|
+
} else {
|
|
30355
|
+
petStates.set(pet.id, { status: "failed", op, error: failure });
|
|
30356
|
+
}
|
|
30357
|
+
allPets = allPets.map(
|
|
30358
|
+
(p) => p.id === pet.id ? { ...p, installed } : p
|
|
30359
|
+
);
|
|
30360
|
+
renderGrid();
|
|
30361
|
+
};
|
|
30362
|
+
const onSuccess = () => settle(op === "install", null);
|
|
30363
|
+
const onFailure = (err) => settle(pet.installed, err instanceof Error ? err.message : String(err));
|
|
30364
|
+
if (op === "install") {
|
|
30365
|
+
void client2.install({
|
|
30366
|
+
id: pet.id,
|
|
30367
|
+
displayName: pet.displayName,
|
|
30368
|
+
description: pet.description,
|
|
30369
|
+
spritesheetUrl: pet.spritesheetUrl,
|
|
30370
|
+
spriteVersionNumber: pet.spriteVersionNumber
|
|
30371
|
+
}).then(onSuccess, onFailure);
|
|
30372
|
+
} else {
|
|
30373
|
+
void client2.uninstall(pet.id).then(onSuccess, onFailure);
|
|
30374
|
+
}
|
|
30375
|
+
};
|
|
29737
30376
|
const renderGrid = () => {
|
|
30377
|
+
renderEpoch += 1;
|
|
30378
|
+
const epoch = renderEpoch;
|
|
29738
30379
|
for (const d of disposers) d();
|
|
29739
30380
|
disposers.length = 0;
|
|
29740
30381
|
grid.replaceChildren();
|
|
@@ -29759,55 +30400,17 @@ ${logoCss}${polaroidCss}
|
|
|
29759
30400
|
return;
|
|
29760
30401
|
}
|
|
29761
30402
|
for (const pet of filtered) {
|
|
30403
|
+
const opState = petStates.get(pet.id);
|
|
29762
30404
|
const card = document2.createElement("article");
|
|
29763
30405
|
card.className = "pet-card";
|
|
29764
30406
|
card.dataset.petId = pet.id;
|
|
29765
30407
|
card.dataset.installed = String(pet.installed);
|
|
30408
|
+
if (opState) card.dataset.state = opState.status;
|
|
29766
30409
|
const stage = document2.createElement("div");
|
|
29767
30410
|
stage.className = "pet-card__stage";
|
|
29768
30411
|
const sprite = document2.createElement("div");
|
|
29769
30412
|
sprite.className = "pet-card__sprite";
|
|
29770
30413
|
stage.append(sprite);
|
|
29771
|
-
const client2 = getClient();
|
|
29772
|
-
const cachedImg = imageCache.get(pet.id);
|
|
29773
|
-
if (cachedImg) {
|
|
29774
|
-
const disposeAnim = setupSpriteAnimation(sprite, cachedImg, pet.spriteVersionNumber);
|
|
29775
|
-
disposers.push(disposeAnim);
|
|
29776
|
-
} else if (pet.spritesheetUrl) {
|
|
29777
|
-
imageCache.set(pet.id, pet.spritesheetUrl);
|
|
29778
|
-
const disposeAnim = setupSpriteAnimation(
|
|
29779
|
-
sprite,
|
|
29780
|
-
pet.spritesheetUrl,
|
|
29781
|
-
pet.spriteVersionNumber
|
|
29782
|
-
);
|
|
29783
|
-
disposers.push(disposeAnim);
|
|
29784
|
-
} else if (client2) {
|
|
29785
|
-
void client2.preview(pet.id).then(
|
|
29786
|
-
(res) => {
|
|
29787
|
-
if (res && res.dataBase64) {
|
|
29788
|
-
const dataUrl = `data:${res.mime};base64,${res.dataBase64}`;
|
|
29789
|
-
imageCache.set(pet.id, dataUrl);
|
|
29790
|
-
const disposeAnim = setupSpriteAnimation(
|
|
29791
|
-
sprite,
|
|
29792
|
-
dataUrl,
|
|
29793
|
-
pet.spriteVersionNumber
|
|
29794
|
-
);
|
|
29795
|
-
disposers.push(disposeAnim);
|
|
29796
|
-
}
|
|
29797
|
-
},
|
|
29798
|
-
() => {
|
|
29799
|
-
if (pet.previewUrl) {
|
|
29800
|
-
sprite.style.backgroundImage = `url("${pet.previewUrl}")`;
|
|
29801
|
-
sprite.style.backgroundSize = "contain";
|
|
29802
|
-
sprite.style.backgroundPosition = "center";
|
|
29803
|
-
}
|
|
29804
|
-
}
|
|
29805
|
-
);
|
|
29806
|
-
} else if (pet.previewUrl) {
|
|
29807
|
-
sprite.style.backgroundImage = `url("${pet.previewUrl}")`;
|
|
29808
|
-
sprite.style.backgroundSize = "contain";
|
|
29809
|
-
sprite.style.backgroundPosition = "center";
|
|
29810
|
-
}
|
|
29811
30414
|
const body = document2.createElement("div");
|
|
29812
30415
|
body.className = "pet-card__body";
|
|
29813
30416
|
const cardHeader = document2.createElement("div");
|
|
@@ -29817,7 +30420,12 @@ ${logoCss}${polaroidCss}
|
|
|
29817
30420
|
title.textContent = pet.displayName;
|
|
29818
30421
|
const badges = document2.createElement("div");
|
|
29819
30422
|
badges.className = "pet-card__badges";
|
|
29820
|
-
if (
|
|
30423
|
+
if (opState?.status === "failed") {
|
|
30424
|
+
const b = document2.createElement("span");
|
|
30425
|
+
b.className = "pet-card__badge pet-card__badge--failed";
|
|
30426
|
+
b.textContent = opState.op === "install" ? copy.installFailed : copy.uninstallFailed;
|
|
30427
|
+
badges.append(b);
|
|
30428
|
+
} else if (pet.installed) {
|
|
29821
30429
|
const b = document2.createElement("span");
|
|
29822
30430
|
b.className = "pet-card__badge pet-card__badge--installed";
|
|
29823
30431
|
b.append(createRendererSettingsIcon("check", 12), copy.installedBadge);
|
|
@@ -29844,65 +30452,96 @@ ${logoCss}${polaroidCss}
|
|
|
29844
30452
|
hint.textContent = copy.tip;
|
|
29845
30453
|
const actions = document2.createElement("div");
|
|
29846
30454
|
actions.className = "pet-card__actions";
|
|
29847
|
-
if (
|
|
30455
|
+
if (opState?.status === "installing" || opState?.status === "uninstalling") {
|
|
30456
|
+
const busyBtn = document2.createElement("button");
|
|
30457
|
+
busyBtn.type = "button";
|
|
30458
|
+
busyBtn.className = opState.status === "installing" ? "pet-btn pet-btn--primary" : "pet-btn pet-btn--danger";
|
|
30459
|
+
busyBtn.disabled = true;
|
|
30460
|
+
busyBtn.textContent = opState.status === "installing" ? copy.installing : copy.uninstalling;
|
|
30461
|
+
actions.append(busyBtn);
|
|
30462
|
+
} else if (opState?.status === "failed") {
|
|
30463
|
+
const retryBtn = document2.createElement("button");
|
|
30464
|
+
retryBtn.type = "button";
|
|
30465
|
+
retryBtn.className = opState.op === "install" ? "pet-btn pet-btn--primary" : "pet-btn pet-btn--danger";
|
|
30466
|
+
retryBtn.textContent = copy.retry;
|
|
30467
|
+
retryBtn.addEventListener("click", () => runPetOperation(pet, opState.op));
|
|
30468
|
+
actions.append(retryBtn);
|
|
30469
|
+
} else if (pet.installed) {
|
|
29848
30470
|
const uninstallBtn = document2.createElement("button");
|
|
29849
30471
|
uninstallBtn.type = "button";
|
|
29850
30472
|
uninstallBtn.className = "pet-btn pet-btn--danger";
|
|
29851
30473
|
uninstallBtn.textContent = copy.uninstall;
|
|
29852
|
-
uninstallBtn.addEventListener(
|
|
29853
|
-
|
|
29854
|
-
|
|
29855
|
-
|
|
29856
|
-
void client2.uninstall(pet.id).then(
|
|
29857
|
-
() => {
|
|
29858
|
-
allPets = allPets.map(
|
|
29859
|
-
(p) => p.id === pet.id ? { ...p, installed: false } : p
|
|
29860
|
-
);
|
|
29861
|
-
renderGrid();
|
|
29862
|
-
},
|
|
29863
|
-
(err) => {
|
|
29864
|
-
uninstallBtn.disabled = false;
|
|
29865
|
-
uninstallBtn.textContent = copy.uninstall;
|
|
29866
|
-
alert(err instanceof Error ? err.message : String(err));
|
|
29867
|
-
}
|
|
29868
|
-
);
|
|
29869
|
-
});
|
|
30474
|
+
uninstallBtn.addEventListener(
|
|
30475
|
+
"click",
|
|
30476
|
+
() => runPetOperation(pet, "uninstall")
|
|
30477
|
+
);
|
|
29870
30478
|
actions.append(uninstallBtn);
|
|
29871
30479
|
} else {
|
|
29872
30480
|
const installBtn = document2.createElement("button");
|
|
29873
30481
|
installBtn.type = "button";
|
|
29874
30482
|
installBtn.className = "pet-btn pet-btn--primary";
|
|
29875
30483
|
installBtn.textContent = copy.install;
|
|
29876
|
-
installBtn.addEventListener(
|
|
29877
|
-
|
|
29878
|
-
|
|
29879
|
-
|
|
29880
|
-
void client2.install({
|
|
29881
|
-
id: pet.id,
|
|
29882
|
-
displayName: pet.displayName,
|
|
29883
|
-
description: pet.description,
|
|
29884
|
-
spritesheetUrl: pet.spritesheetUrl,
|
|
29885
|
-
spriteVersionNumber: pet.spriteVersionNumber
|
|
29886
|
-
}).then(
|
|
29887
|
-
() => {
|
|
29888
|
-
allPets = allPets.map(
|
|
29889
|
-
(p) => p.id === pet.id ? { ...p, installed: true } : p
|
|
29890
|
-
);
|
|
29891
|
-
renderGrid();
|
|
29892
|
-
},
|
|
29893
|
-
(err) => {
|
|
29894
|
-
installBtn.disabled = false;
|
|
29895
|
-
installBtn.textContent = copy.install;
|
|
29896
|
-
alert(err instanceof Error ? err.message : String(err));
|
|
29897
|
-
}
|
|
29898
|
-
);
|
|
29899
|
-
});
|
|
30484
|
+
installBtn.addEventListener(
|
|
30485
|
+
"click",
|
|
30486
|
+
() => runPetOperation(pet, "install")
|
|
30487
|
+
);
|
|
29900
30488
|
actions.append(installBtn);
|
|
29901
30489
|
}
|
|
29902
30490
|
footer.append(hint, actions);
|
|
29903
|
-
|
|
30491
|
+
if (opState?.status === "failed") {
|
|
30492
|
+
const errorBox = document2.createElement("div");
|
|
30493
|
+
errorBox.className = "pet-card__error";
|
|
30494
|
+
errorBox.textContent = opState.error;
|
|
30495
|
+
body.append(cardHeader, desc, errorBox, footer);
|
|
30496
|
+
} else if (opState) {
|
|
30497
|
+
const statusLine = document2.createElement("div");
|
|
30498
|
+
statusLine.className = "pet-card__status";
|
|
30499
|
+
statusLine.textContent = opState.status === "installing" ? copy.installing : copy.uninstalling;
|
|
30500
|
+
body.append(cardHeader, desc, statusLine, footer);
|
|
30501
|
+
} else {
|
|
30502
|
+
body.append(cardHeader, desc, footer);
|
|
30503
|
+
}
|
|
29904
30504
|
card.append(stage, body);
|
|
29905
30505
|
grid.append(card);
|
|
30506
|
+
const cachedImg = imageCache.get(pet.id);
|
|
30507
|
+
if (cachedImg) {
|
|
30508
|
+
disposers.push(
|
|
30509
|
+
setupSpriteAnimation(sprite, cachedImg, pet.spriteVersionNumber)
|
|
30510
|
+
);
|
|
30511
|
+
} else if (pet.spritesheetUrl) {
|
|
30512
|
+
imageCache.set(pet.id, pet.spritesheetUrl);
|
|
30513
|
+
disposers.push(
|
|
30514
|
+
setupSpriteAnimation(sprite, pet.spritesheetUrl, pet.spriteVersionNumber)
|
|
30515
|
+
);
|
|
30516
|
+
} else {
|
|
30517
|
+
const showStaticPreview = () => {
|
|
30518
|
+
if (!pet.previewUrl) return;
|
|
30519
|
+
sprite.style.backgroundImage = `url("${pet.previewUrl}")`;
|
|
30520
|
+
sprite.style.backgroundSize = "contain";
|
|
30521
|
+
sprite.style.backgroundPosition = "center";
|
|
30522
|
+
};
|
|
30523
|
+
const client2 = getClient();
|
|
30524
|
+
if (client2) {
|
|
30525
|
+
void client2.preview(pet.id).then(
|
|
30526
|
+
(res) => {
|
|
30527
|
+
if (epoch !== renderEpoch || !sprite.isConnected) return;
|
|
30528
|
+
if (res && res.dataBase64) {
|
|
30529
|
+
const dataUrl = `data:${res.mime};base64,${res.dataBase64}`;
|
|
30530
|
+
imageCache.set(pet.id, dataUrl);
|
|
30531
|
+
disposers.push(
|
|
30532
|
+
setupSpriteAnimation(sprite, dataUrl, pet.spriteVersionNumber)
|
|
30533
|
+
);
|
|
30534
|
+
}
|
|
30535
|
+
},
|
|
30536
|
+
() => {
|
|
30537
|
+
if (epoch !== renderEpoch || !sprite.isConnected) return;
|
|
30538
|
+
showStaticPreview();
|
|
30539
|
+
}
|
|
30540
|
+
);
|
|
30541
|
+
} else {
|
|
30542
|
+
showStaticPreview();
|
|
30543
|
+
}
|
|
30544
|
+
}
|
|
29906
30545
|
}
|
|
29907
30546
|
};
|
|
29908
30547
|
for (const t of tabs) {
|
|
@@ -29941,8 +30580,18 @@ ${logoCss}${polaroidCss}
|
|
|
29941
30580
|
);
|
|
29942
30581
|
}
|
|
29943
30582
|
return () => {
|
|
30583
|
+
renderEpoch += 1;
|
|
29944
30584
|
for (const d of disposers) d();
|
|
29945
30585
|
disposers.length = 0;
|
|
30586
|
+
for (const url2 of imageCache.values()) {
|
|
30587
|
+
if (url2.startsWith("blob:")) {
|
|
30588
|
+
try {
|
|
30589
|
+
URL.revokeObjectURL(url2);
|
|
30590
|
+
} catch {
|
|
30591
|
+
}
|
|
30592
|
+
}
|
|
30593
|
+
}
|
|
30594
|
+
imageCache.clear();
|
|
29946
30595
|
};
|
|
29947
30596
|
}
|
|
29948
30597
|
});
|
|
@@ -29992,9 +30641,9 @@ ${logoCss}${polaroidCss}
|
|
|
29992
30641
|
}
|
|
29993
30642
|
|
|
29994
30643
|
// src/native-ui/renderer-extension/src/settings/pages.ts
|
|
29995
|
-
var
|
|
29996
|
-
var
|
|
29997
|
-
var
|
|
30644
|
+
var HARNESSMIX_GITHUB_REPOSITORY_URL = "https://github.com/emo-xiaoyu/harness-mix";
|
|
30645
|
+
var HARNESSMIX_RELEASES_LATEST_URL = `${HARNESSMIX_GITHUB_REPOSITORY_URL}/releases/latest`;
|
|
30646
|
+
var HARNESSMIX_NPM_MANUAL_UPDATE_COMMAND = "npm install -g harness-mix@latest";
|
|
29998
30647
|
function rendererUserAgentData(navigator2) {
|
|
29999
30648
|
return navigator2.userAgentData;
|
|
30000
30649
|
}
|
|
@@ -30095,7 +30744,7 @@ ${logoCss}${polaroidCss}
|
|
|
30095
30744
|
checkUpdateBtn.className = "settings-command-button settings-command-button--secondary";
|
|
30096
30745
|
checkUpdateBtn.append(createRendererSettingsIcon("updates", 14), messages.checkUpdateNow);
|
|
30097
30746
|
checkUpdateBtn.addEventListener("click", () => {
|
|
30098
|
-
const shell = document2.querySelector("[data-
|
|
30747
|
+
const shell = document2.querySelector("[data-harnessmix-settings-shell]");
|
|
30099
30748
|
const updatesNavBtn = (shell?.shadowRoot ?? document2).querySelector(
|
|
30100
30749
|
'button[data-page-id="updates"]'
|
|
30101
30750
|
);
|
|
@@ -30118,11 +30767,11 @@ ${logoCss}${polaroidCss}
|
|
|
30118
30767
|
openSource.textContent = messages.aboutOpenSource;
|
|
30119
30768
|
const repository = document2.createElement("a");
|
|
30120
30769
|
repository.className = "settings-about-repository-link";
|
|
30121
|
-
repository.href =
|
|
30770
|
+
repository.href = HARNESSMIX_GITHUB_REPOSITORY_URL;
|
|
30122
30771
|
repository.target = "_blank";
|
|
30123
30772
|
repository.rel = "noopener noreferrer";
|
|
30124
30773
|
const repositoryUrl = document2.createElement("code");
|
|
30125
|
-
repositoryUrl.textContent =
|
|
30774
|
+
repositoryUrl.textContent = HARNESSMIX_GITHUB_REPOSITORY_URL;
|
|
30126
30775
|
repository.append(
|
|
30127
30776
|
createRendererSettingsIcon("external-link", 14),
|
|
30128
30777
|
messages.aboutRepository,
|
|
@@ -30193,7 +30842,7 @@ ${logoCss}${polaroidCss}
|
|
|
30193
30842
|
const manualNpmCommandRow = document2.createElement("div");
|
|
30194
30843
|
manualNpmCommandRow.className = "settings-update-command";
|
|
30195
30844
|
const manualNpmCommand = document2.createElement("code");
|
|
30196
|
-
manualNpmCommand.textContent =
|
|
30845
|
+
manualNpmCommand.textContent = HARNESSMIX_NPM_MANUAL_UPDATE_COMMAND;
|
|
30197
30846
|
const copyCommand = document2.createElement("button");
|
|
30198
30847
|
copyCommand.type = "button";
|
|
30199
30848
|
copyCommand.className = "settings-update-command__copy";
|
|
@@ -30211,7 +30860,7 @@ ${logoCss}${polaroidCss}
|
|
|
30211
30860
|
restore(messages.updateCopyFailed);
|
|
30212
30861
|
return;
|
|
30213
30862
|
}
|
|
30214
|
-
void clipboard.writeText(
|
|
30863
|
+
void clipboard.writeText(HARNESSMIX_NPM_MANUAL_UPDATE_COMMAND).then(
|
|
30215
30864
|
() => restore(messages.updateCommandCopied),
|
|
30216
30865
|
() => restore(messages.updateCopyFailed)
|
|
30217
30866
|
);
|
|
@@ -30228,7 +30877,7 @@ ${logoCss}${polaroidCss}
|
|
|
30228
30877
|
manualWindowsInstallerActions.className = "settings-update-actions";
|
|
30229
30878
|
const manualWindowsInstallerLink = document2.createElement("a");
|
|
30230
30879
|
manualWindowsInstallerLink.className = "settings-update-link";
|
|
30231
|
-
manualWindowsInstallerLink.href =
|
|
30880
|
+
manualWindowsInstallerLink.href = HARNESSMIX_RELEASES_LATEST_URL;
|
|
30232
30881
|
manualWindowsInstallerLink.target = "_blank";
|
|
30233
30882
|
manualWindowsInstallerLink.rel = "noopener noreferrer";
|
|
30234
30883
|
manualWindowsInstallerLink.append(
|
|
@@ -30244,7 +30893,7 @@ ${logoCss}${polaroidCss}
|
|
|
30244
30893
|
actions.className = "settings-update-actions";
|
|
30245
30894
|
const releaseLink = document2.createElement("a");
|
|
30246
30895
|
releaseLink.className = "settings-update-link";
|
|
30247
|
-
releaseLink.href =
|
|
30896
|
+
releaseLink.href = HARNESSMIX_RELEASES_LATEST_URL;
|
|
30248
30897
|
releaseLink.target = "_blank";
|
|
30249
30898
|
releaseLink.rel = "noopener noreferrer";
|
|
30250
30899
|
releaseLink.append(
|
|
@@ -30489,7 +31138,7 @@ ${logoCss}${polaroidCss}
|
|
|
30489
31138
|
}
|
|
30490
31139
|
|
|
30491
31140
|
// src/native-ui/renderer-extension/src/settings/shell.css
|
|
30492
|
-
var shell_default = ':host {\r\n --settings-bg: light-dark(#ffffff, #202020);\r\n --settings-sidebar: light-dark(#f7f7f8, #191919);\r\n --settings-panel: light-dark(#ffffff, #232323);\r\n --settings-surface: light-dark(#f6f6f6, #292929);\r\n --settings-surface-hover: light-dark(#eeeeee, #303030);\r\n --settings-inset: light-dark(#f3f3f3, #161616);\r\n --settings-text: light-dark(#0d0d0d, #ececec);\r\n --settings-muted: light-dark(#676767, #a3a3a3);\r\n --settings-subtle: light-dark(#8a8a8a, #777777);\r\n --settings-border: light-dark(rgb(13 13 13 / 9%), rgb(255 255 255 / 9%));\r\n --settings-divider: light-dark(rgb(13 13 13 / 7%), rgb(255 255 255 / 7%));\r\n --settings-hover: light-dark(rgb(13 13 13 / 5%), rgb(255 255 255 / 7%));\r\n --settings-active: light-dark(rgb(13 13 13 / 7%), rgb(255 255 255 / 9%));\r\n --settings-focus: light-dark(#0b75d1, #66aaf9);\r\n --settings-primary: light-dark(#171717, #f4f4f4);\r\n --settings-primary-hover: light-dark(#2f2f2f, #ffffff);\r\n --settings-primary-text: light-dark(#ffffff, #171717);\r\n --settings-warning: light-dark(#8a5500, #f5c96a);\r\n --settings-warning-bg: light-dark(#fff8e6, rgb(245 201 106 / 8%));\r\n --settings-warning-border: light-dark(#ead8a8, rgb(245 201 106 / 24%));\r\n --settings-danger: light-dark(#b42318, #f87171);\r\n --settings-danger-bg: light-dark(#fff1f0, rgb(239 68 68 / 8%));\r\n --settings-danger-border: light-dark(#f3c7c3, rgb(239 68 68 / 22%));\r\n --settings-success: light-dark(#16784a, #4ade80);\r\n color: var(--settings-text);\r\n color-scheme: inherit;\r\n font:\r\n 13px/1.5 system-ui,\r\n -apple-system,\r\n BlinkMacSystemFont,\r\n "Segoe UI",\r\n sans-serif;\r\n letter-spacing: 0;\r\n}\r\n\r\n*,\r\n*::before,\r\n*::after {\r\n box-sizing: border-box;\r\n letter-spacing: 0;\r\n}\r\n\r\nbutton,\r\ninput,\r\nselect {\r\n font: inherit;\r\n}\r\n\r\nbutton {\r\n color: inherit;\r\n}\r\n\r\n[hidden] {\r\n display: none !important;\r\n}\r\n\r\n.settings-visually-hidden {\r\n position: absolute;\r\n width: 1px;\r\n height: 1px;\r\n padding: 0;\r\n margin: -1px;\r\n overflow: hidden;\r\n clip-path: inset(50%);\r\n white-space: nowrap;\r\n border: 0;\r\n}\r\n\r\n.codexhost-settings-dialog {\r\n width: min(1120px, calc(100vw - 48px));\r\n height: min(780px, calc(100vh - 88px));\r\n max-width: none;\r\n max-height: calc(100vh - 88px);\r\n margin-top: max(56px, calc((100vh - 780px) / 2));\r\n margin-inline: auto;\r\n margin-bottom: auto;\r\n padding: 0;\r\n overflow: hidden;\r\n color: var(--settings-text);\r\n background: var(--settings-bg);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 14px;\r\n box-shadow: light-dark(0 16px 42px rgb(0 0 0 / 16%), 0 20px 54px rgb(0 0 0 / 42%));\r\n}\r\n\r\n.codexhost-settings-dialog::backdrop {\r\n background: light-dark(rgb(0 0 0 / 24%), rgb(0 0 0 / 56%));\r\n backdrop-filter: blur(1px);\r\n}\r\n\r\n.settings-frame,\r\n.settings-layout {\r\n width: 100%;\r\n height: 100%;\r\n min-width: 0;\r\n min-height: 0;\r\n}\r\n\r\n.settings-frame {\r\n display: flex;\r\n flex-direction: column;\r\n}\r\n\r\n.settings-layout {\r\n flex: 1;\r\n display: grid;\r\n grid-template-columns: 184px minmax(0, 1fr);\r\n background: var(--settings-bg);\r\n}\r\n\r\n.settings-sidebar {\r\n display: flex;\r\n min-width: 0;\r\n min-height: 0;\r\n flex-direction: column;\r\n overflow: hidden;\r\n background: var(--settings-sidebar);\r\n border-right: 1px solid var(--settings-border);\r\n padding-top: 14px;\r\n}\r\n\r\n.settings-header {\r\n display: flex;\r\n align-items: center;\r\n min-width: 0;\r\n height: 50px;\r\n flex: none;\r\n padding: 0 16px;\r\n border-bottom: 1px solid var(--settings-border);\r\n}\r\n\r\n.settings-header-actions {\r\n display: flex;\r\n align-items: center;\r\n flex: none;\r\n gap: 12px;\r\n margin-left: auto;\r\n}\r\n\r\n.settings-brand {\r\n display: flex;\r\n align-items: center;\r\n min-width: 0;\r\n gap: 7px;\r\n}\r\n\r\n.settings-brand__mark {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 26px;\r\n height: 26px;\r\n flex: none;\r\n color: var(--settings-text);\r\n}\r\n\r\n.settings-brand__mark .codexhost-settings-icon {\r\n width: 24px;\r\n height: 24px;\r\n object-fit: contain;\r\n}\r\n\r\n.settings-brand__copy {\r\n display: flex;\r\n min-width: 0;\r\n align-items: baseline;\r\n gap: 0;\r\n line-height: 20px;\r\n}\r\n\r\n.settings-brand__name {\r\n overflow: hidden;\r\n color: var(--settings-text);\r\n font-size: 13px;\r\n font-weight: 600;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.settings-brand__title {\r\n margin-left: 8px;\r\n padding-left: 8px;\r\n color: var(--settings-muted);\r\n font-size: 13px;\r\n font-weight: 400;\r\n border-left: 1px solid var(--settings-border);\r\n}\r\n\r\n.settings-nav {\r\n display: flex;\r\n min-width: 0;\r\n min-height: 0;\r\n flex: 1;\r\n flex-direction: column;\r\n gap: 2px;\r\n padding: 0 7px 10px;\r\n overflow-y: auto;\r\n}\r\n\r\n.settings-nav-section-label {\r\n min-height: 24px;\r\n padding: 4px 9px 2px;\r\n color: var(--settings-subtle);\r\n font-size: 11px;\r\n font-weight: 600;\r\n line-height: 18px;\r\n}\r\n\r\n.settings-nav-section-label:not(:first-child) {\r\n margin-top: 8px;\r\n}\r\n\r\n.settings-nav-button {\r\n display: grid;\r\n grid-template-columns: 16px minmax(0, 1fr);\r\n align-items: center;\r\n width: 100%;\r\n position: relative;\r\n min-height: 34px;\r\n flex: none;\r\n gap: 9px;\r\n padding: 6px 9px;\r\n color: var(--settings-text);\r\n font-size: 13px;\r\n line-height: 20px;\r\n text-align: left;\r\n background: transparent;\r\n border: 0;\r\n border-radius: 8px;\r\n cursor: pointer;\r\n}\r\n\r\n.settings-nav-button .codexhost-settings-icon {\r\n width: 16px;\r\n height: 16px;\r\n opacity: 0.9;\r\n}\r\n\r\n.settings-nav-button:hover {\r\n background: var(--settings-hover);\r\n}\r\n\r\n.settings-nav-button[aria-current="page"] {\r\n background: var(--settings-active);\r\n color: var(--settings-text);\r\n font-weight: 500;\r\n}\r\n\r\n.settings-nav-button span {\r\n min-width: 0;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.settings-nav-star-link {\r\n margin-top: 0;\r\n color: var(--settings-text);\r\n text-decoration: none;\r\n}\r\n\r\n.settings-nav-star-link .codexhost-settings-icon {\r\n color: var(--settings-warning);\r\n}\r\n\r\n.settings-nav-star-link:hover {\r\n color: var(--settings-warning);\r\n background: var(--settings-warning-bg);\r\n}\r\n\r\n.settings-icon-button {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 32px;\r\n height: 32px;\r\n flex: none;\r\n padding: 0;\r\n color: var(--settings-muted);\r\n background: transparent;\r\n border: 0;\r\n border-radius: 8px;\r\n cursor: pointer;\r\n transition: background-color 0.15s ease, color 0.15s ease, transform 0.08s ease;\r\n}\r\n\r\n.settings-icon-button:hover {\r\n color: var(--settings-text);\r\n background: var(--settings-hover);\r\n}\r\n\r\n.settings-icon-button:active {\r\n background: var(--settings-active);\r\n transform: scale(0.95);\r\n}\r\n\r\n.settings-header-actions .settings-icon-button {\r\n width: 34px;\r\n height: 34px;\r\n border-radius: 8px;\r\n}\r\n\r\n.settings-header-actions .settings-icon-button:hover {\r\n color: var(--settings-text);\r\n background: var(--settings-hover);\r\n}\r\n\r\n.settings-icon-button:focus-visible,\r\n.settings-nav-button:focus-visible {\r\n outline: 2px solid var(--settings-focus);\r\n outline-offset: 1px;\r\n}\r\n\r\n.settings-page {\r\n display: block;\r\n position: relative;\r\n min-width: 0;\r\n min-height: 0;\r\n overflow-y: auto;\r\n background: var(--settings-bg);\r\n scrollbar-gutter: stable;\r\n}\r\n\r\n.settings-page__content {\r\n width: min(930px, calc(100% - 80px));\r\n margin-inline: auto;\r\n}\r\n\r\n.settings-page__content {\r\n min-width: 0;\r\n padding: 28px 0 36px;\r\n}\r\n\r\n.settings-section-label {\r\n min-height: auto;\r\n margin: 0;\r\n padding: 0 0 18px;\r\n color: var(--settings-text);\r\n font-size: 18px;\r\n font-weight: 600;\r\n line-height: 26px;\r\n}\r\n\r\n.settings-status-list,\r\n.settings-empty {\r\n overflow: hidden;\r\n background: var(--settings-panel);\r\n}\r\n\r\n.settings-status-row {\r\n display: grid;\r\n grid-template-columns: minmax(170px, 1fr) auto minmax(280px, 1.45fr);\r\n position: relative;\r\n align-items: center;\r\n min-height: 72px;\r\n gap: 20px;\r\n padding: 12px 0;\r\n}\r\n\r\n.settings-status-row:not(:last-child)::after {\r\n content: "";\r\n position: absolute;\r\n right: 0;\r\n bottom: 0;\r\n left: 0;\r\n height: 1px;\r\n background: var(--settings-divider);\r\n}\r\n\r\n.settings-status-row__identity {\r\n display: inline-flex;\r\n align-items: center;\r\n min-width: 0;\r\n color: var(--settings-text);\r\n gap: 10px;\r\n font-size: 14px;\r\n font-weight: 500;\r\n line-height: 22px;\r\n}\r\n\r\n.settings-status-row__icon {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 36px;\r\n height: 36px;\r\n flex: none;\r\n color: var(--settings-muted);\r\n background: var(--settings-surface);\r\n border-radius: 50%;\r\n}\r\n\r\n.settings-status-badge {\r\n flex: none;\r\n padding: 3px 8px;\r\n color: var(--settings-muted);\r\n font-size: 11px;\r\n font-weight: 500;\r\n line-height: 18px;\r\n background: var(--settings-surface);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 6px;\r\n}\r\n\r\n.settings-status-row__detail {\r\n min-width: 0;\r\n color: var(--settings-muted);\r\n font-size: 13px;\r\n line-height: 20px;\r\n}\r\n\r\n.settings-page-description {\r\n max-width: 760px;\r\n margin: -10px 0 20px;\r\n color: var(--settings-muted);\r\n font-size: 12px;\r\n line-height: 18px;\r\n}\r\n\r\n.settings-session-import-header {\r\n display: flex;\r\n align-items: flex-start;\r\n justify-content: space-between;\r\n gap: 24px;\r\n}\r\n\r\n.settings-session-import-header .settings-section-label {\r\n min-width: 0;\r\n}\r\n\r\n.settings-session-import-harness {\r\n display: flex;\r\n align-items: center;\r\n min-width: 0;\r\n gap: 12px;\r\n margin: -12px 0 16px;\r\n color: var(--settings-muted);\r\n font-size: 13px;\r\n}\r\n\r\n.settings-session-import-harness > span {\r\n flex: none;\r\n}\r\n\r\n.settings-session-import-harness__options {\r\n display: flex;\r\n align-items: center;\r\n min-width: 0;\r\n flex: 1;\r\n gap: 6px;\r\n overflow-x: auto;\r\n overflow-y: hidden;\r\n scrollbar-width: none;\r\n}\r\n\r\n.settings-session-import-harness__options::-webkit-scrollbar {\r\n display: none;\r\n}\r\n\r\n.settings-session-import-harness__option {\r\n min-height: 32px;\r\n flex: none;\r\n padding: 6px 10px;\r\n color: var(--settings-muted);\r\n font: inherit;\r\n font-size: 12px;\r\n white-space: nowrap;\r\n background: rgb(255 255 255 / 4%);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 6px;\r\n cursor: pointer;\r\n}\r\n\r\n.settings-session-import-harness__option[aria-pressed="true"] {\r\n color: var(--settings-text);\r\n background: var(--settings-active);\r\n border-color: rgb(51 156 255 / 50%);\r\n}\r\n\r\n.settings-session-import-harness__option:disabled {\r\n opacity: 0.38;\r\n cursor: not-allowed;\r\n}\r\n\r\n.settings-session-import-harness__option:focus-visible {\r\n outline: 2px solid var(--settings-focus);\r\n outline-offset: 2px;\r\n}\r\n\r\n.settings-session-import-harness + .settings-page-description {\r\n margin-top: 0;\r\n margin-bottom: 4px;\r\n}\r\n\r\n.settings-session-import-availability-note {\r\n margin-top: 0;\r\n}\r\n\r\n.settings-session-import-search,\r\n.settings-session-import-pagination {\r\n display: flex;\r\n flex-wrap: wrap;\r\n align-items: center;\r\n gap: 10px;\r\n margin: 16px 0;\r\n}\r\n\r\n.settings-session-import-search input {\r\n flex: 1;\r\n min-width: 160px;\r\n}\r\n\r\n.settings-session-import-search input,\r\n.settings-session-import-pagination select {\r\n min-height: 36px;\r\n padding: 6px 10px;\r\n color: var(--settings-text);\r\n background: var(--settings-bg);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 6px;\r\n}\r\n\r\n.settings-session-import-search input:focus-visible,\r\n.settings-session-import-pagination select:focus-visible {\r\n outline: 2px solid var(--settings-focus);\r\n outline-offset: 2px;\r\n}\r\n\r\n.settings-session-import-pagination {\r\n color: var(--settings-muted);\r\n font-size: 12px;\r\n}\r\n\r\n.settings-session-import-pagination label {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n}\r\n\r\n.settings-session-import-pagination > span {\r\n flex: 1;\r\n min-width: 130px;\r\n}\r\n\r\n.settings-session-import-pagination__navigation {\r\n display: flex;\r\n gap: 8px;\r\n margin-left: auto;\r\n}\r\n\r\n.settings-session-import-content,\r\n.settings-session-import-list {\r\n display: grid;\r\n gap: 10px;\r\n}\r\n\r\n.settings-session-import-status {\r\n display: flex;\r\n align-items: center;\r\n min-height: 64px;\r\n gap: 12px;\r\n padding: 16px;\r\n color: var(--settings-muted);\r\n background: var(--settings-panel);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 8px;\r\n}\r\n\r\n.settings-session-import-status.is-error {\r\n color: #ef4444;\r\n}\r\n\r\n.settings-session-import-recovery {\r\n display: grid;\r\n justify-items: start;\r\n gap: 14px;\r\n padding: 16px;\r\n background: var(--settings-panel);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 8px;\r\n}\r\n\r\n.settings-session-import-recovery:focus-visible {\r\n outline: 2px solid var(--settings-focus);\r\n outline-offset: 2px;\r\n}\r\n\r\n.settings-session-import-recovery__copy {\r\n display: grid;\r\n gap: 4px;\r\n}\r\n\r\n.settings-session-import-recovery__copy strong {\r\n color: var(--settings-text);\r\n font-size: 14px;\r\n}\r\n\r\n.settings-session-import-recovery__copy p {\r\n margin: 0;\r\n color: var(--settings-muted);\r\n font-size: 13px;\r\n line-height: 20px;\r\n}\r\n\r\n.settings-session-import-recovery__path {\r\n display: flex;\r\n align-items: stretch;\r\n width: 100%;\r\n min-width: 0;\r\n overflow: hidden;\r\n border: 1px solid var(--settings-border);\r\n border-radius: 6px;\r\n}\r\n\r\n.settings-session-import-recovery__path code {\r\n min-width: 0;\r\n flex: 1;\r\n padding: 8px 10px;\r\n overflow-x: auto;\r\n color: var(--settings-text);\r\n font-size: 12px;\r\n line-height: 20px;\r\n white-space: nowrap;\r\n}\r\n\r\n.settings-session-import-recovery__path .settings-command-button {\r\n min-height: 0;\r\n flex: none;\r\n border-width: 0 0 0 1px;\r\n border-radius: 0;\r\n}\r\n\r\n.settings-session-import-row {\r\n display: grid;\r\n grid-template-columns: minmax(0, 1fr) auto;\r\n align-items: center;\r\n gap: 20px;\r\n min-width: 0;\r\n padding: 16px;\r\n background: var(--settings-panel);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 8px;\r\n}\r\n\r\n.settings-session-import-row__copy {\r\n display: grid;\r\n min-width: 0;\r\n gap: 4px;\r\n}\r\n\r\n.settings-session-import-row__copy strong {\r\n overflow: hidden;\r\n color: var(--settings-text);\r\n font-size: 14px;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.settings-session-import-row__copy span,\r\n.settings-session-import-row__cwd {\r\n overflow: hidden;\r\n color: var(--settings-muted);\r\n font-size: 12px;\r\n line-height: 18px;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.settings-session-import-row__cwd {\r\n display: block;\r\n min-width: 0;\r\n background: transparent;\r\n}\r\n\r\n.settings-session-import-row__action {\r\n display: flex;\r\n align-items: flex-end;\r\n flex-direction: column;\r\n gap: 8px;\r\n}\r\n\r\n.settings-session-import-running {\r\n color: var(--settings-muted);\r\n font-size: 12px;\r\n}\r\n\r\n.settings-preference-row {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: 32px;\r\n min-height: 88px;\r\n padding: 18px 0;\r\n border-top: 1px solid var(--settings-divider);\r\n border-bottom: 1px solid var(--settings-divider);\r\n}\r\n\r\n.settings-preference-row__copy {\r\n display: flex;\r\n flex: 1 1 auto;\r\n flex-direction: column;\r\n min-width: 0;\r\n gap: 5px;\r\n}\r\n\r\n.settings-preference-row__copy strong {\r\n color: var(--settings-text);\r\n font-size: 15px;\r\n font-weight: 600;\r\n line-height: 22px;\r\n}\r\n\r\n.settings-preference-row__copy span {\r\n max-width: 680px;\r\n color: var(--settings-muted);\r\n font-size: 13px;\r\n line-height: 20px;\r\n}\r\n\r\n.settings-preference-switch {\r\n display: inline-flex;\r\n align-items: center;\r\n width: 42px;\r\n height: 24px;\r\n flex: none;\r\n padding: 2px;\r\n border: 0;\r\n border-radius: 999px;\r\n background: var(--settings-surface-hover);\r\n cursor: pointer;\r\n transition: background 120ms ease;\r\n}\r\n\r\n.settings-preference-switch[aria-checked="true"] {\r\n justify-content: flex-end;\r\n background: var(--settings-focus);\r\n}\r\n\r\n.settings-preference-switch:focus-visible {\r\n outline: 2px solid var(--settings-focus);\r\n outline-offset: 2px;\r\n}\r\n\r\n.settings-preference-switch__thumb {\r\n width: 20px;\r\n height: 20px;\r\n border-radius: 50%;\r\n background: var(--settings-primary-text);\r\n box-shadow: 0 1px 3px rgb(0 0 0 / 24%);\r\n}\r\n\r\n.settings-connection-page-header {\r\n display: flex;\r\n align-items: flex-start;\r\n justify-content: space-between;\r\n gap: 18px;\r\n margin-bottom: 18px;\r\n}\r\n\r\n.settings-connection-page-header .settings-section-label {\r\n padding-bottom: 0;\r\n}\r\n\r\n.settings-connection-page-header .settings-page-description {\r\n margin: 5px 0 0;\r\n}\r\n\r\n.settings-connections-content,\r\n.settings-connections-layout,\r\n.settings-connection-list,\r\n.settings-connection-rows {\r\n min-width: 0;\r\n}\r\n\r\n.settings-connections-layout {\r\n display: grid;\r\n grid-template-columns: minmax(0, 1.55fr) minmax(280px, 0.85fr);\r\n align-items: start;\r\n gap: 18px;\r\n}\r\n\r\n.settings-connection-list,\r\n.settings-connection-inspector {\r\n overflow: hidden;\r\n background: var(--settings-panel);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 10px;\r\n}\r\n\r\n.settings-connection-host-strip {\r\n display: grid;\r\n grid-template-columns: 30px minmax(0, 1fr) 30px;\r\n align-items: center;\r\n min-width: 0;\r\n gap: 5px;\r\n padding: 9px 10px;\r\n border-bottom: 1px solid var(--settings-divider);\r\n}\r\n\r\n.settings-connection-host-scroll {\r\n display: none;\r\n align-items: center;\r\n justify-content: center;\r\n width: 30px;\r\n height: 34px;\r\n padding: 0;\r\n color: var(--settings-muted);\r\n background: var(--settings-inset);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 8px;\r\n cursor: pointer;\r\n}\r\n\r\n.settings-connection-host-strip[data-connection-host-overflow="true"]\r\n .settings-connection-host-scroll {\r\n display: inline-flex;\r\n}\r\n\r\n.settings-connection-host-strip:not([data-connection-host-overflow="true"]) {\r\n grid-template-columns: minmax(0, 1fr);\r\n}\r\n\r\n.settings-connection-host-scroll:hover:not(:disabled) {\r\n color: var(--settings-text);\r\n background: var(--settings-hover);\r\n}\r\n\r\n.settings-connection-host-scroll:disabled {\r\n cursor: default;\r\n opacity: 0.35;\r\n}\r\n\r\n.settings-connection-host-scroll:focus-visible,\r\n.settings-connection-host-tab:focus-visible,\r\n.settings-connection-row:focus-visible,\r\n.settings-connection-install-link:focus-visible,\r\n.settings-connection-view-error:focus-visible {\r\n outline: 2px solid var(--settings-focus);\r\n outline-offset: 1px;\r\n}\r\n\r\n.settings-connection-host-tabs {\r\n display: flex;\r\n align-items: center;\r\n min-width: 0;\r\n gap: 6px;\r\n overflow-x: auto;\r\n overflow-y: hidden;\r\n overscroll-behavior-x: contain;\r\n scrollbar-width: none;\r\n scroll-behavior: smooth;\r\n scroll-snap-type: x proximity;\r\n touch-action: pan-x;\r\n}\r\n\r\n.settings-connection-host-tabs::-webkit-scrollbar {\r\n display: none;\r\n}\r\n\r\n.settings-connection-host-tab {\r\n display: inline-flex;\r\n align-items: center;\r\n height: 30px;\r\n min-width: max-content;\r\n flex: none;\r\n padding: 0 9px;\r\n color: var(--settings-muted);\r\n font: inherit;\r\n font-size: 12px;\r\n line-height: 18px;\r\n white-space: nowrap;\r\n background: var(--settings-inset);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 7px;\r\n cursor: pointer;\r\n scroll-snap-align: start;\r\n}\r\n\r\n.settings-connection-host-tab:hover {\r\n color: var(--settings-text);\r\n background: var(--settings-hover);\r\n}\r\n\r\n.settings-connection-host-tab[aria-selected="true"] {\r\n color: var(--settings-text);\r\n font-weight: 600;\r\n background: var(--settings-active);\r\n border-color: var(--settings-border);\r\n}\r\n\r\n.settings-connection-table-header,\r\n.settings-connection-row {\r\n display: grid;\r\n grid-template-columns: minmax(160px, 1fr) minmax(92px, auto) 108px;\r\n align-items: center;\r\n min-width: 0;\r\n gap: 10px;\r\n}\r\n\r\n.settings-connection-table-header {\r\n min-height: 30px;\r\n padding: 0 10px;\r\n color: var(--settings-muted);\r\n font-size: 10px;\r\n font-weight: 600;\r\n line-height: 16px;\r\n text-transform: uppercase;\r\n letter-spacing: 0.06em;\r\n background: transparent;\r\n border-bottom: 1px solid var(--settings-divider);\r\n}\r\n\r\n.settings-connection-row {\r\n min-height: 52px;\r\n padding: 8px 10px;\r\n cursor: pointer;\r\n border-bottom: 1px solid var(--settings-divider);\r\n}\r\n\r\n.settings-connection-row:last-child {\r\n border-bottom: 0;\r\n}\r\n\r\n.settings-connection-row:hover {\r\n background: var(--settings-hover);\r\n}\r\n\r\n.settings-connection-row[data-connection-selected="true"] {\r\n background: var(--settings-surface);\r\n}\r\n\r\n.settings-connection-row__identity,\r\n.settings-connection-inspector__identity {\r\n display: inline-flex;\r\n align-items: center;\r\n min-width: 0;\r\n gap: 8px;\r\n color: var(--settings-text);\r\n}\r\n\r\n.settings-connection-row__identity strong,\r\n.settings-connection-inspector__identity strong {\r\n min-width: 0;\r\n overflow-wrap: anywhere;\r\n font-size: 12px;\r\n font-weight: 500;\r\n line-height: 18px;\r\n}\r\n\r\n.settings-connection-row__mark {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 24px;\r\n height: 24px;\r\n flex: none;\r\n color: var(--settings-muted);\r\n font-size: 10px;\r\n font-weight: 700;\r\n background: var(--settings-surface);\r\n border-radius: 6px;\r\n}\r\n\r\n.settings-connection-row__mark--logo {\r\n color: var(--settings-text);\r\n background: transparent;\r\n}\r\n\r\n.settings-connection-row__mark--logo > img,\r\n.settings-connection-row__mark--logo > svg {\r\n display: block;\r\n max-width: 18px;\r\n max-height: 18px;\r\n}\r\n\r\n.settings-connection-row__status {\r\n display: inline-flex;\r\n align-items: center;\r\n width: fit-content;\r\n gap: 5px;\r\n color: var(--settings-muted);\r\n font-size: 11px;\r\n font-weight: 500;\r\n line-height: 18px;\r\n}\r\n\r\n.settings-connection-row__status::before {\r\n width: 6px;\r\n height: 6px;\r\n flex: none;\r\n content: "";\r\n background: currentColor;\r\n border-radius: 50%;\r\n}\r\n\r\n.settings-connection-row__status[data-connection-tone="ready"] {\r\n color: var(--settings-success);\r\n}\r\n\r\n.settings-connection-row__status[data-connection-tone="checking"] {\r\n color: var(--settings-warning);\r\n}\r\n\r\n.settings-connection-row__status[data-connection-tone="setup"] {\r\n color: var(--settings-muted);\r\n}\r\n\r\n.settings-connection-row__status[data-connection-tone="setup"]::before {\r\n background: transparent;\r\n border: 1.5px solid currentColor;\r\n}\r\n\r\n.settings-connection-row__status[data-connection-tone="failed"] {\r\n color: var(--settings-danger);\r\n}\r\n\r\n.settings-connection-row__action {\r\n display: flex;\r\n align-items: center;\r\n justify-content: flex-end;\r\n min-width: 0;\r\n gap: 4px;\r\n}\r\n\r\n.settings-connection-row__handle {\r\n display: inline-flex;\r\n flex: none;\r\n align-items: center;\r\n justify-content: center;\r\n width: 16px;\r\n color: var(--settings-muted);\r\n cursor: grab;\r\n opacity: 0.6;\r\n}\r\n\r\n.settings-connection-row__handle:hover {\r\n opacity: 1;\r\n}\r\n\r\n.settings-connection-row[draggable="true"] {\r\n cursor: grab;\r\n}\r\n\r\n.settings-connection-row[data-connection-dragging="true"] {\r\n opacity: 0.4;\r\n}\r\n\r\n.settings-connection-row[data-connection-drop-indicator="before"] {\r\n box-shadow: inset 0 2px 0 0 var(--settings-focus);\r\n}\r\n\r\n.settings-connection-row[data-connection-drop-indicator="after"] {\r\n box-shadow: inset 0 -2px 0 0 var(--settings-focus);\r\n}\r\n\r\n.settings-connection-row__group-toggle {\r\n display: inline-flex;\r\n flex: none;\r\n align-items: center;\r\n justify-content: center;\r\n width: 26px;\r\n height: 26px;\r\n color: var(--settings-muted);\r\n background: transparent;\r\n border: 0;\r\n border-radius: 6px;\r\n cursor: pointer;\r\n}\r\n\r\n.settings-connection-row__group-toggle:hover {\r\n color: var(--settings-text);\r\n background: var(--settings-hover);\r\n}\r\n\r\n.settings-connection-group-divider {\r\n padding: 10px 12px 6px;\r\n color: var(--settings-muted);\r\n font-size: 10px;\r\n font-weight: 600;\r\n line-height: 16px;\r\n text-transform: uppercase;\r\n letter-spacing: 0.06em;\r\n /* No border-top here: the row immediately above already carries its own\r\n border-bottom (it is no longer :last-child once this divider follows\r\n it), so adding one here would double the separator line. */\r\n}\r\n\r\n.settings-connection-group-more[data-connection-drag-over="true"] {\r\n background: rgb(51 156 255 / 8%);\r\n}\r\n\r\n.settings-connection-group-hint {\r\n display: grid;\r\n gap: 3px;\r\n margin: 0 12px 12px;\r\n padding: 14px 16px;\r\n text-align: center;\r\n border: 1.5px dashed var(--settings-border);\r\n border-radius: 10px;\r\n}\r\n\r\n.settings-connection-group-more[data-connection-drag-over="true"] .settings-connection-group-hint {\r\n border-color: var(--settings-focus);\r\n}\r\n\r\n.settings-connection-group-hint strong {\r\n color: var(--settings-text);\r\n font-size: 12.5px;\r\n font-weight: 500;\r\n line-height: 18px;\r\n}\r\n\r\n.settings-connection-group-hint span {\r\n color: var(--settings-muted);\r\n font-size: 12px;\r\n line-height: 17px;\r\n}\r\n\r\n.settings-connection-group-reset {\r\n display: flex;\r\n width: 100%;\r\n align-items: center;\r\n gap: 6px;\r\n padding: 10px 12px;\r\n color: var(--settings-muted);\r\n font: inherit;\r\n font-size: 12px;\r\n text-align: left;\r\n background: transparent;\r\n border: 0;\r\n border-top: 1px solid var(--settings-divider);\r\n cursor: pointer;\r\n}\r\n\r\n.settings-connection-group-reset:hover {\r\n color: var(--settings-text);\r\n background: var(--settings-hover);\r\n}\r\n\r\n.settings-connection-install-link {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 26px;\r\n height: 26px;\r\n color: var(--settings-focus);\r\n text-decoration: none;\r\n background: transparent;\r\n border: 1px solid transparent;\r\n border-radius: 7px;\r\n opacity: 0;\r\n transition: opacity 120ms ease;\r\n}\r\n\r\n.settings-connection-row:hover .settings-connection-install-link,\r\n.settings-connection-install-link:focus-visible {\r\n opacity: 1;\r\n}\r\n\r\n.settings-connection-install-link:hover {\r\n color: var(--settings-focus);\r\n background: var(--settings-active);\r\n border-color: var(--settings-border);\r\n}\r\n\r\n.settings-connection-view-error {\r\n padding: 4px 7px;\r\n color: var(--settings-danger);\r\n font: inherit;\r\n font-size: 11px;\r\n line-height: 18px;\r\n background: transparent;\r\n border: 0;\r\n border-radius: 6px;\r\n cursor: pointer;\r\n}\r\n\r\n.settings-connection-view-error:hover {\r\n color: var(--settings-danger);\r\n background: var(--settings-danger-bg);\r\n}\r\n\r\n.settings-connection-inspector {\r\n position: sticky;\r\n top: 18px;\r\n}\r\n\r\n.settings-connection-inspector__header {\r\n display: flex;\r\n align-items: flex-start;\r\n justify-content: space-between;\r\n min-width: 0;\r\n gap: 10px;\r\n padding: 12px;\r\n border-bottom: 1px solid var(--settings-divider);\r\n}\r\n\r\n.settings-connection-inspector__body {\r\n display: grid;\r\n min-width: 0;\r\n gap: 12px;\r\n padding: 12px;\r\n}\r\n\r\n.settings-connection-install-callout {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 14px;\r\n padding: 14px;\r\n background: var(--settings-surface);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 10px;\r\n}\r\n\r\n.settings-connection-install-head {\r\n display: flex;\r\n align-items: flex-start;\r\n gap: 12px;\r\n min-width: 0;\r\n}\r\n\r\n.settings-connection-install-head > div {\r\n min-width: 0;\r\n flex: 1;\r\n}\r\n\r\n.settings-connection-install-callout__icon {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 32px;\r\n height: 32px;\r\n flex: none;\r\n color: var(--settings-focus);\r\n background: var(--settings-active);\r\n border-radius: 8px;\r\n}\r\n\r\n.settings-connection-install-callout strong,\r\n.settings-connection-install-head strong,\r\n.settings-connection-error-summary strong,\r\n.settings-connection-state-summary strong {\r\n display: block;\r\n margin: 0 0 4px;\r\n color: var(--settings-text);\r\n font-size: 13px;\r\n font-weight: 600;\r\n line-height: 19px;\r\n}\r\n\r\n.settings-connection-install-callout p,\r\n.settings-connection-install-head p,\r\n.settings-connection-error-summary p,\r\n.settings-connection-state-summary p,\r\n.settings-connection-issue-note {\r\n margin: 0;\r\n color: var(--settings-muted);\r\n font-size: 12px;\r\n line-height: 18px;\r\n}\r\n\r\n.settings-connection-install-button {\r\n width: 100%;\r\n}\r\n\r\n.settings-connection-error-summary {\r\n padding: 13px 14px;\r\n color: var(--settings-danger);\r\n background: var(--settings-danger-bg);\r\n border: 1px solid var(--settings-danger-border);\r\n border-radius: 10px;\r\n}\r\n\r\n.settings-connection-error-metadata {\r\n display: grid;\r\n gap: 7px;\r\n padding: 12px;\r\n background: var(--settings-inset);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 9px;\r\n}\r\n\r\n.settings-connection-detail-line {\r\n display: grid;\r\n grid-template-columns: 92px minmax(0, 1fr);\r\n gap: 10px;\r\n min-width: 0;\r\n color: var(--settings-muted);\r\n font-size: 10px;\r\n line-height: 16px;\r\n}\r\n\r\n.settings-connection-detail-line code {\r\n min-width: 0;\r\n overflow-wrap: anywhere;\r\n color: var(--settings-text);\r\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\r\n white-space: pre-wrap;\r\n}\r\n\r\n.settings-connection-error-log-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: 10px;\r\n}\r\n\r\n.settings-connection-error-log-header strong {\r\n color: var(--settings-text);\r\n font-size: 11px;\r\n font-weight: 600;\r\n}\r\n\r\n.settings-connection-error-log-header .settings-command-button {\r\n min-height: 30px;\r\n padding: 5px 9px;\r\n font-size: 11px;\r\n}\r\n\r\n.settings-connection-stderr {\r\n max-height: 220px;\r\n min-width: 0;\r\n margin: 0;\r\n padding: 11px;\r\n overflow: auto;\r\n color: var(--settings-text);\r\n font:\r\n 10px/16px ui-monospace,\r\n "SFMono-Regular",\r\n Consolas,\r\n "Liberation Mono",\r\n monospace;\r\n white-space: pre-wrap;\r\n overflow-wrap: anywhere;\r\n background: var(--settings-inset);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 9px;\r\n}\r\n\r\n.settings-connection-error-actions {\r\n display: grid;\r\n grid-template-columns: minmax(0, 1fr);\r\n gap: 8px;\r\n}\r\n\r\n.settings-connection-error-actions .settings-command-button {\r\n width: 100%;\r\n}\r\n\r\n.settings-connection-issue-note {\r\n margin-top: -4px;\r\n}\r\n\r\n.settings-connection-state-summary {\r\n padding: 14px;\r\n background: var(--settings-surface);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 10px;\r\n}\r\n\r\n.settings-empty {\r\n display: flex;\r\n align-items: center;\r\n min-height: 72px;\r\n padding: 12px 16px;\r\n}\r\n\r\n.settings-empty > div {\r\n display: grid;\r\n min-width: 0;\r\n gap: 2px;\r\n}\r\n\r\n.settings-empty strong {\r\n color: var(--settings-text);\r\n font-size: 13px;\r\n font-weight: 500;\r\n line-height: 19px;\r\n}\r\n\r\n.settings-empty span {\r\n color: var(--settings-muted);\r\n font-size: 13px;\r\n line-height: 19px;\r\n}\r\n\r\n.settings-about-panel {\r\n display: grid;\r\n max-width: 720px;\r\n gap: 18px;\r\n padding: 24px;\r\n background: var(--settings-panel);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 12px;\r\n}\r\n\r\n.settings-about-product {\r\n color: var(--settings-text);\r\n font-size: 24px;\r\n font-weight: 700;\r\n line-height: 32px;\r\n}\r\n\r\n.settings-about-tagline {\r\n color: var(--settings-text);\r\n font-size: 16px;\r\n font-weight: 600;\r\n line-height: 24px;\r\n}\r\n\r\n.settings-about-version-row {\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n margin: 4px 0 8px;\r\n}\r\n\r\n.settings-about-version-badge {\r\n display: inline-flex;\r\n align-items: center;\r\n font-size: 13px;\r\n font-weight: 600;\r\n color: var(--settings-text);\r\n background: var(--settings-surface);\r\n border: 1px solid var(--settings-border);\r\n padding: 4px 10px;\r\n border-radius: 6px;\r\n}\r\n\r\n.settings-about-copy {\r\n display: grid;\r\n max-width: 660px;\r\n gap: 12px;\r\n}\r\n\r\n.settings-about-copy p,\r\n.settings-about-repository p {\r\n margin: 0;\r\n color: var(--settings-muted);\r\n font-size: 13px;\r\n line-height: 21px;\r\n}\r\n\r\n.settings-about-star-callout {\r\n margin: 2px 0;\r\n color: var(--settings-warning);\r\n font-size: 14px;\r\n font-weight: 600;\r\n line-height: 22px;\r\n}\r\n\r\n.settings-about-repository {\r\n display: grid;\r\n gap: 10px;\r\n padding-top: 18px;\r\n border-top: 1px solid var(--settings-divider);\r\n}\r\n\r\n.settings-about-repository-link {\r\n display: flex;\r\n align-items: center;\r\n width: fit-content;\r\n min-width: 0;\r\n max-width: 100%;\r\n gap: 8px;\r\n color: var(--settings-focus);\r\n font-size: 13px;\r\n font-weight: 600;\r\n text-decoration: none;\r\n}\r\n\r\n.settings-about-repository-link:hover {\r\n text-decoration: underline;\r\n}\r\n\r\n.settings-about-repository-link code {\r\n min-width: 0;\r\n overflow: hidden;\r\n color: var(--settings-muted);\r\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\r\n font-size: 11px;\r\n font-weight: 400;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.settings-page-error {\r\n padding: 16px;\r\n color: var(--settings-text);\r\n font-size: 13px;\r\n background: var(--settings-panel);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 20px;\r\n}\r\n\r\n.settings-update-metadata {\r\n display: grid;\r\n grid-template-columns: repeat(3, minmax(0, 1fr));\r\n gap: 24px;\r\n margin-bottom: 24px;\r\n padding: 0 4px 20px;\r\n border-bottom: 1px solid var(--settings-divider);\r\n}\r\n\r\n.settings-update-metadata__item {\r\n display: grid;\r\n min-width: 0;\r\n gap: 4px;\r\n}\r\n\r\n.settings-update-metadata__item span {\r\n color: var(--settings-muted);\r\n font-size: 12px;\r\n line-height: 18px;\r\n}\r\n\r\n.settings-update-metadata__item strong {\r\n min-width: 0;\r\n overflow-wrap: anywhere;\r\n color: var(--settings-text);\r\n font-size: 15px;\r\n font-weight: 500;\r\n line-height: 22px;\r\n}\r\n\r\n/* The only emphasis on this screen: a latest version newer than the installed one. */\r\n.settings-update-metadata__value--newer {\r\n color: var(--settings-focus);\r\n}\r\n\r\n.settings-update-panel {\r\n display: grid;\r\n gap: 12px;\r\n padding: 20px;\r\n color: var(--settings-text);\r\n background: var(--settings-panel);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 8px;\r\n}\r\n\r\n.settings-update-panel__head {\r\n display: flex;\r\n align-items: center;\r\n min-width: 0;\r\n gap: 8px;\r\n}\r\n\r\n.settings-update-panel__head .codexhost-settings-icon {\r\n color: var(--settings-muted);\r\n}\r\n\r\n.settings-update-panel[data-update-state="available"] .codexhost-settings-icon,\r\n.settings-update-panel[data-update-state="downloading"] .codexhost-settings-icon,\r\n.settings-update-panel[data-update-state="installing"] .codexhost-settings-icon,\r\n.settings-update-panel[data-update-state="restarting"] .codexhost-settings-icon {\r\n color: var(--settings-focus);\r\n}\r\n\r\n.settings-update-panel[data-update-state="current"] .codexhost-settings-icon {\r\n color: var(--settings-success);\r\n}\r\n\r\n.settings-update-panel[data-update-state="failed"] .codexhost-settings-icon,\r\n.settings-update-panel[data-update-state="error"] .codexhost-settings-icon {\r\n color: var(--settings-danger);\r\n}\r\n\r\n.settings-update-panel__title {\r\n min-width: 0;\r\n overflow-wrap: anywhere;\r\n color: var(--settings-text);\r\n font-size: 14px;\r\n font-weight: 600;\r\n line-height: 22px;\r\n}\r\n\r\n.settings-update-summary,\r\n.settings-update-error {\r\n margin: 0;\r\n overflow-wrap: anywhere;\r\n font-size: 13px;\r\n line-height: 20px;\r\n}\r\n\r\n.settings-update-summary {\r\n color: var(--settings-muted);\r\n}\r\n\r\n.settings-update-error {\r\n color: var(--settings-danger);\r\n}\r\n\r\n.settings-update-progress {\r\n width: 100%;\r\n height: 8px;\r\n accent-color: var(--settings-focus);\r\n}\r\n\r\n.settings-update-progress-detail {\r\n color: var(--settings-muted);\r\n font-size: 12px;\r\n line-height: 18px;\r\n}\r\n\r\n/* Release notes scroll with the page; a scroller inside a scroller traps the wheel. */\r\n.settings-update-notes-section {\r\n min-width: 0;\r\n margin-top: 24px;\r\n padding-top: 24px;\r\n border-top: 1px solid var(--settings-divider);\r\n}\r\n\r\n.settings-update-notes-section:empty {\r\n display: none;\r\n}\r\n\r\n.settings-update-notes {\r\n display: grid;\r\n min-width: 0;\r\n gap: 12px;\r\n color: var(--settings-muted);\r\n font-size: 14px;\r\n line-height: 22px;\r\n overflow-wrap: anywhere;\r\n}\r\n\r\n.settings-update-notes > :first-child {\r\n margin-top: 0;\r\n}\r\n\r\n.settings-update-notes > :last-child {\r\n margin-bottom: 0;\r\n}\r\n\r\n.settings-update-notes h1,\r\n.settings-update-notes h2,\r\n.settings-update-notes h3,\r\n.settings-update-notes h4,\r\n.settings-update-notes h5,\r\n.settings-update-notes h6 {\r\n margin: 6px 0 0;\r\n color: var(--settings-text);\r\n font-weight: 600;\r\n}\r\n\r\n.settings-update-notes h1 {\r\n font-size: 18px;\r\n line-height: 26px;\r\n}\r\n\r\n.settings-update-notes h2 {\r\n font-size: 17px;\r\n line-height: 24px;\r\n}\r\n\r\n.settings-update-notes h3,\r\n.settings-update-notes h4,\r\n.settings-update-notes h5,\r\n.settings-update-notes h6 {\r\n font-size: 14px;\r\n line-height: 22px;\r\n}\r\n\r\n.settings-update-notes p,\r\n.settings-update-notes ul,\r\n.settings-update-notes ol,\r\n.settings-update-notes pre,\r\n.settings-update-notes blockquote {\r\n margin: 0;\r\n}\r\n\r\n.settings-update-notes ul,\r\n.settings-update-notes ol {\r\n padding-left: 24px;\r\n}\r\n\r\n.settings-update-notes li {\r\n padding-left: 4px;\r\n}\r\n\r\n.settings-update-notes li::marker {\r\n color: var(--settings-muted);\r\n font-size: 0.85em;\r\n}\r\n\r\n.settings-update-notes li + li {\r\n margin-top: 14px;\r\n}\r\n\r\n.settings-update-notes .release-note-translation {\r\n display: block;\r\n margin-top: 3px;\r\n color: var(--settings-muted);\r\n font-size: 13px;\r\n line-height: 20px;\r\n}\r\n\r\n.settings-update-notes blockquote {\r\n padding: 8px 12px;\r\n color: var(--settings-muted);\r\n border-left: 3px solid var(--settings-focus);\r\n background: var(--settings-surface);\r\n}\r\n\r\n.settings-update-notes hr {\r\n width: 100%;\r\n margin: 2px 0;\r\n border: 0;\r\n border-top: 1px solid var(--settings-divider);\r\n}\r\n\r\n.settings-update-notes strong {\r\n color: var(--settings-text);\r\n font-weight: 600;\r\n}\r\n\r\n.settings-update-notes a {\r\n color: var(--settings-focus);\r\n text-decoration: none;\r\n}\r\n\r\n.settings-update-notes a:hover {\r\n text-decoration: underline;\r\n}\r\n\r\n.settings-update-notes code {\r\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\r\n font-size: 12px;\r\n}\r\n\r\n.settings-update-notes :not(pre) > code {\r\n padding: 1px 5px;\r\n background: var(--settings-surface);\r\n border-radius: 4px;\r\n}\r\n\r\n.settings-update-notes pre {\r\n min-width: 0;\r\n max-width: 100%;\r\n padding: 10px 12px;\r\n overflow-x: auto;\r\n overflow-y: hidden;\r\n background: var(--settings-inset);\r\n border-radius: 6px;\r\n}\r\n\r\n.settings-update-notes pre code {\r\n line-height: 18px;\r\n white-space: pre-wrap;\r\n}\r\n\r\n/* Manual update sits directly under the status panel, not behind a disclosure:\r\n automatic updates can fail for machine-local reasons and this is the way out. */\r\n.settings-update-controls {\r\n display: grid;\r\n min-width: 0;\r\n gap: 10px;\r\n margin-top: 24px;\r\n}\r\n\r\n.settings-update-manual-title {\r\n color: var(--settings-text);\r\n font-size: 15px;\r\n font-weight: 600;\r\n line-height: 22px;\r\n}\r\n\r\n.settings-update-manual {\r\n display: grid;\r\n min-width: 0;\r\n gap: 8px;\r\n}\r\n\r\n.settings-update-manual[hidden] {\r\n display: none;\r\n}\r\n\r\n.settings-update-manual-description {\r\n margin: 0;\r\n color: var(--settings-muted);\r\n font-size: 12px;\r\n line-height: 18px;\r\n}\r\n\r\n.settings-update-manual-description.is-fallback {\r\n color: var(--settings-danger);\r\n}\r\n\r\n.settings-update-command {\r\n display: flex;\r\n align-items: stretch;\r\n min-width: 0;\r\n overflow: hidden;\r\n border: 1px solid var(--settings-border);\r\n border-radius: 6px;\r\n}\r\n\r\n.settings-update-command code {\r\n min-width: 0;\r\n flex: 1;\r\n padding: 9px 12px;\r\n overflow-x: auto;\r\n color: var(--settings-text);\r\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\r\n font-size: 12px;\r\n line-height: 20px;\r\n white-space: nowrap;\r\n}\r\n\r\n.settings-update-command__copy {\r\n display: inline-flex;\r\n align-items: center;\r\n flex: none;\r\n gap: 6px;\r\n padding: 0 12px;\r\n color: var(--settings-muted);\r\n font-size: 12px;\r\n background: transparent;\r\n border: 0;\r\n border-left: 1px solid var(--settings-border);\r\n cursor: pointer;\r\n}\r\n\r\n.settings-update-command__copy:hover {\r\n color: var(--settings-text);\r\n background: var(--settings-hover);\r\n}\r\n\r\n.settings-update-command__copy:focus-visible {\r\n outline: 2px solid var(--settings-focus);\r\n outline-offset: -2px;\r\n}\r\n\r\n.settings-update-actions {\n display: flex;\r\n align-items: center;\r\n min-width: 0;\r\n gap: 12px;\r\n flex-wrap: wrap;\r\n}\n\n.settings-storage-block {\n display: grid;\n gap: 12px;\n margin-bottom: 16px;\n}\n\r\n.settings-command-button,\r\n.settings-update-link {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex: none;\r\n width: max-content;\r\n max-width: 100%;\r\n min-height: 30px;\r\n gap: 6px;\r\n padding: 5px 10px;\r\n white-space: nowrap;\r\n color: var(--settings-primary-text);\r\n font: inherit;\r\n font-size: 12px;\r\n text-decoration: none;\r\n background: var(--settings-primary);\r\n border: 1px solid var(--settings-primary);\r\n border-radius: 7px;\r\n cursor: pointer;\r\n}\r\n\r\n.settings-command-button--secondary,\r\n.settings-update-link {\r\n color: var(--settings-text);\r\n background: var(--settings-panel);\r\n border-color: var(--settings-border);\r\n}\r\n\r\n.settings-command-button:hover:not(:disabled) {\r\n background: var(--settings-primary-hover);\r\n border-color: var(--settings-primary-hover);\r\n}\r\n\r\n.settings-command-button--secondary:hover:not(:disabled),\r\n.settings-update-link:hover {\r\n background: var(--settings-hover);\r\n border-color: var(--settings-border);\r\n}\r\n\r\n.settings-command-button--danger {\r\n color: #f87171;\r\n}\r\n\r\n.settings-command-button--danger:hover:not(:disabled) {\r\n color: #fecaca;\r\n background: rgb(127 29 29 / 24%);\r\n border-color: rgb(248 113 113 / 45%);\r\n}\r\n\r\n.settings-command-button:disabled {\r\n cursor: default;\r\n opacity: 0.45;\r\n}\r\n\r\n.settings-command-button:disabled,\r\n.settings-command-button[aria-disabled="true"] {\r\n opacity: 0.55;\r\n cursor: not-allowed;\r\n filter: none;\r\n}\r\n\r\n.settings-command-button:focus-visible,\r\n.settings-update-link:focus-visible {\r\n outline: 2px solid var(--settings-focus);\r\n outline-offset: 2px;\r\n}\r\n\r\n.codexhost-settings-icon {\r\n display: block;\r\n flex: none;\r\n stroke: currentColor;\r\n}\r\n\r\n@media (max-width: 720px) {\r\n .codexhost-settings-dialog {\r\n width: calc(100vw - 16px);\r\n height: calc(100vh - 16px);\r\n border-radius: 10px;\r\n }\r\n\r\n .settings-layout {\r\n grid-template-columns: minmax(0, 1fr);\r\n grid-template-rows: auto minmax(0, 1fr);\r\n }\r\n\r\n .settings-session-import-row {\r\n grid-template-columns: minmax(0, 1fr);\r\n }\r\n\r\n .settings-session-import-row__action {\r\n align-items: flex-start;\r\n }\r\n\r\n .settings-sidebar {\r\n border-right: 0;\r\n border-bottom: 1px solid var(--settings-border);\r\n }\r\n\r\n .settings-header {\r\n height: 56px;\r\n padding-inline: 14px;\r\n }\r\n\r\n .settings-sidebar {\r\n padding-top: 20px;\r\n }\r\n\r\n .settings-nav {\r\n flex: none;\r\n flex-direction: row;\r\n gap: 4px;\r\n padding: 7px 8px 8px;\r\n overflow-x: auto;\r\n overflow-y: hidden;\r\n }\r\n\r\n .settings-nav-section-label {\r\n display: none;\r\n }\r\n\r\n .settings-nav-button {\r\n width: auto;\r\n min-width: max-content;\r\n min-height: 34px;\r\n grid-template-columns: 16px auto;\r\n border-radius: 10px;\r\n }\r\n\r\n .settings-nav-star-link {\r\n margin-top: 0;\r\n }\r\n\r\n .settings-page__content {\r\n width: calc(100% - 40px);\r\n }\r\n\r\n .settings-page__content {\r\n padding-top: 32px;\r\n padding-bottom: 32px;\r\n }\r\n\r\n .settings-section-label {\r\n padding-bottom: 20px;\r\n font-size: 20px;\r\n line-height: 26px;\r\n }\r\n\r\n .settings-update-metadata {\r\n grid-template-columns: minmax(0, 1fr);\r\n gap: 16px;\r\n }\r\n\r\n .settings-status-row {\r\n grid-template-columns: minmax(0, 1fr) auto;\r\n gap: 16px;\r\n }\r\n\r\n .settings-account-header,\r\n .settings-connection-page-header {\r\n flex-direction: column;\r\n }\r\n\r\n .settings-account-header > .settings-command-button,\r\n .settings-connection-page-header > .settings-command-button {\r\n width: 100%;\r\n }\r\n\r\n .settings-connections-layout {\r\n grid-template-columns: minmax(0, 1fr);\r\n }\r\n\r\n .settings-connection-inspector {\r\n position: static;\r\n }\r\n\r\n .settings-status-row__detail {\r\n grid-column: 1 / -1;\r\n margin: -8px 0 0 58px;\r\n }\r\n}\r\n\r\n@media (forced-colors: active) {\r\n :host {\r\n --settings-bg: Canvas;\r\n --settings-sidebar: Canvas;\r\n --settings-panel: Canvas;\r\n --settings-surface: Canvas;\r\n --settings-surface-hover: Highlight;\r\n --settings-inset: Canvas;\r\n --settings-text: CanvasText;\r\n --settings-muted: GrayText;\r\n --settings-subtle: GrayText;\r\n --settings-border: ButtonBorder;\r\n --settings-divider: ButtonBorder;\r\n --settings-hover: Highlight;\r\n --settings-active: Highlight;\r\n --settings-focus: Highlight;\r\n --settings-primary: ButtonFace;\r\n --settings-primary-hover: Highlight;\r\n --settings-primary-text: ButtonText;\r\n --settings-warning: CanvasText;\r\n --settings-warning-bg: Canvas;\r\n --settings-warning-border: ButtonBorder;\r\n --settings-danger: CanvasText;\r\n --settings-danger-bg: Canvas;\r\n --settings-danger-border: ButtonBorder;\r\n --settings-success: CanvasText;\r\n }\r\n}\r\n\r\n@media (prefers-reduced-motion: reduce) {\r\n *,\r\n *::before,\r\n *::after {\r\n scroll-behavior: auto !important;\r\n transition-duration: 0s !important;\r\n }\r\n}\r\n\r\n/* Harness Mix: Model Configuration & One-click Install */\r\n.settings-model-config-panel {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 12px;\r\n padding: 14px;\r\n margin-top: 14px;\r\n border-radius: 8px;\r\n background: var(--settings-surface);\r\n border: 1px solid var(--settings-border);\r\n}\r\n\r\n.settings-model-config-head {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n}\r\n\r\n.settings-model-config-title {\r\n font-size: 13px;\r\n font-weight: 600;\r\n color: var(--settings-text);\r\n}\r\n\r\n.settings-model-config-description {\r\n font-size: 11px;\r\n color: var(--settings-muted);\r\n margin: 0;\r\n}\r\n\r\n.settings-model-config-loading,\r\n.settings-model-config-empty {\r\n font-size: 12px;\r\n color: var(--settings-muted);\r\n padding: 8px 0;\r\n}\r\n\r\n.settings-model-config-form {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 12px;\r\n margin-top: 4px;\r\n}\r\n\r\n.settings-model-config-field {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 6px;\r\n}\r\n\r\n.settings-model-config-label {\r\n font-size: 11px;\r\n font-weight: 600;\r\n color: var(--settings-muted);\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n}\r\n\r\n.settings-model-config-select {\r\n height: 32px;\r\n padding: 0 10px;\r\n border-radius: 6px;\r\n border: 1px solid var(--settings-border);\r\n background: var(--settings-panel);\r\n color: var(--settings-text);\r\n font-size: 12px;\r\n outline: none;\r\n}\r\n\r\n.settings-model-config-select:focus {\r\n border-color: var(--settings-primary);\r\n}\r\n\r\n.settings-model-config-actions {\r\n display: flex;\r\n align-items: center;\r\n flex-wrap: wrap;\r\n gap: 8px;\r\n margin-top: 6px;\r\n}\r\n\r\n.settings-model-config-feedback {\r\n font-size: 12px;\r\n font-weight: 500;\r\n}\r\n\r\n.settings-feedback-success {\r\n color: var(--settings-success);\r\n}\r\n\r\n.settings-feedback-error {\r\n color: var(--settings-danger);\r\n}\r\n\r\n.settings-feedback-info {\r\n color: var(--settings-primary);\r\n}\r\n\r\n.settings-install-command-box {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 6px;\r\n min-width: 0;\r\n margin: 0;\r\n}\r\n\r\n.settings-install-command-label {\r\n font-size: 11px;\r\n font-weight: 600;\r\n color: var(--settings-muted);\r\n}\r\n\r\n.settings-install-command-row {\r\n display: flex;\r\n align-items: center;\r\n background: var(--settings-inset);\r\n padding: 8px 12px;\r\n border-radius: 6px;\r\n border: 1px solid var(--settings-border);\r\n min-width: 0;\r\n overflow-x: auto;\r\n}\r\n\r\n.settings-install-command-row code {\r\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\r\n font-size: 12px;\r\n line-height: 18px;\r\n color: var(--settings-text);\r\n user-select: all;\r\n white-space: pre-wrap;\r\n word-break: break-all;\r\n}\r\n\r\n.settings-install-actions {\r\n display: grid;\r\n grid-template-columns: minmax(0, 1fr);\r\n gap: 8px;\r\n margin-top: 4px;\r\n}\r\n\r\n.settings-install-actions .settings-command-button {\r\n width: 100%;\r\n justify-content: center;\r\n}\r\n\r\n.settings-install-feedback {\r\n font-size: 12px;\r\n font-weight: 500;\r\n line-height: 18px;\r\n margin-top: 2px;\r\n overflow-wrap: anywhere;\r\n}\r\n\r\n.settings-install-manual-card {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 8px;\r\n background: var(--settings-inset);\r\n padding: 12px 14px;\r\n border-radius: 8px;\r\n border: 1px solid var(--settings-border);\r\n margin-top: 6px;\r\n margin-bottom: 4px;\r\n}\r\n\r\n.settings-install-manual-badge {\r\n display: inline-flex;\r\n align-items: center;\r\n font-size: 11px;\r\n font-weight: 600;\r\n color: var(--settings-accent, #10a37f);\r\n background: var(--settings-accent-subtle, rgba(16, 163, 127, 0.1));\r\n padding: 2px 8px;\r\n border-radius: 4px;\r\n width: fit-content;\r\n}\r\n\r\n.settings-install-manual-notice {\r\n font-size: 12px;\r\n line-height: 18px;\r\n color: var(--settings-text);\r\n margin: 0;\r\n}\r\n\r\n.settings-install-steps {\r\n margin: 0;\r\n padding-left: 18px;\r\n font-size: 12px;\r\n line-height: 20px;\r\n color: var(--settings-muted);\r\n}\r\n\r\n.settings-install-steps li {\r\n margin-bottom: 2px;\r\n}\r\n/* MCP and Skills share native settings controls while keeping separate flows. */\n.settings-integrations-controls { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; margin: 18px 0 12px; }\n.settings-integrations-controls input { flex: 1; min-width: 180px; }\n.settings-integrations-controls input[hidden] { display: none; }\n.settings-integrations-controls select, .settings-integrations-controls input,\n.settings-integrations-field input, .settings-integrations-toolbar input { box-sizing: border-box; padding: 9px 11px; border: 1px solid var(--settings-border, #8885); border-radius: 8px; color: inherit; background: var(--settings-input, transparent); font: inherit; }\n.settings-integrations-status { min-height: 18px; margin: 0 0 6px; color: var(--settings-muted); font-size: 12px; }\n.settings-integrations-body p { font-size: 12px; line-height: 1.6; opacity: .8; }\n.settings-integrations-toolbar { display: flex; gap: 10px; align-items: center; margin: 8px 0 16px; }\n.settings-integrations-toolbar input { flex: 1; }\n.settings-integrations-list { display: grid; gap: 8px; }\n.settings-integrations-row { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; border: 1px solid var(--settings-border, #8885); padding: 14px; border-radius: 10px; background: var(--settings-surface, transparent); }\n.settings-integrations-row > div { flex: 1; min-width: 180px; }\n.settings-integrations-row p { margin: 3px 0; }\n.settings-integrations-row code { display: block; overflow-wrap: anywhere; font-size: 11px; color: var(--settings-muted); }\n.settings-integrations-row--native { border-style: dashed; }\n.settings-integrations-empty { padding: 36px 18px; border: 1px dashed var(--settings-border, #8885); border-radius: 10px; text-align: center; color: var(--settings-muted); font-size: 12px; }\n.settings-integrations-editor-head { display: flex; align-items: center; gap: 12px; }\n.settings-integrations-editor-head h3 { margin: 0; }\n.settings-integrations-form { display: grid; gap: 14px; margin: 16px 0 28px; }\n.settings-integrations-form--card { padding: 16px; border: 1px solid var(--settings-border, #8885); border-radius: 12px; }\n.settings-integrations-field { display: grid; gap: 6px; font-size: 12px; }\n.settings-integrations-form > button { justify-self: start; }\n.settings-mcp-args { display: grid; gap: 7px; }\n.settings-mcp-arg { display: flex; gap: 8px; align-items: center; }\n.settings-mcp-arg input { flex: 1; }\n.settings-mcp-kv-row { display: flex; gap: 8px; align-items: center; }\n.settings-mcp-kv-row input { flex: 1; }\n.settings-mcp-add-arg { margin-top: 7px; }\n.settings-mcp-docs-link { display: inline-flex; align-items: center; gap: 4px; color: var(--settings-muted, #888); font-size: 13px; text-decoration: none; transition: color 150ms ease; }\n.settings-mcp-docs-link:hover { color: var(--settings-text, #fff); text-decoration: underline; }\n.settings-integrations-editor-head .settings-command-button--danger { margin-left: auto; }\n.settings-mcp-type-toggle { display: inline-flex; padding: 3px; border-radius: 8px; background: var(--settings-inset, rgba(255, 255, 255, 0.06)); border: 1px solid var(--settings-border, #8885); gap: 2px; width: fit-content; }\n.settings-mcp-type-btn { padding: 5px 14px; border-radius: 6px; border: none; background: transparent; color: var(--settings-muted, #888); font: inherit; font-size: 12px; font-weight: 500; cursor: pointer; transition: all 120ms ease; }\n.settings-mcp-type-btn:hover { color: var(--settings-text, #fff); }\n.settings-mcp-type-btn[data-active="true"] { background: var(--settings-active, rgba(255, 255, 255, 0.15)); color: var(--settings-text, #fff); font-weight: 600; }\n.settings-mcp-notice { margin: 4px 0 0; color: var(--settings-muted, #888); font-size: 12px; line-height: 1.5; }\n.settings-mcp-section { display: grid; gap: 14px; }\n.settings-mcp-icon-btn { display: inline-flex; align-items: center; justify-content: center; width: 34px; height: 34px; padding: 0; border: 1px solid var(--settings-border, #8885); border-radius: 8px; background: var(--settings-input, transparent); color: var(--settings-muted, #888); cursor: pointer; flex: none; transition: all 120ms ease; }\n.settings-mcp-icon-btn:hover:not(:disabled) { background: rgba(239, 68, 68, 0.15); border-color: rgba(239, 68, 68, 0.4); color: #f87171; }\n.settings-mcp-icon-btn svg { width: 14px; height: 14px; display: block; }\n.settings-integrations-callout { margin: 0; padding: 10px 12px; border-radius: 8px; background: var(--settings-inset); }\n.settings-skill-dropzone { display: grid; justify-items: center; gap: 8px; padding: 34px 22px; margin: 8px 0 18px; border: 1.5px dashed var(--settings-border, #8887); border-radius: 14px; background: var(--settings-inset); text-align: center; transition: border-color 120ms ease, background 120ms ease, transform 120ms ease; }\n.settings-skill-dropzone > span { max-width: 520px; color: var(--settings-muted); font-size: 12px; line-height: 18px; }\n.settings-skill-dropzone[data-drag-over="true"] { border-color: var(--settings-accent, #10a37f); background: var(--settings-accent-subtle, rgba(16, 163, 127, .1)); transform: scale(.995); }\n.settings-skill-dropzone[data-disabled="true"] { opacity: .55; }\n.settings-skills-target-row { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; justify-content: center; margin-top: 6px; }\n.settings-skills-target-row select { padding: 6px 10px; border: 1px solid var(--settings-border, #8885); border-radius: 8px; background: var(--settings-input, transparent); color: inherit; font: inherit; font-size: 12px; }\n.settings-skills-overview-stats { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; margin: 6px 0 10px; font-size: 12px; color: var(--settings-muted); }\n.settings-skills-tabs { display: inline-flex; padding: 3px; border-radius: 8px; background: var(--settings-inset, rgba(255, 255, 255, 0.06)); border: 1px solid var(--settings-border, #8885); gap: 2px; }\n.settings-skills-tab-btn { padding: 5px 14px; border-radius: 6px; border: none; background: transparent; color: var(--settings-muted, #888); font: inherit; font-size: 12px; font-weight: 500; cursor: pointer; transition: all 120ms ease; }\n.settings-skills-tab-btn:hover { color: var(--settings-text, #fff); }\n.settings-skills-tab-btn[data-active="true"] { background: var(--settings-active, rgba(255, 255, 255, 0.15)); color: var(--settings-text, #fff); font-weight: 600; }\n.settings-skills-overview-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); gap: 14px; margin-top: 10px; }\n.settings-skills-harness-card { border: 1px solid var(--settings-border, #8885); border-radius: 12px; padding: 14px; background: var(--settings-surface, transparent); display: flex; flex-direction: column; gap: 10px; }\n.settings-skills-harness-head { display: flex; justify-content: space-between; align-items: center; border-bottom: 1px solid var(--settings-border, #8883); padding-bottom: 8px; }\n.settings-skills-harness-head strong { font-size: 14px; }\n.settings-skills-badge { font-size: 11px; padding: 2px 8px; border-radius: 10px; background: var(--settings-inset, rgba(255, 255, 255, 0.08)); color: var(--settings-muted); }\n.settings-skills-badge--active { background: rgba(16, 163, 127, 0.15); color: #10a37f; }\n.settings-skills-list-compact { display: flex; flex-direction: column; gap: 8px; max-height: 280px; overflow-y: auto; }\n.settings-skills-item-row { display: flex; justify-content: space-between; align-items: center; gap: 8px; padding: 6px 8px; border-radius: 6px; background: var(--settings-inset, rgba(255, 255, 255, 0.03)); font-size: 12px; }\n.settings-skills-item-row strong { font-size: 13px; }\n.settings-skills-item-row code { font-size: 10px; color: var(--settings-muted); overflow-wrap: anywhere; display: block; }\n.settings-skills-item-actions { display: flex; gap: 6px; align-items: center; flex: none; }\n.settings-skills-matrix-list { display: flex; flex-direction: column; gap: 10px; margin-top: 10px; }\n.settings-skills-matrix-card { border: 1px solid var(--settings-border, #8885); border-radius: 10px; padding: 12px 14px; background: var(--settings-surface, transparent); display: flex; flex-direction: column; gap: 8px; }\n.settings-skills-matrix-head { display: flex; justify-content: space-between; align-items: center; }\n.settings-skills-matrix-head span { font-size: 11px; color: var(--settings-muted); }\n.settings-skills-tags { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }\n.settings-skills-tag { font-size: 11px; padding: 3px 8px; border-radius: 6px; background: rgba(16, 163, 127, 0.15); color: #10a37f; border: 1px solid rgba(16, 163, 127, 0.3); }\n.settings-skills-sync-actions { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; margin-top: 4px; }\n.settings-skills-sync-modal { border: 1px solid var(--settings-border, #8885); border-radius: 12px; background: var(--settings-bg, #1e1e1e); color: inherit; padding: 20px 24px; max-width: 420px; box-shadow: 0 16px 32px rgba(0, 0, 0, 0.5); }\n.settings-skills-sync-modal::backdrop { background: rgba(0, 0, 0, 0.6); backdrop-filter: blur(2px); }\n.settings-skills-sync-modal h3 { margin: 0 0 8px; font-size: 16px; }\n.settings-skills-sync-modal p { margin: 0 0 12px; font-size: 12px; color: var(--settings-muted); }\n.settings-mcp-overview-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(340px, 1fr)); gap: 14px; margin-top: 10px; }\n.settings-mcp-harness-card { border: 1px solid var(--settings-border, #8885); border-radius: 12px; padding: 14px; background: var(--settings-surface, transparent); display: flex; flex-direction: column; gap: 10px; }\n.settings-mcp-harness-head { display: flex; justify-content: space-between; align-items: center; border-bottom: 1px solid var(--settings-border, #8883); padding-bottom: 8px; }\n.settings-mcp-harness-head strong { font-size: 14px; }\n.settings-mcp-native-box { padding: 8px 10px; border-radius: 8px; background: rgba(16, 163, 127, 0.08); border: 1px dashed rgba(16, 163, 127, 0.3); font-size: 11px; display: flex; flex-direction: column; gap: 4px; }\n.settings-mcp-native-title { font-weight: 600; color: #10a37f; display: flex; align-items: center; gap: 6px; }\n.settings-mcp-native-item { display: flex; flex-direction: column; gap: 2px; color: var(--settings-muted); }\n.settings-mcp-native-item code { font-size: 10px; overflow-wrap: anywhere; }\n.settings-mcp-list-compact { display: flex; flex-direction: column; gap: 8px; max-height: 280px; overflow-y: auto; }\n.settings-mcp-item-row { display: flex; justify-content: space-between; align-items: center; gap: 8px; padding: 6px 8px; border-radius: 6px; background: var(--settings-inset, rgba(255, 255, 255, 0.03)); font-size: 12px; }\n.settings-mcp-item-row strong { font-size: 13px; }\n.settings-mcp-item-row code { font-size: 10px; color: var(--settings-muted); overflow-wrap: anywhere; display: block; }\n.settings-mcp-item-actions { display: flex; gap: 6px; align-items: center; flex: none; }\n.settings-mcp-card-footer { display: flex; justify-content: flex-end; margin-top: auto; padding-top: 6px; border-top: 1px solid var(--settings-border, #8882); }\n.settings-mcp-matrix-list { display: flex; flex-direction: column; gap: 10px; margin-top: 10px; }\n.settings-mcp-matrix-card { border: 1px solid var(--settings-border, #8885); border-radius: 10px; padding: 12px 14px; background: var(--settings-surface, transparent); display: flex; flex-direction: column; gap: 8px; }\n.settings-mcp-matrix-head { display: flex; justify-content: space-between; align-items: center; }\n.settings-mcp-matrix-head span { font-size: 11px; color: var(--settings-muted); }\n.settings-mcp-tags { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }\n.settings-mcp-tag { font-size: 11px; padding: 3px 8px; border-radius: 6px; background: rgba(16, 163, 127, 0.15); color: #10a37f; border: 1px solid rgba(16, 163, 127, 0.3); }\n.settings-mcp-tag--disabled { background: rgba(255, 255, 255, 0.05); color: var(--settings-muted); border-color: var(--settings-border, #8885); }\n.settings-mcp-sync-actions { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; margin-top: 4px; }\n.settings-mcp-distribute-modal { border: 1px solid var(--settings-border, #8885); border-radius: 12px; background: var(--settings-bg, #1e1e1e); color: inherit; padding: 20px 24px; max-width: 540px; width: 92%; max-height: 85vh; overflow-y: auto; box-shadow: 0 16px 32px rgba(0, 0, 0, 0.5); }\n.settings-mcp-distribute-modal::backdrop { background: rgba(0, 0, 0, 0.6); backdrop-filter: blur(2px); }\n.settings-mcp-distribute-modal h3 { margin: 0 0 8px; font-size: 16px; }\n.settings-mcp-distribute-modal p { margin: 0 0 12px; font-size: 12px; color: var(--settings-muted); }\n\n';
|
|
31141
|
+
var shell_default = ':host {\r\n --settings-bg: light-dark(#ffffff, #202020);\r\n --settings-sidebar: light-dark(#f7f7f8, #191919);\r\n --settings-panel: light-dark(#ffffff, #232323);\r\n --settings-surface: light-dark(#f6f6f6, #292929);\r\n --settings-surface-hover: light-dark(#eeeeee, #303030);\r\n --settings-inset: light-dark(#f3f3f3, #161616);\r\n --settings-text: light-dark(#0d0d0d, #ececec);\r\n --settings-muted: light-dark(#676767, #a3a3a3);\r\n --settings-subtle: light-dark(#8a8a8a, #777777);\r\n --settings-border: light-dark(rgb(13 13 13 / 9%), rgb(255 255 255 / 9%));\r\n --settings-divider: light-dark(rgb(13 13 13 / 7%), rgb(255 255 255 / 7%));\r\n --settings-hover: light-dark(rgb(13 13 13 / 5%), rgb(255 255 255 / 7%));\r\n --settings-active: light-dark(rgb(13 13 13 / 7%), rgb(255 255 255 / 9%));\r\n --settings-focus: light-dark(#0b75d1, #66aaf9);\r\n --settings-primary: light-dark(#171717, #f4f4f4);\r\n --settings-primary-hover: light-dark(#2f2f2f, #ffffff);\r\n --settings-primary-text: light-dark(#ffffff, #171717);\r\n --settings-warning: light-dark(#8a5500, #f5c96a);\r\n --settings-warning-bg: light-dark(#fff8e6, rgb(245 201 106 / 8%));\r\n --settings-warning-border: light-dark(#ead8a8, rgb(245 201 106 / 24%));\r\n --settings-danger: light-dark(#b42318, #f87171);\r\n --settings-danger-bg: light-dark(#fff1f0, rgb(239 68 68 / 8%));\r\n --settings-danger-border: light-dark(#f3c7c3, rgb(239 68 68 / 22%));\r\n --settings-success: light-dark(#16784a, #4ade80);\r\n color: var(--settings-text);\r\n color-scheme: inherit;\r\n font:\r\n 13px/1.5 system-ui,\r\n -apple-system,\r\n BlinkMacSystemFont,\r\n "Segoe UI",\r\n sans-serif;\r\n letter-spacing: 0;\r\n}\r\n\r\n*,\r\n*::before,\r\n*::after {\r\n box-sizing: border-box;\r\n letter-spacing: 0;\r\n}\r\n\r\nbutton,\r\ninput,\r\nselect {\r\n font: inherit;\r\n}\r\n\r\nbutton {\r\n color: inherit;\r\n}\r\n\r\n[hidden] {\r\n display: none !important;\r\n}\r\n\r\n.settings-visually-hidden {\r\n position: absolute;\r\n width: 1px;\r\n height: 1px;\r\n padding: 0;\r\n margin: -1px;\r\n overflow: hidden;\r\n clip-path: inset(50%);\r\n white-space: nowrap;\r\n border: 0;\r\n}\r\n\r\n.harnessmix-settings-dialog {\r\n width: min(1120px, calc(100vw - 48px));\r\n height: min(780px, calc(100vh - 88px));\r\n max-width: none;\r\n max-height: calc(100vh - 88px);\r\n margin-top: max(56px, calc((100vh - 780px) / 2));\r\n margin-inline: auto;\r\n margin-bottom: auto;\r\n padding: 0;\r\n overflow: hidden;\r\n color: var(--settings-text);\r\n background: var(--settings-bg);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 14px;\r\n box-shadow: light-dark(0 16px 42px rgb(0 0 0 / 16%), 0 20px 54px rgb(0 0 0 / 42%));\r\n}\r\n\r\n.harnessmix-settings-dialog::backdrop {\r\n background: light-dark(rgb(0 0 0 / 24%), rgb(0 0 0 / 56%));\r\n backdrop-filter: blur(1px);\r\n}\r\n\r\n.settings-frame,\r\n.settings-layout {\r\n width: 100%;\r\n height: 100%;\r\n min-width: 0;\r\n min-height: 0;\r\n}\r\n\r\n.settings-frame {\r\n display: flex;\r\n flex-direction: column;\r\n}\r\n\r\n.settings-layout {\r\n flex: 1;\r\n display: grid;\r\n grid-template-columns: 184px minmax(0, 1fr);\r\n background: var(--settings-bg);\r\n}\r\n\r\n.settings-sidebar {\r\n display: flex;\r\n min-width: 0;\r\n min-height: 0;\r\n flex-direction: column;\r\n overflow: hidden;\r\n background: var(--settings-sidebar);\r\n border-right: 1px solid var(--settings-border);\r\n padding-top: 14px;\r\n}\r\n\r\n.settings-header {\r\n display: flex;\r\n align-items: center;\r\n min-width: 0;\r\n height: 50px;\r\n flex: none;\r\n padding: 0 16px;\r\n border-bottom: 1px solid var(--settings-border);\r\n}\r\n\r\n.settings-header-actions {\r\n display: flex;\r\n align-items: center;\r\n flex: none;\r\n gap: 12px;\r\n margin-left: auto;\r\n}\r\n\r\n.settings-brand {\r\n display: flex;\r\n align-items: center;\r\n min-width: 0;\r\n gap: 7px;\r\n}\r\n\r\n.settings-brand__mark {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 26px;\r\n height: 26px;\r\n flex: none;\r\n color: var(--settings-text);\r\n}\r\n\r\n.settings-brand__mark .harnessmix-settings-icon {\r\n width: 24px;\r\n height: 24px;\r\n object-fit: contain;\r\n}\r\n\r\n.settings-brand__copy {\r\n display: flex;\r\n min-width: 0;\r\n align-items: baseline;\r\n gap: 0;\r\n line-height: 20px;\r\n}\r\n\r\n.settings-brand__name {\r\n overflow: hidden;\r\n color: var(--settings-text);\r\n font-size: 13px;\r\n font-weight: 600;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.settings-brand__title {\r\n margin-left: 8px;\r\n padding-left: 8px;\r\n color: var(--settings-muted);\r\n font-size: 13px;\r\n font-weight: 400;\r\n border-left: 1px solid var(--settings-border);\r\n}\r\n\r\n.settings-nav {\r\n display: flex;\r\n min-width: 0;\r\n min-height: 0;\r\n flex: 1;\r\n flex-direction: column;\r\n gap: 2px;\r\n padding: 0 7px 10px;\r\n overflow-y: auto;\r\n}\r\n\r\n.settings-nav-section-label {\r\n min-height: 24px;\r\n padding: 4px 9px 2px;\r\n color: var(--settings-subtle);\r\n font-size: 11px;\r\n font-weight: 600;\r\n line-height: 18px;\r\n}\r\n\r\n.settings-nav-section-label:not(:first-child) {\r\n margin-top: 8px;\r\n}\r\n\r\n.settings-nav-button {\r\n display: grid;\r\n grid-template-columns: 16px minmax(0, 1fr);\r\n align-items: center;\r\n width: 100%;\r\n position: relative;\r\n min-height: 34px;\r\n flex: none;\r\n gap: 9px;\r\n padding: 6px 9px;\r\n color: var(--settings-text);\r\n font-size: 13px;\r\n line-height: 20px;\r\n text-align: left;\r\n background: transparent;\r\n border: 0;\r\n border-radius: 8px;\r\n cursor: pointer;\r\n}\r\n\r\n.settings-nav-button .harnessmix-settings-icon {\r\n width: 16px;\r\n height: 16px;\r\n opacity: 0.9;\r\n}\r\n\r\n.settings-nav-button:hover {\r\n background: var(--settings-hover);\r\n}\r\n\r\n.settings-nav-button[aria-current="page"] {\r\n background: var(--settings-active);\r\n color: var(--settings-text);\r\n font-weight: 500;\r\n}\r\n\r\n.settings-nav-button span {\r\n min-width: 0;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.settings-nav-star-link {\r\n margin-top: 0;\r\n color: var(--settings-text);\r\n text-decoration: none;\r\n}\r\n\r\n.settings-nav-star-link .harnessmix-settings-icon {\r\n color: var(--settings-warning);\r\n}\r\n\r\n.settings-nav-star-link:hover {\r\n color: var(--settings-warning);\r\n background: var(--settings-warning-bg);\r\n}\r\n\r\n.settings-icon-button {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 32px;\r\n height: 32px;\r\n flex: none;\r\n padding: 0;\r\n color: var(--settings-muted);\r\n background: transparent;\r\n border: 0;\r\n border-radius: 8px;\r\n cursor: pointer;\r\n transition: background-color 0.15s ease, color 0.15s ease, transform 0.08s ease;\r\n}\r\n\r\n.settings-icon-button:hover {\r\n color: var(--settings-text);\r\n background: var(--settings-hover);\r\n}\r\n\r\n.settings-icon-button:active {\r\n background: var(--settings-active);\r\n transform: scale(0.95);\r\n}\r\n\r\n.settings-header-actions .settings-icon-button {\r\n width: 34px;\r\n height: 34px;\r\n border-radius: 8px;\r\n}\r\n\r\n.settings-header-actions .settings-icon-button:hover {\r\n color: var(--settings-text);\r\n background: var(--settings-hover);\r\n}\r\n\r\n.settings-icon-button:focus-visible,\r\n.settings-nav-button:focus-visible {\r\n outline: 2px solid var(--settings-focus);\r\n outline-offset: 1px;\r\n}\r\n\r\n.settings-page {\r\n display: block;\r\n position: relative;\r\n min-width: 0;\r\n min-height: 0;\r\n overflow-y: auto;\r\n background: var(--settings-bg);\r\n scrollbar-gutter: stable;\r\n}\r\n\r\n.settings-page__content {\r\n width: min(930px, calc(100% - 80px));\r\n margin-inline: auto;\r\n}\r\n\r\n.settings-page__content {\r\n min-width: 0;\r\n padding: 28px 0 36px;\r\n}\r\n\r\n.settings-section-label {\r\n min-height: auto;\r\n margin: 0;\r\n padding: 0 0 18px;\r\n color: var(--settings-text);\r\n font-size: 18px;\r\n font-weight: 600;\r\n line-height: 26px;\r\n}\r\n\r\n.settings-status-list,\r\n.settings-empty {\r\n overflow: hidden;\r\n background: var(--settings-panel);\r\n}\r\n\r\n.settings-status-row {\r\n display: grid;\r\n grid-template-columns: minmax(170px, 1fr) auto minmax(280px, 1.45fr);\r\n position: relative;\r\n align-items: center;\r\n min-height: 72px;\r\n gap: 20px;\r\n padding: 12px 0;\r\n}\r\n\r\n.settings-status-row:not(:last-child)::after {\r\n content: "";\r\n position: absolute;\r\n right: 0;\r\n bottom: 0;\r\n left: 0;\r\n height: 1px;\r\n background: var(--settings-divider);\r\n}\r\n\r\n.settings-status-row__identity {\r\n display: inline-flex;\r\n align-items: center;\r\n min-width: 0;\r\n color: var(--settings-text);\r\n gap: 10px;\r\n font-size: 14px;\r\n font-weight: 500;\r\n line-height: 22px;\r\n}\r\n\r\n.settings-status-row__icon {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 36px;\r\n height: 36px;\r\n flex: none;\r\n color: var(--settings-muted);\r\n background: var(--settings-surface);\r\n border-radius: 50%;\r\n}\r\n\r\n.settings-status-badge {\r\n flex: none;\r\n padding: 3px 8px;\r\n color: var(--settings-muted);\r\n font-size: 11px;\r\n font-weight: 500;\r\n line-height: 18px;\r\n background: var(--settings-surface);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 6px;\r\n}\r\n\r\n.settings-status-row__detail {\r\n min-width: 0;\r\n color: var(--settings-muted);\r\n font-size: 13px;\r\n line-height: 20px;\r\n}\r\n\r\n.settings-page-description {\r\n max-width: 760px;\r\n margin: -10px 0 20px;\r\n color: var(--settings-muted);\r\n font-size: 12px;\r\n line-height: 18px;\r\n}\r\n\r\n.settings-session-import-header {\r\n display: flex;\r\n align-items: flex-start;\r\n justify-content: space-between;\r\n gap: 24px;\r\n}\r\n\r\n.settings-session-import-header .settings-section-label {\r\n min-width: 0;\r\n}\r\n\r\n.settings-session-import-harness {\r\n display: flex;\r\n align-items: center;\r\n min-width: 0;\r\n gap: 12px;\r\n margin: -12px 0 16px;\r\n color: var(--settings-muted);\r\n font-size: 13px;\r\n}\r\n\r\n.settings-session-import-harness > span {\r\n flex: none;\r\n}\r\n\r\n.settings-session-import-harness__options {\r\n display: flex;\r\n align-items: center;\r\n min-width: 0;\r\n flex: 1;\r\n gap: 6px;\r\n overflow-x: auto;\r\n overflow-y: hidden;\r\n scrollbar-width: none;\r\n}\r\n\r\n.settings-session-import-harness__options::-webkit-scrollbar {\r\n display: none;\r\n}\r\n\r\n.settings-session-import-harness__option {\r\n min-height: 32px;\r\n flex: none;\r\n padding: 6px 10px;\r\n color: var(--settings-muted);\r\n font: inherit;\r\n font-size: 12px;\r\n white-space: nowrap;\r\n background: rgb(255 255 255 / 4%);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 6px;\r\n cursor: pointer;\r\n}\r\n\r\n.settings-session-import-harness__option[aria-pressed="true"] {\r\n color: var(--settings-text);\r\n background: var(--settings-active);\r\n border-color: rgb(51 156 255 / 50%);\r\n}\r\n\r\n.settings-session-import-harness__option:disabled {\r\n opacity: 0.38;\r\n cursor: not-allowed;\r\n}\r\n\r\n.settings-session-import-harness__option:focus-visible {\r\n outline: 2px solid var(--settings-focus);\r\n outline-offset: 2px;\r\n}\r\n\r\n.settings-session-import-harness + .settings-page-description {\r\n margin-top: 0;\r\n margin-bottom: 4px;\r\n}\r\n\r\n.settings-session-import-availability-note {\r\n margin-top: 0;\r\n}\r\n\r\n.settings-session-import-search,\r\n.settings-session-import-pagination {\r\n display: flex;\r\n flex-wrap: wrap;\r\n align-items: center;\r\n gap: 10px;\r\n margin: 16px 0;\r\n}\r\n\r\n.settings-session-import-search input {\r\n flex: 1;\r\n min-width: 160px;\r\n}\r\n\r\n.settings-session-import-search input,\r\n.settings-session-import-pagination select {\r\n min-height: 36px;\r\n padding: 6px 10px;\r\n color: var(--settings-text);\r\n background: var(--settings-bg);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 6px;\r\n}\r\n\r\n.settings-session-import-search input:focus-visible,\r\n.settings-session-import-pagination select:focus-visible {\r\n outline: 2px solid var(--settings-focus);\r\n outline-offset: 2px;\r\n}\r\n\r\n.settings-session-import-pagination {\r\n color: var(--settings-muted);\r\n font-size: 12px;\r\n}\r\n\r\n.settings-session-import-pagination label {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n}\r\n\r\n.settings-session-import-pagination > span {\r\n flex: 1;\r\n min-width: 130px;\r\n}\r\n\r\n.settings-session-import-pagination__navigation {\r\n display: flex;\r\n gap: 8px;\r\n margin-left: auto;\r\n}\r\n\r\n.settings-session-import-content,\r\n.settings-session-import-list {\r\n display: grid;\r\n gap: 10px;\r\n}\r\n\r\n.settings-session-import-status {\r\n display: flex;\r\n align-items: center;\r\n min-height: 64px;\r\n gap: 12px;\r\n padding: 16px;\r\n color: var(--settings-muted);\r\n background: var(--settings-panel);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 8px;\r\n}\r\n\r\n.settings-session-import-status.is-error {\r\n color: #ef4444;\r\n}\r\n\r\n.settings-session-import-recovery {\r\n display: grid;\r\n justify-items: start;\r\n gap: 14px;\r\n padding: 16px;\r\n background: var(--settings-panel);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 8px;\r\n}\r\n\r\n.settings-session-import-recovery:focus-visible {\r\n outline: 2px solid var(--settings-focus);\r\n outline-offset: 2px;\r\n}\r\n\r\n.settings-session-import-recovery__copy {\r\n display: grid;\r\n gap: 4px;\r\n}\r\n\r\n.settings-session-import-recovery__copy strong {\r\n color: var(--settings-text);\r\n font-size: 14px;\r\n}\r\n\r\n.settings-session-import-recovery__copy p {\r\n margin: 0;\r\n color: var(--settings-muted);\r\n font-size: 13px;\r\n line-height: 20px;\r\n}\r\n\r\n.settings-session-import-recovery__path {\r\n display: flex;\r\n align-items: stretch;\r\n width: 100%;\r\n min-width: 0;\r\n overflow: hidden;\r\n border: 1px solid var(--settings-border);\r\n border-radius: 6px;\r\n}\r\n\r\n.settings-session-import-recovery__path code {\r\n min-width: 0;\r\n flex: 1;\r\n padding: 8px 10px;\r\n overflow-x: auto;\r\n color: var(--settings-text);\r\n font-size: 12px;\r\n line-height: 20px;\r\n white-space: nowrap;\r\n}\r\n\r\n.settings-session-import-recovery__path .settings-command-button {\r\n min-height: 0;\r\n flex: none;\r\n border-width: 0 0 0 1px;\r\n border-radius: 0;\r\n}\r\n\r\n.settings-session-import-row {\r\n display: grid;\r\n grid-template-columns: minmax(0, 1fr) auto;\r\n align-items: center;\r\n gap: 20px;\r\n min-width: 0;\r\n padding: 16px;\r\n background: var(--settings-panel);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 8px;\r\n}\r\n\r\n.settings-session-import-row__copy {\r\n display: grid;\r\n min-width: 0;\r\n gap: 4px;\r\n}\r\n\r\n.settings-session-import-row__copy strong {\r\n overflow: hidden;\r\n color: var(--settings-text);\r\n font-size: 14px;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.settings-session-import-row__copy span,\r\n.settings-session-import-row__cwd {\r\n overflow: hidden;\r\n color: var(--settings-muted);\r\n font-size: 12px;\r\n line-height: 18px;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.settings-session-import-row__cwd {\r\n display: block;\r\n min-width: 0;\r\n background: transparent;\r\n}\r\n\r\n.settings-session-import-row__action {\r\n display: flex;\r\n align-items: flex-end;\r\n flex-direction: column;\r\n gap: 8px;\r\n}\r\n\r\n.settings-session-import-running {\r\n color: var(--settings-muted);\r\n font-size: 12px;\r\n}\r\n\r\n.settings-preference-row {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: 32px;\r\n min-height: 88px;\r\n padding: 18px 0;\r\n border-top: 1px solid var(--settings-divider);\r\n border-bottom: 1px solid var(--settings-divider);\r\n}\r\n\r\n.settings-preference-row__copy {\r\n display: flex;\r\n flex: 1 1 auto;\r\n flex-direction: column;\r\n min-width: 0;\r\n gap: 5px;\r\n}\r\n\r\n.settings-preference-row__copy strong {\r\n color: var(--settings-text);\r\n font-size: 15px;\r\n font-weight: 600;\r\n line-height: 22px;\r\n}\r\n\r\n.settings-preference-row__copy span {\r\n max-width: 680px;\r\n color: var(--settings-muted);\r\n font-size: 13px;\r\n line-height: 20px;\r\n}\r\n\r\n.settings-preference-switch {\r\n display: inline-flex;\r\n align-items: center;\r\n width: 42px;\r\n height: 24px;\r\n flex: none;\r\n padding: 2px;\r\n border: 0;\r\n border-radius: 999px;\r\n background: var(--settings-surface-hover);\r\n cursor: pointer;\r\n transition: background 120ms ease;\r\n}\r\n\r\n.settings-preference-switch[aria-checked="true"] {\r\n justify-content: flex-end;\r\n background: var(--settings-focus);\r\n}\r\n\r\n.settings-preference-switch:focus-visible {\r\n outline: 2px solid var(--settings-focus);\r\n outline-offset: 2px;\r\n}\r\n\r\n.settings-preference-switch__thumb {\r\n width: 20px;\r\n height: 20px;\r\n border-radius: 50%;\r\n background: var(--settings-primary-text);\r\n box-shadow: 0 1px 3px rgb(0 0 0 / 24%);\r\n}\r\n\r\n.settings-connection-page-header {\r\n display: flex;\r\n align-items: flex-start;\r\n justify-content: space-between;\r\n gap: 18px;\r\n margin-bottom: 18px;\r\n}\r\n\r\n.settings-connection-page-header .settings-section-label {\r\n padding-bottom: 0;\r\n}\r\n\r\n.settings-connection-page-header .settings-page-description {\r\n margin: 5px 0 0;\r\n}\r\n\r\n.settings-connections-content,\r\n.settings-connections-layout,\r\n.settings-connection-list,\r\n.settings-connection-rows {\r\n min-width: 0;\r\n}\r\n\r\n.settings-connections-layout {\r\n display: grid;\r\n grid-template-columns: minmax(0, 1.55fr) minmax(280px, 0.85fr);\r\n align-items: start;\r\n gap: 18px;\r\n}\r\n\r\n.settings-connection-list,\r\n.settings-connection-inspector {\r\n overflow: hidden;\r\n background: var(--settings-panel);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 10px;\r\n}\r\n\r\n.settings-connection-host-strip {\r\n display: grid;\r\n grid-template-columns: 30px minmax(0, 1fr) 30px;\r\n align-items: center;\r\n min-width: 0;\r\n gap: 5px;\r\n padding: 9px 10px;\r\n border-bottom: 1px solid var(--settings-divider);\r\n}\r\n\r\n.settings-connection-host-scroll {\r\n display: none;\r\n align-items: center;\r\n justify-content: center;\r\n width: 30px;\r\n height: 34px;\r\n padding: 0;\r\n color: var(--settings-muted);\r\n background: var(--settings-inset);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 8px;\r\n cursor: pointer;\r\n}\r\n\r\n.settings-connection-host-strip[data-connection-host-overflow="true"]\r\n .settings-connection-host-scroll {\r\n display: inline-flex;\r\n}\r\n\r\n.settings-connection-host-strip:not([data-connection-host-overflow="true"]) {\r\n grid-template-columns: minmax(0, 1fr);\r\n}\r\n\r\n.settings-connection-host-scroll:hover:not(:disabled) {\r\n color: var(--settings-text);\r\n background: var(--settings-hover);\r\n}\r\n\r\n.settings-connection-host-scroll:disabled {\r\n cursor: default;\r\n opacity: 0.35;\r\n}\r\n\r\n.settings-connection-host-scroll:focus-visible,\r\n.settings-connection-host-tab:focus-visible,\r\n.settings-connection-row:focus-visible,\r\n.settings-connection-install-link:focus-visible,\r\n.settings-connection-view-error:focus-visible {\r\n outline: 2px solid var(--settings-focus);\r\n outline-offset: 1px;\r\n}\r\n\r\n.settings-connection-host-tabs {\r\n display: flex;\r\n align-items: center;\r\n min-width: 0;\r\n gap: 6px;\r\n overflow-x: auto;\r\n overflow-y: hidden;\r\n overscroll-behavior-x: contain;\r\n scrollbar-width: none;\r\n scroll-behavior: smooth;\r\n scroll-snap-type: x proximity;\r\n touch-action: pan-x;\r\n}\r\n\r\n.settings-connection-host-tabs::-webkit-scrollbar {\r\n display: none;\r\n}\r\n\r\n.settings-connection-host-tab {\r\n display: inline-flex;\r\n align-items: center;\r\n height: 30px;\r\n min-width: max-content;\r\n flex: none;\r\n padding: 0 9px;\r\n color: var(--settings-muted);\r\n font: inherit;\r\n font-size: 12px;\r\n line-height: 18px;\r\n white-space: nowrap;\r\n background: var(--settings-inset);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 7px;\r\n cursor: pointer;\r\n scroll-snap-align: start;\r\n}\r\n\r\n.settings-connection-host-tab:hover {\r\n color: var(--settings-text);\r\n background: var(--settings-hover);\r\n}\r\n\r\n.settings-connection-host-tab[aria-selected="true"] {\r\n color: var(--settings-text);\r\n font-weight: 600;\r\n background: var(--settings-active);\r\n border-color: var(--settings-border);\r\n}\r\n\r\n.settings-connection-table-header,\r\n.settings-connection-row {\r\n display: grid;\r\n grid-template-columns: minmax(160px, 1fr) minmax(92px, auto) 108px;\r\n align-items: center;\r\n min-width: 0;\r\n gap: 10px;\r\n}\r\n\r\n.settings-connection-table-header {\r\n min-height: 30px;\r\n padding: 0 10px;\r\n color: var(--settings-muted);\r\n font-size: 10px;\r\n font-weight: 600;\r\n line-height: 16px;\r\n text-transform: uppercase;\r\n letter-spacing: 0.06em;\r\n background: transparent;\r\n border-bottom: 1px solid var(--settings-divider);\r\n}\r\n\r\n.settings-connection-row {\r\n min-height: 52px;\r\n padding: 8px 10px;\r\n cursor: pointer;\r\n border-bottom: 1px solid var(--settings-divider);\r\n}\r\n\r\n.settings-connection-row:last-child {\r\n border-bottom: 0;\r\n}\r\n\r\n.settings-connection-row:hover {\r\n background: var(--settings-hover);\r\n}\r\n\r\n.settings-connection-row[data-connection-selected="true"] {\r\n background: var(--settings-surface);\r\n}\r\n\r\n.settings-connection-row__identity,\r\n.settings-connection-inspector__identity {\r\n display: inline-flex;\r\n align-items: center;\r\n min-width: 0;\r\n gap: 8px;\r\n color: var(--settings-text);\r\n}\r\n\r\n.settings-connection-row__identity strong,\r\n.settings-connection-inspector__identity strong {\r\n min-width: 0;\r\n overflow-wrap: anywhere;\r\n font-size: 12px;\r\n font-weight: 500;\r\n line-height: 18px;\r\n}\r\n\r\n.settings-connection-row__mark {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 24px;\r\n height: 24px;\r\n flex: none;\r\n color: var(--settings-muted);\r\n font-size: 10px;\r\n font-weight: 700;\r\n background: var(--settings-surface);\r\n border-radius: 6px;\r\n}\r\n\r\n.settings-connection-row__mark--logo {\r\n color: var(--settings-text);\r\n background: transparent;\r\n}\r\n\r\n.settings-connection-row__mark--logo > img,\r\n.settings-connection-row__mark--logo > svg {\r\n display: block;\r\n max-width: 18px;\r\n max-height: 18px;\r\n}\r\n\r\n.settings-connection-row__status {\r\n display: inline-flex;\r\n align-items: center;\r\n width: fit-content;\r\n gap: 5px;\r\n color: var(--settings-muted);\r\n font-size: 11px;\r\n font-weight: 500;\r\n line-height: 18px;\r\n}\r\n\r\n.settings-connection-row__status::before {\r\n width: 6px;\r\n height: 6px;\r\n flex: none;\r\n content: "";\r\n background: currentColor;\r\n border-radius: 50%;\r\n}\r\n\r\n.settings-connection-row__status[data-connection-tone="ready"] {\r\n color: var(--settings-success);\r\n}\r\n\r\n.settings-connection-row__status[data-connection-tone="checking"] {\r\n color: var(--settings-warning);\r\n}\r\n\r\n.settings-connection-row__status[data-connection-tone="setup"] {\r\n color: var(--settings-muted);\r\n}\r\n\r\n.settings-connection-row__status[data-connection-tone="setup"]::before {\r\n background: transparent;\r\n border: 1.5px solid currentColor;\r\n}\r\n\r\n.settings-connection-row__status[data-connection-tone="failed"] {\r\n color: var(--settings-danger);\r\n}\r\n\r\n.settings-connection-row__action {\r\n display: flex;\r\n align-items: center;\r\n justify-content: flex-end;\r\n min-width: 0;\r\n gap: 4px;\r\n}\r\n\r\n.settings-connection-row__handle {\r\n display: inline-flex;\r\n flex: none;\r\n align-items: center;\r\n justify-content: center;\r\n width: 16px;\r\n color: var(--settings-muted);\r\n cursor: grab;\r\n opacity: 0.6;\r\n}\r\n\r\n.settings-connection-row__handle:hover {\r\n opacity: 1;\r\n}\r\n\r\n.settings-connection-row[draggable="true"] {\r\n cursor: grab;\r\n}\r\n\r\n.settings-connection-row[data-connection-dragging="true"] {\r\n opacity: 0.4;\r\n}\r\n\r\n.settings-connection-row[data-connection-drop-indicator="before"] {\r\n box-shadow: inset 0 2px 0 0 var(--settings-focus);\r\n}\r\n\r\n.settings-connection-row[data-connection-drop-indicator="after"] {\r\n box-shadow: inset 0 -2px 0 0 var(--settings-focus);\r\n}\r\n\r\n.settings-connection-row__group-toggle {\r\n display: inline-flex;\r\n flex: none;\r\n align-items: center;\r\n justify-content: center;\r\n width: 26px;\r\n height: 26px;\r\n color: var(--settings-muted);\r\n background: transparent;\r\n border: 0;\r\n border-radius: 6px;\r\n cursor: pointer;\r\n}\r\n\r\n.settings-connection-row__group-toggle:hover {\r\n color: var(--settings-text);\r\n background: var(--settings-hover);\r\n}\r\n\r\n.settings-connection-group-divider {\r\n padding: 10px 12px 6px;\r\n color: var(--settings-muted);\r\n font-size: 10px;\r\n font-weight: 600;\r\n line-height: 16px;\r\n text-transform: uppercase;\r\n letter-spacing: 0.06em;\r\n /* No border-top here: the row immediately above already carries its own\r\n border-bottom (it is no longer :last-child once this divider follows\r\n it), so adding one here would double the separator line. */\r\n}\r\n\r\n.settings-connection-group-more[data-connection-drag-over="true"] {\r\n background: rgb(51 156 255 / 8%);\r\n}\r\n\r\n.settings-connection-group-hint {\r\n display: grid;\r\n gap: 3px;\r\n margin: 0 12px 12px;\r\n padding: 14px 16px;\r\n text-align: center;\r\n border: 1.5px dashed var(--settings-border);\r\n border-radius: 10px;\r\n}\r\n\r\n.settings-connection-group-more[data-connection-drag-over="true"] .settings-connection-group-hint {\r\n border-color: var(--settings-focus);\r\n}\r\n\r\n.settings-connection-group-hint strong {\r\n color: var(--settings-text);\r\n font-size: 12.5px;\r\n font-weight: 500;\r\n line-height: 18px;\r\n}\r\n\r\n.settings-connection-group-hint span {\r\n color: var(--settings-muted);\r\n font-size: 12px;\r\n line-height: 17px;\r\n}\r\n\r\n.settings-connection-group-reset {\r\n display: flex;\r\n width: 100%;\r\n align-items: center;\r\n gap: 6px;\r\n padding: 10px 12px;\r\n color: var(--settings-muted);\r\n font: inherit;\r\n font-size: 12px;\r\n text-align: left;\r\n background: transparent;\r\n border: 0;\r\n border-top: 1px solid var(--settings-divider);\r\n cursor: pointer;\r\n}\r\n\r\n.settings-connection-group-reset:hover {\r\n color: var(--settings-text);\r\n background: var(--settings-hover);\r\n}\r\n\r\n.settings-connection-install-link {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 26px;\r\n height: 26px;\r\n color: var(--settings-focus);\r\n text-decoration: none;\r\n background: transparent;\r\n border: 1px solid transparent;\r\n border-radius: 7px;\r\n opacity: 0;\r\n transition: opacity 120ms ease;\r\n}\r\n\r\n.settings-connection-row:hover .settings-connection-install-link,\r\n.settings-connection-install-link:focus-visible {\r\n opacity: 1;\r\n}\r\n\r\n.settings-connection-install-link:hover {\r\n color: var(--settings-focus);\r\n background: var(--settings-active);\r\n border-color: var(--settings-border);\r\n}\r\n\r\n.settings-connection-view-error {\r\n padding: 4px 7px;\r\n color: var(--settings-danger);\r\n font: inherit;\r\n font-size: 11px;\r\n line-height: 18px;\r\n background: transparent;\r\n border: 0;\r\n border-radius: 6px;\r\n cursor: pointer;\r\n}\r\n\r\n.settings-connection-view-error:hover {\r\n color: var(--settings-danger);\r\n background: var(--settings-danger-bg);\r\n}\r\n\r\n.settings-connection-inspector {\r\n position: sticky;\r\n top: 18px;\r\n}\r\n\r\n.settings-connection-inspector__header {\r\n display: flex;\r\n align-items: flex-start;\r\n justify-content: space-between;\r\n min-width: 0;\r\n gap: 10px;\r\n padding: 12px;\r\n border-bottom: 1px solid var(--settings-divider);\r\n}\r\n\r\n.settings-connection-inspector__body {\r\n display: grid;\r\n min-width: 0;\r\n gap: 12px;\r\n padding: 12px;\r\n}\r\n\r\n.settings-connection-install-callout {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 14px;\r\n padding: 14px;\r\n background: var(--settings-surface);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 10px;\r\n}\r\n\r\n.settings-connection-install-head {\r\n display: flex;\r\n align-items: flex-start;\r\n gap: 12px;\r\n min-width: 0;\r\n}\r\n\r\n.settings-connection-install-head > div {\r\n min-width: 0;\r\n flex: 1;\r\n}\r\n\r\n.settings-connection-install-callout__icon {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 32px;\r\n height: 32px;\r\n flex: none;\r\n color: var(--settings-focus);\r\n background: var(--settings-active);\r\n border-radius: 8px;\r\n}\r\n\r\n.settings-connection-install-callout strong,\r\n.settings-connection-install-head strong,\r\n.settings-connection-error-summary strong,\r\n.settings-connection-state-summary strong {\r\n display: block;\r\n margin: 0 0 4px;\r\n color: var(--settings-text);\r\n font-size: 13px;\r\n font-weight: 600;\r\n line-height: 19px;\r\n}\r\n\r\n.settings-connection-install-callout p,\r\n.settings-connection-install-head p,\r\n.settings-connection-error-summary p,\r\n.settings-connection-state-summary p,\r\n.settings-connection-issue-note {\r\n margin: 0;\r\n color: var(--settings-muted);\r\n font-size: 12px;\r\n line-height: 18px;\r\n}\r\n\r\n.settings-connection-install-button {\r\n width: 100%;\r\n}\r\n\r\n.settings-connection-error-summary {\r\n padding: 13px 14px;\r\n color: var(--settings-danger);\r\n background: var(--settings-danger-bg);\r\n border: 1px solid var(--settings-danger-border);\r\n border-radius: 10px;\r\n}\r\n\r\n.settings-connection-error-metadata {\r\n display: grid;\r\n gap: 7px;\r\n padding: 12px;\r\n background: var(--settings-inset);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 9px;\r\n}\r\n\r\n.settings-connection-detail-line {\r\n display: grid;\r\n grid-template-columns: 92px minmax(0, 1fr);\r\n gap: 10px;\r\n min-width: 0;\r\n color: var(--settings-muted);\r\n font-size: 10px;\r\n line-height: 16px;\r\n}\r\n\r\n.settings-connection-detail-line code {\r\n min-width: 0;\r\n overflow-wrap: anywhere;\r\n color: var(--settings-text);\r\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\r\n white-space: pre-wrap;\r\n}\r\n\r\n.settings-connection-error-log-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: 10px;\r\n}\r\n\r\n.settings-connection-error-log-header strong {\r\n color: var(--settings-text);\r\n font-size: 11px;\r\n font-weight: 600;\r\n}\r\n\r\n.settings-connection-error-log-header .settings-command-button {\r\n min-height: 30px;\r\n padding: 5px 9px;\r\n font-size: 11px;\r\n}\r\n\r\n.settings-connection-stderr {\r\n max-height: 220px;\r\n min-width: 0;\r\n margin: 0;\r\n padding: 11px;\r\n overflow: auto;\r\n color: var(--settings-text);\r\n font:\r\n 10px/16px ui-monospace,\r\n "SFMono-Regular",\r\n Consolas,\r\n "Liberation Mono",\r\n monospace;\r\n white-space: pre-wrap;\r\n overflow-wrap: anywhere;\r\n background: var(--settings-inset);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 9px;\r\n}\r\n\r\n.settings-connection-error-actions {\r\n display: grid;\r\n grid-template-columns: minmax(0, 1fr);\r\n gap: 8px;\r\n}\r\n\r\n.settings-connection-error-actions .settings-command-button {\r\n width: 100%;\r\n}\r\n\r\n.settings-connection-issue-note {\r\n margin-top: -4px;\r\n}\r\n\r\n.settings-connection-state-summary {\r\n padding: 14px;\r\n background: var(--settings-surface);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 10px;\r\n}\r\n\r\n.settings-empty {\r\n display: flex;\r\n align-items: center;\r\n min-height: 72px;\r\n padding: 12px 16px;\r\n}\r\n\r\n.settings-empty > div {\r\n display: grid;\r\n min-width: 0;\r\n gap: 2px;\r\n}\r\n\r\n.settings-empty strong {\r\n color: var(--settings-text);\r\n font-size: 13px;\r\n font-weight: 500;\r\n line-height: 19px;\r\n}\r\n\r\n.settings-empty span {\r\n color: var(--settings-muted);\r\n font-size: 13px;\r\n line-height: 19px;\r\n}\r\n\r\n.settings-about-panel {\r\n display: grid;\r\n max-width: 720px;\r\n gap: 18px;\r\n padding: 24px;\r\n background: var(--settings-panel);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 12px;\r\n}\r\n\r\n.settings-about-product {\r\n color: var(--settings-text);\r\n font-size: 24px;\r\n font-weight: 700;\r\n line-height: 32px;\r\n}\r\n\r\n.settings-about-tagline {\r\n color: var(--settings-text);\r\n font-size: 16px;\r\n font-weight: 600;\r\n line-height: 24px;\r\n}\r\n\r\n.settings-about-version-row {\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n margin: 4px 0 8px;\r\n}\r\n\r\n.settings-about-version-badge {\r\n display: inline-flex;\r\n align-items: center;\r\n font-size: 13px;\r\n font-weight: 600;\r\n color: var(--settings-text);\r\n background: var(--settings-surface);\r\n border: 1px solid var(--settings-border);\r\n padding: 4px 10px;\r\n border-radius: 6px;\r\n}\r\n\r\n.settings-about-copy {\r\n display: grid;\r\n max-width: 660px;\r\n gap: 12px;\r\n}\r\n\r\n.settings-about-copy p,\r\n.settings-about-repository p {\r\n margin: 0;\r\n color: var(--settings-muted);\r\n font-size: 13px;\r\n line-height: 21px;\r\n}\r\n\r\n.settings-about-star-callout {\r\n margin: 2px 0;\r\n color: var(--settings-warning);\r\n font-size: 14px;\r\n font-weight: 600;\r\n line-height: 22px;\r\n}\r\n\r\n.settings-about-repository {\r\n display: grid;\r\n gap: 10px;\r\n padding-top: 18px;\r\n border-top: 1px solid var(--settings-divider);\r\n}\r\n\r\n.settings-about-repository-link {\r\n display: flex;\r\n align-items: center;\r\n width: fit-content;\r\n min-width: 0;\r\n max-width: 100%;\r\n gap: 8px;\r\n color: var(--settings-focus);\r\n font-size: 13px;\r\n font-weight: 600;\r\n text-decoration: none;\r\n}\r\n\r\n.settings-about-repository-link:hover {\r\n text-decoration: underline;\r\n}\r\n\r\n.settings-about-repository-link code {\r\n min-width: 0;\r\n overflow: hidden;\r\n color: var(--settings-muted);\r\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\r\n font-size: 11px;\r\n font-weight: 400;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.settings-page-error {\r\n padding: 16px;\r\n color: var(--settings-text);\r\n font-size: 13px;\r\n background: var(--settings-panel);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 20px;\r\n}\r\n\r\n.settings-update-metadata {\r\n display: grid;\r\n grid-template-columns: repeat(3, minmax(0, 1fr));\r\n gap: 24px;\r\n margin-bottom: 24px;\r\n padding: 0 4px 20px;\r\n border-bottom: 1px solid var(--settings-divider);\r\n}\r\n\r\n.settings-update-metadata__item {\r\n display: grid;\r\n min-width: 0;\r\n gap: 4px;\r\n}\r\n\r\n.settings-update-metadata__item span {\r\n color: var(--settings-muted);\r\n font-size: 12px;\r\n line-height: 18px;\r\n}\r\n\r\n.settings-update-metadata__item strong {\r\n min-width: 0;\r\n overflow-wrap: anywhere;\r\n color: var(--settings-text);\r\n font-size: 15px;\r\n font-weight: 500;\r\n line-height: 22px;\r\n}\r\n\r\n/* The only emphasis on this screen: a latest version newer than the installed one. */\r\n.settings-update-metadata__value--newer {\r\n color: var(--settings-focus);\r\n}\r\n\r\n.settings-update-panel {\r\n display: grid;\r\n gap: 12px;\r\n padding: 20px;\r\n color: var(--settings-text);\r\n background: var(--settings-panel);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 8px;\r\n}\r\n\r\n.settings-update-panel__head {\r\n display: flex;\r\n align-items: center;\r\n min-width: 0;\r\n gap: 8px;\r\n}\r\n\r\n.settings-update-panel__head .harnessmix-settings-icon {\r\n color: var(--settings-muted);\r\n}\r\n\r\n.settings-update-panel[data-update-state="available"] .harnessmix-settings-icon,\r\n.settings-update-panel[data-update-state="downloading"] .harnessmix-settings-icon,\r\n.settings-update-panel[data-update-state="installing"] .harnessmix-settings-icon,\r\n.settings-update-panel[data-update-state="restarting"] .harnessmix-settings-icon {\r\n color: var(--settings-focus);\r\n}\r\n\r\n.settings-update-panel[data-update-state="current"] .harnessmix-settings-icon {\r\n color: var(--settings-success);\r\n}\r\n\r\n.settings-update-panel[data-update-state="failed"] .harnessmix-settings-icon,\r\n.settings-update-panel[data-update-state="error"] .harnessmix-settings-icon {\r\n color: var(--settings-danger);\r\n}\r\n\r\n.settings-update-panel__title {\r\n min-width: 0;\r\n overflow-wrap: anywhere;\r\n color: var(--settings-text);\r\n font-size: 14px;\r\n font-weight: 600;\r\n line-height: 22px;\r\n}\r\n\r\n.settings-update-summary,\r\n.settings-update-error {\r\n margin: 0;\r\n overflow-wrap: anywhere;\r\n font-size: 13px;\r\n line-height: 20px;\r\n}\r\n\r\n.settings-update-summary {\r\n color: var(--settings-muted);\r\n}\r\n\r\n.settings-update-error {\r\n color: var(--settings-danger);\r\n}\r\n\r\n.settings-update-progress {\r\n width: 100%;\r\n height: 8px;\r\n accent-color: var(--settings-focus);\r\n}\r\n\r\n.settings-update-progress-detail {\r\n color: var(--settings-muted);\r\n font-size: 12px;\r\n line-height: 18px;\r\n}\r\n\r\n/* Release notes scroll with the page; a scroller inside a scroller traps the wheel. */\r\n.settings-update-notes-section {\r\n min-width: 0;\r\n margin-top: 24px;\r\n padding-top: 24px;\r\n border-top: 1px solid var(--settings-divider);\r\n}\r\n\r\n.settings-update-notes-section:empty {\r\n display: none;\r\n}\r\n\r\n.settings-update-notes {\r\n display: grid;\r\n min-width: 0;\r\n gap: 12px;\r\n color: var(--settings-muted);\r\n font-size: 14px;\r\n line-height: 22px;\r\n overflow-wrap: anywhere;\r\n}\r\n\r\n.settings-update-notes > :first-child {\r\n margin-top: 0;\r\n}\r\n\r\n.settings-update-notes > :last-child {\r\n margin-bottom: 0;\r\n}\r\n\r\n.settings-update-notes h1,\r\n.settings-update-notes h2,\r\n.settings-update-notes h3,\r\n.settings-update-notes h4,\r\n.settings-update-notes h5,\r\n.settings-update-notes h6 {\r\n margin: 6px 0 0;\r\n color: var(--settings-text);\r\n font-weight: 600;\r\n}\r\n\r\n.settings-update-notes h1 {\r\n font-size: 18px;\r\n line-height: 26px;\r\n}\r\n\r\n.settings-update-notes h2 {\r\n font-size: 17px;\r\n line-height: 24px;\r\n}\r\n\r\n.settings-update-notes h3,\r\n.settings-update-notes h4,\r\n.settings-update-notes h5,\r\n.settings-update-notes h6 {\r\n font-size: 14px;\r\n line-height: 22px;\r\n}\r\n\r\n.settings-update-notes p,\r\n.settings-update-notes ul,\r\n.settings-update-notes ol,\r\n.settings-update-notes pre,\r\n.settings-update-notes blockquote {\r\n margin: 0;\r\n}\r\n\r\n.settings-update-notes ul,\r\n.settings-update-notes ol {\r\n padding-left: 24px;\r\n}\r\n\r\n.settings-update-notes li {\r\n padding-left: 4px;\r\n}\r\n\r\n.settings-update-notes li::marker {\r\n color: var(--settings-muted);\r\n font-size: 0.85em;\r\n}\r\n\r\n.settings-update-notes li + li {\r\n margin-top: 14px;\r\n}\r\n\r\n.settings-update-notes .release-note-translation {\r\n display: block;\r\n margin-top: 3px;\r\n color: var(--settings-muted);\r\n font-size: 13px;\r\n line-height: 20px;\r\n}\r\n\r\n.settings-update-notes blockquote {\r\n padding: 8px 12px;\r\n color: var(--settings-muted);\r\n border-left: 3px solid var(--settings-focus);\r\n background: var(--settings-surface);\r\n}\r\n\r\n.settings-update-notes hr {\r\n width: 100%;\r\n margin: 2px 0;\r\n border: 0;\r\n border-top: 1px solid var(--settings-divider);\r\n}\r\n\r\n.settings-update-notes strong {\r\n color: var(--settings-text);\r\n font-weight: 600;\r\n}\r\n\r\n.settings-update-notes a {\r\n color: var(--settings-focus);\r\n text-decoration: none;\r\n}\r\n\r\n.settings-update-notes a:hover {\r\n text-decoration: underline;\r\n}\r\n\r\n.settings-update-notes code {\r\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\r\n font-size: 12px;\r\n}\r\n\r\n.settings-update-notes :not(pre) > code {\r\n padding: 1px 5px;\r\n background: var(--settings-surface);\r\n border-radius: 4px;\r\n}\r\n\r\n.settings-update-notes pre {\r\n min-width: 0;\r\n max-width: 100%;\r\n padding: 10px 12px;\r\n overflow-x: auto;\r\n overflow-y: hidden;\r\n background: var(--settings-inset);\r\n border-radius: 6px;\r\n}\r\n\r\n.settings-update-notes pre code {\r\n line-height: 18px;\r\n white-space: pre-wrap;\r\n}\r\n\r\n/* Manual update sits directly under the status panel, not behind a disclosure:\r\n automatic updates can fail for machine-local reasons and this is the way out. */\r\n.settings-update-controls {\r\n display: grid;\r\n min-width: 0;\r\n gap: 10px;\r\n margin-top: 24px;\r\n}\r\n\r\n.settings-update-manual-title {\r\n color: var(--settings-text);\r\n font-size: 15px;\r\n font-weight: 600;\r\n line-height: 22px;\r\n}\r\n\r\n.settings-update-manual {\r\n display: grid;\r\n min-width: 0;\r\n gap: 8px;\r\n}\r\n\r\n.settings-update-manual[hidden] {\r\n display: none;\r\n}\r\n\r\n.settings-update-manual-description {\r\n margin: 0;\r\n color: var(--settings-muted);\r\n font-size: 12px;\r\n line-height: 18px;\r\n}\r\n\r\n.settings-update-manual-description.is-fallback {\r\n color: var(--settings-danger);\r\n}\r\n\r\n.settings-update-command {\r\n display: flex;\r\n align-items: stretch;\r\n min-width: 0;\r\n overflow: hidden;\r\n border: 1px solid var(--settings-border);\r\n border-radius: 6px;\r\n}\r\n\r\n.settings-update-command code {\r\n min-width: 0;\r\n flex: 1;\r\n padding: 9px 12px;\r\n overflow-x: auto;\r\n color: var(--settings-text);\r\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\r\n font-size: 12px;\r\n line-height: 20px;\r\n white-space: nowrap;\r\n}\r\n\r\n.settings-update-command__copy {\r\n display: inline-flex;\r\n align-items: center;\r\n flex: none;\r\n gap: 6px;\r\n padding: 0 12px;\r\n color: var(--settings-muted);\r\n font-size: 12px;\r\n background: transparent;\r\n border: 0;\r\n border-left: 1px solid var(--settings-border);\r\n cursor: pointer;\r\n}\r\n\r\n.settings-update-command__copy:hover {\r\n color: var(--settings-text);\r\n background: var(--settings-hover);\r\n}\r\n\r\n.settings-update-command__copy:focus-visible {\r\n outline: 2px solid var(--settings-focus);\r\n outline-offset: -2px;\r\n}\r\n\r\n.settings-update-actions {\n display: flex;\r\n align-items: center;\r\n min-width: 0;\r\n gap: 12px;\r\n flex-wrap: wrap;\r\n}\n\n.settings-storage-block {\n display: grid;\n gap: 12px;\n margin-bottom: 16px;\n}\n\r\n.settings-command-button,\r\n.settings-update-link {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex: none;\r\n width: max-content;\r\n max-width: 100%;\r\n min-height: 30px;\r\n gap: 6px;\r\n padding: 5px 10px;\r\n white-space: nowrap;\r\n color: var(--settings-primary-text);\r\n font: inherit;\r\n font-size: 12px;\r\n text-decoration: none;\r\n background: var(--settings-primary);\r\n border: 1px solid var(--settings-primary);\r\n border-radius: 7px;\r\n cursor: pointer;\r\n}\r\n\r\n.settings-command-button--secondary,\r\n.settings-update-link {\r\n color: var(--settings-text);\r\n background: var(--settings-panel);\r\n border-color: var(--settings-border);\r\n}\r\n\r\n.settings-command-button:hover:not(:disabled) {\r\n background: var(--settings-primary-hover);\r\n border-color: var(--settings-primary-hover);\r\n}\r\n\r\n.settings-command-button--secondary:hover:not(:disabled),\r\n.settings-update-link:hover {\r\n background: var(--settings-hover);\r\n border-color: var(--settings-border);\r\n}\r\n\r\n.settings-command-button--danger {\r\n color: #f87171;\r\n}\r\n\r\n.settings-command-button--danger:hover:not(:disabled) {\r\n color: #fecaca;\r\n background: rgb(127 29 29 / 24%);\r\n border-color: rgb(248 113 113 / 45%);\r\n}\r\n\r\n.settings-command-button:disabled {\r\n cursor: default;\r\n opacity: 0.45;\r\n}\r\n\r\n.settings-command-button:disabled,\r\n.settings-command-button[aria-disabled="true"] {\r\n opacity: 0.55;\r\n cursor: not-allowed;\r\n filter: none;\r\n}\r\n\r\n.settings-command-button:focus-visible,\r\n.settings-update-link:focus-visible {\r\n outline: 2px solid var(--settings-focus);\r\n outline-offset: 2px;\r\n}\r\n\r\n.harnessmix-settings-icon {\r\n display: block;\r\n flex: none;\r\n stroke: currentColor;\r\n}\r\n\r\n@media (max-width: 720px) {\r\n .harnessmix-settings-dialog {\r\n width: calc(100vw - 16px);\r\n height: calc(100vh - 16px);\r\n border-radius: 10px;\r\n }\r\n\r\n .settings-layout {\r\n grid-template-columns: minmax(0, 1fr);\r\n grid-template-rows: auto minmax(0, 1fr);\r\n }\r\n\r\n .settings-session-import-row {\r\n grid-template-columns: minmax(0, 1fr);\r\n }\r\n\r\n .settings-session-import-row__action {\r\n align-items: flex-start;\r\n }\r\n\r\n .settings-sidebar {\r\n border-right: 0;\r\n border-bottom: 1px solid var(--settings-border);\r\n }\r\n\r\n .settings-header {\r\n height: 56px;\r\n padding-inline: 14px;\r\n }\r\n\r\n .settings-sidebar {\r\n padding-top: 20px;\r\n }\r\n\r\n .settings-nav {\r\n flex: none;\r\n flex-direction: row;\r\n gap: 4px;\r\n padding: 7px 8px 8px;\r\n overflow-x: auto;\r\n overflow-y: hidden;\r\n }\r\n\r\n .settings-nav-section-label {\r\n display: none;\r\n }\r\n\r\n .settings-nav-button {\r\n width: auto;\r\n min-width: max-content;\r\n min-height: 34px;\r\n grid-template-columns: 16px auto;\r\n border-radius: 10px;\r\n }\r\n\r\n .settings-nav-star-link {\r\n margin-top: 0;\r\n }\r\n\r\n .settings-page__content {\r\n width: calc(100% - 40px);\r\n }\r\n\r\n .settings-page__content {\r\n padding-top: 32px;\r\n padding-bottom: 32px;\r\n }\r\n\r\n .settings-section-label {\r\n padding-bottom: 20px;\r\n font-size: 20px;\r\n line-height: 26px;\r\n }\r\n\r\n .settings-update-metadata {\r\n grid-template-columns: minmax(0, 1fr);\r\n gap: 16px;\r\n }\r\n\r\n .settings-status-row {\r\n grid-template-columns: minmax(0, 1fr) auto;\r\n gap: 16px;\r\n }\r\n\r\n .settings-account-header,\r\n .settings-connection-page-header {\r\n flex-direction: column;\r\n }\r\n\r\n .settings-account-header > .settings-command-button,\r\n .settings-connection-page-header > .settings-command-button {\r\n width: 100%;\r\n }\r\n\r\n .settings-connections-layout {\r\n grid-template-columns: minmax(0, 1fr);\r\n }\r\n\r\n .settings-connection-inspector {\r\n position: static;\r\n }\r\n\r\n .settings-status-row__detail {\r\n grid-column: 1 / -1;\r\n margin: -8px 0 0 58px;\r\n }\r\n}\r\n\r\n@media (forced-colors: active) {\r\n :host {\r\n --settings-bg: Canvas;\r\n --settings-sidebar: Canvas;\r\n --settings-panel: Canvas;\r\n --settings-surface: Canvas;\r\n --settings-surface-hover: Highlight;\r\n --settings-inset: Canvas;\r\n --settings-text: CanvasText;\r\n --settings-muted: GrayText;\r\n --settings-subtle: GrayText;\r\n --settings-border: ButtonBorder;\r\n --settings-divider: ButtonBorder;\r\n --settings-hover: Highlight;\r\n --settings-active: Highlight;\r\n --settings-focus: Highlight;\r\n --settings-primary: ButtonFace;\r\n --settings-primary-hover: Highlight;\r\n --settings-primary-text: ButtonText;\r\n --settings-warning: CanvasText;\r\n --settings-warning-bg: Canvas;\r\n --settings-warning-border: ButtonBorder;\r\n --settings-danger: CanvasText;\r\n --settings-danger-bg: Canvas;\r\n --settings-danger-border: ButtonBorder;\r\n --settings-success: CanvasText;\r\n }\r\n}\r\n\r\n@media (prefers-reduced-motion: reduce) {\r\n *,\r\n *::before,\r\n *::after {\r\n scroll-behavior: auto !important;\r\n transition-duration: 0s !important;\r\n }\r\n}\r\n\r\n/* Harness Mix: Model Configuration & One-click Install */\r\n.settings-model-config-panel {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 12px;\r\n padding: 14px;\r\n margin-top: 14px;\r\n border-radius: 8px;\r\n background: var(--settings-surface);\r\n border: 1px solid var(--settings-border);\r\n}\r\n\r\n.settings-model-config-head {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n}\r\n\r\n.settings-model-config-title {\r\n font-size: 13px;\r\n font-weight: 600;\r\n color: var(--settings-text);\r\n}\r\n\r\n.settings-model-config-description {\r\n font-size: 11px;\r\n color: var(--settings-muted);\r\n margin: 0;\r\n}\r\n\r\n.settings-model-config-loading,\r\n.settings-model-config-empty {\r\n font-size: 12px;\r\n color: var(--settings-muted);\r\n padding: 8px 0;\r\n}\r\n\r\n.settings-model-config-form {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 12px;\r\n margin-top: 4px;\r\n}\r\n\r\n.settings-model-config-field {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 6px;\r\n}\r\n\r\n.settings-model-config-label {\r\n font-size: 11px;\r\n font-weight: 600;\r\n color: var(--settings-muted);\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n}\r\n\r\n.settings-model-config-select {\r\n height: 32px;\r\n padding: 0 10px;\r\n border-radius: 6px;\r\n border: 1px solid var(--settings-border);\r\n background: var(--settings-panel);\r\n color: var(--settings-text);\r\n font-size: 12px;\r\n outline: none;\r\n}\r\n\r\n.settings-model-config-select:focus {\r\n border-color: var(--settings-primary);\r\n}\r\n\r\n.settings-model-config-actions {\r\n display: flex;\r\n align-items: center;\r\n flex-wrap: wrap;\r\n gap: 8px;\r\n margin-top: 6px;\r\n}\r\n\r\n.settings-model-config-feedback {\r\n font-size: 12px;\r\n font-weight: 500;\r\n}\r\n\r\n.settings-feedback-success {\r\n color: var(--settings-success);\r\n}\r\n\r\n.settings-feedback-error {\r\n color: var(--settings-danger);\r\n}\r\n\r\n.settings-feedback-info {\r\n color: var(--settings-primary);\r\n}\r\n\r\n.settings-install-command-box {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 6px;\r\n min-width: 0;\r\n margin: 0;\r\n}\r\n\r\n.settings-install-command-label {\r\n font-size: 11px;\r\n font-weight: 600;\r\n color: var(--settings-muted);\r\n}\r\n\r\n.settings-install-command-row {\r\n display: flex;\r\n align-items: center;\r\n background: var(--settings-inset);\r\n padding: 8px 12px;\r\n border-radius: 6px;\r\n border: 1px solid var(--settings-border);\r\n min-width: 0;\r\n overflow-x: auto;\r\n}\r\n\r\n.settings-install-command-row code {\r\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\r\n font-size: 12px;\r\n line-height: 18px;\r\n color: var(--settings-text);\r\n user-select: all;\r\n white-space: pre-wrap;\r\n word-break: break-all;\r\n}\r\n\r\n.settings-install-actions {\r\n display: grid;\r\n grid-template-columns: minmax(0, 1fr);\r\n gap: 8px;\r\n margin-top: 4px;\r\n}\r\n\r\n.settings-install-actions .settings-command-button {\r\n width: 100%;\r\n justify-content: center;\r\n}\r\n\r\n.settings-install-feedback {\r\n font-size: 12px;\r\n font-weight: 500;\r\n line-height: 18px;\r\n margin-top: 2px;\r\n overflow-wrap: anywhere;\r\n}\r\n\r\n.settings-install-manual-card {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 8px;\r\n background: var(--settings-inset);\r\n padding: 12px 14px;\r\n border-radius: 8px;\r\n border: 1px solid var(--settings-border);\r\n margin-top: 6px;\r\n margin-bottom: 4px;\r\n}\r\n\r\n.settings-install-manual-badge {\r\n display: inline-flex;\r\n align-items: center;\r\n font-size: 11px;\r\n font-weight: 600;\r\n color: var(--settings-accent, #10a37f);\r\n background: var(--settings-accent-subtle, rgba(16, 163, 127, 0.1));\r\n padding: 2px 8px;\r\n border-radius: 4px;\r\n width: fit-content;\r\n}\r\n\r\n.settings-install-manual-notice {\r\n font-size: 12px;\r\n line-height: 18px;\r\n color: var(--settings-text);\r\n margin: 0;\r\n}\r\n\r\n.settings-install-steps {\r\n margin: 0;\r\n padding-left: 18px;\r\n font-size: 12px;\r\n line-height: 20px;\r\n color: var(--settings-muted);\r\n}\r\n\r\n.settings-install-steps li {\r\n margin-bottom: 2px;\r\n}\r\n/* MCP and Skills share native settings controls while keeping separate flows. */\n.settings-integrations-controls { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; margin: 18px 0 12px; }\n.settings-integrations-controls input { flex: 1; min-width: 180px; }\n.settings-integrations-controls input[hidden] { display: none; }\n.settings-integrations-controls select, .settings-integrations-controls input,\n.settings-integrations-field input, .settings-integrations-toolbar input { box-sizing: border-box; padding: 9px 11px; border: 1px solid var(--settings-border, #8885); border-radius: 8px; color: inherit; background: var(--settings-input, transparent); font: inherit; }\n.settings-integrations-status { min-height: 18px; margin: 0 0 6px; color: var(--settings-muted); font-size: 12px; }\n.settings-integrations-body p { font-size: 12px; line-height: 1.6; opacity: .8; }\n.settings-integrations-toolbar { display: flex; gap: 10px; align-items: center; margin: 8px 0 16px; }\n.settings-integrations-toolbar input { flex: 1; }\n.settings-integrations-list { display: grid; gap: 8px; }\n.settings-integrations-row { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; border: 1px solid var(--settings-border, #8885); padding: 14px; border-radius: 10px; background: var(--settings-surface, transparent); }\n.settings-integrations-row > div { flex: 1; min-width: 180px; }\n.settings-integrations-row p { margin: 3px 0; }\n.settings-integrations-row code { display: block; overflow-wrap: anywhere; font-size: 11px; color: var(--settings-muted); }\n.settings-integrations-row--native { border-style: dashed; }\n.settings-integrations-empty { padding: 36px 18px; border: 1px dashed var(--settings-border, #8885); border-radius: 10px; text-align: center; color: var(--settings-muted); font-size: 12px; }\n.settings-integrations-editor-head { display: flex; align-items: center; gap: 12px; }\n.settings-integrations-editor-head h3 { margin: 0; }\n.settings-integrations-form { display: grid; gap: 14px; margin: 16px 0 28px; }\n.settings-integrations-form--card { padding: 16px; border: 1px solid var(--settings-border, #8885); border-radius: 12px; }\n.settings-integrations-field { display: grid; gap: 6px; font-size: 12px; }\n.settings-integrations-form > button { justify-self: start; }\n.settings-mcp-args { display: grid; gap: 7px; }\n.settings-mcp-arg { display: flex; gap: 8px; align-items: center; }\n.settings-mcp-arg input { flex: 1; }\n.settings-mcp-kv-row { display: flex; gap: 8px; align-items: center; }\n.settings-mcp-kv-row input { flex: 1; }\n.settings-mcp-add-arg { margin-top: 7px; }\n.settings-mcp-docs-link { display: inline-flex; align-items: center; gap: 4px; color: var(--settings-muted, #888); font-size: 13px; text-decoration: none; transition: color 150ms ease; }\n.settings-mcp-docs-link:hover { color: var(--settings-text, #fff); text-decoration: underline; }\n.settings-integrations-editor-head .settings-command-button--danger { margin-left: auto; }\n.settings-mcp-type-toggle { display: inline-flex; padding: 3px; border-radius: 8px; background: var(--settings-inset, rgba(255, 255, 255, 0.06)); border: 1px solid var(--settings-border, #8885); gap: 2px; width: fit-content; }\n.settings-mcp-type-btn { padding: 5px 14px; border-radius: 6px; border: none; background: transparent; color: var(--settings-muted, #888); font: inherit; font-size: 12px; font-weight: 500; cursor: pointer; transition: all 120ms ease; }\n.settings-mcp-type-btn:hover { color: var(--settings-text, #fff); }\n.settings-mcp-type-btn[data-active="true"] { background: var(--settings-active, rgba(255, 255, 255, 0.15)); color: var(--settings-text, #fff); font-weight: 600; }\n.settings-mcp-notice { margin: 4px 0 0; color: var(--settings-muted, #888); font-size: 12px; line-height: 1.5; }\n.settings-mcp-section { display: grid; gap: 14px; }\n.settings-mcp-icon-btn { display: inline-flex; align-items: center; justify-content: center; width: 34px; height: 34px; padding: 0; border: 1px solid var(--settings-border, #8885); border-radius: 8px; background: var(--settings-input, transparent); color: var(--settings-muted, #888); cursor: pointer; flex: none; transition: all 120ms ease; }\n.settings-mcp-icon-btn:hover:not(:disabled) { background: rgba(239, 68, 68, 0.15); border-color: rgba(239, 68, 68, 0.4); color: #f87171; }\n.settings-mcp-icon-btn svg { width: 14px; height: 14px; display: block; }\n.settings-integrations-callout { margin: 0; padding: 10px 12px; border-radius: 8px; background: var(--settings-inset); }\n.settings-skill-dropzone { display: grid; justify-items: center; gap: 8px; padding: 34px 22px; margin: 8px 0 18px; border: 1.5px dashed var(--settings-border, #8887); border-radius: 14px; background: var(--settings-inset); text-align: center; transition: border-color 120ms ease, background 120ms ease, transform 120ms ease; }\n.settings-skill-dropzone > span { max-width: 520px; color: var(--settings-muted); font-size: 12px; line-height: 18px; }\n.settings-skill-dropzone[data-drag-over="true"] { border-color: var(--settings-accent, #10a37f); background: var(--settings-accent-subtle, rgba(16, 163, 127, .1)); transform: scale(.995); }\n.settings-skill-dropzone[data-disabled="true"] { opacity: .55; }\n.settings-skills-target-row { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; justify-content: center; margin-top: 6px; }\n.settings-skills-target-row select { padding: 6px 10px; border: 1px solid var(--settings-border, #8885); border-radius: 8px; background: var(--settings-input, transparent); color: inherit; font: inherit; font-size: 12px; }\n.settings-skills-overview-stats { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; margin: 6px 0 10px; font-size: 12px; color: var(--settings-muted); }\n.settings-skills-tabs { display: inline-flex; padding: 3px; border-radius: 8px; background: var(--settings-inset, rgba(255, 255, 255, 0.06)); border: 1px solid var(--settings-border, #8885); gap: 2px; }\n.settings-skills-tab-btn { padding: 5px 14px; border-radius: 6px; border: none; background: transparent; color: var(--settings-muted, #888); font: inherit; font-size: 12px; font-weight: 500; cursor: pointer; transition: all 120ms ease; }\n.settings-skills-tab-btn:hover { color: var(--settings-text, #fff); }\n.settings-skills-tab-btn[data-active="true"] { background: var(--settings-active, rgba(255, 255, 255, 0.15)); color: var(--settings-text, #fff); font-weight: 600; }\n.settings-skills-overview-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); gap: 14px; margin-top: 10px; }\n.settings-skills-harness-card { border: 1px solid var(--settings-border, #8885); border-radius: 12px; padding: 14px; background: var(--settings-surface, transparent); display: flex; flex-direction: column; gap: 10px; }\n.settings-skills-harness-head { display: flex; justify-content: space-between; align-items: center; border-bottom: 1px solid var(--settings-border, #8883); padding-bottom: 8px; }\n.settings-skills-harness-head strong { font-size: 14px; }\n.settings-skills-badge { font-size: 11px; padding: 2px 8px; border-radius: 10px; background: var(--settings-inset, rgba(255, 255, 255, 0.08)); color: var(--settings-muted); }\n.settings-skills-badge--active { background: rgba(16, 163, 127, 0.15); color: #10a37f; }\n.settings-skills-list-compact { display: flex; flex-direction: column; gap: 8px; max-height: 280px; overflow-y: auto; }\n.settings-skills-item-row { display: flex; justify-content: space-between; align-items: center; gap: 8px; padding: 6px 8px; border-radius: 6px; background: var(--settings-inset, rgba(255, 255, 255, 0.03)); font-size: 12px; }\n.settings-skills-item-row strong { font-size: 13px; }\n.settings-skills-item-row code { font-size: 10px; color: var(--settings-muted); overflow-wrap: anywhere; display: block; }\n.settings-skills-item-actions { display: flex; gap: 6px; align-items: center; flex: none; }\n.settings-skills-matrix-list { display: flex; flex-direction: column; gap: 10px; margin-top: 10px; }\n.settings-skills-matrix-card { border: 1px solid var(--settings-border, #8885); border-radius: 10px; padding: 12px 14px; background: var(--settings-surface, transparent); display: flex; flex-direction: column; gap: 8px; }\n.settings-skills-matrix-head { display: flex; justify-content: space-between; align-items: center; }\n.settings-skills-matrix-head span { font-size: 11px; color: var(--settings-muted); }\n.settings-skills-tags { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }\n.settings-skills-tag { font-size: 11px; padding: 3px 8px; border-radius: 6px; background: rgba(16, 163, 127, 0.15); color: #10a37f; border: 1px solid rgba(16, 163, 127, 0.3); }\n.settings-skills-sync-actions { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; margin-top: 4px; }\n.settings-skills-sync-modal { border: 1px solid var(--settings-border, #8885); border-radius: 12px; background: var(--settings-bg, #1e1e1e); color: inherit; padding: 20px 24px; max-width: 420px; box-shadow: 0 16px 32px rgba(0, 0, 0, 0.5); }\n.settings-skills-sync-modal::backdrop { background: rgba(0, 0, 0, 0.6); backdrop-filter: blur(2px); }\n.settings-skills-sync-modal h3 { margin: 0 0 8px; font-size: 16px; }\n.settings-skills-sync-modal p { margin: 0 0 12px; font-size: 12px; color: var(--settings-muted); }\n.settings-mcp-overview-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(340px, 1fr)); gap: 14px; margin-top: 10px; }\n.settings-mcp-harness-card { border: 1px solid var(--settings-border, #8885); border-radius: 12px; padding: 14px; background: var(--settings-surface, transparent); display: flex; flex-direction: column; gap: 10px; }\n.settings-mcp-harness-head { display: flex; justify-content: space-between; align-items: center; border-bottom: 1px solid var(--settings-border, #8883); padding-bottom: 8px; }\n.settings-mcp-harness-head strong { font-size: 14px; }\n.settings-mcp-native-box { padding: 8px 10px; border-radius: 8px; background: rgba(16, 163, 127, 0.08); border: 1px dashed rgba(16, 163, 127, 0.3); font-size: 11px; display: flex; flex-direction: column; gap: 4px; }\n.settings-mcp-native-title { font-weight: 600; color: #10a37f; display: flex; align-items: center; gap: 6px; }\n.settings-mcp-native-item { display: flex; flex-direction: column; gap: 2px; color: var(--settings-muted); }\n.settings-mcp-native-item code { font-size: 10px; overflow-wrap: anywhere; }\n.settings-mcp-list-compact { display: flex; flex-direction: column; gap: 8px; max-height: 280px; overflow-y: auto; }\n.settings-mcp-item-row { display: flex; justify-content: space-between; align-items: center; gap: 8px; padding: 6px 8px; border-radius: 6px; background: var(--settings-inset, rgba(255, 255, 255, 0.03)); font-size: 12px; }\n.settings-mcp-item-row strong { font-size: 13px; }\n.settings-mcp-item-row code { font-size: 10px; color: var(--settings-muted); overflow-wrap: anywhere; display: block; }\n.settings-mcp-item-actions { display: flex; gap: 6px; align-items: center; flex: none; }\n.settings-mcp-card-footer { display: flex; justify-content: flex-end; margin-top: auto; padding-top: 6px; border-top: 1px solid var(--settings-border, #8882); }\n.settings-mcp-matrix-list { display: flex; flex-direction: column; gap: 10px; margin-top: 10px; }\n.settings-mcp-matrix-card { border: 1px solid var(--settings-border, #8885); border-radius: 10px; padding: 12px 14px; background: var(--settings-surface, transparent); display: flex; flex-direction: column; gap: 8px; }\n.settings-mcp-matrix-head { display: flex; justify-content: space-between; align-items: center; }\n.settings-mcp-matrix-head span { font-size: 11px; color: var(--settings-muted); }\n.settings-mcp-tags { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }\n.settings-mcp-tag { font-size: 11px; padding: 3px 8px; border-radius: 6px; background: rgba(16, 163, 127, 0.15); color: #10a37f; border: 1px solid rgba(16, 163, 127, 0.3); }\n.settings-mcp-tag--disabled { background: rgba(255, 255, 255, 0.05); color: var(--settings-muted); border-color: var(--settings-border, #8885); }\n.settings-mcp-sync-actions { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; margin-top: 4px; }\n.settings-mcp-distribute-modal { border: 1px solid var(--settings-border, #8885); border-radius: 12px; background: var(--settings-bg, #1e1e1e); color: inherit; padding: 20px 24px; max-width: 540px; width: 92%; max-height: 85vh; overflow-y: auto; box-shadow: 0 16px 32px rgba(0, 0, 0, 0.5); }\n.settings-mcp-distribute-modal::backdrop { background: rgba(0, 0, 0, 0.6); backdrop-filter: blur(2px); }\n.settings-mcp-distribute-modal h3 { margin: 0 0 8px; font-size: 16px; }\n.settings-mcp-distribute-modal p { margin: 0 0 12px; font-size: 12px; color: var(--settings-muted); }\n\n';
|
|
30493
31142
|
|
|
30494
31143
|
// src/native-ui/renderer-extension/src/settings/accounts.css
|
|
30495
31144
|
var accounts_default = '.settings-harness-accounts {\n margin-top: 32px;\n}\n\n.settings-harness-accounts__title {\n margin: 0 0 16px;\n font-size: 14px;\n font-weight: 500;\n}\n\n.settings-harness-account__identity {\n min-width: 0;\n}\n\n.settings-harness-account__identity > .settings-account-email {\n display: block;\n max-width: 24ch;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.settings-harness-account__logo {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n flex: none;\n}\n\n.settings-harness-account {\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-wrap: wrap;\n gap: 20px;\n padding: 20px 24px;\n}\n\n.settings-harness-account > .settings-account-row__person {\n flex: 1 1 280px;\n min-width: 0;\n}\n\n.settings-harness-account > .settings-account-usage {\n flex: 1 1 220px;\n min-width: 0;\n}\n\n.settings-harness-account > .settings-harness-account__actions {\n flex: 0 0 auto;\n}\n\n.settings-harness-account__badge {\n display: inline-flex;\n align-items: center;\n padding: 1px 7px;\n border-radius: 999px;\n font-size: 11px;\n font-weight: 500;\n line-height: 16px;\n}\n\n.settings-harness-account__badge--ready {\n background: rgba(16, 185, 129, 0.12);\n color: #10b981;\n border: 1px solid rgba(16, 185, 129, 0.28);\n}\n\n.settings-harness-account__badge--unconfigured {\n background: rgba(245, 158, 11, 0.12);\n color: #f59e0b;\n border: 1px solid rgba(245, 158, 11, 0.28);\n}\n\n.settings-harness-account__badge--not_installed {\n background: rgba(156, 163, 175, 0.12);\n color: var(--settings-muted);\n border: 1px solid rgba(156, 163, 175, 0.25);\n}\n\n.settings-harness-account__config-hint {\n margin-top: 6px;\n font-size: 11px;\n color: var(--settings-muted);\n display: flex;\n align-items: center;\n gap: 4px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.settings-harness-account__config-hint code {\n font-family: ui-monospace, Consolas, monospace;\n font-size: 11px;\n background: var(--settings-surface);\n border: 1px solid var(--settings-border);\n padding: 1px 5px;\n border-radius: 4px;\n}\n\n.settings-harness-account__actions {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.settings-harness-account__login-btn {\n font-size: 12px;\n padding: 6px 12px;\n white-space: nowrap;\n}\n\n.settings-harness-account + .settings-harness-account {\n border-top: 1px solid var(--settings-border);\n}\n\n.settings-harness-account > div {\n min-width: 0;\n overflow-wrap: anywhere;\n}\n\n@media (max-width: 700px) {\n .settings-harness-account {\n grid-template-columns: minmax(0, 1fr);\n padding: 16px;\n }\n}\n\n.settings-account-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 20px;\n}\n\n.settings-account-eyebrow {\n margin: 0 0 8px;\n color: var(--settings-muted);\n font-size: 11px;\n letter-spacing: 0.13em;\n}\n\n.settings-account-header > :first-child {\n min-width: 0;\n flex: 1 1 auto;\n}\n\n.settings-account-header > .settings-command-button {\n flex: none;\n white-space: nowrap;\n margin-top: 20px;\n min-height: 36px;\n padding: 8px 12px;\n border-radius: 7px;\n}\n\n.settings-account-header .settings-section-label {\n margin: 0;\n padding: 0;\n font-size: 27px;\n line-height: 1.4;\n font-weight: 650;\n letter-spacing: -0.035em;\n}\n.settings-account-header .settings-page-description {\n margin: 8px 0 0;\n font-size: 13px;\n}\n\n.settings-account-status {\n margin: 0;\n color: var(--settings-muted);\n font-size: 12px;\n}\n.settings-account-status:empty {\n display: none;\n}\n\n.settings-account-help-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n margin-top: 20px;\n flex-wrap: wrap;\n}\n.settings-account-task-hint {\n display: flex;\n align-items: flex-start;\n gap: 9px;\n margin: 0;\n color: var(--settings-muted);\n font-size: 12px;\n flex: 1 1 280px;\n}\n.settings-account-task-hint svg {\n flex: none;\n margin-top: 1px;\n}\n.settings-account-help-button {\n display: inline-flex;\n align-items: center;\n gap: 7px;\n padding: 8px 12px;\n color: var(--settings-muted);\n font-size: 12px;\n background: transparent;\n border: 0;\n border-radius: 7px;\n cursor: pointer;\n}\n.settings-account-help-button:hover {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n.settings-account-device-code-note {\n margin: 12px 0 0;\n font-size: 12px;\n padding: 10px 12px;\n color: var(--settings-warning);\n background: var(--settings-warning-bg);\n border: 1px solid var(--settings-warning-border);\n border-radius: 8px;\n}\n\n.settings-account-toolbar {\n margin-top: 27px;\n padding: 18px 0;\n border-top: 1px solid var(--settings-border);\n display: flex;\n align-items: center;\n gap: 14px;\n flex-wrap: wrap;\n}\n.settings-account-count {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n white-space: nowrap;\n}\n.settings-account-count > :last-child {\n color: var(--settings-muted);\n font-variant-numeric: tabular-nums;\n}\n.settings-account-search {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--settings-muted);\n margin-right: auto;\n min-width: 0;\n max-width: 100%;\n}\n.settings-account-search svg {\n flex: none;\n}\n.settings-account-toolbar input {\n min-width: 80px;\n width: 150px;\n max-width: 100%;\n padding: 5px 0;\n color: var(--settings-text);\n background: transparent;\n border: 0;\n font-size: 13px;\n}\n.settings-account-toolbar input::placeholder {\n color: var(--settings-muted);\n}\n.settings-account-display-controls {\n display: flex;\n padding: 3px;\n border: 1px solid var(--settings-border);\n border-radius: 7px;\n background: var(--settings-inset);\n}\n.settings-account-display-controls button {\n padding: 4px 10px;\n color: var(--settings-muted);\n background: transparent;\n border: 0;\n border-radius: 4px;\n font-size: 12px;\n cursor: pointer;\n}\n.settings-account-display-controls button:hover {\n color: var(--settings-text);\n}\n.settings-account-display-controls button[aria-pressed="true"] {\n color: var(--settings-text);\n background: var(--settings-active);\n}\n\n.settings-account-list {\n --account-border: light-dark(#e2e2e8, #36363b);\n --account-muted: light-dark(#676773, #a5a5af);\n border: 1px solid var(--account-border);\n border-radius: 11px;\n overflow: hidden;\n container-type: inline-size;\n}\n.settings-account-table {\n width: 100%;\n table-layout: fixed;\n border-collapse: collapse;\n font-size: 12px;\n}\n.settings-account-table th {\n padding: 13px 20px;\n color: var(--account-muted);\n background: light-dark(#f8f8fa, #202024);\n font-size: 11px;\n font-weight: 500;\n text-align: left;\n}\n.settings-account-table th:nth-child(1) {\n width: 32%;\n}\n.settings-account-table th:nth-child(2) {\n width: 38%;\n}\n.settings-account-table th:nth-child(3) {\n width: 12%;\n}\n.settings-account-table th:nth-child(4) {\n width: 18%;\n text-align: right;\n}\n.settings-account-table td {\n padding: 19px 20px;\n vertical-align: middle;\n border-top: 1px solid var(--settings-divider);\n}\n.settings-account-row {\n background: light-dark(#ffffff, #232326);\n}\n.settings-account-row:hover {\n background: light-dark(#f7f7fa, #26262a);\n}\n.settings-account-row__person {\n display: grid;\n grid-template-columns: 34px minmax(0, 1fr);\n align-items: center;\n gap: 11px;\n min-width: 0;\n}\n.settings-account-row__mark {\n display: grid;\n place-items: center;\n width: 34px;\n height: 34px;\n color: light-dark(#67558d, #c3baff);\n background: light-dark(#f0ecf7, #353044);\n border: 1px solid light-dark(#d9d0e6, #4d435f);\n border-radius: 10px;\n}\n.settings-account-row__identity {\n min-width: 0;\n}\n.settings-account-title {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n}\n.settings-account-email {\n min-width: 0;\n overflow: hidden;\n font-size: 13px;\n font-weight: 550;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.settings-account-metadata {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 7px;\n margin-top: 4px;\n color: var(--settings-muted);\n}\n.settings-account-domain {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.settings-account-plan-separator {\n flex: none;\n}\n.settings-account-plan {\n flex: none;\n padding: 1px 6px;\n color: var(--settings-muted);\n border: 1px solid var(--settings-border);\n border-radius: 5px;\n font-size: 11px;\n white-space: nowrap;\n}\n.settings-account-plan--highlighted {\n color: light-dark(#654f91, #c8bfff);\n background: light-dark(#f2edf9, #a99bff18);\n border-color: light-dark(#d9ccea, #a99bff52);\n font-weight: 600;\n}\n.settings-account-active {\n flex: none;\n padding: 2px 7px;\n color: light-dark(#66548e, #bdb4ff);\n background: light-dark(#f4f0fb, #aca0ff12);\n border: 1px solid light-dark(#dfd5f1, #aca0ff24);\n border-radius: 5px;\n font-size: 11px;\n white-space: nowrap;\n}\n\n.settings-account-usage {\n display: grid;\n gap: 14px;\n max-width: 380px;\n}\n.settings-account-usage__meter {\n display: grid;\n grid-template-columns: 48px minmax(36px, 1fr) 96px;\n align-items: center;\n gap: 3px 10px;\n}\n:host([lang="zh-CN"]) .settings-account-usage__meter {\n grid-template-columns: 48px minmax(36px, 1fr) 72px;\n}\n\n.settings-account-usage__title {\n color: light-dark(#5d5d68, #c3c3cd);\n font-size: 12px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.settings-account-usage__percent {\n display: flex;\n align-items: baseline;\n justify-content: flex-end;\n gap: 4px;\n font-size: 14px;\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n}\n.settings-account-usage__value-label {\n color: var(--settings-muted);\n font-size: 11px;\n font-weight: 400;\n}\n.settings-account-usage__percent--warn {\n color: var(--settings-warning);\n}\n.settings-account-usage__percent--hot {\n color: var(--settings-danger);\n}\n.settings-account-usage__bar {\n height: 4px;\n overflow: hidden;\n background: light-dark(#e3e1e8, #3c3c43);\n border-radius: 4px;\n}\n.settings-account-usage__bar > span {\n display: block;\n height: 100%;\n background: light-dark(#81769e, #9993b8);\n border-radius: inherit;\n}\n.settings-account-usage__bar--warn > span {\n background: var(--settings-warning);\n}\n.settings-account-usage__bar--hot > span {\n background: var(--settings-danger);\n}\n.settings-account-usage__sub {\n grid-column: 2 / -1;\n color: var(--account-muted);\n font-size: 11px;\n font-variant-numeric: tabular-nums;\n overflow-wrap: anywhere;\n}\n.settings-account-usage__message,\n.settings-account-unknown {\n color: var(--settings-muted);\n}\n.settings-account-usage > button {\n justify-self: start;\n}\n.settings-account-actions {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n gap: 4px;\n flex-wrap: wrap;\n}\n.settings-account-action {\n padding: 8px 10px;\n min-height: 36px;\n font-size: 12px;\n color: var(--settings-text);\n background: transparent;\n border: 1px solid transparent;\n border-radius: 7px;\n white-space: nowrap;\n cursor: pointer;\n}\n.settings-account-action:hover {\n background: var(--settings-hover);\n}\n.settings-account-action:disabled {\n opacity: 0.45;\n cursor: not-allowed;\n}\n.settings-account-actions .settings-account-delete {\n color: var(--settings-muted);\n}\n.settings-account-actions .settings-account-delete:hover,\n.settings-account-actions .settings-account-delete:focus-visible {\n color: var(--settings-danger);\n background: var(--settings-danger-bg);\n}\n.settings-account-mobile-label {\n display: none;\n}\n.settings-account-reset-summary {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n min-height: 32px;\n padding: 3px 0;\n font-size: 12px;\n white-space: nowrap;\n color: var(--settings-text);\n background: transparent;\n border: 0;\n border-radius: 5px;\n cursor: pointer;\n}\n.settings-account-reset-summary:hover {\n background: var(--settings-hover);\n}\n.settings-account-reset-summary[aria-expanded="true"] > svg:last-child {\n transform: rotate(90deg);\n}\n.settings-account-details-row > td {\n background: var(--settings-inset);\n}\n.settings-account-reset-details {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 16px;\n flex-wrap: wrap;\n}\n.settings-account-reset-details strong {\n font-size: 12px;\n}\n.settings-account-reset-expiry {\n margin: 6px 0;\n color: var(--settings-muted);\n font-size: 11px;\n}\n.settings-account-reset-expiry.is-warn {\n color: var(--settings-warning);\n}\n.settings-account-reset-expiry.is-hot {\n color: var(--settings-danger);\n}\n.settings-account-reset-list {\n margin: 8px 0 0;\n padding: 0;\n list-style: none;\n color: var(--settings-muted);\n font-size: 11px;\n}\n.settings-account-reset-list li + li {\n margin-top: 4px;\n}\n.settings-account-empty {\n text-align: center;\n color: var(--settings-muted);\n}\n.settings-account-verification {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n color: var(--settings-muted);\n}\n.settings-account-verification a {\n color: var(--settings-focus);\n overflow-wrap: anywhere;\n}\n.settings-account-verification code {\n padding: 5px 8px;\n color: var(--settings-text);\n font-size: 15px;\n font-weight: 600;\n letter-spacing: 0.08em;\n background: var(--settings-inset);\n border-radius: 6px;\n}\n.settings-account-list :focus-visible,\n.settings-account-toolbar :focus-visible,\n.settings-account-help-button:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: -2px;\n}\n\n@container (min-width: 611px) and (max-width: 800px) {\n .settings-account-table th,\n .settings-account-table td {\n padding-left: 12px;\n padding-right: 12px;\n }\n .settings-account-table th:nth-child(1) {\n width: 30%;\n }\n .settings-account-table th:nth-child(2) {\n width: 37%;\n }\n .settings-account-table th:nth-child(4) {\n width: 21%;\n }\n}\n\n@container (max-width: 610px) {\n .settings-account-table,\n .settings-account-table tbody {\n display: block;\n }\n .settings-account-table thead {\n display: none;\n }\n .settings-account-row {\n display: grid;\n grid-template-columns: 1fr 1fr;\n padding: 16px;\n gap: 12px;\n border-bottom: 1px solid var(--settings-divider);\n }\n .settings-account-table .settings-account-row > td {\n padding: 0;\n border: 0;\n }\n .settings-account-row > td:nth-child(1),\n .settings-account-row > td:nth-child(2) {\n grid-column: 1 / -1;\n }\n .settings-account-row > td:nth-child(3) {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n .settings-account-mobile-label {\n display: inline;\n color: var(--settings-muted);\n font-size: 11px;\n }\n .settings-account-usage {\n max-width: none;\n }\n .settings-account-table tr:not(.settings-account-row),\n .settings-account-table tr:not(.settings-account-row) > td {\n display: block;\n }\n}\n\n@media (forced-colors: active) {\n .settings-account-usage__bar {\n border: 1px solid CanvasText;\n }\n .settings-account-usage__bar > span {\n background: Highlight;\n }\n}\n';
|
|
@@ -30498,10 +31147,10 @@ ${logoCss}${polaroidCss}
|
|
|
30498
31147
|
var skin_market_default = '.skin-market__intro {\n max-width: 680px;\n margin: -8px 0 18px;\n color: var(--settings-muted);\n font-size: 13px;\n}\n\n.skin-safety-note {\n display: grid;\n grid-template-columns: 18px minmax(0, 1fr);\n align-items: start;\n gap: 10px;\n margin: 0 0 22px;\n padding: 12px 14px;\n color: var(--settings-muted);\n background: var(--settings-inset);\n border: 1px solid var(--settings-border);\n border-radius: 10px;\n}\n\n.skin-safety-note > span,\n.skin-safety-note strong {\n display: block;\n}\n\n.skin-safety-note strong {\n margin-bottom: 2px;\n color: var(--settings-text);\n font-weight: 600;\n}\n\n.skin-market-grid {\n display: grid;\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: 13px;\n}\n\n.skin-card {\n overflow: hidden;\n position: relative;\n min-width: 0;\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 12px;\n}\n\n.skin-card[data-selected] {\n border-color: color-mix(in srgb, var(--settings-focus) 62%, var(--settings-border));\n box-shadow: inset 3px 0 0 var(--settings-focus);\n}\n\n.skin-preview {\n position: relative;\n height: 128px;\n overflow: hidden;\n border-bottom: 1px solid rgb(255 255 255 / 10%);\n}\n\n.skin-preview::after {\n content: "";\n position: absolute;\n inset: 0;\n background: linear-gradient(180deg, rgb(255 255 255 / 8%), transparent 36%);\n pointer-events: none;\n}\n\n.skin-preview__dots {\n position: absolute;\n top: 11px;\n left: 12px;\n width: 5px;\n height: 5px;\n border-radius: 50%;\n background: rgb(255 255 255 / 70%);\n box-shadow: 9px 0 rgb(255 255 255 / 42%), 18px 0 rgb(255 255 255 / 24%);\n}\n\n.skin-preview__sidebar,\n.skin-preview__conversation,\n.skin-preview__composer {\n position: absolute;\n background: rgb(5 10 16 / 48%);\n border: 1px solid rgb(255 255 255 / 14%);\n backdrop-filter: blur(8px);\n}\n\n.skin-preview__sidebar {\n inset: 27px auto 10px 10px;\n width: 26%;\n border-radius: 6px;\n}\n\n.skin-preview__conversation {\n inset: 27px 10px 42px 31%;\n border-radius: 7px;\n}\n\n.skin-preview__conversation::before,\n.skin-preview__conversation::after {\n content: "";\n position: absolute;\n left: 12px;\n height: 5px;\n border-radius: 3px;\n background: rgb(255 255 255 / 48%);\n}\n\n.skin-preview__conversation::before {\n top: 14px;\n width: 56%;\n}\n\n.skin-preview__conversation::after {\n top: 27px;\n width: 38%;\n opacity: 0.55;\n}\n\n.skin-preview__composer {\n right: 10px;\n bottom: 10px;\n left: 31%;\n height: 24px;\n border-radius: 8px;\n}\n\n.skin-card__body {\n padding: 14px;\n}\n\n.skin-card__title-row,\n.skin-card__footer {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.skin-card__title {\n font-size: 14px;\n font-weight: 600;\n}\n\n.skin-card__current {\n margin-left: auto;\n color: var(--settings-success);\n font-size: 11px;\n font-weight: 600;\n}\n\n.skin-card__description {\n min-height: 38px;\n margin: 7px 0 13px;\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 1.55;\n}\n\n.skin-card__description a {\n color: inherit;\n text-decoration: underline;\n text-decoration-color: var(--settings-border);\n text-underline-offset: 3px;\n}\n\n.skin-card__description a:hover {\n color: var(--settings-text);\n}\n\n.skin-card__palette {\n display: flex;\n align-items: center;\n}\n\n.skin-card__palette i {\n width: 18px;\n height: 18px;\n margin-left: -4px;\n border: 2px solid var(--settings-panel);\n border-radius: 50%;\n}\n\n.skin-card__palette i:first-child {\n margin-left: 0;\n}\n\n.skin-card__apply {\n margin-left: auto;\n}\n\n.skin-card__apply:disabled {\n color: var(--settings-muted);\n background: var(--settings-surface);\n cursor: default;\n}\n\n@media (max-width: 900px) {\n .skin-market-grid {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n}\n\n@media (max-width: 620px) {\n .skin-market-grid {\n grid-template-columns: 1fr;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .skin-card,\n .skin-card * {\n transition: none !important;\n }\n}\n';
|
|
30499
31148
|
|
|
30500
31149
|
// src/native-ui/renderer-extension/src/settings/pet-market.css
|
|
30501
|
-
var pet_market_default = '.pet-market__intro {\n margin: 0 0 16px;\n font-size: 13px;\n line-height: 1.5;\n color: var(--text-secondary, rgba(255, 255, 255, 0.65));\n}\n\n.pet-safety-note {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n padding: 10px 14px;\n margin-bottom: 20px;\n border-radius: 8px;\n background: var(--bg-secondary, rgba(255, 255, 255, 0.04));\n border: 1px solid var(--border-subtle, rgba(255, 255, 255, 0.08));\n font-size: 12px;\n line-height: 1.4;\n color: var(--text-secondary, rgba(255, 255, 255, 0.7));\n}\n\n.pet-safety-note strong {\n display: block;\n font-size: 12px;\n font-weight: 600;\n color: var(--text-primary, #ffffff);\n margin-bottom: 2px;\n}\n\n.pet-safety-note svg {\n flex-shrink: 0;\n color: var(--accent, #10a37f);\n margin-top: 1px;\n}\n\n.pet-market__toolbar {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n margin-bottom: 18px;\n}\n\n.pet-market__tabs {\n display: flex;\n align-items: center;\n gap: 6px;\n background: var(--bg-secondary, rgba(255, 255, 255, 0.04));\n padding: 3px;\n border-radius: 8px;\n border: 1px solid var(--border-subtle, rgba(255, 255, 255, 0.08));\n}\n\n.pet-market__tab {\n appearance: none;\n background: transparent;\n border: none;\n color: var(--text-secondary, rgba(255, 255, 255, 0.6));\n padding: 5px 12px;\n border-radius: 6px;\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s, color 0.15s;\n}\n\n.pet-market__tab:hover {\n color: var(--text-primary, #ffffff);\n background: rgba(255, 255, 255, 0.05);\n}\n\n.pet-market__tab[data-active="true"] {\n background: var(--bg-tertiary, rgba(255, 255, 255, 0.12));\n color: var(--text-primary, #ffffff);\n font-weight: 600;\n}\n\n.pet-market__search-wrap {\n position: relative;\n min-width: 200px;\n flex: 1;\n max-width: 280px;\n}\n\n.pet-market__search-wrap svg {\n position: absolute;\n left: 10px;\n top: 50%;\n transform: translateY(-50%);\n pointer-events: none;\n color: var(--text-tertiary, rgba(255, 255, 255, 0.4));\n}\n\n.pet-market__search {\n width: 100%;\n padding: 6px 12px 6px 32px;\n border-radius: 6px;\n background: var(--bg-secondary, rgba(255, 255, 255, 0.05));\n border: 1px solid var(--border-subtle, rgba(255, 255, 255, 0.1));\n color: var(--text-primary, #ffffff);\n font-size: 12px;\n outline: none;\n transition: border-color 0.15s;\n}\n\n.pet-market__search:focus {\n border-color: var(--accent, #10a37f);\n}\n\n.pet-market-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 16px;\n}\n\n.pet-card {\n display: flex;\n flex-direction: column;\n background: var(--bg-secondary, rgba(255, 255, 255, 0.03));\n border: 1px solid var(--border-subtle, rgba(255, 255, 255, 0.08));\n border-radius: 10px;\n overflow: hidden;\n transition: border-color 0.2s, box-shadow 0.2s;\n}\n\n.pet-card:hover {\n border-color: var(--border-strong, rgba(255, 255, 255, 0.18));\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);\n}\n\n.pet-card[data-installed="true"] {\n border-color: rgba(16, 163, 127, 0.35);\n}\n\n.pet-card__stage {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n height: 140px;\n background: radial-gradient(circle at center, rgba(255, 255, 255, 0.06) 0%, rgba(255, 255, 255, 0.01) 70%);\n border-bottom: 1px solid var(--border-subtle, rgba(255, 255, 255, 0.06));\n overflow: hidden;\n user-select: none;\n}\n\n.pet-card__sprite {\n width: 96px;\n height: 104px;\n background-repeat: no-repeat;\n image-rendering: pixelated;\n image-rendering: -webkit-optimize-contrast;\n transition: transform 0.2s;\n}\n\n.pet-card:hover .pet-card__sprite {\n transform: scale(1.08);\n}\n\n.pet-card__body {\n display: flex;\n flex-direction: column;\n flex: 1;\n padding: 14px;\n}\n\n.pet-card__header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 8px;\n margin-bottom: 6px;\n}\n\n.pet-card__title {\n font-size: 14px;\n font-weight: 600;\n color: var(--text-primary, #ffffff);\n}\n\n.pet-card__badges {\n display: flex;\n align-items: center;\n gap: 4px;\n flex-shrink: 0;\n}\n\n.pet-card__badge {\n display: inline-flex;\n align-items: center;\n gap: 3px;\n font-size: 10.5px;\n padding: 2px 6px;\n border-radius: 4px;\n font-weight: 500;\n}\n\n.pet-card__badge--official {\n background: rgba(59, 130, 246, 0.15);\n color: #60a5fa;\n border: 1px solid rgba(59, 130, 246, 0.3);\n}\n\n.pet-card__badge--community {\n background: rgba(168, 85, 247, 0.15);\n color: #c084fc;\n border: 1px solid rgba(168, 85, 247, 0.3);\n}\n\n.pet-card__badge--installed {\n background: rgba(16, 163, 127, 0.15);\n color: #10a37f;\n border: 1px solid rgba(16, 163, 127, 0.3);\n}\n\n.pet-card__description {\n margin: 0 0 14px;\n font-size: 12px;\n line-height: 1.45;\n color: var(--text-secondary, rgba(255, 255, 255, 0.6));\n flex: 1;\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.pet-card__footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n margin-top: auto;\n padding-top: 10px;\n border-top: 1px solid var(--border-subtle, rgba(255, 255, 255, 0.05));\n}\n\n.pet-card__dir-hint {\n font-size: 11px;\n color: var(--text-tertiary, rgba(255, 255, 255, 0.4));\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.pet-card__actions {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-left: auto;\n}\n\n.pet-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n font-size: 12px;\n font-weight: 500;\n padding: 5px 12px;\n border-radius: 6px;\n border: 1px solid transparent;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.pet-btn--primary {\n background: var(--accent, #10a37f);\n color: #ffffff;\n}\n\n.pet-btn--primary:hover:not(:disabled) {\n filter: brightness(1.1);\n}\n\n.pet-btn--secondary {\n background: var(--bg-tertiary, rgba(255, 255, 255, 0.08));\n border-color: var(--border-subtle, rgba(255, 255, 255, 0.1));\n color: var(--text-secondary, rgba(255, 255, 255, 0.75));\n}\n\n.pet-btn--secondary:hover:not(:disabled) {\n background: rgba(255, 255, 255, 0.12);\n color: var(--text-primary, #ffffff);\n}\n\n.pet-btn--danger {\n background: transparent;\n border-color: rgba(239, 68, 68, 0.25);\n color: #f87171;\n}\n\n.pet-btn--danger:hover:not(:disabled) {\n background: rgba(239, 68, 68, 0.12);\n border-color: rgba(239, 68, 68, 0.5);\n}\n\n.pet-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.pet-market__empty {\n grid-column: 1 / -1;\n text-align: center;\n padding: 40px 20px;\n color: var(--text-tertiary, rgba(255, 255, 255, 0.45));\n font-size: 13px;\n}\n';
|
|
31150
|
+
var pet_market_default = '.pet-market__intro {\n margin: 0 0 16px;\n font-size: 13px;\n line-height: 1.5;\n color: var(--text-secondary, rgba(255, 255, 255, 0.65));\n}\n\n.pet-safety-note {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n padding: 10px 14px;\n margin-bottom: 20px;\n border-radius: 8px;\n background: var(--bg-secondary, rgba(255, 255, 255, 0.04));\n border: 1px solid var(--border-subtle, rgba(255, 255, 255, 0.08));\n font-size: 12px;\n line-height: 1.4;\n color: var(--text-secondary, rgba(255, 255, 255, 0.7));\n}\n\n.pet-safety-note strong {\n display: block;\n font-size: 12px;\n font-weight: 600;\n color: var(--text-primary, #ffffff);\n margin-bottom: 2px;\n}\n\n.pet-safety-note svg {\n flex-shrink: 0;\n color: var(--accent, #10a37f);\n margin-top: 1px;\n}\n\n.pet-market__toolbar {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n margin-bottom: 18px;\n}\n\n.pet-market__tabs {\n display: flex;\n align-items: center;\n gap: 6px;\n background: var(--bg-secondary, rgba(255, 255, 255, 0.04));\n padding: 3px;\n border-radius: 8px;\n border: 1px solid var(--border-subtle, rgba(255, 255, 255, 0.08));\n}\n\n.pet-market__tab {\n appearance: none;\n background: transparent;\n border: none;\n color: var(--text-secondary, rgba(255, 255, 255, 0.6));\n padding: 5px 12px;\n border-radius: 6px;\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s, color 0.15s;\n}\n\n.pet-market__tab:hover {\n color: var(--text-primary, #ffffff);\n background: rgba(255, 255, 255, 0.05);\n}\n\n.pet-market__tab[data-active="true"] {\n background: var(--bg-tertiary, rgba(255, 255, 255, 0.12));\n color: var(--text-primary, #ffffff);\n font-weight: 600;\n}\n\n.pet-market__search-wrap {\n position: relative;\n min-width: 200px;\n flex: 1;\n max-width: 280px;\n}\n\n.pet-market__search-wrap svg {\n position: absolute;\n left: 10px;\n top: 50%;\n transform: translateY(-50%);\n pointer-events: none;\n color: var(--text-tertiary, rgba(255, 255, 255, 0.4));\n}\n\n.pet-market__search {\n width: 100%;\n padding: 6px 12px 6px 32px;\n border-radius: 6px;\n background: var(--bg-secondary, rgba(255, 255, 255, 0.05));\n border: 1px solid var(--border-subtle, rgba(255, 255, 255, 0.1));\n color: var(--text-primary, #ffffff);\n font-size: 12px;\n outline: none;\n transition: border-color 0.15s;\n}\n\n.pet-market__search:focus {\n border-color: var(--accent, #10a37f);\n}\n\n.pet-market-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 16px;\n}\n\n.pet-card {\n display: flex;\n flex-direction: column;\n background: var(--bg-secondary, rgba(255, 255, 255, 0.03));\n border: 1px solid var(--border-subtle, rgba(255, 255, 255, 0.08));\n border-radius: 10px;\n overflow: hidden;\n transition: border-color 0.2s, box-shadow 0.2s;\n}\n\n.pet-card:hover {\n border-color: var(--border-strong, rgba(255, 255, 255, 0.18));\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);\n}\n\n.pet-card[data-installed="true"] {\n border-color: rgba(16, 163, 127, 0.35);\n}\n\n.pet-card[data-state="installing"] .pet-card__stage,\n.pet-card[data-state="uninstalling"] .pet-card__stage {\n opacity: 0.55;\n}\n\n.pet-card[data-state="failed"] {\n border-color: rgba(239, 68, 68, 0.35);\n}\n\n.pet-card__stage {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n height: 140px;\n background: radial-gradient(circle at center, rgba(255, 255, 255, 0.06) 0%, rgba(255, 255, 255, 0.01) 70%);\n border-bottom: 1px solid var(--border-subtle, rgba(255, 255, 255, 0.06));\n overflow: hidden;\n user-select: none;\n}\n\n.pet-card__sprite {\n width: 96px;\n height: 104px;\n background-repeat: no-repeat;\n image-rendering: pixelated;\n image-rendering: -webkit-optimize-contrast;\n transition: transform 0.2s;\n}\n\n.pet-card:hover .pet-card__sprite {\n transform: scale(1.08);\n}\n\n.pet-card__body {\n display: flex;\n flex-direction: column;\n flex: 1;\n padding: 14px;\n}\n\n.pet-card__header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 8px;\n margin-bottom: 6px;\n}\n\n.pet-card__title {\n font-size: 14px;\n font-weight: 600;\n color: var(--text-primary, #ffffff);\n}\n\n.pet-card__badges {\n display: flex;\n align-items: center;\n gap: 4px;\n flex-shrink: 0;\n}\n\n.pet-card__badge {\n display: inline-flex;\n align-items: center;\n gap: 3px;\n font-size: 10.5px;\n padding: 2px 6px;\n border-radius: 4px;\n font-weight: 500;\n}\n\n.pet-card__badge--official {\n background: rgba(59, 130, 246, 0.15);\n color: #60a5fa;\n border: 1px solid rgba(59, 130, 246, 0.3);\n}\n\n.pet-card__badge--community {\n background: rgba(168, 85, 247, 0.15);\n color: #c084fc;\n border: 1px solid rgba(168, 85, 247, 0.3);\n}\n\n.pet-card__badge--installed {\n background: rgba(16, 163, 127, 0.15);\n color: #10a37f;\n border: 1px solid rgba(16, 163, 127, 0.3);\n}\n\n.pet-card__badge--failed {\n background: rgba(239, 68, 68, 0.15);\n color: #f87171;\n border: 1px solid rgba(239, 68, 68, 0.3);\n}\n\n.pet-card__status {\n margin: 0 0 10px;\n font-size: 11.5px;\n color: var(--text-secondary, rgba(255, 255, 255, 0.6));\n}\n\n.pet-card__error {\n margin: 0 0 10px;\n padding: 6px 8px;\n border-radius: 6px;\n background: rgba(239, 68, 68, 0.08);\n border: 1px solid rgba(239, 68, 68, 0.25);\n color: #f87171;\n font-size: 11.5px;\n line-height: 1.4;\n word-break: break-word;\n}\n\n.pet-card__description {\n margin: 0 0 14px;\n font-size: 12px;\n line-height: 1.45;\n color: var(--text-secondary, rgba(255, 255, 255, 0.6));\n flex: 1;\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.pet-card__footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n margin-top: auto;\n padding-top: 10px;\n border-top: 1px solid var(--border-subtle, rgba(255, 255, 255, 0.05));\n}\n\n.pet-card__dir-hint {\n font-size: 11px;\n color: var(--text-tertiary, rgba(255, 255, 255, 0.4));\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.pet-card__actions {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-left: auto;\n}\n\n.pet-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n font-size: 12px;\n font-weight: 500;\n padding: 5px 12px;\n border-radius: 6px;\n border: 1px solid transparent;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.pet-btn--primary {\n background: var(--accent, #10a37f);\n color: #ffffff;\n}\n\n.pet-btn--primary:hover:not(:disabled) {\n filter: brightness(1.1);\n}\n\n.pet-btn--secondary {\n background: var(--bg-tertiary, rgba(255, 255, 255, 0.08));\n border-color: var(--border-subtle, rgba(255, 255, 255, 0.1));\n color: var(--text-secondary, rgba(255, 255, 255, 0.75));\n}\n\n.pet-btn--secondary:hover:not(:disabled) {\n background: rgba(255, 255, 255, 0.12);\n color: var(--text-primary, #ffffff);\n}\n\n.pet-btn--danger {\n background: transparent;\n border-color: rgba(239, 68, 68, 0.25);\n color: #f87171;\n}\n\n.pet-btn--danger:hover:not(:disabled) {\n background: rgba(239, 68, 68, 0.12);\n border-color: rgba(239, 68, 68, 0.5);\n}\n\n.pet-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.pet-market__empty {\n grid-column: 1 / -1;\n text-align: center;\n padding: 40px 20px;\n color: var(--text-tertiary, rgba(255, 255, 255, 0.45));\n font-size: 13px;\n}\n';
|
|
30502
31151
|
|
|
30503
31152
|
// src/native-ui/renderer-extension/src/settings/shell.ts
|
|
30504
|
-
var SETTINGS_SHELL_ATTRIBUTE = "data-
|
|
31153
|
+
var SETTINGS_SHELL_ATTRIBUTE = "data-harnessmix-settings-shell";
|
|
30505
31154
|
var RENDERER_SETTINGS_COLOR_SCHEME = "inherit";
|
|
30506
31155
|
function isRendererSettingsDialogSupported(dialog) {
|
|
30507
31156
|
return typeof dialog.showModal === "function" && typeof dialog.close === "function";
|
|
@@ -30516,7 +31165,7 @@ ${logoCss}${polaroidCss}
|
|
|
30516
31165
|
const resolvedRegistry = registry2 ?? createDefaultRendererSettingsRegistry(messages);
|
|
30517
31166
|
if (!ownerDocument.body) throw new Error("Renderer document body is unavailable");
|
|
30518
31167
|
if (ownerDocument.querySelector(`[${SETTINGS_SHELL_ATTRIBUTE}]`)) {
|
|
30519
|
-
throw new Error("A
|
|
31168
|
+
throw new Error("A harnessmix settings shell is already mounted");
|
|
30520
31169
|
}
|
|
30521
31170
|
const root = ownerDocument.createElement("div");
|
|
30522
31171
|
root.setAttribute(SETTINGS_SHELL_ATTRIBUTE, "v1");
|
|
@@ -30529,7 +31178,7 @@ ${accounts_default}
|
|
|
30529
31178
|
${skin_market_default}
|
|
30530
31179
|
${pet_market_default}`;
|
|
30531
31180
|
const dialog = ownerDocument.createElement("dialog");
|
|
30532
|
-
dialog.className = "
|
|
31181
|
+
dialog.className = "harnessmix-settings-dialog";
|
|
30533
31182
|
const frame = ownerDocument.createElement("div");
|
|
30534
31183
|
frame.className = "settings-frame";
|
|
30535
31184
|
const header = ownerDocument.createElement("header");
|
|
@@ -30546,7 +31195,7 @@ ${pet_market_default}`;
|
|
|
30546
31195
|
brandName.textContent = "Harness Mix";
|
|
30547
31196
|
const brandTitle = ownerDocument.createElement("span");
|
|
30548
31197
|
brandTitle.className = "settings-brand__title";
|
|
30549
|
-
brandTitle.id = "
|
|
31198
|
+
brandTitle.id = "harnessmix-settings-dialog-title";
|
|
30550
31199
|
brandTitle.textContent = messages.title;
|
|
30551
31200
|
brandCopy.append(brandName, brandTitle);
|
|
30552
31201
|
brand.append(brandMark, brandCopy);
|
|
@@ -30650,7 +31299,7 @@ ${pet_market_default}`;
|
|
|
30650
31299
|
}
|
|
30651
31300
|
const starLink = ownerDocument.createElement("a");
|
|
30652
31301
|
starLink.className = "settings-nav-button settings-nav-star-link";
|
|
30653
|
-
starLink.href =
|
|
31302
|
+
starLink.href = HARNESSMIX_GITHUB_REPOSITORY_URL;
|
|
30654
31303
|
starLink.target = "_blank";
|
|
30655
31304
|
starLink.rel = "noopener noreferrer";
|
|
30656
31305
|
starLink.setAttribute("aria-label", messages.starOnGitHub);
|
|
@@ -30741,24 +31390,24 @@ ${pet_market_default}`;
|
|
|
30741
31390
|
const registry2 = definitions ? createRendererSettingsPageRegistry(definitions) : createDefaultRendererSettingsRegistry(messages);
|
|
30742
31391
|
const ownerWindow = ownerDocument.defaultView ?? (typeof window !== "undefined" ? window : void 0);
|
|
30743
31392
|
if (ownerWindow) {
|
|
30744
|
-
ownerWindow.
|
|
31393
|
+
ownerWindow.__harnessmixSettingsShellV1?.dispose();
|
|
30745
31394
|
}
|
|
30746
31395
|
const shell = mountRendererSettingsShell(registry2, ownerDocument, messages);
|
|
30747
31396
|
if (ownerWindow) {
|
|
30748
|
-
ownerWindow.
|
|
31397
|
+
ownerWindow.__harnessmixSettingsShellV1 = shell;
|
|
30749
31398
|
}
|
|
30750
31399
|
const dispose = shell.dispose.bind(shell);
|
|
30751
31400
|
shell.dispose = () => {
|
|
30752
31401
|
dispose();
|
|
30753
|
-
if (ownerWindow && ownerWindow.
|
|
30754
|
-
delete ownerWindow.
|
|
31402
|
+
if (ownerWindow && ownerWindow.__harnessmixSettingsShellV1 === shell) {
|
|
31403
|
+
delete ownerWindow.__harnessmixSettingsShellV1;
|
|
30755
31404
|
}
|
|
30756
31405
|
};
|
|
30757
31406
|
return shell;
|
|
30758
31407
|
}
|
|
30759
31408
|
|
|
30760
31409
|
// src/native-ui/renderer-extension/src/settings/trigger.ts
|
|
30761
|
-
var SETTINGS_TRIGGER_ATTRIBUTE = "data-
|
|
31410
|
+
var SETTINGS_TRIGGER_ATTRIBUTE = "data-harnessmix-settings-trigger";
|
|
30762
31411
|
var SETTINGS_APPLICATION_HEADER_SELECTOR = 'header[data-pip-obstacle="app-shell-header"]';
|
|
30763
31412
|
var SETTINGS_HEADER_SLOT_SELECTOR = ':scope > [data-test-id="header-shell-slot"]';
|
|
30764
31413
|
function measuredBounds(element) {
|
|
@@ -31437,7 +32086,7 @@ ${pet_market_default}`;
|
|
|
31437
32086
|
return normalized;
|
|
31438
32087
|
}
|
|
31439
32088
|
function installRendererBindingProbe(options = {}) {
|
|
31440
|
-
const existing = window.
|
|
32089
|
+
const existing = window.__harnessmixRendererBindingProbeV1;
|
|
31441
32090
|
if (existing) return existing;
|
|
31442
32091
|
const enabledAgents = [...new Set(options.enabledAgents ?? DEFAULT_RENDERER_AGENTS)];
|
|
31443
32092
|
const enabledAgentSet = new Set(enabledAgents);
|
|
@@ -31511,6 +32160,25 @@ ${pet_market_default}`;
|
|
|
31511
32160
|
return client?.applyThreadWorkspace?.({ threadId, digest }) ?? { patch: "", digest: "" };
|
|
31512
32161
|
}
|
|
31513
32162
|
});
|
|
32163
|
+
const teamCards = installTeamCards({
|
|
32164
|
+
inspectTeam: async (threadId, teamId) => {
|
|
32165
|
+
const client = modelClientForHost("local");
|
|
32166
|
+
return client?.inspectThreadTeam?.({ threadId, ...teamId ? { teamId } : {} }) ?? null;
|
|
32167
|
+
},
|
|
32168
|
+
openThread: (threadId) => openRendererThread(hostThreadIdSchema.parse(threadId), { hostId: "local" }),
|
|
32169
|
+
activeThread: () => {
|
|
32170
|
+
const mounted = [...mountedByComposer.values()].find((candidate) => {
|
|
32171
|
+
if (!candidate.composer.isConnected || !candidate.control.root.isConnected) return false;
|
|
32172
|
+
if (!threadIdFromComposerModelTarget(candidate.modelTarget)) return false;
|
|
32173
|
+
const style = window.getComputedStyle(candidate.composer);
|
|
32174
|
+
return style.display !== "none" && style.visibility !== "hidden" && candidate.composer.getClientRects().length > 0;
|
|
32175
|
+
});
|
|
32176
|
+
const threadId = mounted ? threadIdFromComposerModelTarget(mounted.modelTarget) : null;
|
|
32177
|
+
const scroll = mounted?.composer.closest(".thread-scroll-container");
|
|
32178
|
+
const content = scroll?.parentElement?.parentElement;
|
|
32179
|
+
return mounted && threadId ? { threadId, anchor: content ?? mounted.composer } : null;
|
|
32180
|
+
}
|
|
32181
|
+
});
|
|
31514
32182
|
let connectionDiagnostics = null;
|
|
31515
32183
|
const settingsLifecycle = installRendererSettingsLifecycle(window, {
|
|
31516
32184
|
getUpdateClient: () => modelControl,
|
|
@@ -31636,7 +32304,7 @@ ${pet_market_default}`;
|
|
|
31636
32304
|
}
|
|
31637
32305
|
}
|
|
31638
32306
|
window.dispatchEvent(
|
|
31639
|
-
new CustomEvent("
|
|
32307
|
+
new CustomEvent("harnessmix:renderer-submission", {
|
|
31640
32308
|
detail: {
|
|
31641
32309
|
composerId: state.composerId,
|
|
31642
32310
|
agent: state.agent,
|
|
@@ -31702,7 +32370,7 @@ ${pet_market_default}`;
|
|
|
31702
32370
|
await modelControl.executeThreadCommand({ threadId, commandId: command.id });
|
|
31703
32371
|
} catch (error51) {
|
|
31704
32372
|
console.error(
|
|
31705
|
-
"
|
|
32373
|
+
"harnessmix Harness command failed",
|
|
31706
32374
|
error51 instanceof Error ? error51.message : String(error51)
|
|
31707
32375
|
);
|
|
31708
32376
|
} finally {
|
|
@@ -31719,7 +32387,7 @@ ${pet_market_default}`;
|
|
|
31719
32387
|
})) {
|
|
31720
32388
|
return;
|
|
31721
32389
|
}
|
|
31722
|
-
console.error("
|
|
32390
|
+
console.error("harnessmix Harness command could not claim the current Composer editor");
|
|
31723
32391
|
};
|
|
31724
32392
|
const applyThreadUsageUpdate = (update) => {
|
|
31725
32393
|
for (const mounted of mountedByComposer.values()) {
|
|
@@ -32631,12 +33299,7 @@ ${pet_market_default}`;
|
|
|
32631
33299
|
sidebarAgentIcons.refresh();
|
|
32632
33300
|
return switched;
|
|
32633
33301
|
} catch {
|
|
32634
|
-
|
|
32635
|
-
...adapterStatus,
|
|
32636
|
-
state: "unsupported",
|
|
32637
|
-
reason: "draft-prewarm-clear-failed",
|
|
32638
|
-
hook: null
|
|
32639
|
-
};
|
|
33302
|
+
renderMounted(mounted);
|
|
32640
33303
|
return false;
|
|
32641
33304
|
} finally {
|
|
32642
33305
|
for (const candidate of mountedByComposer.values()) {
|
|
@@ -32674,7 +33337,7 @@ ${pet_market_default}`;
|
|
|
32674
33337
|
const policy = await waitForRendererDraftPrewarmPolicy(window);
|
|
32675
33338
|
if (!isCurrent() || policy.hostId !== hostId) return;
|
|
32676
33339
|
await policy.clear();
|
|
32677
|
-
if (!isCurrent() || window.
|
|
33340
|
+
if (!isCurrent() || window.__harnessmixDraftPrewarmPolicyV1 !== policy) return;
|
|
32678
33341
|
if (!policy.selectAccount) throw new Error("Codex Account selection is unavailable");
|
|
32679
33342
|
policy.selectAccount(codexAccountRouteOverride(accounts.accounts, accountId));
|
|
32680
33343
|
accounts.overrideAccountId = accountId === accounts.selection.activeAccountId ? null : accountId;
|
|
@@ -33195,7 +33858,7 @@ ${pet_market_default}`;
|
|
|
33195
33858
|
composerCodexAccounts(composer)?.accounts ?? [],
|
|
33196
33859
|
accountId
|
|
33197
33860
|
);
|
|
33198
|
-
const policy = window.
|
|
33861
|
+
const policy = window.__harnessmixDraftPrewarmPolicyV1;
|
|
33199
33862
|
if (override !== null && (policy?.hostId !== mounted.hostId || !policy.selectAccount)) {
|
|
33200
33863
|
return false;
|
|
33201
33864
|
}
|
|
@@ -33234,6 +33897,7 @@ ${pet_market_default}`;
|
|
|
33234
33897
|
blockEvent(event);
|
|
33235
33898
|
return;
|
|
33236
33899
|
}
|
|
33900
|
+
harnessMentions.prepareSubmission(composer);
|
|
33237
33901
|
notifySubmission(composer, "submit");
|
|
33238
33902
|
};
|
|
33239
33903
|
const onKeyDown = (event) => {
|
|
@@ -33256,6 +33920,7 @@ ${pet_market_default}`;
|
|
|
33256
33920
|
blockEvent(event);
|
|
33257
33921
|
return;
|
|
33258
33922
|
}
|
|
33923
|
+
harnessMentions.prepareSubmission(composer);
|
|
33259
33924
|
notifySubmission(composer, "enter");
|
|
33260
33925
|
};
|
|
33261
33926
|
const onClick = (event) => {
|
|
@@ -33270,6 +33935,7 @@ ${pet_market_default}`;
|
|
|
33270
33935
|
blockEvent(event);
|
|
33271
33936
|
return;
|
|
33272
33937
|
}
|
|
33938
|
+
harnessMentions.prepareSubmission(composer);
|
|
33273
33939
|
notifySubmission(composer, "click");
|
|
33274
33940
|
};
|
|
33275
33941
|
const mutationObserver = new MutationObserver((mutations) => {
|
|
@@ -33332,8 +33998,8 @@ ${pet_market_default}`;
|
|
|
33332
33998
|
void refreshHarnessAvailability(true);
|
|
33333
33999
|
}
|
|
33334
34000
|
};
|
|
33335
|
-
window.addEventListener("
|
|
33336
|
-
window.addEventListener("
|
|
34001
|
+
window.addEventListener("harnessmix:draft-prewarm-policy-changed", onHostRouteChange);
|
|
34002
|
+
window.addEventListener("harnessmix:renderer-adapter-status", onAdapterStatus);
|
|
33337
34003
|
window.addEventListener("focus", onWindowFocus);
|
|
33338
34004
|
const connectedComposers = () => [...mountedByComposer.values()].filter(
|
|
33339
34005
|
(mounted) => mounted.composer.isConnected && mounted.control.root.isConnected
|
|
@@ -33439,13 +34105,14 @@ ${pet_market_default}`;
|
|
|
33439
34105
|
sidebarAgentIcons.dispose();
|
|
33440
34106
|
harnessMentions.dispose();
|
|
33441
34107
|
collabCards.dispose();
|
|
34108
|
+
teamCards.dispose();
|
|
33442
34109
|
settingsLifecycle.dispose();
|
|
33443
34110
|
document.removeEventListener("beforeinput", onBeforeInput, true);
|
|
33444
34111
|
document.removeEventListener("submit", onSubmit, true);
|
|
33445
34112
|
document.removeEventListener("keydown", onKeyDown, true);
|
|
33446
34113
|
document.removeEventListener("click", onClick, true);
|
|
33447
|
-
window.removeEventListener("
|
|
33448
|
-
window.removeEventListener("
|
|
34114
|
+
window.removeEventListener("harnessmix:draft-prewarm-policy-changed", onHostRouteChange);
|
|
34115
|
+
window.removeEventListener("harnessmix:renderer-adapter-status", onAdapterStatus);
|
|
33449
34116
|
window.removeEventListener("focus", onWindowFocus);
|
|
33450
34117
|
for (const state of harnessAvailabilityByHost.values()) {
|
|
33451
34118
|
state.requestGeneration += 1;
|
|
@@ -33463,24 +34130,24 @@ ${pet_market_default}`;
|
|
|
33463
34130
|
pendingReplacements.clear();
|
|
33464
34131
|
connectionListeners.clear();
|
|
33465
34132
|
connectionDiagnostics = null;
|
|
33466
|
-
delete window.
|
|
34133
|
+
delete window.__harnessmixRendererBindingProbeV1;
|
|
33467
34134
|
}
|
|
33468
34135
|
};
|
|
33469
|
-
window.
|
|
34136
|
+
window.__harnessmixRendererBindingProbeV1 = api;
|
|
33470
34137
|
scan();
|
|
33471
34138
|
return api;
|
|
33472
34139
|
}
|
|
33473
34140
|
|
|
33474
34141
|
// src/native-ui/renderer-extension/src/install-renderer-binding.ts
|
|
33475
34142
|
function installRendererBinding(enabledAgents = DEFAULT_RENDERER_AGENTS, defaultAgent = "codex") {
|
|
33476
|
-
window.
|
|
34143
|
+
window.__harnessmixRendererBindingProbeV1?.dispose();
|
|
33477
34144
|
const binding = installRendererBindingProbe({ enabledAgents, defaultAgent });
|
|
33478
34145
|
try {
|
|
33479
34146
|
const adapter = installCurrentRendererAdapter();
|
|
33480
34147
|
binding.setAdapter(adapter.status, adapter.dispose, adapter.applyAgent, adapter.modelControl);
|
|
33481
34148
|
} catch (error51) {
|
|
33482
34149
|
console.error(
|
|
33483
|
-
"
|
|
34150
|
+
"harnessmix Renderer Adapter installation failed",
|
|
33484
34151
|
error51 instanceof Error ? error51.name : "UnknownError"
|
|
33485
34152
|
);
|
|
33486
34153
|
binding.setAdapter({
|
|
@@ -33494,8 +34161,8 @@ ${pet_market_default}`;
|
|
|
33494
34161
|
}
|
|
33495
34162
|
|
|
33496
34163
|
// src/native-ui/renderer-extension/src/production-entry.ts
|
|
33497
|
-
var configuration = window.
|
|
33498
|
-
delete window.
|
|
34164
|
+
var configuration = window.__harnessmixProductionConfigV1;
|
|
34165
|
+
delete window.__harnessmixProductionConfigV1;
|
|
33499
34166
|
var install = () => {
|
|
33500
34167
|
installRendererBinding(DEFAULT_RENDERER_AGENTS, configuration?.defaultAgent ?? "codex");
|
|
33501
34168
|
};
|