@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
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { HarnessCommandDescriptor, HarnessPermissionMode } from "@
|
|
1
|
+
import type { HarnessCommandDescriptor, HarnessPermissionMode } from "@harnessmix/shared-contracts";
|
|
2
2
|
|
|
3
3
|
import type { RendererSettingsLocale } from "./settings/localization.js";
|
|
4
4
|
|
|
@@ -718,6 +718,10 @@ export function installHarnessMentions(load: (editor: Element, query: string) =>
|
|
|
718
718
|
sync(target: HTMLElement) {
|
|
719
719
|
syncBadges(target);
|
|
720
720
|
},
|
|
721
|
+
prepareSubmission(composer: Element): boolean {
|
|
722
|
+
const editorEl = findEditorIn(composer);
|
|
723
|
+
return !!editorEl && injectMentionsInto(editorEl);
|
|
724
|
+
},
|
|
721
725
|
dispose() {
|
|
722
726
|
disposed = true;
|
|
723
727
|
close();
|
|
@@ -50,10 +50,10 @@ export interface RendererIntegrationsClient {
|
|
|
50
50
|
}
|
|
51
51
|
export function createRendererIntegrationsClient(send: (method: string, params: unknown) => Promise<unknown>): RendererIntegrationsClient {
|
|
52
52
|
return {
|
|
53
|
-
integrationCatalog: async () => catalogSchema.parse(await send('
|
|
54
|
-
listIntegrations: async input => snapshotSchema.parse(await send('
|
|
55
|
-
saveMcp: input => send('
|
|
56
|
-
removeMcp: input => send('
|
|
57
|
-
changeSkill: input => send('
|
|
53
|
+
integrationCatalog: async () => catalogSchema.parse(await send('harnessmix/integrations/catalog', {})),
|
|
54
|
+
listIntegrations: async input => snapshotSchema.parse(await send('harnessmix/integrations/list', input)),
|
|
55
|
+
saveMcp: input => send('harnessmix/integrations/mcp/save', input),
|
|
56
|
+
removeMcp: input => send('harnessmix/integrations/mcp/remove', input),
|
|
57
|
+
changeSkill: input => send('harnessmix/integrations/skill/change', input),
|
|
58
58
|
};
|
|
59
59
|
}
|
|
@@ -95,7 +95,7 @@ import {
|
|
|
95
95
|
type UpdateCheckResult,
|
|
96
96
|
type UpdateStartResult,
|
|
97
97
|
type UpdateStatusResult,
|
|
98
|
-
} from "@
|
|
98
|
+
} from "@harnessmix/shared-contracts";
|
|
99
99
|
|
|
100
100
|
import {
|
|
101
101
|
createRendererRequestSender,
|
|
@@ -110,39 +110,40 @@ import {
|
|
|
110
110
|
type RendererPetsClient,
|
|
111
111
|
} from "./settings/pets-client.js";
|
|
112
112
|
|
|
113
|
-
export const HARNESS_INSPECT_METHOD = "
|
|
114
|
-
export const HARNESS_INSTALL_METHOD = "
|
|
115
|
-
export const HARNESS_PLUGIN_LIST_METHOD = "
|
|
116
|
-
export const HARNESS_WEB_UI_OPEN_METHOD = "
|
|
117
|
-
export const THREAD_FORK_METHOD = "
|
|
118
|
-
export const THREAD_HARNESS_SWITCH_METHOD = "
|
|
119
|
-
export const THREAD_INSPECT_METHOD = "
|
|
120
|
-
export const HARNESS_COMMANDS_INSPECT_METHOD = "
|
|
121
|
-
export const THREAD_COMMANDS_INSPECT_METHOD = "
|
|
122
|
-
export const THREAD_COMMAND_EXECUTE_METHOD = "
|
|
123
|
-
export const THREAD_DELEGATE_METHOD = "
|
|
124
|
-
export const THREAD_MESSAGE_METHOD = "
|
|
125
|
-
export const THREAD_MODEL_SELECT_METHOD = "
|
|
126
|
-
export const THREAD_THINKING_SELECT_METHOD = "
|
|
127
|
-
export const THREAD_PERMISSION_MODE_SELECT_METHOD = "
|
|
128
|
-
export const THREAD_OWNERSHIP_LIST_METHOD = "
|
|
129
|
-
export const THREAD_USAGE_INSPECT_METHOD = "
|
|
130
|
-
export const
|
|
113
|
+
export const HARNESS_INSPECT_METHOD = "harnessmix/harness/inspect";
|
|
114
|
+
export const HARNESS_INSTALL_METHOD = "harnessmix/harness/install";
|
|
115
|
+
export const HARNESS_PLUGIN_LIST_METHOD = "harnessmix/harness/plugins/list";
|
|
116
|
+
export const HARNESS_WEB_UI_OPEN_METHOD = "harnessmix/harness/web-ui/open";
|
|
117
|
+
export const THREAD_FORK_METHOD = "harnessmix/thread/fork";
|
|
118
|
+
export const THREAD_HARNESS_SWITCH_METHOD = "harnessmix/thread/harness/switch";
|
|
119
|
+
export const THREAD_INSPECT_METHOD = "harnessmix/thread/inspect";
|
|
120
|
+
export const HARNESS_COMMANDS_INSPECT_METHOD = "harnessmix/harness/commands/inspect";
|
|
121
|
+
export const THREAD_COMMANDS_INSPECT_METHOD = "harnessmix/thread/commands/inspect";
|
|
122
|
+
export const THREAD_COMMAND_EXECUTE_METHOD = "harnessmix/thread/command/execute";
|
|
123
|
+
export const THREAD_DELEGATE_METHOD = "harnessmix/thread/delegate";
|
|
124
|
+
export const THREAD_MESSAGE_METHOD = "harnessmix/thread/message";
|
|
125
|
+
export const THREAD_MODEL_SELECT_METHOD = "harnessmix/thread/model/select";
|
|
126
|
+
export const THREAD_THINKING_SELECT_METHOD = "harnessmix/thread/thinking/select";
|
|
127
|
+
export const THREAD_PERMISSION_MODE_SELECT_METHOD = "harnessmix/thread/permission-mode/select";
|
|
128
|
+
export const THREAD_OWNERSHIP_LIST_METHOD = "harnessmix/thread/ownership/list";
|
|
129
|
+
export const THREAD_USAGE_INSPECT_METHOD = "harnessmix/thread/usage/inspect";
|
|
130
|
+
export const THREAD_TEAM_INSPECT_METHOD = "harnessmix/thread/team/inspect";
|
|
131
|
+
export const THREAD_USAGE_UPDATED_METHOD = "harnessmix/thread/usage/updated";
|
|
131
132
|
export const THREAD_TOKEN_USAGE_UPDATED_METHOD = "thread/tokenUsage/updated";
|
|
132
|
-
export const UPDATE_CHECK_METHOD = "
|
|
133
|
-
export const UPDATE_START_METHOD = "
|
|
134
|
-
export const UPDATE_STATUS_METHOD = "
|
|
133
|
+
export const UPDATE_CHECK_METHOD = "harnessmix/update/check";
|
|
134
|
+
export const UPDATE_START_METHOD = "harnessmix/update/start";
|
|
135
|
+
export const UPDATE_STATUS_METHOD = "harnessmix/update/status";
|
|
135
136
|
export const RUNTIME_VERSION_METHOD = "harness-mix/runtime/version";
|
|
136
|
-
export const CODEX_ACCOUNT_LIST_METHOD = "
|
|
137
|
-
export const CODEX_ACCOUNT_REFRESH_METHOD = "
|
|
138
|
-
export const CODEX_ACCOUNT_CREATE_METHOD = "
|
|
139
|
-
export const CODEX_ACCOUNT_DELETE_METHOD = "
|
|
140
|
-
export const CODEX_ACCOUNT_ACTIVATE_METHOD = "
|
|
141
|
-
export const CODEX_ACCOUNT_LOGIN_START_METHOD = "
|
|
142
|
-
export const CODEX_ACCOUNT_LOGIN_CANCEL_METHOD = "
|
|
143
|
-
export const CODEX_ACCOUNT_LOGIN_COMPLETED_METHOD = "
|
|
137
|
+
export const CODEX_ACCOUNT_LIST_METHOD = "harnessmix/account/list";
|
|
138
|
+
export const CODEX_ACCOUNT_REFRESH_METHOD = "harnessmix/account/refresh";
|
|
139
|
+
export const CODEX_ACCOUNT_CREATE_METHOD = "harnessmix/account/create";
|
|
140
|
+
export const CODEX_ACCOUNT_DELETE_METHOD = "harnessmix/account/delete";
|
|
141
|
+
export const CODEX_ACCOUNT_ACTIVATE_METHOD = "harnessmix/account/activate";
|
|
142
|
+
export const CODEX_ACCOUNT_LOGIN_START_METHOD = "harnessmix/account/login/start";
|
|
143
|
+
export const CODEX_ACCOUNT_LOGIN_CANCEL_METHOD = "harnessmix/account/login/cancel";
|
|
144
|
+
export const CODEX_ACCOUNT_LOGIN_COMPLETED_METHOD = "harnessmix/account/login/completed";
|
|
144
145
|
export const CODEX_ACCOUNT_RESET_CREDIT_CONSUME_METHOD =
|
|
145
|
-
"
|
|
146
|
+
"harnessmix/account/rate-limit-reset/consume";
|
|
146
147
|
|
|
147
148
|
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
148
149
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
@@ -197,6 +198,7 @@ export interface RendererModelClient extends Partial<RendererSessionImportClient
|
|
|
197
198
|
executeThreadCommand(input: ThreadCommandExecuteParams): Promise<ThreadCommandExecuteResult>;
|
|
198
199
|
listThreadOwnership(input: ThreadOwnershipListParams): Promise<ThreadOwnershipListResult>;
|
|
199
200
|
inspectThreadUsage(input: ThreadUsageInspectionParams): Promise<ThreadUsageInspection>;
|
|
201
|
+
inspectThreadTeam?(input: { threadId: string; teamId?: string }): Promise<unknown>;
|
|
200
202
|
subscribeThreadUsage?(listener: (update: ThreadUsageInspection) => void): () => void;
|
|
201
203
|
selectThreadModel(input: ThreadModelSelectParams): Promise<HarnessModelSelectionState>;
|
|
202
204
|
selectThreadThinking(input: ThreadThinkingSelectParams): Promise<HarnessModelSelectionState>;
|
|
@@ -263,6 +265,20 @@ export function createThreadUsageSubscriptionRelay(): {
|
|
|
263
265
|
};
|
|
264
266
|
}
|
|
265
267
|
|
|
268
|
+
/** Mutations that may legitimately outlive the default request timeout
|
|
269
|
+
* (installs, forks, Harness handoffs, command execution, update downloads,
|
|
270
|
+
* interactive Account login) keep the previous unbounded wait. */
|
|
271
|
+
const REQUEST_TIMEOUT_EXEMPT_METHODS: ReadonlySet<string> = new Set([
|
|
272
|
+
HARNESS_INSTALL_METHOD,
|
|
273
|
+
THREAD_FORK_METHOD,
|
|
274
|
+
THREAD_HARNESS_SWITCH_METHOD,
|
|
275
|
+
THREAD_COMMAND_EXECUTE_METHOD,
|
|
276
|
+
THREAD_DELEGATE_METHOD,
|
|
277
|
+
THREAD_MESSAGE_METHOD,
|
|
278
|
+
UPDATE_START_METHOD,
|
|
279
|
+
CODEX_ACCOUNT_LOGIN_START_METHOD,
|
|
280
|
+
]);
|
|
281
|
+
|
|
266
282
|
export function createRendererModelClient(
|
|
267
283
|
candidates: readonly RequestManagerCandidate[],
|
|
268
284
|
): RendererModelClient | null {
|
|
@@ -276,8 +292,9 @@ export function createRendererModelClient(
|
|
|
276
292
|
const source = managers[0];
|
|
277
293
|
if (managers.length !== 1 || !source) return null;
|
|
278
294
|
const manager = {
|
|
279
|
-
sendRequest: createRendererRequestSender(
|
|
280
|
-
source.sendRequest(method, params),
|
|
295
|
+
sendRequest: createRendererRequestSender(
|
|
296
|
+
(method, params) => source.sendRequest(method, params),
|
|
297
|
+
{ isTimeoutExempt: (method) => REQUEST_TIMEOUT_EXEMPT_METHODS.has(method) },
|
|
281
298
|
),
|
|
282
299
|
};
|
|
283
300
|
|
|
@@ -337,10 +354,10 @@ export function createRendererModelClient(
|
|
|
337
354
|
};
|
|
338
355
|
|
|
339
356
|
return Object.freeze({
|
|
340
|
-
async inspectStorage() { return await manager.sendRequest('
|
|
341
|
-
async optimizeStorage() { return await manager.sendRequest('
|
|
357
|
+
async inspectStorage() { return await manager.sendRequest('harnessmix/storage/inspect', {}) as import('./settings/storage-page.js').RendererStorageInspection; },
|
|
358
|
+
async optimizeStorage() { return await manager.sendRequest('harnessmix/storage/optimize', {}) as { before: import('./settings/storage-page.js').RendererStorageInspection; after: import('./settings/storage-page.js').RendererStorageInspection }; },
|
|
342
359
|
async listCollaborationAgents(): Promise<Array<{ id: string; name: string; available: boolean; lead: boolean }>> {
|
|
343
|
-
const result = await manager.sendRequest('
|
|
360
|
+
const result = await manager.sendRequest('harnessmix/collaboration/agents', {});
|
|
344
361
|
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');
|
|
345
362
|
return result;
|
|
346
363
|
},
|
|
@@ -377,7 +394,7 @@ export function createRendererModelClient(
|
|
|
377
394
|
return result as { success: boolean; command?: string; stdout?: string; stderr?: string; error?: string };
|
|
378
395
|
},
|
|
379
396
|
async loginHarnessAccount(input: { harnessId: string }): Promise<{ success: boolean; command?: string; error?: string }> {
|
|
380
|
-
const result = await manager.sendRequest("
|
|
397
|
+
const result = await manager.sendRequest("harnessmix/harness/account/login", input);
|
|
381
398
|
return result as { success: boolean; command?: string; error?: string };
|
|
382
399
|
},
|
|
383
400
|
async listHarnessPlugins(): Promise<HarnessPluginListResult> {
|
|
@@ -411,10 +428,10 @@ export function createRendererModelClient(
|
|
|
411
428
|
thread.id !== params.threadId ||
|
|
412
429
|
typeof thread.modelProvider !== "string" ||
|
|
413
430
|
!thread.modelProvider ||
|
|
414
|
-
thread.modelProvider === "
|
|
431
|
+
thread.modelProvider === "harnessmix" ||
|
|
415
432
|
typeof thread.cliVersion !== "string" ||
|
|
416
433
|
!thread.cliVersion ||
|
|
417
|
-
thread.cliVersion === "
|
|
434
|
+
thread.cliVersion === "harnessmix"
|
|
418
435
|
) {
|
|
419
436
|
throw new Error("Native Thread response cannot establish Codex ownership");
|
|
420
437
|
}
|
|
@@ -440,6 +457,10 @@ export function createRendererModelClient(
|
|
|
440
457
|
return result;
|
|
441
458
|
},
|
|
442
459
|
inspectThreadUsage,
|
|
460
|
+
async inspectThreadTeam(input: { threadId: string; teamId?: string }): Promise<unknown> {
|
|
461
|
+
const threadId = hostThreadIdSchema.parse(input.threadId);
|
|
462
|
+
return manager.sendRequest(THREAD_TEAM_INSPECT_METHOD, { threadId, ...(input.teamId ? { teamId: input.teamId } : {}) });
|
|
463
|
+
},
|
|
443
464
|
subscribeThreadUsage(listener: (update: ThreadUsageInspection) => void): () => void {
|
|
444
465
|
const notifications = notificationTarget(source);
|
|
445
466
|
if (!notifications?.addNotificationCallback) {
|
|
@@ -503,7 +524,7 @@ export function createRendererModelClient(
|
|
|
503
524
|
input: CodexAccountUsageParams,
|
|
504
525
|
): Promise<CodexAccountUsageResult> {
|
|
505
526
|
const result = await manager.sendRequest(
|
|
506
|
-
"
|
|
527
|
+
"harnessmix/account/usage/inspect",
|
|
507
528
|
codexAccountUsageParamsSchema.parse(input),
|
|
508
529
|
);
|
|
509
530
|
return codexAccountUsageResultSchema.parse(result);
|
|
@@ -519,7 +540,7 @@ export function createRendererModelClient(
|
|
|
519
540
|
},
|
|
520
541
|
async listHarnessAccounts(): Promise<HarnessAccountListResult> {
|
|
521
542
|
return harnessAccountListResultSchema.parse(
|
|
522
|
-
await manager.sendRequest("
|
|
543
|
+
await manager.sendRequest("harnessmix/harness/accounts/list", {}),
|
|
523
544
|
);
|
|
524
545
|
},
|
|
525
546
|
async listCodexAccounts(): Promise<CodexAccountListResult> {
|
|
@@ -572,7 +593,7 @@ export function createRendererModelClient(
|
|
|
572
593
|
return codexAccountLoginCancelResultSchema.parse(result);
|
|
573
594
|
},
|
|
574
595
|
async logoutCodexAccount(): Promise<CodexAccountMutationResult> {
|
|
575
|
-
const result = await manager.sendRequest("
|
|
596
|
+
const result = await manager.sendRequest("harnessmix/account/logout", {});
|
|
576
597
|
return codexAccountMutationResultSchema.parse(result);
|
|
577
598
|
},
|
|
578
599
|
subscribeCodexAccountLogin(listener: (result: CodexAccountLoginCompleted) => void): () => void {
|
|
@@ -4,7 +4,7 @@ import type {
|
|
|
4
4
|
HarnessModelRef,
|
|
5
5
|
HarnessThinkingOption,
|
|
6
6
|
HarnessThinkingOptionId,
|
|
7
|
-
} from "@
|
|
7
|
+
} from "@harnessmix/shared-contracts";
|
|
8
8
|
|
|
9
9
|
import {
|
|
10
10
|
rendererModelPickerMainMenuPlacement,
|
|
@@ -28,7 +28,7 @@ const OPTION_CLASSES =
|
|
|
28
28
|
|
|
29
29
|
const HEADING_CLASSES = "px-2 pb-1 pt-1.5 text-sm text-token-text-tertiary";
|
|
30
30
|
const MODEL_TRIGGER_MAX_WIDTH = "min(200px, 26vw)";
|
|
31
|
-
const MODEL_SCROLLBAR_STYLE_ATTRIBUTE = "data-
|
|
31
|
+
const MODEL_SCROLLBAR_STYLE_ATTRIBUTE = "data-harnessmix-model-picker-scrollbar";
|
|
32
32
|
|
|
33
33
|
export interface RendererModelControlView {
|
|
34
34
|
status: "idle" | "waitingForAdapter" | "loading" | "ready" | "selecting" | "empty" | "error";
|
|
@@ -85,28 +85,28 @@ function ensureModelScrollbarStyle(ownerDocument: Document): void {
|
|
|
85
85
|
const style = ownerDocument.createElement("style");
|
|
86
86
|
style.setAttribute(MODEL_SCROLLBAR_STYLE_ATTRIBUTE, "true");
|
|
87
87
|
style.textContent = `
|
|
88
|
-
[data-
|
|
88
|
+
[data-harnessmix-model-scrollable] {
|
|
89
89
|
scrollbar-width: thin;
|
|
90
90
|
scrollbar-color: rgba(255, 255, 255, 0.28) transparent;
|
|
91
91
|
}
|
|
92
|
-
[data-
|
|
92
|
+
[data-harnessmix-model-scrollable]::-webkit-scrollbar {
|
|
93
93
|
width: 6px;
|
|
94
94
|
height: 6px;
|
|
95
95
|
}
|
|
96
|
-
[data-
|
|
96
|
+
[data-harnessmix-model-scrollable]::-webkit-scrollbar-track {
|
|
97
97
|
background: transparent;
|
|
98
98
|
}
|
|
99
|
-
[data-
|
|
99
|
+
[data-harnessmix-model-scrollable]::-webkit-scrollbar-thumb {
|
|
100
100
|
min-height: 28px;
|
|
101
101
|
border: 1px solid transparent;
|
|
102
102
|
border-radius: 999px;
|
|
103
103
|
background: rgba(255, 255, 255, 0.28);
|
|
104
104
|
background-clip: padding-box;
|
|
105
105
|
}
|
|
106
|
-
[data-
|
|
106
|
+
[data-harnessmix-model-scrollable]::-webkit-scrollbar-thumb:hover {
|
|
107
107
|
background: rgba(255, 255, 255, 0.42);
|
|
108
108
|
}
|
|
109
|
-
[data-
|
|
109
|
+
[data-harnessmix-model-scrollable]::-webkit-scrollbar-button {
|
|
110
110
|
display: none;
|
|
111
111
|
width: 0;
|
|
112
112
|
height: 0;
|
|
@@ -176,7 +176,7 @@ export function rendererModelPickerPresentation(
|
|
|
176
176
|
|
|
177
177
|
function positionMenu(control: RendererModelPickerControl): void {
|
|
178
178
|
const triggerRect = control.trigger.getBoundingClientRect();
|
|
179
|
-
const thinkingColumn = control.menu.querySelector<HTMLElement>("[data-
|
|
179
|
+
const thinkingColumn = control.menu.querySelector<HTMLElement>("[data-harnessmix-thinking-column]");
|
|
180
180
|
const twoColumn = control.thinkingExpanded && thinkingColumn !== null;
|
|
181
181
|
if (thinkingColumn) thinkingColumn.style.display = twoColumn ? "flex" : "none";
|
|
182
182
|
control.menu.dataset.twoColumn = String(twoColumn);
|
|
@@ -194,13 +194,13 @@ function positionMenu(control: RendererModelPickerControl): void {
|
|
|
194
194
|
control.menu.style.bottom = `${placement.bottom}px`;
|
|
195
195
|
// 列内部滚动:弹层本身不滚动,模型列表在给定最大高度内滚动
|
|
196
196
|
const listMaxHeight = placement.maxHeight ?? 320;
|
|
197
|
-
for (const column of control.menu.querySelectorAll<HTMLElement>("[data-
|
|
197
|
+
for (const column of control.menu.querySelectorAll<HTMLElement>("[data-harnessmix-model-scrollable]")) {
|
|
198
198
|
column.style.maxHeight = `${listMaxHeight}px`;
|
|
199
199
|
}
|
|
200
200
|
}
|
|
201
201
|
|
|
202
202
|
export function syncRendererModelTriggerClass(control: RendererModelPickerControl): void {
|
|
203
|
-
// Keep
|
|
203
|
+
// Keep harnessmix controls independent from Codex's private utility classes.
|
|
204
204
|
// Codex can rename or remove those between Desktop releases; our own
|
|
205
205
|
// `TRIGGER_CHIP_CLASS` chrome (see renderer-trigger-chip-style.ts) does not.
|
|
206
206
|
control.trigger.className = TRIGGER_CHIP_CLASS;
|
|
@@ -254,7 +254,7 @@ export function mountRendererModelPicker(
|
|
|
254
254
|
ensureRendererTriggerChipStyle(document);
|
|
255
255
|
|
|
256
256
|
const root = document.createElement("div");
|
|
257
|
-
root.setAttribute("data-
|
|
257
|
+
root.setAttribute("data-harnessmix-model-control", composerId);
|
|
258
258
|
root.className = "relative min-w-0";
|
|
259
259
|
root.style.display = "none";
|
|
260
260
|
|
|
@@ -322,7 +322,7 @@ export function mountRendererModelPicker(
|
|
|
322
322
|
searchHeader.style.padding = "4px";
|
|
323
323
|
searchHeader.style.backgroundColor = "Canvas";
|
|
324
324
|
const searchEmpty = document.createElement("div");
|
|
325
|
-
searchEmpty.dataset.
|
|
325
|
+
searchEmpty.dataset.harnessmixModelSearchEmpty = "true";
|
|
326
326
|
searchEmpty.textContent = "No matching models";
|
|
327
327
|
searchEmpty.className = "block px-2 py-2 text-sm text-token-text-tertiary";
|
|
328
328
|
searchEmpty.hidden = true;
|
|
@@ -495,7 +495,7 @@ function rebuildOptions(control: RendererModelPickerControl, view: RendererModel
|
|
|
495
495
|
modelColumn.style.width = `${RENDERER_MODEL_PICKER_MAIN_MENU_WIDTH}px`;
|
|
496
496
|
modelColumn.style.minWidth = "0";
|
|
497
497
|
const modelList = document.createElement("div");
|
|
498
|
-
modelList.setAttribute("data-
|
|
498
|
+
modelList.setAttribute("data-harnessmix-model-scrollable", "true");
|
|
499
499
|
modelList.style.overflowY = "auto";
|
|
500
500
|
modelList.style.minHeight = "0";
|
|
501
501
|
modelColumn.append(createHeading("Model"), control.searchHeader, control.searchEmpty, modelList);
|
|
@@ -530,7 +530,7 @@ function rebuildOptions(control: RendererModelPickerControl, view: RendererModel
|
|
|
530
530
|
// 右列:当前选中模型适用的思考强度档位
|
|
531
531
|
if (presentation.showThinkingSection) {
|
|
532
532
|
const thinkingColumn = document.createElement("div");
|
|
533
|
-
thinkingColumn.dataset.
|
|
533
|
+
thinkingColumn.dataset.harnessmixThinkingColumn = "true";
|
|
534
534
|
thinkingColumn.className = "flex min-w-0 flex-col";
|
|
535
535
|
thinkingColumn.style.display = control.thinkingExpanded ? "flex" : "none";
|
|
536
536
|
thinkingColumn.style.flexDirection = "column";
|
|
@@ -540,7 +540,7 @@ function rebuildOptions(control: RendererModelPickerControl, view: RendererModel
|
|
|
540
540
|
thinkingColumn.style.paddingLeft = "4px";
|
|
541
541
|
thinkingColumn.append(createHeading("Thinking"));
|
|
542
542
|
const thinkingList = document.createElement("div");
|
|
543
|
-
thinkingList.setAttribute("data-
|
|
543
|
+
thinkingList.setAttribute("data-harnessmix-model-scrollable", "true");
|
|
544
544
|
thinkingList.style.overflowY = "auto";
|
|
545
545
|
thinkingList.style.minHeight = "0";
|
|
546
546
|
for (const option of presentation.thinkingOptions) {
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
type HarnessPermissionModeCatalog,
|
|
8
8
|
type HarnessPermissionModeId,
|
|
9
9
|
type HarnessThinkingOptionId,
|
|
10
|
-
} from "@
|
|
10
|
+
} from "@harnessmix/shared-contracts";
|
|
11
11
|
|
|
12
12
|
import {
|
|
13
13
|
KNOWN_RENDERER_AGENTS,
|
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
type RendererAgent,
|
|
16
16
|
} from "./agent-selection-state.js";
|
|
17
17
|
|
|
18
|
-
export const RENDERER_NEW_THREAD_PREFERENCE_KEY = "
|
|
18
|
+
export const RENDERER_NEW_THREAD_PREFERENCE_KEY = "harnessmix.new-thread-preference.v1";
|
|
19
19
|
|
|
20
20
|
interface ExternalConfigurationPreference {
|
|
21
21
|
model: HarnessModelRef;
|
|
@@ -2,7 +2,7 @@ import type {
|
|
|
2
2
|
HarnessPermissionMode,
|
|
3
3
|
HarnessPermissionModeCatalog,
|
|
4
4
|
HarnessPermissionModeId,
|
|
5
|
-
} from "@
|
|
5
|
+
} from "@harnessmix/shared-contracts";
|
|
6
6
|
import type { IconNode } from "lucide";
|
|
7
7
|
import createElement from "lucide/dist/esm/createElement.mjs";
|
|
8
8
|
import Check from "lucide/dist/esm/icons/check.mjs";
|
|
@@ -129,7 +129,7 @@ function positionMenu(control: RendererPermissionModePickerControl): void {
|
|
|
129
129
|
export function syncRendererPermissionModeTriggerClass(
|
|
130
130
|
control: RendererPermissionModePickerControl,
|
|
131
131
|
): void {
|
|
132
|
-
// Do not copy Codex's private Composer classes into
|
|
132
|
+
// Do not copy Codex's private Composer classes into harnessmix controls.
|
|
133
133
|
// Codex can rename or remove those between Desktop releases; our own
|
|
134
134
|
// `TRIGGER_CHIP_CLASS` chrome (see renderer-trigger-chip-style.ts) does not.
|
|
135
135
|
control.trigger.className = TRIGGER_CHIP_CLASS;
|
|
@@ -145,7 +145,7 @@ export function mountRendererPermissionModePicker(
|
|
|
145
145
|
ensureRendererTriggerChipStyle(document);
|
|
146
146
|
|
|
147
147
|
const root = document.createElement("div");
|
|
148
|
-
root.setAttribute("data-
|
|
148
|
+
root.setAttribute("data-harnessmix-permission-mode-control", composerId);
|
|
149
149
|
root.className = "relative min-w-0";
|
|
150
150
|
root.style.display = "none";
|
|
151
151
|
|
|
@@ -2,9 +2,9 @@ import {
|
|
|
2
2
|
harnessPermissionModeIdSchema,
|
|
3
3
|
type HarnessPermissionModeCatalog,
|
|
4
4
|
type HarnessPermissionModeId,
|
|
5
|
-
} from "@
|
|
5
|
+
} from "@harnessmix/shared-contracts";
|
|
6
6
|
|
|
7
|
-
export const CLAUDE_PERMISSION_MODE_PREFERENCE_KEY = "
|
|
7
|
+
export const CLAUDE_PERMISSION_MODE_PREFERENCE_KEY = "harnessmix.claude-code.permission-mode.v1";
|
|
8
8
|
|
|
9
9
|
export interface PermissionModePreferenceStorage {
|
|
10
10
|
getItem(key: string): string | null;
|
|
@@ -10,6 +10,28 @@ export class RendererMethodUnavailableError extends Error {
|
|
|
10
10
|
}
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
+
/** A Host call that never settled would otherwise leave picker spinners,
|
|
14
|
+
* ownership loads and sidebar icons pending forever. */
|
|
15
|
+
export class RendererRequestTimeoutError extends Error {
|
|
16
|
+
readonly code = -32098;
|
|
17
|
+
|
|
18
|
+
constructor(
|
|
19
|
+
readonly method: string,
|
|
20
|
+
readonly timeoutMs: number,
|
|
21
|
+
) {
|
|
22
|
+
super(`${method} did not answer within ${timeoutMs} ms`, { cause: undefined });
|
|
23
|
+
this.name = "RendererRequestTimeoutError";
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export const RENDERER_REQUEST_TIMEOUT_DEFAULT_MS = 20_000;
|
|
28
|
+
|
|
29
|
+
export interface RendererRequestSenderOptions {
|
|
30
|
+
timeoutMs?: number;
|
|
31
|
+
/** Long-running mutations (install, fork, harness switch, ...) opt out. */
|
|
32
|
+
isTimeoutExempt?(method: string): boolean;
|
|
33
|
+
}
|
|
34
|
+
|
|
13
35
|
function isUnsupportedMethod(error: unknown, method: string): boolean {
|
|
14
36
|
if (typeof error !== "object" || error === null) return false;
|
|
15
37
|
const code = "code" in error ? error.code : undefined;
|
|
@@ -23,18 +45,39 @@ function isUnsupportedMethod(error: unknown, method: string): boolean {
|
|
|
23
45
|
}
|
|
24
46
|
|
|
25
47
|
/** One sender per request client. Only explicit method absence is remembered;
|
|
26
|
-
* successes, params, Harness availability and transient failures are not cached.
|
|
48
|
+
* successes, params, Harness availability and transient failures are not cached.
|
|
49
|
+
* Non-exempt calls carry a bounded timeout so a stale request bridge degrades
|
|
50
|
+
* into a retryable error instead of an infinite pending state. */
|
|
27
51
|
export function createRendererRequestSender(
|
|
28
52
|
send: (method: string, params: unknown) => Promise<unknown> | unknown,
|
|
53
|
+
options: RendererRequestSenderOptions = {},
|
|
29
54
|
): (method: string, params: unknown) => Promise<unknown> {
|
|
30
55
|
const unsupported = new Map<string, RendererMethodUnavailableError>();
|
|
56
|
+
const timeoutMs = options.timeoutMs ?? RENDERER_REQUEST_TIMEOUT_DEFAULT_MS;
|
|
31
57
|
return async (method, params) => {
|
|
32
58
|
const known = unsupported.get(method);
|
|
33
59
|
if (known) throw known;
|
|
34
60
|
try {
|
|
35
|
-
|
|
61
|
+
// Invoke send synchronously: callers and tests observe the request as
|
|
62
|
+
// dispatched before the first await, exactly as without a timeout.
|
|
63
|
+
const attempt = Promise.resolve(send(method, params));
|
|
64
|
+
if (timeoutMs <= 0 || options.isTimeoutExempt?.(method)) return await attempt;
|
|
65
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
66
|
+
try {
|
|
67
|
+
return await Promise.race([
|
|
68
|
+
attempt,
|
|
69
|
+
new Promise<never>((_resolve, reject) => {
|
|
70
|
+
timer = setTimeout(
|
|
71
|
+
() => reject(new RendererRequestTimeoutError(method, timeoutMs)),
|
|
72
|
+
timeoutMs,
|
|
73
|
+
);
|
|
74
|
+
}),
|
|
75
|
+
]);
|
|
76
|
+
} finally {
|
|
77
|
+
if (timer !== undefined) clearTimeout(timer);
|
|
78
|
+
}
|
|
36
79
|
} catch (error) {
|
|
37
|
-
if (!method.startsWith("
|
|
80
|
+
if (!method.startsWith("harnessmix/") || !isUnsupportedMethod(error, method)) throw error;
|
|
38
81
|
const unavailable = new RendererMethodUnavailableError(method, error);
|
|
39
82
|
unsupported.set(method, unavailable);
|
|
40
83
|
throw unavailable;
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
type HarnessSessionListResult,
|
|
10
10
|
type HarnessSessionImportParams,
|
|
11
11
|
type HarnessSessionImportResult,
|
|
12
|
-
} from "@
|
|
12
|
+
} from "@harnessmix/shared-contracts";
|
|
13
13
|
|
|
14
14
|
export interface RendererSessionImportClient {
|
|
15
15
|
listSessionImportSources(): Promise<HarnessSessionImportSourcesResult>;
|
|
@@ -42,13 +42,13 @@ export function createRendererSessionImportClient(
|
|
|
42
42
|
return {
|
|
43
43
|
async listSessionImportSources() {
|
|
44
44
|
return harnessSessionImportSourcesResultSchema.parse(
|
|
45
|
-
await request("
|
|
45
|
+
await request("harnessmix/harness/session-import/sources", {}),
|
|
46
46
|
);
|
|
47
47
|
},
|
|
48
48
|
async listHarnessSessions(input) {
|
|
49
49
|
const params = harnessSessionListParamsSchema.parse(input);
|
|
50
50
|
return harnessSessionListResultSchema.parse(
|
|
51
|
-
await request("
|
|
51
|
+
await request("harnessmix/harness/session-import/list", params),
|
|
52
52
|
);
|
|
53
53
|
},
|
|
54
54
|
async importHarnessSession(input) {
|
|
@@ -56,7 +56,7 @@ export function createRendererSessionImportClient(
|
|
|
56
56
|
const key = JSON.stringify([params.harnessId, params.nativeSessionId]);
|
|
57
57
|
const existing = pending.get(key);
|
|
58
58
|
if (existing) return existing;
|
|
59
|
-
const operation = request("
|
|
59
|
+
const operation = request("harnessmix/harness/session-import/import", params)
|
|
60
60
|
.then((value) => harnessSessionImportResultSchema.parse(value))
|
|
61
61
|
.finally(() => {
|
|
62
62
|
if (pending.get(key) === operation) pending.delete(key);
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
THREAD_OWNERSHIP_LIST_MAX_LENGTH,
|
|
3
3
|
hostThreadIdSchema,
|
|
4
4
|
type ThreadOwnership,
|
|
5
|
-
} from "@
|
|
5
|
+
} from "@harnessmix/shared-contracts";
|
|
6
6
|
|
|
7
7
|
import type { RendererAgent } from "./agent-selection-state.js";
|
|
8
8
|
import { createRendererAgentIcon, RENDERER_AGENT_LABELS } from "./renderer-agent-icon.js";
|
|
@@ -13,7 +13,7 @@ export const SIDEBAR_THREAD_ROW_ATTRIBUTE = "data-app-action-sidebar-thread-row"
|
|
|
13
13
|
export const SIDEBAR_THREAD_ROW_SELECTOR = `[${SIDEBAR_THREAD_ROW_ATTRIBUTE}]`;
|
|
14
14
|
export const SIDEBAR_THREAD_ID_ATTRIBUTE = "data-app-action-sidebar-thread-id";
|
|
15
15
|
export const SIDEBAR_THREAD_HOST_ID_ATTRIBUTE = "data-app-action-sidebar-thread-host-id";
|
|
16
|
-
export const SIDEBAR_AGENT_ICON_ATTRIBUTE = "data-
|
|
16
|
+
export const SIDEBAR_AGENT_ICON_ATTRIBUTE = "data-harnessmix-sidebar-agent-icon";
|
|
17
17
|
|
|
18
18
|
export interface RendererSidebarContractInspection {
|
|
19
19
|
rowCount: number;
|
|
@@ -58,28 +58,32 @@ export function threadIdFromSidebarRowElement(element: HTMLElement): string | nu
|
|
|
58
58
|
const fiberNames = Object.getOwnPropertyNames(element).filter((name) =>
|
|
59
59
|
name.startsWith("__reactFiber$"),
|
|
60
60
|
);
|
|
61
|
-
|
|
62
|
-
if (fiberNames.length !== 1 || !fiberName) return null;
|
|
63
|
-
const firstFiber = Object.getOwnPropertyDescriptor(element, fiberName)?.value;
|
|
64
|
-
if (!isRecord(firstFiber)) return null;
|
|
61
|
+
if (fiberNames.length === 0) return null;
|
|
65
62
|
|
|
63
|
+
// Desktop builds occasionally attach more than one Fiber root key to a row
|
|
64
|
+
// (transitions, nested roots). Walk each of them and stay fail-closed only
|
|
65
|
+
// when they genuinely disagree, instead of giving up on the row entirely.
|
|
66
66
|
const candidates = new Set<string>();
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
const
|
|
73
|
-
if (
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
67
|
+
for (const fiberName of fiberNames) {
|
|
68
|
+
const firstFiber = Object.getOwnPropertyDescriptor(element, fiberName)?.value;
|
|
69
|
+
if (!isRecord(firstFiber)) continue;
|
|
70
|
+
let fiber: Record<string, unknown> | null = firstFiber;
|
|
71
|
+
for (let depth = 0; fiber && depth < 16; depth += 1) {
|
|
72
|
+
const props = fiber.memoizedProps;
|
|
73
|
+
if (isRecord(props) && isRecord(props.dataAttributes)) {
|
|
74
|
+
const dataAttributes = props.dataAttributes;
|
|
75
|
+
const threadId = hostThreadIdSchema.safeParse(props.conversationId);
|
|
76
|
+
if (
|
|
77
|
+
threadId.success &&
|
|
78
|
+
dataAttributes[SIDEBAR_THREAD_ROW_ATTRIBUTE] === rowMarker &&
|
|
79
|
+
dataAttributes[SIDEBAR_THREAD_ID_ATTRIBUTE] === taskKey &&
|
|
80
|
+
dataAttributes[SIDEBAR_THREAD_HOST_ID_ATTRIBUTE] === hostId
|
|
81
|
+
) {
|
|
82
|
+
candidates.add(threadId.data);
|
|
83
|
+
}
|
|
80
84
|
}
|
|
85
|
+
fiber = isRecord(fiber.return) ? fiber.return : null;
|
|
81
86
|
}
|
|
82
|
-
fiber = isRecord(fiber.return) ? fiber.return : null;
|
|
83
87
|
}
|
|
84
88
|
return candidates.size === 1 ? (candidates.values().next().value ?? null) : null;
|
|
85
89
|
}
|