harness-mix 0.1.0
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/LICENSE +202 -0
- package/NOTICE +14 -0
- package/README.md +184 -0
- package/Start-Codex.cmd +5 -0
- package/config/codex-desktop-compatibility.json +23 -0
- package/docs/chatgpt-web-sidebar.md +27 -0
- package/docs/harness-management.md +41 -0
- package/docs/images/harness-mix-home.png +0 -0
- package/docs/images/harness-mix-session.png +0 -0
- package/docs/multi-agent-collaboration.md +89 -0
- package/docs/native-codex.md +72 -0
- package/licenses/codex-host-MIT.txt +21 -0
- package/output/native-build/desktop-controller.mjs +1460 -0
- package/output/native-build/harness-mix-appx.exe +0 -0
- package/output/native-build/harness-mix-shim.exe +0 -0
- package/output/native-build/renderer-extension.js +28884 -0
- package/package.json +142 -0
- package/scripts/acp-capabilities-probe.cjs +100 -0
- package/scripts/adapters-test.cjs +17 -0
- package/scripts/antigravity-adapter-test.cjs +174 -0
- package/scripts/architecture-test.cjs +62 -0
- package/scripts/build-native.cjs +46 -0
- package/scripts/catalog-test.cjs +25 -0
- package/scripts/cdp-eval.cjs +40 -0
- package/scripts/cdp-watch.cjs +36 -0
- package/scripts/check.cjs +23 -0
- package/scripts/codex-adapter-test.cjs +83 -0
- package/scripts/collaboration-recovery-test.cjs +91 -0
- package/scripts/collaboration-test.cjs +102 -0
- package/scripts/collaboration-ui-smoke.cjs +52 -0
- package/scripts/concurrency-layers-test.cjs +179 -0
- package/scripts/contracts-test.cjs +105 -0
- package/scripts/core-concurrency-test.cjs +103 -0
- package/scripts/core-replay-test.cjs +179 -0
- package/scripts/core-runtime-test.cjs +104 -0
- package/scripts/core-services-test.cjs +50 -0
- package/scripts/determinism-test.cjs +36 -0
- package/scripts/docs-command-test.cjs +49 -0
- package/scripts/dsh-adapter-test.cjs +87 -0
- package/scripts/dsh-native.cjs +9 -0
- package/scripts/dsh-native.cmd +2 -0
- package/scripts/e2e-codex.cjs +82 -0
- package/scripts/e2e-collaboration.cjs +58 -0
- package/scripts/e2e-core-files.cjs +58 -0
- package/scripts/e2e-core-fork.cjs +49 -0
- package/scripts/e2e-core-resume.cjs +49 -0
- package/scripts/e2e-delegate.cjs +38 -0
- package/scripts/e2e-dsh.cjs +23 -0
- package/scripts/e2e-native-commands.cjs +54 -0
- package/scripts/e2e-native-host.cjs +144 -0
- package/scripts/e2e-openclaw-image.cjs +59 -0
- package/scripts/e2e-openclaw.cjs +21 -0
- package/scripts/e2e-pi.cjs +23 -0
- package/scripts/e2e-shadow.cjs +52 -0
- package/scripts/fixture-capture.cjs +103 -0
- package/scripts/git-test.cjs +33 -0
- package/scripts/launch-codex.cjs +5 -0
- package/scripts/native-compatibility-test.cjs +42 -0
- package/scripts/native-config-test.cjs +25 -0
- package/scripts/native-file-change-test.cjs +94 -0
- package/scripts/native-host.cjs +8 -0
- package/scripts/native-images-test.cjs +56 -0
- package/scripts/native-protocol-test.cjs +233 -0
- package/scripts/native-rollback-test.cjs +46 -0
- package/scripts/native-sidebar-test.cjs +88 -0
- package/scripts/native-ui-smoke.cjs +94 -0
- package/scripts/native-updater-test.cjs +100 -0
- package/scripts/native-vendor-adapters-test.cjs +40 -0
- package/scripts/openclaw-acp-probe.cjs +39 -0
- package/scripts/openclaw-adapter-test.cjs +180 -0
- package/scripts/openclaw-models-probe.cjs +13 -0
- package/scripts/projector-test.cjs +144 -0
- package/scripts/sequence-test.cjs +57 -0
- package/scripts/shadow-test.cjs +154 -0
- package/scripts/support/legacy-projection.cjs +95 -0
- package/scripts/support/legacy-transcript.cjs +48 -0
- package/scripts/support/parity-observer.cjs +27 -0
- package/scripts/support/shadow-comparator.cjs +62 -0
- package/scripts/support/shadow.cjs +114 -0
- package/scripts/switch-harness-test.cjs +145 -0
- package/scripts/tool-concurrency-regression-test.cjs +118 -0
- package/scripts/transcript-test.cjs +24 -0
- package/scripts/turn-manager-test.cjs +91 -0
- package/scripts/workspace-test.cjs +98 -0
- package/src/assets/brand-harness-mix.png +0 -0
- package/src/assets/icons/activity-compact.svg +1 -0
- package/src/assets/icons/activity-edit.svg +1 -0
- package/src/assets/icons/activity-terminal.svg +1 -0
- package/src/assets/icons/antigravity-color.svg +1 -0
- package/src/assets/icons/claude-color.svg +1 -0
- package/src/assets/icons/codex-color.svg +1 -0
- package/src/assets/icons/codex-harness.svg +1 -0
- package/src/assets/icons/commands.svg +1 -0
- package/src/assets/icons/deepseek-color.svg +1 -0
- package/src/assets/icons/grok-color.svg +1 -0
- package/src/assets/icons/hermes-color.svg +1 -0
- package/src/assets/icons/home-chat.svg +1 -0
- package/src/assets/icons/home-folder.svg +1 -0
- package/src/assets/icons/model-astra.svg +1 -0
- package/src/assets/icons/model-claude.svg +1 -0
- package/src/assets/icons/model-deepseek.svg +1 -0
- package/src/assets/icons/model-gemini.svg +1 -0
- package/src/assets/icons/model-hunyuan.svg +1 -0
- package/src/assets/icons/model-kimi.svg +1 -0
- package/src/assets/icons/model-minimax.svg +1 -0
- package/src/assets/icons/model-openai.svg +1 -0
- package/src/assets/icons/model-qwen-color.svg +1 -0
- package/src/assets/icons/model-xiaomimimo.svg +1 -0
- package/src/assets/icons/model-zai.svg +1 -0
- package/src/assets/icons/omp-color.svg +1 -0
- package/src/assets/icons/openclaw-color.svg +1 -0
- package/src/assets/icons/opencode-color.svg +1 -0
- package/src/assets/icons/pi.svg +1 -0
- package/src/assets/icons/pinumber1_80899.svg +48 -0
- package/src/assets/icons/qoder-color.svg +1 -0
- package/src/assets/icons/thread-fork.svg +1 -0
- package/src/assets/icons/trae-color.svg +1 -0
- package/src/assets/icons/workbuddy-color.svg +1 -0
- package/src/assets/icons/zcode-color.svg +1 -0
- package/src/main/adapters/acp.js +171 -0
- package/src/main/adapters/antigravity.js +895 -0
- package/src/main/adapters/claude.js +399 -0
- package/src/main/adapters/codex-app-server.js +119 -0
- package/src/main/adapters/codex.js +547 -0
- package/src/main/adapters/dsh-web-host.js +207 -0
- package/src/main/adapters/dsh.js +415 -0
- package/src/main/adapters/grok.js +161 -0
- package/src/main/adapters/hermes.js +24 -0
- package/src/main/adapters/index.js +30 -0
- package/src/main/adapters/omp.js +12 -0
- package/src/main/adapters/openclaw-gateway.js +215 -0
- package/src/main/adapters/openclaw.js +337 -0
- package/src/main/adapters/opencode-server.js +72 -0
- package/src/main/adapters/opencode.js +166 -0
- package/src/main/adapters/pi-family.js +315 -0
- package/src/main/adapters/pi-usage.js +24 -0
- package/src/main/adapters/pi.js +10 -0
- package/src/main/adapters/qoder.js +35 -0
- package/src/main/adapters/trae.js +19 -0
- package/src/main/adapters/workbuddy.js +67 -0
- package/src/main/adapters/zcode.js +38 -0
- package/src/main/harness-adapter/contract-test.js +53 -0
- package/src/main/harness-adapter/contract.js +34 -0
- package/src/main/harness-adapter/event-normalizer.js +233 -0
- package/src/main/harness-adapter/fixture-recorder.js +56 -0
- package/src/main/harness-adapter/index.js +6 -0
- package/src/main/harness-adapter/manifest.js +44 -0
- package/src/main/host/collaboration-mcp.cjs +35 -0
- package/src/main/host/collaboration-pi.mjs +17 -0
- package/src/main/host/collaboration-tools.js +16 -0
- package/src/main/host/collaboration-worktree.js +82 -0
- package/src/main/host/collaboration.js +238 -0
- package/src/main/host/core-session.js +81 -0
- package/src/main/host/handoff.js +46 -0
- package/src/main/host/history-import.js +55 -0
- package/src/main/host/jsonl.js +115 -0
- package/src/main/host/native-history.js +74 -0
- package/src/main/host/runtime.js +927 -0
- package/src/main/host/session-history.js +63 -0
- package/src/main/host/store.js +42 -0
- package/src/main/native/compatibility.js +55 -0
- package/src/main/native/config.js +49 -0
- package/src/main/native/host.js +108 -0
- package/src/main/native/icons.js +101 -0
- package/src/main/native/input.js +43 -0
- package/src/main/native/launcher.js +100 -0
- package/src/main/native/protocol.js +552 -0
- package/src/main/native/rs/Cargo.lock +11 -0
- package/src/main/native/rs/Cargo.toml +9 -0
- package/src/main/native/rs/crates/appx/Cargo.toml +13 -0
- package/src/main/native/rs/crates/appx/src/main.rs +309 -0
- package/src/main/native/rs/crates/shim/Cargo.toml +10 -0
- package/src/main/native/rs/crates/shim/src/main.rs +207 -0
- package/src/main/native/thread-list.js +38 -0
- package/src/main/native/updater.js +102 -0
- package/src/main/native/usage.js +29 -0
- package/src/main/protocol-core/capability-manager.js +16 -0
- package/src/main/protocol-core/event-router.js +32 -0
- package/src/main/protocol-core/file-change-projector.js +45 -0
- package/src/main/protocol-core/index.js +8 -0
- package/src/main/protocol-core/interaction-router.js +30 -0
- package/src/main/protocol-core/projector.js +238 -0
- package/src/main/protocol-core/protocol-core.js +132 -0
- package/src/main/protocol-core/sequence-validator.js +44 -0
- package/src/main/protocol-core/thread-manager.js +50 -0
- package/src/main/protocol-core/turn-manager.js +63 -0
- package/src/main/shared-contracts/capability.js +35 -0
- package/src/main/shared-contracts/event.js +55 -0
- package/src/main/shared-contracts/ids.js +12 -0
- package/src/main/shared-contracts/index.js +11 -0
- package/src/main/shared-contracts/interaction.js +37 -0
- package/src/main/shared-contracts/item.js +50 -0
- package/src/main/shared-contracts/native-ref.js +24 -0
- package/src/main/shared-contracts/thread.js +36 -0
- package/src/main/shared-contracts/turn.js +54 -0
- package/src/main/workspace/core-review.js +53 -0
- package/src/main/workspace/diff.js +27 -0
- package/src/main/workspace/file-changes.js +21 -0
- package/src/main/workspace/files.js +65 -0
- package/src/main/workspace/git.js +73 -0
- package/src/main/workspace/ipc.js +50 -0
- package/src/main/workspace/review-controller.js +102 -0
- package/src/main/workspace/review.js +83 -0
- package/src/main/workspace/terminal.js +36 -0
- package/src/native-ui/LICENSE +21 -0
- package/src/native-ui/README.md +12 -0
- package/src/native-ui/desktop-control/dist/cdp-client.d.ts +53 -0
- package/src/native-ui/desktop-control/dist/cdp-client.d.ts.map +1 -0
- package/src/native-ui/desktop-control/dist/cdp-client.js +258 -0
- package/src/native-ui/desktop-control/dist/cdp-client.js.map +1 -0
- package/src/native-ui/desktop-control/dist/contract-audit.d.ts +73 -0
- package/src/native-ui/desktop-control/dist/contract-audit.d.ts.map +1 -0
- package/src/native-ui/desktop-control/dist/contract-audit.js +152 -0
- package/src/native-ui/desktop-control/dist/contract-audit.js.map +1 -0
- package/src/native-ui/desktop-control/dist/controller-attachment-server.d.ts +10 -0
- package/src/native-ui/desktop-control/dist/controller-attachment-server.d.ts.map +1 -0
- package/src/native-ui/desktop-control/dist/controller-attachment-server.js +77 -0
- package/src/native-ui/desktop-control/dist/controller-attachment-server.js.map +1 -0
- package/src/native-ui/desktop-control/dist/index.d.ts +21 -0
- package/src/native-ui/desktop-control/dist/index.d.ts.map +1 -0
- package/src/native-ui/desktop-control/dist/index.js +14 -0
- package/src/native-ui/desktop-control/dist/index.js.map +1 -0
- package/src/native-ui/desktop-control/dist/main-process-title-policy.d.ts +24 -0
- package/src/native-ui/desktop-control/dist/main-process-title-policy.d.ts.map +1 -0
- package/src/native-ui/desktop-control/dist/main-process-title-policy.js +246 -0
- package/src/native-ui/desktop-control/dist/main-process-title-policy.js.map +1 -0
- package/src/native-ui/desktop-control/dist/production-controller.d.ts +32 -0
- package/src/native-ui/desktop-control/dist/production-controller.d.ts.map +1 -0
- package/src/native-ui/desktop-control/dist/production-controller.js +291 -0
- package/src/native-ui/desktop-control/dist/production-controller.js.map +1 -0
- package/src/native-ui/desktop-control/dist/release-main.d.ts +2 -0
- package/src/native-ui/desktop-control/dist/release-main.d.ts.map +1 -0
- package/src/native-ui/desktop-control/dist/release-main.js +17 -0
- package/src/native-ui/desktop-control/dist/release-main.js.map +1 -0
- package/src/native-ui/desktop-control/dist/renderer-cdp-control-session.d.ts +49 -0
- package/src/native-ui/desktop-control/dist/renderer-cdp-control-session.d.ts.map +1 -0
- package/src/native-ui/desktop-control/dist/renderer-cdp-control-session.js +214 -0
- package/src/native-ui/desktop-control/dist/renderer-cdp-control-session.js.map +1 -0
- package/src/native-ui/desktop-control/dist/renderer-control-session.d.ts +79 -0
- package/src/native-ui/desktop-control/dist/renderer-control-session.d.ts.map +1 -0
- package/src/native-ui/desktop-control/dist/renderer-control-session.js +366 -0
- package/src/native-ui/desktop-control/dist/renderer-control-session.js.map +1 -0
- package/src/native-ui/desktop-control/dist/renderer-dom.d.ts +24 -0
- package/src/native-ui/desktop-control/dist/renderer-dom.d.ts.map +1 -0
- package/src/native-ui/desktop-control/dist/renderer-dom.js +110 -0
- package/src/native-ui/desktop-control/dist/renderer-dom.js.map +1 -0
- package/src/native-ui/desktop-control/dist/renderer-draft-prewarm-policy.d.ts +19 -0
- package/src/native-ui/desktop-control/dist/renderer-draft-prewarm-policy.d.ts.map +1 -0
- package/src/native-ui/desktop-control/dist/renderer-draft-prewarm-policy.js +162 -0
- package/src/native-ui/desktop-control/dist/renderer-draft-prewarm-policy.js.map +1 -0
- package/src/native-ui/desktop-control/dist/renderer-draft-prewarm-runtime.d.ts +38 -0
- package/src/native-ui/desktop-control/dist/renderer-draft-prewarm-runtime.d.ts.map +1 -0
- package/src/native-ui/desktop-control/dist/renderer-draft-prewarm-runtime.js +633 -0
- package/src/native-ui/desktop-control/dist/renderer-draft-prewarm-runtime.js.map +1 -0
- package/src/native-ui/desktop-control/dist/tsconfig.tsbuildinfo +1 -0
- package/src/native-ui/desktop-control/package.json +22 -0
- package/src/native-ui/desktop-control/scripts/build-release.mjs +94 -0
- package/src/native-ui/desktop-control/src/cdp-client.ts +347 -0
- package/src/native-ui/desktop-control/src/contract-audit.ts +291 -0
- package/src/native-ui/desktop-control/src/controller-attachment-server.ts +93 -0
- package/src/native-ui/desktop-control/src/index.ts +91 -0
- package/src/native-ui/desktop-control/src/main-process-title-policy.ts +334 -0
- package/src/native-ui/desktop-control/src/production-controller.ts +344 -0
- package/src/native-ui/desktop-control/src/release-main.ts +18 -0
- package/src/native-ui/desktop-control/src/renderer-cdp-control-session.ts +358 -0
- package/src/native-ui/desktop-control/src/renderer-control-session.ts +595 -0
- package/src/native-ui/desktop-control/src/renderer-dom.ts +144 -0
- package/src/native-ui/desktop-control/src/renderer-draft-prewarm-policy.ts +209 -0
- package/src/native-ui/desktop-control/src/renderer-draft-prewarm-runtime.ts +746 -0
- package/src/native-ui/desktop-control/test/cdp-client.test.ts +157 -0
- package/src/native-ui/desktop-control/test/contract-audit.test.ts +56 -0
- package/src/native-ui/desktop-control/test/controller-attachment-server.test.ts +98 -0
- package/src/native-ui/desktop-control/test/index.test.ts +11 -0
- package/src/native-ui/desktop-control/test/main-process-title-policy.test.ts +166 -0
- package/src/native-ui/desktop-control/test/production-controller.test.ts +389 -0
- package/src/native-ui/desktop-control/test/renderer-cdp-control-session.test.ts +205 -0
- package/src/native-ui/desktop-control/test/renderer-control-session.test.ts +451 -0
- package/src/native-ui/desktop-control/test/renderer-dom.test.ts +62 -0
- package/src/native-ui/desktop-control/test/renderer-draft-prewarm-policy.test.ts +998 -0
- package/src/native-ui/desktop-control/tsconfig.json +12 -0
- package/src/native-ui/renderer-extension/dist/types/agent-group-preference.d.ts +39 -0
- package/src/native-ui/renderer-extension/dist/types/agent-group-preference.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/agent-selection-state.d.ts +83 -0
- package/src/native-ui/renderer-extension/dist/types/agent-selection-state.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/audit-entry.d.ts +2 -0
- package/src/native-ui/renderer-extension/dist/types/audit-entry.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/codex-locale-adapter.d.ts +23 -0
- package/src/native-ui/renderer-extension/dist/types/codex-locale-adapter.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/collaboration-icon.d.ts +2 -0
- package/src/native-ui/renderer-extension/dist/types/collaboration-icon.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/contract-audit.d.ts +37 -0
- package/src/native-ui/renderer-extension/dist/types/contract-audit.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/harness-mix-icons.d.ts +3 -0
- package/src/native-ui/renderer-extension/dist/types/harness-mix-icons.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/harness-mix-settings.d.ts +3 -0
- package/src/native-ui/renderer-extension/dist/types/harness-mix-settings.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/index.d.ts +49 -0
- package/src/native-ui/renderer-extension/dist/types/index.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/install-renderer-binding.d.ts +4 -0
- package/src/native-ui/renderer-extension/dist/types/install-renderer-binding.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/probe-entry.d.ts +2 -0
- package/src/native-ui/renderer-extension/dist/types/probe-entry.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/production-entry.d.ts +9 -0
- package/src/native-ui/renderer-extension/dist/types/production-entry.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-agent-icon.d.ts +4 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-agent-icon.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-agent-picker.d.ts +62 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-agent-picker.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-binding-probe.d.ts +70 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-binding-probe.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-codex-account-options.d.ts +34 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-codex-account-options.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-codex-account-state.d.ts +19 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-codex-account-state.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-composer-dom.d.ts +82 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-composer-dom.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-credits-control.d.ts +21 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-credits-control.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-external-steering.d.ts +7 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-external-steering.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-fork-control.d.ts +34 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-fork-control.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-harness-command-claim.d.ts +4 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-harness-command-claim.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-harness-command-control.d.ts +15 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-harness-command-control.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-harness-localization.d.ts +25 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-harness-localization.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-harness-mentions.d.ts +23 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-harness-mentions.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-model-client.d.ts +94 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-model-client.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-model-picker-positioning.d.ts +22 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-model-picker-positioning.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-model-picker.d.ts +54 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-model-picker.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-new-thread-preference.d.ts +18 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-new-thread-preference.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-permission-mode-picker.d.ts +42 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-permission-mode-picker.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-permission-mode-preference.d.ts +9 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-permission-mode-preference.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-request-sender.d.ts +9 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-request-sender.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-session-import-client.d.ts +12 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-session-import-client.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-settings-lifecycle.d.ts +18 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-settings-lifecycle.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-sidebar-agent-icons.d.ts +45 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-sidebar-agent-icons.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-transcript-dom.d.ts +23 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-transcript-dom.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-trigger-chip-style.d.ts +3 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-trigger-chip-style.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-usage-control.d.ts +72 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-usage-control.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/settings/accounts-list.d.ts +24 -0
- package/src/native-ui/renderer-extension/dist/types/settings/accounts-list.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/settings/accounts-page.d.ts +18 -0
- package/src/native-ui/renderer-extension/dist/types/settings/accounts-page.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/settings/accounts-usage.d.ts +27 -0
- package/src/native-ui/renderer-extension/dist/types/settings/accounts-usage.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/settings/connections-page.d.ts +42 -0
- package/src/native-ui/renderer-extension/dist/types/settings/connections-page.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/settings/core.d.ts +38 -0
- package/src/native-ui/renderer-extension/dist/types/settings/core.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/settings/harness-accounts.d.ts +14 -0
- package/src/native-ui/renderer-extension/dist/types/settings/harness-accounts.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/settings/icons.d.ts +6 -0
- package/src/native-ui/renderer-extension/dist/types/settings/icons.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/settings/localization.d.ts +231 -0
- package/src/native-ui/renderer-extension/dist/types/settings/localization.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/settings/pages.d.ts +22 -0
- package/src/native-ui/renderer-extension/dist/types/settings/pages.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/settings/release-notes.d.ts +4 -0
- package/src/native-ui/renderer-extension/dist/types/settings/release-notes.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/settings/session-import-list-controls.d.ts +12 -0
- package/src/native-ui/renderer-extension/dist/types/settings/session-import-list-controls.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/settings/session-import-page.d.ts +8 -0
- package/src/native-ui/renderer-extension/dist/types/settings/session-import-page.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/settings/shell.d.ts +24 -0
- package/src/native-ui/renderer-extension/dist/types/settings/shell.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/settings/trigger.d.ts +45 -0
- package/src/native-ui/renderer-extension/dist/types/settings/trigger.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/settings/update-request.d.ts +6 -0
- package/src/native-ui/renderer-extension/dist/types/settings/update-request.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/tsconfig.tsbuildinfo +1 -0
- package/src/native-ui/renderer-extension/dist/types/versioned-renderer-adapter.d.ts +143 -0
- package/src/native-ui/renderer-extension/dist/types/versioned-renderer-adapter.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/package.json +22 -0
- package/src/native-ui/renderer-extension/src/agent-group-preference.ts +174 -0
- package/src/native-ui/renderer-extension/src/agent-selection-state.ts +610 -0
- package/src/native-ui/renderer-extension/src/assets/README.md +43 -0
- package/src/native-ui/renderer-extension/src/assets/antigravity-agent.svg +1 -0
- package/src/native-ui/renderer-extension/src/assets/claude-agent.svg +3 -0
- package/src/native-ui/renderer-extension/src/assets/codex-agent.png +0 -0
- package/src/native-ui/renderer-extension/src/assets/codex-logo-bright.png +0 -0
- package/src/native-ui/renderer-extension/src/assets/codex-logo-transparent.png +0 -0
- package/src/native-ui/renderer-extension/src/assets/codex-logo.png +0 -0
- package/src/native-ui/renderer-extension/src/assets/codexhost-icon.png +0 -0
- package/src/native-ui/renderer-extension/src/assets/codexhost-logo-transparent.png +0 -0
- package/src/native-ui/renderer-extension/src/assets/codexhost-logo.png +0 -0
- package/src/native-ui/renderer-extension/src/assets/codexhost-readme.svg +8 -0
- package/src/native-ui/renderer-extension/src/assets/grok-agent.png +0 -0
- package/src/native-ui/renderer-extension/src/assets/kiro-agent.svg +11 -0
- package/src/native-ui/renderer-extension/src/assets/omp-agent.svg +14 -0
- package/src/native-ui/renderer-extension/src/assets/opencode-agent.png +0 -0
- package/src/native-ui/renderer-extension/src/assets/pi-agent.svg +4 -0
- package/src/native-ui/renderer-extension/src/assets.d.ts +26 -0
- package/src/native-ui/renderer-extension/src/audit-entry.ts +5 -0
- package/src/native-ui/renderer-extension/src/codex-locale-adapter.ts +321 -0
- package/src/native-ui/renderer-extension/src/collaboration-icon.ts +13 -0
- package/src/native-ui/renderer-extension/src/contract-audit.ts +102 -0
- package/src/native-ui/renderer-extension/src/harness-mix-icons.ts +24 -0
- package/src/native-ui/renderer-extension/src/harness-mix-settings.ts +80 -0
- package/src/native-ui/renderer-extension/src/index.ts +266 -0
- package/src/native-ui/renderer-extension/src/install-renderer-binding.ts +30 -0
- package/src/native-ui/renderer-extension/src/probe-entry.ts +4 -0
- package/src/native-ui/renderer-extension/src/production-entry.ts +23 -0
- package/src/native-ui/renderer-extension/src/renderer-agent-icon.ts +145 -0
- package/src/native-ui/renderer-extension/src/renderer-agent-picker.ts +813 -0
- package/src/native-ui/renderer-extension/src/renderer-binding-probe.ts +2936 -0
- package/src/native-ui/renderer-extension/src/renderer-codex-account-options.ts +281 -0
- package/src/native-ui/renderer-extension/src/renderer-codex-account-state.ts +53 -0
- package/src/native-ui/renderer-extension/src/renderer-composer-dom.ts +782 -0
- package/src/native-ui/renderer-extension/src/renderer-credits-control.ts +500 -0
- package/src/native-ui/renderer-extension/src/renderer-external-steering.ts +339 -0
- package/src/native-ui/renderer-extension/src/renderer-fork-control.ts +273 -0
- package/src/native-ui/renderer-extension/src/renderer-harness-command-claim.ts +64 -0
- package/src/native-ui/renderer-extension/src/renderer-harness-command-control.ts +417 -0
- package/src/native-ui/renderer-extension/src/renderer-harness-localization.ts +144 -0
- package/src/native-ui/renderer-extension/src/renderer-harness-mentions.ts +213 -0
- package/src/native-ui/renderer-extension/src/renderer-model-client.ts +567 -0
- package/src/native-ui/renderer-extension/src/renderer-model-picker-positioning.ts +65 -0
- package/src/native-ui/renderer-extension/src/renderer-model-picker.ts +640 -0
- package/src/native-ui/renderer-extension/src/renderer-new-thread-preference.ts +175 -0
- package/src/native-ui/renderer-extension/src/renderer-permission-mode-picker.ts +413 -0
- package/src/native-ui/renderer-extension/src/renderer-permission-mode-preference.ts +49 -0
- package/src/native-ui/renderer-extension/src/renderer-request-sender.ts +43 -0
- package/src/native-ui/renderer-extension/src/renderer-session-import-client.ts +68 -0
- package/src/native-ui/renderer-extension/src/renderer-settings-lifecycle.ts +239 -0
- package/src/native-ui/renderer-extension/src/renderer-sidebar-agent-icons.ts +456 -0
- package/src/native-ui/renderer-extension/src/renderer-transcript-dom.ts +47 -0
- package/src/native-ui/renderer-extension/src/renderer-trigger-chip-style.ts +52 -0
- package/src/native-ui/renderer-extension/src/renderer-usage-control.ts +602 -0
- package/src/native-ui/renderer-extension/src/settings/accounts-list.ts +236 -0
- package/src/native-ui/renderer-extension/src/settings/accounts-page.ts +585 -0
- package/src/native-ui/renderer-extension/src/settings/accounts-quota-interactive.prototype.html +1418 -0
- package/src/native-ui/renderer-extension/src/settings/accounts-usage.ts +221 -0
- package/src/native-ui/renderer-extension/src/settings/accounts.css +607 -0
- package/src/native-ui/renderer-extension/src/settings/connections-page.ts +1354 -0
- package/src/native-ui/renderer-extension/src/settings/core.ts +158 -0
- package/src/native-ui/renderer-extension/src/settings/harness-accounts.ts +134 -0
- package/src/native-ui/renderer-extension/src/settings/icons.ts +141 -0
- package/src/native-ui/renderer-extension/src/settings/localization.ts +752 -0
- package/src/native-ui/renderer-extension/src/settings/pages.ts +615 -0
- package/src/native-ui/renderer-extension/src/settings/release-notes.ts +222 -0
- package/src/native-ui/renderer-extension/src/settings/session-import-list-controls.ts +128 -0
- package/src/native-ui/renderer-extension/src/settings/session-import-page.ts +461 -0
- package/src/native-ui/renderer-extension/src/settings/shell.css +2149 -0
- package/src/native-ui/renderer-extension/src/settings/shell.ts +329 -0
- package/src/native-ui/renderer-extension/src/settings/trigger.ts +323 -0
- package/src/native-ui/renderer-extension/src/settings/update-notes.preview.html +491 -0
- package/src/native-ui/renderer-extension/src/settings/update-request.ts +49 -0
- package/src/native-ui/renderer-extension/src/settings/windows-update.preview.html +2135 -0
- package/src/native-ui/renderer-extension/src/versioned-renderer-adapter.ts +1278 -0
- package/src/native-ui/renderer-extension/test/agent-selection-state.test.ts +611 -0
- package/src/native-ui/renderer-extension/test/codex-locale-adapter.test.ts +152 -0
- package/src/native-ui/renderer-extension/test/contract-audit.test.ts +71 -0
- package/src/native-ui/renderer-extension/test/index.test.ts +9 -0
- package/src/native-ui/renderer-extension/test/renderer-agent-icon.test.ts +98 -0
- package/src/native-ui/renderer-extension/test/renderer-agent-picker.test.ts +226 -0
- package/src/native-ui/renderer-extension/test/renderer-binding-probe-host-catalog.test.ts +728 -0
- package/src/native-ui/renderer-extension/test/renderer-binding-probe.test.ts +1290 -0
- package/src/native-ui/renderer-extension/test/renderer-codex-account-state.test.ts +65 -0
- package/src/native-ui/renderer-extension/test/renderer-composer-permissions.test.ts +75 -0
- package/src/native-ui/renderer-extension/test/renderer-credits-control.test.ts +70 -0
- package/src/native-ui/renderer-extension/test/renderer-external-steering-rpc.test.ts +184 -0
- package/src/native-ui/renderer-extension/test/renderer-external-steering.test.ts +279 -0
- package/src/native-ui/renderer-extension/test/renderer-fork-control.test.ts +363 -0
- package/src/native-ui/renderer-extension/test/renderer-harness-command-claim.test.ts +167 -0
- package/src/native-ui/renderer-extension/test/renderer-harness-command-control.test.ts +54 -0
- package/src/native-ui/renderer-extension/test/renderer-model-client.test.ts +708 -0
- package/src/native-ui/renderer-extension/test/renderer-model-picker.test.ts +302 -0
- package/src/native-ui/renderer-extension/test/renderer-native-thread-ownership.test.ts +84 -0
- package/src/native-ui/renderer-extension/test/renderer-new-thread-preference.test.ts +81 -0
- package/src/native-ui/renderer-extension/test/renderer-permission-mode-picker.test.ts +269 -0
- package/src/native-ui/renderer-extension/test/renderer-permission-mode-preference.test.ts +48 -0
- package/src/native-ui/renderer-extension/test/renderer-settings-lifecycle.test.ts +156 -0
- package/src/native-ui/renderer-extension/test/renderer-sidebar-agent-icons.test.ts +575 -0
- package/src/native-ui/renderer-extension/test/renderer-unsupported-methods.test.ts +167 -0
- package/src/native-ui/renderer-extension/test/renderer-usage-control.test.ts +96 -0
- package/src/native-ui/renderer-extension/test/settings/accounts-usage.test.ts +208 -0
- package/src/native-ui/renderer-extension/test/settings/core.test.ts +145 -0
- package/src/native-ui/renderer-extension/test/settings/harness-settings.test.ts +88 -0
- package/src/native-ui/renderer-extension/test/settings/localization.test.ts +80 -0
- package/src/native-ui/renderer-extension/test/settings/pages.test.ts +2000 -0
- package/src/native-ui/renderer-extension/test/settings/release-notes.test.ts +163 -0
- package/src/native-ui/renderer-extension/test/settings/shell.test.ts +74 -0
- package/src/native-ui/renderer-extension/test/settings/trigger.test.ts +270 -0
- package/src/native-ui/renderer-extension/test/settings/update-request.test.ts +48 -0
- package/src/native-ui/renderer-extension/test/versioned-renderer-adapter.test.ts +682 -0
- package/src/native-ui/renderer-extension/tsconfig.json +15 -0
- package/src/native-ui/shared-contracts/dist/codex-accounts.d.ts +246 -0
- package/src/native-ui/shared-contracts/dist/codex-accounts.d.ts.map +1 -0
- package/src/native-ui/shared-contracts/dist/codex-accounts.js +99 -0
- package/src/native-ui/shared-contracts/dist/codex-accounts.js.map +1 -0
- package/src/native-ui/shared-contracts/dist/deepseek-modern-sessions.d.ts +37 -0
- package/src/native-ui/shared-contracts/dist/deepseek-modern-sessions.d.ts.map +1 -0
- package/src/native-ui/shared-contracts/dist/deepseek-modern-sessions.js +36 -0
- package/src/native-ui/shared-contracts/dist/deepseek-modern-sessions.js.map +1 -0
- package/src/native-ui/shared-contracts/dist/errors.d.ts +17 -0
- package/src/native-ui/shared-contracts/dist/errors.d.ts.map +1 -0
- package/src/native-ui/shared-contracts/dist/errors.js +14 -0
- package/src/native-ui/shared-contracts/dist/errors.js.map +1 -0
- package/src/native-ui/shared-contracts/dist/external-thread-fork.d.ts +11 -0
- package/src/native-ui/shared-contracts/dist/external-thread-fork.d.ts.map +1 -0
- package/src/native-ui/shared-contracts/dist/external-thread-fork.js +14 -0
- package/src/native-ui/shared-contracts/dist/external-thread-fork.js.map +1 -0
- package/src/native-ui/shared-contracts/dist/harness-accounts.d.ts +64 -0
- package/src/native-ui/shared-contracts/dist/harness-accounts.d.ts.map +1 -0
- package/src/native-ui/shared-contracts/dist/harness-accounts.js +24 -0
- package/src/native-ui/shared-contracts/dist/harness-accounts.js.map +1 -0
- package/src/native-ui/shared-contracts/dist/harness-commands.d.ts +46 -0
- package/src/native-ui/shared-contracts/dist/harness-commands.d.ts.map +1 -0
- package/src/native-ui/shared-contracts/dist/harness-commands.js +61 -0
- package/src/native-ui/shared-contracts/dist/harness-commands.js.map +1 -0
- package/src/native-ui/shared-contracts/dist/harness-models.d.ts +278 -0
- package/src/native-ui/shared-contracts/dist/harness-models.d.ts.map +1 -0
- package/src/native-ui/shared-contracts/dist/harness-models.js +317 -0
- package/src/native-ui/shared-contracts/dist/harness-models.js.map +1 -0
- package/src/native-ui/shared-contracts/dist/harness-permission-modes.d.ts +30 -0
- package/src/native-ui/shared-contracts/dist/harness-permission-modes.d.ts.map +1 -0
- package/src/native-ui/shared-contracts/dist/harness-permission-modes.js +57 -0
- package/src/native-ui/shared-contracts/dist/harness-permission-modes.js.map +1 -0
- package/src/native-ui/shared-contracts/dist/harness-plugins.d.ts +56 -0
- package/src/native-ui/shared-contracts/dist/harness-plugins.d.ts.map +1 -0
- package/src/native-ui/shared-contracts/dist/harness-plugins.js +75 -0
- package/src/native-ui/shared-contracts/dist/harness-plugins.js.map +1 -0
- package/src/native-ui/shared-contracts/dist/harness-route.d.ts +16 -0
- package/src/native-ui/shared-contracts/dist/harness-route.d.ts.map +1 -0
- package/src/native-ui/shared-contracts/dist/harness-route.js +42 -0
- package/src/native-ui/shared-contracts/dist/harness-route.js.map +1 -0
- package/src/native-ui/shared-contracts/dist/harness-session-import.d.ts +54 -0
- package/src/native-ui/shared-contracts/dist/harness-session-import.d.ts.map +1 -0
- package/src/native-ui/shared-contracts/dist/harness-session-import.js +72 -0
- package/src/native-ui/shared-contracts/dist/harness-session-import.js.map +1 -0
- package/src/native-ui/shared-contracts/dist/ids.d.ts +12 -0
- package/src/native-ui/shared-contracts/dist/ids.d.ts.map +1 -0
- package/src/native-ui/shared-contracts/dist/ids.js +10 -0
- package/src/native-ui/shared-contracts/dist/ids.js.map +1 -0
- package/src/native-ui/shared-contracts/dist/index.d.ts +47 -0
- package/src/native-ui/shared-contracts/dist/index.d.ts.map +1 -0
- package/src/native-ui/shared-contracts/dist/index.js +29 -0
- package/src/native-ui/shared-contracts/dist/index.js.map +1 -0
- package/src/native-ui/shared-contracts/dist/json-rpc.d.ts +84 -0
- package/src/native-ui/shared-contracts/dist/json-rpc.d.ts.map +1 -0
- package/src/native-ui/shared-contracts/dist/json-rpc.js +65 -0
- package/src/native-ui/shared-contracts/dist/json-rpc.js.map +1 -0
- package/src/native-ui/shared-contracts/dist/json-value.d.ts +13 -0
- package/src/native-ui/shared-contracts/dist/json-value.d.ts.map +1 -0
- package/src/native-ui/shared-contracts/dist/json-value.js +60 -0
- package/src/native-ui/shared-contracts/dist/json-value.js.map +1 -0
- package/src/native-ui/shared-contracts/dist/native-refs.d.ts +43 -0
- package/src/native-ui/shared-contracts/dist/native-refs.d.ts.map +1 -0
- package/src/native-ui/shared-contracts/dist/native-refs.js +35 -0
- package/src/native-ui/shared-contracts/dist/native-refs.js.map +1 -0
- package/src/native-ui/shared-contracts/dist/reasoning-transcript.d.ts +7 -0
- package/src/native-ui/shared-contracts/dist/reasoning-transcript.d.ts.map +1 -0
- package/src/native-ui/shared-contracts/dist/reasoning-transcript.js +7 -0
- package/src/native-ui/shared-contracts/dist/reasoning-transcript.js.map +1 -0
- package/src/native-ui/shared-contracts/dist/thread-delegate.d.ts +22 -0
- package/src/native-ui/shared-contracts/dist/thread-delegate.d.ts.map +1 -0
- package/src/native-ui/shared-contracts/dist/thread-delegate.js +30 -0
- package/src/native-ui/shared-contracts/dist/thread-delegate.js.map +1 -0
- package/src/native-ui/shared-contracts/dist/thread-harness-switch.d.ts +16 -0
- package/src/native-ui/shared-contracts/dist/thread-harness-switch.d.ts.map +1 -0
- package/src/native-ui/shared-contracts/dist/thread-harness-switch.js +19 -0
- package/src/native-ui/shared-contracts/dist/thread-harness-switch.js.map +1 -0
- package/src/native-ui/shared-contracts/dist/thread-usage.d.ts +106 -0
- package/src/native-ui/shared-contracts/dist/thread-usage.d.ts.map +1 -0
- package/src/native-ui/shared-contracts/dist/thread-usage.js +103 -0
- package/src/native-ui/shared-contracts/dist/thread-usage.js.map +1 -0
- package/src/native-ui/shared-contracts/dist/tsconfig.tsbuildinfo +1 -0
- package/src/native-ui/shared-contracts/dist/updates.d.ts +128 -0
- package/src/native-ui/shared-contracts/dist/updates.d.ts.map +1 -0
- package/src/native-ui/shared-contracts/dist/updates.js +58 -0
- package/src/native-ui/shared-contracts/dist/updates.js.map +1 -0
- package/src/native-ui/shared-contracts/dist/version.d.ts +2 -0
- package/src/native-ui/shared-contracts/dist/version.d.ts.map +1 -0
- package/src/native-ui/shared-contracts/dist/version.js +2 -0
- package/src/native-ui/shared-contracts/dist/version.js.map +1 -0
- package/src/native-ui/shared-contracts/package.json +25 -0
- package/src/native-ui/shared-contracts/src/codex-accounts.ts +140 -0
- package/src/native-ui/shared-contracts/src/deepseek-modern-sessions.ts +67 -0
- package/src/native-ui/shared-contracts/src/errors.ts +25 -0
- package/src/native-ui/shared-contracts/src/external-thread-fork.ts +20 -0
- package/src/native-ui/shared-contracts/src/harness-accounts.ts +29 -0
- package/src/native-ui/shared-contracts/src/harness-commands.ts +81 -0
- package/src/native-ui/shared-contracts/src/harness-models.ts +401 -0
- package/src/native-ui/shared-contracts/src/harness-permission-modes.ts +73 -0
- package/src/native-ui/shared-contracts/src/harness-plugins.ts +96 -0
- package/src/native-ui/shared-contracts/src/harness-route.ts +47 -0
- package/src/native-ui/shared-contracts/src/harness-session-import.ts +90 -0
- package/src/native-ui/shared-contracts/src/ids.ts +20 -0
- package/src/native-ui/shared-contracts/src/index.ts +320 -0
- package/src/native-ui/shared-contracts/src/json-rpc.ts +80 -0
- package/src/native-ui/shared-contracts/src/json-value.ts +78 -0
- package/src/native-ui/shared-contracts/src/native-refs.ts +58 -0
- package/src/native-ui/shared-contracts/src/reasoning-transcript.ts +6 -0
- package/src/native-ui/shared-contracts/src/thread-delegate.ts +40 -0
- package/src/native-ui/shared-contracts/src/thread-harness-switch.ts +25 -0
- package/src/native-ui/shared-contracts/src/thread-usage.ts +126 -0
- package/src/native-ui/shared-contracts/src/updates.ts +78 -0
- package/src/native-ui/shared-contracts/src/version.ts +1 -0
- package/src/native-ui/shared-contracts/test/browser-bundle.test.ts +36 -0
- package/src/native-ui/shared-contracts/test/deepseek-modern-sessions.test.ts +120 -0
- package/src/native-ui/shared-contracts/test/errors.test.ts +72 -0
- package/src/native-ui/shared-contracts/test/harness-commands.test.ts +64 -0
- package/src/native-ui/shared-contracts/test/harness-models.test.ts +390 -0
- package/src/native-ui/shared-contracts/test/harness-permission-modes.test.ts +134 -0
- package/src/native-ui/shared-contracts/test/harness-plugins.test.ts +113 -0
- package/src/native-ui/shared-contracts/test/harness-session-import.test.ts +117 -0
- package/src/native-ui/shared-contracts/test/ids.test.ts +69 -0
- package/src/native-ui/shared-contracts/test/index.test.ts +80 -0
- package/src/native-ui/shared-contracts/test/json-rpc.test.ts +177 -0
- package/src/native-ui/shared-contracts/test/json-value.test.ts +62 -0
- package/src/native-ui/shared-contracts/test/native-refs.test.ts +95 -0
- package/src/native-ui/shared-contracts/test/thread-usage.test.ts +115 -0
- package/src/native-ui/shared-contracts/test/updates.test.ts +120 -0
- package/src/native-ui/shared-contracts/tsconfig.json +10 -0
- package/src/tsconfig.base.json +19 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
const assert = require('node:assert/strict');
|
|
2
|
+
const fs = require('node:fs');
|
|
3
|
+
const path = require('node:path');
|
|
4
|
+
const { projectWireEvent, flattenCatalog } = require('../src/main/adapters/dsh');
|
|
5
|
+
|
|
6
|
+
// DSH Web Remote 投影单元测试:session/follow 帧 + $events waterfall + 模型目录。
|
|
7
|
+
// 帧形状以 fixtures/dsh/*.jsonl(真实捕获)为准。
|
|
8
|
+
|
|
9
|
+
function fixture(name) {
|
|
10
|
+
return fs.readFileSync(path.join(__dirname, '..', 'fixtures', 'dsh', name), 'utf8')
|
|
11
|
+
.split('\n').filter(Boolean).map(JSON.parse);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// 1. 真实 fixture:tool-call 全链路投影
|
|
15
|
+
const toolEvents = fixture('tool-call.jsonl').flatMap((frame) => projectWireEvent(frame).filter(Boolean));
|
|
16
|
+
assert.ok(toolEvents.some((e) => e.kind === 'tool' && e.state === 'running'), 'tool/call → running');
|
|
17
|
+
assert.ok(toolEvents.some((e) => e.kind === 'tool' && e.state === 'done' && /harness-mix-fixture/.test(e.output ?? '')), 'tool/result → done + 输出');
|
|
18
|
+
assert.ok(toolEvents.some((e) => e.kind === 'completed' && e.finalAnswer === true), 'turn/end → completed');
|
|
19
|
+
assert.ok(toolEvents.some((e) => e.kind === 'usage'), 'usage 事件');
|
|
20
|
+
|
|
21
|
+
// 2. text-delta 流式增量(真实 fixture 的 chunk 序列)
|
|
22
|
+
const deltas = fixture('simple-message.jsonl').flatMap((frame) => projectWireEvent(frame)).filter((e) => e.kind === 'text-delta');
|
|
23
|
+
assert.ok(deltas.length >= 1 && deltas.map((d) => d.text).join('').includes('收到'), 'assistant/chunk text-delta 流式投影');
|
|
24
|
+
|
|
25
|
+
// 3. assistant/message 只记检查点不重复投影文本(chunk 已覆盖)
|
|
26
|
+
const messageFrames = fixture('simple-message.jsonl').filter((f) => f.event?.type === 'assistant/message');
|
|
27
|
+
const session = { nativeSessionId: 'session-x', state: {} };
|
|
28
|
+
const fromMessage = messageFrames.flatMap((f) => projectWireEvent(f, session));
|
|
29
|
+
assert.ok(!fromMessage.some((e) => e.kind === 'text-delta'), 'assistant/message 不产生重复文本');
|
|
30
|
+
assert.equal(session.state.checkpointSeq, messageFrames.at(-1).event.seq, '检查点 seq 记录');
|
|
31
|
+
const end = fixture('simple-message.jsonl').filter((f) => f.event?.type === 'turn/end').flatMap((f) => projectWireEvent(f, session));
|
|
32
|
+
assert.equal(end.find((e) => e.kind === 'completed').nativeRef.checkpointId, String(session.state.checkpointSeq), 'completed 携带 fork 边界');
|
|
33
|
+
|
|
34
|
+
// 4. request/context 更新上下文窗口与模型
|
|
35
|
+
const ctx = projectWireEvent({ type: 'event', event: { type: 'request/context', seq: 9, time: 0, data: { provider: 'deepseek-official', model: 'deepseek-v4-flash', contextWindow: 1000000 } } }, session);
|
|
36
|
+
assert.equal(session.state.contextWindow, 1000000);
|
|
37
|
+
assert.ok(ctx.some((e) => e.kind === 'session' && e.model?.id === 'deepseek-v4-flash'), 'request/context → 模型更新');
|
|
38
|
+
|
|
39
|
+
// 5. usage chunk → contextPercent 计算
|
|
40
|
+
const withUsage = projectWireEvent({ type: 'event', event: { type: 'assistant/chunk', seq: 10, time: 0, data: { turn: 1, step: 1, chunk: { type: 'usage', usage: { inputTokens: 50000, outputTokens: 100, totalTokens: 50100, cacheReadTokens: 0, reasoningTokens: 0 } } } } }, session);
|
|
41
|
+
const usage = withUsage.find((e) => e.kind === 'usage').usage;
|
|
42
|
+
assert.equal(usage.tokens, 50000);
|
|
43
|
+
assert.equal(usage.contextWindow, 1000000);
|
|
44
|
+
assert.ok(Math.abs(usage.contextPercent - 5) < 0.01, 'contextPercent 由原生窗口计算');
|
|
45
|
+
|
|
46
|
+
// 6. 审批 waterfall → approval 卡片;应答 → allowed-once / rejected / cancelled
|
|
47
|
+
(async () => {
|
|
48
|
+
const { manifest, create } = require('../src/main/adapters/dsh');
|
|
49
|
+
assert.equal(manifest.capabilities.approvals, true);
|
|
50
|
+
assert.equal(manifest.capabilities.fork, true);
|
|
51
|
+
assert.equal(manifest.capabilities.questions, true);
|
|
52
|
+
const adapter = create();
|
|
53
|
+
const answered = [];
|
|
54
|
+
const fakeSession = {
|
|
55
|
+
nativeSessionId: 'session-1',
|
|
56
|
+
pendingApprovals: new Map(),
|
|
57
|
+
host: { answerWaterfall: async (eventId, outcome) => answered.push({ eventId, outcome }) },
|
|
58
|
+
};
|
|
59
|
+
fakeSession.pendingApprovals.set('dsh-evt-1', { eventId: 'evt-1', isQuestion: false });
|
|
60
|
+
await adapter.respond(fakeSession, 'dsh-evt-1', { optionId: 'allowed-once' });
|
|
61
|
+
assert.deepEqual(answered.at(-1), { eventId: 'evt-1', outcome: { kind: 'result', value: 'allowed-once' } }, '允许 → allowed-once');
|
|
62
|
+
fakeSession.pendingApprovals.set('dsh-evt-2', { eventId: 'evt-2', isQuestion: false });
|
|
63
|
+
await adapter.respond(fakeSession, 'dsh-evt-2', { cancelled: true });
|
|
64
|
+
assert.deepEqual(answered.at(-1), { eventId: 'evt-2', outcome: { kind: 'result', value: 'cancelled' } }, '取消 → cancelled');
|
|
65
|
+
|
|
66
|
+
// 7. 提问 waterfall(无选项 → 自由文本 custom;有选项 → selected)
|
|
67
|
+
fakeSession.pendingApprovals.set('dsh-evt-3', { eventId: 'evt-3', isQuestion: true, question: { id: 'q1' } });
|
|
68
|
+
await adapter.respond(fakeSession, 'dsh-evt-3', { value: '自由回答' });
|
|
69
|
+
assert.deepEqual(answered.at(-1).outcome.value, { answers: [{ id: 'q1', selected: [], custom: '自由回答' }] }, '自由文本提问 → custom');
|
|
70
|
+
fakeSession.pendingApprovals.set('dsh-evt-4', { eventId: 'evt-4', isQuestion: true, question: { id: 'q2', options: [{ label: '红色' }] } });
|
|
71
|
+
await adapter.respond(fakeSession, 'dsh-evt-4', { optionId: '红色' });
|
|
72
|
+
assert.deepEqual(answered.at(-1).outcome.value, { answers: [{ id: 'q2', selected: ['红色'] }] }, '选项提问 → selected');
|
|
73
|
+
|
|
74
|
+
// 8. 模型目录展平(provider 分组 + reasoning efforts)
|
|
75
|
+
const models = flattenCatalog({
|
|
76
|
+
default: { provider: 'p1', model: 'm1' },
|
|
77
|
+
groups: [{ id: 'p1', name: 'P1', models: [
|
|
78
|
+
{ id: 'm1', name: 'M1', reasoning: { efforts: [{ id: 'low' }, { id: 'high' }], defaultEffort: 'low' } },
|
|
79
|
+
{ id: 'm2', name: 'M2' },
|
|
80
|
+
] }],
|
|
81
|
+
});
|
|
82
|
+
assert.equal(models.length, 2);
|
|
83
|
+
assert.deepEqual(models[0], { id: 'm1', name: 'M1', provider: 'p1', description: undefined, efforts: [{ id: 'low', label: 'low', hint: undefined }, { id: 'high', label: 'high', hint: undefined }], defaultEffort: 'low' });
|
|
84
|
+
assert.equal(models[1].efforts, undefined);
|
|
85
|
+
|
|
86
|
+
console.log('dsh-adapter: Web Remote 工具/diff 边界/用量/审批/提问/目录投影 passed');
|
|
87
|
+
})().catch((error) => { console.error(error); process.exitCode = 1; });
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
const { spawn } = require('node:child_process');
|
|
2
|
+
const path = require('node:path');
|
|
3
|
+
const root = process.env.HARNESS_MIX_DSH_ROOT;
|
|
4
|
+
const entry = root ? ['--import', 'tsx/esm', path.join(root, 'apps/cli/src/bin.ts')] : [require.resolve('@deepseek-ai/dsh/lib/bin.js')];
|
|
5
|
+
const child = spawn(process.execPath, [...entry, ...process.argv.slice(2)], {
|
|
6
|
+
cwd: root || process.cwd(), env: process.env, stdio: 'inherit', windowsHide: true,
|
|
7
|
+
});
|
|
8
|
+
child.on('error', error => { console.error(error.message); process.exitCode = 1; });
|
|
9
|
+
child.on('exit', code => { process.exitCode = code ?? 1; });
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
const assert = require('node:assert/strict');
|
|
2
|
+
const fs = require('node:fs/promises');
|
|
3
|
+
const os = require('node:os');
|
|
4
|
+
const path = require('node:path');
|
|
5
|
+
const { HostRuntime } = require('../src/main/host/runtime');
|
|
6
|
+
const { CodexAppServer } = require('../src/main/adapters/codex-app-server');
|
|
7
|
+
|
|
8
|
+
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
|
|
9
|
+
|
|
10
|
+
async function settle(thread) {
|
|
11
|
+
for (let i = 0; i < 900 && (thread.status === 'working' || thread.reviewPending); i++) await sleep(200);
|
|
12
|
+
assert.equal(thread.status, 'ready', thread.error);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
(async () => {
|
|
16
|
+
const dataDirectory = await fs.mkdtemp(path.join(os.tmpdir(), 'hm-codex-e2e-data-'));
|
|
17
|
+
const cwd = await fs.mkdtemp(path.join(os.tmpdir(), 'hm-codex-e2e-work-'));
|
|
18
|
+
const nativeIds = new Set();
|
|
19
|
+
let runtime;
|
|
20
|
+
try {
|
|
21
|
+
runtime = new HostRuntime({ dataDirectory });
|
|
22
|
+
await runtime.initialize();
|
|
23
|
+
const source = await runtime.createThread({
|
|
24
|
+
harnessId: 'codex', cwd, title: 'Codex native E2E',
|
|
25
|
+
options: { permissionMode: ':danger-full-access' },
|
|
26
|
+
});
|
|
27
|
+
assert.notEqual(source.status, 'error', source.error);
|
|
28
|
+
nativeIds.add(source.nativeSessionId);
|
|
29
|
+
const catalog = await runtime.describe('codex');
|
|
30
|
+
assert.ok(catalog.models.length > 0 && catalog.thinkingLevels.length > 0);
|
|
31
|
+
const selectedModel = catalog.models.find(model => model.isDefault) ?? catalog.models[0];
|
|
32
|
+
await runtime.setModel(source.id, selectedModel);
|
|
33
|
+
await runtime.setThinking(source.id, selectedModel.defaultEffort ?? selectedModel.efforts[0].id);
|
|
34
|
+
|
|
35
|
+
await runtime.send(source.id, 'Remember CODEX-FORK-4172. Reply exactly READY-4172. Do not use tools.');
|
|
36
|
+
await settle(source);
|
|
37
|
+
const boundary = source.messages.at(-1);
|
|
38
|
+
assert.match(boundary.text, /READY-4172/);
|
|
39
|
+
assert.ok(boundary.coreTurn.nativeTurnRef.turnId, 'native Codex turn id captured');
|
|
40
|
+
|
|
41
|
+
await runtime.send(source.id, 'Remember LATER-9386 too. Reply exactly LATER-OK. Do not use tools.');
|
|
42
|
+
await settle(source);
|
|
43
|
+
const fork = await runtime.forkThread(source.id, boundary.id);
|
|
44
|
+
nativeIds.add(fork.nativeSessionId);
|
|
45
|
+
assert.notEqual(fork.nativeSessionId, source.nativeSessionId);
|
|
46
|
+
assert.equal(fork.messages.length, 2, 'fork UI history ends at selected reply');
|
|
47
|
+
|
|
48
|
+
const forkNativeId = fork.nativeSessionId;
|
|
49
|
+
await runtime.close();
|
|
50
|
+
runtime = new HostRuntime({ dataDirectory });
|
|
51
|
+
await runtime.initialize();
|
|
52
|
+
const resumed = runtime.threads.find(thread => thread.nativeSessionId === forkNativeId);
|
|
53
|
+
assert.ok(resumed?.restore, 'persisted Codex task is lazily resumable');
|
|
54
|
+
await runtime.send(resumed.id, 'What CODEX-FORK token did I ask you to remember? Reply only the token.');
|
|
55
|
+
await settle(resumed);
|
|
56
|
+
assert.match(resumed.messages.at(-1).text, /CODEX-FORK-4172/);
|
|
57
|
+
assert.doesNotMatch(resumed.messages.at(-1).text, /LATER-9386/);
|
|
58
|
+
const usage = await runtime.refreshUsage(resumed.id);
|
|
59
|
+
assert.ok(usage.tokens > 0 && usage.contextWindow > 0 && usage.contextPercent > 0);
|
|
60
|
+
await runtime.executeCommand(resumed.id, 'compact');
|
|
61
|
+
await settle(resumed);
|
|
62
|
+
assert.match(resumed.messages.at(-1).text, /Codex 压缩/);
|
|
63
|
+
|
|
64
|
+
await fs.mkdir('output/verification', { recursive: true });
|
|
65
|
+
await fs.writeFile('output/verification/codex-native.json', JSON.stringify({
|
|
66
|
+
at: new Date().toISOString(), sourceId: source.nativeSessionId, forkId: forkNativeId,
|
|
67
|
+
boundaryTurnId: boundary.coreTurn.nativeTurnRef.turnId,
|
|
68
|
+
streamingReply: boundary.text, resumedReply: resumed.messages.at(-1).text,
|
|
69
|
+
laterTurnsExcluded: true, nativeCompact: true, models: catalog.models.length, usage,
|
|
70
|
+
}, null, 2));
|
|
71
|
+
console.log('codex: native app-server streaming, usage, reply fork and cold resume passed');
|
|
72
|
+
} finally {
|
|
73
|
+
if (nativeIds.size) {
|
|
74
|
+
const host = await CodexAppServer.acquire().catch(() => null);
|
|
75
|
+
if (host) {
|
|
76
|
+
for (const threadId of nativeIds) await host.request('thread/delete', { threadId }).catch(() => {});
|
|
77
|
+
host.release();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
await runtime?.close().catch(() => {});
|
|
81
|
+
}
|
|
82
|
+
})().catch(error => { console.error(error); process.exitCode = 1; });
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// Real model-driven collaboration. Arguments: --lead=pi --worker=pi
|
|
2
|
+
const fs = require('node:fs/promises');
|
|
3
|
+
const path = require('node:path');
|
|
4
|
+
const assert = require('node:assert/strict');
|
|
5
|
+
const { HostRuntime } = require('../src/main/host/runtime');
|
|
6
|
+
const { git } = require('../src/main/host/collaboration-worktree');
|
|
7
|
+
const arg = (name, fallback) => process.argv.find(a => a.startsWith(`--${name}=`))?.slice(name.length + 3) || fallback;
|
|
8
|
+
async function main() {
|
|
9
|
+
await fs.mkdir('output', { recursive: true });
|
|
10
|
+
const root = await fs.mkdtemp(path.resolve('output/collaboration-live-'));
|
|
11
|
+
const rt = new HostRuntime({ dataDirectory: path.join(root, 'data') });
|
|
12
|
+
const project = path.join(root, 'project'); await fs.mkdir(project);
|
|
13
|
+
await git(project, ['init']); await fs.writeFile(path.join(project, 'README.md'), 'Isolated collaboration verification.\n');
|
|
14
|
+
await git(project, ['add', '.']); await git(project, ['-c', 'user.name=Test', '-c', 'user.email=test@example.invalid', 'commit', '-m', 'fixture']);
|
|
15
|
+
const from = arg('lead', 'pi'), worker = arg('worker', 'pi');
|
|
16
|
+
const cycle = process.argv.includes('--cycle');
|
|
17
|
+
rt.subscribe(e => { if (e.type === 'toast') console.log(e.level, String(e.text).slice(0, 220)); });
|
|
18
|
+
try {
|
|
19
|
+
await rt.initialize();
|
|
20
|
+
const lead = await rt.createThread({ harnessId: from, cwd: project, title: 'Native collaboration verification' });
|
|
21
|
+
const prompt = cycle
|
|
22
|
+
? `这是一个协作流程验收夹具,所有文件只在当前测试目录内。你是协调者,禁止自己编写或修复文件。先用 update_agent_plan 建立计划。用 delegate_to_agent 委派 @${worker} 创建 answer.cjs,内容为 module.exports = 41;(这是故意准备的错误样本,供下一步审查)。等待完成后,另委派 @pi 作为独立只读审查者:读取 answer.cjs,检查导出值是否严格等于 42,不符合时回复 REVIEW_FAIL 和原因。两位协作者均使用默认共享工作目录,不要指定 isolation。收齐审查后通过 message_agent 把问题交回原开发者,要求修为 42。等待修复完成,再通过 message_agent 让原审查者重新读取并执行检查,正确时回复 REVIEW_PASS。必须复用原来的两个子会话。全部完成后更新计划,汇总结果,最终包含 COLLAB_CYCLE_VERIFIED。`
|
|
23
|
+
: `使用 Harness Mix 的 delegate_to_agent,显式指定 isolation=worktree,委派两个独立任务给 @${worker}。任务一只回复 COLLAB_ALPHA,任务二只回复 COLLAB_BETA。不要执行 shell 或编辑文件。请使用 get_delegation_status 等待两个结果,然后你自己最终回复两条结果和 COLLAB_VERIFIED。`;
|
|
24
|
+
let done = false, failure;
|
|
25
|
+
void rt.send(lead.id, prompt).then(() => { done = true; }, error => { done = true; failure = error; });
|
|
26
|
+
const until = Date.now() + (cycle ? 480000 : 180000);
|
|
27
|
+
while ((!done || rt.execution.isRunning(lead.id) || lead.reviewPending) && Date.now() < until) {
|
|
28
|
+
const approval = rt.threads.flatMap(t => t.pendingApprovals ?? [])[0];
|
|
29
|
+
if (approval) throw new Error(`Native approval required: ${approval.title ?? approval.requestId}. Verification does not auto-approve.`);
|
|
30
|
+
await new Promise(r => setTimeout(r, 200));
|
|
31
|
+
}
|
|
32
|
+
if (failure) throw failure;
|
|
33
|
+
if (rt.execution.isRunning(lead.id)) throw new Error(cycle ? 'Live review cycle did not finish within eight minutes' : 'Live model did not finish within three minutes');
|
|
34
|
+
const jobs = [...rt.collaboration.jobs.values()].filter(j => j.owner === lead.id);
|
|
35
|
+
const final = rt.core.getItemsForTurn(rt.execution.lastTurn(lead.id).id).filter(i => i.type === 'agent_message').map(i => i.content).join('\n');
|
|
36
|
+
console.log(JSON.stringify({ lead: from, worker, jobs: jobs.map(j => rt.collaboration.view(j)), final }, null, 2));
|
|
37
|
+
assert.equal(jobs.length, 2);
|
|
38
|
+
assert.ok(jobs.every(j => j.status === 'completed'));
|
|
39
|
+
if (cycle) {
|
|
40
|
+
assert.ok(jobs.every(j => j.workspace.mode === 'shared' && j.workspace.cwd === project));
|
|
41
|
+
assert.equal(require(path.join(project, 'answer.cjs')), 42);
|
|
42
|
+
assert.match(final, /COLLAB_CYCLE_VERIFIED/);
|
|
43
|
+
const children = jobs.map(j => rt.threads.find(t => t.id === j.childId));
|
|
44
|
+
assert.ok(children.every(t => t.messages.filter(m => m.role === 'user').length >= 2), 'Both native sessions were followed up');
|
|
45
|
+
const transcript = children.flatMap(t => t.messages.filter(m => m.role === 'assistant').map(m => m.text || '')).join('\n');
|
|
46
|
+
assert.match(transcript, /REVIEW_FAIL/); assert.match(transcript, /REVIEW_PASS/);
|
|
47
|
+
const items = rt.core.getItemsForTurn(rt.execution.lastTurn(lead.id).id);
|
|
48
|
+
assert.ok(items.some(i => i.type === 'plan' && i.entries.every(e => e.status === 'completed')));
|
|
49
|
+
assert.ok(items.filter(i => i.collaboration).length >= 4);
|
|
50
|
+
} else {
|
|
51
|
+
assert.ok(jobs.every(j => j.workspace.mode === 'worktree' && j.workspace.cwd !== project));
|
|
52
|
+
assert.notEqual(jobs[0].workspace.cwd, jobs[1].workspace.cwd);
|
|
53
|
+
assert.match(final, /COLLAB_ALPHA/); assert.match(final, /COLLAB_BETA/); assert.match(final, /COLLAB_VERIFIED/);
|
|
54
|
+
}
|
|
55
|
+
console.log('PASS: native lead called tools, spawned two native workers, collected results and synthesized its final answer');
|
|
56
|
+
} finally { await rt.close(); }
|
|
57
|
+
}
|
|
58
|
+
main().catch(error => { console.error(error); process.exitCode = 1; });
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
const assert = require('node:assert/strict');
|
|
2
|
+
const fs = require('node:fs/promises');
|
|
3
|
+
const os = require('node:os');
|
|
4
|
+
const path = require('node:path');
|
|
5
|
+
const { HostRuntime } = require('../src/main/host/runtime');
|
|
6
|
+
const { ParityObserver } = require('./support/parity-observer.cjs');
|
|
7
|
+
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
|
|
8
|
+
|
|
9
|
+
(async () => {
|
|
10
|
+
for (const harnessId of process.argv[2] ? [process.argv[2]] : ['codex', 'pi', 'claude', 'dsh']) {
|
|
11
|
+
const data = await fs.mkdtemp(path.join(os.tmpdir(), `hm-core-files-${harnessId}-`));
|
|
12
|
+
const root = path.join(data, 'workspace'); await fs.mkdir(root);
|
|
13
|
+
const rt = new HostRuntime({ observer: new ParityObserver(), dataDirectory: data });
|
|
14
|
+
try {
|
|
15
|
+
await rt.initialize();
|
|
16
|
+
const thread = await rt.createThread({ harnessId, cwd: root, options: { permissionMode: harnessId === 'codex' ? ':danger-full-access' : 'acceptEdits' } });
|
|
17
|
+
assert.notEqual(thread.status, 'error', thread.error);
|
|
18
|
+
let ended = false, sendError;
|
|
19
|
+
const sending = rt.send(thread.id, 'Only in this temporary working directory: use your native file editing tool to create acceptance.txt containing exactly HARNESS-CORE-OK. Do not access other folders. Then reply done.')
|
|
20
|
+
.catch(error => { sendError = error; }).finally(() => { ended = true; });
|
|
21
|
+
for (let i = 0; i < 600; i++) {
|
|
22
|
+
for (const item of [...thread.interactions ?? []]) {
|
|
23
|
+
const allow = item.options?.find(option => option.kind === 'allow_once');
|
|
24
|
+
if (!allow) throw new Error('No one-time native file-edit approval option');
|
|
25
|
+
await rt.respondApproval(thread.id, item.requestId, { optionId: allow.id });
|
|
26
|
+
}
|
|
27
|
+
if (ended && !rt.execution.isRunning(thread.id) && !thread.reviewPending) break;
|
|
28
|
+
await sleep(250);
|
|
29
|
+
}
|
|
30
|
+
assert.equal(ended, true, 'native send timed out'); await sending;
|
|
31
|
+
if (sendError) throw sendError;
|
|
32
|
+
assert.equal(thread.status, 'ready', thread.error);
|
|
33
|
+
assert.equal(await fs.readFile(path.join(root, 'acceptance.txt'), 'utf8').then(text => text.trim()), 'HARNESS-CORE-OK');
|
|
34
|
+
const message = thread.messages.at(-1);
|
|
35
|
+
const review = await rt.readReview(thread, message);
|
|
36
|
+
const file = review.files.find(item => item.path === 'acceptance.txt');
|
|
37
|
+
assert.ok(file); assert.equal(file.type, 'file_change');
|
|
38
|
+
assert.ok(file.after.includes('HARNESS-CORE-OK'));
|
|
39
|
+
assert.ok(message.coreItems.some(item => item.type === 'tool_call'));
|
|
40
|
+
assert.ok((await rt.readReview(thread, message, file.path)).rows.some(row => row.kind === 'add'));
|
|
41
|
+
const report = rt.shadowReport();
|
|
42
|
+
assert.ok(report.comparisons > 0); assert.deepEqual(report.errors, []); assert.deepEqual(report.mismatches, []);
|
|
43
|
+
await rt.undoFile(thread.id, message.id, file.path);
|
|
44
|
+
await assert.rejects(fs.access(path.join(root, file.path)));
|
|
45
|
+
assert.ok(message.coreReview.files.find(item => item.path === file.path).undone);
|
|
46
|
+
await fs.mkdir('output/verification', { recursive: true });
|
|
47
|
+
await fs.writeFile(`output/verification/core-files-${harnessId}.json`, JSON.stringify({ harnessId, at: new Date().toISOString(), source: file.source, nativeRef: file.nativeRef, fileVerified: true, undoVerified: true, report }, null, 2));
|
|
48
|
+
console.log(`${harnessId}: real file edit -> ${file.source} FileChange -> diff -> undo; zero parity mismatch PASSED`);
|
|
49
|
+
} finally {
|
|
50
|
+
if (harnessId === 'codex') {
|
|
51
|
+
for (const session of rt.sessions.values()) {
|
|
52
|
+
await session.host?.request('thread/delete', { threadId: session.nativeSessionId }).catch(() => {});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
await rt.close();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
})().catch(error => { console.error(error); process.exitCode = 1; });
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
const { ParityObserver } = require('./support/parity-observer.cjs');
|
|
2
|
+
const assert = require('node:assert/strict');
|
|
3
|
+
const fs = require('node:fs/promises');
|
|
4
|
+
const os = require('node:os');
|
|
5
|
+
const path = require('node:path');
|
|
6
|
+
const { HostRuntime } = require('../src/main/host/runtime');
|
|
7
|
+
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
|
|
8
|
+
(async () => {
|
|
9
|
+
const directory = await fs.mkdtemp(path.join(os.tmpdir(), 'hm-core-fork-'));
|
|
10
|
+
const root = path.join(directory, 'project'); await fs.mkdir(root);
|
|
11
|
+
const rt = new HostRuntime({ observer: new ParityObserver(), dataDirectory: directory });
|
|
12
|
+
async function send(thread, text) {
|
|
13
|
+
await rt.send(thread.id, text);
|
|
14
|
+
for (let i = 0; i < 600 && (thread.status === 'working' || thread.reviewPending); i++) await sleep(200);
|
|
15
|
+
assert.equal(thread.status, 'ready', thread.error);
|
|
16
|
+
assert.equal(thread.messages.at(-1).coreTurn.status, 'completed');
|
|
17
|
+
}
|
|
18
|
+
try {
|
|
19
|
+
await rt.initialize();
|
|
20
|
+
const source = await rt.createThread({ harnessId: 'pi', cwd: root });
|
|
21
|
+
const models = await rt.listModels(source.id);
|
|
22
|
+
assert.ok(models.length);
|
|
23
|
+
await send(source, 'Remember FORK-5921. Reply OK. Do not use tools.');
|
|
24
|
+
const boundary = source.messages.at(-1);
|
|
25
|
+
assert.ok(boundary.coreTurn.nativeTurnRef.checkpointId, 'native checkpoint captured');
|
|
26
|
+
await send(source, 'Remember LATER-9386 too. Reply OK. Do not use tools.');
|
|
27
|
+
const fork = await rt.forkThread(source.id, boundary.id);
|
|
28
|
+
assert.ok(fork.nativeSessionId);
|
|
29
|
+
assert.notEqual(fork.nativeSessionId, source.nativeSessionId);
|
|
30
|
+
assert.equal(fork.messages.length, 2, 'UI history ends at the selected reply');
|
|
31
|
+
const nativeHistory = await rt.sessions.get(fork.id).process.command({ type: 'get_messages' });
|
|
32
|
+
assert.ok(JSON.stringify(nativeHistory).includes('FORK-5921'));
|
|
33
|
+
assert.ok(!JSON.stringify(nativeHistory).includes('LATER-9386'), 'native history excludes later turns');
|
|
34
|
+
await send(fork, 'What token did I ask you to remember? Reply only that token. Do not use tools.');
|
|
35
|
+
assert.ok(fork.messages.at(-1).text.includes('FORK-5921'));
|
|
36
|
+
assert.equal(source.messages.length, 4);
|
|
37
|
+
const usage = await rt.refreshUsage(fork.id);
|
|
38
|
+
const stats = await rt.sessions.get(fork.id).process.command({ type: 'get_session_stats' });
|
|
39
|
+
assert.equal(usage.tokens, stats.contextUsage.tokens);
|
|
40
|
+
assert.equal(usage.contextWindow, stats.contextUsage.contextWindow);
|
|
41
|
+
assert.ok(Math.abs(usage.contextPercent - 100 * stats.contextUsage.tokens / stats.contextUsage.contextWindow) < 0.00001);
|
|
42
|
+
assert.deepEqual(rt.shadowReport().errors, []);
|
|
43
|
+
assert.deepEqual(rt.shadowReport().mismatches, []);
|
|
44
|
+
await fs.mkdir('output/verification', { recursive: true });
|
|
45
|
+
await fs.writeFile('output/verification/core-fork-pi.json', JSON.stringify({ at: new Date().toISOString(), models: models.length,
|
|
46
|
+
replyBoundaryVerified: true, laterTurnsExcluded: true, contextUsage: { tokens: usage.tokens, contextWindow: usage.contextWindow, percent: usage.contextPercent }, report: rt.shadowReport() }, null, 2));
|
|
47
|
+
console.log('pi: real model listing, fork identity, inherited history, fork event routing and shadow parity passed');
|
|
48
|
+
} finally { await rt.close(); }
|
|
49
|
+
})().catch(error => { console.error(error); process.exitCode = 1; });
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
const { ParityObserver } = require('./support/parity-observer.cjs');
|
|
2
|
+
const assert = require('node:assert/strict');
|
|
3
|
+
const fs = require('node:fs/promises');
|
|
4
|
+
const os = require('node:os');
|
|
5
|
+
const path = require('node:path');
|
|
6
|
+
const { HostRuntime } = require('../src/main/host/runtime');
|
|
7
|
+
const harnessId = process.argv[2];
|
|
8
|
+
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
|
|
9
|
+
const timeout = promise => Promise.race([promise, new Promise((_, reject) => {
|
|
10
|
+
const timer = setTimeout(() => reject(new Error('native request timeout')), 120000); timer.unref();
|
|
11
|
+
})]);
|
|
12
|
+
(async () => {
|
|
13
|
+
const data = await fs.mkdtemp(path.join(os.tmpdir(), `hm-core-resume-${harnessId}-`));
|
|
14
|
+
const root = path.join(data, 'workspace'); await fs.mkdir(root);
|
|
15
|
+
let rt = new HostRuntime({ observer: new ParityObserver(), dataDirectory: data });
|
|
16
|
+
const reports = [];
|
|
17
|
+
async function send(id, prompt) {
|
|
18
|
+
await timeout(rt.send(id, prompt));
|
|
19
|
+
const thread = rt.threads.find(t => t.id === id);
|
|
20
|
+
for (let i = 0; i < 600 && (thread.status === 'working' || thread.reviewPending); i++) await sleep(200);
|
|
21
|
+
assert.equal(thread.status, 'ready', thread.error);
|
|
22
|
+
const message = thread.messages.at(-1);
|
|
23
|
+
assert.equal(message.coreTurn.status, 'completed');
|
|
24
|
+
assert.ok(message.coreItems.some(i => i.phase === 'final' && i.content));
|
|
25
|
+
assert.deepEqual(rt.shadowReport().errors, []);
|
|
26
|
+
assert.deepEqual(rt.shadowReport().mismatches, []);
|
|
27
|
+
reports.push({ turnId: message.coreTurnId, status: message.coreTurn.status, report: structuredClone(rt.shadowReport()) });
|
|
28
|
+
return message;
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
await rt.initialize();
|
|
32
|
+
const thread = await rt.createThread({ harnessId, cwd: root, title: 'Core resume acceptance' });
|
|
33
|
+
await send(thread.id, 'Remember the token HM-4827. Reply only OK. Do not use tools.');
|
|
34
|
+
const nativeSessionId = thread.nativeSessionId;
|
|
35
|
+
await rt.close();
|
|
36
|
+
rt = new HostRuntime({ observer: new ParityObserver(), dataDirectory: data });
|
|
37
|
+
await rt.initialize();
|
|
38
|
+
const restored = rt.threads.find(t => t.id === thread.id);
|
|
39
|
+
assert.equal(restored.restore, true);
|
|
40
|
+
assert.equal(restored.messages.at(-1).coreTurn.status, 'completed');
|
|
41
|
+
const reply = await send(thread.id, 'What token did I ask you to remember? Reply only with the token. Do not use tools.');
|
|
42
|
+
assert.ok(reply.coreItems.some(i => i.phase === 'final' && i.content.includes('HM-4827')), 'native history was not restored');
|
|
43
|
+
assert.equal(restored.nativeSessionId, nativeSessionId);
|
|
44
|
+
assert.notEqual(reports[0].turnId, reports[1].turnId);
|
|
45
|
+
await fs.mkdir('output/verification', { recursive: true });
|
|
46
|
+
await fs.writeFile(`output/verification/core-resume-${harnessId}.json`, JSON.stringify({ harnessId, at: new Date().toISOString(), reports }, null, 2));
|
|
47
|
+
console.log(`${harnessId}: native reopen + memory recall + Core final + zero shadow mismatch PASSED`);
|
|
48
|
+
} finally { await rt.close(); }
|
|
49
|
+
})().catch(error => { console.error(error); process.exitCode = 1; });
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// 真实跨 Harness 协作自检(会发起真实的子任务模型请求):
|
|
2
|
+
// 父线程 → /delegate 委派子任务到目标 Harness → 等待结算 → 协作工具项回收最终答复。
|
|
3
|
+
// 用法:node scripts/e2e-delegate.cjs [--from=pi] [--to=pi]
|
|
4
|
+
const { HostRuntime } = require("../src/main/host/runtime");
|
|
5
|
+
const os = require("node:os");
|
|
6
|
+
const path = require("node:path");
|
|
7
|
+
|
|
8
|
+
const arg = (name, fallback) => process.argv.find(a => a.startsWith(`--${name}=`))?.split("=")[1] ?? fallback;
|
|
9
|
+
const from = arg("from", "pi");
|
|
10
|
+
const to = arg("to", "pi");
|
|
11
|
+
|
|
12
|
+
(async () => {
|
|
13
|
+
const rt = new HostRuntime({ dataDirectory: path.join(os.tmpdir(), "hm-e2e-delegate") });
|
|
14
|
+
rt.subscribe((e) => { if (e.type === "toast") console.log(" [toast]", e.text); });
|
|
15
|
+
await rt.initialize();
|
|
16
|
+
if (!rt.status[from]?.available) throw new Error(`父 Harness 不可用:${from}`);
|
|
17
|
+
if (!rt.status[to]?.available) throw new Error(`子 Harness 不可用:${to}`);
|
|
18
|
+
|
|
19
|
+
const parent = await rt.createThread({ harnessId: from, cwd: "E:\\harness-mix", title: "E2E 协作" });
|
|
20
|
+
if (parent.status === "error") throw new Error("parent open failed: " + parent.error);
|
|
21
|
+
console.log(`parent: ${parent.id.slice(0, 8)} (${from})`);
|
|
22
|
+
|
|
23
|
+
const { child, turn } = await rt.delegateTask({ fromThreadId: parent.id, harnessId: to, task: "只回复两个字:收到" });
|
|
24
|
+
console.log(`child: ${child.id.slice(0, 8)} (${child.harnessId}) parentThreadId=${child.parentThreadId === parent.id ? "ok" : "MISSING"}`);
|
|
25
|
+
|
|
26
|
+
for (let i = 0; i < 180 && rt.execution.isRunning(parent.id); i++) await new Promise((r) => setTimeout(r, 1000));
|
|
27
|
+
const settled = rt.threads.find((t) => t.id === parent.id);
|
|
28
|
+
const items = rt.core.getItemsForTurn(turn.id);
|
|
29
|
+
const tool = items.find((i) => i.type === "tool_call");
|
|
30
|
+
console.log("parent status:", settled.status, "| tool:", tool?.title, "→", tool?.status);
|
|
31
|
+
console.log("tool output:", JSON.stringify(String(tool?.output ?? "").slice(0, 120)));
|
|
32
|
+
const childThread = rt.threads.find((t) => t.id === child.id);
|
|
33
|
+
console.log("child status:", childThread.status, "| child reply:", JSON.stringify(childThread.messages.at(-1)?.text?.slice(0, 60)));
|
|
34
|
+
await rt.close();
|
|
35
|
+
const ok = settled.status === "ready" && tool?.status === "completed" && String(tool?.output ?? "").includes("收到");
|
|
36
|
+
console.log(ok ? "PASS: 委派 → 等待 → 答复回收" : "FAIL");
|
|
37
|
+
process.exit(ok ? 0 : 1);
|
|
38
|
+
})().catch((e) => { console.error("E2E FAILED:", e.message); process.exit(1); });
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
const { ParityObserver } = require('./support/parity-observer.cjs');
|
|
2
|
+
// 真实 DSH(ACP) 链路自检(会发起一次最小模型请求;DSH 启动较慢,耐心等)
|
|
3
|
+
const { HostRuntime } = require("../src/main/host/runtime");
|
|
4
|
+
const os = require("node:os");
|
|
5
|
+
const path = require("node:path");
|
|
6
|
+
|
|
7
|
+
(async () => {
|
|
8
|
+
const rt = new HostRuntime({ observer: new ParityObserver(), dataDirectory: path.join(os.tmpdir(), "hm-e2e-dsh") });
|
|
9
|
+
rt.subscribe((e) => { if (e.type === "toast") console.log(" [toast]", e.text.slice(0, 200)); });
|
|
10
|
+
await rt.initialize();
|
|
11
|
+
const t0 = Date.now();
|
|
12
|
+
const thread = await rt.createThread({ harnessId: "dsh", cwd: "E:\\harness-mix", title: "DSH E2E 自检" });
|
|
13
|
+
console.log(`open 耗时 ${((Date.now() - t0) / 1000).toFixed(1)}s`);
|
|
14
|
+
if (thread.status === "error") throw new Error("open failed: " + thread.error);
|
|
15
|
+
console.log("opened, native session:", thread.nativeSessionId, "| models:", JSON.stringify(thread.models?.slice(0, 3)), "| current:", JSON.stringify(thread.model));
|
|
16
|
+
await rt.send(thread.id, "只回复两个字:收到");
|
|
17
|
+
for (let i = 0; i < 120 && rt.threads.find((t) => t.id === thread.id).status === "working"; i++) await new Promise((r) => setTimeout(r, 1000));
|
|
18
|
+
const t = rt.threads.find((t) => t.id === thread.id);
|
|
19
|
+
console.log("status:", t.status, "| assistant:", JSON.stringify(t.messages.at(-1)?.text));
|
|
20
|
+
console.log("usage:", JSON.stringify(t.usage));
|
|
21
|
+
await rt.close();
|
|
22
|
+
process.exit(t.status === "ready" && t.messages.at(-1)?.text ? 0 : 1);
|
|
23
|
+
})().catch((e) => { console.error("E2E FAILED:", e.message); process.exit(1); });
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
const assert = require('node:assert/strict');
|
|
2
|
+
const fs = require('node:fs/promises');
|
|
3
|
+
const os = require('node:os');
|
|
4
|
+
const path = require('node:path');
|
|
5
|
+
const { HostRuntime } = require('../src/main/host/runtime');
|
|
6
|
+
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
|
|
7
|
+
(async () => {
|
|
8
|
+
const hid = process.argv[2] || 'claude';
|
|
9
|
+
const dir = await fs.mkdtemp(path.join(os.tmpdir(), 'hm-commands-'));
|
|
10
|
+
const cwd = path.join(dir, 'project'); await fs.mkdir(cwd);
|
|
11
|
+
if (hid === 'pi') {
|
|
12
|
+
await fs.mkdir(path.join(cwd, '.pi'));
|
|
13
|
+
await fs.writeFile(path.join(cwd, '.pi', 'settings.json'), JSON.stringify({ compaction: { keepRecentTokens: 1000, reserveTokens: 1000 } }));
|
|
14
|
+
}
|
|
15
|
+
const rt = new HostRuntime({ dataDirectory: dir });
|
|
16
|
+
async function settle(t) {
|
|
17
|
+
for (let i = 0; i < 900 && (t.status === 'working' || t.reviewPending); i++) await sleep(200);
|
|
18
|
+
assert.equal(t.status, 'ready', t.error);
|
|
19
|
+
}
|
|
20
|
+
async function send(t, text) { await rt.send(t.id, text); await settle(t); }
|
|
21
|
+
try {
|
|
22
|
+
await rt.initialize();
|
|
23
|
+
const source = await rt.createThread({ harnessId: hid, cwd, options: hid === 'pi' ? { permissionMode: 'approve' } : {} });
|
|
24
|
+
await send(source, 'Remember FIRST-5921. Reply OK. Do not use tools.');
|
|
25
|
+
const boundary = source.messages.at(-1);
|
|
26
|
+
let target = source;
|
|
27
|
+
if (hid === 'claude') {
|
|
28
|
+
assert.ok(boundary.coreTurn.nativeTurnRef.checkpointId);
|
|
29
|
+
await send(source, 'Remember LATER-9386. Reply OK. Do not use tools.');
|
|
30
|
+
target = await rt.forkThread(source.id, boundary.id);
|
|
31
|
+
const { getSessionMessages } = await import('@anthropic-ai/claude-agent-sdk');
|
|
32
|
+
const history = await getSessionMessages(target.nativeSessionId, { dir: cwd });
|
|
33
|
+
assert.ok(JSON.stringify(history).includes('FIRST-5921'));
|
|
34
|
+
assert.ok(!JSON.stringify(history).includes('LATER-9386'));
|
|
35
|
+
assert.equal(target.messages.length, 2);
|
|
36
|
+
// A branch of a branch must retain remapped native checkpoints.
|
|
37
|
+
const second = await rt.forkThread(target.id, target.messages.at(-1).id);
|
|
38
|
+
assert.notEqual(second.nativeSessionId, target.nativeSessionId);
|
|
39
|
+
await send(target, 'Which token did I ask you to remember? Reply only the token. Do not use tools.');
|
|
40
|
+
assert.ok(target.messages.at(-1).text.includes('FIRST-5921'));
|
|
41
|
+
assert.ok(!target.messages.at(-1).text.includes('LATER-9386'));
|
|
42
|
+
assert.equal(source.messages.length, 4);
|
|
43
|
+
}
|
|
44
|
+
const commands = await rt.listCommands({ threadId: target.id });
|
|
45
|
+
assert.ok(commands.some(c => c.id === 'compact'));
|
|
46
|
+
if (hid === 'pi') await send(target, 'Keep FIRST-5921 as the important token. The following is disposable test data. Reply OK without tools.\n' + Array.from({ length: 500 }, (_, i) => `Test record ${i}: alpha beta gamma delta epsilon zeta eta theta.`).join('\n'));
|
|
47
|
+
await rt.executeCommand(target.id, 'compact'); await settle(target);
|
|
48
|
+
await send(target, 'Which token did I first ask you to remember? Reply only the token. Do not use tools.');
|
|
49
|
+
assert.ok(target.messages.at(-1).text.includes('FIRST-5921'));
|
|
50
|
+
await fs.mkdir('output/verification', { recursive: true });
|
|
51
|
+
await fs.writeFile(`output/verification/commands-${hid}.json`, JSON.stringify({ at: new Date().toISOString(), hid, nativeCompact: true, retainedContext: true, replyFork: hid === 'claude', sourceId: source.nativeSessionId, targetId: target.nativeSessionId }, null, 2));
|
|
52
|
+
console.log(hid + ': native commands, retained context and fork boundaries passed');
|
|
53
|
+
} finally { await rt.close(); }
|
|
54
|
+
})().catch(e => { console.error(e); process.exitCode = 1; });
|