@harness-mix/cli 0.1.11 → 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 +16 -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 +2 -2
- 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
|
@@ -24,6 +24,9 @@ const COPY = {
|
|
|
24
24
|
installedBadge: "Installed",
|
|
25
25
|
uninstall: "Uninstall",
|
|
26
26
|
uninstalling: "Removing...",
|
|
27
|
+
retry: "Retry",
|
|
28
|
+
installFailed: "Install failed",
|
|
29
|
+
uninstallFailed: "Uninstall failed",
|
|
27
30
|
tip: "Select in Appearance > Pets or type /pet to wake",
|
|
28
31
|
empty: "No pets match the current filter.",
|
|
29
32
|
officialBadge: "Official",
|
|
@@ -46,6 +49,9 @@ const COPY = {
|
|
|
46
49
|
installedBadge: "已安装",
|
|
47
50
|
uninstall: "卸载",
|
|
48
51
|
uninstalling: "卸载中...",
|
|
52
|
+
retry: "重试",
|
|
53
|
+
installFailed: "安装失败",
|
|
54
|
+
uninstallFailed: "卸载失败",
|
|
49
55
|
tip: "安装后在官方设置「外观 > 桌宠」或输入 /pet 指令唤醒伴侣",
|
|
50
56
|
empty: "没有找到符合条件的桌宠。",
|
|
51
57
|
officialBadge: "官方预载",
|
|
@@ -54,6 +60,10 @@ const COPY = {
|
|
|
54
60
|
} as const;
|
|
55
61
|
|
|
56
62
|
type PetTab = "all" | "official" | "community" | "installed";
|
|
63
|
+
type PetOperation = "install" | "uninstall";
|
|
64
|
+
type PetOperationState =
|
|
65
|
+
| { readonly status: "installing" | "uninstalling" }
|
|
66
|
+
| { readonly status: "failed"; readonly op: PetOperation; readonly error: string };
|
|
57
67
|
|
|
58
68
|
const SPRITE_COLUMNS = 8;
|
|
59
69
|
const SPRITE_FRAMES = 6;
|
|
@@ -71,6 +81,7 @@ function setupSpriteAnimation(
|
|
|
71
81
|
|
|
72
82
|
let currentFrame = 0;
|
|
73
83
|
let timer: number | null = null;
|
|
84
|
+
let idleTimeout: number | null = null;
|
|
74
85
|
let isHovered = false;
|
|
75
86
|
|
|
76
87
|
const tick = () => {
|
|
@@ -115,13 +126,21 @@ function setupSpriteAnimation(
|
|
|
115
126
|
const idleInterval = window.setInterval(() => {
|
|
116
127
|
if (!isHovered && timer === null) {
|
|
117
128
|
startLoop();
|
|
118
|
-
|
|
129
|
+
if (idleTimeout !== null) window.clearTimeout(idleTimeout);
|
|
130
|
+
idleTimeout = window.setTimeout(() => {
|
|
131
|
+
idleTimeout = null;
|
|
132
|
+
stopLoop();
|
|
133
|
+
}, FRAME_DURATION_MS * SPRITE_FRAMES);
|
|
119
134
|
}
|
|
120
135
|
}, 4000 + Math.random() * 3000);
|
|
121
136
|
|
|
122
137
|
return () => {
|
|
123
138
|
stopLoop();
|
|
124
139
|
clearInterval(idleInterval);
|
|
140
|
+
if (idleTimeout !== null) {
|
|
141
|
+
window.clearTimeout(idleTimeout);
|
|
142
|
+
idleTimeout = null;
|
|
143
|
+
}
|
|
125
144
|
if (parentCard) {
|
|
126
145
|
parentCard.removeEventListener("mouseenter", onMouseEnter);
|
|
127
146
|
parentCard.removeEventListener("mouseleave", onMouseLeave);
|
|
@@ -199,8 +218,52 @@ export function createPetSettingsPage(
|
|
|
199
218
|
|
|
200
219
|
let allPets: RendererPetItem[] = [];
|
|
201
220
|
const imageCache = new Map<string, string>(); // id -> dataUrl / url
|
|
221
|
+
// 每个 pet 的操作状态机:installing / uninstalling / failed(含错误与失败操作类型)
|
|
222
|
+
const petStates = new Map<string, PetOperationState>();
|
|
223
|
+
// 渲染世代:重渲染后让在途的 preview 回调失效,避免给已分离的 DOM 节点挂动画
|
|
224
|
+
let renderEpoch = 0;
|
|
225
|
+
|
|
226
|
+
const runPetOperation = (pet: RendererPetItem, op: PetOperation) => {
|
|
227
|
+
const client = getClient();
|
|
228
|
+
const current = petStates.get(pet.id);
|
|
229
|
+
// 操作进行中禁止重复触发;failed 状态允许重试
|
|
230
|
+
if (!client || (current && current.status !== "failed")) return;
|
|
231
|
+
petStates.set(pet.id, {
|
|
232
|
+
status: op === "install" ? "installing" : "uninstalling",
|
|
233
|
+
});
|
|
234
|
+
renderGrid();
|
|
235
|
+
const settle = (installed: boolean, failure: string | null) => {
|
|
236
|
+
if (failure === null) {
|
|
237
|
+
petStates.delete(pet.id);
|
|
238
|
+
} else {
|
|
239
|
+
petStates.set(pet.id, { status: "failed", op, error: failure });
|
|
240
|
+
}
|
|
241
|
+
allPets = allPets.map((p) =>
|
|
242
|
+
p.id === pet.id ? { ...p, installed } : p,
|
|
243
|
+
);
|
|
244
|
+
renderGrid();
|
|
245
|
+
};
|
|
246
|
+
const onSuccess = () => settle(op === "install", null);
|
|
247
|
+
const onFailure = (err: unknown) =>
|
|
248
|
+
settle(pet.installed, err instanceof Error ? err.message : String(err));
|
|
249
|
+
if (op === "install") {
|
|
250
|
+
void client
|
|
251
|
+
.install({
|
|
252
|
+
id: pet.id,
|
|
253
|
+
displayName: pet.displayName,
|
|
254
|
+
description: pet.description,
|
|
255
|
+
spritesheetUrl: pet.spritesheetUrl,
|
|
256
|
+
spriteVersionNumber: pet.spriteVersionNumber,
|
|
257
|
+
})
|
|
258
|
+
.then(onSuccess, onFailure);
|
|
259
|
+
} else {
|
|
260
|
+
void client.uninstall(pet.id).then(onSuccess, onFailure);
|
|
261
|
+
}
|
|
262
|
+
};
|
|
202
263
|
|
|
203
264
|
const renderGrid = () => {
|
|
265
|
+
renderEpoch += 1;
|
|
266
|
+
const epoch = renderEpoch;
|
|
204
267
|
// Clear previous animations
|
|
205
268
|
for (const d of disposers) d();
|
|
206
269
|
disposers.length = 0;
|
|
@@ -229,10 +292,12 @@ export function createPetSettingsPage(
|
|
|
229
292
|
}
|
|
230
293
|
|
|
231
294
|
for (const pet of filtered) {
|
|
295
|
+
const opState = petStates.get(pet.id);
|
|
232
296
|
const card = document.createElement("article");
|
|
233
297
|
card.className = "pet-card";
|
|
234
298
|
card.dataset.petId = pet.id;
|
|
235
299
|
card.dataset.installed = String(pet.installed);
|
|
300
|
+
if (opState) card.dataset.state = opState.status;
|
|
236
301
|
|
|
237
302
|
// Stage
|
|
238
303
|
const stage = document.createElement("div");
|
|
@@ -242,49 +307,6 @@ export function createPetSettingsPage(
|
|
|
242
307
|
sprite.className = "pet-card__sprite";
|
|
243
308
|
stage.append(sprite);
|
|
244
309
|
|
|
245
|
-
// Load visual asset
|
|
246
|
-
const client = getClient();
|
|
247
|
-
const cachedImg = imageCache.get(pet.id);
|
|
248
|
-
if (cachedImg) {
|
|
249
|
-
const disposeAnim = setupSpriteAnimation(sprite, cachedImg, pet.spriteVersionNumber);
|
|
250
|
-
disposers.push(disposeAnim);
|
|
251
|
-
} else if (pet.spritesheetUrl) {
|
|
252
|
-
imageCache.set(pet.id, pet.spritesheetUrl);
|
|
253
|
-
const disposeAnim = setupSpriteAnimation(
|
|
254
|
-
sprite,
|
|
255
|
-
pet.spritesheetUrl,
|
|
256
|
-
pet.spriteVersionNumber,
|
|
257
|
-
);
|
|
258
|
-
disposers.push(disposeAnim);
|
|
259
|
-
} else if (client) {
|
|
260
|
-
// Load base64 preview on demand
|
|
261
|
-
void client.preview(pet.id).then(
|
|
262
|
-
(res) => {
|
|
263
|
-
if (res && res.dataBase64) {
|
|
264
|
-
const dataUrl = `data:${res.mime};base64,${res.dataBase64}`;
|
|
265
|
-
imageCache.set(pet.id, dataUrl);
|
|
266
|
-
const disposeAnim = setupSpriteAnimation(
|
|
267
|
-
sprite,
|
|
268
|
-
dataUrl,
|
|
269
|
-
pet.spriteVersionNumber,
|
|
270
|
-
);
|
|
271
|
-
disposers.push(disposeAnim);
|
|
272
|
-
}
|
|
273
|
-
},
|
|
274
|
-
() => {
|
|
275
|
-
if (pet.previewUrl) {
|
|
276
|
-
sprite.style.backgroundImage = `url("${pet.previewUrl}")`;
|
|
277
|
-
sprite.style.backgroundSize = "contain";
|
|
278
|
-
sprite.style.backgroundPosition = "center";
|
|
279
|
-
}
|
|
280
|
-
},
|
|
281
|
-
);
|
|
282
|
-
} else if (pet.previewUrl) {
|
|
283
|
-
sprite.style.backgroundImage = `url("${pet.previewUrl}")`;
|
|
284
|
-
sprite.style.backgroundSize = "contain";
|
|
285
|
-
sprite.style.backgroundPosition = "center";
|
|
286
|
-
}
|
|
287
|
-
|
|
288
310
|
// Body
|
|
289
311
|
const body = document.createElement("div");
|
|
290
312
|
body.className = "pet-card__body";
|
|
@@ -299,7 +321,13 @@ export function createPetSettingsPage(
|
|
|
299
321
|
const badges = document.createElement("div");
|
|
300
322
|
badges.className = "pet-card__badges";
|
|
301
323
|
|
|
302
|
-
if (
|
|
324
|
+
if (opState?.status === "failed") {
|
|
325
|
+
const b = document.createElement("span");
|
|
326
|
+
b.className = "pet-card__badge pet-card__badge--failed";
|
|
327
|
+
b.textContent =
|
|
328
|
+
opState.op === "install" ? copy.installFailed : copy.uninstallFailed;
|
|
329
|
+
badges.append(b);
|
|
330
|
+
} else if (pet.installed) {
|
|
303
331
|
const b = document.createElement("span");
|
|
304
332
|
b.className = "pet-card__badge pet-card__badge--installed";
|
|
305
333
|
b.append(createRendererSettingsIcon("check", 12), copy.installedBadge);
|
|
@@ -333,68 +361,110 @@ export function createPetSettingsPage(
|
|
|
333
361
|
const actions = document.createElement("div");
|
|
334
362
|
actions.className = "pet-card__actions";
|
|
335
363
|
|
|
336
|
-
if (
|
|
364
|
+
if (opState?.status === "installing" || opState?.status === "uninstalling") {
|
|
365
|
+
// 操作进行中:按钮禁用,防止重复点击(runPetOperation 内还有 petStates 防重入)
|
|
366
|
+
const busyBtn = document.createElement("button");
|
|
367
|
+
busyBtn.type = "button";
|
|
368
|
+
busyBtn.className =
|
|
369
|
+
opState.status === "installing"
|
|
370
|
+
? "pet-btn pet-btn--primary"
|
|
371
|
+
: "pet-btn pet-btn--danger";
|
|
372
|
+
busyBtn.disabled = true;
|
|
373
|
+
busyBtn.textContent =
|
|
374
|
+
opState.status === "installing" ? copy.installing : copy.uninstalling;
|
|
375
|
+
actions.append(busyBtn);
|
|
376
|
+
} else if (opState?.status === "failed") {
|
|
377
|
+
// 失败后错误显示在卡片内,重试按钮恢复对应操作
|
|
378
|
+
const retryBtn = document.createElement("button");
|
|
379
|
+
retryBtn.type = "button";
|
|
380
|
+
retryBtn.className =
|
|
381
|
+
opState.op === "install"
|
|
382
|
+
? "pet-btn pet-btn--primary"
|
|
383
|
+
: "pet-btn pet-btn--danger";
|
|
384
|
+
retryBtn.textContent = copy.retry;
|
|
385
|
+
retryBtn.addEventListener("click", () => runPetOperation(pet, opState.op));
|
|
386
|
+
actions.append(retryBtn);
|
|
387
|
+
} else if (pet.installed) {
|
|
337
388
|
const uninstallBtn = document.createElement("button");
|
|
338
389
|
uninstallBtn.type = "button";
|
|
339
390
|
uninstallBtn.className = "pet-btn pet-btn--danger";
|
|
340
391
|
uninstallBtn.textContent = copy.uninstall;
|
|
341
|
-
uninstallBtn.addEventListener("click", () =>
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
uninstallBtn.textContent = copy.uninstalling;
|
|
345
|
-
void client.uninstall(pet.id).then(
|
|
346
|
-
() => {
|
|
347
|
-
allPets = allPets.map((p) =>
|
|
348
|
-
p.id === pet.id ? { ...p, installed: false } : p,
|
|
349
|
-
);
|
|
350
|
-
renderGrid();
|
|
351
|
-
},
|
|
352
|
-
(err) => {
|
|
353
|
-
uninstallBtn.disabled = false;
|
|
354
|
-
uninstallBtn.textContent = copy.uninstall;
|
|
355
|
-
alert(err instanceof Error ? err.message : String(err));
|
|
356
|
-
},
|
|
357
|
-
);
|
|
358
|
-
});
|
|
392
|
+
uninstallBtn.addEventListener("click", () =>
|
|
393
|
+
runPetOperation(pet, "uninstall"),
|
|
394
|
+
);
|
|
359
395
|
actions.append(uninstallBtn);
|
|
360
396
|
} else {
|
|
361
397
|
const installBtn = document.createElement("button");
|
|
362
398
|
installBtn.type = "button";
|
|
363
399
|
installBtn.className = "pet-btn pet-btn--primary";
|
|
364
400
|
installBtn.textContent = copy.install;
|
|
365
|
-
installBtn.addEventListener("click", () =>
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
installBtn.textContent = copy.installing;
|
|
369
|
-
void client
|
|
370
|
-
.install({
|
|
371
|
-
id: pet.id,
|
|
372
|
-
displayName: pet.displayName,
|
|
373
|
-
description: pet.description,
|
|
374
|
-
spritesheetUrl: pet.spritesheetUrl,
|
|
375
|
-
spriteVersionNumber: pet.spriteVersionNumber,
|
|
376
|
-
})
|
|
377
|
-
.then(
|
|
378
|
-
() => {
|
|
379
|
-
allPets = allPets.map((p) =>
|
|
380
|
-
p.id === pet.id ? { ...p, installed: true } : p,
|
|
381
|
-
);
|
|
382
|
-
renderGrid();
|
|
383
|
-
},
|
|
384
|
-
(err) => {
|
|
385
|
-
installBtn.disabled = false;
|
|
386
|
-
installBtn.textContent = copy.install;
|
|
387
|
-
alert(err instanceof Error ? err.message : String(err));
|
|
388
|
-
},
|
|
389
|
-
);
|
|
390
|
-
});
|
|
401
|
+
installBtn.addEventListener("click", () =>
|
|
402
|
+
runPetOperation(pet, "install"),
|
|
403
|
+
);
|
|
391
404
|
actions.append(installBtn);
|
|
392
405
|
}
|
|
393
406
|
|
|
394
407
|
footer.append(hint, actions);
|
|
395
|
-
|
|
408
|
+
|
|
409
|
+
// 操作状态/错误显示在卡片内(而非全局弹窗)
|
|
410
|
+
if (opState?.status === "failed") {
|
|
411
|
+
const errorBox = document.createElement("div");
|
|
412
|
+
errorBox.className = "pet-card__error";
|
|
413
|
+
errorBox.textContent = opState.error;
|
|
414
|
+
body.append(cardHeader, desc, errorBox, footer);
|
|
415
|
+
} else if (opState) {
|
|
416
|
+
const statusLine = document.createElement("div");
|
|
417
|
+
statusLine.className = "pet-card__status";
|
|
418
|
+
statusLine.textContent =
|
|
419
|
+
opState.status === "installing" ? copy.installing : copy.uninstalling;
|
|
420
|
+
body.append(cardHeader, desc, statusLine, footer);
|
|
421
|
+
} else {
|
|
422
|
+
body.append(cardHeader, desc, footer);
|
|
423
|
+
}
|
|
396
424
|
card.append(stage, body);
|
|
397
425
|
grid.append(card);
|
|
426
|
+
|
|
427
|
+
// Load visual asset(必须在 card 挂载后进行,setupSpriteAnimation 依赖 closest('.pet-card'))
|
|
428
|
+
const cachedImg = imageCache.get(pet.id);
|
|
429
|
+
if (cachedImg) {
|
|
430
|
+
disposers.push(
|
|
431
|
+
setupSpriteAnimation(sprite, cachedImg, pet.spriteVersionNumber),
|
|
432
|
+
);
|
|
433
|
+
} else if (pet.spritesheetUrl) {
|
|
434
|
+
imageCache.set(pet.id, pet.spritesheetUrl);
|
|
435
|
+
disposers.push(
|
|
436
|
+
setupSpriteAnimation(sprite, pet.spritesheetUrl, pet.spriteVersionNumber),
|
|
437
|
+
);
|
|
438
|
+
} else {
|
|
439
|
+
const showStaticPreview = () => {
|
|
440
|
+
if (!pet.previewUrl) return;
|
|
441
|
+
sprite.style.backgroundImage = `url("${pet.previewUrl}")`;
|
|
442
|
+
sprite.style.backgroundSize = "contain";
|
|
443
|
+
sprite.style.backgroundPosition = "center";
|
|
444
|
+
};
|
|
445
|
+
const client = getClient();
|
|
446
|
+
if (client) {
|
|
447
|
+
// Load base64 preview on demand;重渲染/卸载后丢弃过期回调,避免泄漏动画定时器
|
|
448
|
+
void client.preview(pet.id).then(
|
|
449
|
+
(res) => {
|
|
450
|
+
if (epoch !== renderEpoch || !sprite.isConnected) return;
|
|
451
|
+
if (res && res.dataBase64) {
|
|
452
|
+
const dataUrl = `data:${res.mime};base64,${res.dataBase64}`;
|
|
453
|
+
imageCache.set(pet.id, dataUrl);
|
|
454
|
+
disposers.push(
|
|
455
|
+
setupSpriteAnimation(sprite, dataUrl, pet.spriteVersionNumber),
|
|
456
|
+
);
|
|
457
|
+
}
|
|
458
|
+
},
|
|
459
|
+
() => {
|
|
460
|
+
if (epoch !== renderEpoch || !sprite.isConnected) return;
|
|
461
|
+
showStaticPreview();
|
|
462
|
+
},
|
|
463
|
+
);
|
|
464
|
+
} else {
|
|
465
|
+
showStaticPreview();
|
|
466
|
+
}
|
|
467
|
+
}
|
|
398
468
|
}
|
|
399
469
|
};
|
|
400
470
|
|
|
@@ -439,8 +509,20 @@ export function createPetSettingsPage(
|
|
|
439
509
|
}
|
|
440
510
|
|
|
441
511
|
return () => {
|
|
512
|
+
renderEpoch += 1; // 使在途 preview 回调失效
|
|
442
513
|
for (const d of disposers) d();
|
|
443
514
|
disposers.length = 0;
|
|
515
|
+
// 释放图片缓存(blob: URL 需要显式 revoke;data: URL 仅释放引用)
|
|
516
|
+
for (const url of imageCache.values()) {
|
|
517
|
+
if (url.startsWith("blob:")) {
|
|
518
|
+
try {
|
|
519
|
+
URL.revokeObjectURL(url);
|
|
520
|
+
} catch {
|
|
521
|
+
/* 忽略撤销失败 */
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
imageCache.clear();
|
|
444
526
|
};
|
|
445
527
|
},
|
|
446
528
|
});
|
|
@@ -61,14 +61,14 @@ export function createRendererPetsClient(
|
|
|
61
61
|
send: (method: string, params: unknown) => Promise<unknown>,
|
|
62
62
|
): RendererPetsClient {
|
|
63
63
|
return {
|
|
64
|
-
catalog: async () => (await send("
|
|
64
|
+
catalog: async () => (await send("harnessmix/pets/catalog", {})) as RendererPetCatalogResult,
|
|
65
65
|
community: async (query = {}) =>
|
|
66
|
-
(await send("
|
|
66
|
+
(await send("harnessmix/pets/community", query)) as RendererPetCommunityResult,
|
|
67
67
|
preview: async (id: string) =>
|
|
68
|
-
(await send("
|
|
68
|
+
(await send("harnessmix/pets/preview", { id })) as RendererPetPreviewResult,
|
|
69
69
|
install: async (params: RendererPetInstallParams) =>
|
|
70
|
-
(await send("
|
|
70
|
+
(await send("harnessmix/pets/install", params)) as RendererPetInstallResult,
|
|
71
71
|
uninstall: async (id: string) =>
|
|
72
|
-
(await send("
|
|
72
|
+
(await send("harnessmix/pets/uninstall", { id })) as { id: string; removed: boolean },
|
|
73
73
|
};
|
|
74
74
|
}
|
|
@@ -214,7 +214,7 @@ function appendInline(document: ReleaseNotesDocument, parent: HTMLElement, text:
|
|
|
214
214
|
|
|
215
215
|
function isSafeLink(href: string): boolean {
|
|
216
216
|
try {
|
|
217
|
-
const url = new URL(href, "https://
|
|
217
|
+
const url = new URL(href, "https://harnessmix.invalid");
|
|
218
218
|
return url.protocol === "http:" || url.protocol === "https:";
|
|
219
219
|
} catch {
|
|
220
220
|
return false;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
HARNESS_SESSION_IMPORT_DEFAULT_PAGE_SIZE,
|
|
3
3
|
type HarnessSessionListParams,
|
|
4
|
-
} from "@
|
|
4
|
+
} from "@harnessmix/shared-contracts";
|
|
5
5
|
import type { RendererSettingsMessages } from "./localization.js";
|
|
6
6
|
|
|
7
7
|
/** Search submission and pagination state; native discovery and import are owned elsewhere. */
|
|
@@ -67,7 +67,7 @@ button {
|
|
|
67
67
|
border: 0;
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
-
.
|
|
70
|
+
.harnessmix-settings-dialog {
|
|
71
71
|
width: min(1120px, calc(100vw - 48px));
|
|
72
72
|
height: min(780px, calc(100vh - 88px));
|
|
73
73
|
max-width: none;
|
|
@@ -84,7 +84,7 @@ button {
|
|
|
84
84
|
box-shadow: light-dark(0 16px 42px rgb(0 0 0 / 16%), 0 20px 54px rgb(0 0 0 / 42%));
|
|
85
85
|
}
|
|
86
86
|
|
|
87
|
-
.
|
|
87
|
+
.harnessmix-settings-dialog::backdrop {
|
|
88
88
|
background: light-dark(rgb(0 0 0 / 24%), rgb(0 0 0 / 56%));
|
|
89
89
|
backdrop-filter: blur(1px);
|
|
90
90
|
}
|
|
@@ -155,7 +155,7 @@ button {
|
|
|
155
155
|
color: var(--settings-text);
|
|
156
156
|
}
|
|
157
157
|
|
|
158
|
-
.settings-brand__mark .
|
|
158
|
+
.settings-brand__mark .harnessmix-settings-icon {
|
|
159
159
|
width: 24px;
|
|
160
160
|
height: 24px;
|
|
161
161
|
object-fit: contain;
|
|
@@ -231,7 +231,7 @@ button {
|
|
|
231
231
|
cursor: pointer;
|
|
232
232
|
}
|
|
233
233
|
|
|
234
|
-
.settings-nav-button .
|
|
234
|
+
.settings-nav-button .harnessmix-settings-icon {
|
|
235
235
|
width: 16px;
|
|
236
236
|
height: 16px;
|
|
237
237
|
opacity: 0.9;
|
|
@@ -260,7 +260,7 @@ button {
|
|
|
260
260
|
text-decoration: none;
|
|
261
261
|
}
|
|
262
262
|
|
|
263
|
-
.settings-nav-star-link .
|
|
263
|
+
.settings-nav-star-link .harnessmix-settings-icon {
|
|
264
264
|
color: var(--settings-warning);
|
|
265
265
|
}
|
|
266
266
|
|
|
@@ -1546,23 +1546,23 @@ button {
|
|
|
1546
1546
|
gap: 8px;
|
|
1547
1547
|
}
|
|
1548
1548
|
|
|
1549
|
-
.settings-update-panel__head .
|
|
1549
|
+
.settings-update-panel__head .harnessmix-settings-icon {
|
|
1550
1550
|
color: var(--settings-muted);
|
|
1551
1551
|
}
|
|
1552
1552
|
|
|
1553
|
-
.settings-update-panel[data-update-state="available"] .
|
|
1554
|
-
.settings-update-panel[data-update-state="downloading"] .
|
|
1555
|
-
.settings-update-panel[data-update-state="installing"] .
|
|
1556
|
-
.settings-update-panel[data-update-state="restarting"] .
|
|
1553
|
+
.settings-update-panel[data-update-state="available"] .harnessmix-settings-icon,
|
|
1554
|
+
.settings-update-panel[data-update-state="downloading"] .harnessmix-settings-icon,
|
|
1555
|
+
.settings-update-panel[data-update-state="installing"] .harnessmix-settings-icon,
|
|
1556
|
+
.settings-update-panel[data-update-state="restarting"] .harnessmix-settings-icon {
|
|
1557
1557
|
color: var(--settings-focus);
|
|
1558
1558
|
}
|
|
1559
1559
|
|
|
1560
|
-
.settings-update-panel[data-update-state="current"] .
|
|
1560
|
+
.settings-update-panel[data-update-state="current"] .harnessmix-settings-icon {
|
|
1561
1561
|
color: var(--settings-success);
|
|
1562
1562
|
}
|
|
1563
1563
|
|
|
1564
|
-
.settings-update-panel[data-update-state="failed"] .
|
|
1565
|
-
.settings-update-panel[data-update-state="error"] .
|
|
1564
|
+
.settings-update-panel[data-update-state="failed"] .harnessmix-settings-icon,
|
|
1565
|
+
.settings-update-panel[data-update-state="error"] .harnessmix-settings-icon {
|
|
1566
1566
|
color: var(--settings-danger);
|
|
1567
1567
|
}
|
|
1568
1568
|
|
|
@@ -1914,14 +1914,14 @@ button {
|
|
|
1914
1914
|
outline-offset: 2px;
|
|
1915
1915
|
}
|
|
1916
1916
|
|
|
1917
|
-
.
|
|
1917
|
+
.harnessmix-settings-icon {
|
|
1918
1918
|
display: block;
|
|
1919
1919
|
flex: none;
|
|
1920
1920
|
stroke: currentColor;
|
|
1921
1921
|
}
|
|
1922
1922
|
|
|
1923
1923
|
@media (max-width: 720px) {
|
|
1924
|
-
.
|
|
1924
|
+
.harnessmix-settings-dialog {
|
|
1925
1925
|
width: calc(100vw - 16px);
|
|
1926
1926
|
height: calc(100vh - 16px);
|
|
1927
1927
|
border-radius: 10px;
|
|
@@ -14,9 +14,9 @@ import {
|
|
|
14
14
|
DEFAULT_RENDERER_SETTINGS_MESSAGES,
|
|
15
15
|
type RendererSettingsMessages,
|
|
16
16
|
} from "./localization.js";
|
|
17
|
-
import {
|
|
17
|
+
import { HARNESSMIX_GITHUB_REPOSITORY_URL, createDefaultRendererSettingsRegistry } from "./pages.js";
|
|
18
18
|
|
|
19
|
-
export const SETTINGS_SHELL_ATTRIBUTE = "data-
|
|
19
|
+
export const SETTINGS_SHELL_ATTRIBUTE = "data-harnessmix-settings-shell";
|
|
20
20
|
export const RENDERER_SETTINGS_COLOR_SCHEME = "inherit";
|
|
21
21
|
|
|
22
22
|
export interface RendererSettingsShell {
|
|
@@ -33,7 +33,7 @@ export interface RendererSettingsShell {
|
|
|
33
33
|
|
|
34
34
|
declare global {
|
|
35
35
|
interface Window {
|
|
36
|
-
|
|
36
|
+
__harnessmixSettingsShellV1?: RendererSettingsShell;
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
39
|
|
|
@@ -61,7 +61,7 @@ export function mountRendererSettingsShell(
|
|
|
61
61
|
const resolvedRegistry = registry ?? createDefaultRendererSettingsRegistry(messages);
|
|
62
62
|
if (!ownerDocument.body) throw new Error("Renderer document body is unavailable");
|
|
63
63
|
if (ownerDocument.querySelector(`[${SETTINGS_SHELL_ATTRIBUTE}]`)) {
|
|
64
|
-
throw new Error("A
|
|
64
|
+
throw new Error("A harnessmix settings shell is already mounted");
|
|
65
65
|
}
|
|
66
66
|
|
|
67
67
|
const root = ownerDocument.createElement("div");
|
|
@@ -73,7 +73,7 @@ export function mountRendererSettingsShell(
|
|
|
73
73
|
style.textContent = `${settingsCss}\n${accountsCss}\n${skinMarketCss}\n${petMarketCss}`;
|
|
74
74
|
|
|
75
75
|
const dialog = ownerDocument.createElement("dialog");
|
|
76
|
-
dialog.className = "
|
|
76
|
+
dialog.className = "harnessmix-settings-dialog";
|
|
77
77
|
const frame = ownerDocument.createElement("div");
|
|
78
78
|
frame.className = "settings-frame";
|
|
79
79
|
|
|
@@ -91,7 +91,7 @@ export function mountRendererSettingsShell(
|
|
|
91
91
|
brandName.textContent = "Harness Mix";
|
|
92
92
|
const brandTitle = ownerDocument.createElement("span");
|
|
93
93
|
brandTitle.className = "settings-brand__title";
|
|
94
|
-
brandTitle.id = "
|
|
94
|
+
brandTitle.id = "harnessmix-settings-dialog-title";
|
|
95
95
|
brandTitle.textContent = messages.title;
|
|
96
96
|
brandCopy.append(brandName, brandTitle);
|
|
97
97
|
brand.append(brandMark, brandCopy);
|
|
@@ -205,7 +205,7 @@ export function mountRendererSettingsShell(
|
|
|
205
205
|
}
|
|
206
206
|
const starLink = ownerDocument.createElement("a");
|
|
207
207
|
starLink.className = "settings-nav-button settings-nav-star-link";
|
|
208
|
-
starLink.href =
|
|
208
|
+
starLink.href = HARNESSMIX_GITHUB_REPOSITORY_URL;
|
|
209
209
|
starLink.target = "_blank";
|
|
210
210
|
starLink.rel = "noopener noreferrer";
|
|
211
211
|
starLink.setAttribute("aria-label", messages.starOnGitHub);
|
|
@@ -314,17 +314,17 @@ export function installRendererSettingsShell(
|
|
|
314
314
|
: createDefaultRendererSettingsRegistry(messages);
|
|
315
315
|
const ownerWindow = ownerDocument.defaultView ?? (typeof window !== "undefined" ? window : undefined);
|
|
316
316
|
if (ownerWindow) {
|
|
317
|
-
ownerWindow.
|
|
317
|
+
ownerWindow.__harnessmixSettingsShellV1?.dispose();
|
|
318
318
|
}
|
|
319
319
|
const shell = mountRendererSettingsShell(registry, ownerDocument, messages);
|
|
320
320
|
if (ownerWindow) {
|
|
321
|
-
ownerWindow.
|
|
321
|
+
ownerWindow.__harnessmixSettingsShellV1 = shell;
|
|
322
322
|
}
|
|
323
323
|
const dispose = shell.dispose.bind(shell);
|
|
324
324
|
shell.dispose = () => {
|
|
325
325
|
dispose();
|
|
326
|
-
if (ownerWindow && ownerWindow.
|
|
327
|
-
delete ownerWindow.
|
|
326
|
+
if (ownerWindow && ownerWindow.__harnessmixSettingsShellV1 === shell) {
|
|
327
|
+
delete ownerWindow.__harnessmixSettingsShellV1;
|
|
328
328
|
}
|
|
329
329
|
};
|
|
330
330
|
return shell;
|
|
@@ -469,12 +469,12 @@ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-page-header] > [da
|
|
|
469
469
|
font-size: inherit !important;
|
|
470
470
|
font-weight: inherit !important;
|
|
471
471
|
}
|
|
472
|
-
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] header button:not([data-
|
|
473
|
-
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-pip-obstacle="app-shell-header"] button:not([data-
|
|
474
|
-
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-obstacle] button:not([data-
|
|
475
|
-
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-testid="app-shell-header-context-menu-surface"] button:not([data-
|
|
476
|
-
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-toolbar] button:not([data-
|
|
477
|
-
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] header [role="button"]:not([data-
|
|
472
|
+
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] header button:not([data-harnessmix-settings-trigger] *),
|
|
473
|
+
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-pip-obstacle="app-shell-header"] button:not([data-harnessmix-settings-trigger] *),
|
|
474
|
+
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-obstacle] button:not([data-harnessmix-settings-trigger] *),
|
|
475
|
+
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-testid="app-shell-header-context-menu-surface"] button:not([data-harnessmix-settings-trigger] *),
|
|
476
|
+
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-toolbar] button:not([data-harnessmix-settings-trigger] *),
|
|
477
|
+
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] header [role="button"]:not([data-harnessmix-settings-trigger] *) {
|
|
478
478
|
background: transparent !important;
|
|
479
479
|
background-color: transparent !important;
|
|
480
480
|
border-color: transparent !important;
|
|
@@ -489,11 +489,11 @@ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-page-header] > [da
|
|
|
489
489
|
filter: none !important;
|
|
490
490
|
outline: none !important;
|
|
491
491
|
}
|
|
492
|
-
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] header button:not([data-
|
|
493
|
-
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-pip-obstacle="app-shell-header"] button:not([data-
|
|
494
|
-
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-obstacle] button:not([data-
|
|
495
|
-
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-testid="app-shell-header-context-menu-surface"] button:not([data-
|
|
496
|
-
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-toolbar] button:not([data-
|
|
492
|
+
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] header button:not([data-harnessmix-settings-trigger] *):hover,
|
|
493
|
+
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-pip-obstacle="app-shell-header"] button:not([data-harnessmix-settings-trigger] *):hover,
|
|
494
|
+
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-obstacle] button:not([data-harnessmix-settings-trigger] *):hover,
|
|
495
|
+
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-testid="app-shell-header-context-menu-surface"] button:not([data-harnessmix-settings-trigger] *):hover,
|
|
496
|
+
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-toolbar] button:not([data-harnessmix-settings-trigger] *):hover {
|
|
497
497
|
background: color-mix(in srgb, ${text} 12%, transparent) !important;
|
|
498
498
|
background-color: color-mix(in srgb, ${text} 12%, transparent) !important;
|
|
499
499
|
}
|
|
@@ -507,11 +507,11 @@ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-page-header] > [da
|
|
|
507
507
|
filter: none !important;
|
|
508
508
|
outline: none !important;
|
|
509
509
|
}
|
|
510
|
-
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] header button:not([data-
|
|
511
|
-
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-pip-obstacle="app-shell-header"] button:not([data-
|
|
512
|
-
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-obstacle] button:not([data-
|
|
513
|
-
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-testid="app-shell-header-context-menu-surface"] button:not([data-
|
|
514
|
-
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-toolbar] button:not([data-
|
|
510
|
+
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] header button:not([data-harnessmix-settings-trigger] *):active,
|
|
511
|
+
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-pip-obstacle="app-shell-header"] button:not([data-harnessmix-settings-trigger] *):active,
|
|
512
|
+
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-obstacle] button:not([data-harnessmix-settings-trigger] *):active,
|
|
513
|
+
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-testid="app-shell-header-context-menu-surface"] button:not([data-harnessmix-settings-trigger] *):active,
|
|
514
|
+
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-toolbar] button:not([data-harnessmix-settings-trigger] *):active {
|
|
515
515
|
background: color-mix(in srgb, ${text} 18%, transparent) !important;
|
|
516
516
|
background-color: color-mix(in srgb, ${text} 18%, transparent) !important;
|
|
517
517
|
}
|
|
@@ -578,7 +578,7 @@ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-action-sidebar-thread-ac
|
|
|
578
578
|
background: linear-gradient(90deg, color-mix(in srgb, ${accent} 22%, transparent), color-mix(in srgb, ${secondary} 16%, transparent)) !important;
|
|
579
579
|
}
|
|
580
580
|
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] :where(.border-border, .border-sidebar-border) { border-color: color-mix(in srgb, ${text} 14%, transparent) !important; }
|
|
581
|
-
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-
|
|
581
|
+
html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-harnessmix-settings-shell] {
|
|
582
582
|
--settings-bg: color-mix(in srgb, ${surface} 90%, transparent);
|
|
583
583
|
--settings-sidebar: color-mix(in srgb, ${surface} 86%, ${secondary});
|
|
584
584
|
--settings-panel: color-mix(in srgb, ${surface} 90%, transparent);
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
type RendererSettingsMessages,
|
|
5
5
|
} from "./localization.js";
|
|
6
6
|
|
|
7
|
-
export const SETTINGS_TRIGGER_ATTRIBUTE = "data-
|
|
7
|
+
export const SETTINGS_TRIGGER_ATTRIBUTE = "data-harnessmix-settings-trigger";
|
|
8
8
|
export const SETTINGS_HEADER_SURFACE_SELECTOR =
|
|
9
9
|
'[data-testid="app-shell-header-context-menu-surface"]';
|
|
10
10
|
const SETTINGS_APPLICATION_HEADER_SELECTOR = 'header[data-pip-obstacle="app-shell-header"]';
|