@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
|
@@ -31,8 +31,8 @@ const externalId = id => ({ workbuddy: 'codebuddy', claude: 'claude-code', dsh:
|
|
|
31
31
|
const { errorActions } = require('../harness-adapter/error-kind');
|
|
32
32
|
const modelRef = model => ({ id: Buffer.from(JSON.stringify({ id: model.id, provider: model.provider })).toString('base64url') });
|
|
33
33
|
const routeModel = harnessId => ['pi', 'claude-code', 'deepseek-harness', 'antigravity', 'omp', 'opencode', 'grok'].includes(harnessId)
|
|
34
|
-
? `
|
|
35
|
-
: `
|
|
34
|
+
? `harnessmix/${harnessId}-native`
|
|
35
|
+
: `harnessmix/plugin-v1@${Buffer.from(JSON.stringify({ harnessId })).toString('hex')}`;
|
|
36
36
|
const terminal = status => ['completed', 'cancelled', 'error', 'failed'].includes(status);
|
|
37
37
|
const turnStatus = status => ({ cancelled: 'interrupted', error: 'failed', failed: 'failed', completed: 'completed' }[status] || 'inProgress');
|
|
38
38
|
const HARNESS_INSTALL_COMMANDS = {
|
|
@@ -114,14 +114,14 @@ function decodePositional(harnessId, fields, parts) {
|
|
|
114
114
|
|
|
115
115
|
function decodeRoute(model) {
|
|
116
116
|
if (typeof model !== 'string') return null;
|
|
117
|
-
if (model.startsWith('
|
|
118
|
-
const hex = model.slice('
|
|
117
|
+
if (model.startsWith('harnessmix/plugin-v1@')) {
|
|
118
|
+
const hex = model.slice('harnessmix/plugin-v1@'.length);
|
|
119
119
|
if (model.length > 4096 || !/^(?:[a-f0-9]{2})+$/.test(hex)) throw new Error('Invalid native Harness route');
|
|
120
120
|
const route = JSON.parse(Buffer.from(hex, 'hex').toString());
|
|
121
121
|
if (!route.harnessId || route.harnessId === 'codex') throw new Error('Invalid external Harness');
|
|
122
122
|
return route;
|
|
123
123
|
}
|
|
124
|
-
const legacy = /^
|
|
124
|
+
const legacy = /^harnessmix\/(pi|claude-code|deepseek-harness|antigravity|omp|opencode|grok)-native(?:@(.+))?$/.exec(model);
|
|
125
125
|
if (!legacy) return null;
|
|
126
126
|
return legacy[2] === undefined ? { harnessId: legacy[1] } : decodeLegacySuffix(legacy[1], legacy[2]);
|
|
127
127
|
}
|
|
@@ -260,7 +260,7 @@ class NativeProtocol {
|
|
|
260
260
|
this.emit = emit;
|
|
261
261
|
this.requestOfficial = requestOfficial;
|
|
262
262
|
this.codexAccounts = new CodexAccountManager({
|
|
263
|
-
dataDirectory: nativeEnvironment().
|
|
263
|
+
dataDirectory: nativeEnvironment().HARNESSMIX_DATA_DIR,
|
|
264
264
|
requestOfficial,
|
|
265
265
|
emit,
|
|
266
266
|
});
|
|
@@ -317,16 +317,16 @@ class NativeProtocol {
|
|
|
317
317
|
items: this.runtime.core.getItemsForTurn(turn.id).map(projectItem).filter(Boolean) };
|
|
318
318
|
}
|
|
319
319
|
projectThread(thread, includeTurns = true) {
|
|
320
|
-
// Projection shape mirrors the upstream
|
|
320
|
+
// Projection shape mirrors the upstream harnessmix external-thread contract: every
|
|
321
321
|
// field the Desktop sidebar/composer reads must be present with the same defaults.
|
|
322
322
|
const updatedAt = Math.floor((thread.updatedAt || thread.createdAt) / 1000);
|
|
323
323
|
return { id: thread.id, preview: thread.messages?.find(m => m.role === 'user')?.text || thread.preview || thread.title,
|
|
324
|
-
ephemeral: thread.ephemeral === true, modelProvider: '
|
|
324
|
+
ephemeral: thread.ephemeral === true, modelProvider: 'harnessmix', model: routeModel(externalId(thread.harnessId)), reasoningEffort: null,
|
|
325
325
|
section: thread.section ?? null, sectionEnteredAt: thread.sectionEnteredAt ?? null, projectId: thread.projectId ?? null,
|
|
326
326
|
createdAt: Math.floor(thread.createdAt / 1000),
|
|
327
327
|
updatedAt, recencyAt: updatedAt,
|
|
328
328
|
status: { type: thread.status === 'working' ? 'active' : 'idle', ...(thread.status === 'working' ? { activeFlags: [] } : {}) },
|
|
329
|
-
path: null, cwd: thread.cwd, cliVersion: '
|
|
329
|
+
path: null, cwd: thread.cwd, cliVersion: 'harnessmix', source: 'vscode', threadSource: null,
|
|
330
330
|
name: thread.title || null, agentNickname: thread.parentThreadId ? this.runtime.adapters.get(thread.harnessId)?.manifest.name || thread.harnessId : null,
|
|
331
331
|
agentRole: thread.parentThreadId ? 'worker' : null, gitInfo: thread.gitInfo || null,
|
|
332
332
|
sessionId: thread.id, forkedFromId: thread.forkedFrom ?? null, parentThreadId: thread.parentThreadId ?? null,
|
|
@@ -345,11 +345,12 @@ class NativeProtocol {
|
|
|
345
345
|
workspace: thread.workspace ? { mode: thread.workspace.mode, branch: thread.workspace.branch, root: thread.workspace.root } : null,
|
|
346
346
|
turns: includeTurns ? this.runtime.core.turns.turnsForThread(thread.id).map(t => this.turn(t)) : [] };
|
|
347
347
|
}
|
|
348
|
-
capabilities(id, catalog) {
|
|
349
|
-
const cap = this.runtime.getCapabilities(id);
|
|
350
|
-
return { configuration: { selectModel: Boolean(cap.model?.selection), selectThinkingOption: Boolean(cap.model?.thinkingLevel),
|
|
351
|
-
selectPermissionMode: Boolean(catalog.permissionModes?.length), permissionModeScope: 'live' },
|
|
352
|
-
history: { fork: Boolean(cap.session?.fork), forkAcrossCwd: false, rollbackLastTurn: Boolean(cap.session?.forkFromMessage) }
|
|
348
|
+
capabilities(id, catalog) {
|
|
349
|
+
const cap = this.runtime.getCapabilities(id);
|
|
350
|
+
return { configuration: { selectModel: Boolean(cap.model?.selection), selectThinkingOption: Boolean(cap.model?.thinkingLevel),
|
|
351
|
+
selectPermissionMode: Boolean(catalog.permissionModes?.length), permissionModeScope: 'live' },
|
|
352
|
+
history: { fork: Boolean(cap.session?.fork), forkAcrossCwd: false, rollbackLastTurn: Boolean(cap.session?.forkFromMessage) },
|
|
353
|
+
workspace: { git: true, worktree: true, finalDiff: true, nativeDiff: Boolean(cap.workspace?.nativeDiff), nativePatch: Boolean(cap.workspace?.nativePatch) } };
|
|
353
354
|
}
|
|
354
355
|
async inspect(id) {
|
|
355
356
|
const local = ALIASES[id] || id;
|
|
@@ -431,24 +432,24 @@ class NativeProtocol {
|
|
|
431
432
|
return model;
|
|
432
433
|
}
|
|
433
434
|
async request(method, params = {}) {
|
|
434
|
-
if (method === '
|
|
435
|
-
if (method === '
|
|
436
|
-
if (method === '
|
|
437
|
-
if (method === '
|
|
438
|
-
if (method === '
|
|
439
|
-
if (method === '
|
|
440
|
-
if (method === '
|
|
441
|
-
if (method === '
|
|
442
|
-
if (method === '
|
|
435
|
+
if (method === 'harnessmix/integrations/catalog') return this.runtime.integrations.catalog();
|
|
436
|
+
if (method === 'harnessmix/integrations/list') return this.runtime.integrations.list(params);
|
|
437
|
+
if (method === 'harnessmix/integrations/mcp/save') return this.runtime.integrations.save(params);
|
|
438
|
+
if (method === 'harnessmix/integrations/mcp/remove') return this.runtime.integrations.remove(params);
|
|
439
|
+
if (method === 'harnessmix/integrations/skill/change') return this.runtime.integrations.skillChange(params);
|
|
440
|
+
if (method === 'harnessmix/harness/session-import/sources') return this.runtime.history.sources();
|
|
441
|
+
if (method === 'harnessmix/harness/session-import/list') return this.runtime.history.list(params);
|
|
442
|
+
if (method === 'harnessmix/harness/session-import/import') return this.runtime.history.import(params);
|
|
443
|
+
if (method === 'harnessmix/collaboration/agents') return [...this.runtime.adapters.values()].map(a => ({ id: externalId(a.manifest.id), name: a.manifest.name, available: !!this.runtime.status[a.manifest.id]?.available, lead: a.manifest.capabilities?.collaborationTools === true }));
|
|
443
444
|
// 桌宠市场:官方预载(Codex 安装包 asar 提取)与 ~/.codex/pets 安装管理
|
|
444
|
-
if (method === '
|
|
445
|
-
if (method === '
|
|
446
|
-
if (method === '
|
|
447
|
-
if (method === '
|
|
448
|
-
if (method === '
|
|
445
|
+
if (method === 'harnessmix/pets/catalog') return this.pets.catalog();
|
|
446
|
+
if (method === 'harnessmix/pets/community') return this.pets.community(params);
|
|
447
|
+
if (method === 'harnessmix/pets/preview') return this.pets.preview(params);
|
|
448
|
+
if (method === 'harnessmix/pets/install') return this.pets.install(params);
|
|
449
|
+
if (method === 'harnessmix/pets/uninstall') return this.pets.uninstall(params);
|
|
449
450
|
const thread = this.thread(params.threadId);
|
|
450
451
|
// 失败回合分类查询:Renderer 据此在输入框下方渲染只真正帮得上忙的动作按钮
|
|
451
|
-
if (method === '
|
|
452
|
+
if (method === 'harnessmix/harness/turn-error') {
|
|
452
453
|
if (!thread) throw new Error('Unknown thread');
|
|
453
454
|
const kind = thread.errorKind ?? null;
|
|
454
455
|
const meta = HARNESS_AUTH_INFO[externalId(thread.harnessId)] || HARNESS_AUTH_INFO[thread.harnessId];
|
|
@@ -477,8 +478,8 @@ class NativeProtocol {
|
|
|
477
478
|
return { version };
|
|
478
479
|
}
|
|
479
480
|
// Updates
|
|
480
|
-
if (method === '
|
|
481
|
-
const dataDir = nativeEnvironment().
|
|
481
|
+
if (method === 'harnessmix/update/check') {
|
|
482
|
+
const dataDir = nativeEnvironment().HARNESSMIX_DATA_DIR;
|
|
482
483
|
let currentVersion = '0.1.2';
|
|
483
484
|
try {
|
|
484
485
|
currentVersion = JSON.parse(fs.readFileSync(PACKAGE_JSON_PATH, 'utf8')).version || '0.1.2';
|
|
@@ -528,8 +529,8 @@ class NativeProtocol {
|
|
|
528
529
|
error: checkError ? `更新检查失败: ${checkError.slice(0, 450)}` : null,
|
|
529
530
|
};
|
|
530
531
|
}
|
|
531
|
-
if (method === '
|
|
532
|
-
const dataDir = nativeEnvironment().
|
|
532
|
+
if (method === 'harnessmix/update/start') {
|
|
533
|
+
const dataDir = nativeEnvironment().HARNESSMIX_DATA_DIR;
|
|
533
534
|
const channel = detectChannel(REPO_ROOT);
|
|
534
535
|
let currentVersion = '0.1.2';
|
|
535
536
|
try { currentVersion = JSON.parse(fs.readFileSync(PACKAGE_JSON_PATH, 'utf8')).version || '0.1.2'; } catch {}
|
|
@@ -561,8 +562,8 @@ class NativeProtocol {
|
|
|
561
562
|
};
|
|
562
563
|
}
|
|
563
564
|
}
|
|
564
|
-
if (method === '
|
|
565
|
-
const dataDir = nativeEnvironment().
|
|
565
|
+
if (method === 'harnessmix/update/status') {
|
|
566
|
+
const dataDir = nativeEnvironment().HARNESSMIX_DATA_DIR;
|
|
566
567
|
const state = readState(dataDir);
|
|
567
568
|
const channel = detectChannel(REPO_ROOT);
|
|
568
569
|
let currentVersion = '0.1.2';
|
|
@@ -583,21 +584,21 @@ class NativeProtocol {
|
|
|
583
584
|
|
|
584
585
|
// Each extra Account is an isolated native CODEX_HOME. Harness Mix stores
|
|
585
586
|
// only the profile label/path; auth.json and token refresh remain owned by Codex.
|
|
586
|
-
if (method === '
|
|
587
|
-
if (method === '
|
|
588
|
-
if (method === '
|
|
589
|
-
if (method === '
|
|
590
|
-
if (method === '
|
|
591
|
-
if (method === '
|
|
592
|
-
if (method === '
|
|
593
|
-
if (method === '
|
|
594
|
-
if (method === '
|
|
587
|
+
if (method === 'harnessmix/account/list') return this.codexAccounts.list(false);
|
|
588
|
+
if (method === 'harnessmix/account/refresh') return this.codexAccounts.list(true);
|
|
589
|
+
if (method === 'harnessmix/account/create') return this.codexAccounts.create(params.label);
|
|
590
|
+
if (method === 'harnessmix/account/delete') return this.codexAccounts.delete(params.accountId);
|
|
591
|
+
if (method === 'harnessmix/account/activate') return this.codexAccounts.activate(params.accountId);
|
|
592
|
+
if (method === 'harnessmix/account/usage/inspect') return this.codexAccounts.usage(params.accountId);
|
|
593
|
+
if (method === 'harnessmix/account/login/start') return this.codexAccounts.startLogin(params.accountId);
|
|
594
|
+
if (method === 'harnessmix/account/login/cancel') return this.codexAccounts.cancelLogin(params.loginId);
|
|
595
|
+
if (method === 'harnessmix/account/logout') {
|
|
595
596
|
if (!this.requestOfficial) throw new Error('Official Codex logout is unavailable');
|
|
596
597
|
await this.requestOfficial('account/logout', undefined);
|
|
597
598
|
return this.codexAccounts.signedOutOfficial();
|
|
598
599
|
}
|
|
599
|
-
if (method === '
|
|
600
|
-
if (method === '
|
|
600
|
+
if (method === 'harnessmix/account/rate-limit-reset/consume') return this.codexAccounts.consumeReset(params.accountId, params.idempotencyKey);
|
|
601
|
+
if (method === 'harnessmix/harness/account/login') {
|
|
601
602
|
const extId = params.harnessId;
|
|
602
603
|
const meta = HARNESS_AUTH_INFO[extId] || HARNESS_AUTH_INFO[ALIASES[extId]];
|
|
603
604
|
const cmd = meta?.loginCommand;
|
|
@@ -607,7 +608,7 @@ class NativeProtocol {
|
|
|
607
608
|
exec(execCmd, { windowsHide: false });
|
|
608
609
|
return { success: true, command: cmd };
|
|
609
610
|
}
|
|
610
|
-
if (method === '
|
|
611
|
+
if (method === 'harnessmix/harness/accounts/list') {
|
|
611
612
|
const accounts = [];
|
|
612
613
|
for (const adapter of this.runtime.adapters.values()) {
|
|
613
614
|
const id = adapter.manifest.id;
|
|
@@ -683,11 +684,11 @@ class NativeProtocol {
|
|
|
683
684
|
}
|
|
684
685
|
return { accounts };
|
|
685
686
|
}
|
|
686
|
-
if (method === '
|
|
687
|
-
if (method === '
|
|
688
|
-
if (method === '
|
|
689
|
-
if (method === '
|
|
690
|
-
if (method === '
|
|
687
|
+
if (method === 'harnessmix/harness/plugins/list') return { plugins: this.runtime.snapshot().adapters.map(a => ({ id: externalId(a.id), name: a.id === 'codex' ? 'Codex(协作)' : a.name, version: '0.1.0', icon: `data:image/svg+xml;base64,${Buffer.from(getHarnessSvg(a.id)).toString('base64')}` })) };
|
|
688
|
+
if (method === 'harnessmix/storage/inspect') return this.runtime.inspectStorage();
|
|
689
|
+
if (method === 'harnessmix/storage/optimize') return this.runtime.optimizeStorage();
|
|
690
|
+
if (method === 'harnessmix/harness/inspect') return this.inspect(params.harnessId);
|
|
691
|
+
if (method === 'harnessmix/harness/install') {
|
|
691
692
|
const local = ALIASES[params.harnessId] || params.harnessId;
|
|
692
693
|
const entry = HARNESS_INSTALL_COMMANDS[params.harnessId] || HARNESS_INSTALL_COMMANDS[local];
|
|
693
694
|
if (!entry) throw new Error(`No installation command available for harness: ${params.harnessId}`);
|
|
@@ -720,27 +721,29 @@ class NativeProtocol {
|
|
|
720
721
|
});
|
|
721
722
|
});
|
|
722
723
|
}
|
|
723
|
-
if (method === '
|
|
724
|
+
if (method === 'harnessmix/harness/commands/inspect' || method === 'harnessmix/thread/commands/inspect') {
|
|
724
725
|
const commands = await this.runtime.listCommands({ threadId: params.threadId, harnessId: ALIASES[params.harnessId] || params.harnessId });
|
|
725
726
|
return { commands: commands.map(c => ({ id: c.id, invocation: '/' + c.id, label: c.label || c.id, ...(c.description ? { description: c.description.slice(0, 512) } : {}), argumentMode: c.action === 'insert' ? 'text' : 'none' })) };
|
|
726
727
|
}
|
|
727
|
-
if (method === '
|
|
728
|
-
if (method === '
|
|
729
|
-
|
|
728
|
+
if (method === 'harnessmix/thread/ownership/list') return { threads: params.threadIds.map(id => ({ threadId: id, owner: this.owns(id) ? 'external' : 'codex', ...(this.owns(id) ? { harnessId: externalId(this.thread(id).harnessId) } : {}) })) };
|
|
729
|
+
if (method === 'harnessmix/thread/team/inspect') return this.runtime.collaboration.inspectTeam(params.threadId, params.teamId);
|
|
730
|
+
if (method === 'harnessmix/thread/inspect') {
|
|
731
|
+
if (!thread) return { owner: 'codex', locked: true };
|
|
730
732
|
const catalog = await this.runtime.describe(thread.harnessId);
|
|
731
733
|
const usage = typeof this.runtime.core?.getThread === 'function' ? this.runtime.core.getThread(thread.id)?.usage : undefined;
|
|
732
734
|
const adapter = this.runtime.adapters && typeof this.runtime.adapters.get === 'function' ? this.runtime.adapters.get(thread.harnessId) : null;
|
|
733
735
|
const rawCredits = adapter && typeof adapter.credits === 'function' ? adapter.credits() : null;
|
|
734
736
|
const credits = projectAccountCredits(rawCredits);
|
|
735
|
-
return { owner: 'external', harnessId: externalId(thread.harnessId), transportModelId: routeModel(externalId(thread.harnessId)), locked: true,
|
|
736
|
-
...this.configuration(thread), history: this.capabilities(thread.harnessId, catalog).history,
|
|
737
|
+
return { owner: 'external', harnessId: externalId(thread.harnessId), transportModelId: routeModel(externalId(thread.harnessId)), locked: true,
|
|
738
|
+
...this.configuration(thread), history: this.capabilities(thread.harnessId, catalog).history,
|
|
739
|
+
workspace: await this.runtime.inspectThreadWorkspace(thread.id),
|
|
737
740
|
...(usage ? { usage: projectUsage(usage) } : {}),
|
|
738
741
|
...(credits ? { accountCredits: credits } : {}) };
|
|
739
742
|
}
|
|
740
743
|
if (method === 'thread/start') {
|
|
741
744
|
const route = decodeRoute(params.model);
|
|
742
|
-
const accountContext = typeof params.
|
|
743
|
-
? this.codexAccounts.executionContext(params.
|
|
745
|
+
const accountContext = typeof params.__harnessmixAccountId === 'string'
|
|
746
|
+
? this.codexAccounts.executionContext(params.__harnessmixAccountId) : null;
|
|
744
747
|
if (!route && !accountContext) return undefined;
|
|
745
748
|
const effectiveRoute = route || { harnessId: 'codex-harness', ...(typeof params.model === 'string' ? { model: { id: params.model } } : {}) };
|
|
746
749
|
const id = ALIASES[effectiveRoute.harnessId] || effectiveRoute.harnessId;
|
|
@@ -764,15 +767,15 @@ class NativeProtocol {
|
|
|
764
767
|
// thread/started 已由 runtime 的 thread-created 监听统一发出(含协作子任务路径)
|
|
765
768
|
return result;
|
|
766
769
|
}
|
|
767
|
-
if (method === '
|
|
768
|
-
if (method === '
|
|
769
|
-
if (method === '
|
|
770
|
-
if (method === '
|
|
771
|
-
if (method === '
|
|
772
|
-
if (method === '
|
|
773
|
-
if (method === '
|
|
770
|
+
if (method === 'harnessmix/thread/workspace/review') return this.runtime.reviewThreadWorkspace(params.threadId);
|
|
771
|
+
if (method === 'harnessmix/thread/workspace/apply') return this.runtime.applyThreadWorkspace(params.threadId, params.digest);
|
|
772
|
+
if (method === 'harnessmix/thread/workspace/discard') return this.runtime.discardThreadWorkspace(params.threadId);
|
|
773
|
+
if (method === 'harnessmix/thread/workspace/push') return this.runtime.pushThreadWorkspace(params.threadId, params);
|
|
774
|
+
if (method === 'harnessmix/thread/verification/get') return this.runtime.verificationState(params.threadId);
|
|
775
|
+
if (method === 'harnessmix/thread/verification/configure') return this.runtime.configureVerification(params.threadId, params.policy);
|
|
776
|
+
if (method === 'harnessmix/thread/verification/run') return this.runtime.runVerification(params.threadId);
|
|
774
777
|
if (!thread) {
|
|
775
|
-
if (method.startsWith('
|
|
778
|
+
if (method.startsWith('harnessmix/')) throw new Error(`Harness Mix does not implement ${method}`);
|
|
776
779
|
return undefined;
|
|
777
780
|
}
|
|
778
781
|
if (method === 'thread/read') return { thread: this.projectThread(thread, params.includeTurns !== false) };
|
|
@@ -901,13 +904,13 @@ class NativeProtocol {
|
|
|
901
904
|
}
|
|
902
905
|
if (method === 'turn/interrupt') { await this.runtime.cancel(thread.id); return {}; }
|
|
903
906
|
// 跨 Harness 任务协作:委派新子任务 / 跟进既有子任务,等待链由父线程协作 Turn 承载
|
|
904
|
-
if (method === '
|
|
907
|
+
if (method === 'harnessmix/thread/delegate' || method === 'harnessmix/thread/message') {
|
|
905
908
|
const task = params.task ?? params.text;
|
|
906
909
|
if (typeof task !== 'string' || !task.trim()) throw new Error('Delegation requires a non-empty task');
|
|
907
910
|
const { child, turn } = await this.runtime.delegateTask({
|
|
908
911
|
fromThreadId: thread.id,
|
|
909
|
-
harnessId: method === '
|
|
910
|
-
childThreadId: method === '
|
|
912
|
+
harnessId: method === 'harnessmix/thread/delegate' ? (ALIASES[params.harnessId] || params.harnessId) : undefined,
|
|
913
|
+
childThreadId: method === 'harnessmix/thread/message' ? params.childThreadId : undefined,
|
|
911
914
|
task,
|
|
912
915
|
});
|
|
913
916
|
return { turn: this.turn(turn), childThreadId: child.id };
|
|
@@ -926,7 +929,7 @@ class NativeProtocol {
|
|
|
926
929
|
return { thread: projected };
|
|
927
930
|
}
|
|
928
931
|
if (method === 'thread/loaded/list') return { data: [...this.runtime.sessions.keys()] };
|
|
929
|
-
if (method === '
|
|
932
|
+
if (method === 'harnessmix/thread/usage/inspect') {
|
|
930
933
|
const usage = params.refresh === 'exact' ? await this.runtime.refreshUsage(thread.id) : this.runtime.core.getThread(thread.id)?.usage;
|
|
931
934
|
const adapter = this.runtime.adapters.get(thread.harnessId);
|
|
932
935
|
let rawCredits = adapter && typeof adapter.credits === 'function' ? adapter.credits() : null;
|
|
@@ -943,14 +946,14 @@ class NativeProtocol {
|
|
|
943
946
|
...(credits ? { accountCredits: credits } : {}),
|
|
944
947
|
};
|
|
945
948
|
}
|
|
946
|
-
if (method === '
|
|
949
|
+
if (method === 'harnessmix/thread/command/execute') {
|
|
947
950
|
if (params.arguments && Object.keys(params.arguments).length) throw new Error('This command does not accept arguments');
|
|
948
951
|
const turn = await this.startNativeTurn(thread, '', undefined, params.commandId);
|
|
949
952
|
return { accepted: true, turnId: turn.id };
|
|
950
953
|
}
|
|
951
|
-
if (method === '
|
|
952
|
-
if (method === '
|
|
953
|
-
if (method === '
|
|
954
|
+
if (method === 'harnessmix/thread/model/select') { await this.runtime.setModel(thread.id, await this.resolveModel(thread.harnessId, params.model)); return this.configuration(thread); }
|
|
955
|
+
if (method === 'harnessmix/thread/thinking/select') { await this.runtime.setThinking(thread.id, params.thinkingOptionId); return this.configuration(thread); }
|
|
956
|
+
if (method === 'harnessmix/thread/permission-mode/select') {
|
|
954
957
|
await this.runtime.setOptions(thread.id, { permissionMode: params.permissionModeId });
|
|
955
958
|
const session = this.runtime.sessions.get(thread.id);
|
|
956
959
|
const adapter = this.runtime.adapters.get(thread.harnessId);
|
|
@@ -960,7 +963,7 @@ class NativeProtocol {
|
|
|
960
963
|
return this.configuration(thread);
|
|
961
964
|
}
|
|
962
965
|
// 原地切换 Harness:会话历史保留,下条消息携带一次性上下文信封(/switch 指令的 RPC 等价物)
|
|
963
|
-
if (method === '
|
|
966
|
+
if (method === 'harnessmix/thread/harness/switch') {
|
|
964
967
|
const result = await this.runtime.switchHarness(thread.id, ALIASES[params.harnessId] || params.harnessId, {
|
|
965
968
|
note: typeof params.note === 'string' ? params.note : undefined,
|
|
966
969
|
intent: params.intent,
|
|
@@ -968,14 +971,14 @@ class NativeProtocol {
|
|
|
968
971
|
});
|
|
969
972
|
return { ...result, fromHarnessId: externalId(result.fromHarnessId), toHarnessId: externalId(result.toHarnessId) };
|
|
970
973
|
}
|
|
971
|
-
if (method === 'thread/fork' || method === '
|
|
974
|
+
if (method === 'thread/fork' || method === 'harnessmix/thread/fork') {
|
|
972
975
|
if (params.ephemeral || params.threadSource || params.excludeTurns) {
|
|
973
976
|
throw new Error('Ephemeral fork is not supported');
|
|
974
977
|
}
|
|
975
978
|
const messageId = params.lastTurnId ? thread.messages.find(m => m.coreTurnId === params.lastTurnId)?.id : params.messageId;
|
|
976
979
|
if (params.lastTurnId && !messageId) throw new Error('Unknown fork turn');
|
|
977
980
|
const fork = await this.runtime.forkThread(thread.id, messageId);
|
|
978
|
-
return method === '
|
|
981
|
+
return method === 'harnessmix/thread/fork' ? { threadId: fork.id } : { thread: this.projectThread(fork) };
|
|
979
982
|
}
|
|
980
983
|
throw new Error(`Harness Mix native bridge does not support ${method} for this thread`);
|
|
981
984
|
}
|
|
@@ -983,7 +986,7 @@ class NativeProtocol {
|
|
|
983
986
|
const { threadId, turnId } = event;
|
|
984
987
|
const item = projected.item;
|
|
985
988
|
const notify = (method, extra) => this.emit({ method, params: { threadId, turnId, ...extra } });
|
|
986
|
-
if (event.type === 'usage.updated') this.emit({ method: '
|
|
989
|
+
if (event.type === 'usage.updated') this.emit({ method: 'harnessmix/thread/usage/updated', params: { threadId, usage: projectUsage(projected.thread?.usage) } });
|
|
987
990
|
if (projected.items) {
|
|
988
991
|
for (const file of projected.items) this.onCore({ ...event, type: 'item.updated' }, { item: file });
|
|
989
992
|
notify('turn/diff/updated', { diff: projected.items.map(i => projectItem(i)?.changes?.map(c => c.diff).filter(Boolean).join('\n')).filter(Boolean).join('\n') });
|
|
@@ -3,7 +3,7 @@ name = "harness-mix-appx"
|
|
|
3
3
|
version = "0.2.0"
|
|
4
4
|
edition = "2021"
|
|
5
5
|
description = "Harness Mix Windows AppX activation boundary (IApplicationActivationManager / IPackageDebugSettings)"
|
|
6
|
-
license = "Apache-2.0"
|
|
6
|
+
license = "Apache-2.0 OR MIT"
|
|
7
7
|
|
|
8
8
|
[[bin]]
|
|
9
9
|
name = "harness-mix-appx"
|
|
@@ -125,14 +125,14 @@ fn base64_decode(text: &str) -> Result<Vec<u8>, String> {
|
|
|
125
125
|
}
|
|
126
126
|
|
|
127
127
|
fn data_dir() -> Result<PathBuf, String> {
|
|
128
|
-
if let Ok(dir) = env::var("
|
|
128
|
+
if let Ok(dir) = env::var("HARNESSMIX_DATA_DIR") {
|
|
129
129
|
if !dir.trim().is_empty() {
|
|
130
130
|
return Ok(PathBuf::from(dir));
|
|
131
131
|
}
|
|
132
132
|
}
|
|
133
133
|
match env::var("APPDATA") {
|
|
134
|
-
Ok(appdata) if !appdata.trim().is_empty() => Ok(PathBuf::from(appdata).join("
|
|
135
|
-
_ => Err("无法确定数据目录(缺少 APPDATA /
|
|
134
|
+
Ok(appdata) if !appdata.trim().is_empty() => Ok(PathBuf::from(appdata).join("harnessmix")),
|
|
135
|
+
_ => Err("无法确定数据目录(缺少 APPDATA / HARNESSMIX_DATA_DIR)".to_string()),
|
|
136
136
|
}
|
|
137
137
|
}
|
|
138
138
|
|
|
@@ -3,7 +3,7 @@ name = "harness-mix-shim"
|
|
|
3
3
|
version = "0.2.0"
|
|
4
4
|
edition = "2021"
|
|
5
5
|
description = "Harness Mix executable bridge: routes Codex Desktop app-server traffic to the local HostRuntime"
|
|
6
|
-
license = "Apache-2.0"
|
|
6
|
+
license = "Apache-2.0 OR MIT"
|
|
7
7
|
|
|
8
8
|
[[bin]]
|
|
9
9
|
name = "harness-mix-shim"
|
|
@@ -226,7 +226,7 @@ fn run() -> io::Result<i32> {
|
|
|
226
226
|
|
|
227
227
|
let build_dir = root.join("output").join("native-build");
|
|
228
228
|
let stock = setting(
|
|
229
|
-
"
|
|
229
|
+
"HARNESSMIX_STOCK_CODEX_PATH",
|
|
230
230
|
&build_dir.join("stock-path.txt"),
|
|
231
231
|
)?;
|
|
232
232
|
let node = setting("HARNESS_MIX_NODE_PATH", &build_dir.join("node-path.txt"))?;
|
|
@@ -252,7 +252,7 @@ fn run() -> io::Result<i32> {
|
|
|
252
252
|
.stdout(Stdio::piped())
|
|
253
253
|
.stderr(Stdio::piped())
|
|
254
254
|
.env_remove("CODEX_CLI_PATH")
|
|
255
|
-
.env("
|
|
255
|
+
.env("HARNESSMIX_STOCK_CODEX_PATH", &stock);
|
|
256
256
|
#[cfg(windows)]
|
|
257
257
|
command.creation_flags(CREATE_NO_WINDOW);
|
|
258
258
|
|
|
@@ -15,7 +15,7 @@ function includesThread(thread, query = {}, threads = []) {
|
|
|
15
15
|
if (query.isPinned === true && !thread.isPinned) return false;
|
|
16
16
|
if (query.isPinned === false && thread.isPinned) return false;
|
|
17
17
|
if (query.cwd != null && !(Array.isArray(query.cwd) ? query.cwd : [query.cwd]).includes(thread.cwd)) return false;
|
|
18
|
-
if (query.modelProviders?.length && !query.modelProviders.includes('
|
|
18
|
+
if (query.modelProviders?.length && !query.modelProviders.includes('harnessmix')) return false;
|
|
19
19
|
if (query.sourceKinds?.length && !query.sourceKinds.includes('vscode')) return false;
|
|
20
20
|
if (query.searchTerm && !(thread.title || '').toLowerCase().includes(query.searchTerm.toLowerCase())) return false;
|
|
21
21
|
return true;
|
|
@@ -4,7 +4,9 @@ const CAPABILITY_GROUPS = {
|
|
|
4
4
|
conversation: ['streaming', 'reasoning', 'plan', 'compaction', 'attachments'],
|
|
5
5
|
interaction: ['approval', 'question', 'permissionMode'],
|
|
6
6
|
session: ['resume', 'fork', 'forkFromMessage'],
|
|
7
|
-
|
|
7
|
+
// git/worktree/finalDiff are Host-owned. nativeDiff/nativePatch remain
|
|
8
|
+
// adapter-owned signals describing the native Harness event stream.
|
|
9
|
+
workspace: ['git', 'worktree', 'finalDiff', 'nativeDiff', 'nativePatch'],
|
|
8
10
|
model: ['selection', 'thinkingLevel'],
|
|
9
11
|
usage: ['tokens', 'context', 'cost'],
|
|
10
12
|
};
|
|
@@ -6,13 +6,14 @@ async function projectReview(runtime, thread, message, record) {
|
|
|
6
6
|
if (!core?.getTurn(message.coreTurnId)) throw new Error('审查记录缺少 Core Turn,请重新加载任务完成历史迁移');
|
|
7
7
|
|
|
8
8
|
const hasNativePatch = Boolean(
|
|
9
|
-
runtime.getCapabilities?.(thread.harnessId)?.
|
|
9
|
+
runtime.getCapabilities?.(thread.harnessId)?.workspace?.nativePatch ||
|
|
10
10
|
runtime.adapters?.get(thread.harnessId)?.manifest?.capabilities?.nativePatch
|
|
11
11
|
);
|
|
12
12
|
|
|
13
13
|
let changes = record.changes;
|
|
14
|
-
if (hasNativePatch) {
|
|
15
|
-
//
|
|
14
|
+
if (hasNativePatch && record.concurrent) {
|
|
15
|
+
// 同目录并发时,原生 patch 是唯一能归属到本轮的边界。无并发时始终
|
|
16
|
+
// 保留 Host 最终快照,补齐原生 Harness 没有上报或漏报的文件。
|
|
16
17
|
const nativeItems = core.getItemsForTurn(message.coreTurnId).filter(item => item.type === 'file_change' && item.source === 'native');
|
|
17
18
|
const nativePaths = new Set(nativeItems.map(item => item.path));
|
|
18
19
|
changes = changes.filter(change => nativePaths.has(change.path));
|
package/src/native-ui/README.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# Harness Mix native Desktop boundary
|
|
2
2
|
|
|
3
3
|
The renderer-extension, desktop-control and shared-contracts source directories
|
|
4
|
-
are derived from BytePioneer-AI
|
|
5
|
-
da97fa7b447d03bd3626bb8f782234d5fa519141
|
|
4
|
+
are derived from an upstream MIT-licensed project by BytePioneer-AI (v0.6.1,
|
|
5
|
+
commit da97fa7b447d03bd3626bb8f782234d5fa519141; see LICENSE).
|
|
6
6
|
They are maintained and built in this repository. No upstream Host Runtime,
|
|
7
7
|
ProtocolCore, adapter or account store is imported. Upstream wire names are
|
|
8
8
|
retained solely for compatibility with this renderer boundary.
|
|
@@ -106,17 +106,17 @@ async function executeReadOnlyAudit(inspector, rendererWebContentsId, source) {
|
|
|
106
106
|
const contents = webContents.fromId(${rendererWebContentsId});
|
|
107
107
|
if (contents == null || contents.isDestroyed()) throw new Error('Renderer webContents is unavailable');
|
|
108
108
|
return contents.executeJavaScript(${JSON.stringify(`(() => {
|
|
109
|
-
const previous = window.
|
|
109
|
+
const previous = window.__harnessmixContractAuditV1;
|
|
110
110
|
${source}
|
|
111
111
|
try {
|
|
112
|
-
const audit = window.
|
|
112
|
+
const audit = window.__harnessmixContractAuditV1;
|
|
113
113
|
if (audit == null || typeof audit.inspect !== 'function') {
|
|
114
114
|
throw new Error('Renderer contract audit entry is unavailable');
|
|
115
115
|
}
|
|
116
116
|
return audit.inspect();
|
|
117
117
|
} finally {
|
|
118
|
-
if (previous === undefined) delete window.
|
|
119
|
-
else window.
|
|
118
|
+
if (previous === undefined) delete window.__harnessmixContractAuditV1;
|
|
119
|
+
else window.__harnessmixContractAuditV1 = previous;
|
|
120
120
|
}
|
|
121
121
|
})()`)}, true);
|
|
122
122
|
})()`);
|
|
@@ -15,7 +15,7 @@ export type { RendererDraftPrewarmPolicyStatus } from "./renderer-draft-prewarm-
|
|
|
15
15
|
export { parseDesktopControllerArguments, runDesktopController, serializeDesktopControllerReadiness, } from "./production-controller.js";
|
|
16
16
|
export type { DesktopControllerDependencies, DesktopControllerOptions, DesktopControllerReadiness, } from "./production-controller.js";
|
|
17
17
|
export declare const packageMetadata: {
|
|
18
|
-
readonly name: "@
|
|
18
|
+
readonly name: "@harnessmix/desktop-control";
|
|
19
19
|
readonly contractVersion: 1;
|
|
20
20
|
};
|
|
21
21
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { WORKSPACE_CONTRACT_VERSION } from "@
|
|
1
|
+
import { WORKSPACE_CONTRACT_VERSION } from "@harnessmix/shared-contracts";
|
|
2
2
|
export { CdpClient, getCdpBrowserVersion, listCdpTargets, waitForRendererTarget, } from "./cdp-client.js";
|
|
3
3
|
export { DESKTOP_CONTRACT_AUDIT_SCHEMA_VERSION, inspectDesktopContracts, validateRendererContractAuditInspection, } from "./contract-audit.js";
|
|
4
4
|
export { inspectRendererDom, validateRendererDomInspection } from "./renderer-dom.js";
|
|
@@ -8,7 +8,7 @@ export { installMainProcessTitlePolicy, markRendererTitlePolicyReady, readMainPr
|
|
|
8
8
|
export { installRendererDraftPrewarmPolicy, installRendererDraftPrewarmPolicyDirect, } from "./renderer-draft-prewarm-policy.js";
|
|
9
9
|
export { parseDesktopControllerArguments, runDesktopController, serializeDesktopControllerReadiness, } from "./production-controller.js";
|
|
10
10
|
export const packageMetadata = {
|
|
11
|
-
name: "@
|
|
11
|
+
name: "@harnessmix/desktop-control",
|
|
12
12
|
contractVersion: WORKSPACE_CONTRACT_VERSION,
|
|
13
13
|
};
|
|
14
14
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAE1E,OAAO,EACL,SAAS,EACT,oBAAoB,EACpB,cAAc,EACd,qBAAqB,GACtB,MAAM,iBAAiB,CAAC;AAUzB,OAAO,EACL,qCAAqC,EACrC,uBAAuB,EACvB,uCAAuC,GACxC,MAAM,qBAAqB,CAAC;AAM7B,OAAO,EAAE,kBAAkB,EAAE,6BAA6B,EAAE,MAAM,mBAAmB,CAAC;AACtF,OAAO,EACL,+BAA+B,EAC/B,gCAAgC,EAChC,2BAA2B,GAC5B,MAAM,mCAAmC,CAAC;AAO3C,OAAO,EACL,uBAAuB,EACvB,4BAA4B,EAC5B,0BAA0B,EAC1B,6BAA6B,EAC7B,yBAAyB,EACzB,sBAAsB,EACtB,+BAA+B,GAChC,MAAM,+BAA+B,CAAC;AAavC,OAAO,EACL,6BAA6B,EAC7B,4BAA4B,EAC5B,kCAAkC,GACnC,MAAM,gCAAgC,CAAC;AAMxC,OAAO,EACL,iCAAiC,EACjC,uCAAuC,GACxC,MAAM,oCAAoC,CAAC;AAG5C,OAAO,EACL,+BAA+B,EAC/B,oBAAoB,EACpB,mCAAmC,GACpC,MAAM,4BAA4B,CAAC;AAOpC,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,IAAI,EAAE,6BAA6B;IACnC,eAAe,EAAE,0BAA0B;CACnC,CAAC"}
|
|
@@ -37,9 +37,9 @@ const ELECTRON_MODULE_EXPRESSION = `(() => {
|
|
|
37
37
|
return createRequire(process.execPath)('electron');
|
|
38
38
|
})()`;
|
|
39
39
|
const CONNECT_APP_HOST_CHANNEL = "codex_desktop:connect-app-host";
|
|
40
|
-
const POLICY_STATE_SYMBOL = "
|
|
41
|
-
const SERVICE_OWNER_SYMBOL = "
|
|
42
|
-
const RENDERER_READY_EXPRESSION = "(() => { Object.defineProperty(window, '
|
|
40
|
+
const POLICY_STATE_SYMBOL = "harnessmix.main-process-title-policy.v1";
|
|
41
|
+
const SERVICE_OWNER_SYMBOL = "harnessmix.main-process-title-policy.owner.v1";
|
|
42
|
+
const RENDERER_READY_EXPRESSION = "(() => { Object.defineProperty(window, '__harnessmixMainProcessTitlePolicyV1', { configurable: true, value: { state: 'ready' } }); return 'ready'; })()";
|
|
43
43
|
const INSTALL_POLICY_FUNCTION = `async function (rendererWebContentsId) {
|
|
44
44
|
const mainModule = process.mainModule;
|
|
45
45
|
const electron = mainModule != null && typeof mainModule.require === 'function'
|
|
@@ -109,7 +109,7 @@ const INSTALL_POLICY_FUNCTION = `async function (rendererWebContentsId) {
|
|
|
109
109
|
let selection = null;
|
|
110
110
|
try {
|
|
111
111
|
selection = await owner.executeJavaScript(
|
|
112
|
-
"window.
|
|
112
|
+
"window.__harnessmixRendererBindingProbeV1?.lockedSelection() ?? null",
|
|
113
113
|
true,
|
|
114
114
|
);
|
|
115
115
|
} catch {}
|
|
@@ -134,7 +134,7 @@ const INSTALL_POLICY_FUNCTION = `async function (rendererWebContentsId) {
|
|
|
134
134
|
let selection = null;
|
|
135
135
|
try {
|
|
136
136
|
selection = await owner.executeJavaScript(
|
|
137
|
-
"window.
|
|
137
|
+
"window.__harnessmixRendererBindingProbeV1?.lockedSelection() ?? null",
|
|
138
138
|
true,
|
|
139
139
|
);
|
|
140
140
|
} catch {}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main-process-title-policy.js","sourceRoot":"","sources":["../src/main-process-title-policy.ts"],"names":[],"mappings":"AAkCA,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,YAAY,CAAC,KAAc,EAAE,OAAe;IACnD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,6BAA6B,CAAC,CAAC;IAC/E,IAAI,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACrC,MAAM,SAAS,GAAG,KAAK,CAAC,gBAAgB,CAAC,SAAS,CAAC;QACnD,MAAM,WAAW,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC;QACvE,MAAM,IAAI,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC;QACzC,MAAM,IAAI,KAAK,CACb,OAAO,WAAW,KAAK,QAAQ;YAC7B,CAAC,CAAC,WAAW;YACb,CAAC,CAAC,OAAO,IAAI,KAAK,QAAQ;gBACxB,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,GAAG,OAAO,SAAS,CAC1B,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,KAAc,EAAE,KAAa;IACnD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,iBAAiB,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,KAAK,CAAC,QAAQ,CAAC;AACxB,CAAC;AAED,SAAS,UAAU,CAAC,KAAc,EAAE,OAAe;IACjD,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC;IACnD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,8BAA8B,CAAC,CAAC;IACtF,OAAO,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAsB,CAAC;AACtD,CAAC;AAED,MAAM,0BAA0B,GAAG;;;;;;;KAO9B,CAAC;AAEN,MAAM,wBAAwB,GAAG,gCAAgC,CAAC;AAClE,MAAM,mBAAmB,GAAG,
|
|
1
|
+
{"version":3,"file":"main-process-title-policy.js","sourceRoot":"","sources":["../src/main-process-title-policy.ts"],"names":[],"mappings":"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"}
|