@harness-mix/cli 0.1.11 → 0.1.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (306) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/NOTICE +16 -2
  3. package/README.md +265 -3
  4. package/docs/cross-platform.md +3 -3
  5. package/docs/multi-agent-collaboration.md +37 -23
  6. package/docs/native-acp.md +2 -2
  7. package/docs/native-codex.md +5 -5
  8. package/docs/{superpowers/specs → specs}/2026-09-13-native-hardening-design.md +2 -2
  9. package/docs/storage-verification-design.md +5 -5
  10. package/licenses/lobe-icons-MIT.txt +21 -0
  11. package/output/native-build/desktop-controller.mjs +24 -24
  12. package/output/native-build/harness-mix-secret.exe +0 -0
  13. package/output/native-build/harness-mix-shim.exe +0 -0
  14. package/output/native-build/renderer-extension.js +1325 -658
  15. package/package.json +2 -2
  16. package/scripts/adapters-test.cjs +9 -1
  17. package/scripts/antigravity-adapter-test.cjs +381 -284
  18. package/scripts/build-native.cjs +64 -46
  19. package/scripts/codex-accounts-test.cjs +1 -1
  20. package/scripts/codex-accounts-ui-smoke.cjs +1 -1
  21. package/scripts/collaboration-recovery-test.cjs +11 -2
  22. package/scripts/collaboration-test.cjs +114 -27
  23. package/scripts/collaboration-ui-smoke.cjs +45 -8
  24. package/scripts/concurrency-layers-test.cjs +5 -0
  25. package/scripts/diagnostics.cjs +1 -1
  26. package/scripts/e2e-native-host.cjs +13 -13
  27. package/scripts/error-kind-test.cjs +3 -3
  28. package/scripts/integrations-test.cjs +2 -2
  29. package/scripts/integrations-ui-smoke.cjs +6 -6
  30. package/scripts/native-config-test.cjs +6 -6
  31. package/scripts/native-job-object-test.cjs +1 -1
  32. package/scripts/native-protocol-test.cjs +44 -38
  33. package/scripts/native-rollback-test.cjs +1 -1
  34. package/scripts/native-secret-test.cjs +1 -1
  35. package/scripts/native-shim-test.cjs +1 -1
  36. package/scripts/native-sidebar-test.cjs +4 -4
  37. package/scripts/native-ui-smoke.cjs +12 -12
  38. package/scripts/pets-test.cjs +223 -3
  39. package/scripts/platform-test.cjs +6 -6
  40. package/scripts/publish-native-package.cjs +1 -1
  41. package/scripts/test-live-mentions.cjs +2 -2
  42. package/scripts/workspace-test.cjs +4 -2
  43. package/src/assets/icons/PROVENANCE.md +92 -0
  44. package/src/main/adapters/antigravity.js +1415 -1368
  45. package/src/main/adapters/claude.js +1 -1
  46. package/src/main/adapters/codex-app-server.js +1 -1
  47. package/src/main/adapters/dsh.js +1 -1
  48. package/src/main/adapters/index.js +1 -1
  49. package/src/main/adapters/pi-usage.js +2 -2
  50. package/src/main/harness-adapter/error-kind.js +1 -1
  51. package/src/main/harness-adapter/manifest.js +7 -1
  52. package/src/main/host/collaboration-tools.js +8 -1
  53. package/src/main/host/collaboration-worktree.js +27 -1
  54. package/src/main/host/collaboration.js +348 -15
  55. package/src/main/host/runtime.js +23 -15
  56. package/src/main/native/codex-accounts.js +1 -1
  57. package/src/main/native/config.js +9 -9
  58. package/src/main/native/host.js +1 -1
  59. package/src/main/native/launcher.js +10 -8
  60. package/src/main/native/pets.js +188 -49
  61. package/src/main/native/platform.js +19 -9
  62. package/src/main/native/protocol.js +83 -80
  63. package/src/main/native/rs/crates/appx/Cargo.toml +1 -1
  64. package/src/main/native/rs/crates/secret/Cargo.toml +1 -1
  65. package/src/main/native/rs/crates/secret/src/main.rs +3 -3
  66. package/src/main/native/rs/crates/shim/Cargo.toml +1 -1
  67. package/src/main/native/rs/crates/shim/src/main.rs +2 -2
  68. package/src/main/native/thread-list.js +1 -1
  69. package/src/main/shared-contracts/capability.js +3 -1
  70. package/src/main/workspace/core-review.js +4 -3
  71. package/src/native-ui/README.md +2 -2
  72. package/src/native-ui/desktop-control/dist/contract-audit.js +4 -4
  73. package/src/native-ui/desktop-control/dist/index.d.ts +1 -1
  74. package/src/native-ui/desktop-control/dist/index.js +2 -2
  75. package/src/native-ui/desktop-control/dist/index.js.map +1 -1
  76. package/src/native-ui/desktop-control/dist/main-process-title-policy.js +5 -5
  77. package/src/native-ui/desktop-control/dist/main-process-title-policy.js.map +1 -1
  78. package/src/native-ui/desktop-control/dist/production-controller.js +3 -3
  79. package/src/native-ui/desktop-control/dist/production-controller.js.map +1 -1
  80. package/src/native-ui/desktop-control/dist/release-main.js +1 -1
  81. package/src/native-ui/desktop-control/dist/release-main.js.map +1 -1
  82. package/src/native-ui/desktop-control/dist/renderer-cdp-control-session.js +1 -1
  83. package/src/native-ui/desktop-control/dist/renderer-cdp-control-session.js.map +1 -1
  84. package/src/native-ui/desktop-control/dist/renderer-control-session.js +3 -3
  85. package/src/native-ui/desktop-control/dist/renderer-control-session.js.map +1 -1
  86. package/src/native-ui/desktop-control/dist/renderer-draft-prewarm-runtime.js +25 -25
  87. package/src/native-ui/desktop-control/dist/renderer-draft-prewarm-runtime.js.map +1 -1
  88. package/src/native-ui/desktop-control/dist/tsconfig.tsbuildinfo +1 -1
  89. package/src/native-ui/desktop-control/package.json +2 -2
  90. package/src/native-ui/desktop-control/scripts/build-release.mjs +2 -2
  91. package/src/native-ui/desktop-control/src/contract-audit.ts +4 -4
  92. package/src/native-ui/desktop-control/src/index.ts +2 -2
  93. package/src/native-ui/desktop-control/src/main-process-title-policy.ts +5 -5
  94. package/src/native-ui/desktop-control/src/production-controller.ts +3 -3
  95. package/src/native-ui/desktop-control/src/release-main.ts +1 -1
  96. package/src/native-ui/desktop-control/src/renderer-cdp-control-session.ts +1 -1
  97. package/src/native-ui/desktop-control/src/renderer-control-session.ts +3 -3
  98. package/src/native-ui/desktop-control/src/renderer-draft-prewarm-runtime.ts +25 -25
  99. package/src/native-ui/desktop-control/test/index.test.ts +1 -1
  100. package/src/native-ui/desktop-control/test/production-controller.test.ts +1 -1
  101. package/src/native-ui/desktop-control/test/renderer-cdp-control-session.test.ts +1 -1
  102. package/src/native-ui/desktop-control/test/renderer-draft-prewarm-policy.test.ts +43 -43
  103. package/src/native-ui/renderer-extension/dist/types/agent-group-preference.d.ts +1 -1
  104. package/src/native-ui/renderer-extension/dist/types/agent-group-preference.d.ts.map +1 -1
  105. package/src/native-ui/renderer-extension/dist/types/agent-selection-state.d.ts +1 -1
  106. package/src/native-ui/renderer-extension/dist/types/agent-selection-state.d.ts.map +1 -1
  107. package/src/native-ui/renderer-extension/dist/types/contract-audit.d.ts +1 -1
  108. package/src/native-ui/renderer-extension/dist/types/contract-audit.d.ts.map +1 -1
  109. package/src/native-ui/renderer-extension/dist/types/index.d.ts +3 -1
  110. package/src/native-ui/renderer-extension/dist/types/index.d.ts.map +1 -1
  111. package/src/native-ui/renderer-extension/dist/types/production-entry.d.ts +1 -1
  112. package/src/native-ui/renderer-extension/dist/types/production-entry.d.ts.map +1 -1
  113. package/src/native-ui/renderer-extension/dist/types/renderer-agent-picker.d.ts +2 -2
  114. package/src/native-ui/renderer-extension/dist/types/renderer-agent-picker.d.ts.map +1 -1
  115. package/src/native-ui/renderer-extension/dist/types/renderer-binding-probe.d.ts +3 -3
  116. package/src/native-ui/renderer-extension/dist/types/renderer-binding-probe.d.ts.map +1 -1
  117. package/src/native-ui/renderer-extension/dist/types/renderer-codex-account-options.d.ts +1 -1
  118. package/src/native-ui/renderer-extension/dist/types/renderer-codex-account-options.d.ts.map +1 -1
  119. package/src/native-ui/renderer-extension/dist/types/renderer-codex-account-state.d.ts +1 -1
  120. package/src/native-ui/renderer-extension/dist/types/renderer-codex-account-state.d.ts.map +1 -1
  121. package/src/native-ui/renderer-extension/dist/types/renderer-collab-cards.d.ts +1 -1
  122. package/src/native-ui/renderer-extension/dist/types/renderer-collab-cards.d.ts.map +1 -1
  123. package/src/native-ui/renderer-extension/dist/types/renderer-composer-dom.d.ts +1 -1
  124. package/src/native-ui/renderer-extension/dist/types/renderer-composer-dom.d.ts.map +1 -1
  125. package/src/native-ui/renderer-extension/dist/types/renderer-credits-control.d.ts +1 -1
  126. package/src/native-ui/renderer-extension/dist/types/renderer-credits-control.d.ts.map +1 -1
  127. package/src/native-ui/renderer-extension/dist/types/renderer-fork-control.d.ts +1 -1
  128. package/src/native-ui/renderer-extension/dist/types/renderer-fork-control.d.ts.map +1 -1
  129. package/src/native-ui/renderer-extension/dist/types/renderer-harness-command-claim.d.ts +1 -1
  130. package/src/native-ui/renderer-extension/dist/types/renderer-harness-command-claim.d.ts.map +1 -1
  131. package/src/native-ui/renderer-extension/dist/types/renderer-harness-command-control.d.ts +1 -1
  132. package/src/native-ui/renderer-extension/dist/types/renderer-harness-command-control.d.ts.map +1 -1
  133. package/src/native-ui/renderer-extension/dist/types/renderer-harness-handoff.d.ts +1 -1
  134. package/src/native-ui/renderer-extension/dist/types/renderer-harness-handoff.d.ts.map +1 -1
  135. package/src/native-ui/renderer-extension/dist/types/renderer-harness-localization.d.ts +1 -1
  136. package/src/native-ui/renderer-extension/dist/types/renderer-harness-localization.d.ts.map +1 -1
  137. package/src/native-ui/renderer-extension/dist/types/renderer-harness-mentions.d.ts +1 -0
  138. package/src/native-ui/renderer-extension/dist/types/renderer-harness-mentions.d.ts.map +1 -1
  139. package/src/native-ui/renderer-extension/dist/types/renderer-model-client.d.ts +36 -31
  140. package/src/native-ui/renderer-extension/dist/types/renderer-model-client.d.ts.map +1 -1
  141. package/src/native-ui/renderer-extension/dist/types/renderer-model-picker.d.ts +1 -1
  142. package/src/native-ui/renderer-extension/dist/types/renderer-model-picker.d.ts.map +1 -1
  143. package/src/native-ui/renderer-extension/dist/types/renderer-new-thread-preference.d.ts +2 -2
  144. package/src/native-ui/renderer-extension/dist/types/renderer-new-thread-preference.d.ts.map +1 -1
  145. package/src/native-ui/renderer-extension/dist/types/renderer-permission-mode-picker.d.ts +1 -1
  146. package/src/native-ui/renderer-extension/dist/types/renderer-permission-mode-picker.d.ts.map +1 -1
  147. package/src/native-ui/renderer-extension/dist/types/renderer-permission-mode-preference.d.ts +2 -2
  148. package/src/native-ui/renderer-extension/dist/types/renderer-permission-mode-preference.d.ts.map +1 -1
  149. package/src/native-ui/renderer-extension/dist/types/renderer-request-sender.d.ts +18 -2
  150. package/src/native-ui/renderer-extension/dist/types/renderer-request-sender.d.ts.map +1 -1
  151. package/src/native-ui/renderer-extension/dist/types/renderer-session-import-client.d.ts +1 -1
  152. package/src/native-ui/renderer-extension/dist/types/renderer-session-import-client.d.ts.map +1 -1
  153. package/src/native-ui/renderer-extension/dist/types/renderer-sidebar-agent-icons.d.ts +2 -2
  154. package/src/native-ui/renderer-extension/dist/types/renderer-sidebar-agent-icons.d.ts.map +1 -1
  155. package/src/native-ui/renderer-extension/dist/types/renderer-team-cards.d.ts +58 -0
  156. package/src/native-ui/renderer-extension/dist/types/renderer-team-cards.d.ts.map +1 -0
  157. package/src/native-ui/renderer-extension/dist/types/renderer-transcript-dom.d.ts +1 -1
  158. package/src/native-ui/renderer-extension/dist/types/renderer-trigger-chip-style.d.ts +1 -1
  159. package/src/native-ui/renderer-extension/dist/types/renderer-trigger-chip-style.d.ts.map +1 -1
  160. package/src/native-ui/renderer-extension/dist/types/renderer-usage-control.d.ts +1 -1
  161. package/src/native-ui/renderer-extension/dist/types/renderer-usage-control.d.ts.map +1 -1
  162. package/src/native-ui/renderer-extension/dist/types/settings/accounts-list.d.ts +1 -1
  163. package/src/native-ui/renderer-extension/dist/types/settings/accounts-list.d.ts.map +1 -1
  164. package/src/native-ui/renderer-extension/dist/types/settings/accounts-page.d.ts +1 -1
  165. package/src/native-ui/renderer-extension/dist/types/settings/accounts-page.d.ts.map +1 -1
  166. package/src/native-ui/renderer-extension/dist/types/settings/accounts-usage.d.ts +1 -1
  167. package/src/native-ui/renderer-extension/dist/types/settings/accounts-usage.d.ts.map +1 -1
  168. package/src/native-ui/renderer-extension/dist/types/settings/connections-page.d.ts +3 -3
  169. package/src/native-ui/renderer-extension/dist/types/settings/connections-page.d.ts.map +1 -1
  170. package/src/native-ui/renderer-extension/dist/types/settings/harness-accounts.d.ts +1 -1
  171. package/src/native-ui/renderer-extension/dist/types/settings/harness-accounts.d.ts.map +1 -1
  172. package/src/native-ui/renderer-extension/dist/types/settings/pages.d.ts +4 -4
  173. package/src/native-ui/renderer-extension/dist/types/settings/pages.d.ts.map +1 -1
  174. package/src/native-ui/renderer-extension/dist/types/settings/pet-market.d.ts.map +1 -1
  175. package/src/native-ui/renderer-extension/dist/types/settings/session-import-list-controls.d.ts +1 -1
  176. package/src/native-ui/renderer-extension/dist/types/settings/session-import-list-controls.d.ts.map +1 -1
  177. package/src/native-ui/renderer-extension/dist/types/settings/session-import-page.d.ts +1 -1
  178. package/src/native-ui/renderer-extension/dist/types/settings/session-import-page.d.ts.map +1 -1
  179. package/src/native-ui/renderer-extension/dist/types/settings/shell.d.ts +2 -2
  180. package/src/native-ui/renderer-extension/dist/types/settings/shell.d.ts.map +1 -1
  181. package/src/native-ui/renderer-extension/dist/types/settings/trigger.d.ts +1 -1
  182. package/src/native-ui/renderer-extension/dist/types/settings/trigger.d.ts.map +1 -1
  183. package/src/native-ui/renderer-extension/dist/types/tsconfig.tsbuildinfo +1 -1
  184. package/src/native-ui/renderer-extension/dist/types/versioned-renderer-adapter.d.ts +18 -18
  185. package/src/native-ui/renderer-extension/dist/types/versioned-renderer-adapter.d.ts.map +1 -1
  186. package/src/native-ui/renderer-extension/package.json +2 -2
  187. package/src/native-ui/renderer-extension/src/agent-group-preference.ts +1 -1
  188. package/src/native-ui/renderer-extension/src/agent-selection-state.ts +31 -16
  189. package/src/native-ui/renderer-extension/src/audit-entry.ts +1 -1
  190. package/src/native-ui/renderer-extension/src/contract-audit.ts +4 -4
  191. package/src/native-ui/renderer-extension/src/index.ts +4 -2
  192. package/src/native-ui/renderer-extension/src/install-renderer-binding.ts +2 -2
  193. package/src/native-ui/renderer-extension/src/production-entry.ts +3 -3
  194. package/src/native-ui/renderer-extension/src/renderer-agent-picker.ts +7 -7
  195. package/src/native-ui/renderer-extension/src/renderer-binding-probe.ts +112 -89
  196. package/src/native-ui/renderer-extension/src/renderer-codex-account-options.ts +1 -1
  197. package/src/native-ui/renderer-extension/src/renderer-codex-account-state.ts +1 -1
  198. package/src/native-ui/renderer-extension/src/renderer-collab-cards.ts +1 -1
  199. package/src/native-ui/renderer-extension/src/renderer-composer-dom.ts +12 -12
  200. package/src/native-ui/renderer-extension/src/renderer-credits-control.ts +7 -7
  201. package/src/native-ui/renderer-extension/src/renderer-external-steering.ts +3 -3
  202. package/src/native-ui/renderer-extension/src/renderer-fork-control.ts +1 -1
  203. package/src/native-ui/renderer-extension/src/renderer-harness-command-claim.ts +1 -1
  204. package/src/native-ui/renderer-extension/src/renderer-harness-command-control.ts +3 -3
  205. package/src/native-ui/renderer-extension/src/renderer-harness-handoff.ts +1 -1
  206. package/src/native-ui/renderer-extension/src/renderer-harness-localization.ts +1 -1
  207. package/src/native-ui/renderer-extension/src/renderer-harness-mentions.ts +4 -0
  208. package/src/native-ui/renderer-extension/src/renderer-integrations-client.ts +5 -5
  209. package/src/native-ui/renderer-extension/src/renderer-model-client.ts +63 -42
  210. package/src/native-ui/renderer-extension/src/renderer-model-picker.ts +16 -16
  211. package/src/native-ui/renderer-extension/src/renderer-new-thread-preference.ts +2 -2
  212. package/src/native-ui/renderer-extension/src/renderer-permission-mode-picker.ts +3 -3
  213. package/src/native-ui/renderer-extension/src/renderer-permission-mode-preference.ts +2 -2
  214. package/src/native-ui/renderer-extension/src/renderer-request-sender.ts +46 -3
  215. package/src/native-ui/renderer-extension/src/renderer-session-import-client.ts +4 -4
  216. package/src/native-ui/renderer-extension/src/renderer-sidebar-agent-icons.ts +24 -20
  217. package/src/native-ui/renderer-extension/src/renderer-team-cards.ts +312 -0
  218. package/src/native-ui/renderer-extension/src/renderer-transcript-dom.ts +1 -1
  219. package/src/native-ui/renderer-extension/src/renderer-trigger-chip-style.ts +2 -2
  220. package/src/native-ui/renderer-extension/src/renderer-usage-control.ts +4 -4
  221. package/src/native-ui/renderer-extension/src/settings/accounts-list.ts +1 -1
  222. package/src/native-ui/renderer-extension/src/settings/accounts-page.ts +1 -1
  223. package/src/native-ui/renderer-extension/src/settings/accounts-usage.ts +1 -1
  224. package/src/native-ui/renderer-extension/src/settings/connections-page.ts +7 -7
  225. package/src/native-ui/renderer-extension/src/settings/harness-accounts.ts +1 -1
  226. package/src/native-ui/renderer-extension/src/settings/icons.ts +2 -2
  227. package/src/native-ui/renderer-extension/src/settings/pages.ts +11 -11
  228. package/src/native-ui/renderer-extension/src/settings/pet-market.css +33 -0
  229. package/src/native-ui/renderer-extension/src/settings/pet-market.ts +173 -91
  230. package/src/native-ui/renderer-extension/src/settings/pets-client.ts +5 -5
  231. package/src/native-ui/renderer-extension/src/settings/release-notes.ts +1 -1
  232. package/src/native-ui/renderer-extension/src/settings/session-import-list-controls.ts +1 -1
  233. package/src/native-ui/renderer-extension/src/settings/session-import-page.ts +1 -1
  234. package/src/native-ui/renderer-extension/src/settings/shell.css +15 -15
  235. package/src/native-ui/renderer-extension/src/settings/shell.ts +11 -11
  236. package/src/native-ui/renderer-extension/src/settings/skin-runtime.ts +17 -17
  237. package/src/native-ui/renderer-extension/src/settings/trigger.ts +1 -1
  238. package/src/native-ui/renderer-extension/src/versioned-renderer-adapter.ts +20 -20
  239. package/src/native-ui/renderer-extension/test/agent-selection-state.test.ts +60 -1
  240. package/src/native-ui/renderer-extension/test/codebuddy-migration.test.ts +1 -1
  241. package/src/native-ui/renderer-extension/test/renderer-agent-picker.test.ts +1 -1
  242. package/src/native-ui/renderer-extension/test/renderer-binding-probe-host-catalog.test.ts +15 -9
  243. package/src/native-ui/renderer-extension/test/renderer-binding-probe.test.ts +15 -15
  244. package/src/native-ui/renderer-extension/test/renderer-codex-account-state.test.ts +1 -1
  245. package/src/native-ui/renderer-extension/test/renderer-composer-permissions.test.ts +4 -4
  246. package/src/native-ui/renderer-extension/test/renderer-external-steering-rpc.test.ts +2 -2
  247. package/src/native-ui/renderer-extension/test/renderer-external-steering.test.ts +3 -3
  248. package/src/native-ui/renderer-extension/test/renderer-fork-control.test.ts +4 -4
  249. package/src/native-ui/renderer-extension/test/renderer-harness-command-claim.test.ts +1 -1
  250. package/src/native-ui/renderer-extension/test/renderer-harness-command-control.test.ts +1 -1
  251. package/src/native-ui/renderer-extension/test/renderer-model-client.test.ts +12 -11
  252. package/src/native-ui/renderer-extension/test/renderer-model-picker.test.ts +1 -1
  253. package/src/native-ui/renderer-extension/test/renderer-native-thread-ownership.test.ts +6 -6
  254. package/src/native-ui/renderer-extension/test/renderer-new-thread-preference.test.ts +1 -1
  255. package/src/native-ui/renderer-extension/test/renderer-permission-mode-picker.test.ts +1 -1
  256. package/src/native-ui/renderer-extension/test/renderer-permission-mode-preference.test.ts +1 -1
  257. package/src/native-ui/renderer-extension/test/renderer-request-timeout.test.ts +80 -0
  258. package/src/native-ui/renderer-extension/test/renderer-settings-lifecycle.test.ts +2 -2
  259. package/src/native-ui/renderer-extension/test/renderer-sidebar-agent-icons.test.ts +10 -3
  260. package/src/native-ui/renderer-extension/test/renderer-unsupported-methods.test.ts +1 -1
  261. package/src/native-ui/renderer-extension/test/settings/pages.test.ts +5 -5
  262. package/src/native-ui/renderer-extension/test/settings/release-notes.test.ts +9 -9
  263. package/src/native-ui/renderer-extension/test/versioned-renderer-adapter.test.ts +3 -3
  264. package/src/native-ui/shared-contracts/dist/errors.d.ts +2 -2
  265. package/src/native-ui/shared-contracts/dist/errors.d.ts.map +1 -1
  266. package/src/native-ui/shared-contracts/dist/errors.js +1 -1
  267. package/src/native-ui/shared-contracts/dist/errors.js.map +1 -1
  268. package/src/native-ui/shared-contracts/dist/harness-models.d.ts +40 -0
  269. package/src/native-ui/shared-contracts/dist/harness-models.d.ts.map +1 -1
  270. package/src/native-ui/shared-contracts/dist/harness-models.js +23 -2
  271. package/src/native-ui/shared-contracts/dist/harness-models.js.map +1 -1
  272. package/src/native-ui/shared-contracts/dist/harness-route.d.ts +1 -1
  273. package/src/native-ui/shared-contracts/dist/harness-route.d.ts.map +1 -1
  274. package/src/native-ui/shared-contracts/dist/harness-route.js +1 -1
  275. package/src/native-ui/shared-contracts/dist/harness-route.js.map +1 -1
  276. package/src/native-ui/shared-contracts/dist/harness-session-import.d.ts +1 -1
  277. package/src/native-ui/shared-contracts/dist/harness-session-import.d.ts.map +1 -1
  278. package/src/native-ui/shared-contracts/dist/harness-session-import.js +1 -1
  279. package/src/native-ui/shared-contracts/dist/harness-session-import.js.map +1 -1
  280. package/src/native-ui/shared-contracts/dist/index.d.ts +3 -3
  281. package/src/native-ui/shared-contracts/dist/index.d.ts.map +1 -1
  282. package/src/native-ui/shared-contracts/dist/index.js +2 -2
  283. package/src/native-ui/shared-contracts/dist/index.js.map +1 -1
  284. package/src/native-ui/shared-contracts/dist/tsconfig.tsbuildinfo +1 -1
  285. package/src/native-ui/shared-contracts/dist/updates.js +1 -1
  286. package/src/native-ui/shared-contracts/dist/updates.js.map +1 -1
  287. package/src/native-ui/shared-contracts/package.json +1 -1
  288. package/src/native-ui/shared-contracts/src/errors.ts +3 -3
  289. package/src/native-ui/shared-contracts/src/harness-models.ts +23 -2
  290. package/src/native-ui/shared-contracts/src/harness-route.ts +1 -1
  291. package/src/native-ui/shared-contracts/src/harness-session-import.ts +1 -1
  292. package/src/native-ui/shared-contracts/src/index.ts +3 -3
  293. package/src/native-ui/shared-contracts/src/updates.ts +1 -1
  294. package/src/native-ui/shared-contracts/test/browser-bundle.test.ts +3 -3
  295. package/src/native-ui/shared-contracts/test/deepseek-modern-sessions.test.ts +1 -1
  296. package/src/native-ui/shared-contracts/test/errors.test.ts +9 -9
  297. package/src/native-ui/shared-contracts/test/harness-commands.test.ts +1 -1
  298. package/src/native-ui/shared-contracts/test/harness-models.test.ts +3 -3
  299. package/src/native-ui/shared-contracts/test/harness-permission-modes.test.ts +1 -1
  300. package/src/native-ui/shared-contracts/test/harness-plugins.test.ts +1 -1
  301. package/src/native-ui/shared-contracts/test/harness-session-import.test.ts +1 -1
  302. package/src/native-ui/shared-contracts/test/index.test.ts +3 -3
  303. package/src/native-ui/shared-contracts/test/json-rpc.test.ts +1 -1
  304. package/src/native-ui/shared-contracts/test/thread-usage.test.ts +1 -1
  305. package/src/native-ui/shared-contracts/test/updates.test.ts +4 -4
  306. /package/licenses/{codex-host-MIT.txt → bytepioneer-MIT.txt} +0 -0
