@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
|
@@ -8,7 +8,7 @@ import type {
|
|
|
8
8
|
RendererAgent,
|
|
9
9
|
RendererAgentAvailability,
|
|
10
10
|
} from "./agent-selection-state.js";
|
|
11
|
-
import type { CodexAccountSummary } from "@
|
|
11
|
+
import type { CodexAccountSummary } from "@harnessmix/shared-contracts";
|
|
12
12
|
import {
|
|
13
13
|
createRendererCodexAccountGroup,
|
|
14
14
|
type RendererCodexAccountGroupControl,
|
|
@@ -52,7 +52,7 @@ function pickerGroupMessages(): Pick<
|
|
|
52
52
|
|
|
53
53
|
// Opens the Connections settings page from the picker's "More Agents" group.
|
|
54
54
|
// The shell installs this handle globally (see settings/shell.ts) as
|
|
55
|
-
// `window.
|
|
55
|
+
// `window.__harnessmixSettingsShellV1`; it is a no-op before the settings
|
|
56
56
|
// surface has mounted. Read through a local structural type instead of
|
|
57
57
|
// augmenting the global `Window` interface, so this stays a no-op import
|
|
58
58
|
// away from the settings module.
|
|
@@ -61,8 +61,8 @@ interface MinimalSettingsShellHandle {
|
|
|
61
61
|
}
|
|
62
62
|
|
|
63
63
|
function openSettingsPage(pageId: "accounts" | "connections", opener?: HTMLElement): void {
|
|
64
|
-
const shell = (window as unknown as {
|
|
65
|
-
.
|
|
64
|
+
const shell = (window as unknown as { __harnessmixSettingsShellV1?: MinimalSettingsShellHandle })
|
|
65
|
+
.__harnessmixSettingsShellV1;
|
|
66
66
|
shell?.openSettings(opener, pageId);
|
|
67
67
|
}
|
|
68
68
|
|
|
@@ -92,7 +92,7 @@ export const RENDERER_AGENT_INSTALL_URLS: Readonly<Record<ExternalRendererAgent,
|
|
|
92
92
|
|
|
93
93
|
type AgentAvailability = Partial<Record<ExternalRendererAgent, RendererAgentAvailability>>;
|
|
94
94
|
|
|
95
|
-
export const CONTROL_ATTRIBUTE = "data-
|
|
95
|
+
export const CONTROL_ATTRIBUTE = "data-harnessmix-agent-control";
|
|
96
96
|
const AGENT_MENU_WIDTH = 224;
|
|
97
97
|
// Below this many enabled Agents, the picker stays a flat list — grouping
|
|
98
98
|
// only earns its keep once there are enough Harnesses to make scanning slow.
|
|
@@ -107,7 +107,7 @@ interface AgentOptionControl {
|
|
|
107
107
|
// are mutually exclusive since `RendererAgentAvailability` is a single
|
|
108
108
|
// enum value. The error mode has no error *details* to show inline (the
|
|
109
109
|
// picker only ever receives the coarse availability enum, not the full
|
|
110
|
-
// `
|
|
110
|
+
// `HarnessMixError`), so it links out to Settings → Connections instead.
|
|
111
111
|
action: HTMLButtonElement | null;
|
|
112
112
|
}
|
|
113
113
|
|
|
@@ -476,7 +476,7 @@ export function mountRendererAgentPicker(
|
|
|
476
476
|
event.stopPropagation();
|
|
477
477
|
// "error" mode has nothing more to show inline — the picker
|
|
478
478
|
// only knows the coarse availability enum, not the full
|
|
479
|
-
// `
|
|
479
|
+
// `HarnessMixError` — so it hands off to Settings, which does.
|
|
480
480
|
// `requestConnectionsPageFocus` makes sure Settings opens
|
|
481
481
|
// straight to *this* Agent's row, not just the page.
|
|
482
482
|
if (control.dataset.mode === "error") {
|
|
@@ -15,8 +15,8 @@ import {
|
|
|
15
15
|
type ThreadInspection,
|
|
16
16
|
type ThreadUsageInspection,
|
|
17
17
|
type ThreadUsageSnapshot,
|
|
18
|
-
type
|
|
19
|
-
} from "@
|
|
18
|
+
type HarnessMixError,
|
|
19
|
+
} from "@harnessmix/shared-contracts";
|
|
20
20
|
|
|
21
21
|
import {
|
|
22
22
|
DEFAULT_RENDERER_AGENTS,
|
|
@@ -81,6 +81,7 @@ import {
|
|
|
81
81
|
import { installRendererSidebarAgentIcons } from "./renderer-sidebar-agent-icons.js";
|
|
82
82
|
import { installHarnessMentions } from './renderer-harness-mentions.js';
|
|
83
83
|
import { installCollabCards } from './renderer-collab-cards.js';
|
|
84
|
+
import { installTeamCards } from './renderer-team-cards.js';
|
|
84
85
|
import {
|
|
85
86
|
rendererHarnessCommandExecutesDirectly,
|
|
86
87
|
routeRendererHarnessCommandSelection,
|
|
@@ -133,12 +134,12 @@ const externalAgents: readonly ExternalRendererAgent[] = [
|
|
|
133
134
|
'codex-harness',
|
|
134
135
|
];
|
|
135
136
|
type HarnessAvailability = Partial<Record<ExternalRendererAgent, RendererAgentAvailability>>;
|
|
136
|
-
type HarnessAvailabilityErrors = Record<ExternalRendererAgent,
|
|
137
|
+
type HarnessAvailabilityErrors = Record<ExternalRendererAgent, HarnessMixError | undefined>;
|
|
137
138
|
type HarnessWebUiAvailability = Record<ExternalRendererAgent, boolean>;
|
|
138
139
|
|
|
139
140
|
function isRetryableHarnessAvailability(
|
|
140
141
|
availability: RendererAgentAvailability | undefined,
|
|
141
|
-
error:
|
|
142
|
+
error: HarnessMixError | undefined,
|
|
142
143
|
): boolean {
|
|
143
144
|
return (
|
|
144
145
|
availability !== undefined &&
|
|
@@ -301,7 +302,7 @@ export interface RendererBindingProbeApi {
|
|
|
301
302
|
|
|
302
303
|
declare global {
|
|
303
304
|
interface Window {
|
|
304
|
-
|
|
305
|
+
__harnessmixRendererBindingProbeV1?: RendererBindingProbeApi;
|
|
305
306
|
}
|
|
306
307
|
}
|
|
307
308
|
|
|
@@ -570,7 +571,7 @@ export function shouldTransferComposerState(
|
|
|
570
571
|
);
|
|
571
572
|
}
|
|
572
573
|
|
|
573
|
-
export function isLateConversationTarget(
|
|
574
|
+
export function isLateConversationTarget(
|
|
574
575
|
mountedTarget: readonly unknown[] | null,
|
|
575
576
|
currentTarget: readonly unknown[] | null,
|
|
576
577
|
): boolean {
|
|
@@ -582,43 +583,43 @@ export function isLateConversationTarget(
|
|
|
582
583
|
mountedTarget.length !== currentTarget.length ||
|
|
583
584
|
mountedTarget.some((value, index) => value !== currentTarget[index])
|
|
584
585
|
);
|
|
585
|
-
}
|
|
586
|
-
|
|
587
|
-
export function composerTargetResolution(
|
|
588
|
-
mountedTarget: readonly unknown[] | null,
|
|
589
|
-
currentTarget: readonly unknown[] | null,
|
|
590
|
-
sourcePhase: ComposerAgentPhase,
|
|
591
|
-
submissionPending = false,
|
|
592
|
-
): "none" | "transfer" | "inspect" | "restore-draft" {
|
|
593
|
-
if (!currentTarget) return "none";
|
|
594
|
-
if (
|
|
595
|
-
mountedTarget &&
|
|
596
|
-
mountedTarget.length === currentTarget.length &&
|
|
597
|
-
mountedTarget.every((value, index) => value === currentTarget[index])
|
|
598
|
-
) {
|
|
599
|
-
return "none";
|
|
600
|
-
}
|
|
601
|
-
if (currentTarget[0] === "default") return "restore-draft";
|
|
602
|
-
if (currentTarget[0] !== "conversation") return "none";
|
|
603
|
-
return mountedTarget?.[0] === "default" && (sourcePhase === "locked" || submissionPending)
|
|
604
|
-
? "transfer"
|
|
605
|
-
: "inspect";
|
|
606
|
-
}
|
|
607
|
-
|
|
608
|
-
export function lateConversationTargetResolution(
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
export function composerTargetResolution(
|
|
589
|
+
mountedTarget: readonly unknown[] | null,
|
|
590
|
+
currentTarget: readonly unknown[] | null,
|
|
591
|
+
sourcePhase: ComposerAgentPhase,
|
|
592
|
+
submissionPending = false,
|
|
593
|
+
): "none" | "transfer" | "inspect" | "restore-draft" {
|
|
594
|
+
if (!currentTarget) return "none";
|
|
595
|
+
if (
|
|
596
|
+
mountedTarget &&
|
|
597
|
+
mountedTarget.length === currentTarget.length &&
|
|
598
|
+
mountedTarget.every((value, index) => value === currentTarget[index])
|
|
599
|
+
) {
|
|
600
|
+
return "none";
|
|
601
|
+
}
|
|
602
|
+
if (currentTarget[0] === "default") return "restore-draft";
|
|
603
|
+
if (currentTarget[0] !== "conversation") return "none";
|
|
604
|
+
return mountedTarget?.[0] === "default" && (sourcePhase === "locked" || submissionPending)
|
|
605
|
+
? "transfer"
|
|
606
|
+
: "inspect";
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
export function lateConversationTargetResolution(
|
|
609
610
|
mountedTarget: readonly unknown[] | null,
|
|
610
611
|
currentTarget: readonly unknown[] | null,
|
|
611
612
|
sourcePhase: ComposerAgentPhase,
|
|
612
613
|
submissionPending = false,
|
|
613
|
-
): "none" | "transfer" | "inspect" {
|
|
614
|
-
const resolution = composerTargetResolution(
|
|
615
|
-
mountedTarget,
|
|
616
|
-
currentTarget,
|
|
617
|
-
sourcePhase,
|
|
618
|
-
submissionPending,
|
|
619
|
-
);
|
|
620
|
-
return resolution === "restore-draft" ? "none" : resolution;
|
|
621
|
-
}
|
|
614
|
+
): "none" | "transfer" | "inspect" {
|
|
615
|
+
const resolution = composerTargetResolution(
|
|
616
|
+
mountedTarget,
|
|
617
|
+
currentTarget,
|
|
618
|
+
sourcePhase,
|
|
619
|
+
submissionPending,
|
|
620
|
+
);
|
|
621
|
+
return resolution === "restore-draft" ? "none" : resolution;
|
|
622
|
+
}
|
|
622
623
|
|
|
623
624
|
export function scopedComposerTarget(
|
|
624
625
|
target: readonly unknown[] | null,
|
|
@@ -685,7 +686,7 @@ function catalogWithConfigurationState(
|
|
|
685
686
|
export function installRendererBindingProbe(
|
|
686
687
|
options: RendererBindingProbeOptions = {},
|
|
687
688
|
): RendererBindingProbeApi {
|
|
688
|
-
const existing = window.
|
|
689
|
+
const existing = window.__harnessmixRendererBindingProbeV1;
|
|
689
690
|
if (existing) return existing;
|
|
690
691
|
|
|
691
692
|
const enabledAgents = [...new Set(options.enabledAgents ?? DEFAULT_RENDERER_AGENTS)];
|
|
@@ -770,6 +771,25 @@ export function installRendererBindingProbe(
|
|
|
770
771
|
return (client as any)?.applyThreadWorkspace?.({ threadId, digest }) ?? { patch: '', digest: '' };
|
|
771
772
|
},
|
|
772
773
|
});
|
|
774
|
+
const teamCards = installTeamCards({
|
|
775
|
+
inspectTeam: async (threadId, teamId) => {
|
|
776
|
+
const client = modelClientForHost('local');
|
|
777
|
+
return client?.inspectThreadTeam?.({ threadId, ...(teamId ? { teamId } : {}) }) ?? null;
|
|
778
|
+
},
|
|
779
|
+
openThread: (threadId) => openRendererThread(hostThreadIdSchema.parse(threadId), { hostId: 'local' }),
|
|
780
|
+
activeThread: () => {
|
|
781
|
+
const mounted = [...mountedByComposer.values()].find(candidate => {
|
|
782
|
+
if (!candidate.composer.isConnected || !candidate.control.root.isConnected) return false;
|
|
783
|
+
if (!threadIdFromComposerModelTarget(candidate.modelTarget)) return false;
|
|
784
|
+
const style = window.getComputedStyle(candidate.composer);
|
|
785
|
+
return style.display !== 'none' && style.visibility !== 'hidden' && candidate.composer.getClientRects().length > 0;
|
|
786
|
+
});
|
|
787
|
+
const threadId = mounted ? threadIdFromComposerModelTarget(mounted.modelTarget) : null;
|
|
788
|
+
const scroll = mounted?.composer.closest('.thread-scroll-container');
|
|
789
|
+
const content = scroll?.parentElement?.parentElement;
|
|
790
|
+
return mounted && threadId ? { threadId, anchor: content ?? mounted.composer } : null;
|
|
791
|
+
},
|
|
792
|
+
});
|
|
773
793
|
let connectionDiagnostics: RendererConnectionDiagnostics | null = null;
|
|
774
794
|
const settingsLifecycle = installRendererSettingsLifecycle(window, {
|
|
775
795
|
getUpdateClient: () => modelControl,
|
|
@@ -911,7 +931,7 @@ export function installRendererBindingProbe(
|
|
|
911
931
|
}
|
|
912
932
|
}
|
|
913
933
|
window.dispatchEvent(
|
|
914
|
-
new CustomEvent("
|
|
934
|
+
new CustomEvent("harnessmix:renderer-submission", {
|
|
915
935
|
detail: {
|
|
916
936
|
composerId: state.composerId,
|
|
917
937
|
agent: state.agent,
|
|
@@ -1002,7 +1022,7 @@ export function installRendererBindingProbe(
|
|
|
1002
1022
|
await modelControl.executeThreadCommand({ threadId, commandId: command.id });
|
|
1003
1023
|
} catch (error) {
|
|
1004
1024
|
console.error(
|
|
1005
|
-
"
|
|
1025
|
+
"harnessmix Harness command failed",
|
|
1006
1026
|
error instanceof Error ? error.message : String(error),
|
|
1007
1027
|
);
|
|
1008
1028
|
} finally {
|
|
@@ -1022,7 +1042,7 @@ export function installRendererBindingProbe(
|
|
|
1022
1042
|
) {
|
|
1023
1043
|
return;
|
|
1024
1044
|
}
|
|
1025
|
-
console.error("
|
|
1045
|
+
console.error("harnessmix Harness command could not claim the current Composer editor");
|
|
1026
1046
|
};
|
|
1027
1047
|
|
|
1028
1048
|
const applyThreadUsageUpdate = (update: ThreadUsageInspection): void => {
|
|
@@ -1377,30 +1397,30 @@ export function installRendererBindingProbe(
|
|
|
1377
1397
|
}
|
|
1378
1398
|
};
|
|
1379
1399
|
|
|
1380
|
-
const refreshMountedComposerTarget = (mounted: MountedComposer): boolean => {
|
|
1381
|
-
const currentTarget = findComposerModelTarget(mounted.composer);
|
|
1382
|
-
const resolution = composerTargetResolution(
|
|
1383
|
-
mounted.modelTarget,
|
|
1384
|
-
currentTarget,
|
|
1400
|
+
const refreshMountedComposerTarget = (mounted: MountedComposer): boolean => {
|
|
1401
|
+
const currentTarget = findComposerModelTarget(mounted.composer);
|
|
1402
|
+
const resolution = composerTargetResolution(
|
|
1403
|
+
mounted.modelTarget,
|
|
1404
|
+
currentTarget,
|
|
1385
1405
|
controller.get(mounted.composer).phase,
|
|
1386
1406
|
controller.isSubmissionPending(mounted.composer),
|
|
1387
1407
|
);
|
|
1388
1408
|
if (resolution === "none") return false;
|
|
1389
1409
|
|
|
1390
|
-
const nextHostId = activeModelHostId() ?? mounted.hostId;
|
|
1410
|
+
const nextHostId = activeModelHostId() ?? mounted.hostId;
|
|
1391
1411
|
const nextControllerTarget = controllerTarget(currentTarget, nextHostId);
|
|
1392
1412
|
mounted.modelTarget = currentTarget;
|
|
1393
1413
|
mounted.hostId = nextHostId;
|
|
1394
|
-
const rebound =
|
|
1395
|
-
resolution === "transfer"
|
|
1396
|
-
? controller.transfer(mounted.composer, mounted.composer, nextControllerTarget)
|
|
1397
|
-
: controller.rebindTarget(
|
|
1398
|
-
mounted.composer,
|
|
1399
|
-
nextControllerTarget,
|
|
1400
|
-
currentTarget?.[0] === "default"
|
|
1401
|
-
? readNewThreadAgentPreference(enabledAgentSet)
|
|
1402
|
-
: undefined,
|
|
1403
|
-
) !== null;
|
|
1414
|
+
const rebound =
|
|
1415
|
+
resolution === "transfer"
|
|
1416
|
+
? controller.transfer(mounted.composer, mounted.composer, nextControllerTarget)
|
|
1417
|
+
: controller.rebindTarget(
|
|
1418
|
+
mounted.composer,
|
|
1419
|
+
nextControllerTarget,
|
|
1420
|
+
currentTarget?.[0] === "default"
|
|
1421
|
+
? readNewThreadAgentPreference(enabledAgentSet)
|
|
1422
|
+
: undefined,
|
|
1423
|
+
) !== null;
|
|
1404
1424
|
if (!rebound) {
|
|
1405
1425
|
mounted.ownershipStatus = "error";
|
|
1406
1426
|
renderMounted(mounted);
|
|
@@ -1412,27 +1432,27 @@ export function installRendererBindingProbe(
|
|
|
1412
1432
|
if (shouldRetryExternalThreadUsage(controller.get(mounted.composer).agent, null, null)) {
|
|
1413
1433
|
scheduleThreadUsageRefresh(mounted);
|
|
1414
1434
|
}
|
|
1415
|
-
} else {
|
|
1416
|
-
mounted.composerId = controller.get(mounted.composer).composerId;
|
|
1435
|
+
} else {
|
|
1436
|
+
mounted.composerId = controller.get(mounted.composer).composerId;
|
|
1417
1437
|
mounted.modelView = { status: "idle" };
|
|
1418
1438
|
mounted.permissionModeView = { status: "idle" };
|
|
1419
1439
|
mounted.threadConfiguration = undefined;
|
|
1420
|
-
mounted.ownershipStatus =
|
|
1421
|
-
currentTarget?.[0] === "conversation" ? "loading" : "not-required";
|
|
1440
|
+
mounted.ownershipStatus =
|
|
1441
|
+
currentTarget?.[0] === "conversation" ? "loading" : "not-required";
|
|
1422
1442
|
mounted.usage = null;
|
|
1423
1443
|
mounted.accountCredits = null;
|
|
1424
1444
|
mounted.usageRequestGeneration += 1;
|
|
1425
1445
|
usageRefreshAttempts.delete(mounted.composer);
|
|
1426
|
-
renderMounted(mounted);
|
|
1427
|
-
if (currentTarget?.[0] === "conversation") {
|
|
1428
|
-
void loadThreadOwnership(mounted);
|
|
1429
|
-
} else {
|
|
1430
|
-
applyComposerAgent(mounted.composer);
|
|
1431
|
-
const state = controller.get(mounted.composer);
|
|
1432
|
-
if (state.agent !== "codex") void loadExternalCatalog(mounted);
|
|
1433
|
-
void refreshDraftCodexUsage(mounted);
|
|
1434
|
-
void refreshCommands(mounted);
|
|
1435
|
-
}
|
|
1446
|
+
renderMounted(mounted);
|
|
1447
|
+
if (currentTarget?.[0] === "conversation") {
|
|
1448
|
+
void loadThreadOwnership(mounted);
|
|
1449
|
+
} else {
|
|
1450
|
+
applyComposerAgent(mounted.composer);
|
|
1451
|
+
const state = controller.get(mounted.composer);
|
|
1452
|
+
if (state.agent !== "codex") void loadExternalCatalog(mounted);
|
|
1453
|
+
void refreshDraftCodexUsage(mounted);
|
|
1454
|
+
void refreshCommands(mounted);
|
|
1455
|
+
}
|
|
1436
1456
|
}
|
|
1437
1457
|
sidebarAgentIcons.refresh();
|
|
1438
1458
|
return true;
|
|
@@ -2164,12 +2184,11 @@ export function installRendererBindingProbe(
|
|
|
2164
2184
|
sidebarAgentIcons.refresh();
|
|
2165
2185
|
return switched;
|
|
2166
2186
|
} catch {
|
|
2167
|
-
|
|
2168
|
-
|
|
2169
|
-
|
|
2170
|
-
|
|
2171
|
-
|
|
2172
|
-
};
|
|
2187
|
+
// A failed draft-prewarm clear is transient (timers may be throttled in a
|
|
2188
|
+
// hidden window). The Adapter owns its status lifecycle and recovers via
|
|
2189
|
+
// its own recapture path; replacing the live status object here detached
|
|
2190
|
+
// every picker from future status updates and latched "unsupported".
|
|
2191
|
+
renderMounted(mounted);
|
|
2173
2192
|
return false;
|
|
2174
2193
|
} finally {
|
|
2175
2194
|
for (const candidate of mountedByComposer.values()) {
|
|
@@ -2225,7 +2244,7 @@ export function installRendererBindingProbe(
|
|
|
2225
2244
|
const policy = await waitForRendererDraftPrewarmPolicy(window);
|
|
2226
2245
|
if (!isCurrent() || policy.hostId !== hostId) return;
|
|
2227
2246
|
await policy.clear();
|
|
2228
|
-
if (!isCurrent() || window.
|
|
2247
|
+
if (!isCurrent() || window.__harnessmixDraftPrewarmPolicyV1 !== policy) return;
|
|
2229
2248
|
if (!policy.selectAccount) throw new Error("Codex Account selection is unavailable");
|
|
2230
2249
|
policy.selectAccount(codexAccountRouteOverride(accounts.accounts, accountId));
|
|
2231
2250
|
accounts.overrideAccountId =
|
|
@@ -2322,7 +2341,7 @@ export function installRendererBindingProbe(
|
|
|
2322
2341
|
await Promise.all(
|
|
2323
2342
|
agentsToInspect.map(async (agent) => {
|
|
2324
2343
|
let status: RendererAgentAvailability = "error";
|
|
2325
|
-
let nextError:
|
|
2344
|
+
let nextError: HarnessMixError | undefined;
|
|
2326
2345
|
let webUiAvailable = false;
|
|
2327
2346
|
try {
|
|
2328
2347
|
const inspection = await client.inspectHarness({
|
|
@@ -2714,7 +2733,7 @@ export function installRendererBindingProbe(
|
|
|
2714
2733
|
const state = controller.get(composer);
|
|
2715
2734
|
const hideCodexControls = controller.isSwitching(composer) || state.agent !== "codex";
|
|
2716
2735
|
reconcileComposerNativeControls(mounted.control, hideCodexControls, hideCodexControls);
|
|
2717
|
-
if (refreshTargets) refreshMountedComposerTarget(mounted);
|
|
2736
|
+
if (refreshTargets) refreshMountedComposerTarget(mounted);
|
|
2718
2737
|
}
|
|
2719
2738
|
for (const editor of document.querySelectorAll(EDITOR_SELECTOR)) {
|
|
2720
2739
|
const composer = composerForEditor(editor);
|
|
@@ -2843,7 +2862,7 @@ export function installRendererBindingProbe(
|
|
|
2843
2862
|
composerCodexAccounts(composer)?.accounts ?? [],
|
|
2844
2863
|
accountId,
|
|
2845
2864
|
);
|
|
2846
|
-
const policy = window.
|
|
2865
|
+
const policy = window.__harnessmixDraftPrewarmPolicyV1;
|
|
2847
2866
|
if (override !== null && (policy?.hostId !== mounted.hostId || !policy.selectAccount)) {
|
|
2848
2867
|
return false;
|
|
2849
2868
|
}
|
|
@@ -2884,6 +2903,7 @@ export function installRendererBindingProbe(
|
|
|
2884
2903
|
blockEvent(event);
|
|
2885
2904
|
return;
|
|
2886
2905
|
}
|
|
2906
|
+
harnessMentions.prepareSubmission(composer);
|
|
2887
2907
|
notifySubmission(composer, "submit");
|
|
2888
2908
|
};
|
|
2889
2909
|
const onKeyDown = (event: KeyboardEvent): void => {
|
|
@@ -2911,6 +2931,7 @@ export function installRendererBindingProbe(
|
|
|
2911
2931
|
blockEvent(event);
|
|
2912
2932
|
return;
|
|
2913
2933
|
}
|
|
2934
|
+
harnessMentions.prepareSubmission(composer);
|
|
2914
2935
|
notifySubmission(composer, "enter");
|
|
2915
2936
|
};
|
|
2916
2937
|
const onClick = (event: MouseEvent): void => {
|
|
@@ -2925,6 +2946,7 @@ export function installRendererBindingProbe(
|
|
|
2925
2946
|
blockEvent(event);
|
|
2926
2947
|
return;
|
|
2927
2948
|
}
|
|
2949
|
+
harnessMentions.prepareSubmission(composer);
|
|
2928
2950
|
notifySubmission(composer, "click");
|
|
2929
2951
|
};
|
|
2930
2952
|
|
|
@@ -2992,8 +3014,8 @@ export function installRendererBindingProbe(
|
|
|
2992
3014
|
void refreshHarnessAvailability(true);
|
|
2993
3015
|
}
|
|
2994
3016
|
};
|
|
2995
|
-
window.addEventListener("
|
|
2996
|
-
window.addEventListener("
|
|
3017
|
+
window.addEventListener("harnessmix:draft-prewarm-policy-changed", onHostRouteChange);
|
|
3018
|
+
window.addEventListener("harnessmix:renderer-adapter-status", onAdapterStatus);
|
|
2997
3019
|
window.addEventListener("focus", onWindowFocus);
|
|
2998
3020
|
|
|
2999
3021
|
const connectedComposers = (): MountedComposer[] =>
|
|
@@ -3115,13 +3137,14 @@ export function installRendererBindingProbe(
|
|
|
3115
3137
|
sidebarAgentIcons.dispose();
|
|
3116
3138
|
harnessMentions.dispose();
|
|
3117
3139
|
collabCards.dispose();
|
|
3140
|
+
teamCards.dispose();
|
|
3118
3141
|
settingsLifecycle.dispose();
|
|
3119
3142
|
document.removeEventListener("beforeinput", onBeforeInput, true);
|
|
3120
3143
|
document.removeEventListener("submit", onSubmit, true);
|
|
3121
3144
|
document.removeEventListener("keydown", onKeyDown, true);
|
|
3122
3145
|
document.removeEventListener("click", onClick, true);
|
|
3123
|
-
window.removeEventListener("
|
|
3124
|
-
window.removeEventListener("
|
|
3146
|
+
window.removeEventListener("harnessmix:draft-prewarm-policy-changed", onHostRouteChange);
|
|
3147
|
+
window.removeEventListener("harnessmix:renderer-adapter-status", onAdapterStatus);
|
|
3125
3148
|
window.removeEventListener("focus", onWindowFocus);
|
|
3126
3149
|
for (const state of harnessAvailabilityByHost.values()) {
|
|
3127
3150
|
state.requestGeneration += 1;
|
|
@@ -3139,10 +3162,10 @@ export function installRendererBindingProbe(
|
|
|
3139
3162
|
pendingReplacements.clear();
|
|
3140
3163
|
connectionListeners.clear();
|
|
3141
3164
|
connectionDiagnostics = null;
|
|
3142
|
-
delete window.
|
|
3165
|
+
delete window.__harnessmixRendererBindingProbeV1;
|
|
3143
3166
|
},
|
|
3144
3167
|
};
|
|
3145
|
-
window.
|
|
3168
|
+
window.__harnessmixRendererBindingProbeV1 = api;
|
|
3146
3169
|
scan();
|
|
3147
3170
|
return api;
|
|
3148
3171
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type HostThreadId, hostThreadIdSchema } from '@
|
|
1
|
+
import { type HostThreadId, hostThreadIdSchema } from '@harnessmix/shared-contracts';
|
|
2
2
|
import { openRendererThread } from './renderer-fork-control.js';
|
|
3
3
|
import { collaborationIcon } from './collaboration-icon.js';
|
|
4
4
|
|
|
@@ -9,7 +9,7 @@ import type {
|
|
|
9
9
|
CodexAccountSummary,
|
|
10
10
|
HarnessCommandDescriptor,
|
|
11
11
|
ThreadUsageSnapshot,
|
|
12
|
-
} from "@
|
|
12
|
+
} from "@harnessmix/shared-contracts";
|
|
13
13
|
import {
|
|
14
14
|
CONTROL_ATTRIBUTE,
|
|
15
15
|
mountRendererAgentPicker,
|
|
@@ -125,11 +125,11 @@ function buttonText(button: HTMLButtonElement): string {
|
|
|
125
125
|
function isOwnedRendererControl(element: Element): boolean {
|
|
126
126
|
return (
|
|
127
127
|
element.hasAttribute(CONTROL_ATTRIBUTE) ||
|
|
128
|
-
element.hasAttribute("data-
|
|
129
|
-
element.hasAttribute("data-
|
|
130
|
-
element.hasAttribute("data-
|
|
131
|
-
element.hasAttribute("data-
|
|
132
|
-
element.hasAttribute("data-
|
|
128
|
+
element.hasAttribute("data-harnessmix-model-control") ||
|
|
129
|
+
element.hasAttribute("data-harnessmix-permission-mode-control") ||
|
|
130
|
+
element.hasAttribute("data-harnessmix-usage-control") ||
|
|
131
|
+
element.hasAttribute("data-harnessmix-credits-control") ||
|
|
132
|
+
element.hasAttribute("data-harnessmix-harness-command-control")
|
|
133
133
|
);
|
|
134
134
|
}
|
|
135
135
|
|
|
@@ -231,7 +231,7 @@ function isRecord(value: unknown): value is Record<string, unknown> {
|
|
|
231
231
|
export function isNativeModelControlCandidate(element: Element): boolean {
|
|
232
232
|
if (
|
|
233
233
|
element.hasAttribute(CONTROL_ATTRIBUTE) ||
|
|
234
|
-
element.hasAttribute("data-
|
|
234
|
+
element.hasAttribute("data-harnessmix-model-control") ||
|
|
235
235
|
!element.matches('button[aria-haspopup="menu"]')
|
|
236
236
|
) {
|
|
237
237
|
return false;
|
|
@@ -274,7 +274,7 @@ export function isNativeModelControlCandidate(element: Element): boolean {
|
|
|
274
274
|
export function isNativePermissionModeControlCandidate(element: Element): boolean {
|
|
275
275
|
if (
|
|
276
276
|
element.hasAttribute(CONTROL_ATTRIBUTE) ||
|
|
277
|
-
element.hasAttribute("data-
|
|
277
|
+
element.hasAttribute("data-harnessmix-permission-mode-control") ||
|
|
278
278
|
!element.matches('button[aria-haspopup="menu"][data-composer-navigation-target="permissions"]')
|
|
279
279
|
) {
|
|
280
280
|
return false;
|
|
@@ -321,7 +321,7 @@ function semanticNativePermissionModeControlForComposer(composer: Element): HTML
|
|
|
321
321
|
...composer.querySelectorAll<HTMLElement>(
|
|
322
322
|
'button[aria-haspopup="menu"][data-composer-navigation-target="permissions"]',
|
|
323
323
|
),
|
|
324
|
-
].filter((element) => !element.hasAttribute("data-
|
|
324
|
+
].filter((element) => !element.hasAttribute("data-harnessmix-permission-mode-control"));
|
|
325
325
|
return candidates.length === 1 ? (candidates[0] ?? null) : null;
|
|
326
326
|
}
|
|
327
327
|
|
|
@@ -339,8 +339,8 @@ function nativeModelControlForComposer(composer: Element): HTMLElement | null {
|
|
|
339
339
|
|
|
340
340
|
export function isNativeContextUsageControlCandidate(element: Element): boolean {
|
|
341
341
|
if (
|
|
342
|
-
element.hasAttribute("data-
|
|
343
|
-
element.hasAttribute("data-
|
|
342
|
+
element.hasAttribute("data-harnessmix-usage-control") ||
|
|
343
|
+
element.hasAttribute("data-harnessmix-credits-control")
|
|
344
344
|
) {
|
|
345
345
|
return false;
|
|
346
346
|
}
|
|
@@ -412,7 +412,7 @@ export function inspectRendererComposerContract(
|
|
|
412
412
|
...composer.querySelectorAll<HTMLElement>(
|
|
413
413
|
'button[aria-haspopup="menu"][data-composer-navigation-target="permissions"]',
|
|
414
414
|
),
|
|
415
|
-
].filter((element) => !element.hasAttribute("data-
|
|
415
|
+
].filter((element) => !element.hasAttribute("data-harnessmix-permission-mode-control"));
|
|
416
416
|
result.permissionCandidateCount += permissionCandidates.length;
|
|
417
417
|
result.verifiedPermissionCandidateCount += permissionCandidates.filter(
|
|
418
418
|
isNativePermissionModeControlCandidate,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AccountCreditsSnapshot } from "@
|
|
1
|
+
import type { AccountCreditsSnapshot } from "@harnessmix/shared-contracts";
|
|
2
2
|
|
|
3
3
|
import type { RendererSettingsLocale } from "./settings/localization.js";
|
|
4
4
|
|
|
@@ -144,7 +144,7 @@ function remainingPercent(usedPercent: number): number {
|
|
|
144
144
|
|
|
145
145
|
function renderCreditsBar(usagePercent: number, color: string): HTMLDivElement {
|
|
146
146
|
const track = document.createElement("div");
|
|
147
|
-
track.dataset.
|
|
147
|
+
track.dataset.harnessmixCreditsBar = "";
|
|
148
148
|
track.style.height = "6px";
|
|
149
149
|
track.style.borderRadius = "9999px";
|
|
150
150
|
track.style.background = "color-mix(in srgb, currentColor 12%, transparent)";
|
|
@@ -352,7 +352,7 @@ export function mountRendererCreditsControl(composerId: string): RendererCredits
|
|
|
352
352
|
ensureRendererTriggerChipStyle(document);
|
|
353
353
|
|
|
354
354
|
const root = document.createElement("div");
|
|
355
|
-
root.dataset.
|
|
355
|
+
root.dataset.harnessmixCreditsControl = composerId;
|
|
356
356
|
root.className = "relative min-w-0";
|
|
357
357
|
root.style.display = "none";
|
|
358
358
|
root.style.alignItems = "center";
|
|
@@ -384,12 +384,12 @@ export function mountRendererCreditsControl(composerId: string): RendererCredits
|
|
|
384
384
|
trigger.style.letterSpacing = "0";
|
|
385
385
|
|
|
386
386
|
const ringSlot = document.createElement("span");
|
|
387
|
-
ringSlot.dataset.
|
|
387
|
+
ringSlot.dataset.harnessmixCreditsRing = "";
|
|
388
388
|
ringSlot.style.display = "inline-flex";
|
|
389
389
|
ringSlot.style.flex = "0 0 auto";
|
|
390
390
|
|
|
391
391
|
const label = document.createElement("span");
|
|
392
|
-
label.dataset.
|
|
392
|
+
label.dataset.harnessmixCreditsLabel = "";
|
|
393
393
|
label.style.display = "inline-block";
|
|
394
394
|
label.style.maxWidth = "100%";
|
|
395
395
|
label.style.overflow = "hidden";
|
|
@@ -500,8 +500,8 @@ export function renderRendererCreditsControl(
|
|
|
500
500
|
const percent = formatRendererCreditsPercent(remaining);
|
|
501
501
|
const title = `${creditsPeriodLabel(accountCredits.periodType)} ${percent}`;
|
|
502
502
|
const tone = rendererCreditsTone(accountCredits.usedPercent);
|
|
503
|
-
const ringSlot = control.trigger.querySelector<HTMLElement>("[data-
|
|
504
|
-
const label = control.trigger.querySelector<HTMLElement>("[data-
|
|
503
|
+
const ringSlot = control.trigger.querySelector<HTMLElement>("[data-harnessmix-credits-ring]");
|
|
504
|
+
const label = control.trigger.querySelector<HTMLElement>("[data-harnessmix-credits-label]");
|
|
505
505
|
if (ringSlot) {
|
|
506
506
|
ringSlot.replaceChildren(
|
|
507
507
|
createRendererUsageRing(remaining, {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { threadOwnershipListResultSchema } from "@
|
|
1
|
+
import { threadOwnershipListResultSchema } from "@harnessmix/shared-contracts";
|
|
2
2
|
|
|
3
3
|
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
4
4
|
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
@@ -219,7 +219,7 @@ export function installRendererExternalSteering(target: unknown): (() => void) |
|
|
|
219
219
|
// Official steering must not depend on our additional presentation binding.
|
|
220
220
|
}
|
|
221
221
|
const ownership = threadOwnershipListResultSchema.parse(
|
|
222
|
-
await originalSend.call(manager, "
|
|
222
|
+
await originalSend.call(manager, "harnessmix/thread/ownership/list", {
|
|
223
223
|
threadIds: [threadId],
|
|
224
224
|
}),
|
|
225
225
|
);
|
|
@@ -311,7 +311,7 @@ export function installRendererExternalSteering(target: unknown): (() => void) |
|
|
|
311
311
|
resumeQueue();
|
|
312
312
|
} catch {
|
|
313
313
|
// Never turn an accepted input into a failed delivery (and invite a retry).
|
|
314
|
-
console.error("
|
|
314
|
+
console.error("harnessmix could not restore follow-up queue state after steering");
|
|
315
315
|
}
|
|
316
316
|
return { turnId: response.turn.id };
|
|
317
317
|
})
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { HarnessCommandDescriptor } from "@
|
|
1
|
+
import type { HarnessCommandDescriptor } from "@harnessmix/shared-contracts";
|
|
2
2
|
|
|
3
3
|
function inputEvent(editor: HTMLElement, text: string): Event {
|
|
4
4
|
const view = editor.ownerDocument.defaultView;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { HarnessCommandDescriptor } from "@
|
|
1
|
+
import type { HarnessCommandDescriptor } from "@harnessmix/shared-contracts";
|
|
2
2
|
|
|
3
3
|
import { rendererHarnessCommandExecutesDirectly } from "./renderer-harness-command-claim.js";
|
|
4
4
|
import {
|
|
@@ -8,8 +8,8 @@ import {
|
|
|
8
8
|
} from "./renderer-harness-localization.js";
|
|
9
9
|
import type { RendererSettingsLocale } from "./settings/localization.js";
|
|
10
10
|
|
|
11
|
-
const CONTROL_ATTRIBUTE = "data-
|
|
12
|
-
const MENU_ATTRIBUTE = "data-
|
|
11
|
+
const CONTROL_ATTRIBUTE = "data-harnessmix-harness-command-control";
|
|
12
|
+
const MENU_ATTRIBUTE = "data-harnessmix-harness-command-menu";
|
|
13
13
|
const MENU_WIDTH = 320;
|
|
14
14
|
const VIEWPORT_MARGIN = 8;
|
|
15
15
|
const MENU_GAP = 8;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ExternalRendererAgent } from "./agent-selection-state.js";
|
|
2
|
-
import type { HarnessHandoffIncludes, HarnessHandoffIntent } from "@
|
|
2
|
+
import type { HarnessHandoffIncludes, HarnessHandoffIntent } from "@harnessmix/shared-contracts";
|
|
3
3
|
import { createRendererAgentIcon, RENDERER_AGENT_LABELS } from "./renderer-agent-icon.js";
|
|
4
4
|
import type { RendererSettingsLocale } from "./settings/localization.js";
|
|
5
5
|
|