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.
Files changed (632) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +14 -0
  3. package/README.md +184 -0
  4. package/Start-Codex.cmd +5 -0
  5. package/config/codex-desktop-compatibility.json +23 -0
  6. package/docs/chatgpt-web-sidebar.md +27 -0
  7. package/docs/harness-management.md +41 -0
  8. package/docs/images/harness-mix-home.png +0 -0
  9. package/docs/images/harness-mix-session.png +0 -0
  10. package/docs/multi-agent-collaboration.md +89 -0
  11. package/docs/native-codex.md +72 -0
  12. package/licenses/codex-host-MIT.txt +21 -0
  13. package/output/native-build/desktop-controller.mjs +1460 -0
  14. package/output/native-build/harness-mix-appx.exe +0 -0
  15. package/output/native-build/harness-mix-shim.exe +0 -0
  16. package/output/native-build/renderer-extension.js +28884 -0
  17. package/package.json +142 -0
  18. package/scripts/acp-capabilities-probe.cjs +100 -0
  19. package/scripts/adapters-test.cjs +17 -0
  20. package/scripts/antigravity-adapter-test.cjs +174 -0
  21. package/scripts/architecture-test.cjs +62 -0
  22. package/scripts/build-native.cjs +46 -0
  23. package/scripts/catalog-test.cjs +25 -0
  24. package/scripts/cdp-eval.cjs +40 -0
  25. package/scripts/cdp-watch.cjs +36 -0
  26. package/scripts/check.cjs +23 -0
  27. package/scripts/codex-adapter-test.cjs +83 -0
  28. package/scripts/collaboration-recovery-test.cjs +91 -0
  29. package/scripts/collaboration-test.cjs +102 -0
  30. package/scripts/collaboration-ui-smoke.cjs +52 -0
  31. package/scripts/concurrency-layers-test.cjs +179 -0
  32. package/scripts/contracts-test.cjs +105 -0
  33. package/scripts/core-concurrency-test.cjs +103 -0
  34. package/scripts/core-replay-test.cjs +179 -0
  35. package/scripts/core-runtime-test.cjs +104 -0
  36. package/scripts/core-services-test.cjs +50 -0
  37. package/scripts/determinism-test.cjs +36 -0
  38. package/scripts/docs-command-test.cjs +49 -0
  39. package/scripts/dsh-adapter-test.cjs +87 -0
  40. package/scripts/dsh-native.cjs +9 -0
  41. package/scripts/dsh-native.cmd +2 -0
  42. package/scripts/e2e-codex.cjs +82 -0
  43. package/scripts/e2e-collaboration.cjs +58 -0
  44. package/scripts/e2e-core-files.cjs +58 -0
  45. package/scripts/e2e-core-fork.cjs +49 -0
  46. package/scripts/e2e-core-resume.cjs +49 -0
  47. package/scripts/e2e-delegate.cjs +38 -0
  48. package/scripts/e2e-dsh.cjs +23 -0
  49. package/scripts/e2e-native-commands.cjs +54 -0
  50. package/scripts/e2e-native-host.cjs +144 -0
  51. package/scripts/e2e-openclaw-image.cjs +59 -0
  52. package/scripts/e2e-openclaw.cjs +21 -0
  53. package/scripts/e2e-pi.cjs +23 -0
  54. package/scripts/e2e-shadow.cjs +52 -0
  55. package/scripts/fixture-capture.cjs +103 -0
  56. package/scripts/git-test.cjs +33 -0
  57. package/scripts/launch-codex.cjs +5 -0
  58. package/scripts/native-compatibility-test.cjs +42 -0
  59. package/scripts/native-config-test.cjs +25 -0
  60. package/scripts/native-file-change-test.cjs +94 -0
  61. package/scripts/native-host.cjs +8 -0
  62. package/scripts/native-images-test.cjs +56 -0
  63. package/scripts/native-protocol-test.cjs +233 -0
  64. package/scripts/native-rollback-test.cjs +46 -0
  65. package/scripts/native-sidebar-test.cjs +88 -0
  66. package/scripts/native-ui-smoke.cjs +94 -0
  67. package/scripts/native-updater-test.cjs +100 -0
  68. package/scripts/native-vendor-adapters-test.cjs +40 -0
  69. package/scripts/openclaw-acp-probe.cjs +39 -0
  70. package/scripts/openclaw-adapter-test.cjs +180 -0
  71. package/scripts/openclaw-models-probe.cjs +13 -0
  72. package/scripts/projector-test.cjs +144 -0
  73. package/scripts/sequence-test.cjs +57 -0
  74. package/scripts/shadow-test.cjs +154 -0
  75. package/scripts/support/legacy-projection.cjs +95 -0
  76. package/scripts/support/legacy-transcript.cjs +48 -0
  77. package/scripts/support/parity-observer.cjs +27 -0
  78. package/scripts/support/shadow-comparator.cjs +62 -0
  79. package/scripts/support/shadow.cjs +114 -0
  80. package/scripts/switch-harness-test.cjs +145 -0
  81. package/scripts/tool-concurrency-regression-test.cjs +118 -0
  82. package/scripts/transcript-test.cjs +24 -0
  83. package/scripts/turn-manager-test.cjs +91 -0
  84. package/scripts/workspace-test.cjs +98 -0
  85. package/src/assets/brand-harness-mix.png +0 -0
  86. package/src/assets/icons/activity-compact.svg +1 -0
  87. package/src/assets/icons/activity-edit.svg +1 -0
  88. package/src/assets/icons/activity-terminal.svg +1 -0
  89. package/src/assets/icons/antigravity-color.svg +1 -0
  90. package/src/assets/icons/claude-color.svg +1 -0
  91. package/src/assets/icons/codex-color.svg +1 -0
  92. package/src/assets/icons/codex-harness.svg +1 -0
  93. package/src/assets/icons/commands.svg +1 -0
  94. package/src/assets/icons/deepseek-color.svg +1 -0
  95. package/src/assets/icons/grok-color.svg +1 -0
  96. package/src/assets/icons/hermes-color.svg +1 -0
  97. package/src/assets/icons/home-chat.svg +1 -0
  98. package/src/assets/icons/home-folder.svg +1 -0
  99. package/src/assets/icons/model-astra.svg +1 -0
  100. package/src/assets/icons/model-claude.svg +1 -0
  101. package/src/assets/icons/model-deepseek.svg +1 -0
  102. package/src/assets/icons/model-gemini.svg +1 -0
  103. package/src/assets/icons/model-hunyuan.svg +1 -0
  104. package/src/assets/icons/model-kimi.svg +1 -0
  105. package/src/assets/icons/model-minimax.svg +1 -0
  106. package/src/assets/icons/model-openai.svg +1 -0
  107. package/src/assets/icons/model-qwen-color.svg +1 -0
  108. package/src/assets/icons/model-xiaomimimo.svg +1 -0
  109. package/src/assets/icons/model-zai.svg +1 -0
  110. package/src/assets/icons/omp-color.svg +1 -0
  111. package/src/assets/icons/openclaw-color.svg +1 -0
  112. package/src/assets/icons/opencode-color.svg +1 -0
  113. package/src/assets/icons/pi.svg +1 -0
  114. package/src/assets/icons/pinumber1_80899.svg +48 -0
  115. package/src/assets/icons/qoder-color.svg +1 -0
  116. package/src/assets/icons/thread-fork.svg +1 -0
  117. package/src/assets/icons/trae-color.svg +1 -0
  118. package/src/assets/icons/workbuddy-color.svg +1 -0
  119. package/src/assets/icons/zcode-color.svg +1 -0
  120. package/src/main/adapters/acp.js +171 -0
  121. package/src/main/adapters/antigravity.js +895 -0
  122. package/src/main/adapters/claude.js +399 -0
  123. package/src/main/adapters/codex-app-server.js +119 -0
  124. package/src/main/adapters/codex.js +547 -0
  125. package/src/main/adapters/dsh-web-host.js +207 -0
  126. package/src/main/adapters/dsh.js +415 -0
  127. package/src/main/adapters/grok.js +161 -0
  128. package/src/main/adapters/hermes.js +24 -0
  129. package/src/main/adapters/index.js +30 -0
  130. package/src/main/adapters/omp.js +12 -0
  131. package/src/main/adapters/openclaw-gateway.js +215 -0
  132. package/src/main/adapters/openclaw.js +337 -0
  133. package/src/main/adapters/opencode-server.js +72 -0
  134. package/src/main/adapters/opencode.js +166 -0
  135. package/src/main/adapters/pi-family.js +315 -0
  136. package/src/main/adapters/pi-usage.js +24 -0
  137. package/src/main/adapters/pi.js +10 -0
  138. package/src/main/adapters/qoder.js +35 -0
  139. package/src/main/adapters/trae.js +19 -0
  140. package/src/main/adapters/workbuddy.js +67 -0
  141. package/src/main/adapters/zcode.js +38 -0
  142. package/src/main/harness-adapter/contract-test.js +53 -0
  143. package/src/main/harness-adapter/contract.js +34 -0
  144. package/src/main/harness-adapter/event-normalizer.js +233 -0
  145. package/src/main/harness-adapter/fixture-recorder.js +56 -0
  146. package/src/main/harness-adapter/index.js +6 -0
  147. package/src/main/harness-adapter/manifest.js +44 -0
  148. package/src/main/host/collaboration-mcp.cjs +35 -0
  149. package/src/main/host/collaboration-pi.mjs +17 -0
  150. package/src/main/host/collaboration-tools.js +16 -0
  151. package/src/main/host/collaboration-worktree.js +82 -0
  152. package/src/main/host/collaboration.js +238 -0
  153. package/src/main/host/core-session.js +81 -0
  154. package/src/main/host/handoff.js +46 -0
  155. package/src/main/host/history-import.js +55 -0
  156. package/src/main/host/jsonl.js +115 -0
  157. package/src/main/host/native-history.js +74 -0
  158. package/src/main/host/runtime.js +927 -0
  159. package/src/main/host/session-history.js +63 -0
  160. package/src/main/host/store.js +42 -0
  161. package/src/main/native/compatibility.js +55 -0
  162. package/src/main/native/config.js +49 -0
  163. package/src/main/native/host.js +108 -0
  164. package/src/main/native/icons.js +101 -0
  165. package/src/main/native/input.js +43 -0
  166. package/src/main/native/launcher.js +100 -0
  167. package/src/main/native/protocol.js +552 -0
  168. package/src/main/native/rs/Cargo.lock +11 -0
  169. package/src/main/native/rs/Cargo.toml +9 -0
  170. package/src/main/native/rs/crates/appx/Cargo.toml +13 -0
  171. package/src/main/native/rs/crates/appx/src/main.rs +309 -0
  172. package/src/main/native/rs/crates/shim/Cargo.toml +10 -0
  173. package/src/main/native/rs/crates/shim/src/main.rs +207 -0
  174. package/src/main/native/thread-list.js +38 -0
  175. package/src/main/native/updater.js +102 -0
  176. package/src/main/native/usage.js +29 -0
  177. package/src/main/protocol-core/capability-manager.js +16 -0
  178. package/src/main/protocol-core/event-router.js +32 -0
  179. package/src/main/protocol-core/file-change-projector.js +45 -0
  180. package/src/main/protocol-core/index.js +8 -0
  181. package/src/main/protocol-core/interaction-router.js +30 -0
  182. package/src/main/protocol-core/projector.js +238 -0
  183. package/src/main/protocol-core/protocol-core.js +132 -0
  184. package/src/main/protocol-core/sequence-validator.js +44 -0
  185. package/src/main/protocol-core/thread-manager.js +50 -0
  186. package/src/main/protocol-core/turn-manager.js +63 -0
  187. package/src/main/shared-contracts/capability.js +35 -0
  188. package/src/main/shared-contracts/event.js +55 -0
  189. package/src/main/shared-contracts/ids.js +12 -0
  190. package/src/main/shared-contracts/index.js +11 -0
  191. package/src/main/shared-contracts/interaction.js +37 -0
  192. package/src/main/shared-contracts/item.js +50 -0
  193. package/src/main/shared-contracts/native-ref.js +24 -0
  194. package/src/main/shared-contracts/thread.js +36 -0
  195. package/src/main/shared-contracts/turn.js +54 -0
  196. package/src/main/workspace/core-review.js +53 -0
  197. package/src/main/workspace/diff.js +27 -0
  198. package/src/main/workspace/file-changes.js +21 -0
  199. package/src/main/workspace/files.js +65 -0
  200. package/src/main/workspace/git.js +73 -0
  201. package/src/main/workspace/ipc.js +50 -0
  202. package/src/main/workspace/review-controller.js +102 -0
  203. package/src/main/workspace/review.js +83 -0
  204. package/src/main/workspace/terminal.js +36 -0
  205. package/src/native-ui/LICENSE +21 -0
  206. package/src/native-ui/README.md +12 -0
  207. package/src/native-ui/desktop-control/dist/cdp-client.d.ts +53 -0
  208. package/src/native-ui/desktop-control/dist/cdp-client.d.ts.map +1 -0
  209. package/src/native-ui/desktop-control/dist/cdp-client.js +258 -0
  210. package/src/native-ui/desktop-control/dist/cdp-client.js.map +1 -0
  211. package/src/native-ui/desktop-control/dist/contract-audit.d.ts +73 -0
  212. package/src/native-ui/desktop-control/dist/contract-audit.d.ts.map +1 -0
  213. package/src/native-ui/desktop-control/dist/contract-audit.js +152 -0
  214. package/src/native-ui/desktop-control/dist/contract-audit.js.map +1 -0
  215. package/src/native-ui/desktop-control/dist/controller-attachment-server.d.ts +10 -0
  216. package/src/native-ui/desktop-control/dist/controller-attachment-server.d.ts.map +1 -0
  217. package/src/native-ui/desktop-control/dist/controller-attachment-server.js +77 -0
  218. package/src/native-ui/desktop-control/dist/controller-attachment-server.js.map +1 -0
  219. package/src/native-ui/desktop-control/dist/index.d.ts +21 -0
  220. package/src/native-ui/desktop-control/dist/index.d.ts.map +1 -0
  221. package/src/native-ui/desktop-control/dist/index.js +14 -0
  222. package/src/native-ui/desktop-control/dist/index.js.map +1 -0
  223. package/src/native-ui/desktop-control/dist/main-process-title-policy.d.ts +24 -0
  224. package/src/native-ui/desktop-control/dist/main-process-title-policy.d.ts.map +1 -0
  225. package/src/native-ui/desktop-control/dist/main-process-title-policy.js +246 -0
  226. package/src/native-ui/desktop-control/dist/main-process-title-policy.js.map +1 -0
  227. package/src/native-ui/desktop-control/dist/production-controller.d.ts +32 -0
  228. package/src/native-ui/desktop-control/dist/production-controller.d.ts.map +1 -0
  229. package/src/native-ui/desktop-control/dist/production-controller.js +291 -0
  230. package/src/native-ui/desktop-control/dist/production-controller.js.map +1 -0
  231. package/src/native-ui/desktop-control/dist/release-main.d.ts +2 -0
  232. package/src/native-ui/desktop-control/dist/release-main.d.ts.map +1 -0
  233. package/src/native-ui/desktop-control/dist/release-main.js +17 -0
  234. package/src/native-ui/desktop-control/dist/release-main.js.map +1 -0
  235. package/src/native-ui/desktop-control/dist/renderer-cdp-control-session.d.ts +49 -0
  236. package/src/native-ui/desktop-control/dist/renderer-cdp-control-session.d.ts.map +1 -0
  237. package/src/native-ui/desktop-control/dist/renderer-cdp-control-session.js +214 -0
  238. package/src/native-ui/desktop-control/dist/renderer-cdp-control-session.js.map +1 -0
  239. package/src/native-ui/desktop-control/dist/renderer-control-session.d.ts +79 -0
  240. package/src/native-ui/desktop-control/dist/renderer-control-session.d.ts.map +1 -0
  241. package/src/native-ui/desktop-control/dist/renderer-control-session.js +366 -0
  242. package/src/native-ui/desktop-control/dist/renderer-control-session.js.map +1 -0
  243. package/src/native-ui/desktop-control/dist/renderer-dom.d.ts +24 -0
  244. package/src/native-ui/desktop-control/dist/renderer-dom.d.ts.map +1 -0
  245. package/src/native-ui/desktop-control/dist/renderer-dom.js +110 -0
  246. package/src/native-ui/desktop-control/dist/renderer-dom.js.map +1 -0
  247. package/src/native-ui/desktop-control/dist/renderer-draft-prewarm-policy.d.ts +19 -0
  248. package/src/native-ui/desktop-control/dist/renderer-draft-prewarm-policy.d.ts.map +1 -0
  249. package/src/native-ui/desktop-control/dist/renderer-draft-prewarm-policy.js +162 -0
  250. package/src/native-ui/desktop-control/dist/renderer-draft-prewarm-policy.js.map +1 -0
  251. package/src/native-ui/desktop-control/dist/renderer-draft-prewarm-runtime.d.ts +38 -0
  252. package/src/native-ui/desktop-control/dist/renderer-draft-prewarm-runtime.d.ts.map +1 -0
  253. package/src/native-ui/desktop-control/dist/renderer-draft-prewarm-runtime.js +633 -0
  254. package/src/native-ui/desktop-control/dist/renderer-draft-prewarm-runtime.js.map +1 -0
  255. package/src/native-ui/desktop-control/dist/tsconfig.tsbuildinfo +1 -0
  256. package/src/native-ui/desktop-control/package.json +22 -0
  257. package/src/native-ui/desktop-control/scripts/build-release.mjs +94 -0
  258. package/src/native-ui/desktop-control/src/cdp-client.ts +347 -0
  259. package/src/native-ui/desktop-control/src/contract-audit.ts +291 -0
  260. package/src/native-ui/desktop-control/src/controller-attachment-server.ts +93 -0
  261. package/src/native-ui/desktop-control/src/index.ts +91 -0
  262. package/src/native-ui/desktop-control/src/main-process-title-policy.ts +334 -0
  263. package/src/native-ui/desktop-control/src/production-controller.ts +344 -0
  264. package/src/native-ui/desktop-control/src/release-main.ts +18 -0
  265. package/src/native-ui/desktop-control/src/renderer-cdp-control-session.ts +358 -0
  266. package/src/native-ui/desktop-control/src/renderer-control-session.ts +595 -0
  267. package/src/native-ui/desktop-control/src/renderer-dom.ts +144 -0
  268. package/src/native-ui/desktop-control/src/renderer-draft-prewarm-policy.ts +209 -0
  269. package/src/native-ui/desktop-control/src/renderer-draft-prewarm-runtime.ts +746 -0
  270. package/src/native-ui/desktop-control/test/cdp-client.test.ts +157 -0
  271. package/src/native-ui/desktop-control/test/contract-audit.test.ts +56 -0
  272. package/src/native-ui/desktop-control/test/controller-attachment-server.test.ts +98 -0
  273. package/src/native-ui/desktop-control/test/index.test.ts +11 -0
  274. package/src/native-ui/desktop-control/test/main-process-title-policy.test.ts +166 -0
  275. package/src/native-ui/desktop-control/test/production-controller.test.ts +389 -0
  276. package/src/native-ui/desktop-control/test/renderer-cdp-control-session.test.ts +205 -0
  277. package/src/native-ui/desktop-control/test/renderer-control-session.test.ts +451 -0
  278. package/src/native-ui/desktop-control/test/renderer-dom.test.ts +62 -0
  279. package/src/native-ui/desktop-control/test/renderer-draft-prewarm-policy.test.ts +998 -0
  280. package/src/native-ui/desktop-control/tsconfig.json +12 -0
  281. package/src/native-ui/renderer-extension/dist/types/agent-group-preference.d.ts +39 -0
  282. package/src/native-ui/renderer-extension/dist/types/agent-group-preference.d.ts.map +1 -0
  283. package/src/native-ui/renderer-extension/dist/types/agent-selection-state.d.ts +83 -0
  284. package/src/native-ui/renderer-extension/dist/types/agent-selection-state.d.ts.map +1 -0
  285. package/src/native-ui/renderer-extension/dist/types/audit-entry.d.ts +2 -0
  286. package/src/native-ui/renderer-extension/dist/types/audit-entry.d.ts.map +1 -0
  287. package/src/native-ui/renderer-extension/dist/types/codex-locale-adapter.d.ts +23 -0
  288. package/src/native-ui/renderer-extension/dist/types/codex-locale-adapter.d.ts.map +1 -0
  289. package/src/native-ui/renderer-extension/dist/types/collaboration-icon.d.ts +2 -0
  290. package/src/native-ui/renderer-extension/dist/types/collaboration-icon.d.ts.map +1 -0
  291. package/src/native-ui/renderer-extension/dist/types/contract-audit.d.ts +37 -0
  292. package/src/native-ui/renderer-extension/dist/types/contract-audit.d.ts.map +1 -0
  293. package/src/native-ui/renderer-extension/dist/types/harness-mix-icons.d.ts +3 -0
  294. package/src/native-ui/renderer-extension/dist/types/harness-mix-icons.d.ts.map +1 -0
  295. package/src/native-ui/renderer-extension/dist/types/harness-mix-settings.d.ts +3 -0
  296. package/src/native-ui/renderer-extension/dist/types/harness-mix-settings.d.ts.map +1 -0
  297. package/src/native-ui/renderer-extension/dist/types/index.d.ts +49 -0
  298. package/src/native-ui/renderer-extension/dist/types/index.d.ts.map +1 -0
  299. package/src/native-ui/renderer-extension/dist/types/install-renderer-binding.d.ts +4 -0
  300. package/src/native-ui/renderer-extension/dist/types/install-renderer-binding.d.ts.map +1 -0
  301. package/src/native-ui/renderer-extension/dist/types/probe-entry.d.ts +2 -0
  302. package/src/native-ui/renderer-extension/dist/types/probe-entry.d.ts.map +1 -0
  303. package/src/native-ui/renderer-extension/dist/types/production-entry.d.ts +9 -0
  304. package/src/native-ui/renderer-extension/dist/types/production-entry.d.ts.map +1 -0
  305. package/src/native-ui/renderer-extension/dist/types/renderer-agent-icon.d.ts +4 -0
  306. package/src/native-ui/renderer-extension/dist/types/renderer-agent-icon.d.ts.map +1 -0
  307. package/src/native-ui/renderer-extension/dist/types/renderer-agent-picker.d.ts +62 -0
  308. package/src/native-ui/renderer-extension/dist/types/renderer-agent-picker.d.ts.map +1 -0
  309. package/src/native-ui/renderer-extension/dist/types/renderer-binding-probe.d.ts +70 -0
  310. package/src/native-ui/renderer-extension/dist/types/renderer-binding-probe.d.ts.map +1 -0
  311. package/src/native-ui/renderer-extension/dist/types/renderer-codex-account-options.d.ts +34 -0
  312. package/src/native-ui/renderer-extension/dist/types/renderer-codex-account-options.d.ts.map +1 -0
  313. package/src/native-ui/renderer-extension/dist/types/renderer-codex-account-state.d.ts +19 -0
  314. package/src/native-ui/renderer-extension/dist/types/renderer-codex-account-state.d.ts.map +1 -0
  315. package/src/native-ui/renderer-extension/dist/types/renderer-composer-dom.d.ts +82 -0
  316. package/src/native-ui/renderer-extension/dist/types/renderer-composer-dom.d.ts.map +1 -0
  317. package/src/native-ui/renderer-extension/dist/types/renderer-credits-control.d.ts +21 -0
  318. package/src/native-ui/renderer-extension/dist/types/renderer-credits-control.d.ts.map +1 -0
  319. package/src/native-ui/renderer-extension/dist/types/renderer-external-steering.d.ts +7 -0
  320. package/src/native-ui/renderer-extension/dist/types/renderer-external-steering.d.ts.map +1 -0
  321. package/src/native-ui/renderer-extension/dist/types/renderer-fork-control.d.ts +34 -0
  322. package/src/native-ui/renderer-extension/dist/types/renderer-fork-control.d.ts.map +1 -0
  323. package/src/native-ui/renderer-extension/dist/types/renderer-harness-command-claim.d.ts +4 -0
  324. package/src/native-ui/renderer-extension/dist/types/renderer-harness-command-claim.d.ts.map +1 -0
  325. package/src/native-ui/renderer-extension/dist/types/renderer-harness-command-control.d.ts +15 -0
  326. package/src/native-ui/renderer-extension/dist/types/renderer-harness-command-control.d.ts.map +1 -0
  327. package/src/native-ui/renderer-extension/dist/types/renderer-harness-localization.d.ts +25 -0
  328. package/src/native-ui/renderer-extension/dist/types/renderer-harness-localization.d.ts.map +1 -0
  329. package/src/native-ui/renderer-extension/dist/types/renderer-harness-mentions.d.ts +23 -0
  330. package/src/native-ui/renderer-extension/dist/types/renderer-harness-mentions.d.ts.map +1 -0
  331. package/src/native-ui/renderer-extension/dist/types/renderer-model-client.d.ts +94 -0
  332. package/src/native-ui/renderer-extension/dist/types/renderer-model-client.d.ts.map +1 -0
  333. package/src/native-ui/renderer-extension/dist/types/renderer-model-picker-positioning.d.ts +22 -0
  334. package/src/native-ui/renderer-extension/dist/types/renderer-model-picker-positioning.d.ts.map +1 -0
  335. package/src/native-ui/renderer-extension/dist/types/renderer-model-picker.d.ts +54 -0
  336. package/src/native-ui/renderer-extension/dist/types/renderer-model-picker.d.ts.map +1 -0
  337. package/src/native-ui/renderer-extension/dist/types/renderer-new-thread-preference.d.ts +18 -0
  338. package/src/native-ui/renderer-extension/dist/types/renderer-new-thread-preference.d.ts.map +1 -0
  339. package/src/native-ui/renderer-extension/dist/types/renderer-permission-mode-picker.d.ts +42 -0
  340. package/src/native-ui/renderer-extension/dist/types/renderer-permission-mode-picker.d.ts.map +1 -0
  341. package/src/native-ui/renderer-extension/dist/types/renderer-permission-mode-preference.d.ts +9 -0
  342. package/src/native-ui/renderer-extension/dist/types/renderer-permission-mode-preference.d.ts.map +1 -0
  343. package/src/native-ui/renderer-extension/dist/types/renderer-request-sender.d.ts +9 -0
  344. package/src/native-ui/renderer-extension/dist/types/renderer-request-sender.d.ts.map +1 -0
  345. package/src/native-ui/renderer-extension/dist/types/renderer-session-import-client.d.ts +12 -0
  346. package/src/native-ui/renderer-extension/dist/types/renderer-session-import-client.d.ts.map +1 -0
  347. package/src/native-ui/renderer-extension/dist/types/renderer-settings-lifecycle.d.ts +18 -0
  348. package/src/native-ui/renderer-extension/dist/types/renderer-settings-lifecycle.d.ts.map +1 -0
  349. package/src/native-ui/renderer-extension/dist/types/renderer-sidebar-agent-icons.d.ts +45 -0
  350. package/src/native-ui/renderer-extension/dist/types/renderer-sidebar-agent-icons.d.ts.map +1 -0
  351. package/src/native-ui/renderer-extension/dist/types/renderer-transcript-dom.d.ts +23 -0
  352. package/src/native-ui/renderer-extension/dist/types/renderer-transcript-dom.d.ts.map +1 -0
  353. package/src/native-ui/renderer-extension/dist/types/renderer-trigger-chip-style.d.ts +3 -0
  354. package/src/native-ui/renderer-extension/dist/types/renderer-trigger-chip-style.d.ts.map +1 -0
  355. package/src/native-ui/renderer-extension/dist/types/renderer-usage-control.d.ts +72 -0
  356. package/src/native-ui/renderer-extension/dist/types/renderer-usage-control.d.ts.map +1 -0
  357. package/src/native-ui/renderer-extension/dist/types/settings/accounts-list.d.ts +24 -0
  358. package/src/native-ui/renderer-extension/dist/types/settings/accounts-list.d.ts.map +1 -0
  359. package/src/native-ui/renderer-extension/dist/types/settings/accounts-page.d.ts +18 -0
  360. package/src/native-ui/renderer-extension/dist/types/settings/accounts-page.d.ts.map +1 -0
  361. package/src/native-ui/renderer-extension/dist/types/settings/accounts-usage.d.ts +27 -0
  362. package/src/native-ui/renderer-extension/dist/types/settings/accounts-usage.d.ts.map +1 -0
  363. package/src/native-ui/renderer-extension/dist/types/settings/connections-page.d.ts +42 -0
  364. package/src/native-ui/renderer-extension/dist/types/settings/connections-page.d.ts.map +1 -0
  365. package/src/native-ui/renderer-extension/dist/types/settings/core.d.ts +38 -0
  366. package/src/native-ui/renderer-extension/dist/types/settings/core.d.ts.map +1 -0
  367. package/src/native-ui/renderer-extension/dist/types/settings/harness-accounts.d.ts +14 -0
  368. package/src/native-ui/renderer-extension/dist/types/settings/harness-accounts.d.ts.map +1 -0
  369. package/src/native-ui/renderer-extension/dist/types/settings/icons.d.ts +6 -0
  370. package/src/native-ui/renderer-extension/dist/types/settings/icons.d.ts.map +1 -0
  371. package/src/native-ui/renderer-extension/dist/types/settings/localization.d.ts +231 -0
  372. package/src/native-ui/renderer-extension/dist/types/settings/localization.d.ts.map +1 -0
  373. package/src/native-ui/renderer-extension/dist/types/settings/pages.d.ts +22 -0
  374. package/src/native-ui/renderer-extension/dist/types/settings/pages.d.ts.map +1 -0
  375. package/src/native-ui/renderer-extension/dist/types/settings/release-notes.d.ts +4 -0
  376. package/src/native-ui/renderer-extension/dist/types/settings/release-notes.d.ts.map +1 -0
  377. package/src/native-ui/renderer-extension/dist/types/settings/session-import-list-controls.d.ts +12 -0
  378. package/src/native-ui/renderer-extension/dist/types/settings/session-import-list-controls.d.ts.map +1 -0
  379. package/src/native-ui/renderer-extension/dist/types/settings/session-import-page.d.ts +8 -0
  380. package/src/native-ui/renderer-extension/dist/types/settings/session-import-page.d.ts.map +1 -0
  381. package/src/native-ui/renderer-extension/dist/types/settings/shell.d.ts +24 -0
  382. package/src/native-ui/renderer-extension/dist/types/settings/shell.d.ts.map +1 -0
  383. package/src/native-ui/renderer-extension/dist/types/settings/trigger.d.ts +45 -0
  384. package/src/native-ui/renderer-extension/dist/types/settings/trigger.d.ts.map +1 -0
  385. package/src/native-ui/renderer-extension/dist/types/settings/update-request.d.ts +6 -0
  386. package/src/native-ui/renderer-extension/dist/types/settings/update-request.d.ts.map +1 -0
  387. package/src/native-ui/renderer-extension/dist/types/tsconfig.tsbuildinfo +1 -0
  388. package/src/native-ui/renderer-extension/dist/types/versioned-renderer-adapter.d.ts +143 -0
  389. package/src/native-ui/renderer-extension/dist/types/versioned-renderer-adapter.d.ts.map +1 -0
  390. package/src/native-ui/renderer-extension/package.json +22 -0
  391. package/src/native-ui/renderer-extension/src/agent-group-preference.ts +174 -0
  392. package/src/native-ui/renderer-extension/src/agent-selection-state.ts +610 -0
  393. package/src/native-ui/renderer-extension/src/assets/README.md +43 -0
  394. package/src/native-ui/renderer-extension/src/assets/antigravity-agent.svg +1 -0
  395. package/src/native-ui/renderer-extension/src/assets/claude-agent.svg +3 -0
  396. package/src/native-ui/renderer-extension/src/assets/codex-agent.png +0 -0
  397. package/src/native-ui/renderer-extension/src/assets/codex-logo-bright.png +0 -0
  398. package/src/native-ui/renderer-extension/src/assets/codex-logo-transparent.png +0 -0
  399. package/src/native-ui/renderer-extension/src/assets/codex-logo.png +0 -0
  400. package/src/native-ui/renderer-extension/src/assets/codexhost-icon.png +0 -0
  401. package/src/native-ui/renderer-extension/src/assets/codexhost-logo-transparent.png +0 -0
  402. package/src/native-ui/renderer-extension/src/assets/codexhost-logo.png +0 -0
  403. package/src/native-ui/renderer-extension/src/assets/codexhost-readme.svg +8 -0
  404. package/src/native-ui/renderer-extension/src/assets/grok-agent.png +0 -0
  405. package/src/native-ui/renderer-extension/src/assets/kiro-agent.svg +11 -0
  406. package/src/native-ui/renderer-extension/src/assets/omp-agent.svg +14 -0
  407. package/src/native-ui/renderer-extension/src/assets/opencode-agent.png +0 -0
  408. package/src/native-ui/renderer-extension/src/assets/pi-agent.svg +4 -0
  409. package/src/native-ui/renderer-extension/src/assets.d.ts +26 -0
  410. package/src/native-ui/renderer-extension/src/audit-entry.ts +5 -0
  411. package/src/native-ui/renderer-extension/src/codex-locale-adapter.ts +321 -0
  412. package/src/native-ui/renderer-extension/src/collaboration-icon.ts +13 -0
  413. package/src/native-ui/renderer-extension/src/contract-audit.ts +102 -0
  414. package/src/native-ui/renderer-extension/src/harness-mix-icons.ts +24 -0
  415. package/src/native-ui/renderer-extension/src/harness-mix-settings.ts +80 -0
  416. package/src/native-ui/renderer-extension/src/index.ts +266 -0
  417. package/src/native-ui/renderer-extension/src/install-renderer-binding.ts +30 -0
  418. package/src/native-ui/renderer-extension/src/probe-entry.ts +4 -0
  419. package/src/native-ui/renderer-extension/src/production-entry.ts +23 -0
  420. package/src/native-ui/renderer-extension/src/renderer-agent-icon.ts +145 -0
  421. package/src/native-ui/renderer-extension/src/renderer-agent-picker.ts +813 -0
  422. package/src/native-ui/renderer-extension/src/renderer-binding-probe.ts +2936 -0
  423. package/src/native-ui/renderer-extension/src/renderer-codex-account-options.ts +281 -0
  424. package/src/native-ui/renderer-extension/src/renderer-codex-account-state.ts +53 -0
  425. package/src/native-ui/renderer-extension/src/renderer-composer-dom.ts +782 -0
  426. package/src/native-ui/renderer-extension/src/renderer-credits-control.ts +500 -0
  427. package/src/native-ui/renderer-extension/src/renderer-external-steering.ts +339 -0
  428. package/src/native-ui/renderer-extension/src/renderer-fork-control.ts +273 -0
  429. package/src/native-ui/renderer-extension/src/renderer-harness-command-claim.ts +64 -0
  430. package/src/native-ui/renderer-extension/src/renderer-harness-command-control.ts +417 -0
  431. package/src/native-ui/renderer-extension/src/renderer-harness-localization.ts +144 -0
  432. package/src/native-ui/renderer-extension/src/renderer-harness-mentions.ts +213 -0
  433. package/src/native-ui/renderer-extension/src/renderer-model-client.ts +567 -0
  434. package/src/native-ui/renderer-extension/src/renderer-model-picker-positioning.ts +65 -0
  435. package/src/native-ui/renderer-extension/src/renderer-model-picker.ts +640 -0
  436. package/src/native-ui/renderer-extension/src/renderer-new-thread-preference.ts +175 -0
  437. package/src/native-ui/renderer-extension/src/renderer-permission-mode-picker.ts +413 -0
  438. package/src/native-ui/renderer-extension/src/renderer-permission-mode-preference.ts +49 -0
  439. package/src/native-ui/renderer-extension/src/renderer-request-sender.ts +43 -0
  440. package/src/native-ui/renderer-extension/src/renderer-session-import-client.ts +68 -0
  441. package/src/native-ui/renderer-extension/src/renderer-settings-lifecycle.ts +239 -0
  442. package/src/native-ui/renderer-extension/src/renderer-sidebar-agent-icons.ts +456 -0
  443. package/src/native-ui/renderer-extension/src/renderer-transcript-dom.ts +47 -0
  444. package/src/native-ui/renderer-extension/src/renderer-trigger-chip-style.ts +52 -0
  445. package/src/native-ui/renderer-extension/src/renderer-usage-control.ts +602 -0
  446. package/src/native-ui/renderer-extension/src/settings/accounts-list.ts +236 -0
  447. package/src/native-ui/renderer-extension/src/settings/accounts-page.ts +585 -0
  448. package/src/native-ui/renderer-extension/src/settings/accounts-quota-interactive.prototype.html +1418 -0
  449. package/src/native-ui/renderer-extension/src/settings/accounts-usage.ts +221 -0
  450. package/src/native-ui/renderer-extension/src/settings/accounts.css +607 -0
  451. package/src/native-ui/renderer-extension/src/settings/connections-page.ts +1354 -0
  452. package/src/native-ui/renderer-extension/src/settings/core.ts +158 -0
  453. package/src/native-ui/renderer-extension/src/settings/harness-accounts.ts +134 -0
  454. package/src/native-ui/renderer-extension/src/settings/icons.ts +141 -0
  455. package/src/native-ui/renderer-extension/src/settings/localization.ts +752 -0
  456. package/src/native-ui/renderer-extension/src/settings/pages.ts +615 -0
  457. package/src/native-ui/renderer-extension/src/settings/release-notes.ts +222 -0
  458. package/src/native-ui/renderer-extension/src/settings/session-import-list-controls.ts +128 -0
  459. package/src/native-ui/renderer-extension/src/settings/session-import-page.ts +461 -0
  460. package/src/native-ui/renderer-extension/src/settings/shell.css +2149 -0
  461. package/src/native-ui/renderer-extension/src/settings/shell.ts +329 -0
  462. package/src/native-ui/renderer-extension/src/settings/trigger.ts +323 -0
  463. package/src/native-ui/renderer-extension/src/settings/update-notes.preview.html +491 -0
  464. package/src/native-ui/renderer-extension/src/settings/update-request.ts +49 -0
  465. package/src/native-ui/renderer-extension/src/settings/windows-update.preview.html +2135 -0
  466. package/src/native-ui/renderer-extension/src/versioned-renderer-adapter.ts +1278 -0
  467. package/src/native-ui/renderer-extension/test/agent-selection-state.test.ts +611 -0
  468. package/src/native-ui/renderer-extension/test/codex-locale-adapter.test.ts +152 -0
  469. package/src/native-ui/renderer-extension/test/contract-audit.test.ts +71 -0
  470. package/src/native-ui/renderer-extension/test/index.test.ts +9 -0
  471. package/src/native-ui/renderer-extension/test/renderer-agent-icon.test.ts +98 -0
  472. package/src/native-ui/renderer-extension/test/renderer-agent-picker.test.ts +226 -0
  473. package/src/native-ui/renderer-extension/test/renderer-binding-probe-host-catalog.test.ts +728 -0
  474. package/src/native-ui/renderer-extension/test/renderer-binding-probe.test.ts +1290 -0
  475. package/src/native-ui/renderer-extension/test/renderer-codex-account-state.test.ts +65 -0
  476. package/src/native-ui/renderer-extension/test/renderer-composer-permissions.test.ts +75 -0
  477. package/src/native-ui/renderer-extension/test/renderer-credits-control.test.ts +70 -0
  478. package/src/native-ui/renderer-extension/test/renderer-external-steering-rpc.test.ts +184 -0
  479. package/src/native-ui/renderer-extension/test/renderer-external-steering.test.ts +279 -0
  480. package/src/native-ui/renderer-extension/test/renderer-fork-control.test.ts +363 -0
  481. package/src/native-ui/renderer-extension/test/renderer-harness-command-claim.test.ts +167 -0
  482. package/src/native-ui/renderer-extension/test/renderer-harness-command-control.test.ts +54 -0
  483. package/src/native-ui/renderer-extension/test/renderer-model-client.test.ts +708 -0
  484. package/src/native-ui/renderer-extension/test/renderer-model-picker.test.ts +302 -0
  485. package/src/native-ui/renderer-extension/test/renderer-native-thread-ownership.test.ts +84 -0
  486. package/src/native-ui/renderer-extension/test/renderer-new-thread-preference.test.ts +81 -0
  487. package/src/native-ui/renderer-extension/test/renderer-permission-mode-picker.test.ts +269 -0
  488. package/src/native-ui/renderer-extension/test/renderer-permission-mode-preference.test.ts +48 -0
  489. package/src/native-ui/renderer-extension/test/renderer-settings-lifecycle.test.ts +156 -0
  490. package/src/native-ui/renderer-extension/test/renderer-sidebar-agent-icons.test.ts +575 -0
  491. package/src/native-ui/renderer-extension/test/renderer-unsupported-methods.test.ts +167 -0
  492. package/src/native-ui/renderer-extension/test/renderer-usage-control.test.ts +96 -0
  493. package/src/native-ui/renderer-extension/test/settings/accounts-usage.test.ts +208 -0
  494. package/src/native-ui/renderer-extension/test/settings/core.test.ts +145 -0
  495. package/src/native-ui/renderer-extension/test/settings/harness-settings.test.ts +88 -0
  496. package/src/native-ui/renderer-extension/test/settings/localization.test.ts +80 -0
  497. package/src/native-ui/renderer-extension/test/settings/pages.test.ts +2000 -0
  498. package/src/native-ui/renderer-extension/test/settings/release-notes.test.ts +163 -0
  499. package/src/native-ui/renderer-extension/test/settings/shell.test.ts +74 -0
  500. package/src/native-ui/renderer-extension/test/settings/trigger.test.ts +270 -0
  501. package/src/native-ui/renderer-extension/test/settings/update-request.test.ts +48 -0
  502. package/src/native-ui/renderer-extension/test/versioned-renderer-adapter.test.ts +682 -0
  503. package/src/native-ui/renderer-extension/tsconfig.json +15 -0
  504. package/src/native-ui/shared-contracts/dist/codex-accounts.d.ts +246 -0
  505. package/src/native-ui/shared-contracts/dist/codex-accounts.d.ts.map +1 -0
  506. package/src/native-ui/shared-contracts/dist/codex-accounts.js +99 -0
  507. package/src/native-ui/shared-contracts/dist/codex-accounts.js.map +1 -0
  508. package/src/native-ui/shared-contracts/dist/deepseek-modern-sessions.d.ts +37 -0
  509. package/src/native-ui/shared-contracts/dist/deepseek-modern-sessions.d.ts.map +1 -0
  510. package/src/native-ui/shared-contracts/dist/deepseek-modern-sessions.js +36 -0
  511. package/src/native-ui/shared-contracts/dist/deepseek-modern-sessions.js.map +1 -0
  512. package/src/native-ui/shared-contracts/dist/errors.d.ts +17 -0
  513. package/src/native-ui/shared-contracts/dist/errors.d.ts.map +1 -0
  514. package/src/native-ui/shared-contracts/dist/errors.js +14 -0
  515. package/src/native-ui/shared-contracts/dist/errors.js.map +1 -0
  516. package/src/native-ui/shared-contracts/dist/external-thread-fork.d.ts +11 -0
  517. package/src/native-ui/shared-contracts/dist/external-thread-fork.d.ts.map +1 -0
  518. package/src/native-ui/shared-contracts/dist/external-thread-fork.js +14 -0
  519. package/src/native-ui/shared-contracts/dist/external-thread-fork.js.map +1 -0
  520. package/src/native-ui/shared-contracts/dist/harness-accounts.d.ts +64 -0
  521. package/src/native-ui/shared-contracts/dist/harness-accounts.d.ts.map +1 -0
  522. package/src/native-ui/shared-contracts/dist/harness-accounts.js +24 -0
  523. package/src/native-ui/shared-contracts/dist/harness-accounts.js.map +1 -0
  524. package/src/native-ui/shared-contracts/dist/harness-commands.d.ts +46 -0
  525. package/src/native-ui/shared-contracts/dist/harness-commands.d.ts.map +1 -0
  526. package/src/native-ui/shared-contracts/dist/harness-commands.js +61 -0
  527. package/src/native-ui/shared-contracts/dist/harness-commands.js.map +1 -0
  528. package/src/native-ui/shared-contracts/dist/harness-models.d.ts +278 -0
  529. package/src/native-ui/shared-contracts/dist/harness-models.d.ts.map +1 -0
  530. package/src/native-ui/shared-contracts/dist/harness-models.js +317 -0
  531. package/src/native-ui/shared-contracts/dist/harness-models.js.map +1 -0
  532. package/src/native-ui/shared-contracts/dist/harness-permission-modes.d.ts +30 -0
  533. package/src/native-ui/shared-contracts/dist/harness-permission-modes.d.ts.map +1 -0
  534. package/src/native-ui/shared-contracts/dist/harness-permission-modes.js +57 -0
  535. package/src/native-ui/shared-contracts/dist/harness-permission-modes.js.map +1 -0
  536. package/src/native-ui/shared-contracts/dist/harness-plugins.d.ts +56 -0
  537. package/src/native-ui/shared-contracts/dist/harness-plugins.d.ts.map +1 -0
  538. package/src/native-ui/shared-contracts/dist/harness-plugins.js +75 -0
  539. package/src/native-ui/shared-contracts/dist/harness-plugins.js.map +1 -0
  540. package/src/native-ui/shared-contracts/dist/harness-route.d.ts +16 -0
  541. package/src/native-ui/shared-contracts/dist/harness-route.d.ts.map +1 -0
  542. package/src/native-ui/shared-contracts/dist/harness-route.js +42 -0
  543. package/src/native-ui/shared-contracts/dist/harness-route.js.map +1 -0
  544. package/src/native-ui/shared-contracts/dist/harness-session-import.d.ts +54 -0
  545. package/src/native-ui/shared-contracts/dist/harness-session-import.d.ts.map +1 -0
  546. package/src/native-ui/shared-contracts/dist/harness-session-import.js +72 -0
  547. package/src/native-ui/shared-contracts/dist/harness-session-import.js.map +1 -0
  548. package/src/native-ui/shared-contracts/dist/ids.d.ts +12 -0
  549. package/src/native-ui/shared-contracts/dist/ids.d.ts.map +1 -0
  550. package/src/native-ui/shared-contracts/dist/ids.js +10 -0
  551. package/src/native-ui/shared-contracts/dist/ids.js.map +1 -0
  552. package/src/native-ui/shared-contracts/dist/index.d.ts +47 -0
  553. package/src/native-ui/shared-contracts/dist/index.d.ts.map +1 -0
  554. package/src/native-ui/shared-contracts/dist/index.js +29 -0
  555. package/src/native-ui/shared-contracts/dist/index.js.map +1 -0
  556. package/src/native-ui/shared-contracts/dist/json-rpc.d.ts +84 -0
  557. package/src/native-ui/shared-contracts/dist/json-rpc.d.ts.map +1 -0
  558. package/src/native-ui/shared-contracts/dist/json-rpc.js +65 -0
  559. package/src/native-ui/shared-contracts/dist/json-rpc.js.map +1 -0
  560. package/src/native-ui/shared-contracts/dist/json-value.d.ts +13 -0
  561. package/src/native-ui/shared-contracts/dist/json-value.d.ts.map +1 -0
  562. package/src/native-ui/shared-contracts/dist/json-value.js +60 -0
  563. package/src/native-ui/shared-contracts/dist/json-value.js.map +1 -0
  564. package/src/native-ui/shared-contracts/dist/native-refs.d.ts +43 -0
  565. package/src/native-ui/shared-contracts/dist/native-refs.d.ts.map +1 -0
  566. package/src/native-ui/shared-contracts/dist/native-refs.js +35 -0
  567. package/src/native-ui/shared-contracts/dist/native-refs.js.map +1 -0
  568. package/src/native-ui/shared-contracts/dist/reasoning-transcript.d.ts +7 -0
  569. package/src/native-ui/shared-contracts/dist/reasoning-transcript.d.ts.map +1 -0
  570. package/src/native-ui/shared-contracts/dist/reasoning-transcript.js +7 -0
  571. package/src/native-ui/shared-contracts/dist/reasoning-transcript.js.map +1 -0
  572. package/src/native-ui/shared-contracts/dist/thread-delegate.d.ts +22 -0
  573. package/src/native-ui/shared-contracts/dist/thread-delegate.d.ts.map +1 -0
  574. package/src/native-ui/shared-contracts/dist/thread-delegate.js +30 -0
  575. package/src/native-ui/shared-contracts/dist/thread-delegate.js.map +1 -0
  576. package/src/native-ui/shared-contracts/dist/thread-harness-switch.d.ts +16 -0
  577. package/src/native-ui/shared-contracts/dist/thread-harness-switch.d.ts.map +1 -0
  578. package/src/native-ui/shared-contracts/dist/thread-harness-switch.js +19 -0
  579. package/src/native-ui/shared-contracts/dist/thread-harness-switch.js.map +1 -0
  580. package/src/native-ui/shared-contracts/dist/thread-usage.d.ts +106 -0
  581. package/src/native-ui/shared-contracts/dist/thread-usage.d.ts.map +1 -0
  582. package/src/native-ui/shared-contracts/dist/thread-usage.js +103 -0
  583. package/src/native-ui/shared-contracts/dist/thread-usage.js.map +1 -0
  584. package/src/native-ui/shared-contracts/dist/tsconfig.tsbuildinfo +1 -0
  585. package/src/native-ui/shared-contracts/dist/updates.d.ts +128 -0
  586. package/src/native-ui/shared-contracts/dist/updates.d.ts.map +1 -0
  587. package/src/native-ui/shared-contracts/dist/updates.js +58 -0
  588. package/src/native-ui/shared-contracts/dist/updates.js.map +1 -0
  589. package/src/native-ui/shared-contracts/dist/version.d.ts +2 -0
  590. package/src/native-ui/shared-contracts/dist/version.d.ts.map +1 -0
  591. package/src/native-ui/shared-contracts/dist/version.js +2 -0
  592. package/src/native-ui/shared-contracts/dist/version.js.map +1 -0
  593. package/src/native-ui/shared-contracts/package.json +25 -0
  594. package/src/native-ui/shared-contracts/src/codex-accounts.ts +140 -0
  595. package/src/native-ui/shared-contracts/src/deepseek-modern-sessions.ts +67 -0
  596. package/src/native-ui/shared-contracts/src/errors.ts +25 -0
  597. package/src/native-ui/shared-contracts/src/external-thread-fork.ts +20 -0
  598. package/src/native-ui/shared-contracts/src/harness-accounts.ts +29 -0
  599. package/src/native-ui/shared-contracts/src/harness-commands.ts +81 -0
  600. package/src/native-ui/shared-contracts/src/harness-models.ts +401 -0
  601. package/src/native-ui/shared-contracts/src/harness-permission-modes.ts +73 -0
  602. package/src/native-ui/shared-contracts/src/harness-plugins.ts +96 -0
  603. package/src/native-ui/shared-contracts/src/harness-route.ts +47 -0
  604. package/src/native-ui/shared-contracts/src/harness-session-import.ts +90 -0
  605. package/src/native-ui/shared-contracts/src/ids.ts +20 -0
  606. package/src/native-ui/shared-contracts/src/index.ts +320 -0
  607. package/src/native-ui/shared-contracts/src/json-rpc.ts +80 -0
  608. package/src/native-ui/shared-contracts/src/json-value.ts +78 -0
  609. package/src/native-ui/shared-contracts/src/native-refs.ts +58 -0
  610. package/src/native-ui/shared-contracts/src/reasoning-transcript.ts +6 -0
  611. package/src/native-ui/shared-contracts/src/thread-delegate.ts +40 -0
  612. package/src/native-ui/shared-contracts/src/thread-harness-switch.ts +25 -0
  613. package/src/native-ui/shared-contracts/src/thread-usage.ts +126 -0
  614. package/src/native-ui/shared-contracts/src/updates.ts +78 -0
  615. package/src/native-ui/shared-contracts/src/version.ts +1 -0
  616. package/src/native-ui/shared-contracts/test/browser-bundle.test.ts +36 -0
  617. package/src/native-ui/shared-contracts/test/deepseek-modern-sessions.test.ts +120 -0
  618. package/src/native-ui/shared-contracts/test/errors.test.ts +72 -0
  619. package/src/native-ui/shared-contracts/test/harness-commands.test.ts +64 -0
  620. package/src/native-ui/shared-contracts/test/harness-models.test.ts +390 -0
  621. package/src/native-ui/shared-contracts/test/harness-permission-modes.test.ts +134 -0
  622. package/src/native-ui/shared-contracts/test/harness-plugins.test.ts +113 -0
  623. package/src/native-ui/shared-contracts/test/harness-session-import.test.ts +117 -0
  624. package/src/native-ui/shared-contracts/test/ids.test.ts +69 -0
  625. package/src/native-ui/shared-contracts/test/index.test.ts +80 -0
  626. package/src/native-ui/shared-contracts/test/json-rpc.test.ts +177 -0
  627. package/src/native-ui/shared-contracts/test/json-value.test.ts +62 -0
  628. package/src/native-ui/shared-contracts/test/native-refs.test.ts +95 -0
  629. package/src/native-ui/shared-contracts/test/thread-usage.test.ts +115 -0
  630. package/src/native-ui/shared-contracts/test/updates.test.ts +120 -0
  631. package/src/native-ui/shared-contracts/tsconfig.json +10 -0
  632. 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,2 @@
1
+ @echo off
2
+ "%HARNESS_MIX_NODE_PATH%" "%~dp0dsh-native.cjs" %*
@@ -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; });