@@ -1,4 +1,4 @@
1
- import type { HarnessCommandDescriptor, HarnessPermissionMode } from "@codexhost/shared-contracts";
1
+ import type { HarnessCommandDescriptor, HarnessPermissionMode } from "@harnessmix/shared-contracts";
2
2
 
3
3
  import type { RendererSettingsLocale } from "./settings/localization.js";
4
4
 
@@ -718,6 +718,10 @@ export function installHarnessMentions(load: (editor: Element, query: string) =>
718
718
  sync(target: HTMLElement) {
719
719
  syncBadges(target);
720
720
  },
721
+ prepareSubmission(composer: Element): boolean {
722
+ const editorEl = findEditorIn(composer);
723
+ return !!editorEl && injectMentionsInto(editorEl);
724
+ },
721
725
  dispose() {
722
726
  disposed = true;
723
727
  close();
@@ -50,10 +50,10 @@ export interface RendererIntegrationsClient {
50
50
  }
51
51
  export function createRendererIntegrationsClient(send: (method: string, params: unknown) => Promise<unknown>): RendererIntegrationsClient {
52
52
  return {
53
- integrationCatalog: async () => catalogSchema.parse(await send('codexhost/integrations/catalog', {})),
54
- listIntegrations: async input => snapshotSchema.parse(await send('codexhost/integrations/list', input)),
55
- saveMcp: input => send('codexhost/integrations/mcp/save', input),
56
- removeMcp: input => send('codexhost/integrations/mcp/remove', input),
57
- changeSkill: input => send('codexhost/integrations/skill/change', input),
53
+ integrationCatalog: async () => catalogSchema.parse(await send('harnessmix/integrations/catalog', {})),
54
+ listIntegrations: async input => snapshotSchema.parse(await send('harnessmix/integrations/list', input)),
55
+ saveMcp: input => send('harnessmix/integrations/mcp/save', input),
56
+ removeMcp: input => send('harnessmix/integrations/mcp/remove', input),
57
+ changeSkill: input => send('harnessmix/integrations/skill/change', input),
58
58
  };
59
59
  }
@@ -95,7 +95,7 @@ import {
95
95
  type UpdateCheckResult,
96
96
  type UpdateStartResult,
97
97
  type UpdateStatusResult,
98
- } from "@codexhost/shared-contracts";
98
+ } from "@harnessmix/shared-contracts";
99
99
 
100
100
  import {
101
101
  createRendererRequestSender,
@@ -110,39 +110,40 @@ import {
110
110
  type RendererPetsClient,
111
111
  } from "./settings/pets-client.js";
112
112
 
113
- export const HARNESS_INSPECT_METHOD = "codexhost/harness/inspect";
114
- export const HARNESS_INSTALL_METHOD = "codexhost/harness/install";
115
- export const HARNESS_PLUGIN_LIST_METHOD = "codexhost/harness/plugins/list";
116
- export const HARNESS_WEB_UI_OPEN_METHOD = "codexhost/harness/web-ui/open";
117
- export const THREAD_FORK_METHOD = "codexhost/thread/fork";
118
- export const THREAD_HARNESS_SWITCH_METHOD = "codexhost/thread/harness/switch";
119
- export const THREAD_INSPECT_METHOD = "codexhost/thread/inspect";
120
- export const HARNESS_COMMANDS_INSPECT_METHOD = "codexhost/harness/commands/inspect";
121
- export const THREAD_COMMANDS_INSPECT_METHOD = "codexhost/thread/commands/inspect";
122
- export const THREAD_COMMAND_EXECUTE_METHOD = "codexhost/thread/command/execute";
123
- export const THREAD_DELEGATE_METHOD = "codexhost/thread/delegate";
124
- export const THREAD_MESSAGE_METHOD = "codexhost/thread/message";
125
- export const THREAD_MODEL_SELECT_METHOD = "codexhost/thread/model/select";
126
- export const THREAD_THINKING_SELECT_METHOD = "codexhost/thread/thinking/select";
127
- export const THREAD_PERMISSION_MODE_SELECT_METHOD = "codexhost/thread/permission-mode/select";
128
- export const THREAD_OWNERSHIP_LIST_METHOD = "codexhost/thread/ownership/list";
129
- export const THREAD_USAGE_INSPECT_METHOD = "codexhost/thread/usage/inspect";
130
- export const THREAD_USAGE_UPDATED_METHOD = "codexhost/thread/usage/updated";
113
+ export const HARNESS_INSPECT_METHOD = "harnessmix/harness/inspect";
114
+ export const HARNESS_INSTALL_METHOD = "harnessmix/harness/install";
115
+ export const HARNESS_PLUGIN_LIST_METHOD = "harnessmix/harness/plugins/list";
116
+ export const HARNESS_WEB_UI_OPEN_METHOD = "harnessmix/harness/web-ui/open";
117
+ export const THREAD_FORK_METHOD = "harnessmix/thread/fork";
118
+ export const THREAD_HARNESS_SWITCH_METHOD = "harnessmix/thread/harness/switch";
119
+ export const THREAD_INSPECT_METHOD = "harnessmix/thread/inspect";
120
+ export const HARNESS_COMMANDS_INSPECT_METHOD = "harnessmix/harness/commands/inspect";
121
+ export const THREAD_COMMANDS_INSPECT_METHOD = "harnessmix/thread/commands/inspect";
122
+ export const THREAD_COMMAND_EXECUTE_METHOD = "harnessmix/thread/command/execute";
123
+ export const THREAD_DELEGATE_METHOD = "harnessmix/thread/delegate";
124
+ export const THREAD_MESSAGE_METHOD = "harnessmix/thread/message";
125
+ export const THREAD_MODEL_SELECT_METHOD = "harnessmix/thread/model/select";
126
+ export const THREAD_THINKING_SELECT_METHOD = "harnessmix/thread/thinking/select";
127
+ export const THREAD_PERMISSION_MODE_SELECT_METHOD = "harnessmix/thread/permission-mode/select";
128
+ export const THREAD_OWNERSHIP_LIST_METHOD = "harnessmix/thread/ownership/list";
129
+ export const THREAD_USAGE_INSPECT_METHOD = "harnessmix/thread/usage/inspect";
130
+ export const THREAD_TEAM_INSPECT_METHOD = "harnessmix/thread/team/inspect";
131
+ export const THREAD_USAGE_UPDATED_METHOD = "harnessmix/thread/usage/updated";
131
132
  export const THREAD_TOKEN_USAGE_UPDATED_METHOD = "thread/tokenUsage/updated";
132
- export const UPDATE_CHECK_METHOD = "codexhost/update/check";
133
- export const UPDATE_START_METHOD = "codexhost/update/start";
134
- export const UPDATE_STATUS_METHOD = "codexhost/update/status";
133
+ export const UPDATE_CHECK_METHOD = "harnessmix/update/check";
134
+ export const UPDATE_START_METHOD = "harnessmix/update/start";
135
+ export const UPDATE_STATUS_METHOD = "harnessmix/update/status";
135
136
  export const RUNTIME_VERSION_METHOD = "harness-mix/runtime/version";
136
- export const CODEX_ACCOUNT_LIST_METHOD = "codexhost/account/list";
137
- export const CODEX_ACCOUNT_REFRESH_METHOD = "codexhost/account/refresh";
138
- export const CODEX_ACCOUNT_CREATE_METHOD = "codexhost/account/create";
139
- export const CODEX_ACCOUNT_DELETE_METHOD = "codexhost/account/delete";
140
- export const CODEX_ACCOUNT_ACTIVATE_METHOD = "codexhost/account/activate";
141
- export const CODEX_ACCOUNT_LOGIN_START_METHOD = "codexhost/account/login/start";
142
- export const CODEX_ACCOUNT_LOGIN_CANCEL_METHOD = "codexhost/account/login/cancel";
143
- export const CODEX_ACCOUNT_LOGIN_COMPLETED_METHOD = "codexhost/account/login/completed";
137
+ export const CODEX_ACCOUNT_LIST_METHOD = "harnessmix/account/list";
138
+ export const CODEX_ACCOUNT_REFRESH_METHOD = "harnessmix/account/refresh";
139
+ export const CODEX_ACCOUNT_CREATE_METHOD = "harnessmix/account/create";
140
+ export const CODEX_ACCOUNT_DELETE_METHOD = "harnessmix/account/delete";
141
+ export const CODEX_ACCOUNT_ACTIVATE_METHOD = "harnessmix/account/activate";
142
+ export const CODEX_ACCOUNT_LOGIN_START_METHOD = "harnessmix/account/login/start";
143
+ export const CODEX_ACCOUNT_LOGIN_CANCEL_METHOD = "harnessmix/account/login/cancel";
144
+ export const CODEX_ACCOUNT_LOGIN_COMPLETED_METHOD = "harnessmix/account/login/completed";
144
145
  export const CODEX_ACCOUNT_RESET_CREDIT_CONSUME_METHOD =
145
- "codexhost/account/rate-limit-reset/consume";
146
+ "harnessmix/account/rate-limit-reset/consume";
146
147
 
147
148
  function isRecord(value: unknown): value is Record<string, unknown> {
148
149
  return typeof value === "object" && value !== null && !Array.isArray(value);
@@ -197,6 +198,7 @@ export interface RendererModelClient extends Partial<RendererSessionImportClient
197
198
  executeThreadCommand(input: ThreadCommandExecuteParams): Promise<ThreadCommandExecuteResult>;
198
199
  listThreadOwnership(input: ThreadOwnershipListParams): Promise<ThreadOwnershipListResult>;
199
200
  inspectThreadUsage(input: ThreadUsageInspectionParams): Promise<ThreadUsageInspection>;
201
+ inspectThreadTeam?(input: { threadId: string; teamId?: string }): Promise<unknown>;
200
202
  subscribeThreadUsage?(listener: (update: ThreadUsageInspection) => void): () => void;
201
203
  selectThreadModel(input: ThreadModelSelectParams): Promise<HarnessModelSelectionState>;
202
204
  selectThreadThinking(input: ThreadThinkingSelectParams): Promise<HarnessModelSelectionState>;
@@ -263,6 +265,20 @@ export function createThreadUsageSubscriptionRelay(): {
263
265
  };
264
266
  }
265
267
 
268
+ /** Mutations that may legitimately outlive the default request timeout
269
+ * (installs, forks, Harness handoffs, command execution, update downloads,
270
+ * interactive Account login) keep the previous unbounded wait. */
271
+ const REQUEST_TIMEOUT_EXEMPT_METHODS: ReadonlySet<string> = new Set([
272
+ HARNESS_INSTALL_METHOD,
273
+ THREAD_FORK_METHOD,
274
+ THREAD_HARNESS_SWITCH_METHOD,
275
+ THREAD_COMMAND_EXECUTE_METHOD,
276
+ THREAD_DELEGATE_METHOD,
277
+ THREAD_MESSAGE_METHOD,
278
+ UPDATE_START_METHOD,
279
+ CODEX_ACCOUNT_LOGIN_START_METHOD,
280
+ ]);
281
+
266
282
  export function createRendererModelClient(
267
283
  candidates: readonly RequestManagerCandidate[],
268
284
  ): RendererModelClient | null {
@@ -276,8 +292,9 @@ export function createRendererModelClient(
276
292
  const source = managers[0];
277
293
  if (managers.length !== 1 || !source) return null;
278
294
  const manager = {
279
- sendRequest: createRendererRequestSender((method, params) =>
280
- source.sendRequest(method, params),
295
+ sendRequest: createRendererRequestSender(
296
+ (method, params) => source.sendRequest(method, params),
297
+ { isTimeoutExempt: (method) => REQUEST_TIMEOUT_EXEMPT_METHODS.has(method) },
281
298
  ),
282
299
  };
283
300
 
@@ -337,10 +354,10 @@ export function createRendererModelClient(
337
354
  };
338
355
 
339
356
  return Object.freeze({
340
- async inspectStorage() { return await manager.sendRequest('codexhost/storage/inspect', {}) as import('./settings/storage-page.js').RendererStorageInspection; },
341
- async optimizeStorage() { return await manager.sendRequest('codexhost/storage/optimize', {}) as { before: import('./settings/storage-page.js').RendererStorageInspection; after: import('./settings/storage-page.js').RendererStorageInspection }; },
357
+ async inspectStorage() { return await manager.sendRequest('harnessmix/storage/inspect', {}) as import('./settings/storage-page.js').RendererStorageInspection; },
358
+ async optimizeStorage() { return await manager.sendRequest('harnessmix/storage/optimize', {}) as { before: import('./settings/storage-page.js').RendererStorageInspection; after: import('./settings/storage-page.js').RendererStorageInspection }; },
342
359
  async listCollaborationAgents(): Promise<Array<{ id: string; name: string; available: boolean; lead: boolean }>> {
343
- const result = await manager.sendRequest('codexhost/collaboration/agents', {});
360
+ const result = await manager.sendRequest('harnessmix/collaboration/agents', {});
344
361
  if (!Array.isArray(result) || !result.every(a => a && typeof a.id === 'string' && typeof a.name === 'string' && typeof a.available === 'boolean' && typeof a.lead === 'boolean')) throw new Error('Invalid collaboration catalog');
345
362
  return result;
346
363
  },
@@ -377,7 +394,7 @@ export function createRendererModelClient(
377
394
  return result as { success: boolean; command?: string; stdout?: string; stderr?: string; error?: string };
378
395
  },
379
396
  async loginHarnessAccount(input: { harnessId: string }): Promise<{ success: boolean; command?: string; error?: string }> {
380
- const result = await manager.sendRequest("codexhost/harness/account/login", input);
397
+ const result = await manager.sendRequest("harnessmix/harness/account/login", input);
381
398
  return result as { success: boolean; command?: string; error?: string };
382
399
  },
383
400
  async listHarnessPlugins(): Promise<HarnessPluginListResult> {
@@ -411,10 +428,10 @@ export function createRendererModelClient(
411
428
  thread.id !== params.threadId ||
412
429
  typeof thread.modelProvider !== "string" ||
413
430
  !thread.modelProvider ||
414
- thread.modelProvider === "codexhost" ||
431
+ thread.modelProvider === "harnessmix" ||
415
432
  typeof thread.cliVersion !== "string" ||
416
433
  !thread.cliVersion ||
417
- thread.cliVersion === "codexhost"
434
+ thread.cliVersion === "harnessmix"
418
435
  ) {
419
436
  throw new Error("Native Thread response cannot establish Codex ownership");
420
437
  }
@@ -440,6 +457,10 @@ export function createRendererModelClient(
440
457
  return result;
441
458
  },
442
459
  inspectThreadUsage,
460
+ async inspectThreadTeam(input: { threadId: string; teamId?: string }): Promise<unknown> {
461
+ const threadId = hostThreadIdSchema.parse(input.threadId);
462
+ return manager.sendRequest(THREAD_TEAM_INSPECT_METHOD, { threadId, ...(input.teamId ? { teamId: input.teamId } : {}) });
463
+ },
443
464
  subscribeThreadUsage(listener: (update: ThreadUsageInspection) => void): () => void {
444
465
  const notifications = notificationTarget(source);
445
466
  if (!notifications?.addNotificationCallback) {
@@ -503,7 +524,7 @@ export function createRendererModelClient(
503
524
  input: CodexAccountUsageParams,
504
525
  ): Promise<CodexAccountUsageResult> {
505
526
  const result = await manager.sendRequest(
506
- "codexhost/account/usage/inspect",
527
+ "harnessmix/account/usage/inspect",
507
528
  codexAccountUsageParamsSchema.parse(input),
508
529
  );
509
530
  return codexAccountUsageResultSchema.parse(result);
@@ -519,7 +540,7 @@ export function createRendererModelClient(
519
540
  },
520
541
  async listHarnessAccounts(): Promise<HarnessAccountListResult> {
521
542
  return harnessAccountListResultSchema.parse(
522
- await manager.sendRequest("codexhost/harness/accounts/list", {}),
543
+ await manager.sendRequest("harnessmix/harness/accounts/list", {}),
523
544
  );
524
545
  },
525
546
  async listCodexAccounts(): Promise<CodexAccountListResult> {
@@ -572,7 +593,7 @@ export function createRendererModelClient(
572
593
  return codexAccountLoginCancelResultSchema.parse(result);
573
594
  },
574
595
  async logoutCodexAccount(): Promise<CodexAccountMutationResult> {
575
- const result = await manager.sendRequest("codexhost/account/logout", {});
596
+ const result = await manager.sendRequest("harnessmix/account/logout", {});
576
597
  return codexAccountMutationResultSchema.parse(result);
577
598
  },
578
599
  subscribeCodexAccountLogin(listener: (result: CodexAccountLoginCompleted) => void): () => void {
@@ -4,7 +4,7 @@ import type {
4
4
  HarnessModelRef,
5
5
  HarnessThinkingOption,
6
6
  HarnessThinkingOptionId,
7
- } from "@codexhost/shared-contracts";
7
+ } from "@harnessmix/shared-contracts";
8
8
 
9
9
  import {
10
10
  rendererModelPickerMainMenuPlacement,
@@ -28,7 +28,7 @@ const OPTION_CLASSES =
28
28
 
29
29
  const HEADING_CLASSES = "px-2 pb-1 pt-1.5 text-sm text-token-text-tertiary";
30
30
  const MODEL_TRIGGER_MAX_WIDTH = "min(200px, 26vw)";
31
- const MODEL_SCROLLBAR_STYLE_ATTRIBUTE = "data-codexhost-model-picker-scrollbar";
31
+ const MODEL_SCROLLBAR_STYLE_ATTRIBUTE = "data-harnessmix-model-picker-scrollbar";
32
32
 
33
33
  export interface RendererModelControlView {
34
34
  status: "idle" | "waitingForAdapter" | "loading" | "ready" | "selecting" | "empty" | "error";
@@ -85,28 +85,28 @@ function ensureModelScrollbarStyle(ownerDocument: Document): void {
85
85
  const style = ownerDocument.createElement("style");
86
86
  style.setAttribute(MODEL_SCROLLBAR_STYLE_ATTRIBUTE, "true");
87
87
  style.textContent = `
88
- [data-codexhost-model-scrollable] {
88
+ [data-harnessmix-model-scrollable] {
89
89
  scrollbar-width: thin;
90
90
  scrollbar-color: rgba(255, 255, 255, 0.28) transparent;
91
91
  }
92
- [data-codexhost-model-scrollable]::-webkit-scrollbar {
92
+ [data-harnessmix-model-scrollable]::-webkit-scrollbar {
93
93
  width: 6px;
94
94
  height: 6px;
95
95
  }
96
- [data-codexhost-model-scrollable]::-webkit-scrollbar-track {
96
+ [data-harnessmix-model-scrollable]::-webkit-scrollbar-track {
97
97
  background: transparent;
98
98
  }
99
- [data-codexhost-model-scrollable]::-webkit-scrollbar-thumb {
99
+ [data-harnessmix-model-scrollable]::-webkit-scrollbar-thumb {
100
100
  min-height: 28px;
101
101
  border: 1px solid transparent;
102
102
  border-radius: 999px;
103
103
  background: rgba(255, 255, 255, 0.28);
104
104
  background-clip: padding-box;
105
105
  }
106
- [data-codexhost-model-scrollable]::-webkit-scrollbar-thumb:hover {
106
+ [data-harnessmix-model-scrollable]::-webkit-scrollbar-thumb:hover {
107
107
  background: rgba(255, 255, 255, 0.42);
108
108
  }
109
- [data-codexhost-model-scrollable]::-webkit-scrollbar-button {
109
+ [data-harnessmix-model-scrollable]::-webkit-scrollbar-button {
110
110
  display: none;
111
111
  width: 0;
112
112
  height: 0;
@@ -176,7 +176,7 @@ export function rendererModelPickerPresentation(
176
176
 
177
177
  function positionMenu(control: RendererModelPickerControl): void {
178
178
  const triggerRect = control.trigger.getBoundingClientRect();
179
- const thinkingColumn = control.menu.querySelector<HTMLElement>("[data-codexhost-thinking-column]");
179
+ const thinkingColumn = control.menu.querySelector<HTMLElement>("[data-harnessmix-thinking-column]");
180
180
  const twoColumn = control.thinkingExpanded && thinkingColumn !== null;
181
181
  if (thinkingColumn) thinkingColumn.style.display = twoColumn ? "flex" : "none";
182
182
  control.menu.dataset.twoColumn = String(twoColumn);
@@ -194,13 +194,13 @@ function positionMenu(control: RendererModelPickerControl): void {
194
194
  control.menu.style.bottom = `${placement.bottom}px`;
195
195
  // 列内部滚动:弹层本身不滚动,模型列表在给定最大高度内滚动
196
196
  const listMaxHeight = placement.maxHeight ?? 320;
197
- for (const column of control.menu.querySelectorAll<HTMLElement>("[data-codexhost-model-scrollable]")) {
197
+ for (const column of control.menu.querySelectorAll<HTMLElement>("[data-harnessmix-model-scrollable]")) {
198
198
  column.style.maxHeight = `${listMaxHeight}px`;
199
199
  }
200
200
  }
201
201
 
202
202
  export function syncRendererModelTriggerClass(control: RendererModelPickerControl): void {
203
- // Keep codexhost controls independent from Codex's private utility classes.
203
+ // Keep harnessmix controls independent from Codex's private utility classes.
204
204
  // Codex can rename or remove those between Desktop releases; our own
205
205
  // `TRIGGER_CHIP_CLASS` chrome (see renderer-trigger-chip-style.ts) does not.
206
206
  control.trigger.className = TRIGGER_CHIP_CLASS;
@@ -254,7 +254,7 @@ export function mountRendererModelPicker(
254
254
  ensureRendererTriggerChipStyle(document);
255
255
 
256
256
  const root = document.createElement("div");
257
- root.setAttribute("data-codexhost-model-control", composerId);
257
+ root.setAttribute("data-harnessmix-model-control", composerId);
258
258
  root.className = "relative min-w-0";
259
259
  root.style.display = "none";
260
260
 
@@ -322,7 +322,7 @@ export function mountRendererModelPicker(
322
322
  searchHeader.style.padding = "4px";
323
323
  searchHeader.style.backgroundColor = "Canvas";
324
324
  const searchEmpty = document.createElement("div");
325
- searchEmpty.dataset.codexhostModelSearchEmpty = "true";
325
+ searchEmpty.dataset.harnessmixModelSearchEmpty = "true";
326
326
  searchEmpty.textContent = "No matching models";
327
327
  searchEmpty.className = "block px-2 py-2 text-sm text-token-text-tertiary";
328
328
  searchEmpty.hidden = true;
@@ -495,7 +495,7 @@ function rebuildOptions(control: RendererModelPickerControl, view: RendererModel
495
495
  modelColumn.style.width = `${RENDERER_MODEL_PICKER_MAIN_MENU_WIDTH}px`;
496
496
  modelColumn.style.minWidth = "0";
497
497
  const modelList = document.createElement("div");
498
- modelList.setAttribute("data-codexhost-model-scrollable", "true");
498
+ modelList.setAttribute("data-harnessmix-model-scrollable", "true");
499
499
  modelList.style.overflowY = "auto";
500
500
  modelList.style.minHeight = "0";
501
501
  modelColumn.append(createHeading("Model"), control.searchHeader, control.searchEmpty, modelList);
@@ -530,7 +530,7 @@ function rebuildOptions(control: RendererModelPickerControl, view: RendererModel
530
530
  // 右列:当前选中模型适用的思考强度档位
531
531
  if (presentation.showThinkingSection) {
532
532
  const thinkingColumn = document.createElement("div");
533
- thinkingColumn.dataset.codexhostThinkingColumn = "true";
533
+ thinkingColumn.dataset.harnessmixThinkingColumn = "true";
534
534
  thinkingColumn.className = "flex min-w-0 flex-col";
535
535
  thinkingColumn.style.display = control.thinkingExpanded ? "flex" : "none";
536
536
  thinkingColumn.style.flexDirection = "column";
@@ -540,7 +540,7 @@ function rebuildOptions(control: RendererModelPickerControl, view: RendererModel
540
540
  thinkingColumn.style.paddingLeft = "4px";
541
541
  thinkingColumn.append(createHeading("Thinking"));
542
542
  const thinkingList = document.createElement("div");
543
- thinkingList.setAttribute("data-codexhost-model-scrollable", "true");
543
+ thinkingList.setAttribute("data-harnessmix-model-scrollable", "true");
544
544
  thinkingList.style.overflowY = "auto";
545
545
  thinkingList.style.minHeight = "0";
546
546
  for (const option of presentation.thinkingOptions) {
@@ -7,7 +7,7 @@ import {
7
7
  type HarnessPermissionModeCatalog,
8
8
  type HarnessPermissionModeId,
9
9
  type HarnessThinkingOptionId,
10
- } from "@codexhost/shared-contracts";
10
+ } from "@harnessmix/shared-contracts";
11
11
 
12
12
  import {
13
13
  KNOWN_RENDERER_AGENTS,
@@ -15,7 +15,7 @@ import {
15
15
  type RendererAgent,
16
16
  } from "./agent-selection-state.js";
17
17
 
18
- export const RENDERER_NEW_THREAD_PREFERENCE_KEY = "codexhost.new-thread-preference.v1";
18
+ export const RENDERER_NEW_THREAD_PREFERENCE_KEY = "harnessmix.new-thread-preference.v1";
19
19
 
20
20
  interface ExternalConfigurationPreference {
21
21
  model: HarnessModelRef;
@@ -2,7 +2,7 @@ import type {
2
2
  HarnessPermissionMode,
3
3
  HarnessPermissionModeCatalog,
4
4
  HarnessPermissionModeId,
5
- } from "@codexhost/shared-contracts";
5
+ } from "@harnessmix/shared-contracts";
6
6
  import type { IconNode } from "lucide";
7
7
  import createElement from "lucide/dist/esm/createElement.mjs";
8
8
  import Check from "lucide/dist/esm/icons/check.mjs";
@@ -129,7 +129,7 @@ function positionMenu(control: RendererPermissionModePickerControl): void {
129
129
  export function syncRendererPermissionModeTriggerClass(
130
130
  control: RendererPermissionModePickerControl,
131
131
  ): void {
132
- // Do not copy Codex's private Composer classes into codexhost controls.
132
+ // Do not copy Codex's private Composer classes into harnessmix controls.
133
133
  // Codex can rename or remove those between Desktop releases; our own
134
134
  // `TRIGGER_CHIP_CLASS` chrome (see renderer-trigger-chip-style.ts) does not.
135
135
  control.trigger.className = TRIGGER_CHIP_CLASS;
@@ -145,7 +145,7 @@ export function mountRendererPermissionModePicker(
145
145
  ensureRendererTriggerChipStyle(document);
146
146
 
147
147
  const root = document.createElement("div");
148
- root.setAttribute("data-codexhost-permission-mode-control", composerId);
148
+ root.setAttribute("data-harnessmix-permission-mode-control", composerId);
149
149
  root.className = "relative min-w-0";
150
150
  root.style.display = "none";
151
151
 
@@ -2,9 +2,9 @@ import {
2
2
  harnessPermissionModeIdSchema,
3
3
  type HarnessPermissionModeCatalog,
4
4
  type HarnessPermissionModeId,
5
- } from "@codexhost/shared-contracts";
5
+ } from "@harnessmix/shared-contracts";
6
6
 
7
- export const CLAUDE_PERMISSION_MODE_PREFERENCE_KEY = "codexhost.claude-code.permission-mode.v1";
7
+ export const CLAUDE_PERMISSION_MODE_PREFERENCE_KEY = "harnessmix.claude-code.permission-mode.v1";
8
8
 
9
9
  export interface PermissionModePreferenceStorage {
10
10
  getItem(key: string): string | null;
@@ -10,6 +10,28 @@ export class RendererMethodUnavailableError extends Error {
10
10
  }
11
11
  }
12
12
 
13
+ /** A Host call that never settled would otherwise leave picker spinners,
14
+ * ownership loads and sidebar icons pending forever. */
15
+ export class RendererRequestTimeoutError extends Error {
16
+ readonly code = -32098;
17
+
18
+ constructor(
19
+ readonly method: string,
20
+ readonly timeoutMs: number,
21
+ ) {
22
+ super(`${method} did not answer within ${timeoutMs} ms`, { cause: undefined });
23
+ this.name = "RendererRequestTimeoutError";
24
+ }
25
+ }
26
+
27
+ export const RENDERER_REQUEST_TIMEOUT_DEFAULT_MS = 20_000;
28
+
29
+ export interface RendererRequestSenderOptions {
30
+ timeoutMs?: number;
31
+ /** Long-running mutations (install, fork, harness switch, ...) opt out. */
32
+ isTimeoutExempt?(method: string): boolean;
33
+ }
34
+
13
35
  function isUnsupportedMethod(error: unknown, method: string): boolean {
14
36
  if (typeof error !== "object" || error === null) return false;
15
37
  const code = "code" in error ? error.code : undefined;
@@ -23,18 +45,39 @@ function isUnsupportedMethod(error: unknown, method: string): boolean {
23
45
  }
24
46
 
25
47
  /** One sender per request client. Only explicit method absence is remembered;
26
- * successes, params, Harness availability and transient failures are not cached. */
48
+ * successes, params, Harness availability and transient failures are not cached.
49
+ * Non-exempt calls carry a bounded timeout so a stale request bridge degrades
50
+ * into a retryable error instead of an infinite pending state. */
27
51
  export function createRendererRequestSender(
28
52
  send: (method: string, params: unknown) => Promise<unknown> | unknown,
53
+ options: RendererRequestSenderOptions = {},
29
54
  ): (method: string, params: unknown) => Promise<unknown> {
30
55
  const unsupported = new Map<string, RendererMethodUnavailableError>();
56
+ const timeoutMs = options.timeoutMs ?? RENDERER_REQUEST_TIMEOUT_DEFAULT_MS;
31
57
  return async (method, params) => {
32
58
  const known = unsupported.get(method);
33
59
  if (known) throw known;
34
60
  try {
35
- return await send(method, params);
61
+ // Invoke send synchronously: callers and tests observe the request as
62
+ // dispatched before the first await, exactly as without a timeout.
63
+ const attempt = Promise.resolve(send(method, params));
64
+ if (timeoutMs <= 0 || options.isTimeoutExempt?.(method)) return await attempt;
65
+ let timer: ReturnType<typeof setTimeout> | undefined;
66
+ try {
67
+ return await Promise.race([
68
+ attempt,
69
+ new Promise<never>((_resolve, reject) => {
70
+ timer = setTimeout(
71
+ () => reject(new RendererRequestTimeoutError(method, timeoutMs)),
72
+ timeoutMs,
73
+ );
74
+ }),
75
+ ]);
76
+ } finally {
77
+ if (timer !== undefined) clearTimeout(timer);
78
+ }
36
79
  } catch (error) {
37
- if (!method.startsWith("codexhost/") || !isUnsupportedMethod(error, method)) throw error;
80
+ if (!method.startsWith("harnessmix/") || !isUnsupportedMethod(error, method)) throw error;
38
81
  const unavailable = new RendererMethodUnavailableError(method, error);
39
82
  unsupported.set(method, unavailable);
40
83
  throw unavailable;
@@ -9,7 +9,7 @@ import {
9
9
  type HarnessSessionListResult,
10
10
  type HarnessSessionImportParams,
11
11
  type HarnessSessionImportResult,
12
- } from "@codexhost/shared-contracts";
12
+ } from "@harnessmix/shared-contracts";
13
13
 
14
14
  export interface RendererSessionImportClient {
15
15
  listSessionImportSources(): Promise<HarnessSessionImportSourcesResult>;
@@ -42,13 +42,13 @@ export function createRendererSessionImportClient(
42
42
  return {
43
43
  async listSessionImportSources() {
44
44
  return harnessSessionImportSourcesResultSchema.parse(
45
- await request("codexhost/harness/session-import/sources", {}),
45
+ await request("harnessmix/harness/session-import/sources", {}),
46
46
  );
47
47
  },
48
48
  async listHarnessSessions(input) {
49
49
  const params = harnessSessionListParamsSchema.parse(input);
50
50
  return harnessSessionListResultSchema.parse(
51
- await request("codexhost/harness/session-import/list", params),
51
+ await request("harnessmix/harness/session-import/list", params),
52
52
  );
53
53
  },
54
54
  async importHarnessSession(input) {
@@ -56,7 +56,7 @@ export function createRendererSessionImportClient(
56
56
  const key = JSON.stringify([params.harnessId, params.nativeSessionId]);
57
57
  const existing = pending.get(key);
58
58
  if (existing) return existing;
59
- const operation = request("codexhost/harness/session-import/import", params)
59
+ const operation = request("harnessmix/harness/session-import/import", params)
60
60
  .then((value) => harnessSessionImportResultSchema.parse(value))
61
61
  .finally(() => {
62
62
  if (pending.get(key) === operation) pending.delete(key);
@@ -2,7 +2,7 @@ import {
2
2
  THREAD_OWNERSHIP_LIST_MAX_LENGTH,
3
3
  hostThreadIdSchema,
4
4
  type ThreadOwnership,
5
- } from "@codexhost/shared-contracts";
5
+ } from "@harnessmix/shared-contracts";
6
6
 
7
7
  import type { RendererAgent } from "./agent-selection-state.js";
8
8
  import { createRendererAgentIcon, RENDERER_AGENT_LABELS } from "./renderer-agent-icon.js";
@@ -13,7 +13,7 @@ export const SIDEBAR_THREAD_ROW_ATTRIBUTE = "data-app-action-sidebar-thread-row"
13
13
  export const SIDEBAR_THREAD_ROW_SELECTOR = `[${SIDEBAR_THREAD_ROW_ATTRIBUTE}]`;
14
14
  export const SIDEBAR_THREAD_ID_ATTRIBUTE = "data-app-action-sidebar-thread-id";
15
15
  export const SIDEBAR_THREAD_HOST_ID_ATTRIBUTE = "data-app-action-sidebar-thread-host-id";
16
- export const SIDEBAR_AGENT_ICON_ATTRIBUTE = "data-codexhost-sidebar-agent-icon";
16
+ export const SIDEBAR_AGENT_ICON_ATTRIBUTE = "data-harnessmix-sidebar-agent-icon";
17
17
 
18
18
  export interface RendererSidebarContractInspection {
19
19
  rowCount: number;
@@ -58,28 +58,32 @@ export function threadIdFromSidebarRowElement(element: HTMLElement): string | nu
58
58
  const fiberNames = Object.getOwnPropertyNames(element).filter((name) =>
59
59
  name.startsWith("__reactFiber$"),
60
60
  );
61
- const fiberName = fiberNames[0];
62
- if (fiberNames.length !== 1 || !fiberName) return null;
63
- const firstFiber = Object.getOwnPropertyDescriptor(element, fiberName)?.value;
64
- if (!isRecord(firstFiber)) return null;
61
+ if (fiberNames.length === 0) return null;
65
62
 
63
+ // Desktop builds occasionally attach more than one Fiber root key to a row
64
+ // (transitions, nested roots). Walk each of them and stay fail-closed only
65
+ // when they genuinely disagree, instead of giving up on the row entirely.
66
66
  const candidates = new Set<string>();
67
- let fiber: Record<string, unknown> | null = firstFiber;
68
- for (let depth = 0; fiber && depth < 12; depth += 1) {
69
- const props = fiber.memoizedProps;
70
- if (isRecord(props) && isRecord(props.dataAttributes)) {
71
- const dataAttributes = props.dataAttributes;
72
- const threadId = hostThreadIdSchema.safeParse(props.conversationId);
73
- if (
74
- threadId.success &&
75
- dataAttributes[SIDEBAR_THREAD_ROW_ATTRIBUTE] === rowMarker &&
76
- dataAttributes[SIDEBAR_THREAD_ID_ATTRIBUTE] === taskKey &&
77
- dataAttributes[SIDEBAR_THREAD_HOST_ID_ATTRIBUTE] === hostId
78
- ) {
79
- candidates.add(threadId.data);
67
+ for (const fiberName of fiberNames) {
68
+ const firstFiber = Object.getOwnPropertyDescriptor(element, fiberName)?.value;
69
+ if (!isRecord(firstFiber)) continue;
70
+ let fiber: Record<string, unknown> | null = firstFiber;
71
+ for (let depth = 0; fiber && depth < 16; depth += 1) {
72
+ const props = fiber.memoizedProps;
73
+ if (isRecord(props) && isRecord(props.dataAttributes)) {
74
+ const dataAttributes = props.dataAttributes;
75
+ const threadId = hostThreadIdSchema.safeParse(props.conversationId);
76
+ if (
77
+ threadId.success &&
78
+ dataAttributes[SIDEBAR_THREAD_ROW_ATTRIBUTE] === rowMarker &&
79
+ dataAttributes[SIDEBAR_THREAD_ID_ATTRIBUTE] === taskKey &&
80
+ dataAttributes[SIDEBAR_THREAD_HOST_ID_ATTRIBUTE] === hostId
81
+ ) {
82
+ candidates.add(threadId.data);
83
+ }
80
84
  }
85
+ fiber = isRecord(fiber.return) ? fiber.return : null;
81
86
  }
82
- fiber = isRecord(fiber.return) ? fiber.return : null;
83
87
  }
84
88
  return candidates.size === 1 ? (candidates.values().next().value ?? null) : null;
85
89
  }