@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
@@ -24,6 +24,9 @@ const COPY = {
24
24
  installedBadge: "Installed",
25
25
  uninstall: "Uninstall",
26
26
  uninstalling: "Removing...",
27
+ retry: "Retry",
28
+ installFailed: "Install failed",
29
+ uninstallFailed: "Uninstall failed",
27
30
  tip: "Select in Appearance > Pets or type /pet to wake",
28
31
  empty: "No pets match the current filter.",
29
32
  officialBadge: "Official",
@@ -46,6 +49,9 @@ const COPY = {
46
49
  installedBadge: "已安装",
47
50
  uninstall: "卸载",
48
51
  uninstalling: "卸载中...",
52
+ retry: "重试",
53
+ installFailed: "安装失败",
54
+ uninstallFailed: "卸载失败",
49
55
  tip: "安装后在官方设置「外观 > 桌宠」或输入 /pet 指令唤醒伴侣",
50
56
  empty: "没有找到符合条件的桌宠。",
51
57
  officialBadge: "官方预载",
@@ -54,6 +60,10 @@ const COPY = {
54
60
  } as const;
55
61
 
56
62
  type PetTab = "all" | "official" | "community" | "installed";
63
+ type PetOperation = "install" | "uninstall";
64
+ type PetOperationState =
65
+ | { readonly status: "installing" | "uninstalling" }
66
+ | { readonly status: "failed"; readonly op: PetOperation; readonly error: string };
57
67
 
58
68
  const SPRITE_COLUMNS = 8;
59
69
  const SPRITE_FRAMES = 6;
@@ -71,6 +81,7 @@ function setupSpriteAnimation(
71
81
 
72
82
  let currentFrame = 0;
73
83
  let timer: number | null = null;
84
+ let idleTimeout: number | null = null;
74
85
  let isHovered = false;
75
86
 
76
87
  const tick = () => {
@@ -115,13 +126,21 @@ function setupSpriteAnimation(
115
126
  const idleInterval = window.setInterval(() => {
116
127
  if (!isHovered && timer === null) {
117
128
  startLoop();
118
- setTimeout(stopLoop, FRAME_DURATION_MS * SPRITE_FRAMES);
129
+ if (idleTimeout !== null) window.clearTimeout(idleTimeout);
130
+ idleTimeout = window.setTimeout(() => {
131
+ idleTimeout = null;
132
+ stopLoop();
133
+ }, FRAME_DURATION_MS * SPRITE_FRAMES);
119
134
  }
120
135
  }, 4000 + Math.random() * 3000);
121
136
 
122
137
  return () => {
123
138
  stopLoop();
124
139
  clearInterval(idleInterval);
140
+ if (idleTimeout !== null) {
141
+ window.clearTimeout(idleTimeout);
142
+ idleTimeout = null;
143
+ }
125
144
  if (parentCard) {
126
145
  parentCard.removeEventListener("mouseenter", onMouseEnter);
127
146
  parentCard.removeEventListener("mouseleave", onMouseLeave);
@@ -199,8 +218,52 @@ export function createPetSettingsPage(
199
218
 
200
219
  let allPets: RendererPetItem[] = [];
201
220
  const imageCache = new Map<string, string>(); // id -> dataUrl / url
221
+ // 每个 pet 的操作状态机:installing / uninstalling / failed(含错误与失败操作类型)
222
+ const petStates = new Map<string, PetOperationState>();
223
+ // 渲染世代:重渲染后让在途的 preview 回调失效,避免给已分离的 DOM 节点挂动画
224
+ let renderEpoch = 0;
225
+
226
+ const runPetOperation = (pet: RendererPetItem, op: PetOperation) => {
227
+ const client = getClient();
228
+ const current = petStates.get(pet.id);
229
+ // 操作进行中禁止重复触发;failed 状态允许重试
230
+ if (!client || (current && current.status !== "failed")) return;
231
+ petStates.set(pet.id, {
232
+ status: op === "install" ? "installing" : "uninstalling",
233
+ });
234
+ renderGrid();
235
+ const settle = (installed: boolean, failure: string | null) => {
236
+ if (failure === null) {
237
+ petStates.delete(pet.id);
238
+ } else {
239
+ petStates.set(pet.id, { status: "failed", op, error: failure });
240
+ }
241
+ allPets = allPets.map((p) =>
242
+ p.id === pet.id ? { ...p, installed } : p,
243
+ );
244
+ renderGrid();
245
+ };
246
+ const onSuccess = () => settle(op === "install", null);
247
+ const onFailure = (err: unknown) =>
248
+ settle(pet.installed, err instanceof Error ? err.message : String(err));
249
+ if (op === "install") {
250
+ void client
251
+ .install({
252
+ id: pet.id,
253
+ displayName: pet.displayName,
254
+ description: pet.description,
255
+ spritesheetUrl: pet.spritesheetUrl,
256
+ spriteVersionNumber: pet.spriteVersionNumber,
257
+ })
258
+ .then(onSuccess, onFailure);
259
+ } else {
260
+ void client.uninstall(pet.id).then(onSuccess, onFailure);
261
+ }
262
+ };
202
263
 
203
264
  const renderGrid = () => {
265
+ renderEpoch += 1;
266
+ const epoch = renderEpoch;
204
267
  // Clear previous animations
205
268
  for (const d of disposers) d();
206
269
  disposers.length = 0;
@@ -229,10 +292,12 @@ export function createPetSettingsPage(
229
292
  }
230
293
 
231
294
  for (const pet of filtered) {
295
+ const opState = petStates.get(pet.id);
232
296
  const card = document.createElement("article");
233
297
  card.className = "pet-card";
234
298
  card.dataset.petId = pet.id;
235
299
  card.dataset.installed = String(pet.installed);
300
+ if (opState) card.dataset.state = opState.status;
236
301
 
237
302
  // Stage
238
303
  const stage = document.createElement("div");
@@ -242,49 +307,6 @@ export function createPetSettingsPage(
242
307
  sprite.className = "pet-card__sprite";
243
308
  stage.append(sprite);
244
309
 
245
- // Load visual asset
246
- const client = getClient();
247
- const cachedImg = imageCache.get(pet.id);
248
- if (cachedImg) {
249
- const disposeAnim = setupSpriteAnimation(sprite, cachedImg, pet.spriteVersionNumber);
250
- disposers.push(disposeAnim);
251
- } else if (pet.spritesheetUrl) {
252
- imageCache.set(pet.id, pet.spritesheetUrl);
253
- const disposeAnim = setupSpriteAnimation(
254
- sprite,
255
- pet.spritesheetUrl,
256
- pet.spriteVersionNumber,
257
- );
258
- disposers.push(disposeAnim);
259
- } else if (client) {
260
- // Load base64 preview on demand
261
- void client.preview(pet.id).then(
262
- (res) => {
263
- if (res && res.dataBase64) {
264
- const dataUrl = `data:${res.mime};base64,${res.dataBase64}`;
265
- imageCache.set(pet.id, dataUrl);
266
- const disposeAnim = setupSpriteAnimation(
267
- sprite,
268
- dataUrl,
269
- pet.spriteVersionNumber,
270
- );
271
- disposers.push(disposeAnim);
272
- }
273
- },
274
- () => {
275
- if (pet.previewUrl) {
276
- sprite.style.backgroundImage = `url("${pet.previewUrl}")`;
277
- sprite.style.backgroundSize = "contain";
278
- sprite.style.backgroundPosition = "center";
279
- }
280
- },
281
- );
282
- } else if (pet.previewUrl) {
283
- sprite.style.backgroundImage = `url("${pet.previewUrl}")`;
284
- sprite.style.backgroundSize = "contain";
285
- sprite.style.backgroundPosition = "center";
286
- }
287
-
288
310
  // Body
289
311
  const body = document.createElement("div");
290
312
  body.className = "pet-card__body";
@@ -299,7 +321,13 @@ export function createPetSettingsPage(
299
321
  const badges = document.createElement("div");
300
322
  badges.className = "pet-card__badges";
301
323
 
302
- if (pet.installed) {
324
+ if (opState?.status === "failed") {
325
+ const b = document.createElement("span");
326
+ b.className = "pet-card__badge pet-card__badge--failed";
327
+ b.textContent =
328
+ opState.op === "install" ? copy.installFailed : copy.uninstallFailed;
329
+ badges.append(b);
330
+ } else if (pet.installed) {
303
331
  const b = document.createElement("span");
304
332
  b.className = "pet-card__badge pet-card__badge--installed";
305
333
  b.append(createRendererSettingsIcon("check", 12), copy.installedBadge);
@@ -333,68 +361,110 @@ export function createPetSettingsPage(
333
361
  const actions = document.createElement("div");
334
362
  actions.className = "pet-card__actions";
335
363
 
336
- if (pet.installed) {
364
+ if (opState?.status === "installing" || opState?.status === "uninstalling") {
365
+ // 操作进行中:按钮禁用,防止重复点击(runPetOperation 内还有 petStates 防重入)
366
+ const busyBtn = document.createElement("button");
367
+ busyBtn.type = "button";
368
+ busyBtn.className =
369
+ opState.status === "installing"
370
+ ? "pet-btn pet-btn--primary"
371
+ : "pet-btn pet-btn--danger";
372
+ busyBtn.disabled = true;
373
+ busyBtn.textContent =
374
+ opState.status === "installing" ? copy.installing : copy.uninstalling;
375
+ actions.append(busyBtn);
376
+ } else if (opState?.status === "failed") {
377
+ // 失败后错误显示在卡片内,重试按钮恢复对应操作
378
+ const retryBtn = document.createElement("button");
379
+ retryBtn.type = "button";
380
+ retryBtn.className =
381
+ opState.op === "install"
382
+ ? "pet-btn pet-btn--primary"
383
+ : "pet-btn pet-btn--danger";
384
+ retryBtn.textContent = copy.retry;
385
+ retryBtn.addEventListener("click", () => runPetOperation(pet, opState.op));
386
+ actions.append(retryBtn);
387
+ } else if (pet.installed) {
337
388
  const uninstallBtn = document.createElement("button");
338
389
  uninstallBtn.type = "button";
339
390
  uninstallBtn.className = "pet-btn pet-btn--danger";
340
391
  uninstallBtn.textContent = copy.uninstall;
341
- uninstallBtn.addEventListener("click", () => {
342
- if (!client) return;
343
- uninstallBtn.disabled = true;
344
- uninstallBtn.textContent = copy.uninstalling;
345
- void client.uninstall(pet.id).then(
346
- () => {
347
- allPets = allPets.map((p) =>
348
- p.id === pet.id ? { ...p, installed: false } : p,
349
- );
350
- renderGrid();
351
- },
352
- (err) => {
353
- uninstallBtn.disabled = false;
354
- uninstallBtn.textContent = copy.uninstall;
355
- alert(err instanceof Error ? err.message : String(err));
356
- },
357
- );
358
- });
392
+ uninstallBtn.addEventListener("click", () =>
393
+ runPetOperation(pet, "uninstall"),
394
+ );
359
395
  actions.append(uninstallBtn);
360
396
  } else {
361
397
  const installBtn = document.createElement("button");
362
398
  installBtn.type = "button";
363
399
  installBtn.className = "pet-btn pet-btn--primary";
364
400
  installBtn.textContent = copy.install;
365
- installBtn.addEventListener("click", () => {
366
- if (!client) return;
367
- installBtn.disabled = true;
368
- installBtn.textContent = copy.installing;
369
- void client
370
- .install({
371
- id: pet.id,
372
- displayName: pet.displayName,
373
- description: pet.description,
374
- spritesheetUrl: pet.spritesheetUrl,
375
- spriteVersionNumber: pet.spriteVersionNumber,
376
- })
377
- .then(
378
- () => {
379
- allPets = allPets.map((p) =>
380
- p.id === pet.id ? { ...p, installed: true } : p,
381
- );
382
- renderGrid();
383
- },
384
- (err) => {
385
- installBtn.disabled = false;
386
- installBtn.textContent = copy.install;
387
- alert(err instanceof Error ? err.message : String(err));
388
- },
389
- );
390
- });
401
+ installBtn.addEventListener("click", () =>
402
+ runPetOperation(pet, "install"),
403
+ );
391
404
  actions.append(installBtn);
392
405
  }
393
406
 
394
407
  footer.append(hint, actions);
395
- body.append(cardHeader, desc, footer);
408
+
409
+ // 操作状态/错误显示在卡片内(而非全局弹窗)
410
+ if (opState?.status === "failed") {
411
+ const errorBox = document.createElement("div");
412
+ errorBox.className = "pet-card__error";
413
+ errorBox.textContent = opState.error;
414
+ body.append(cardHeader, desc, errorBox, footer);
415
+ } else if (opState) {
416
+ const statusLine = document.createElement("div");
417
+ statusLine.className = "pet-card__status";
418
+ statusLine.textContent =
419
+ opState.status === "installing" ? copy.installing : copy.uninstalling;
420
+ body.append(cardHeader, desc, statusLine, footer);
421
+ } else {
422
+ body.append(cardHeader, desc, footer);
423
+ }
396
424
  card.append(stage, body);
397
425
  grid.append(card);
426
+
427
+ // Load visual asset(必须在 card 挂载后进行,setupSpriteAnimation 依赖 closest('.pet-card'))
428
+ const cachedImg = imageCache.get(pet.id);
429
+ if (cachedImg) {
430
+ disposers.push(
431
+ setupSpriteAnimation(sprite, cachedImg, pet.spriteVersionNumber),
432
+ );
433
+ } else if (pet.spritesheetUrl) {
434
+ imageCache.set(pet.id, pet.spritesheetUrl);
435
+ disposers.push(
436
+ setupSpriteAnimation(sprite, pet.spritesheetUrl, pet.spriteVersionNumber),
437
+ );
438
+ } else {
439
+ const showStaticPreview = () => {
440
+ if (!pet.previewUrl) return;
441
+ sprite.style.backgroundImage = `url("${pet.previewUrl}")`;
442
+ sprite.style.backgroundSize = "contain";
443
+ sprite.style.backgroundPosition = "center";
444
+ };
445
+ const client = getClient();
446
+ if (client) {
447
+ // Load base64 preview on demand;重渲染/卸载后丢弃过期回调,避免泄漏动画定时器
448
+ void client.preview(pet.id).then(
449
+ (res) => {
450
+ if (epoch !== renderEpoch || !sprite.isConnected) return;
451
+ if (res && res.dataBase64) {
452
+ const dataUrl = `data:${res.mime};base64,${res.dataBase64}`;
453
+ imageCache.set(pet.id, dataUrl);
454
+ disposers.push(
455
+ setupSpriteAnimation(sprite, dataUrl, pet.spriteVersionNumber),
456
+ );
457
+ }
458
+ },
459
+ () => {
460
+ if (epoch !== renderEpoch || !sprite.isConnected) return;
461
+ showStaticPreview();
462
+ },
463
+ );
464
+ } else {
465
+ showStaticPreview();
466
+ }
467
+ }
398
468
  }
399
469
  };
400
470
 
@@ -439,8 +509,20 @@ export function createPetSettingsPage(
439
509
  }
440
510
 
441
511
  return () => {
512
+ renderEpoch += 1; // 使在途 preview 回调失效
442
513
  for (const d of disposers) d();
443
514
  disposers.length = 0;
515
+ // 释放图片缓存(blob: URL 需要显式 revoke;data: URL 仅释放引用)
516
+ for (const url of imageCache.values()) {
517
+ if (url.startsWith("blob:")) {
518
+ try {
519
+ URL.revokeObjectURL(url);
520
+ } catch {
521
+ /* 忽略撤销失败 */
522
+ }
523
+ }
524
+ }
525
+ imageCache.clear();
444
526
  };
445
527
  },
446
528
  });
@@ -61,14 +61,14 @@ export function createRendererPetsClient(
61
61
  send: (method: string, params: unknown) => Promise<unknown>,
62
62
  ): RendererPetsClient {
63
63
  return {
64
- catalog: async () => (await send("codexhost/pets/catalog", {})) as RendererPetCatalogResult,
64
+ catalog: async () => (await send("harnessmix/pets/catalog", {})) as RendererPetCatalogResult,
65
65
  community: async (query = {}) =>
66
- (await send("codexhost/pets/community", query)) as RendererPetCommunityResult,
66
+ (await send("harnessmix/pets/community", query)) as RendererPetCommunityResult,
67
67
  preview: async (id: string) =>
68
- (await send("codexhost/pets/preview", { id })) as RendererPetPreviewResult,
68
+ (await send("harnessmix/pets/preview", { id })) as RendererPetPreviewResult,
69
69
  install: async (params: RendererPetInstallParams) =>
70
- (await send("codexhost/pets/install", params)) as RendererPetInstallResult,
70
+ (await send("harnessmix/pets/install", params)) as RendererPetInstallResult,
71
71
  uninstall: async (id: string) =>
72
- (await send("codexhost/pets/uninstall", { id })) as { id: string; removed: boolean },
72
+ (await send("harnessmix/pets/uninstall", { id })) as { id: string; removed: boolean },
73
73
  };
74
74
  }
@@ -214,7 +214,7 @@ function appendInline(document: ReleaseNotesDocument, parent: HTMLElement, text:
214
214
 
215
215
  function isSafeLink(href: string): boolean {
216
216
  try {
217
- const url = new URL(href, "https://codexhost.invalid");
217
+ const url = new URL(href, "https://harnessmix.invalid");
218
218
  return url.protocol === "http:" || url.protocol === "https:";
219
219
  } catch {
220
220
  return false;
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  HARNESS_SESSION_IMPORT_DEFAULT_PAGE_SIZE,
3
3
  type HarnessSessionListParams,
4
- } from "@codexhost/shared-contracts";
4
+ } from "@harnessmix/shared-contracts";
5
5
  import type { RendererSettingsMessages } from "./localization.js";
6
6
 
7
7
  /** Search submission and pagination state; native discovery and import are owned elsewhere. */
@@ -3,7 +3,7 @@ import type {
3
3
  HarnessSessionImportCandidate,
4
4
  HarnessSessionImportSourcesResult,
5
5
  HostThreadId,
6
- } from "@codexhost/shared-contracts";
6
+ } from "@harnessmix/shared-contracts";
7
7
 
8
8
  import {
9
9
  RendererSessionImportUnavailableError,
@@ -67,7 +67,7 @@ button {
67
67
  border: 0;
68
68
  }
69
69
 
70
- .codexhost-settings-dialog {
70
+ .harnessmix-settings-dialog {
71
71
  width: min(1120px, calc(100vw - 48px));
72
72
  height: min(780px, calc(100vh - 88px));
73
73
  max-width: none;
@@ -84,7 +84,7 @@ button {
84
84
  box-shadow: light-dark(0 16px 42px rgb(0 0 0 / 16%), 0 20px 54px rgb(0 0 0 / 42%));
85
85
  }
86
86
 
87
- .codexhost-settings-dialog::backdrop {
87
+ .harnessmix-settings-dialog::backdrop {
88
88
  background: light-dark(rgb(0 0 0 / 24%), rgb(0 0 0 / 56%));
89
89
  backdrop-filter: blur(1px);
90
90
  }
@@ -155,7 +155,7 @@ button {
155
155
  color: var(--settings-text);
156
156
  }
157
157
 
158
- .settings-brand__mark .codexhost-settings-icon {
158
+ .settings-brand__mark .harnessmix-settings-icon {
159
159
  width: 24px;
160
160
  height: 24px;
161
161
  object-fit: contain;
@@ -231,7 +231,7 @@ button {
231
231
  cursor: pointer;
232
232
  }
233
233
 
234
- .settings-nav-button .codexhost-settings-icon {
234
+ .settings-nav-button .harnessmix-settings-icon {
235
235
  width: 16px;
236
236
  height: 16px;
237
237
  opacity: 0.9;
@@ -260,7 +260,7 @@ button {
260
260
  text-decoration: none;
261
261
  }
262
262
 
263
- .settings-nav-star-link .codexhost-settings-icon {
263
+ .settings-nav-star-link .harnessmix-settings-icon {
264
264
  color: var(--settings-warning);
265
265
  }
266
266
 
@@ -1546,23 +1546,23 @@ button {
1546
1546
  gap: 8px;
1547
1547
  }
1548
1548
 
1549
- .settings-update-panel__head .codexhost-settings-icon {
1549
+ .settings-update-panel__head .harnessmix-settings-icon {
1550
1550
  color: var(--settings-muted);
1551
1551
  }
1552
1552
 
1553
- .settings-update-panel[data-update-state="available"] .codexhost-settings-icon,
1554
- .settings-update-panel[data-update-state="downloading"] .codexhost-settings-icon,
1555
- .settings-update-panel[data-update-state="installing"] .codexhost-settings-icon,
1556
- .settings-update-panel[data-update-state="restarting"] .codexhost-settings-icon {
1553
+ .settings-update-panel[data-update-state="available"] .harnessmix-settings-icon,
1554
+ .settings-update-panel[data-update-state="downloading"] .harnessmix-settings-icon,
1555
+ .settings-update-panel[data-update-state="installing"] .harnessmix-settings-icon,
1556
+ .settings-update-panel[data-update-state="restarting"] .harnessmix-settings-icon {
1557
1557
  color: var(--settings-focus);
1558
1558
  }
1559
1559
 
1560
- .settings-update-panel[data-update-state="current"] .codexhost-settings-icon {
1560
+ .settings-update-panel[data-update-state="current"] .harnessmix-settings-icon {
1561
1561
  color: var(--settings-success);
1562
1562
  }
1563
1563
 
1564
- .settings-update-panel[data-update-state="failed"] .codexhost-settings-icon,
1565
- .settings-update-panel[data-update-state="error"] .codexhost-settings-icon {
1564
+ .settings-update-panel[data-update-state="failed"] .harnessmix-settings-icon,
1565
+ .settings-update-panel[data-update-state="error"] .harnessmix-settings-icon {
1566
1566
  color: var(--settings-danger);
1567
1567
  }
1568
1568
 
@@ -1914,14 +1914,14 @@ button {
1914
1914
  outline-offset: 2px;
1915
1915
  }
1916
1916
 
1917
- .codexhost-settings-icon {
1917
+ .harnessmix-settings-icon {
1918
1918
  display: block;
1919
1919
  flex: none;
1920
1920
  stroke: currentColor;
1921
1921
  }
1922
1922
 
1923
1923
  @media (max-width: 720px) {
1924
- .codexhost-settings-dialog {
1924
+ .harnessmix-settings-dialog {
1925
1925
  width: calc(100vw - 16px);
1926
1926
  height: calc(100vh - 16px);
1927
1927
  border-radius: 10px;
@@ -14,9 +14,9 @@ import {
14
14
  DEFAULT_RENDERER_SETTINGS_MESSAGES,
15
15
  type RendererSettingsMessages,
16
16
  } from "./localization.js";
17
- import { CODEXHOST_GITHUB_REPOSITORY_URL, createDefaultRendererSettingsRegistry } from "./pages.js";
17
+ import { HARNESSMIX_GITHUB_REPOSITORY_URL, createDefaultRendererSettingsRegistry } from "./pages.js";
18
18
 
19
- export const SETTINGS_SHELL_ATTRIBUTE = "data-codexhost-settings-shell";
19
+ export const SETTINGS_SHELL_ATTRIBUTE = "data-harnessmix-settings-shell";
20
20
  export const RENDERER_SETTINGS_COLOR_SCHEME = "inherit";
21
21
 
22
22
  export interface RendererSettingsShell {
@@ -33,7 +33,7 @@ export interface RendererSettingsShell {
33
33
 
34
34
  declare global {
35
35
  interface Window {
36
- __codexhostSettingsShellV1?: RendererSettingsShell;
36
+ __harnessmixSettingsShellV1?: RendererSettingsShell;
37
37
  }
38
38
  }
39
39
 
@@ -61,7 +61,7 @@ export function mountRendererSettingsShell(
61
61
  const resolvedRegistry = registry ?? createDefaultRendererSettingsRegistry(messages);
62
62
  if (!ownerDocument.body) throw new Error("Renderer document body is unavailable");
63
63
  if (ownerDocument.querySelector(`[${SETTINGS_SHELL_ATTRIBUTE}]`)) {
64
- throw new Error("A codexhost settings shell is already mounted");
64
+ throw new Error("A harnessmix settings shell is already mounted");
65
65
  }
66
66
 
67
67
  const root = ownerDocument.createElement("div");
@@ -73,7 +73,7 @@ export function mountRendererSettingsShell(
73
73
  style.textContent = `${settingsCss}\n${accountsCss}\n${skinMarketCss}\n${petMarketCss}`;
74
74
 
75
75
  const dialog = ownerDocument.createElement("dialog");
76
- dialog.className = "codexhost-settings-dialog";
76
+ dialog.className = "harnessmix-settings-dialog";
77
77
  const frame = ownerDocument.createElement("div");
78
78
  frame.className = "settings-frame";
79
79
 
@@ -91,7 +91,7 @@ export function mountRendererSettingsShell(
91
91
  brandName.textContent = "Harness Mix";
92
92
  const brandTitle = ownerDocument.createElement("span");
93
93
  brandTitle.className = "settings-brand__title";
94
- brandTitle.id = "codexhost-settings-dialog-title";
94
+ brandTitle.id = "harnessmix-settings-dialog-title";
95
95
  brandTitle.textContent = messages.title;
96
96
  brandCopy.append(brandName, brandTitle);
97
97
  brand.append(brandMark, brandCopy);
@@ -205,7 +205,7 @@ export function mountRendererSettingsShell(
205
205
  }
206
206
  const starLink = ownerDocument.createElement("a");
207
207
  starLink.className = "settings-nav-button settings-nav-star-link";
208
- starLink.href = CODEXHOST_GITHUB_REPOSITORY_URL;
208
+ starLink.href = HARNESSMIX_GITHUB_REPOSITORY_URL;
209
209
  starLink.target = "_blank";
210
210
  starLink.rel = "noopener noreferrer";
211
211
  starLink.setAttribute("aria-label", messages.starOnGitHub);
@@ -314,17 +314,17 @@ export function installRendererSettingsShell(
314
314
  : createDefaultRendererSettingsRegistry(messages);
315
315
  const ownerWindow = ownerDocument.defaultView ?? (typeof window !== "undefined" ? window : undefined);
316
316
  if (ownerWindow) {
317
- ownerWindow.__codexhostSettingsShellV1?.dispose();
317
+ ownerWindow.__harnessmixSettingsShellV1?.dispose();
318
318
  }
319
319
  const shell = mountRendererSettingsShell(registry, ownerDocument, messages);
320
320
  if (ownerWindow) {
321
- ownerWindow.__codexhostSettingsShellV1 = shell;
321
+ ownerWindow.__harnessmixSettingsShellV1 = shell;
322
322
  }
323
323
  const dispose = shell.dispose.bind(shell);
324
324
  shell.dispose = () => {
325
325
  dispose();
326
- if (ownerWindow && ownerWindow.__codexhostSettingsShellV1 === shell) {
327
- delete ownerWindow.__codexhostSettingsShellV1;
326
+ if (ownerWindow && ownerWindow.__harnessmixSettingsShellV1 === shell) {
327
+ delete ownerWindow.__harnessmixSettingsShellV1;
328
328
  }
329
329
  };
330
330
  return shell;
@@ -469,12 +469,12 @@ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-page-header] > [da
469
469
  font-size: inherit !important;
470
470
  font-weight: inherit !important;
471
471
  }
472
- html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] header button:not([data-codexhost-settings-trigger] *),
473
- html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-pip-obstacle="app-shell-header"] button:not([data-codexhost-settings-trigger] *),
474
- html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-obstacle] button:not([data-codexhost-settings-trigger] *),
475
- html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-testid="app-shell-header-context-menu-surface"] button:not([data-codexhost-settings-trigger] *),
476
- html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-toolbar] button:not([data-codexhost-settings-trigger] *),
477
- html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] header [role="button"]:not([data-codexhost-settings-trigger] *) {
472
+ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] header button:not([data-harnessmix-settings-trigger] *),
473
+ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-pip-obstacle="app-shell-header"] button:not([data-harnessmix-settings-trigger] *),
474
+ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-obstacle] button:not([data-harnessmix-settings-trigger] *),
475
+ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-testid="app-shell-header-context-menu-surface"] button:not([data-harnessmix-settings-trigger] *),
476
+ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-toolbar] button:not([data-harnessmix-settings-trigger] *),
477
+ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] header [role="button"]:not([data-harnessmix-settings-trigger] *) {
478
478
  background: transparent !important;
479
479
  background-color: transparent !important;
480
480
  border-color: transparent !important;
@@ -489,11 +489,11 @@ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-page-header] > [da
489
489
  filter: none !important;
490
490
  outline: none !important;
491
491
  }
492
- html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] header button:not([data-codexhost-settings-trigger] *):hover,
493
- html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-pip-obstacle="app-shell-header"] button:not([data-codexhost-settings-trigger] *):hover,
494
- html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-obstacle] button:not([data-codexhost-settings-trigger] *):hover,
495
- html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-testid="app-shell-header-context-menu-surface"] button:not([data-codexhost-settings-trigger] *):hover,
496
- html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-toolbar] button:not([data-codexhost-settings-trigger] *):hover {
492
+ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] header button:not([data-harnessmix-settings-trigger] *):hover,
493
+ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-pip-obstacle="app-shell-header"] button:not([data-harnessmix-settings-trigger] *):hover,
494
+ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-obstacle] button:not([data-harnessmix-settings-trigger] *):hover,
495
+ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-testid="app-shell-header-context-menu-surface"] button:not([data-harnessmix-settings-trigger] *):hover,
496
+ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-toolbar] button:not([data-harnessmix-settings-trigger] *):hover {
497
497
  background: color-mix(in srgb, ${text} 12%, transparent) !important;
498
498
  background-color: color-mix(in srgb, ${text} 12%, transparent) !important;
499
499
  }
@@ -507,11 +507,11 @@ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-page-header] > [da
507
507
  filter: none !important;
508
508
  outline: none !important;
509
509
  }
510
- html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] header button:not([data-codexhost-settings-trigger] *):active,
511
- html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-pip-obstacle="app-shell-header"] button:not([data-codexhost-settings-trigger] *):active,
512
- html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-obstacle] button:not([data-codexhost-settings-trigger] *):active,
513
- html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-testid="app-shell-header-context-menu-surface"] button:not([data-codexhost-settings-trigger] *):active,
514
- html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-toolbar] button:not([data-codexhost-settings-trigger] *):active {
510
+ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] header button:not([data-harnessmix-settings-trigger] *):active,
511
+ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-pip-obstacle="app-shell-header"] button:not([data-harnessmix-settings-trigger] *):active,
512
+ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-obstacle] button:not([data-harnessmix-settings-trigger] *):active,
513
+ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-testid="app-shell-header-context-menu-surface"] button:not([data-harnessmix-settings-trigger] *):active,
514
+ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-toolbar] button:not([data-harnessmix-settings-trigger] *):active {
515
515
  background: color-mix(in srgb, ${text} 18%, transparent) !important;
516
516
  background-color: color-mix(in srgb, ${text} 18%, transparent) !important;
517
517
  }
@@ -578,7 +578,7 @@ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-action-sidebar-thread-ac
578
578
  background: linear-gradient(90deg, color-mix(in srgb, ${accent} 22%, transparent), color-mix(in srgb, ${secondary} 16%, transparent)) !important;
579
579
  }
580
580
  html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] :where(.border-border, .border-sidebar-border) { border-color: color-mix(in srgb, ${text} 14%, transparent) !important; }
581
- html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-codexhost-settings-shell] {
581
+ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-harnessmix-settings-shell] {
582
582
  --settings-bg: color-mix(in srgb, ${surface} 90%, transparent);
583
583
  --settings-sidebar: color-mix(in srgb, ${surface} 86%, ${secondary});
584
584
  --settings-panel: color-mix(in srgb, ${surface} 90%, transparent);
@@ -4,7 +4,7 @@ import {
4
4
  type RendererSettingsMessages,
5
5
  } from "./localization.js";
6
6
 
7
- export const SETTINGS_TRIGGER_ATTRIBUTE = "data-codexhost-settings-trigger";
7
+ export const SETTINGS_TRIGGER_ATTRIBUTE = "data-harnessmix-settings-trigger";
8
8
  export const SETTINGS_HEADER_SURFACE_SELECTOR =
9
9
  '[data-testid="app-shell-header-context-menu-surface"]';
10
10
  const SETTINGS_APPLICATION_HEADER_SELECTOR = 'header[data-pip-obstacle="app-shell-header"]';