@harness-mix/cli 0.1.10 → 0.1.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -0
- package/NOTICE +16 -2
- package/README.md +265 -3
- package/docs/cross-platform.md +3 -3
- package/docs/multi-agent-collaboration.md +37 -23
- package/docs/native-acp.md +2 -2
- package/docs/native-codex.md +5 -5
- package/docs/{superpowers/specs → specs}/2026-09-13-native-hardening-design.md +2 -2
- package/docs/storage-verification-design.md +5 -5
- package/licenses/lobe-icons-MIT.txt +21 -0
- package/output/native-build/desktop-controller.mjs +24 -24
- package/output/native-build/harness-mix-secret.exe +0 -0
- package/output/native-build/harness-mix-shim.exe +0 -0
- package/output/native-build/renderer-extension.js +1325 -658
- package/package.json +8 -8
- package/scripts/adapters-test.cjs +9 -1
- package/scripts/antigravity-adapter-test.cjs +381 -284
- package/scripts/build-native.cjs +64 -46
- package/scripts/codex-accounts-test.cjs +1 -1
- package/scripts/codex-accounts-ui-smoke.cjs +1 -1
- package/scripts/collaboration-recovery-test.cjs +11 -2
- package/scripts/collaboration-test.cjs +114 -27
- package/scripts/collaboration-ui-smoke.cjs +45 -8
- package/scripts/concurrency-layers-test.cjs +5 -0
- package/scripts/diagnostics.cjs +1 -1
- package/scripts/e2e-native-host.cjs +13 -13
- package/scripts/error-kind-test.cjs +3 -3
- package/scripts/integrations-test.cjs +2 -2
- package/scripts/integrations-ui-smoke.cjs +6 -6
- package/scripts/native-config-test.cjs +6 -6
- package/scripts/native-job-object-test.cjs +1 -1
- package/scripts/native-protocol-test.cjs +44 -38
- package/scripts/native-rollback-test.cjs +1 -1
- package/scripts/native-secret-test.cjs +1 -1
- package/scripts/native-shim-test.cjs +1 -1
- package/scripts/native-sidebar-test.cjs +4 -4
- package/scripts/native-ui-smoke.cjs +12 -12
- package/scripts/pets-test.cjs +223 -3
- package/scripts/platform-test.cjs +6 -6
- package/scripts/publish-native-package.cjs +1 -1
- package/scripts/test-live-mentions.cjs +2 -2
- package/scripts/workspace-test.cjs +4 -2
- package/src/assets/icons/PROVENANCE.md +92 -0
- package/src/main/adapters/antigravity.js +1415 -1368
- package/src/main/adapters/claude.js +1 -1
- package/src/main/adapters/codex-app-server.js +1 -1
- package/src/main/adapters/dsh.js +1 -1
- package/src/main/adapters/index.js +1 -1
- package/src/main/adapters/pi-usage.js +2 -2
- package/src/main/harness-adapter/error-kind.js +1 -1
- package/src/main/harness-adapter/manifest.js +7 -1
- package/src/main/host/collaboration-tools.js +8 -1
- package/src/main/host/collaboration-worktree.js +27 -1
- package/src/main/host/collaboration.js +348 -15
- package/src/main/host/runtime.js +23 -15
- package/src/main/native/codex-accounts.js +1 -1
- package/src/main/native/config.js +9 -9
- package/src/main/native/host.js +1 -1
- package/src/main/native/launcher.js +10 -8
- package/src/main/native/pets.js +188 -49
- package/src/main/native/platform.js +19 -9
- package/src/main/native/protocol.js +83 -80
- package/src/main/native/rs/crates/appx/Cargo.toml +1 -1
- package/src/main/native/rs/crates/secret/Cargo.toml +1 -1
- package/src/main/native/rs/crates/secret/src/main.rs +3 -3
- package/src/main/native/rs/crates/shim/Cargo.toml +1 -1
- package/src/main/native/rs/crates/shim/src/main.rs +2 -2
- package/src/main/native/thread-list.js +1 -1
- package/src/main/shared-contracts/capability.js +3 -1
- package/src/main/workspace/core-review.js +4 -3
- package/src/native-ui/README.md +2 -2
- package/src/native-ui/desktop-control/dist/contract-audit.js +4 -4
- package/src/native-ui/desktop-control/dist/index.d.ts +1 -1
- package/src/native-ui/desktop-control/dist/index.js +2 -2
- package/src/native-ui/desktop-control/dist/index.js.map +1 -1
- package/src/native-ui/desktop-control/dist/main-process-title-policy.js +5 -5
- package/src/native-ui/desktop-control/dist/main-process-title-policy.js.map +1 -1
- package/src/native-ui/desktop-control/dist/production-controller.js +3 -3
- package/src/native-ui/desktop-control/dist/production-controller.js.map +1 -1
- package/src/native-ui/desktop-control/dist/release-main.js +1 -1
- package/src/native-ui/desktop-control/dist/release-main.js.map +1 -1
- package/src/native-ui/desktop-control/dist/renderer-cdp-control-session.js +1 -1
- package/src/native-ui/desktop-control/dist/renderer-cdp-control-session.js.map +1 -1
- package/src/native-ui/desktop-control/dist/renderer-control-session.js +3 -3
- package/src/native-ui/desktop-control/dist/renderer-control-session.js.map +1 -1
- package/src/native-ui/desktop-control/dist/renderer-draft-prewarm-runtime.js +25 -25
- package/src/native-ui/desktop-control/dist/renderer-draft-prewarm-runtime.js.map +1 -1
- package/src/native-ui/desktop-control/dist/tsconfig.tsbuildinfo +1 -1
- package/src/native-ui/desktop-control/package.json +2 -2
- package/src/native-ui/desktop-control/scripts/build-release.mjs +2 -2
- package/src/native-ui/desktop-control/src/contract-audit.ts +4 -4
- package/src/native-ui/desktop-control/src/index.ts +2 -2
- package/src/native-ui/desktop-control/src/main-process-title-policy.ts +5 -5
- package/src/native-ui/desktop-control/src/production-controller.ts +3 -3
- package/src/native-ui/desktop-control/src/release-main.ts +1 -1
- package/src/native-ui/desktop-control/src/renderer-cdp-control-session.ts +1 -1
- package/src/native-ui/desktop-control/src/renderer-control-session.ts +3 -3
- package/src/native-ui/desktop-control/src/renderer-draft-prewarm-runtime.ts +25 -25
- package/src/native-ui/desktop-control/test/index.test.ts +1 -1
- package/src/native-ui/desktop-control/test/production-controller.test.ts +1 -1
- package/src/native-ui/desktop-control/test/renderer-cdp-control-session.test.ts +1 -1
- package/src/native-ui/desktop-control/test/renderer-draft-prewarm-policy.test.ts +43 -43
- package/src/native-ui/renderer-extension/dist/types/agent-group-preference.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/agent-group-preference.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/agent-selection-state.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/agent-selection-state.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/contract-audit.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/contract-audit.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/index.d.ts +3 -1
- package/src/native-ui/renderer-extension/dist/types/index.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/production-entry.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/production-entry.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-agent-picker.d.ts +2 -2
- package/src/native-ui/renderer-extension/dist/types/renderer-agent-picker.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-binding-probe.d.ts +3 -3
- package/src/native-ui/renderer-extension/dist/types/renderer-binding-probe.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-codex-account-options.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-codex-account-options.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-codex-account-state.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-codex-account-state.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-collab-cards.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-collab-cards.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-composer-dom.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-composer-dom.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-credits-control.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-credits-control.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-fork-control.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-fork-control.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-harness-command-claim.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-harness-command-claim.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-harness-command-control.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-harness-command-control.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-harness-handoff.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-harness-handoff.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-harness-localization.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-harness-localization.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-harness-mentions.d.ts +1 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-harness-mentions.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-model-client.d.ts +36 -31
- package/src/native-ui/renderer-extension/dist/types/renderer-model-client.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-model-picker.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-model-picker.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-new-thread-preference.d.ts +2 -2
- package/src/native-ui/renderer-extension/dist/types/renderer-new-thread-preference.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-permission-mode-picker.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-permission-mode-picker.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-permission-mode-preference.d.ts +2 -2
- package/src/native-ui/renderer-extension/dist/types/renderer-permission-mode-preference.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-request-sender.d.ts +18 -2
- package/src/native-ui/renderer-extension/dist/types/renderer-request-sender.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-session-import-client.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-session-import-client.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-sidebar-agent-icons.d.ts +2 -2
- package/src/native-ui/renderer-extension/dist/types/renderer-sidebar-agent-icons.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-team-cards.d.ts +58 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-team-cards.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-transcript-dom.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-trigger-chip-style.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-trigger-chip-style.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-usage-control.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-usage-control.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/settings/accounts-list.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/settings/accounts-list.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/settings/accounts-page.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/settings/accounts-page.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/settings/accounts-usage.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/settings/accounts-usage.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/settings/connections-page.d.ts +3 -3
- package/src/native-ui/renderer-extension/dist/types/settings/connections-page.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/settings/harness-accounts.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/settings/harness-accounts.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/settings/pages.d.ts +4 -4
- package/src/native-ui/renderer-extension/dist/types/settings/pages.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/settings/pet-market.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/settings/session-import-list-controls.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/settings/session-import-list-controls.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/settings/session-import-page.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/settings/session-import-page.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/settings/shell.d.ts +2 -2
- package/src/native-ui/renderer-extension/dist/types/settings/shell.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/settings/trigger.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/settings/trigger.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/tsconfig.tsbuildinfo +1 -1
- package/src/native-ui/renderer-extension/dist/types/versioned-renderer-adapter.d.ts +18 -18
- package/src/native-ui/renderer-extension/dist/types/versioned-renderer-adapter.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/package.json +2 -2
- package/src/native-ui/renderer-extension/src/agent-group-preference.ts +1 -1
- package/src/native-ui/renderer-extension/src/agent-selection-state.ts +31 -16
- package/src/native-ui/renderer-extension/src/audit-entry.ts +1 -1
- package/src/native-ui/renderer-extension/src/contract-audit.ts +4 -4
- package/src/native-ui/renderer-extension/src/index.ts +4 -2
- package/src/native-ui/renderer-extension/src/install-renderer-binding.ts +2 -2
- package/src/native-ui/renderer-extension/src/production-entry.ts +3 -3
- package/src/native-ui/renderer-extension/src/renderer-agent-picker.ts +7 -7
- package/src/native-ui/renderer-extension/src/renderer-binding-probe.ts +112 -89
- package/src/native-ui/renderer-extension/src/renderer-codex-account-options.ts +1 -1
- package/src/native-ui/renderer-extension/src/renderer-codex-account-state.ts +1 -1
- package/src/native-ui/renderer-extension/src/renderer-collab-cards.ts +1 -1
- package/src/native-ui/renderer-extension/src/renderer-composer-dom.ts +12 -12
- package/src/native-ui/renderer-extension/src/renderer-credits-control.ts +7 -7
- package/src/native-ui/renderer-extension/src/renderer-external-steering.ts +3 -3
- package/src/native-ui/renderer-extension/src/renderer-fork-control.ts +1 -1
- package/src/native-ui/renderer-extension/src/renderer-harness-command-claim.ts +1 -1
- package/src/native-ui/renderer-extension/src/renderer-harness-command-control.ts +3 -3
- package/src/native-ui/renderer-extension/src/renderer-harness-handoff.ts +1 -1
- package/src/native-ui/renderer-extension/src/renderer-harness-localization.ts +1 -1
- package/src/native-ui/renderer-extension/src/renderer-harness-mentions.ts +4 -0
- package/src/native-ui/renderer-extension/src/renderer-integrations-client.ts +5 -5
- package/src/native-ui/renderer-extension/src/renderer-model-client.ts +63 -42
- package/src/native-ui/renderer-extension/src/renderer-model-picker.ts +16 -16
- package/src/native-ui/renderer-extension/src/renderer-new-thread-preference.ts +2 -2
- package/src/native-ui/renderer-extension/src/renderer-permission-mode-picker.ts +3 -3
- package/src/native-ui/renderer-extension/src/renderer-permission-mode-preference.ts +2 -2
- package/src/native-ui/renderer-extension/src/renderer-request-sender.ts +46 -3
- package/src/native-ui/renderer-extension/src/renderer-session-import-client.ts +4 -4
- package/src/native-ui/renderer-extension/src/renderer-sidebar-agent-icons.ts +24 -20
- package/src/native-ui/renderer-extension/src/renderer-team-cards.ts +312 -0
- package/src/native-ui/renderer-extension/src/renderer-transcript-dom.ts +1 -1
- package/src/native-ui/renderer-extension/src/renderer-trigger-chip-style.ts +2 -2
- package/src/native-ui/renderer-extension/src/renderer-usage-control.ts +4 -4
- package/src/native-ui/renderer-extension/src/settings/accounts-list.ts +1 -1
- package/src/native-ui/renderer-extension/src/settings/accounts-page.ts +1 -1
- package/src/native-ui/renderer-extension/src/settings/accounts-usage.ts +1 -1
- package/src/native-ui/renderer-extension/src/settings/connections-page.ts +7 -7
- package/src/native-ui/renderer-extension/src/settings/harness-accounts.ts +1 -1
- package/src/native-ui/renderer-extension/src/settings/icons.ts +2 -2
- package/src/native-ui/renderer-extension/src/settings/pages.ts +11 -11
- package/src/native-ui/renderer-extension/src/settings/pet-market.css +33 -0
- package/src/native-ui/renderer-extension/src/settings/pet-market.ts +173 -91
- package/src/native-ui/renderer-extension/src/settings/pets-client.ts +5 -5
- package/src/native-ui/renderer-extension/src/settings/release-notes.ts +1 -1
- package/src/native-ui/renderer-extension/src/settings/session-import-list-controls.ts +1 -1
- package/src/native-ui/renderer-extension/src/settings/session-import-page.ts +1 -1
- package/src/native-ui/renderer-extension/src/settings/shell.css +15 -15
- package/src/native-ui/renderer-extension/src/settings/shell.ts +11 -11
- package/src/native-ui/renderer-extension/src/settings/skin-runtime.ts +17 -17
- package/src/native-ui/renderer-extension/src/settings/trigger.ts +1 -1
- package/src/native-ui/renderer-extension/src/versioned-renderer-adapter.ts +20 -20
- package/src/native-ui/renderer-extension/test/agent-selection-state.test.ts +60 -1
- package/src/native-ui/renderer-extension/test/codebuddy-migration.test.ts +1 -1
- package/src/native-ui/renderer-extension/test/renderer-agent-picker.test.ts +1 -1
- package/src/native-ui/renderer-extension/test/renderer-binding-probe-host-catalog.test.ts +15 -9
- package/src/native-ui/renderer-extension/test/renderer-binding-probe.test.ts +15 -15
- package/src/native-ui/renderer-extension/test/renderer-codex-account-state.test.ts +1 -1
- package/src/native-ui/renderer-extension/test/renderer-composer-permissions.test.ts +4 -4
- package/src/native-ui/renderer-extension/test/renderer-external-steering-rpc.test.ts +2 -2
- package/src/native-ui/renderer-extension/test/renderer-external-steering.test.ts +3 -3
- package/src/native-ui/renderer-extension/test/renderer-fork-control.test.ts +4 -4
- package/src/native-ui/renderer-extension/test/renderer-harness-command-claim.test.ts +1 -1
- package/src/native-ui/renderer-extension/test/renderer-harness-command-control.test.ts +1 -1
- package/src/native-ui/renderer-extension/test/renderer-model-client.test.ts +12 -11
- package/src/native-ui/renderer-extension/test/renderer-model-picker.test.ts +1 -1
- package/src/native-ui/renderer-extension/test/renderer-native-thread-ownership.test.ts +6 -6
- package/src/native-ui/renderer-extension/test/renderer-new-thread-preference.test.ts +1 -1
- package/src/native-ui/renderer-extension/test/renderer-permission-mode-picker.test.ts +1 -1
- package/src/native-ui/renderer-extension/test/renderer-permission-mode-preference.test.ts +1 -1
- package/src/native-ui/renderer-extension/test/renderer-request-timeout.test.ts +80 -0
- package/src/native-ui/renderer-extension/test/renderer-settings-lifecycle.test.ts +2 -2
- package/src/native-ui/renderer-extension/test/renderer-sidebar-agent-icons.test.ts +10 -3
- package/src/native-ui/renderer-extension/test/renderer-unsupported-methods.test.ts +1 -1
- package/src/native-ui/renderer-extension/test/settings/pages.test.ts +5 -5
- package/src/native-ui/renderer-extension/test/settings/release-notes.test.ts +9 -9
- package/src/native-ui/renderer-extension/test/versioned-renderer-adapter.test.ts +3 -3
- package/src/native-ui/shared-contracts/dist/errors.d.ts +2 -2
- package/src/native-ui/shared-contracts/dist/errors.d.ts.map +1 -1
- package/src/native-ui/shared-contracts/dist/errors.js +1 -1
- package/src/native-ui/shared-contracts/dist/errors.js.map +1 -1
- package/src/native-ui/shared-contracts/dist/harness-models.d.ts +40 -0
- package/src/native-ui/shared-contracts/dist/harness-models.d.ts.map +1 -1
- package/src/native-ui/shared-contracts/dist/harness-models.js +23 -2
- package/src/native-ui/shared-contracts/dist/harness-models.js.map +1 -1
- package/src/native-ui/shared-contracts/dist/harness-route.d.ts +1 -1
- package/src/native-ui/shared-contracts/dist/harness-route.d.ts.map +1 -1
- package/src/native-ui/shared-contracts/dist/harness-route.js +1 -1
- package/src/native-ui/shared-contracts/dist/harness-route.js.map +1 -1
- package/src/native-ui/shared-contracts/dist/harness-session-import.d.ts +1 -1
- package/src/native-ui/shared-contracts/dist/harness-session-import.d.ts.map +1 -1
- package/src/native-ui/shared-contracts/dist/harness-session-import.js +1 -1
- package/src/native-ui/shared-contracts/dist/harness-session-import.js.map +1 -1
- package/src/native-ui/shared-contracts/dist/index.d.ts +3 -3
- package/src/native-ui/shared-contracts/dist/index.d.ts.map +1 -1
- package/src/native-ui/shared-contracts/dist/index.js +2 -2
- package/src/native-ui/shared-contracts/dist/index.js.map +1 -1
- package/src/native-ui/shared-contracts/dist/tsconfig.tsbuildinfo +1 -1
- package/src/native-ui/shared-contracts/dist/updates.js +1 -1
- package/src/native-ui/shared-contracts/dist/updates.js.map +1 -1
- package/src/native-ui/shared-contracts/package.json +1 -1
- package/src/native-ui/shared-contracts/src/errors.ts +3 -3
- package/src/native-ui/shared-contracts/src/harness-models.ts +23 -2
- package/src/native-ui/shared-contracts/src/harness-route.ts +1 -1
- package/src/native-ui/shared-contracts/src/harness-session-import.ts +1 -1
- package/src/native-ui/shared-contracts/src/index.ts +3 -3
- package/src/native-ui/shared-contracts/src/updates.ts +1 -1
- package/src/native-ui/shared-contracts/test/browser-bundle.test.ts +3 -3
- package/src/native-ui/shared-contracts/test/deepseek-modern-sessions.test.ts +1 -1
- package/src/native-ui/shared-contracts/test/errors.test.ts +9 -9
- package/src/native-ui/shared-contracts/test/harness-commands.test.ts +1 -1
- package/src/native-ui/shared-contracts/test/harness-models.test.ts +3 -3
- package/src/native-ui/shared-contracts/test/harness-permission-modes.test.ts +1 -1
- package/src/native-ui/shared-contracts/test/harness-plugins.test.ts +1 -1
- package/src/native-ui/shared-contracts/test/harness-session-import.test.ts +1 -1
- package/src/native-ui/shared-contracts/test/index.test.ts +3 -3
- package/src/native-ui/shared-contracts/test/json-rpc.test.ts +1 -1
- package/src/native-ui/shared-contracts/test/thread-usage.test.ts +1 -1
- package/src/native-ui/shared-contracts/test/updates.test.ts +4 -4
- /package/licenses/{codex-host-MIT.txt → bytepioneer-MIT.txt} +0 -0
|
@@ -22,7 +22,7 @@ import {
|
|
|
22
22
|
type ThreadOwnershipListParams,
|
|
23
23
|
type ThreadUsageInspection,
|
|
24
24
|
type ThreadUsageInspectionParams,
|
|
25
|
-
} from "@
|
|
25
|
+
} from "@harnessmix/shared-contracts";
|
|
26
26
|
|
|
27
27
|
import type { RendererAgent } from "./agent-selection-state.js";
|
|
28
28
|
import { installRendererForkControl } from "./renderer-fork-control.js";
|
|
@@ -33,19 +33,19 @@ import {
|
|
|
33
33
|
type RendererModelClient,
|
|
34
34
|
} from "./renderer-model-client.js";
|
|
35
35
|
|
|
36
|
-
export const PI_TRANSPORT_MODEL_ID = "
|
|
36
|
+
export const PI_TRANSPORT_MODEL_ID = "harnessmix/pi-native";
|
|
37
37
|
export const PI_TRANSPORT_MODEL_PREFIX = `${PI_TRANSPORT_MODEL_ID}@`;
|
|
38
|
-
export const CLAUDE_CODE_TRANSPORT_MODEL_ID = "
|
|
38
|
+
export const CLAUDE_CODE_TRANSPORT_MODEL_ID = "harnessmix/claude-code-native";
|
|
39
39
|
export const CLAUDE_CODE_TRANSPORT_MODEL_PREFIX = `${CLAUDE_CODE_TRANSPORT_MODEL_ID}@`;
|
|
40
|
-
export const DEEPSEEK_HARNESS_TRANSPORT_MODEL_ID = "
|
|
40
|
+
export const DEEPSEEK_HARNESS_TRANSPORT_MODEL_ID = "harnessmix/deepseek-harness-native";
|
|
41
41
|
export const DEEPSEEK_HARNESS_TRANSPORT_MODEL_PREFIX = `${DEEPSEEK_HARNESS_TRANSPORT_MODEL_ID}@`;
|
|
42
|
-
export const OPENCODE_TRANSPORT_MODEL_ID = "
|
|
42
|
+
export const OPENCODE_TRANSPORT_MODEL_ID = "harnessmix/opencode-native";
|
|
43
43
|
export const OPENCODE_TRANSPORT_MODEL_PREFIX = `${OPENCODE_TRANSPORT_MODEL_ID}@`;
|
|
44
|
-
export const GROK_TRANSPORT_MODEL_ID = "
|
|
44
|
+
export const GROK_TRANSPORT_MODEL_ID = "harnessmix/grok-native";
|
|
45
45
|
export const GROK_TRANSPORT_MODEL_PREFIX = `${GROK_TRANSPORT_MODEL_ID}@`;
|
|
46
|
-
export const OMP_TRANSPORT_MODEL_ID = "
|
|
46
|
+
export const OMP_TRANSPORT_MODEL_ID = "harnessmix/omp-native";
|
|
47
47
|
export const OMP_TRANSPORT_MODEL_PREFIX = `${OMP_TRANSPORT_MODEL_ID}@`;
|
|
48
|
-
export const ANTIGRAVITY_TRANSPORT_MODEL_ID = "
|
|
48
|
+
export const ANTIGRAVITY_TRANSPORT_MODEL_ID = "harnessmix/antigravity-native";
|
|
49
49
|
export const ANTIGRAVITY_TRANSPORT_MODEL_PREFIX = `${ANTIGRAVITY_TRANSPORT_MODEL_ID}@`;
|
|
50
50
|
|
|
51
51
|
export type RendererAdapterState = "installing" | "ready" | "unsupported";
|
|
@@ -122,7 +122,7 @@ export interface RendererDraftPrewarmPolicy {
|
|
|
122
122
|
}
|
|
123
123
|
|
|
124
124
|
interface RendererDraftPrewarmPolicyTarget {
|
|
125
|
-
|
|
125
|
+
__harnessmixDraftPrewarmPolicyV1?: RendererDraftPrewarmPolicy;
|
|
126
126
|
setTimeout(handler: TimerHandler, timeout?: number): number;
|
|
127
127
|
}
|
|
128
128
|
|
|
@@ -131,8 +131,8 @@ const DRAFT_PREWARM_POLICY_POLL_INTERVAL_MS = 25;
|
|
|
131
131
|
|
|
132
132
|
declare global {
|
|
133
133
|
interface Window {
|
|
134
|
-
|
|
135
|
-
|
|
134
|
+
__harnessmixMainProcessTitlePolicyV1?: { state: "ready" };
|
|
135
|
+
__harnessmixDraftPrewarmPolicyV1?: RendererDraftPrewarmPolicy;
|
|
136
136
|
}
|
|
137
137
|
}
|
|
138
138
|
|
|
@@ -916,7 +916,7 @@ export async function waitForRendererDraftPrewarmPolicy(
|
|
|
916
916
|
): Promise<RendererDraftPrewarmPolicy> {
|
|
917
917
|
const deadline = Date.now() + DRAFT_PREWARM_POLICY_WAIT_TIMEOUT_MS;
|
|
918
918
|
while (true) {
|
|
919
|
-
const policy = target.
|
|
919
|
+
const policy = target.__harnessmixDraftPrewarmPolicyV1;
|
|
920
920
|
if (isDraftPrewarmPolicyReady(policy)) return policy;
|
|
921
921
|
const remaining = deadline - Date.now();
|
|
922
922
|
if (remaining <= 0) throw new Error("Renderer draft prewarm policy is unavailable");
|
|
@@ -994,13 +994,13 @@ export function installCurrentRendererAdapter(): {
|
|
|
994
994
|
): void => {
|
|
995
995
|
liveStatus.modelUpdates = modelUpdates;
|
|
996
996
|
transitionRendererAdapterStatus(liveStatus, { state, reason, hook }, () => {
|
|
997
|
-
window.dispatchEvent(new CustomEvent("
|
|
997
|
+
window.dispatchEvent(new CustomEvent("harnessmix:renderer-adapter-status"));
|
|
998
998
|
});
|
|
999
999
|
};
|
|
1000
1000
|
|
|
1001
1001
|
const usageSubscription = createThreadUsageSubscriptionRelay();
|
|
1002
1002
|
const requestRouteResolver = createRendererRequestRouteResolver(
|
|
1003
|
-
() => window.
|
|
1003
|
+
() => window.__harnessmixDraftPrewarmPolicyV1,
|
|
1004
1004
|
() => findActivePrewarmTargets(document),
|
|
1005
1005
|
);
|
|
1006
1006
|
const clientsByTarget = new WeakMap<
|
|
@@ -1060,7 +1060,7 @@ export function installCurrentRendererAdapter(): {
|
|
|
1060
1060
|
const route = currentRequestRoute();
|
|
1061
1061
|
if (route?.policy.hostId === hostId)
|
|
1062
1062
|
return modelClientForTargets(route.targets, route.policy);
|
|
1063
|
-
const policy = window.
|
|
1063
|
+
const policy = window.__harnessmixDraftPrewarmPolicyV1;
|
|
1064
1064
|
if (isDraftPrewarmPolicyReady(policy) && hasPolicyRequestTarget(policy)) return null;
|
|
1065
1065
|
const targets = rendererRequestTargetsForHost(findActivePrewarmTargets(document), hostId);
|
|
1066
1066
|
return modelClientForTargets(targets ?? []);
|
|
@@ -1140,7 +1140,7 @@ export function installCurrentRendererAdapter(): {
|
|
|
1140
1140
|
getClient: () => modelControl,
|
|
1141
1141
|
reportError: (error) => {
|
|
1142
1142
|
console.error(
|
|
1143
|
-
"
|
|
1143
|
+
"harnessmix external Thread Fork failed",
|
|
1144
1144
|
error instanceof Error ? error.name : "UnknownError",
|
|
1145
1145
|
);
|
|
1146
1146
|
},
|
|
@@ -1201,7 +1201,7 @@ export function installCurrentRendererAdapter(): {
|
|
|
1201
1201
|
};
|
|
1202
1202
|
if (!captureRoutingPolicy()) {
|
|
1203
1203
|
updateStatus("installing", "draft-routing-policy-unavailable", null);
|
|
1204
|
-
const policy = window.
|
|
1204
|
+
const policy = window.__harnessmixDraftPrewarmPolicyV1;
|
|
1205
1205
|
if (!isDraftPrewarmPolicyReady(policy) || !hasPolicyRequestTarget(policy)) {
|
|
1206
1206
|
startPolicyCapture();
|
|
1207
1207
|
}
|
|
@@ -1209,7 +1209,7 @@ export function installCurrentRendererAdapter(): {
|
|
|
1209
1209
|
const handleRoutingPolicyChange = (): void => {
|
|
1210
1210
|
stopPolicyRecapture();
|
|
1211
1211
|
if (captureRoutingPolicy()) return;
|
|
1212
|
-
const policy = window.
|
|
1212
|
+
const policy = window.__harnessmixDraftPrewarmPolicyV1;
|
|
1213
1213
|
if (isDraftPrewarmPolicyReady(policy) && hasPolicyRequestTarget(policy)) {
|
|
1214
1214
|
stopPolicyCapture();
|
|
1215
1215
|
}
|
|
@@ -1219,7 +1219,7 @@ export function installCurrentRendererAdapter(): {
|
|
|
1219
1219
|
startPolicyRecapture();
|
|
1220
1220
|
}
|
|
1221
1221
|
};
|
|
1222
|
-
window.addEventListener("
|
|
1222
|
+
window.addEventListener("harnessmix:draft-prewarm-policy-changed", handleRoutingPolicyChange);
|
|
1223
1223
|
|
|
1224
1224
|
const applyAgent = (
|
|
1225
1225
|
agent: RendererAgent,
|
|
@@ -1265,7 +1265,7 @@ export function installCurrentRendererAdapter(): {
|
|
|
1265
1265
|
stopPolicyCapture();
|
|
1266
1266
|
stopPolicyRecapture();
|
|
1267
1267
|
window.removeEventListener(
|
|
1268
|
-
"
|
|
1268
|
+
"harnessmix:draft-prewarm-policy-changed",
|
|
1269
1269
|
handleRoutingPolicyChange,
|
|
1270
1270
|
);
|
|
1271
1271
|
const activeRoutingPolicy = routingPolicy;
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
harnessModelRefSchema,
|
|
3
3
|
harnessPermissionModeIdSchema,
|
|
4
4
|
harnessThinkingOptionIdSchema,
|
|
5
|
-
} from "@
|
|
5
|
+
} from "@harnessmix/shared-contracts";
|
|
6
6
|
import { describe, expect, it, vi } from "vitest";
|
|
7
7
|
|
|
8
8
|
import { DraftAgentController } from "../src/index.js";
|
|
@@ -420,6 +420,65 @@ describe("Renderer draft Agent controller", () => {
|
|
|
420
420
|
});
|
|
421
421
|
});
|
|
422
422
|
|
|
423
|
+
it("carries a live draft selection when Codex re-derives the draft identity", async () => {
|
|
424
|
+
const composer = {};
|
|
425
|
+
const agents = controller();
|
|
426
|
+
const firstTarget = ["default", "client-new-thread:draft-a"] as const;
|
|
427
|
+
const reboundTarget = ["default", "client-new-thread:draft-b"] as const;
|
|
428
|
+
const model = harnessModelRefSchema.parse({ id: "kimi-k3-max" });
|
|
429
|
+
|
|
430
|
+
agents.mount(composer, firstTarget);
|
|
431
|
+
await agents.switchAgent(composer, "pi", {
|
|
432
|
+
applyAgent: () => true,
|
|
433
|
+
clearPrewarm: async () => undefined,
|
|
434
|
+
});
|
|
435
|
+
agents.setExternalModel(composer, "pi", model);
|
|
436
|
+
const liveState = agents.get(composer);
|
|
437
|
+
|
|
438
|
+
const rebound = agents.rebindTarget(composer, reboundTarget);
|
|
439
|
+
expect(rebound).toBe(liveState);
|
|
440
|
+
expect(rebound).toMatchObject({ agent: "pi", phase: "draft", piModel: model });
|
|
441
|
+
// The rebound identity is restorable: leaving and returning keeps it.
|
|
442
|
+
agents.rebindTarget(composer, ["conversation", "visited-thread", "local"]);
|
|
443
|
+
expect(agents.rebindTarget(composer, reboundTarget)).toBe(liveState);
|
|
444
|
+
});
|
|
445
|
+
|
|
446
|
+
it("keeps a pending submission across a draft identity rebind", async () => {
|
|
447
|
+
const composer = {};
|
|
448
|
+
const agents = controller();
|
|
449
|
+
agents.mount(composer, ["default", "client-new-thread:pending-a"]);
|
|
450
|
+
await agents.switchAgent(composer, "pi", {
|
|
451
|
+
applyAgent: () => true,
|
|
452
|
+
clearPrewarm: async () => undefined,
|
|
453
|
+
});
|
|
454
|
+
agents.markSubmissionPending(composer);
|
|
455
|
+
|
|
456
|
+
agents.rebindTarget(composer, ["default", "client-new-thread:pending-b"]);
|
|
457
|
+
expect(agents.isSubmissionPending(composer)).toBe(true);
|
|
458
|
+
// The pending draft still transfers onto the created conversation.
|
|
459
|
+
expect(agents.transfer(composer, composer, ["conversation", "created-thread"])).toBe(true);
|
|
460
|
+
expect(agents.get(composer)).toMatchObject({ agent: "pi", phase: "locked" });
|
|
461
|
+
});
|
|
462
|
+
|
|
463
|
+
it("still seeds an untouched rebound draft from the last submitted Agent", async () => {
|
|
464
|
+
const submitted = {};
|
|
465
|
+
const quiet = {};
|
|
466
|
+
const agents = controller();
|
|
467
|
+
agents.mount(submitted, ["default", "client-new-thread:submitted-a"]);
|
|
468
|
+
await agents.switchAgent(submitted, "pi", {
|
|
469
|
+
applyAgent: () => true,
|
|
470
|
+
clearPrewarm: async () => undefined,
|
|
471
|
+
});
|
|
472
|
+
agents.recordSubmission(submitted);
|
|
473
|
+
|
|
474
|
+
// A draft the user never configured follows the new-Thread seed even when
|
|
475
|
+
// Codex re-derives its identity underneath the same Composer element.
|
|
476
|
+
agents.mount(quiet, ["default", "client-new-thread:quiet-a"]);
|
|
477
|
+
const rebound = agents.rebindTarget(quiet, ["default", "client-new-thread:quiet-b"]);
|
|
478
|
+
expect(rebound).toMatchObject({ agent: "pi", phase: "draft" });
|
|
479
|
+
expect(rebound.composerId).not.toBe("composer-2");
|
|
480
|
+
});
|
|
481
|
+
|
|
423
482
|
it("does not revive a submitted draft after it becomes a conversation", async () => {
|
|
424
483
|
const composer = {};
|
|
425
484
|
const agents = controller();
|
|
@@ -2,7 +2,7 @@ import { describe, it, expect } from 'vitest';
|
|
|
2
2
|
import { readNewThreadAgentPreference, RENDERER_NEW_THREAD_PREFERENCE_KEY, readNewThreadExternalConfigurationPreference } from '../src/renderer-new-thread-preference.js';
|
|
3
3
|
import { createAgentGroupPreferenceStore, AGENT_GROUP_PREFERENCE_STORAGE_KEY } from '../src/agent-group-preference.js';
|
|
4
4
|
import { DEFAULT_RENDERER_AGENTS } from '../src/agent-selection-state.js';
|
|
5
|
-
import { harnessModelCatalogSchema } from '@
|
|
5
|
+
import { harnessModelCatalogSchema } from '@harnessmix/shared-contracts';
|
|
6
6
|
|
|
7
7
|
describe('CodeBuddy rename compatibility', () => {
|
|
8
8
|
it('keeps old last-agent, model and group preferences under the canonical name', () => {
|
|
@@ -251,7 +251,7 @@ describe("Renderer Agent picker presentation", () => {
|
|
|
251
251
|
expect(isNativeModelControlCandidate(element([], true, false))).toBe(false);
|
|
252
252
|
expect(isNativeModelControlCandidate(element([], false, true))).toBe(false);
|
|
253
253
|
expect(
|
|
254
|
-
isNativeModelControlCandidate(element(["data-
|
|
254
|
+
isNativeModelControlCandidate(element(["data-harnessmix-agent-control"], true, true)),
|
|
255
255
|
).toBe(false);
|
|
256
256
|
});
|
|
257
257
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { harnessIdSchema } from "@
|
|
2
|
-
import { harnessModelRefSchema } from "@
|
|
1
|
+
import { harnessIdSchema } from "@harnessmix/shared-contracts";
|
|
2
|
+
import { harnessModelRefSchema } from "@harnessmix/shared-contracts";
|
|
3
3
|
import { afterEach, assert, describe, expect, it, vi } from "vitest";
|
|
4
4
|
|
|
5
5
|
import type * as RendererComposerDom from "../src/renderer-composer-dom.js";
|
|
@@ -21,6 +21,7 @@ const testState = vi.hoisted(() => ({
|
|
|
21
21
|
getSessionImportClient: null as null | (() => RendererSessionImportClient | null),
|
|
22
22
|
documentListeners: new Map<string, EventListener>(),
|
|
23
23
|
modelTarget: ["conversation", "thread-a"] as readonly unknown[],
|
|
24
|
+
prepareMentions: vi.fn(),
|
|
24
25
|
}));
|
|
25
26
|
|
|
26
27
|
vi.mock("../src/renderer-composer-dom.js", async (importOriginal) => {
|
|
@@ -89,7 +90,11 @@ vi.mock("../src/renderer-sidebar-agent-icons.js", () => ({
|
|
|
89
90
|
}));
|
|
90
91
|
|
|
91
92
|
vi.mock("../src/renderer-harness-mentions.js", () => ({
|
|
92
|
-
installHarnessMentions: () => ({ dispose: vi.fn() }),
|
|
93
|
+
installHarnessMentions: () => ({ prepareSubmission: testState.prepareMentions, dispose: vi.fn() }),
|
|
94
|
+
}));
|
|
95
|
+
|
|
96
|
+
vi.mock("../src/renderer-team-cards.js", () => ({
|
|
97
|
+
installTeamCards: () => ({ dispose: vi.fn() }),
|
|
93
98
|
}));
|
|
94
99
|
|
|
95
100
|
vi.mock("../src/harness-mix-settings.js", () => ({
|
|
@@ -216,9 +221,9 @@ function installFakeBrowser(): void {
|
|
|
216
221
|
afterEach(() => {
|
|
217
222
|
const api = (
|
|
218
223
|
globalThis.window as unknown as {
|
|
219
|
-
|
|
224
|
+
__harnessmixRendererBindingProbeV1?: { dispose(): void };
|
|
220
225
|
}
|
|
221
|
-
).
|
|
226
|
+
).__harnessmixRendererBindingProbeV1;
|
|
222
227
|
api?.dispose();
|
|
223
228
|
vi.unstubAllGlobals();
|
|
224
229
|
vi.clearAllMocks();
|
|
@@ -245,7 +250,7 @@ describe("Renderer binding Host-scoped Claude catalogs", () => {
|
|
|
245
250
|
owner: "external" as const,
|
|
246
251
|
harnessId: "claude-code",
|
|
247
252
|
transportModelId:
|
|
248
|
-
"
|
|
253
|
+
"harnessmix/claude-code-native@claude-model-v1.b3B1cw@bypassPermissions@auto",
|
|
249
254
|
effectiveModel: oldModel,
|
|
250
255
|
history: { fork: true, forkAcrossCwd: false, rollbackLastTurn: true },
|
|
251
256
|
locked: true,
|
|
@@ -345,6 +350,7 @@ describe("Renderer binding Host-scoped Claude catalogs", () => {
|
|
|
345
350
|
expect(host.selectThreadModel).toHaveBeenCalledTimes(2);
|
|
346
351
|
expect(probe.lockedSelection()?.model).toEqual(newModel);
|
|
347
352
|
expectSubmissionBlocked(false);
|
|
353
|
+
expect(testState.prepareMentions).toHaveBeenCalledExactlyOnceWith(testState.composer);
|
|
348
354
|
expect(applyAgent).not.toHaveBeenCalled();
|
|
349
355
|
});
|
|
350
356
|
|
|
@@ -494,7 +500,7 @@ describe("Renderer binding Host-scoped Claude catalogs", () => {
|
|
|
494
500
|
owner: "external" as const,
|
|
495
501
|
harnessId: "claude-code",
|
|
496
502
|
transportModelId:
|
|
497
|
-
"
|
|
503
|
+
"harnessmix/claude-code-native@claude-model-v1.b3B1cw@bypassPermissions@auto",
|
|
498
504
|
effectiveModel: harnessModelRefSchema.parse({ id: "claude-model-v1.b3B1cw" }),
|
|
499
505
|
history: { fork: true, forkAcrossCwd: false, rollbackLastTurn: true },
|
|
500
506
|
locked: true,
|
|
@@ -564,7 +570,7 @@ describe("Renderer binding Host-scoped Claude catalogs", () => {
|
|
|
564
570
|
owner: "external" as const,
|
|
565
571
|
harnessId: "claude-code",
|
|
566
572
|
transportModelId:
|
|
567
|
-
"
|
|
573
|
+
"harnessmix/claude-code-native@claude-model-v1.b3B1cw@bypassPermissions@auto",
|
|
568
574
|
effectiveModel: harnessModelRefSchema.parse({ id: "claude-model-v1.b3B1cw" }),
|
|
569
575
|
history: { fork: true, forkAcrossCwd: false, rollbackLastTurn: true },
|
|
570
576
|
locked: true,
|
|
@@ -663,7 +669,7 @@ describe("Renderer binding Host-scoped Claude catalogs", () => {
|
|
|
663
669
|
owner: "external" as const,
|
|
664
670
|
harnessId: "claude-code",
|
|
665
671
|
transportModelId:
|
|
666
|
-
"
|
|
672
|
+
"harnessmix/claude-code-native@claude-model-v1.b3B1cw@bypassPermissions@auto",
|
|
667
673
|
effectiveModel: harnessModelRefSchema.parse({ id: "claude-model-v1.b3B1cw" }),
|
|
668
674
|
history: { fork: true, forkAcrossCwd: false, rollbackLastTurn: true },
|
|
669
675
|
locked: true,
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
harnessPermissionModeIdSchema,
|
|
6
6
|
harnessThinkingOptionIdSchema,
|
|
7
7
|
decodeHarnessPluginRoute,
|
|
8
|
-
} from "@
|
|
8
|
+
} from "@harnessmix/shared-contracts";
|
|
9
9
|
import { describe, expect, it, vi } from "vitest";
|
|
10
10
|
import { modelSelectionForAgent } from "../src/versioned-renderer-adapter.js";
|
|
11
11
|
|
|
@@ -624,13 +624,13 @@ describe("Renderer Composer DOM behavior", () => {
|
|
|
624
624
|
expect(placeCredits).toHaveBeenCalledWith(permissionModeRoot);
|
|
625
625
|
});
|
|
626
626
|
|
|
627
|
-
it("does not treat
|
|
627
|
+
it("does not treat harnessmix Usage controls as native anchors", () => {
|
|
628
628
|
const usage = {
|
|
629
|
-
hasAttribute: (name: string) => name === "data-
|
|
629
|
+
hasAttribute: (name: string) => name === "data-harnessmix-usage-control",
|
|
630
630
|
getAttribute: () => "Context window usage",
|
|
631
631
|
} as unknown as HTMLElement;
|
|
632
632
|
const credits = {
|
|
633
|
-
hasAttribute: (name: string) => name === "data-
|
|
633
|
+
hasAttribute: (name: string) => name === "data-harnessmix-credits-control",
|
|
634
634
|
getAttribute: () => "Weekly limit",
|
|
635
635
|
} as unknown as HTMLElement;
|
|
636
636
|
expect(isNativeContextUsageControlCandidate(usage)).toBe(false);
|
|
@@ -932,7 +932,7 @@ describe("Renderer Composer DOM behavior", () => {
|
|
|
932
932
|
restoredThreadOwnership({
|
|
933
933
|
owner: "external",
|
|
934
934
|
harnessId: "pi",
|
|
935
|
-
transportModelId: "
|
|
935
|
+
transportModelId: "harnessmix/pi-native",
|
|
936
936
|
history: { fork: true, forkAcrossCwd: true, rollbackLastTurn: false },
|
|
937
937
|
effectiveModel: model,
|
|
938
938
|
effectiveThinkingOptionId: thinkingOptionId,
|
|
@@ -947,7 +947,7 @@ describe("Renderer Composer DOM behavior", () => {
|
|
|
947
947
|
restoredThreadOwnership({
|
|
948
948
|
owner: "external",
|
|
949
949
|
harnessId: "pi",
|
|
950
|
-
transportModelId: `
|
|
950
|
+
transportModelId: `harnessmix/pi-native@${model.id}@${thinkingOptionId}`,
|
|
951
951
|
history: { fork: true, forkAcrossCwd: true, rollbackLastTurn: false },
|
|
952
952
|
locked: true,
|
|
953
953
|
}),
|
|
@@ -959,7 +959,7 @@ describe("Renderer Composer DOM behavior", () => {
|
|
|
959
959
|
restoredThreadOwnership({
|
|
960
960
|
owner: "external",
|
|
961
961
|
harnessId: "claude-code",
|
|
962
|
-
transportModelId: "
|
|
962
|
+
transportModelId: "harnessmix/claude-code-native@claude-model-v1.c29ubmV0@acceptEdits@high",
|
|
963
963
|
history: { fork: true, forkAcrossCwd: false, rollbackLastTurn: false },
|
|
964
964
|
effectiveModel: harnessModelRefSchema.parse({ id: "claude-model-v1.c29ubmV0" }),
|
|
965
965
|
effectiveThinkingOptionId: thinkingOptionId,
|
|
@@ -979,7 +979,7 @@ describe("Renderer Composer DOM behavior", () => {
|
|
|
979
979
|
owner: "external",
|
|
980
980
|
harnessId: "opencode",
|
|
981
981
|
transportModelId:
|
|
982
|
-
"
|
|
982
|
+
"harnessmix/opencode-native@opencode-model-v1.WyJwcm92aWRlci0xIiwibW9kZWwtMSJd@ask@ocv.aGlnaA",
|
|
983
983
|
history: { fork: true, forkAcrossCwd: false, rollbackLastTurn: true },
|
|
984
984
|
effectiveModel: harnessModelRefSchema.parse({
|
|
985
985
|
id: "opencode-model-v1.WyJwcm92aWRlci0xIiwibW9kZWwtMSJd",
|
|
@@ -1001,7 +1001,7 @@ describe("Renderer Composer DOM behavior", () => {
|
|
|
1001
1001
|
restoredThreadOwnership({
|
|
1002
1002
|
owner: "external",
|
|
1003
1003
|
harnessId: "omp",
|
|
1004
|
-
transportModelId: "
|
|
1004
|
+
transportModelId: "harnessmix/omp-native@omp-model-v1.synthetic@write@high",
|
|
1005
1005
|
history: { fork: true, forkAcrossCwd: true, rollbackLastTurn: true },
|
|
1006
1006
|
effectiveModel: harnessModelRefSchema.parse({ id: "omp-model-v1.synthetic" }),
|
|
1007
1007
|
effectiveThinkingOptionId: thinkingOptionId,
|
|
@@ -1019,7 +1019,7 @@ describe("Renderer Composer DOM behavior", () => {
|
|
|
1019
1019
|
restoredThreadOwnership({
|
|
1020
1020
|
owner: "external",
|
|
1021
1021
|
harnessId: "grok",
|
|
1022
|
-
transportModelId: "
|
|
1022
|
+
transportModelId: "harnessmix/grok-native@grok-4.6@auto@high",
|
|
1023
1023
|
history: { fork: true, forkAcrossCwd: true, rollbackLastTurn: true },
|
|
1024
1024
|
effectiveModel: harnessModelRefSchema.parse({ id: "grok-4.6" }),
|
|
1025
1025
|
effectiveThinkingOptionId: thinkingOptionId,
|
|
@@ -1037,7 +1037,7 @@ describe("Renderer Composer DOM behavior", () => {
|
|
|
1037
1037
|
restoredThreadOwnership({
|
|
1038
1038
|
owner: "external",
|
|
1039
1039
|
harnessId: "grok",
|
|
1040
|
-
transportModelId: "
|
|
1040
|
+
transportModelId: "harnessmix/grok-native@grok-4.6@always-approve",
|
|
1041
1041
|
history: { fork: true, forkAcrossCwd: true, rollbackLastTurn: true },
|
|
1042
1042
|
locked: true,
|
|
1043
1043
|
}),
|
|
@@ -1050,7 +1050,7 @@ describe("Renderer Composer DOM behavior", () => {
|
|
|
1050
1050
|
restoredThreadOwnership({
|
|
1051
1051
|
owner: "external",
|
|
1052
1052
|
harnessId: "claude-code",
|
|
1053
|
-
transportModelId: "
|
|
1053
|
+
transportModelId: "harnessmix/claude-code-native@claude-model-v1.c29ubmV0@acceptEdits",
|
|
1054
1054
|
history: { fork: true, forkAcrossCwd: false, rollbackLastTurn: false },
|
|
1055
1055
|
locked: true,
|
|
1056
1056
|
}),
|
|
@@ -1064,7 +1064,7 @@ describe("Renderer Composer DOM behavior", () => {
|
|
|
1064
1064
|
owner: "external",
|
|
1065
1065
|
harnessId: "deepseek-harness",
|
|
1066
1066
|
transportModelId:
|
|
1067
|
-
"
|
|
1067
|
+
"harnessmix/deepseek-harness-native@deepseek-harness-model-v1.Zmxhc2g@team-safe",
|
|
1068
1068
|
history: { fork: false, forkAcrossCwd: false, rollbackLastTurn: false },
|
|
1069
1069
|
effectiveModel: harnessModelRefSchema.parse({
|
|
1070
1070
|
id: "deepseek-harness-model-v1.Zmxhc2g",
|
|
@@ -1081,7 +1081,7 @@ describe("Renderer Composer DOM behavior", () => {
|
|
|
1081
1081
|
restoredThreadOwnership({
|
|
1082
1082
|
owner: "external",
|
|
1083
1083
|
harnessId: "antigravity",
|
|
1084
|
-
transportModelId: "
|
|
1084
|
+
transportModelId: "harnessmix/antigravity-native@gpt-5.6-sol@configured@high",
|
|
1085
1085
|
history: { fork: false, forkAcrossCwd: false, rollbackLastTurn: false },
|
|
1086
1086
|
locked: true,
|
|
1087
1087
|
}),
|
|
@@ -1207,7 +1207,7 @@ describe("Renderer Composer DOM behavior", () => {
|
|
|
1207
1207
|
restoredThreadOwnership({
|
|
1208
1208
|
owner: "external",
|
|
1209
1209
|
harnessId: "pi",
|
|
1210
|
-
transportModelId: `
|
|
1210
|
+
transportModelId: `harnessmix/pi-native@${model.id}`,
|
|
1211
1211
|
history: { fork: true, forkAcrossCwd: true, rollbackLastTurn: false },
|
|
1212
1212
|
effectiveModel: model,
|
|
1213
1213
|
effectiveThinkingOptionId: harnessThinkingOptionIdSchema.parse("high"),
|
|
@@ -38,7 +38,7 @@ describe("Host-scoped Codex Account state", () => {
|
|
|
38
38
|
expect(second).toBe(first);
|
|
39
39
|
response.resolve({ accounts: [account("default", true)] });
|
|
40
40
|
await first;
|
|
41
|
-
expect(sendRequest).toHaveBeenCalledExactlyOnceWith("
|
|
41
|
+
expect(sendRequest).toHaveBeenCalledExactlyOnceWith("harnessmix/account/list", {});
|
|
42
42
|
expect(state.selection.selectedAccountId).toBe("default");
|
|
43
43
|
});
|
|
44
44
|
|
|
@@ -6,7 +6,7 @@ function nativePermissionButton(
|
|
|
6
6
|
options: {
|
|
7
7
|
target?: string;
|
|
8
8
|
includeOwner?: boolean;
|
|
9
|
-
|
|
9
|
+
harnessmix?: boolean;
|
|
10
10
|
hasMenu?: boolean;
|
|
11
11
|
} = {},
|
|
12
12
|
): Element {
|
|
@@ -15,7 +15,7 @@ function nativePermissionButton(
|
|
|
15
15
|
["data-composer-navigation-target", target],
|
|
16
16
|
["aria-haspopup", options.hasMenu === false ? "dialog" : "menu"],
|
|
17
17
|
]);
|
|
18
|
-
if (options.
|
|
18
|
+
if (options.harnessmix) attributes.set("data-harnessmix-permission-mode-control", "composer-1");
|
|
19
19
|
const owner =
|
|
20
20
|
options.includeOwner === false
|
|
21
21
|
? null
|
|
@@ -67,9 +67,9 @@ describe("versioned native Permission Mode control ownership", () => {
|
|
|
67
67
|
);
|
|
68
68
|
});
|
|
69
69
|
|
|
70
|
-
it("never recaptures the
|
|
70
|
+
it("never recaptures the harnessmix replacement control", () => {
|
|
71
71
|
expect(
|
|
72
|
-
isNativePermissionModeControlCandidate(nativePermissionButton({
|
|
72
|
+
isNativePermissionModeControlCandidate(nativePermissionButton({ harnessmix: true })),
|
|
73
73
|
).toBe(false);
|
|
74
74
|
});
|
|
75
75
|
});
|
|
@@ -9,7 +9,7 @@ class RpcTarget {}
|
|
|
9
9
|
class Manager extends RpcTarget {
|
|
10
10
|
readonly #identity = "local";
|
|
11
11
|
readonly requests = vi.fn(async (method: unknown) => {
|
|
12
|
-
if (method === "
|
|
12
|
+
if (method === "harnessmix/thread/ownership/list") {
|
|
13
13
|
return {
|
|
14
14
|
threads: [
|
|
15
15
|
{
|
|
@@ -120,7 +120,7 @@ describe("Desktop RpcTarget method visibility", () => {
|
|
|
120
120
|
});
|
|
121
121
|
expect(manager.presented).toHaveLength(1);
|
|
122
122
|
expect(manager.requests.mock.calls.map(([method]) => method)).toEqual([
|
|
123
|
-
"
|
|
123
|
+
"harnessmix/thread/ownership/list",
|
|
124
124
|
"turn/steer",
|
|
125
125
|
]);
|
|
126
126
|
} finally {
|
|
@@ -16,7 +16,7 @@ function fixture(owner: "external" | "codex" = "external") {
|
|
|
16
16
|
const rpc = vi.fn(
|
|
17
17
|
async (method: unknown, params: unknown, options?: unknown): Promise<unknown> => {
|
|
18
18
|
void options;
|
|
19
|
-
if (method === "
|
|
19
|
+
if (method === "harnessmix/thread/ownership/list") {
|
|
20
20
|
return {
|
|
21
21
|
threads: [
|
|
22
22
|
{ threadId: "thread", owner, ...(owner === "external" ? { harnessId: "pi" } : {}) },
|
|
@@ -235,7 +235,7 @@ describe("external direction changes use normal Desktop start presentation", ()
|
|
|
235
235
|
f.dispose();
|
|
236
236
|
waiting.resolve(undefined);
|
|
237
237
|
await expect(result).rejects.toThrow("disposed");
|
|
238
|
-
expect(f.rpc.mock.calls.map(([method]) => method)).toEqual(["
|
|
238
|
+
expect(f.rpc.mock.calls.map(([method]) => method)).toEqual(["harnessmix/thread/ownership/list"]);
|
|
239
239
|
});
|
|
240
240
|
|
|
241
241
|
it("resumes automatically paused queue messages without unpausing older paused entries", async () => {
|
|
@@ -268,7 +268,7 @@ describe("external direction changes use normal Desktop start presentation", ()
|
|
|
268
268
|
await expect(f.manager.steerTurn(...f.args)).rejects.toThrow("ownership unavailable");
|
|
269
269
|
expect(f.originalSteer).not.toHaveBeenCalled();
|
|
270
270
|
f.rpc.mockImplementation(async (method) => {
|
|
271
|
-
if (method === "
|
|
271
|
+
if (method === "harnessmix/thread/ownership/list")
|
|
272
272
|
return { threads: [{ threadId: "thread", owner: "external", harnessId: "pi" }] };
|
|
273
273
|
throw new Error("cancel failed");
|
|
274
274
|
});
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
hostThreadIdSchema,
|
|
3
3
|
hostTurnIdSchema,
|
|
4
4
|
type ThreadInspection,
|
|
5
|
-
} from "@
|
|
5
|
+
} from "@harnessmix/shared-contracts";
|
|
6
6
|
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
7
7
|
|
|
8
8
|
import {
|
|
@@ -279,7 +279,7 @@ describe("Renderer external Thread Fork control", () => {
|
|
|
279
279
|
const client = clientWith({
|
|
280
280
|
owner: "external",
|
|
281
281
|
harnessId: "pi",
|
|
282
|
-
transportModelId: "
|
|
282
|
+
transportModelId: "harnessmix/pi-native",
|
|
283
283
|
history: { fork: true, forkAcrossCwd: true, rollbackLastTurn: false },
|
|
284
284
|
locked: true,
|
|
285
285
|
});
|
|
@@ -302,7 +302,7 @@ describe("Renderer external Thread Fork control", () => {
|
|
|
302
302
|
const client = clientWith({
|
|
303
303
|
owner: "external",
|
|
304
304
|
harnessId: "pi",
|
|
305
|
-
transportModelId: "
|
|
305
|
+
transportModelId: "harnessmix/pi-native",
|
|
306
306
|
history: { fork: true, forkAcrossCwd: true, rollbackLastTurn: false },
|
|
307
307
|
locked: true,
|
|
308
308
|
});
|
|
@@ -322,7 +322,7 @@ describe("Renderer external Thread Fork control", () => {
|
|
|
322
322
|
const client = clientWith({
|
|
323
323
|
owner: "external",
|
|
324
324
|
harnessId: "claude-code",
|
|
325
|
-
transportModelId: "
|
|
325
|
+
transportModelId: "harnessmix/claude-code-native",
|
|
326
326
|
history: { fork: true, forkAcrossCwd: false, rollbackLastTurn: false },
|
|
327
327
|
locked: true,
|
|
328
328
|
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
harnessCommandDescriptorSchema,
|
|
3
3
|
type HarnessCommandDescriptor,
|
|
4
|
-
} from "@
|
|
4
|
+
} from "@harnessmix/shared-contracts";
|
|
5
5
|
import { describe, expect, it, vi } from "vitest";
|
|
6
6
|
|
|
7
7
|
import { routeRendererHarnessCommandSelection } from "../src/renderer-harness-command-claim.js";
|