@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
@@ -49,7 +49,7 @@ globalThis.__HARNESS_MIX_ICONS__={"models":{"gemini":{"label":"Gemini","svg":"<s
49
49
  "codex-harness"
50
50
  ];
51
51
  function defaultIdFactory(sequence) {
52
- return `codexhost-composer-${Date.now().toString(36)}-${sequence.toString(36)}`;
52
+ return `harnessmix-composer-${Date.now().toString(36)}-${sequence.toString(36)}`;
53
53
  }
54
54
  function isDefaultTarget(target) {
55
55
  return target?.[0] === "default";
@@ -74,6 +74,7 @@ globalThis.__HARNESS_MIX_ICONS__={"models":{"gemini":{"label":"Gemini","svg":"<s
74
74
  #modelRequestGenerations = /* @__PURE__ */ new WeakMap();
75
75
  #ownershipRequestGenerations = /* @__PURE__ */ new WeakMap();
76
76
  #states = /* @__PURE__ */ new WeakMap();
77
+ #interactedDrafts = /* @__PURE__ */ new WeakSet();
77
78
  #switching = /* @__PURE__ */ new Set();
78
79
  #pendingSubmissions = /* @__PURE__ */ new Set();
79
80
  #composerSequence = 0;
@@ -137,17 +138,22 @@ globalThis.__HARNESS_MIX_ICONS__={"models":{"gemini":{"label":"Gemini","svg":"<s
137
138
  rebindTarget(composer, target, preferredNewThreadAgent) {
138
139
  if (!isComposerTarget(target)) return null;
139
140
  const previous = this.#state(composer);
140
- this.#pendingSubmissions.delete(previous);
141
+ const pendingSubmission = this.#pendingSubmissions.delete(previous);
141
142
  this.#modelRequestGenerations.set(previous, ++this.#modelRequestSequence);
142
143
  this.#ownershipRequestGenerations.set(previous, ++this.#ownershipRequestSequence);
143
144
  let state = this.#targetState(target);
144
145
  if (!state) {
145
- const preferredAgent = isDefaultTarget(target) && preferredNewThreadAgent && this.#enabledAgents.has(preferredNewThreadAgent) ? preferredNewThreadAgent : isDefaultTarget(target) ? this.#lastSubmittedAgent : "codex";
146
- state = {
147
- agent: preferredAgent,
148
- phase: "draft",
149
- composerId: this.#idFactory(++this.#composerSequence)
150
- };
146
+ if (isDefaultTarget(target) && previous.phase === "draft" && this.#interactedDrafts.has(previous)) {
147
+ state = previous;
148
+ if (pendingSubmission) this.#pendingSubmissions.add(state);
149
+ } else {
150
+ const preferredAgent = isDefaultTarget(target) && preferredNewThreadAgent && this.#enabledAgents.has(preferredNewThreadAgent) ? preferredNewThreadAgent : isDefaultTarget(target) ? this.#lastSubmittedAgent : "codex";
151
+ state = {
152
+ agent: preferredAgent,
153
+ phase: "draft",
154
+ composerId: this.#idFactory(++this.#composerSequence)
155
+ };
156
+ }
151
157
  if (isRestorableTarget(target)) this.#targetStates.push({ target, state });
152
158
  }
153
159
  this.#states.set(composer, state);
@@ -307,6 +313,7 @@ globalThis.__HARNESS_MIX_ICONS__={"models":{"gemini":{"label":"Gemini","svg":"<s
307
313
  ...state.permissionModeByAgent,
308
314
  [agent]: permissionModeId
309
315
  };
316
+ if (state.phase === "draft") this.#interactedDrafts.add(state);
310
317
  return state;
311
318
  }
312
319
  setExternalModel(composer, agent, model) {
@@ -328,6 +335,7 @@ globalThis.__HARNESS_MIX_ICONS__={"models":{"gemini":{"label":"Gemini","svg":"<s
328
335
  else if (agent === "cursor-cli") state.cursorModel = model;
329
336
  else if (agent === "cline") state.clineModel = model;
330
337
  else if (agent === "codex-harness") state.codexHarnessModel = model;
338
+ if (state.phase === "draft") this.#interactedDrafts.add(state);
331
339
  return state;
332
340
  }
333
341
  setPiConfiguration(composer, model, thinkingOptionId) {
@@ -335,6 +343,7 @@ globalThis.__HARNESS_MIX_ICONS__={"models":{"gemini":{"label":"Gemini","svg":"<s
335
343
  state.piModel = model;
336
344
  if (thinkingOptionId) state.piThinkingOptionId = thinkingOptionId;
337
345
  else delete state.piThinkingOptionId;
346
+ if (state.phase === "draft") this.#interactedDrafts.add(state);
338
347
  return state;
339
348
  }
340
349
  setPiModel(composer, model) {
@@ -405,6 +414,7 @@ globalThis.__HARNESS_MIX_ICONS__={"models":{"gemini":{"label":"Gemini","svg":"<s
405
414
  } else if (agent === "codex-harness") {
406
415
  delete state.codexHarnessThinkingOptionId;
407
416
  }
417
+ if (state.phase === "draft") this.#interactedDrafts.add(state);
408
418
  return state;
409
419
  }
410
420
  setPiThinkingOption(composer, thinkingOptionId) {
@@ -479,6 +489,7 @@ globalThis.__HARNESS_MIX_ICONS__={"models":{"gemini":{"label":"Gemini","svg":"<s
479
489
  return false;
480
490
  }
481
491
  state.agent = nextAgent;
492
+ this.#interactedDrafts.add(state);
482
493
  return true;
483
494
  } finally {
484
495
  this.#switching.delete(state);
@@ -1752,7 +1763,7 @@ globalThis.__HARNESS_MIX_ICONS__={"models":{"gemini":{"label":"Gemini","svg":"<s
1752
1763
  function cleanEnum(obj) {
1753
1764
  return Object.entries(obj).filter(([k, _]) => {
1754
1765
  return Number.isNaN(Number.parseInt(k, 10));
1755
- }).map((el) => el[1]);
1766
+ }).map((el2) => el2[1]);
1756
1767
  }
1757
1768
  function base64ToUint8Array(base643) {
1758
1769
  const binaryString = atob(base643);
@@ -1846,15 +1857,15 @@ globalThis.__HARNESS_MIX_ICONS__={"models":{"gemini":{"label":"Gemini","svg":"<s
1846
1857
  let curr = fieldErrors;
1847
1858
  let i = 0;
1848
1859
  while (i < fullpath.length) {
1849
- const el = fullpath[i];
1860
+ const el2 = fullpath[i];
1850
1861
  const terminal = i === fullpath.length - 1;
1851
1862
  if (!terminal) {
1852
- curr[el] = curr[el] || { _errors: [] };
1863
+ curr[el2] = curr[el2] || { _errors: [] };
1853
1864
  } else {
1854
- curr[el] = curr[el] || { _errors: [] };
1855
- curr[el]._errors.push(mapper(issue2));
1865
+ curr[el2] = curr[el2] || { _errors: [] };
1866
+ curr[el2]._errors.push(mapper(issue2));
1856
1867
  }
1857
- curr = curr[el];
1868
+ curr = curr[el2];
1858
1869
  i++;
1859
1870
  }
1860
1871
  }
@@ -1884,16 +1895,16 @@ globalThis.__HARNESS_MIX_ICONS__={"models":{"gemini":{"label":"Gemini","svg":"<s
1884
1895
  let curr = result;
1885
1896
  let i = 0;
1886
1897
  while (i < fullpath.length) {
1887
- const el = fullpath[i];
1898
+ const el2 = fullpath[i];
1888
1899
  const terminal = i === fullpath.length - 1;
1889
- if (typeof el === "string") {
1900
+ if (typeof el2 === "string") {
1890
1901
  curr.properties ?? (curr.properties = {});
1891
- (_a3 = curr.properties)[el] ?? (_a3[el] = { errors: [] });
1892
- curr = curr.properties[el];
1902
+ (_a3 = curr.properties)[el2] ?? (_a3[el2] = { errors: [] });
1903
+ curr = curr.properties[el2];
1893
1904
  } else {
1894
1905
  curr.items ?? (curr.items = []);
1895
- (_b = curr.items)[el] ?? (_b[el] = { errors: [] });
1896
- curr = curr.items[el];
1906
+ (_b = curr.items)[el2] ?? (_b[el2] = { errors: [] });
1907
+ curr = curr.items[el2];
1897
1908
  }
1898
1909
  if (terminal) {
1899
1910
  curr.errors.push(mapper(issue2));
@@ -3558,10 +3569,10 @@ globalThis.__HARNESS_MIX_ICONS__={"models":{"gemini":{"label":"Gemini","svg":"<s
3558
3569
  const proms = [];
3559
3570
  const shape = value.shape;
3560
3571
  for (const key of value.keys) {
3561
- const el = shape[key];
3562
- const isOptionalIn = el._zod.optin === "optional";
3563
- const isOptionalOut = el._zod.optout === "optional";
3564
- const r = el._zod.run({ value: input[key], issues: [] }, ctx);
3572
+ const el2 = shape[key];
3573
+ const isOptionalIn = el2._zod.optin === "optional";
3574
+ const isOptionalOut = el2._zod.optout === "optional";
3575
+ const r = el2._zod.run({ value: input[key], issues: [] }, ctx);
3565
3576
  if (r instanceof Promise) {
3566
3577
  proms.push(r.then((r2) => handlePropertyResult(r2, payload, key, input, isOptionalIn, isOptionalOut)));
3567
3578
  } else {
@@ -4039,9 +4050,9 @@ globalThis.__HARNESS_MIX_ICONS__={"models":{"gemini":{"label":"Gemini","svg":"<s
4039
4050
  if (def.rest) {
4040
4051
  let i = items.length - 1;
4041
4052
  const rest = input.slice(items.length);
4042
- for (const el of rest) {
4053
+ for (const el2 of rest) {
4043
4054
  i++;
4044
- const result = def.rest._zod.run({ value: el, issues: [] }, ctx);
4055
+ const result = def.rest._zod.run({ value: el2, issues: [] }, ctx);
4045
4056
  if (result instanceof Promise) {
4046
4057
  proms.push(result.then((r) => handleTupleResult(r, payload, i)));
4047
4058
  } else {
@@ -8139,8 +8150,8 @@ globalThis.__HARNESS_MIX_ICONS__={"models":{"gemini":{"label":"Gemini","svg":"<s
8139
8150
  }
8140
8151
 
8141
8152
  // node_modules/zod/v4/locales/lt.js
8142
- var capitalizeFirstCharacter = (text) => {
8143
- return text.charAt(0).toUpperCase() + text.slice(1);
8153
+ var capitalizeFirstCharacter = (text2) => {
8154
+ return text2.charAt(0).toUpperCase() + text2.slice(1);
8144
8155
  };
8145
8156
  function getUnitTypeFromNumber(number4) {
8146
8157
  const abs = Math.abs(number4);
@@ -15198,7 +15209,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15198
15209
  );
15199
15210
 
15200
15211
  // src/native-ui/shared-contracts/src/errors.ts
15201
- var codexhostErrorSchema = external_exports.strictObject({
15212
+ var harnessmixErrorSchema = external_exports.strictObject({
15202
15213
  code: external_exports.string().min(1),
15203
15214
  message: external_exports.string().min(1),
15204
15215
  retryable: external_exports.boolean(),
@@ -15361,6 +15372,13 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15361
15372
  permissionModeScope: harnessPermissionModeScopeSchema.default("live")
15362
15373
  }).strict(),
15363
15374
  history: harnessHistoryCapabilitiesSchema,
15375
+ workspace: external_exports.object({
15376
+ git: external_exports.literal(true),
15377
+ worktree: external_exports.literal(true),
15378
+ finalDiff: external_exports.literal(true),
15379
+ nativeDiff: external_exports.boolean(),
15380
+ nativePatch: external_exports.boolean()
15381
+ }).strict().optional(),
15364
15382
  subagents: external_exports.object({
15365
15383
  observe: external_exports.boolean(),
15366
15384
  readTranscript: external_exports.boolean()
@@ -15406,7 +15424,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15406
15424
  });
15407
15425
  var failedHarnessInspectionSchema = external_exports.object({
15408
15426
  status: external_exports.enum(["notInstalled", "unavailable", "error"]),
15409
- error: codexhostErrorSchema
15427
+ error: harnessmixErrorSchema
15410
15428
  }).strict();
15411
15429
  var harnessInspectionSchema = external_exports.union([
15412
15430
  readyHarnessInspectionSchema,
@@ -15447,6 +15465,14 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15447
15465
  availableThinkingOptions: harnessThinkingOptionsSchema.optional(),
15448
15466
  effectivePermissionModeId: harnessPermissionModeIdSchema.optional(),
15449
15467
  history: harnessHistoryCapabilitiesSchema,
15468
+ workspace: external_exports.object({
15469
+ hostManaged: external_exports.literal(true),
15470
+ git: external_exports.object({ available: external_exports.boolean(), root: external_exports.string().optional(), head: external_exports.string().optional(), branch: external_exports.string().nullable().optional(), dirty: external_exports.boolean().optional(), reason: external_exports.enum(["not-a-git-repository", "git-unavailable"]).optional() }).strict(),
15471
+ worktree: external_exports.object({ available: external_exports.boolean(), active: external_exports.boolean(), branch: external_exports.string().optional(), root: external_exports.string().optional() }).strict(),
15472
+ finalDiff: external_exports.object({ available: external_exports.literal(true), source: external_exports.literal("snapshot") }).strict(),
15473
+ nativeDiff: external_exports.boolean(),
15474
+ nativePatch: external_exports.boolean()
15475
+ }).strict().optional(),
15450
15476
  usage: threadUsageSnapshotSchema.optional(),
15451
15477
  accountCredits: accountCreditsSnapshotSchema.optional(),
15452
15478
  locked: external_exports.literal(true)
@@ -15546,7 +15572,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15546
15572
  });
15547
15573
 
15548
15574
  // src/native-ui/shared-contracts/src/harness-route.ts
15549
- var HARNESS_PLUGIN_ROUTE_PREFIX = "codexhost/plugin-v1@";
15575
+ var HARNESS_PLUGIN_ROUTE_PREFIX = "harnessmix/plugin-v1@";
15550
15576
  var MAX_ROUTE_LENGTH = 4096;
15551
15577
  var harnessPluginRouteSchema = external_exports.object({
15552
15578
  harnessId: harnessPluginIdSchema,
@@ -15919,7 +15945,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15919
15945
  });
15920
15946
  var updateEmptyParamsSchema = external_exports.strictObject({});
15921
15947
  var githubReleaseNotesUrlSchema = external_exports.string().max(300).regex(
15922
- /^https:\/\/github\.com\/(?:BytePioneer-AI\/codex-host|emo-xiaoyu\/harness-mix)\/releases\/tag\/v[0-9A-Za-z.+-]+$/u,
15948
+ /^https:\/\/github\.com\/emo-xiaoyu\/harness-mix\/releases\/tag\/v[0-9A-Za-z.+-]+$/u,
15923
15949
  "release notes URL must identify a Harness Mix GitHub Release"
15924
15950
  );
15925
15951
  var updateCheckResultSchema = external_exports.strictObject({
@@ -15944,7 +15970,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15944
15970
  var workspaceContractVersionSchema = external_exports.literal(WORKSPACE_CONTRACT_VERSION);
15945
15971
 
15946
15972
  // src/native-ui/renderer-extension/src/agent-group-preference.ts
15947
- var AGENT_GROUP_PREFERENCE_STORAGE_KEY = "codexhost.agentGroupPreference.v1";
15973
+ var AGENT_GROUP_PREFERENCE_STORAGE_KEY = "harnessmix.agentGroupPreference.v1";
15948
15974
  var EXTERNAL_AGENTS = KNOWN_RENDERER_AGENTS.filter(
15949
15975
  (agent) => agent !== "codex"
15950
15976
  );
@@ -16433,7 +16459,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
16433
16459
  }
16434
16460
 
16435
16461
  // src/native-ui/renderer-extension/src/renderer-new-thread-preference.ts
16436
- var RENDERER_NEW_THREAD_PREFERENCE_KEY = "codexhost.new-thread-preference.v1";
16462
+ var RENDERER_NEW_THREAD_PREFERENCE_KEY = "harnessmix.new-thread-preference.v1";
16437
16463
  function rendererStorage() {
16438
16464
  try {
16439
16465
  return window.localStorage;
@@ -16970,7 +16996,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
16970
16996
  "aria-hidden": "true",
16971
16997
  focusable: "false"
16972
16998
  });
16973
- icon2.classList.add("codexhost-settings-icon");
16999
+ icon2.classList.add("harnessmix-settings-icon");
16974
17000
  return icon2;
16975
17001
  }
16976
17002
  function createRendererSettingsBrandIcon(size = 22, ownerDocument) {
@@ -16986,12 +17012,12 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
16986
17012
  icon2.style.width = `${size}px`;
16987
17013
  icon2.style.height = `${size}px`;
16988
17014
  icon2.style.objectFit = "contain";
16989
- icon2.classList.add("codexhost-settings-icon");
17015
+ icon2.classList.add("harnessmix-settings-icon");
16990
17016
  return icon2;
16991
17017
  }
16992
17018
 
16993
17019
  // src/native-ui/renderer-extension/src/settings/connections-page.ts
16994
- var CODEXHOST_GITHUB_ISSUES_NEW_URL = "https://github.com/emo-xiaoyu/harness-mix/issues/new";
17020
+ var HARNESSMIX_GITHUB_ISSUES_NEW_URL = "https://github.com/emo-xiaoyu/harness-mix/issues/new";
16995
17021
  var HARNESS_INSTALL_COMMANDS = Object.freeze({
16996
17022
  qoder: { command: "npm install -g @qoder-ai/qodercli" },
16997
17023
  codex: { command: "npm install -g @openai/codex" },
@@ -17046,7 +17072,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
17046
17072
  function diagnosticText(hostId, item) {
17047
17073
  const error51 = item.error;
17048
17074
  return [
17049
- "codexhost connection diagnostics",
17075
+ "harnessmix connection diagnostics",
17050
17076
  `host: ${hostId}`,
17051
17077
  `agent: ${item.name}`,
17052
17078
  `status: ${item.availability}`,
@@ -17352,10 +17378,10 @@ ${error51.stderrTail}`] : []
17352
17378
  copyBtn.className = "settings-command-button settings-command-button--secondary";
17353
17379
  copyBtn.append(createRendererSettingsIcon("copy", 15), messages.copyInstallCommand);
17354
17380
  copyBtn.addEventListener("click", () => {
17355
- const text = commandInfo.command;
17381
+ const text2 = commandInfo.command;
17356
17382
  const clipboard = document2.defaultView?.navigator?.clipboard;
17357
17383
  if (clipboard) {
17358
- void clipboard.writeText(text).then(() => {
17384
+ void clipboard.writeText(text2).then(() => {
17359
17385
  copyBtn.replaceChildren(createRendererSettingsIcon("check", 15), messages.installCommandCopied);
17360
17386
  document2.defaultView?.setTimeout(() => {
17361
17387
  copyBtn.replaceChildren(createRendererSettingsIcon("copy", 15), messages.copyInstallCommand);
@@ -17378,8 +17404,8 @@ ${error51.stderrTail}`] : []
17378
17404
  feedback.className = "settings-install-feedback";
17379
17405
  const run = async () => {
17380
17406
  if (!diagnostics?.installHarness) {
17381
- const text = commandInfo.command;
17382
- await document2.defaultView?.navigator?.clipboard?.writeText(text);
17407
+ const text2 = commandInfo.command;
17408
+ await document2.defaultView?.navigator?.clipboard?.writeText(text2);
17383
17409
  feedback.className = "settings-install-feedback settings-feedback-warning";
17384
17410
  feedback.textContent = messages.oneClickInstallFailed;
17385
17411
  installBtn.disabled = false;
@@ -17618,7 +17644,7 @@ ${error51.stderrTail}`] : []
17618
17644
  actions.className = "settings-connection-error-actions";
17619
17645
  const issue2 = document2.createElement("a");
17620
17646
  issue2.className = "settings-command-button settings-command-button--secondary";
17621
- issue2.href = CODEXHOST_GITHUB_ISSUES_NEW_URL;
17647
+ issue2.href = HARNESSMIX_GITHUB_ISSUES_NEW_URL;
17622
17648
  issue2.target = "_blank";
17623
17649
  issue2.rel = "noopener noreferrer";
17624
17650
  issue2.append(messages.connectionOpenIssue, createRendererSettingsIcon("external-link", 14));
@@ -17821,7 +17847,7 @@ ${error51.stderrTail}`] : []
17821
17847
  tabs.setAttribute("role", "tablist");
17822
17848
  tabs.setAttribute("aria-label", messages.connectionHosts);
17823
17849
  const scrollRight = createHostScrollButton(document2, "right", messages);
17824
- const panelId = "codexhost-settings-connection-host-panel";
17850
+ const panelId = "harnessmix-settings-connection-host-panel";
17825
17851
  snapshot.hosts.forEach((host, index) => {
17826
17852
  const tab = document2.createElement("button");
17827
17853
  tab.type = "button";
@@ -18611,7 +18637,7 @@ ${error51.stderrTail}`] : []
18611
18637
  };
18612
18638
  }
18613
18639
  function openSettingsPage(pageId, opener) {
18614
- const shell = window.__codexhostSettingsShellV1;
18640
+ const shell = window.__harnessmixSettingsShellV1;
18615
18641
  shell?.openSettings(opener, pageId);
18616
18642
  }
18617
18643
  function openConnectionsSettings(opener) {
@@ -18636,7 +18662,7 @@ ${error51.stderrTail}`] : []
18636
18662
  cline: "https://docs.cline.bot/usage/cli-overview",
18637
18663
  "codex-harness": "https://developers.openai.com/codex/"
18638
18664
  };
18639
- var CONTROL_ATTRIBUTE = "data-codexhost-agent-control";
18665
+ var CONTROL_ATTRIBUTE = "data-harnessmix-agent-control";
18640
18666
  var AGENT_MENU_WIDTH = 224;
18641
18667
  var AGENT_GROUP_CTA_THRESHOLD = 5;
18642
18668
  function rendererAgentMenuPlacement(triggerRect, viewport, windowZoom) {
@@ -19055,7 +19081,7 @@ ${error51.stderrTail}`] : []
19055
19081
  }
19056
19082
  mainGroup.replaceChildren(...mainChildren);
19057
19083
  moreRows.replaceChildren(
19058
- ...moreAgents.map((agent) => rowsByAgent.get(agent)).filter((el) => !!el)
19084
+ ...moreAgents.map((agent) => rowsByAgent.get(agent)).filter((el2) => !!el2)
19059
19085
  );
19060
19086
  const showMoreGroup = moreAgents.length > 0;
19061
19087
  const showCta = !showMoreGroup && enabledAgents.length > AGENT_GROUP_CTA_THRESHOLD;
@@ -19268,8 +19294,8 @@ ${error51.stderrTail}`] : []
19268
19294
  }
19269
19295
 
19270
19296
  // src/native-ui/renderer-extension/src/renderer-trigger-chip-style.ts
19271
- var STYLE_ATTRIBUTE = "data-codexhost-trigger-chip-style";
19272
- var TRIGGER_CHIP_CLASS = "codexhost-trigger-chip";
19297
+ var STYLE_ATTRIBUTE = "data-harnessmix-trigger-chip-style";
19298
+ var TRIGGER_CHIP_CLASS = "harnessmix-trigger-chip";
19273
19299
  function ensureRendererTriggerChipStyle(ownerDocument) {
19274
19300
  if (ownerDocument.querySelector(`style[${STYLE_ATTRIBUTE}]`)) return;
19275
19301
  const style = ownerDocument.createElement("style");
@@ -19310,7 +19336,7 @@ ${error51.stderrTail}`] : []
19310
19336
  var OPTION_CLASSES = "flex w-full cursor-interaction items-center gap-2 rounded-lg px-2 py-2 text-left text-sm text-token-foreground outline-none enabled:hover:bg-token-list-hover-background enabled:active:bg-token-foreground/15 disabled:cursor-not-allowed disabled:opacity-40";
19311
19337
  var HEADING_CLASSES = "px-2 pb-1 pt-1.5 text-sm text-token-text-tertiary";
19312
19338
  var MODEL_TRIGGER_MAX_WIDTH = "min(200px, 26vw)";
19313
- var MODEL_SCROLLBAR_STYLE_ATTRIBUTE = "data-codexhost-model-picker-scrollbar";
19339
+ var MODEL_SCROLLBAR_STYLE_ATTRIBUTE = "data-harnessmix-model-picker-scrollbar";
19314
19340
  function popoverOpen2(menu) {
19315
19341
  return menu.matches(":popover-open");
19316
19342
  }
@@ -19319,28 +19345,28 @@ ${error51.stderrTail}`] : []
19319
19345
  const style = ownerDocument.createElement("style");
19320
19346
  style.setAttribute(MODEL_SCROLLBAR_STYLE_ATTRIBUTE, "true");
19321
19347
  style.textContent = `
19322
- [data-codexhost-model-scrollable] {
19348
+ [data-harnessmix-model-scrollable] {
19323
19349
  scrollbar-width: thin;
19324
19350
  scrollbar-color: rgba(255, 255, 255, 0.28) transparent;
19325
19351
  }
19326
- [data-codexhost-model-scrollable]::-webkit-scrollbar {
19352
+ [data-harnessmix-model-scrollable]::-webkit-scrollbar {
19327
19353
  width: 6px;
19328
19354
  height: 6px;
19329
19355
  }
19330
- [data-codexhost-model-scrollable]::-webkit-scrollbar-track {
19356
+ [data-harnessmix-model-scrollable]::-webkit-scrollbar-track {
19331
19357
  background: transparent;
19332
19358
  }
19333
- [data-codexhost-model-scrollable]::-webkit-scrollbar-thumb {
19359
+ [data-harnessmix-model-scrollable]::-webkit-scrollbar-thumb {
19334
19360
  min-height: 28px;
19335
19361
  border: 1px solid transparent;
19336
19362
  border-radius: 999px;
19337
19363
  background: rgba(255, 255, 255, 0.28);
19338
19364
  background-clip: padding-box;
19339
19365
  }
19340
- [data-codexhost-model-scrollable]::-webkit-scrollbar-thumb:hover {
19366
+ [data-harnessmix-model-scrollable]::-webkit-scrollbar-thumb:hover {
19341
19367
  background: rgba(255, 255, 255, 0.42);
19342
19368
  }
19343
- [data-codexhost-model-scrollable]::-webkit-scrollbar-button {
19369
+ [data-harnessmix-model-scrollable]::-webkit-scrollbar-button {
19344
19370
  display: none;
19345
19371
  width: 0;
19346
19372
  height: 0;
@@ -19388,7 +19414,7 @@ ${error51.stderrTail}`] : []
19388
19414
  }
19389
19415
  function positionMenu(control) {
19390
19416
  const triggerRect = control.trigger.getBoundingClientRect();
19391
- const thinkingColumn = control.menu.querySelector("[data-codexhost-thinking-column]");
19417
+ const thinkingColumn = control.menu.querySelector("[data-harnessmix-thinking-column]");
19392
19418
  const twoColumn = control.thinkingExpanded && thinkingColumn !== null;
19393
19419
  if (thinkingColumn) thinkingColumn.style.display = twoColumn ? "flex" : "none";
19394
19420
  control.menu.dataset.twoColumn = String(twoColumn);
@@ -19405,7 +19431,7 @@ ${error51.stderrTail}`] : []
19405
19431
  control.menu.style.top = "auto";
19406
19432
  control.menu.style.bottom = `${placement.bottom}px`;
19407
19433
  const listMaxHeight = placement.maxHeight ?? 320;
19408
- for (const column of control.menu.querySelectorAll("[data-codexhost-model-scrollable]")) {
19434
+ for (const column of control.menu.querySelectorAll("[data-harnessmix-model-scrollable]")) {
19409
19435
  column.style.maxHeight = `${listMaxHeight}px`;
19410
19436
  }
19411
19437
  }
@@ -19423,16 +19449,16 @@ ${error51.stderrTail}`] : []
19423
19449
  check2.style.flex = "none";
19424
19450
  return check2;
19425
19451
  }
19426
- function createHeading(text) {
19452
+ function createHeading(text2) {
19427
19453
  const heading = document.createElement("div");
19428
- heading.textContent = text;
19454
+ heading.textContent = text2;
19429
19455
  heading.className = HEADING_CLASSES;
19430
19456
  heading.setAttribute("role", "presentation");
19431
19457
  return heading;
19432
19458
  }
19433
- function syncRendererLabelText(element, text) {
19434
- if (element.textContent === text) return false;
19435
- element.textContent = text;
19459
+ function syncRendererLabelText(element, text2) {
19460
+ if (element.textContent === text2) return false;
19461
+ element.textContent = text2;
19436
19462
  return true;
19437
19463
  }
19438
19464
  function applyModelSearchFilter(control) {
@@ -19448,7 +19474,7 @@ ${error51.stderrTail}`] : []
19448
19474
  function mountRendererModelPicker(composerId, onSelectModel, onSelectThinking) {
19449
19475
  ensureRendererTriggerChipStyle(document);
19450
19476
  const root = document.createElement("div");
19451
- root.setAttribute("data-codexhost-model-control", composerId);
19477
+ root.setAttribute("data-harnessmix-model-control", composerId);
19452
19478
  root.className = "relative min-w-0";
19453
19479
  root.style.display = "none";
19454
19480
  const trigger = document.createElement("button");
@@ -19506,7 +19532,7 @@ ${error51.stderrTail}`] : []
19506
19532
  searchHeader.style.padding = "4px";
19507
19533
  searchHeader.style.backgroundColor = "Canvas";
19508
19534
  const searchEmpty = document.createElement("div");
19509
- searchEmpty.dataset.codexhostModelSearchEmpty = "true";
19535
+ searchEmpty.dataset.harnessmixModelSearchEmpty = "true";
19510
19536
  searchEmpty.textContent = "No matching models";
19511
19537
  searchEmpty.className = "block px-2 py-2 text-sm text-token-text-tertiary";
19512
19538
  searchEmpty.hidden = true;
@@ -19657,7 +19683,7 @@ ${error51.stderrTail}`] : []
19657
19683
  modelColumn.style.width = `${RENDERER_MODEL_PICKER_MAIN_MENU_WIDTH}px`;
19658
19684
  modelColumn.style.minWidth = "0";
19659
19685
  const modelList = document.createElement("div");
19660
- modelList.setAttribute("data-codexhost-model-scrollable", "true");
19686
+ modelList.setAttribute("data-harnessmix-model-scrollable", "true");
19661
19687
  modelList.style.overflowY = "auto";
19662
19688
  modelList.style.minHeight = "0";
19663
19689
  modelColumn.append(createHeading("Model"), control.searchHeader, control.searchEmpty, modelList);
@@ -19667,12 +19693,12 @@ ${error51.stderrTail}`] : []
19667
19693
  button.dataset.modelId = model.ref.id;
19668
19694
  button.setAttribute("role", "menuitemradio");
19669
19695
  button.className = OPTION_CLASSES;
19670
- const text = document.createElement("span");
19671
- text.textContent = model.label;
19672
- text.className = "min-w-0 flex-1 truncate";
19673
- text.title = model.label;
19696
+ const text2 = document.createElement("span");
19697
+ text2.textContent = model.label;
19698
+ text2.className = "min-w-0 flex-1 truncate";
19699
+ text2.title = model.label;
19674
19700
  const check2 = createCheck();
19675
- button.append(projectModelIcon(model.label, button.ownerDocument), text, check2);
19701
+ button.append(projectModelIcon(model.label, button.ownerDocument), text2, check2);
19676
19702
  control.options.set(model.ref.id, {
19677
19703
  button,
19678
19704
  check: check2,
@@ -19687,7 +19713,7 @@ ${error51.stderrTail}`] : []
19687
19713
  columns.append(modelColumn);
19688
19714
  if (presentation.showThinkingSection) {
19689
19715
  const thinkingColumn = document.createElement("div");
19690
- thinkingColumn.dataset.codexhostThinkingColumn = "true";
19716
+ thinkingColumn.dataset.harnessmixThinkingColumn = "true";
19691
19717
  thinkingColumn.className = "flex min-w-0 flex-col";
19692
19718
  thinkingColumn.style.display = control.thinkingExpanded ? "flex" : "none";
19693
19719
  thinkingColumn.style.flexDirection = "column";
@@ -19697,7 +19723,7 @@ ${error51.stderrTail}`] : []
19697
19723
  thinkingColumn.style.paddingLeft = "4px";
19698
19724
  thinkingColumn.append(createHeading("Thinking"));
19699
19725
  const thinkingList = document.createElement("div");
19700
- thinkingList.setAttribute("data-codexhost-model-scrollable", "true");
19726
+ thinkingList.setAttribute("data-harnessmix-model-scrollable", "true");
19701
19727
  thinkingList.style.overflowY = "auto";
19702
19728
  thinkingList.style.minHeight = "0";
19703
19729
  for (const option of presentation.thinkingOptions) {
@@ -19706,11 +19732,11 @@ ${error51.stderrTail}`] : []
19706
19732
  button.dataset.thinkingOptionId = option.id;
19707
19733
  button.setAttribute("role", "menuitemradio");
19708
19734
  button.className = OPTION_CLASSES;
19709
- const text = document.createElement("span");
19710
- text.textContent = option.label;
19711
- text.className = "min-w-0 flex-1 truncate";
19735
+ const text2 = document.createElement("span");
19736
+ text2.textContent = option.label;
19737
+ text2.className = "min-w-0 flex-1 truncate";
19712
19738
  const check2 = createCheck();
19713
- button.append(text, check2);
19739
+ button.append(text2, check2);
19714
19740
  control.thinkingOptions.set(option.id, { button, check: check2 });
19715
19741
  thinkingList.append(button);
19716
19742
  }
@@ -19981,7 +20007,7 @@ ${error51.stderrTail}`] : []
19981
20007
  function mountRendererPermissionModePicker(composerId, onSelect, locale = "en") {
19982
20008
  ensureRendererTriggerChipStyle(document);
19983
20009
  const root = document.createElement("div");
19984
- root.setAttribute("data-codexhost-permission-mode-control", composerId);
20010
+ root.setAttribute("data-harnessmix-permission-mode-control", composerId);
19985
20011
  root.className = "relative min-w-0";
19986
20012
  root.style.display = "none";
19987
20013
  const trigger = document.createElement("button");
@@ -20450,7 +20476,7 @@ ${error51.stderrTail}`] : []
20450
20476
  ensureRendererTriggerChipStyle(document);
20451
20477
  const messages = rendererUsageMessages(locale);
20452
20478
  const root = document.createElement("div");
20453
- root.dataset.codexhostUsageControl = composerId;
20479
+ root.dataset.harnessmixUsageControl = composerId;
20454
20480
  root.className = "relative min-w-0";
20455
20481
  root.style.display = "none";
20456
20482
  root.style.alignItems = "center";
@@ -20477,7 +20503,7 @@ ${error51.stderrTail}`] : []
20477
20503
  trigger.style.fontVariantNumeric = "tabular-nums";
20478
20504
  trigger.style.letterSpacing = "0";
20479
20505
  const ringSlot = document.createElement("span");
20480
- ringSlot.dataset.codexhostUsageRing = "";
20506
+ ringSlot.dataset.harnessmixUsageRing = "";
20481
20507
  ringSlot.style.display = "inline-flex";
20482
20508
  ringSlot.style.flex = "0 0 auto";
20483
20509
  ringSlot.style.alignItems = "center";
@@ -20583,7 +20609,7 @@ ${error51.stderrTail}`] : []
20583
20609
  closePopover(control);
20584
20610
  return false;
20585
20611
  }
20586
- const ringSlot = control.trigger.querySelector("[data-codexhost-usage-ring]");
20612
+ const ringSlot = control.trigger.querySelector("[data-harnessmix-usage-ring]");
20587
20613
  const contextPercent = usage?.contextUsagePercent !== void 0 ? usage.contextUsagePercent : hasContext && usage?.contextWindowTokens !== void 0 && usage.contextWindowTokens > 0 ? Math.round(100 * (usage.contextUsedTokens ?? 0) / usage.contextWindowTokens * 10) / 10 : void 0;
20588
20614
  if (contextPercent !== void 0) {
20589
20615
  const tone = contextPercent >= 90 ? "hot" : contextPercent >= 70 ? "warn" : "ok";
@@ -20719,7 +20745,7 @@ ${error51.stderrTail}`] : []
20719
20745
  }
20720
20746
  function renderCreditsBar(usagePercent, color) {
20721
20747
  const track = document.createElement("div");
20722
- track.dataset.codexhostCreditsBar = "";
20748
+ track.dataset.harnessmixCreditsBar = "";
20723
20749
  track.style.height = "6px";
20724
20750
  track.style.borderRadius = "9999px";
20725
20751
  track.style.background = "color-mix(in srgb, currentColor 12%, transparent)";
@@ -20886,7 +20912,7 @@ ${error51.stderrTail}`] : []
20886
20912
  function mountRendererCreditsControl(composerId) {
20887
20913
  ensureRendererTriggerChipStyle(document);
20888
20914
  const root = document.createElement("div");
20889
- root.dataset.codexhostCreditsControl = composerId;
20915
+ root.dataset.harnessmixCreditsControl = composerId;
20890
20916
  root.className = "relative min-w-0";
20891
20917
  root.style.display = "none";
20892
20918
  root.style.alignItems = "center";
@@ -20912,11 +20938,11 @@ ${error51.stderrTail}`] : []
20912
20938
  trigger.style.fontVariantNumeric = "tabular-nums";
20913
20939
  trigger.style.letterSpacing = "0";
20914
20940
  const ringSlot = document.createElement("span");
20915
- ringSlot.dataset.codexhostCreditsRing = "";
20941
+ ringSlot.dataset.harnessmixCreditsRing = "";
20916
20942
  ringSlot.style.display = "inline-flex";
20917
20943
  ringSlot.style.flex = "0 0 auto";
20918
20944
  const label = document.createElement("span");
20919
- label.dataset.codexhostCreditsLabel = "";
20945
+ label.dataset.harnessmixCreditsLabel = "";
20920
20946
  label.style.display = "inline-block";
20921
20947
  label.style.maxWidth = "100%";
20922
20948
  label.style.overflow = "hidden";
@@ -21007,8 +21033,8 @@ ${error51.stderrTail}`] : []
21007
21033
  const percent = formatRendererCreditsPercent(remaining);
21008
21034
  const title = `${creditsPeriodLabel(accountCredits.periodType)} ${percent}`;
21009
21035
  const tone = rendererCreditsTone(accountCredits.usedPercent);
21010
- const ringSlot = control.trigger.querySelector("[data-codexhost-credits-ring]");
21011
- const label = control.trigger.querySelector("[data-codexhost-credits-label]");
21036
+ const ringSlot = control.trigger.querySelector("[data-harnessmix-credits-ring]");
21037
+ const label = control.trigger.querySelector("[data-harnessmix-credits-label]");
21012
21038
  if (ringSlot) {
21013
21039
  ringSlot.replaceChildren(
21014
21040
  createRendererUsageRing(remaining, {
@@ -21027,12 +21053,12 @@ ${error51.stderrTail}`] : []
21027
21053
  }
21028
21054
 
21029
21055
  // src/native-ui/renderer-extension/src/renderer-harness-command-claim.ts
21030
- function inputEvent(editor, text) {
21056
+ function inputEvent(editor, text2) {
21031
21057
  const view = editor.ownerDocument.defaultView;
21032
21058
  return view?.InputEvent ? new view.InputEvent("input", {
21033
21059
  bubbles: true,
21034
21060
  composed: true,
21035
- data: text,
21061
+ data: text2,
21036
21062
  inputType: "insertText"
21037
21063
  }) : new (view?.Event ?? Event)("input", { bubbles: true, composed: true });
21038
21064
  }
@@ -21079,8 +21105,8 @@ ${error51.stderrTail}`] : []
21079
21105
  }
21080
21106
 
21081
21107
  // src/native-ui/renderer-extension/src/renderer-harness-command-control.ts
21082
- var CONTROL_ATTRIBUTE2 = "data-codexhost-harness-command-control";
21083
- var MENU_ATTRIBUTE = "data-codexhost-harness-command-menu";
21108
+ var CONTROL_ATTRIBUTE2 = "data-harnessmix-harness-command-control";
21109
+ var MENU_ATTRIBUTE = "data-harnessmix-harness-command-menu";
21084
21110
  var MENU_WIDTH = 320;
21085
21111
  var VIEWPORT_MARGIN = 8;
21086
21112
  var MENU_GAP = 8;
@@ -21557,11 +21583,11 @@ ${error51.stderrTail}`] : []
21557
21583
  const input = document.createElement("input");
21558
21584
  input.type = "checkbox";
21559
21585
  input.checked = true;
21560
- const text = document.createTextNode("");
21561
- row.append(input, text);
21586
+ const text2 = document.createTextNode("");
21587
+ row.append(input, text2);
21562
21588
  includeGrid.append(row);
21563
21589
  includeInputs[key] = input;
21564
- includeLabels[key] = text;
21590
+ includeLabels[key] = text2;
21565
21591
  }
21566
21592
  includeSection.append(includeGrid);
21567
21593
  const label = document.createElement("label");
@@ -21623,9 +21649,9 @@ ${error51.stderrTail}`] : []
21623
21649
  labelText.textContent = messages.noteLabel;
21624
21650
  intentLabelText.textContent = messages.intentLabel;
21625
21651
  includeLegend.textContent = messages.includeLabel;
21626
- for (const [value, text] of Object.entries(messages.intentOptions)) {
21652
+ for (const [value, text2] of Object.entries(messages.intentOptions)) {
21627
21653
  const option = [...intent.options].find((candidate) => candidate.value === value);
21628
- if (option) option.textContent = text;
21654
+ if (option) option.textContent = text2;
21629
21655
  }
21630
21656
  for (const key of Object.keys(includeInputs)) includeLabels[key].data = messages.includeOptions[key];
21631
21657
  note.placeholder = messages.notePlaceholder;
@@ -21725,7 +21751,7 @@ ${error51.stderrTail}`] : []
21725
21751
  return controlDescription(button);
21726
21752
  }
21727
21753
  function isOwnedRendererControl(element) {
21728
- return element.hasAttribute(CONTROL_ATTRIBUTE) || element.hasAttribute("data-codexhost-model-control") || element.hasAttribute("data-codexhost-permission-mode-control") || element.hasAttribute("data-codexhost-usage-control") || element.hasAttribute("data-codexhost-credits-control") || element.hasAttribute("data-codexhost-harness-command-control");
21754
+ return element.hasAttribute(CONTROL_ATTRIBUTE) || element.hasAttribute("data-harnessmix-model-control") || element.hasAttribute("data-harnessmix-permission-mode-control") || element.hasAttribute("data-harnessmix-usage-control") || element.hasAttribute("data-harnessmix-credits-control") || element.hasAttribute("data-harnessmix-harness-command-control");
21729
21755
  }
21730
21756
  function isComposerSubmitButton(button) {
21731
21757
  if (button.type === "submit") return true;
@@ -21805,7 +21831,7 @@ ${error51.stderrTail}`] : []
21805
21831
  return typeof value === "object" && value !== null && !Array.isArray(value);
21806
21832
  }
21807
21833
  function isNativeModelControlCandidate(element) {
21808
- if (element.hasAttribute(CONTROL_ATTRIBUTE) || element.hasAttribute("data-codexhost-model-control") || !element.matches('button[aria-haspopup="menu"]')) {
21834
+ if (element.hasAttribute(CONTROL_ATTRIBUTE) || element.hasAttribute("data-harnessmix-model-control") || !element.matches('button[aria-haspopup="menu"]')) {
21809
21835
  return false;
21810
21836
  }
21811
21837
  if (element.getAttribute("data-codex-intelligence-trigger") === "true" && element.getAttribute("data-composer-navigation-target") === "reasoning") {
@@ -21826,7 +21852,7 @@ ${error51.stderrTail}`] : []
21826
21852
  return false;
21827
21853
  }
21828
21854
  function isNativePermissionModeControlCandidate(element) {
21829
- if (element.hasAttribute(CONTROL_ATTRIBUTE) || element.hasAttribute("data-codexhost-permission-mode-control") || !element.matches('button[aria-haspopup="menu"][data-composer-navigation-target="permissions"]')) {
21855
+ if (element.hasAttribute(CONTROL_ATTRIBUTE) || element.hasAttribute("data-harnessmix-permission-mode-control") || !element.matches('button[aria-haspopup="menu"][data-composer-navigation-target="permissions"]')) {
21830
21856
  return false;
21831
21857
  }
21832
21858
  const fiberName = Object.getOwnPropertyNames(element).find(
@@ -21855,7 +21881,7 @@ ${error51.stderrTail}`] : []
21855
21881
  ...composer.querySelectorAll(
21856
21882
  'button[aria-haspopup="menu"][data-composer-navigation-target="permissions"]'
21857
21883
  )
21858
- ].filter((element) => !element.hasAttribute("data-codexhost-permission-mode-control"));
21884
+ ].filter((element) => !element.hasAttribute("data-harnessmix-permission-mode-control"));
21859
21885
  return candidates.length === 1 ? candidates[0] ?? null : null;
21860
21886
  }
21861
21887
  function nativePermissionModeControlForComposer(composer) {
@@ -21869,7 +21895,7 @@ ${error51.stderrTail}`] : []
21869
21895
  return candidates.length === 1 ? candidates[0] ?? null : null;
21870
21896
  }
21871
21897
  function isNativeContextUsageControlCandidate(element) {
21872
- if (element.hasAttribute("data-codexhost-usage-control") || element.hasAttribute("data-codexhost-credits-control")) {
21898
+ if (element.hasAttribute("data-harnessmix-usage-control") || element.hasAttribute("data-harnessmix-credits-control")) {
21873
21899
  return false;
21874
21900
  }
21875
21901
  return element.matches('span[role="img"][aria-label]') && element.querySelectorAll("svg > circle").length === 2;
@@ -22179,21 +22205,49 @@ ${error51.stderrTail}`] : []
22179
22205
  method;
22180
22206
  code = -32601;
22181
22207
  };
22208
+ var RendererRequestTimeoutError = class extends Error {
22209
+ constructor(method, timeoutMs) {
22210
+ super(`${method} did not answer within ${timeoutMs} ms`, { cause: void 0 });
22211
+ this.method = method;
22212
+ this.timeoutMs = timeoutMs;
22213
+ this.name = "RendererRequestTimeoutError";
22214
+ }
22215
+ method;
22216
+ timeoutMs;
22217
+ code = -32098;
22218
+ };
22219
+ var RENDERER_REQUEST_TIMEOUT_DEFAULT_MS = 2e4;
22182
22220
  function isUnsupportedMethod(error51, method) {
22183
22221
  if (typeof error51 !== "object" || error51 === null) return false;
22184
22222
  const code = "code" in error51 ? error51.code : void 0;
22185
22223
  const message = "message" in error51 ? error51.message : void 0;
22186
22224
  return code === -32601 || code === -32600 && typeof message === "string" && message.startsWith(`Invalid request: unknown variant \`${method}\``);
22187
22225
  }
22188
- function createRendererRequestSender(send) {
22226
+ function createRendererRequestSender(send, options = {}) {
22189
22227
  const unsupported = /* @__PURE__ */ new Map();
22228
+ const timeoutMs = options.timeoutMs ?? RENDERER_REQUEST_TIMEOUT_DEFAULT_MS;
22190
22229
  return async (method, params) => {
22191
22230
  const known = unsupported.get(method);
22192
22231
  if (known) throw known;
22193
22232
  try {
22194
- return await send(method, params);
22233
+ const attempt = Promise.resolve(send(method, params));
22234
+ if (timeoutMs <= 0 || options.isTimeoutExempt?.(method)) return await attempt;
22235
+ let timer;
22236
+ try {
22237
+ return await Promise.race([
22238
+ attempt,
22239
+ new Promise((_resolve, reject) => {
22240
+ timer = setTimeout(
22241
+ () => reject(new RendererRequestTimeoutError(method, timeoutMs)),
22242
+ timeoutMs
22243
+ );
22244
+ })
22245
+ ]);
22246
+ } finally {
22247
+ if (timer !== void 0) clearTimeout(timer);
22248
+ }
22195
22249
  } catch (error51) {
22196
- if (!method.startsWith("codexhost/") || !isUnsupportedMethod(error51, method)) throw error51;
22250
+ if (!method.startsWith("harnessmix/") || !isUnsupportedMethod(error51, method)) throw error51;
22197
22251
  const unavailable = new RendererMethodUnavailableError(method, error51);
22198
22252
  unsupported.set(method, unavailable);
22199
22253
  throw unavailable;
@@ -22206,7 +22260,7 @@ ${error51.stderrTail}`] : []
22206
22260
  var SIDEBAR_THREAD_ROW_SELECTOR = `[${SIDEBAR_THREAD_ROW_ATTRIBUTE}]`;
22207
22261
  var SIDEBAR_THREAD_ID_ATTRIBUTE = "data-app-action-sidebar-thread-id";
22208
22262
  var SIDEBAR_THREAD_HOST_ID_ATTRIBUTE = "data-app-action-sidebar-thread-host-id";
22209
- var SIDEBAR_AGENT_ICON_ATTRIBUTE = "data-codexhost-sidebar-agent-icon";
22263
+ var SIDEBAR_AGENT_ICON_ATTRIBUTE = "data-harnessmix-sidebar-agent-icon";
22210
22264
  var OWNERSHIP_RETRY_DELAYS_MS = [100, 300, 800, 1500, 3e3];
22211
22265
  function isRecord3(value) {
22212
22266
  return typeof value === "object" && value !== null && !Array.isArray(value);
@@ -22232,22 +22286,23 @@ ${error51.stderrTail}`] : []
22232
22286
  const fiberNames = Object.getOwnPropertyNames(element).filter(
22233
22287
  (name) => name.startsWith("__reactFiber$")
22234
22288
  );
22235
- const fiberName = fiberNames[0];
22236
- if (fiberNames.length !== 1 || !fiberName) return null;
22237
- const firstFiber2 = Object.getOwnPropertyDescriptor(element, fiberName)?.value;
22238
- if (!isRecord3(firstFiber2)) return null;
22289
+ if (fiberNames.length === 0) return null;
22239
22290
  const candidates = /* @__PURE__ */ new Set();
22240
- let fiber = firstFiber2;
22241
- for (let depth = 0; fiber && depth < 12; depth += 1) {
22242
- const props = fiber.memoizedProps;
22243
- if (isRecord3(props) && isRecord3(props.dataAttributes)) {
22244
- const dataAttributes = props.dataAttributes;
22245
- const threadId = hostThreadIdSchema.safeParse(props.conversationId);
22246
- if (threadId.success && dataAttributes[SIDEBAR_THREAD_ROW_ATTRIBUTE] === rowMarker && dataAttributes[SIDEBAR_THREAD_ID_ATTRIBUTE] === taskKey && dataAttributes[SIDEBAR_THREAD_HOST_ID_ATTRIBUTE] === hostId) {
22247
- candidates.add(threadId.data);
22291
+ for (const fiberName of fiberNames) {
22292
+ const firstFiber2 = Object.getOwnPropertyDescriptor(element, fiberName)?.value;
22293
+ if (!isRecord3(firstFiber2)) continue;
22294
+ let fiber = firstFiber2;
22295
+ for (let depth = 0; fiber && depth < 16; depth += 1) {
22296
+ const props = fiber.memoizedProps;
22297
+ if (isRecord3(props) && isRecord3(props.dataAttributes)) {
22298
+ const dataAttributes = props.dataAttributes;
22299
+ const threadId = hostThreadIdSchema.safeParse(props.conversationId);
22300
+ if (threadId.success && dataAttributes[SIDEBAR_THREAD_ROW_ATTRIBUTE] === rowMarker && dataAttributes[SIDEBAR_THREAD_ID_ATTRIBUTE] === taskKey && dataAttributes[SIDEBAR_THREAD_HOST_ID_ATTRIBUTE] === hostId) {
22301
+ candidates.add(threadId.data);
22302
+ }
22248
22303
  }
22304
+ fiber = isRecord3(fiber.return) ? fiber.return : null;
22249
22305
  }
22250
- fiber = isRecord3(fiber.return) ? fiber.return : null;
22251
22306
  }
22252
22307
  return candidates.size === 1 ? candidates.values().next().value ?? null : null;
22253
22308
  }
@@ -22855,7 +22910,7 @@ ${error51.stderrTail}`] : []
22855
22910
  } catch {
22856
22911
  }
22857
22912
  const ownership = threadOwnershipListResultSchema.parse(
22858
- await originalSend.call(manager, "codexhost/thread/ownership/list", {
22913
+ await originalSend.call(manager, "harnessmix/thread/ownership/list", {
22859
22914
  threadIds: [threadId]
22860
22915
  })
22861
22916
  );
@@ -22927,7 +22982,7 @@ ${error51.stderrTail}`] : []
22927
22982
  try {
22928
22983
  resumeQueue();
22929
22984
  } catch {
22930
- console.error("codexhost could not restore follow-up queue state after steering");
22985
+ console.error("harnessmix could not restore follow-up queue state after steering");
22931
22986
  }
22932
22987
  return { turnId: response.turn.id };
22933
22988
  }).finally(() => {
@@ -22976,11 +23031,11 @@ ${error51.stderrTail}`] : []
22976
23031
  var catalogSchema = external_exports.object({ harnesses: external_exports.array(external_exports.object({ id: external_exports.string(), name: external_exports.string(), available: external_exports.boolean(), mcp: external_exports.boolean(), skills: external_exports.boolean() })) });
22977
23032
  function createRendererIntegrationsClient(send) {
22978
23033
  return {
22979
- integrationCatalog: async () => catalogSchema.parse(await send("codexhost/integrations/catalog", {})),
22980
- listIntegrations: async (input) => snapshotSchema.parse(await send("codexhost/integrations/list", input)),
22981
- saveMcp: (input) => send("codexhost/integrations/mcp/save", input),
22982
- removeMcp: (input) => send("codexhost/integrations/mcp/remove", input),
22983
- changeSkill: (input) => send("codexhost/integrations/skill/change", input)
23034
+ integrationCatalog: async () => catalogSchema.parse(await send("harnessmix/integrations/catalog", {})),
23035
+ listIntegrations: async (input) => snapshotSchema.parse(await send("harnessmix/integrations/list", input)),
23036
+ saveMcp: (input) => send("harnessmix/integrations/mcp/save", input),
23037
+ removeMcp: (input) => send("harnessmix/integrations/mcp/remove", input),
23038
+ changeSkill: (input) => send("harnessmix/integrations/skill/change", input)
22984
23039
  };
22985
23040
  }
22986
23041
 
@@ -23005,13 +23060,13 @@ ${error51.stderrTail}`] : []
23005
23060
  return {
23006
23061
  async listSessionImportSources() {
23007
23062
  return harnessSessionImportSourcesResultSchema.parse(
23008
- await request("codexhost/harness/session-import/sources", {})
23063
+ await request("harnessmix/harness/session-import/sources", {})
23009
23064
  );
23010
23065
  },
23011
23066
  async listHarnessSessions(input) {
23012
23067
  const params = harnessSessionListParamsSchema.parse(input);
23013
23068
  return harnessSessionListResultSchema.parse(
23014
- await request("codexhost/harness/session-import/list", params)
23069
+ await request("harnessmix/harness/session-import/list", params)
23015
23070
  );
23016
23071
  },
23017
23072
  async importHarnessSession(input) {
@@ -23019,7 +23074,7 @@ ${error51.stderrTail}`] : []
23019
23074
  const key = JSON.stringify([params.harnessId, params.nativeSessionId]);
23020
23075
  const existing = pending.get(key);
23021
23076
  if (existing) return existing;
23022
- const operation = request("codexhost/harness/session-import/import", params).then((value) => harnessSessionImportResultSchema.parse(value)).finally(() => {
23077
+ const operation = request("harnessmix/harness/session-import/import", params).then((value) => harnessSessionImportResultSchema.parse(value)).finally(() => {
23023
23078
  if (pending.get(key) === operation) pending.delete(key);
23024
23079
  });
23025
23080
  pending.set(key, operation);
@@ -23031,47 +23086,48 @@ ${error51.stderrTail}`] : []
23031
23086
  // src/native-ui/renderer-extension/src/settings/pets-client.ts
23032
23087
  function createRendererPetsClient(send) {
23033
23088
  return {
23034
- catalog: async () => await send("codexhost/pets/catalog", {}),
23035
- community: async (query = {}) => await send("codexhost/pets/community", query),
23036
- preview: async (id) => await send("codexhost/pets/preview", { id }),
23037
- install: async (params) => await send("codexhost/pets/install", params),
23038
- uninstall: async (id) => await send("codexhost/pets/uninstall", { id })
23089
+ catalog: async () => await send("harnessmix/pets/catalog", {}),
23090
+ community: async (query = {}) => await send("harnessmix/pets/community", query),
23091
+ preview: async (id) => await send("harnessmix/pets/preview", { id }),
23092
+ install: async (params) => await send("harnessmix/pets/install", params),
23093
+ uninstall: async (id) => await send("harnessmix/pets/uninstall", { id })
23039
23094
  };
23040
23095
  }
23041
23096
 
23042
23097
  // src/native-ui/renderer-extension/src/renderer-model-client.ts
23043
- var HARNESS_INSPECT_METHOD = "codexhost/harness/inspect";
23044
- var HARNESS_INSTALL_METHOD = "codexhost/harness/install";
23045
- var HARNESS_PLUGIN_LIST_METHOD = "codexhost/harness/plugins/list";
23046
- var HARNESS_WEB_UI_OPEN_METHOD = "codexhost/harness/web-ui/open";
23047
- var THREAD_FORK_METHOD = "codexhost/thread/fork";
23048
- var THREAD_HARNESS_SWITCH_METHOD = "codexhost/thread/harness/switch";
23049
- var THREAD_INSPECT_METHOD = "codexhost/thread/inspect";
23050
- var HARNESS_COMMANDS_INSPECT_METHOD = "codexhost/harness/commands/inspect";
23051
- var THREAD_COMMANDS_INSPECT_METHOD = "codexhost/thread/commands/inspect";
23052
- var THREAD_COMMAND_EXECUTE_METHOD = "codexhost/thread/command/execute";
23053
- var THREAD_DELEGATE_METHOD = "codexhost/thread/delegate";
23054
- var THREAD_MESSAGE_METHOD = "codexhost/thread/message";
23055
- var THREAD_MODEL_SELECT_METHOD = "codexhost/thread/model/select";
23056
- var THREAD_THINKING_SELECT_METHOD = "codexhost/thread/thinking/select";
23057
- var THREAD_PERMISSION_MODE_SELECT_METHOD = "codexhost/thread/permission-mode/select";
23058
- var THREAD_OWNERSHIP_LIST_METHOD = "codexhost/thread/ownership/list";
23059
- var THREAD_USAGE_INSPECT_METHOD = "codexhost/thread/usage/inspect";
23060
- var THREAD_USAGE_UPDATED_METHOD = "codexhost/thread/usage/updated";
23098
+ var HARNESS_INSPECT_METHOD = "harnessmix/harness/inspect";
23099
+ var HARNESS_INSTALL_METHOD = "harnessmix/harness/install";
23100
+ var HARNESS_PLUGIN_LIST_METHOD = "harnessmix/harness/plugins/list";
23101
+ var HARNESS_WEB_UI_OPEN_METHOD = "harnessmix/harness/web-ui/open";
23102
+ var THREAD_FORK_METHOD = "harnessmix/thread/fork";
23103
+ var THREAD_HARNESS_SWITCH_METHOD = "harnessmix/thread/harness/switch";
23104
+ var THREAD_INSPECT_METHOD = "harnessmix/thread/inspect";
23105
+ var HARNESS_COMMANDS_INSPECT_METHOD = "harnessmix/harness/commands/inspect";
23106
+ var THREAD_COMMANDS_INSPECT_METHOD = "harnessmix/thread/commands/inspect";
23107
+ var THREAD_COMMAND_EXECUTE_METHOD = "harnessmix/thread/command/execute";
23108
+ var THREAD_DELEGATE_METHOD = "harnessmix/thread/delegate";
23109
+ var THREAD_MESSAGE_METHOD = "harnessmix/thread/message";
23110
+ var THREAD_MODEL_SELECT_METHOD = "harnessmix/thread/model/select";
23111
+ var THREAD_THINKING_SELECT_METHOD = "harnessmix/thread/thinking/select";
23112
+ var THREAD_PERMISSION_MODE_SELECT_METHOD = "harnessmix/thread/permission-mode/select";
23113
+ var THREAD_OWNERSHIP_LIST_METHOD = "harnessmix/thread/ownership/list";
23114
+ var THREAD_USAGE_INSPECT_METHOD = "harnessmix/thread/usage/inspect";
23115
+ var THREAD_TEAM_INSPECT_METHOD = "harnessmix/thread/team/inspect";
23116
+ var THREAD_USAGE_UPDATED_METHOD = "harnessmix/thread/usage/updated";
23061
23117
  var THREAD_TOKEN_USAGE_UPDATED_METHOD = "thread/tokenUsage/updated";
23062
- var UPDATE_CHECK_METHOD = "codexhost/update/check";
23063
- var UPDATE_START_METHOD = "codexhost/update/start";
23064
- var UPDATE_STATUS_METHOD = "codexhost/update/status";
23118
+ var UPDATE_CHECK_METHOD = "harnessmix/update/check";
23119
+ var UPDATE_START_METHOD = "harnessmix/update/start";
23120
+ var UPDATE_STATUS_METHOD = "harnessmix/update/status";
23065
23121
  var RUNTIME_VERSION_METHOD = "harness-mix/runtime/version";
23066
- var CODEX_ACCOUNT_LIST_METHOD = "codexhost/account/list";
23067
- var CODEX_ACCOUNT_REFRESH_METHOD = "codexhost/account/refresh";
23068
- var CODEX_ACCOUNT_CREATE_METHOD = "codexhost/account/create";
23069
- var CODEX_ACCOUNT_DELETE_METHOD = "codexhost/account/delete";
23070
- var CODEX_ACCOUNT_ACTIVATE_METHOD = "codexhost/account/activate";
23071
- var CODEX_ACCOUNT_LOGIN_START_METHOD = "codexhost/account/login/start";
23072
- var CODEX_ACCOUNT_LOGIN_CANCEL_METHOD = "codexhost/account/login/cancel";
23073
- var CODEX_ACCOUNT_LOGIN_COMPLETED_METHOD = "codexhost/account/login/completed";
23074
- var CODEX_ACCOUNT_RESET_CREDIT_CONSUME_METHOD = "codexhost/account/rate-limit-reset/consume";
23122
+ var CODEX_ACCOUNT_LIST_METHOD = "harnessmix/account/list";
23123
+ var CODEX_ACCOUNT_REFRESH_METHOD = "harnessmix/account/refresh";
23124
+ var CODEX_ACCOUNT_CREATE_METHOD = "harnessmix/account/create";
23125
+ var CODEX_ACCOUNT_DELETE_METHOD = "harnessmix/account/delete";
23126
+ var CODEX_ACCOUNT_ACTIVATE_METHOD = "harnessmix/account/activate";
23127
+ var CODEX_ACCOUNT_LOGIN_START_METHOD = "harnessmix/account/login/start";
23128
+ var CODEX_ACCOUNT_LOGIN_CANCEL_METHOD = "harnessmix/account/login/cancel";
23129
+ var CODEX_ACCOUNT_LOGIN_COMPLETED_METHOD = "harnessmix/account/login/completed";
23130
+ var CODEX_ACCOUNT_RESET_CREDIT_CONSUME_METHOD = "harnessmix/account/rate-limit-reset/consume";
23075
23131
  function isRecord6(value) {
23076
23132
  return typeof value === "object" && value !== null && !Array.isArray(value);
23077
23133
  }
@@ -23119,6 +23175,16 @@ ${error51.stderrTail}`] : []
23119
23175
  }
23120
23176
  };
23121
23177
  }
23178
+ var REQUEST_TIMEOUT_EXEMPT_METHODS = /* @__PURE__ */ new Set([
23179
+ HARNESS_INSTALL_METHOD,
23180
+ THREAD_FORK_METHOD,
23181
+ THREAD_HARNESS_SWITCH_METHOD,
23182
+ THREAD_COMMAND_EXECUTE_METHOD,
23183
+ THREAD_DELEGATE_METHOD,
23184
+ THREAD_MESSAGE_METHOD,
23185
+ UPDATE_START_METHOD,
23186
+ CODEX_ACCOUNT_LOGIN_START_METHOD
23187
+ ]);
23122
23188
  function createRendererModelClient(candidates) {
23123
23189
  const managers = candidates.filter(
23124
23190
  (candidate) => typeof candidate.sendRequest === "function"
@@ -23127,7 +23193,8 @@ ${error51.stderrTail}`] : []
23127
23193
  if (managers.length !== 1 || !source) return null;
23128
23194
  const manager = {
23129
23195
  sendRequest: createRendererRequestSender(
23130
- (method, params) => source.sendRequest(method, params)
23196
+ (method, params) => source.sendRequest(method, params),
23197
+ { isTimeoutExempt: (method) => REQUEST_TIMEOUT_EXEMPT_METHODS.has(method) }
23131
23198
  )
23132
23199
  };
23133
23200
  const inspectHarness = async (input) => {
@@ -23172,13 +23239,13 @@ ${error51.stderrTail}`] : []
23172
23239
  };
23173
23240
  return Object.freeze({
23174
23241
  async inspectStorage() {
23175
- return await manager.sendRequest("codexhost/storage/inspect", {});
23242
+ return await manager.sendRequest("harnessmix/storage/inspect", {});
23176
23243
  },
23177
23244
  async optimizeStorage() {
23178
- return await manager.sendRequest("codexhost/storage/optimize", {});
23245
+ return await manager.sendRequest("harnessmix/storage/optimize", {});
23179
23246
  },
23180
23247
  async listCollaborationAgents() {
23181
- const result = await manager.sendRequest("codexhost/collaboration/agents", {});
23248
+ const result = await manager.sendRequest("harnessmix/collaboration/agents", {});
23182
23249
  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");
23183
23250
  return result;
23184
23251
  },
@@ -23215,7 +23282,7 @@ ${error51.stderrTail}`] : []
23215
23282
  return result;
23216
23283
  },
23217
23284
  async loginHarnessAccount(input) {
23218
- const result = await manager.sendRequest("codexhost/harness/account/login", input);
23285
+ const result = await manager.sendRequest("harnessmix/harness/account/login", input);
23219
23286
  return result;
23220
23287
  },
23221
23288
  async listHarnessPlugins() {
@@ -23240,7 +23307,7 @@ ${error51.stderrTail}`] : []
23240
23307
  includeTurns: false
23241
23308
  });
23242
23309
  const thread = isRecord6(native) ? native.thread : null;
23243
- if (!isRecord6(thread) || thread.id !== params.threadId || typeof thread.modelProvider !== "string" || !thread.modelProvider || thread.modelProvider === "codexhost" || typeof thread.cliVersion !== "string" || !thread.cliVersion || thread.cliVersion === "codexhost") {
23310
+ if (!isRecord6(thread) || thread.id !== params.threadId || typeof thread.modelProvider !== "string" || !thread.modelProvider || thread.modelProvider === "harnessmix" || typeof thread.cliVersion !== "string" || !thread.cliVersion || thread.cliVersion === "harnessmix") {
23244
23311
  throw new Error("Native Thread response cannot establish Codex ownership");
23245
23312
  }
23246
23313
  return { owner: "codex", locked: true };
@@ -23260,6 +23327,10 @@ ${error51.stderrTail}`] : []
23260
23327
  return result;
23261
23328
  },
23262
23329
  inspectThreadUsage,
23330
+ async inspectThreadTeam(input) {
23331
+ const threadId = hostThreadIdSchema.parse(input.threadId);
23332
+ return manager.sendRequest(THREAD_TEAM_INSPECT_METHOD, { threadId, ...input.teamId ? { teamId: input.teamId } : {} });
23333
+ },
23263
23334
  subscribeThreadUsage(listener) {
23264
23335
  const notifications = notificationTarget(source);
23265
23336
  if (!notifications?.addNotificationCallback) {
@@ -23319,7 +23390,7 @@ ${error51.stderrTail}`] : []
23319
23390
  },
23320
23391
  async inspectCodexAccountUsage(input) {
23321
23392
  const result = await manager.sendRequest(
23322
- "codexhost/account/usage/inspect",
23393
+ "harnessmix/account/usage/inspect",
23323
23394
  codexAccountUsageParamsSchema.parse(input)
23324
23395
  );
23325
23396
  return codexAccountUsageResultSchema.parse(result);
@@ -23333,7 +23404,7 @@ ${error51.stderrTail}`] : []
23333
23404
  },
23334
23405
  async listHarnessAccounts() {
23335
23406
  return harnessAccountListResultSchema.parse(
23336
- await manager.sendRequest("codexhost/harness/accounts/list", {})
23407
+ await manager.sendRequest("harnessmix/harness/accounts/list", {})
23337
23408
  );
23338
23409
  },
23339
23410
  async listCodexAccounts() {
@@ -23380,7 +23451,7 @@ ${error51.stderrTail}`] : []
23380
23451
  return codexAccountLoginCancelResultSchema.parse(result);
23381
23452
  },
23382
23453
  async logoutCodexAccount() {
23383
- const result = await manager.sendRequest("codexhost/account/logout", {});
23454
+ const result = await manager.sendRequest("harnessmix/account/logout", {});
23384
23455
  return codexAccountMutationResultSchema.parse(result);
23385
23456
  },
23386
23457
  subscribeCodexAccountLogin(listener) {
@@ -23403,19 +23474,19 @@ ${error51.stderrTail}`] : []
23403
23474
  }
23404
23475
 
23405
23476
  // src/native-ui/renderer-extension/src/versioned-renderer-adapter.ts
23406
- var PI_TRANSPORT_MODEL_ID = "codexhost/pi-native";
23477
+ var PI_TRANSPORT_MODEL_ID = "harnessmix/pi-native";
23407
23478
  var PI_TRANSPORT_MODEL_PREFIX = `${PI_TRANSPORT_MODEL_ID}@`;
23408
- var CLAUDE_CODE_TRANSPORT_MODEL_ID = "codexhost/claude-code-native";
23479
+ var CLAUDE_CODE_TRANSPORT_MODEL_ID = "harnessmix/claude-code-native";
23409
23480
  var CLAUDE_CODE_TRANSPORT_MODEL_PREFIX = `${CLAUDE_CODE_TRANSPORT_MODEL_ID}@`;
23410
- var DEEPSEEK_HARNESS_TRANSPORT_MODEL_ID = "codexhost/deepseek-harness-native";
23481
+ var DEEPSEEK_HARNESS_TRANSPORT_MODEL_ID = "harnessmix/deepseek-harness-native";
23411
23482
  var DEEPSEEK_HARNESS_TRANSPORT_MODEL_PREFIX = `${DEEPSEEK_HARNESS_TRANSPORT_MODEL_ID}@`;
23412
- var OPENCODE_TRANSPORT_MODEL_ID = "codexhost/opencode-native";
23483
+ var OPENCODE_TRANSPORT_MODEL_ID = "harnessmix/opencode-native";
23413
23484
  var OPENCODE_TRANSPORT_MODEL_PREFIX = `${OPENCODE_TRANSPORT_MODEL_ID}@`;
23414
- var GROK_TRANSPORT_MODEL_ID = "codexhost/grok-native";
23485
+ var GROK_TRANSPORT_MODEL_ID = "harnessmix/grok-native";
23415
23486
  var GROK_TRANSPORT_MODEL_PREFIX = `${GROK_TRANSPORT_MODEL_ID}@`;
23416
- var OMP_TRANSPORT_MODEL_ID = "codexhost/omp-native";
23487
+ var OMP_TRANSPORT_MODEL_ID = "harnessmix/omp-native";
23417
23488
  var OMP_TRANSPORT_MODEL_PREFIX = `${OMP_TRANSPORT_MODEL_ID}@`;
23418
- var ANTIGRAVITY_TRANSPORT_MODEL_ID = "codexhost/antigravity-native";
23489
+ var ANTIGRAVITY_TRANSPORT_MODEL_ID = "harnessmix/antigravity-native";
23419
23490
  var ANTIGRAVITY_TRANSPORT_MODEL_PREFIX = `${ANTIGRAVITY_TRANSPORT_MODEL_ID}@`;
23420
23491
  function transitionRendererAdapterStatus(current, next, publish) {
23421
23492
  if (current.state === next.state && current.reason === next.reason && current.hook === next.hook) {
@@ -23885,7 +23956,7 @@ ${error51.stderrTail}`] : []
23885
23956
  async function waitForRendererDraftPrewarmPolicy(target) {
23886
23957
  const deadline = Date.now() + DRAFT_PREWARM_POLICY_WAIT_TIMEOUT_MS;
23887
23958
  while (true) {
23888
- const policy = target.__codexhostDraftPrewarmPolicyV1;
23959
+ const policy = target.__harnessmixDraftPrewarmPolicyV1;
23889
23960
  if (isDraftPrewarmPolicyReady(policy)) return policy;
23890
23961
  const remaining = deadline - Date.now();
23891
23962
  if (remaining <= 0) throw new Error("Renderer draft prewarm policy is unavailable");
@@ -23920,12 +23991,12 @@ ${error51.stderrTail}`] : []
23920
23991
  const updateStatus = (state, reason, hook) => {
23921
23992
  liveStatus.modelUpdates = modelUpdates;
23922
23993
  transitionRendererAdapterStatus(liveStatus, { state, reason, hook }, () => {
23923
- window.dispatchEvent(new CustomEvent("codexhost:renderer-adapter-status"));
23994
+ window.dispatchEvent(new CustomEvent("harnessmix:renderer-adapter-status"));
23924
23995
  });
23925
23996
  };
23926
23997
  const usageSubscription = createThreadUsageSubscriptionRelay();
23927
23998
  const requestRouteResolver = createRendererRequestRouteResolver(
23928
- () => window.__codexhostDraftPrewarmPolicyV1,
23999
+ () => window.__harnessmixDraftPrewarmPolicyV1,
23929
24000
  () => findActivePrewarmTargets(document)
23930
24001
  );
23931
24002
  const clientsByTarget = /* @__PURE__ */ new WeakMap();
@@ -23973,7 +24044,7 @@ ${error51.stderrTail}`] : []
23973
24044
  const route = currentRequestRoute();
23974
24045
  if (route?.policy.hostId === hostId)
23975
24046
  return modelClientForTargets(route.targets, route.policy);
23976
- const policy = window.__codexhostDraftPrewarmPolicyV1;
24047
+ const policy = window.__harnessmixDraftPrewarmPolicyV1;
23977
24048
  if (isDraftPrewarmPolicyReady(policy) && hasPolicyRequestTarget(policy)) return null;
23978
24049
  const targets = rendererRequestTargetsForHost(findActivePrewarmTargets(document), hostId);
23979
24050
  return modelClientForTargets(targets ?? []);
@@ -24032,7 +24103,7 @@ ${error51.stderrTail}`] : []
24032
24103
  getClient: () => modelControl,
24033
24104
  reportError: (error51) => {
24034
24105
  console.error(
24035
- "codexhost external Thread Fork failed",
24106
+ "harnessmix external Thread Fork failed",
24036
24107
  error51 instanceof Error ? error51.name : "UnknownError"
24037
24108
  );
24038
24109
  }
@@ -24092,7 +24163,7 @@ ${error51.stderrTail}`] : []
24092
24163
  };
24093
24164
  if (!captureRoutingPolicy()) {
24094
24165
  updateStatus("installing", "draft-routing-policy-unavailable", null);
24095
- const policy = window.__codexhostDraftPrewarmPolicyV1;
24166
+ const policy = window.__harnessmixDraftPrewarmPolicyV1;
24096
24167
  if (!isDraftPrewarmPolicyReady(policy) || !hasPolicyRequestTarget(policy)) {
24097
24168
  startPolicyCapture();
24098
24169
  }
@@ -24100,7 +24171,7 @@ ${error51.stderrTail}`] : []
24100
24171
  const handleRoutingPolicyChange = () => {
24101
24172
  stopPolicyRecapture();
24102
24173
  if (captureRoutingPolicy()) return;
24103
- const policy = window.__codexhostDraftPrewarmPolicyV1;
24174
+ const policy = window.__harnessmixDraftPrewarmPolicyV1;
24104
24175
  if (isDraftPrewarmPolicyReady(policy) && hasPolicyRequestTarget(policy)) {
24105
24176
  stopPolicyCapture();
24106
24177
  }
@@ -24110,7 +24181,7 @@ ${error51.stderrTail}`] : []
24110
24181
  startPolicyRecapture();
24111
24182
  }
24112
24183
  };
24113
- window.addEventListener("codexhost:draft-prewarm-policy-changed", handleRoutingPolicyChange);
24184
+ window.addEventListener("harnessmix:draft-prewarm-policy-changed", handleRoutingPolicyChange);
24114
24185
  const applyAgent = (agent, model, thinkingOptionId, permissionModeId) => {
24115
24186
  if (disposed) return false;
24116
24187
  const selection = modelSelectionForAgent(
@@ -24150,7 +24221,7 @@ ${error51.stderrTail}`] : []
24150
24221
  stopPolicyCapture();
24151
24222
  stopPolicyRecapture();
24152
24223
  window.removeEventListener(
24153
- "codexhost:draft-prewarm-policy-changed",
24224
+ "harnessmix:draft-prewarm-policy-changed",
24154
24225
  handleRoutingPolicyChange
24155
24226
  );
24156
24227
  const activeRoutingPolicy = routingPolicy;
@@ -24174,7 +24245,7 @@ ${error51.stderrTail}`] : []
24174
24245
  }
24175
24246
 
24176
24247
  // src/native-ui/renderer-extension/src/renderer-permission-mode-preference.ts
24177
- var CLAUDE_PERMISSION_MODE_PREFERENCE_KEY = "codexhost.claude-code.permission-mode.v1";
24248
+ var CLAUDE_PERMISSION_MODE_PREFERENCE_KEY = "harnessmix.claude-code.permission-mode.v1";
24178
24249
  function rendererStorage2() {
24179
24250
  try {
24180
24251
  return window.localStorage;
@@ -24713,11 +24784,11 @@ ${error51.stderrTail}`] : []
24713
24784
  const injectMentionsInto = (target) => {
24714
24785
  const perEditor = selectionsFor(target);
24715
24786
  if (!perEditor || perEditor.size === 0) return false;
24716
- const text = [...perEditor.values()].map(entryLiteral).join("");
24717
- if (!text) return false;
24787
+ const text2 = [...perEditor.values()].map(entryLiteral).join("");
24788
+ if (!text2) return false;
24718
24789
  target.focus();
24719
24790
  if (target instanceof HTMLTextAreaElement) {
24720
- target.value = `${text}${target.value}`;
24791
+ target.value = `${text2}${target.value}`;
24721
24792
  target.dispatchEvent(new Event("input", { bubbles: true }));
24722
24793
  target.dispatchEvent(new Event("change", { bubbles: true }));
24723
24794
  } else {
@@ -24728,7 +24799,7 @@ ${error51.stderrTail}`] : []
24728
24799
  selection?.removeAllRanges();
24729
24800
  selection?.addRange(fresh);
24730
24801
  document.dispatchEvent(new Event("selectionchange"));
24731
- document.execCommand("insertText", false, text);
24802
+ document.execCommand("insertText", false, text2);
24732
24803
  }
24733
24804
  perEditor.clear();
24734
24805
  syncBadges(target);
@@ -24763,8 +24834,8 @@ ${error51.stderrTail}`] : []
24763
24834
  if (!shouldSync) return;
24764
24835
  const composers = document.querySelectorAll("[data-codex-composer-root]");
24765
24836
  for (const composer of composers) {
24766
- const el = findEditorIn(composer);
24767
- if (el) syncBadges(el);
24837
+ const el2 = findEditorIn(composer);
24838
+ if (el2) syncBadges(el2);
24768
24839
  }
24769
24840
  });
24770
24841
  try {
@@ -24786,14 +24857,18 @@ ${error51.stderrTail}`] : []
24786
24857
  sync(target) {
24787
24858
  syncBadges(target);
24788
24859
  },
24860
+ prepareSubmission(composer) {
24861
+ const editorEl = findEditorIn(composer);
24862
+ return !!editorEl && injectMentionsInto(editorEl);
24863
+ },
24789
24864
  dispose() {
24790
24865
  disposed = true;
24791
24866
  close();
24792
24867
  menu.remove();
24793
24868
  style.remove();
24794
24869
  observer.disconnect();
24795
- for (const el of document.querySelectorAll("[data-harness-mix-has-mentions]")) {
24796
- el.removeAttribute("data-harness-mix-has-mentions");
24870
+ for (const el2 of document.querySelectorAll("[data-harness-mix-has-mentions]")) {
24871
+ el2.removeAttribute("data-harness-mix-has-mentions");
24797
24872
  }
24798
24873
  for (const strip of badges.values()) strip.remove();
24799
24874
  badges.clear();
@@ -24809,11 +24884,11 @@ ${error51.stderrTail}`] : []
24809
24884
  }
24810
24885
 
24811
24886
  // src/native-ui/renderer-extension/src/renderer-collab-cards.ts
24812
- function parseCollabPayload(text) {
24813
- if (!text || !text.includes("child_thread_id") && !text.includes("task_id") && !text.includes("Agent \u534F\u4F5C")) {
24887
+ function parseCollabPayload(text2) {
24888
+ if (!text2 || !text2.includes("child_thread_id") && !text2.includes("task_id") && !text2.includes("Agent \u534F\u4F5C")) {
24814
24889
  return null;
24815
24890
  }
24816
- const match = /\{[\s\S]*?"task_id"[\s\S]*?\}/.exec(text);
24891
+ const match = /\{[\s\S]*?"task_id"[\s\S]*?\}/.exec(text2);
24817
24892
  if (!match) return null;
24818
24893
  try {
24819
24894
  const parsed = JSON.parse(match[0]);
@@ -24947,12 +25022,12 @@ ${error51.stderrTail}`] : []
24947
25022
  const candidates = document.querySelectorAll(
24948
25023
  '[data-local-conversation-item-target-ids], [data-turn-key], [data-testid*="tool"], .prose, pre'
24949
25024
  );
24950
- for (const el of candidates) {
24951
- if (enhancedElements.has(el)) continue;
24952
- const text = el.textContent || "";
24953
- const payload = parseCollabPayload(text);
25025
+ for (const el2 of candidates) {
25026
+ if (enhancedElements.has(el2)) continue;
25027
+ const text2 = el2.textContent || "";
25028
+ const payload = parseCollabPayload(text2);
24954
25029
  if (payload) {
24955
- enhanceElement(el, payload);
25030
+ enhanceElement(el2, payload);
24956
25031
  }
24957
25032
  }
24958
25033
  };
@@ -24967,9 +25042,523 @@ ${error51.stderrTail}`] : []
24967
25042
  dispose() {
24968
25043
  disposed = true;
24969
25044
  observer.disconnect();
24970
- document.querySelectorAll(".harness-mix-collab-actions").forEach((el) => el.remove());
25045
+ document.querySelectorAll(".harness-mix-collab-actions").forEach((el2) => el2.remove());
25046
+ }
25047
+ };
25048
+ }
25049
+
25050
+ // src/native-ui/renderer-extension/src/renderer-team-cards.ts
25051
+ function jsonObjectAt(value, start) {
25052
+ let depth = 0, quoted = false, escaped = false;
25053
+ for (let index = start; index < value.length; index++) {
25054
+ const char = value[index];
25055
+ if (quoted) {
25056
+ if (escaped) escaped = false;
25057
+ else if (char === "\\") escaped = true;
25058
+ else if (char === '"') quoted = false;
25059
+ continue;
25060
+ }
25061
+ if (char === '"') quoted = true;
25062
+ else if (char === "{") depth++;
25063
+ else if (char === "}" && --depth === 0) return value.slice(start, index + 1);
25064
+ }
25065
+ return null;
25066
+ }
25067
+ function isTeam(value) {
25068
+ if (!value || typeof value !== "object") return false;
25069
+ const team = value;
25070
+ return typeof team.team_id === "string" && typeof team.name === "string" && Array.isArray(team.members) && Array.isArray(team.tasks) && Array.isArray(team.messages);
25071
+ }
25072
+ function parseTeamPayload(value) {
25073
+ if (!value.includes('"team_id"') || !value.includes('"members"') || !value.includes('"tasks"')) return null;
25074
+ for (let start = value.indexOf("{"); start >= 0; start = value.indexOf("{", start + 1)) {
25075
+ const candidate = jsonObjectAt(value, start);
25076
+ if (!candidate?.includes('"team_id"')) continue;
25077
+ try {
25078
+ const parsed = JSON.parse(candidate);
25079
+ if (isTeam(parsed)) return parsed;
25080
+ } catch {
25081
+ }
25082
+ }
25083
+ return null;
25084
+ }
25085
+ function parseInspection(value) {
25086
+ if (!value || typeof value !== "object") return null;
25087
+ const result = value;
25088
+ if (!isTeam(result.team) || !Array.isArray(result.snapshots)) return null;
25089
+ return { team: result.team, snapshots: result.snapshots.filter((entry) => entry && typeof entry === "object" && isTeam(entry.team)) };
25090
+ }
25091
+ var stateColor = (status) => ({ ready: "#8b8b8b", pending: "#8b8b8b", working: "#2878e3", in_progress: "#2878e3", active: "#2878e3", completed: "#1f9d68", blocked: "#c17022", failed: "#d14343", interrupted: "#c17022" })[status ?? ""] ?? "#8b8b8b";
25092
+ var stateLabel = (status) => ({ ready: "\u5C31\u7EEA", pending: "\u5F85\u5F00\u59CB", working: "\u5DE5\u4F5C\u4E2D", in_progress: "\u8FDB\u884C\u4E2D", completed: "\u5DF2\u5B8C\u6210", blocked: "\u7B49\u5F85\u4F9D\u8D56", failed: "\u5931\u8D25", interrupted: "\u5DF2\u4E2D\u65AD", active: "\u534F\u4F5C\u4E2D" })[status ?? ""] ?? status ?? "\u672A\u77E5";
25093
+ var actionLabel = (action) => ({ team_created: "\u56E2\u961F\u5EFA\u7ACB", task_assigned: "\u4EFB\u52A1\u5206\u914D", task_updated: "\u4EFB\u52A1\u66F4\u65B0", message_sent: "\u56E2\u961F\u901A\u4FE1", task_started: "\u5F00\u59CB\u6267\u884C", member_session_ready: "\u4F1A\u8BDD\u5C31\u7EEA", task_settled: "\u4EFB\u52A1\u7ED3\u7B97", task_failed: "\u4EFB\u52A1\u5931\u8D25", task_cancelled: "\u4EFB\u52A1\u53D6\u6D88", task_interrupted: "\u4EFB\u52A1\u4E2D\u65AD", task_resumed: "\u6062\u590D\u6267\u884C", task_followup: "\u7EE7\u7EED\u6267\u884C" })[action ?? ""] ?? action ?? "\u5B9E\u65F6\u72B6\u6001";
25094
+ var memberPalette = ["#3b82f6", "#f59e0b", "#10b981", "#8b5cf6", "#f97316", "#ec4899", "#14b8a6", "#6366f1"];
25095
+ var memberColor = (index) => memberPalette[index % memberPalette.length];
25096
+ function el(tag, className, css) {
25097
+ const node = document.createElement(tag);
25098
+ if (className) node.className = className;
25099
+ if (css) node.style.cssText = css;
25100
+ return node;
25101
+ }
25102
+ function text(tag, value, css) {
25103
+ const node = el(tag, void 0, css);
25104
+ node.textContent = value;
25105
+ return node;
25106
+ }
25107
+ var TEAM_STYLE = `
25108
+ .harness-mix-team-scroll{scrollbar-width:none}
25109
+ .harness-mix-team-scroll::-webkit-scrollbar{display:none}
25110
+ .harness-mix-team-workbench{container-type:inline-size}
25111
+ .harness-mix-team-body{display:grid;grid-template-columns:minmax(0,1fr) clamp(228px,24vw,300px);min-height:0;overflow:hidden}
25112
+ .harness-mix-team-lanes{display:flex;gap:16px;min-height:0;box-sizing:border-box;overflow-x:auto;overflow-y:hidden;padding:18px 16px 10px;justify-content:safe center;scroll-snap-type:x proximity}
25113
+ .harness-mix-team-lane{position:relative;flex:1 1 0;min-width:216px;max-width:300px;display:flex;flex-direction:column;min-height:0;padding-top:16px;scroll-snap-align:start}
25114
+ .harness-mix-team-lane::before{content:'';position:absolute;top:0;left:50%;height:16px;border-left:2px dashed color-mix(in srgb,currentColor 20%,transparent)}
25115
+ .harness-mix-team-lane::after{content:'';position:absolute;top:0;left:-9px;right:-9px;border-top:2px dashed color-mix(in srgb,currentColor 20%,transparent)}
25116
+ .harness-mix-team-lane:first-child::after{left:calc(50% - 1px)}
25117
+ .harness-mix-team-lane:last-child::after{right:calc(50% - 1px)}
25118
+ .harness-mix-team-lane:only-child::after{display:none}
25119
+ .harness-mix-team-task-list{display:flex;flex-direction:column;gap:6px;flex:1;min-height:0;overflow-y:auto;padding:2px 8px 8px;scrollbar-width:none}
25120
+ .harness-mix-team-task-list::-webkit-scrollbar{display:none}
25121
+ .harness-mix-team-feed{display:flex;flex-direction:column;min-height:0;min-width:0;border-left:1px solid color-mix(in srgb,currentColor 9%,transparent)}
25122
+ .harness-mix-team-feed-list{flex:1;min-height:0;overflow-y:auto;padding:0 12px 10px;scrollbar-width:thin}
25123
+ .harness-mix-team-clamp2{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
25124
+ .harness-mix-team-clickable{transition:border-color .15s ease,box-shadow .15s ease}
25125
+ .harness-mix-team-clickable:hover{border-color:color-mix(in srgb,currentColor 28%,transparent)!important;box-shadow:0 4px 14px color-mix(in srgb,#000 10%,transparent)!important}
25126
+ @container (max-width:720px){
25127
+ .harness-mix-team-body{grid-template-columns:minmax(0,1fr);grid-template-rows:minmax(0,1fr) auto}
25128
+ .harness-mix-team-feed{border-left:0;border-top:1px solid color-mix(in srgb,currentColor 9%,transparent);max-height:136px}
25129
+ }`;
25130
+ function metrics(payload) {
25131
+ const node = el("div", "harness-mix-team-metrics", "display:flex;gap:18px;align-items:center");
25132
+ const values = [[`${payload.tasks.filter((task) => task.status === "completed").length}/${payload.tasks.length}`, "\u5B8C\u6210", "#1f9d68"], [`${payload.tasks.filter((task) => task.status === "in_progress").length}`, "\u8FDB\u884C\u4E2D", "#2878e3"], [`${payload.tasks.filter((task) => task.status === "blocked").length}`, "\u7B49\u5F85", "#c17022"]];
25133
+ for (const [value, label, color] of values) {
25134
+ const item = el("span", void 0, "display:grid;justify-items:center;line-height:1.1");
25135
+ item.append(text("strong", value, `font-size:14px;color:${color}`), text("small", label, "font-size:10px;margin-top:3px;opacity:.55"));
25136
+ node.append(item);
25137
+ }
25138
+ return node;
25139
+ }
25140
+ var completionOf = (payload) => {
25141
+ const total = payload.tasks.length;
25142
+ const done = payload.tasks.filter((task) => task.status === "completed").length;
25143
+ return { done, total, pct: total ? Math.round(done / total * 100) : 0 };
25144
+ };
25145
+ function statItem(value, label, color) {
25146
+ const item = el("span", void 0, "display:grid;justify-items:center;line-height:1.1;min-width:30px");
25147
+ item.append(text("strong", value, `font-size:15px;font-weight:750;color:${color}`), text("small", label, "font-size:8.5px;margin-top:2px;opacity:.55;white-space:nowrap"));
25148
+ return item;
25149
+ }
25150
+ function headerStats(payload) {
25151
+ const items = [
25152
+ statItem(String(payload.tasks.length), "\u4EFB\u52A1\u603B\u6570", "inherit"),
25153
+ statItem(String(payload.tasks.filter((task) => task.status === "in_progress").length), "\u8FDB\u884C\u4E2D", "#2878e3"),
25154
+ statItem(String(completionOf(payload).done), "\u5DF2\u5B8C\u6210", "#1f9d68"),
25155
+ statItem(String(payload.tasks.filter((task) => task.status === "blocked" || task.status === "pending").length), "\u7B49\u5F85", "#c17022")
25156
+ ];
25157
+ const failed = payload.tasks.filter((task) => task.status === "failed").length;
25158
+ if (failed) items.push(statItem(String(failed), "\u5931\u8D25", "#d14343"));
25159
+ return items;
25160
+ }
25161
+ var pillCss = (status) => {
25162
+ const color = stateColor(status);
25163
+ return `font-size:8px;font-weight:750;padding:2px 7px;border-radius:99px;white-space:nowrap;color:${color};background:color-mix(in srgb,${color} 15%,transparent)`;
25164
+ };
25165
+ function statusPill(status) {
25166
+ return text("span", stateLabel(status), pillCss(status));
25167
+ }
25168
+ function statusDot(status, size = 7) {
25169
+ return el("span", void 0, `width:${size}px;height:${size}px;border-radius:50%;flex:none;background:${stateColor(status)}`);
25170
+ }
25171
+ function renderBoard(payload, openThread) {
25172
+ const board = el("main", "harness-mix-team-board harness-mix-team-body", "height:100%;min-height:0;color:inherit");
25173
+ const lead = payload.lead ?? { id: "lead", name: "Team Lead", role: "\u534F\u8C03\u4E0E\u9A8C\u6536", agent: "codex", display_status: "working" };
25174
+ const tasksOf = (memberId) => payload.tasks.filter((task) => task.assignee === memberId);
25175
+ const leadCard = () => {
25176
+ const button = el("button", "harness-mix-team-lead", "appearance:none;border:1px solid color-mix(in srgb,#c35b24 34%,transparent);background:color-mix(in srgb,#c35b24 7%,transparent);box-shadow:0 2px 10px color-mix(in srgb,#c35b24 10%,transparent);color:inherit;font:inherit;display:flex;align-items:center;gap:10px;padding:8px 16px;border-radius:13px;cursor:default");
25177
+ button.type = "button";
25178
+ button.dataset.agent = lead.agent;
25179
+ const childId = lead.childId ?? lead.child_thread_id;
25180
+ if (childId && openThread) {
25181
+ button.style.cursor = "pointer";
25182
+ button.classList.add("harness-mix-team-clickable");
25183
+ button.title = `\u6253\u5F00 ${lead.name} \u7684\u539F\u751F Harness \u4F1A\u8BDD`;
25184
+ button.addEventListener("click", () => void openThread(childId));
25185
+ }
25186
+ const avatar = el("span", void 0, "position:relative;display:grid;place-items:center;width:42px;height:42px;flex:none;border-radius:12px;border:2px solid color-mix(in srgb,#c35b24 45%,transparent);background:Canvas");
25187
+ avatar.append(collaborationIcon(lead.agent, lead.name, 32), text("span", "\u{1F451}", "position:absolute;top:-12px;right:-10px;font-size:13px;filter:drop-shadow(0 1px 1px rgb(0 0 0/.25))"));
25188
+ const copy = el("span", void 0, "display:grid;min-width:0;text-align:left;line-height:1.3");
25189
+ copy.append(text("span", "\u4E3B\u5BFC\u8005", "font-size:8.5px;font-weight:800;letter-spacing:.14em;color:#c35b24"), text("strong", lead.name, "font-size:13px;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap"));
25190
+ const status = el("span", void 0, "display:flex;align-items:center;gap:5px;margin-top:1px");
25191
+ status.append(statusDot(lead.display_status), text("span", stateLabel(lead.display_status), `font-size:9px;color:${stateColor(lead.display_status)}`));
25192
+ copy.append(status);
25193
+ button.append(avatar, copy);
25194
+ return button;
25195
+ };
25196
+ const memberCard = (member, index) => {
25197
+ const color = memberColor(index), assigned = tasksOf(member.id), done = assigned.filter((task) => task.status === "completed").length;
25198
+ const button = el("button", "harness-mix-team-member", "appearance:none;width:100%;box-sizing:border-box;border:1px solid color-mix(in srgb,currentColor 10%,transparent);background:color-mix(in srgb,Canvas 92%,transparent);box-shadow:0 2px 8px color-mix(in srgb,#000 6%,transparent);color:inherit;font:inherit;display:grid;grid-template-columns:40px minmax(0,1fr);align-items:center;gap:9px;padding:9px 10px;border-radius:12px;text-align:left;cursor:default");
25199
+ button.type = "button";
25200
+ button.dataset.agent = member.agent;
25201
+ const childId = member.childId ?? member.child_thread_id;
25202
+ if (childId && openThread) {
25203
+ button.style.cursor = "pointer";
25204
+ button.classList.add("harness-mix-team-clickable");
25205
+ button.title = `\u6253\u5F00 ${member.name} \u7684\u539F\u751F Harness \u4F1A\u8BDD`;
25206
+ button.addEventListener("click", () => void openThread(childId));
25207
+ }
25208
+ const avatar = el("span", void 0, `position:relative;display:grid;place-items:center;width:40px;height:40px;flex:none;border-radius:11px;border:2px solid ${color};background:Canvas`);
25209
+ avatar.append(collaborationIcon(member.agent, member.name, 30), el("span", void 0, `position:absolute;right:-4px;bottom:-4px;width:11px;height:11px;box-sizing:border-box;border-radius:50%;background:${stateColor(member.display_status)};border:2.5px solid Canvas`));
25210
+ const copy = el("span", void 0, "display:grid;min-width:0;line-height:1.25;gap:2px");
25211
+ copy.append(text("strong", member.name, "font-size:12px;font-weight:680;overflow:hidden;text-overflow:ellipsis;white-space:nowrap"));
25212
+ const status = el("span", void 0, "display:flex;align-items:center;gap:5px;min-width:0");
25213
+ status.append(text("span", stateLabel(member.display_status), `font-size:9px;color:${stateColor(member.display_status)};white-space:nowrap`), text("span", `${done}/${assigned.length}`, "font-size:9px;font-weight:650;opacity:.5;margin-left:auto"));
25214
+ copy.append(status);
25215
+ const progress = el("progress");
25216
+ progress.max = Math.max(1, assigned.length);
25217
+ progress.value = done;
25218
+ progress.style.cssText = `width:100%;height:4px;margin:0;accent-color:${color}`;
25219
+ progress.title = `${done}/${assigned.length} \u4E2A\u4EFB\u52A1\u5B8C\u6210`;
25220
+ copy.append(progress);
25221
+ button.append(avatar, copy);
25222
+ return button;
25223
+ };
25224
+ const laneOf = (member, index) => {
25225
+ const color = memberColor(index), assigned = tasksOf(member.id), done = assigned.filter((task) => task.status === "completed").length;
25226
+ const lane = el("div", "harness-mix-team-lane");
25227
+ lane.dataset.memberId = member.id;
25228
+ lane.append(memberCard(member, index));
25229
+ const column = el("div", void 0, `margin-top:9px;flex:1;min-height:0;display:flex;flex-direction:column;border-radius:12px;border:1px solid color-mix(in srgb,${color} 30%,transparent);background:color-mix(in srgb,${color} 7%,transparent)`);
25230
+ const columnHead = el("div", void 0, "display:flex;align-items:flex-start;gap:6px;padding:8px 10px 5px");
25231
+ const role = text("span", member.role, "font-size:9.5px;font-weight:650;line-height:1.35;min-width:0;opacity:.78");
25232
+ role.className = "harness-mix-team-clamp2";
25233
+ role.title = member.role;
25234
+ columnHead.append(el("span", void 0, `width:7px;height:7px;border-radius:2.5px;background:${color};flex:none;margin-top:3px`), role, text("span", `${done}/${assigned.length}`, `margin-left:auto;font-size:8.5px;font-weight:750;color:${color};background:color-mix(in srgb,${color} 15%,transparent);padding:1px 6px;border-radius:99px;white-space:nowrap`));
25235
+ column.append(columnHead);
25236
+ const list = el("div", "harness-mix-team-task-list");
25237
+ for (const task of assigned) {
25238
+ const card = el("article", "harness-mix-team-task", "display:grid;gap:5px;padding:7px 8px;border-radius:9px;border:1px solid color-mix(in srgb,currentColor 8%,transparent);background:color-mix(in srgb,Canvas 94%,transparent)");
25239
+ card.dataset.taskId = task.id;
25240
+ card.dataset.taskStatus = task.status;
25241
+ const topRow = el("div", void 0, "display:flex;align-items:center;gap:6px;min-width:0");
25242
+ const pill = statusPill(task.status);
25243
+ pill.style.marginLeft = "auto";
25244
+ topRow.append(text("span", `#${task.id}`, "font-family:ui-monospace,monospace;font-size:8px;opacity:.45;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:92px"), pill);
25245
+ const title = text("div", task.title, "font-size:10.5px;font-weight:620;line-height:1.35");
25246
+ title.className = "harness-mix-team-clamp2";
25247
+ title.title = task.title;
25248
+ card.append(topRow, title);
25249
+ if ((task.dependsOn?.length ?? 0) > 0) card.append(text("div", `\u4F9D\u8D56 ${task.dependsOn.length} \u9879\u4EFB\u52A1`, "font-size:8px;opacity:.45"));
25250
+ list.append(card);
25251
+ }
25252
+ if (!assigned.length) list.append(text("div", "\u7B49\u5F85\u4E3B\u5BFC\u8005\u5206\u914D\u4EFB\u52A1", "font-size:9px;opacity:.42;padding:10px 2px;text-align:center"));
25253
+ column.append(list);
25254
+ lane.append(column);
25255
+ return lane;
25256
+ };
25257
+ const left = el("section", void 0, "display:grid;grid-template-rows:auto minmax(0,1fr);min-width:0;min-height:0");
25258
+ const org = el("div", "harness-mix-team-org", "display:flex;flex-direction:column;align-items:center;gap:5px;padding:10px 14px 0");
25259
+ org.append(leadCard(), text("div", "\u4EFB\u52A1\u62C6\u89E3 \xB7 \u8FDB\u5EA6\u534F\u8C03 \xB7 \u8D28\u91CF\u9A8C\u6536 \xB7 \u6700\u7EC8\u4EA4\u4ED8", "font-size:8.5px;opacity:.45;letter-spacing:.04em"));
25260
+ const lanes = el("div", "harness-mix-team-lanes harness-mix-team-scroll");
25261
+ if (payload.members.length) payload.members.forEach((member, index) => lanes.append(laneOf(member, index)));
25262
+ else lanes.append(text("div", "\u5C1A\u672A\u6DFB\u52A0\u56E2\u961F\u6210\u5458\u3002", "font-size:11px;opacity:.5"));
25263
+ left.append(org, lanes);
25264
+ const feed = el("aside", "harness-mix-team-feed");
25265
+ const feedHead = el("div", void 0, "display:flex;align-items:center;gap:6px;padding:11px 12px 8px;flex:none");
25266
+ feedHead.append(text("span", "\u56E2\u961F\u52A8\u6001", "font-size:10px;font-weight:720;letter-spacing:.06em;opacity:.55"), text("span", String(payload.messages.length), "font-size:8.5px;font-weight:700;opacity:.6;background:color-mix(in srgb,currentColor 8%,transparent);border-radius:99px;padding:1px 7px"));
25267
+ const feedList = el("div", "harness-mix-team-feed-list");
25268
+ for (const message of payload.messages.slice().reverse()) {
25269
+ const item = el("article", void 0, "padding:9px 0;border-top:1px solid color-mix(in srgb,currentColor 7%,transparent)");
25270
+ const sender = message.from === "lead" ? lead : payload.members.find((member) => member.id === message.from), receiver = message.to === "lead" ? lead : payload.members.find((member) => member.id === message.to);
25271
+ const route = el("div", void 0, "display:flex;align-items:center;gap:5px;min-width:0;font-size:10.5px;font-weight:700");
25272
+ if (sender) route.append(collaborationIcon(sender.agent, sender.name, 16));
25273
+ route.append(text("span", message.fromName ?? sender?.name ?? message.from, "opacity:.75;overflow:hidden;text-overflow:ellipsis;white-space:nowrap"), text("span", "\u2192", "opacity:.4;font-weight:400"));
25274
+ if (receiver) route.append(collaborationIcon(receiver.agent, receiver.name, 16));
25275
+ route.append(text("span", message.to === "*" ? "\u5168\u4F53" : receiver?.name ?? message.to, "opacity:.75;overflow:hidden;text-overflow:ellipsis;white-space:nowrap"));
25276
+ if (message.at > 0) route.append(text("span", new Date(message.at).toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" }), "margin-left:auto;font-size:8.5px;font-weight:400;opacity:.4;flex:none"));
25277
+ item.append(route, text("div", message.body, "font-size:11px;line-height:1.5;margin-top:4px;white-space:pre-wrap;overflow-wrap:anywhere;opacity:.88"));
25278
+ feedList.append(item);
25279
+ }
25280
+ if (!payload.messages.length) feedList.append(text("div", "\u6210\u5458\u4EA4\u63A5\u3001\u5BA1\u67E5\u8BF7\u6C42\u548C\u7ED3\u679C\u4F1A\u5B9E\u65F6\u663E\u793A\u5728\u8FD9\u91CC\u3002", "font-size:10px;line-height:1.5;opacity:.45;padding:10px 0"));
25281
+ feed.append(feedHead, feedList);
25282
+ board.append(left, feed);
25283
+ return board;
25284
+ }
25285
+ function renderSummary(payload, open) {
25286
+ const panel = el("section", "harness-mix-team-panel", 'box-sizing:border-box;border:1px solid color-mix(in srgb,currentColor 12%,transparent);border-radius:14px;background:color-mix(in srgb,Canvas 90%,transparent);box-shadow:0 8px 28px color-mix(in srgb,#000 7%,transparent);backdrop-filter:blur(18px);color:inherit;font:13px/1.4 system-ui,-apple-system,"Segoe UI",sans-serif;padding:12px 14px;display:grid;gap:10px;min-width:0');
25287
+ panel.dataset.teamId = payload.team_id;
25288
+ panel.dataset.teamStatus = payload.status;
25289
+ const top = el("div", void 0, "display:flex;align-items:center;gap:12px;min-width:0");
25290
+ const identity = el("div", void 0, "display:grid;grid-template-columns:38px minmax(0,1fr);align-items:center;gap:10px;min-width:0;flex:1");
25291
+ const lead = payload.lead ?? { id: "lead", name: "Team Lead", role: "\u534F\u8C03\u4E0E\u9A8C\u6536", agent: "codex", display_status: "working" };
25292
+ const leadIcon = el("span", void 0, "position:relative;display:grid;place-items:center;width:38px;height:38px;flex:none;border:2px solid color-mix(in srgb,#c35b24 40%,transparent);border-radius:11px;background:Canvas");
25293
+ leadIcon.append(collaborationIcon(lead.agent, lead.name, 28), text("span", "\u{1F451}", "position:absolute;top:-11px;right:-9px;font-size:11px"));
25294
+ const copy = el("span", void 0, "display:grid;min-width:0;gap:1px"), eyebrow = text("span", `AGENT TEAM \xB7 ${stateLabel(payload.status)}`, `font-size:9px;font-weight:760;letter-spacing:.11em;color:${stateColor(payload.status)}`), title = text("strong", payload.name, "font-size:13px;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap");
25295
+ title.className = "harness-mix-team-name";
25296
+ const goal = text("span", payload.goal, "font-size:10px;opacity:.5;overflow:hidden;text-overflow:ellipsis;white-space:nowrap");
25297
+ goal.title = payload.goal;
25298
+ copy.append(eyebrow, title, goal);
25299
+ identity.append(leadIcon, copy);
25300
+ const button = el("button", "harness-mix-team-open", "border:1px solid color-mix(in srgb,currentColor 13%,transparent);border-radius:8px;background:color-mix(in srgb,currentColor 5%,transparent);color:inherit;font:650 11px system-ui;padding:7px 10px;cursor:pointer;white-space:nowrap");
25301
+ button.type = "button";
25302
+ button.textContent = "\u5C55\u5F00\u8BE6\u60C5";
25303
+ button.addEventListener("click", open);
25304
+ top.append(identity, metrics(payload), button);
25305
+ const members = el("div", "harness-mix-team-summary-members harness-mix-team-scroll", "display:flex;align-items:center;gap:6px;min-width:0;overflow-x:auto;padding-bottom:1px");
25306
+ payload.members.forEach((member, index) => {
25307
+ const color = memberColor(index);
25308
+ const chip = el("span", void 0, "display:grid;grid-template-columns:26px minmax(0,1fr);align-items:center;gap:7px;min-width:128px;max-width:190px;padding:5px 9px;border-radius:10px;border:1px solid color-mix(in srgb,currentColor 8%,transparent);background:color-mix(in srgb,currentColor 3%,transparent)");
25309
+ chip.title = `${member.name} \xB7 ${member.role}`;
25310
+ const icon2 = el("span", void 0, `position:relative;display:grid;place-items:center;width:26px;height:26px;flex:none;border-radius:8px;border:1.5px solid ${color};background:Canvas`);
25311
+ icon2.append(collaborationIcon(member.agent, member.name, 18), el("span", void 0, `position:absolute;right:-3px;bottom:-3px;width:8px;height:8px;box-sizing:border-box;border-radius:50%;background:${stateColor(member.display_status)};border:2px solid Canvas`));
25312
+ const label = el("span", void 0, "display:grid;min-width:0;line-height:1.2");
25313
+ label.append(text("strong", member.name, "font-size:10px;font-weight:650;overflow:hidden;text-overflow:ellipsis;white-space:nowrap"), text("span", member.role, "font-size:8.5px;opacity:.52;overflow:hidden;text-overflow:ellipsis;white-space:nowrap"), text("span", stateLabel(member.display_status), `font-size:8.5px;color:${stateColor(member.display_status)}`));
25314
+ chip.append(icon2, label);
25315
+ members.append(chip);
25316
+ });
25317
+ const completed = payload.tasks.filter((task) => task.status === "completed").length, progress = el("progress");
25318
+ progress.max = Math.max(1, payload.tasks.length);
25319
+ progress.value = completed;
25320
+ progress.style.cssText = "width:72px;height:5px;accent-color:#1f9d68;margin-left:auto;flex:none";
25321
+ progress.title = `${completed}/${payload.tasks.length} \u4E2A\u4EFB\u52A1\u5B8C\u6210`;
25322
+ members.append(progress, text("span", `${completed}/${payload.tasks.length}`, "font-size:9px;font-weight:700;opacity:.52;white-space:nowrap"));
25323
+ panel.append(top, members);
25324
+ return panel;
25325
+ }
25326
+ function installTeamCards(options = {}) {
25327
+ if (typeof document === "undefined") return { scan: () => {
25328
+ }, dispose: () => {
25329
+ } };
25330
+ const style = el("style");
25331
+ style.dataset.harnessMixTeamStyle = "true";
25332
+ style.textContent = TEAM_STYLE;
25333
+ (document.head || document.documentElement).append(style);
25334
+ let disposed = false, workbench = null, refreshTimer = null, playTimer = null, activeTimer = null;
25335
+ let activePanel = null, activeSignature = "", activeThreadId = "", activeRefreshPending = false;
25336
+ const signatures = /* @__PURE__ */ new WeakMap();
25337
+ const close = () => {
25338
+ workbench?.remove();
25339
+ workbench = null;
25340
+ if (refreshTimer) clearInterval(refreshTimer);
25341
+ refreshTimer = null;
25342
+ if (playTimer) clearInterval(playTimer);
25343
+ playTimer = null;
25344
+ };
25345
+ const open = (seed) => {
25346
+ if (workbench?.dataset.teamId === seed.team_id) {
25347
+ close();
25348
+ return;
25349
+ }
25350
+ close();
25351
+ const source = [...document.querySelectorAll(".harness-mix-team-panel")].find((node) => node.dataset.teamId === seed.team_id);
25352
+ if (!source?.parentElement) return;
25353
+ workbench = el("section", "harness-mix-team-workbench", 'box-sizing:border-box;margin:8px 0 12px;border:1px solid color-mix(in srgb,currentColor 11%,transparent);border-radius:14px;background:color-mix(in srgb,Canvas 94%,transparent);box-shadow:0 12px 34px color-mix(in srgb,#000 8%,transparent);backdrop-filter:blur(20px);color:inherit;font:13px/1.4 system-ui,-apple-system,"Segoe UI",sans-serif;display:grid;grid-template-rows:auto minmax(0,1fr);height:clamp(340px,64vh,660px);min-height:300px;overflow:hidden');
25354
+ workbench.dataset.teamId = seed.team_id;
25355
+ workbench.dataset.teamSource = source.dataset.teamSource ?? "tool";
25356
+ let current = seed, snapshots = [], index = -1;
25357
+ const header = el("header", void 0, "display:flex;align-items:center;gap:14px;flex-wrap:wrap;row-gap:8px;min-height:56px;padding:8px 14px;border-bottom:1px solid color-mix(in srgb,currentColor 9%,transparent);background:color-mix(in srgb,currentColor 2%,transparent)");
25358
+ const title = el("div", void 0, "display:grid;gap:1px;min-width:150px;max-width:min(320px,30vw)");
25359
+ const nameRow = el("div", void 0, "display:flex;align-items:center;gap:7px;min-width:0");
25360
+ const teamName = text("strong", current.name, "font-size:13px;font-weight:750;overflow:hidden;text-overflow:ellipsis;white-space:nowrap");
25361
+ teamName.className = "harness-mix-team-name";
25362
+ const teamPill = statusPill(current.status);
25363
+ nameRow.append(teamName, teamPill);
25364
+ const subtitle = text("div", current.goal, "font-size:9px;opacity:.5;overflow:hidden;text-overflow:ellipsis;white-space:nowrap");
25365
+ subtitle.title = current.goal;
25366
+ title.append(nameRow, subtitle);
25367
+ const statsWrap = el("div", void 0, "display:flex;align-items:center;gap:15px;flex-wrap:wrap");
25368
+ const progressWrap = el("div", void 0, "display:flex;align-items:center;gap:7px;flex:none");
25369
+ progressWrap.append(text("span", "\u6574\u4F53\u8FDB\u5EA6", "font-size:9px;opacity:.55;white-space:nowrap"));
25370
+ const progressBar = el("progress");
25371
+ progressBar.style.cssText = "width:92px;height:5px;accent-color:#1f9d68";
25372
+ const progressPct = text("strong", "0%", "font-size:11px;font-weight:750;color:#1f9d68;min-width:30px");
25373
+ progressWrap.append(progressBar, progressPct);
25374
+ const timeline = el("div", "harness-mix-team-timeline", "display:flex;align-items:center;gap:6px;margin-left:auto;min-width:0"), event = text("span", "\u5B9E\u65F6\u72B6\u6001", "font-size:9px;opacity:.55;min-width:60px;text-align:right"), range = el("input");
25375
+ range.type = "range";
25376
+ range.min = "0";
25377
+ range.max = "0";
25378
+ range.value = "0";
25379
+ range.style.cssText = "width:min(120px,16vw);accent-color:#2878e3";
25380
+ const live = el("button", void 0, "border:1px solid color-mix(in srgb,currentColor 15%,transparent);border-radius:7px;background:transparent;color:inherit;font:600 10px system-ui;padding:5px 7px;cursor:pointer");
25381
+ live.type = "button";
25382
+ live.textContent = "\u5B9E\u65F6";
25383
+ const play = el("button", void 0, "border:1px solid color-mix(in srgb,currentColor 15%,transparent);border-radius:7px;background:color-mix(in srgb,currentColor 6%,transparent);color:inherit;font:600 10px system-ui;padding:5px 8px;cursor:pointer");
25384
+ play.type = "button";
25385
+ play.textContent = "\u56DE\u653E";
25386
+ const collapse = el("button", "harness-mix-team-back", "border:0;background:transparent;color:inherit;font:650 10px system-ui;cursor:pointer;padding:6px 7px;opacity:.68");
25387
+ collapse.type = "button";
25388
+ collapse.textContent = "\u6536\u8D77\u8BE6\u60C5";
25389
+ collapse.addEventListener("click", close);
25390
+ timeline.append(event, range, live, play, collapse);
25391
+ header.append(title, statsWrap, progressWrap, timeline);
25392
+ const content = el("div", void 0, "min-height:0");
25393
+ workbench.append(header, content);
25394
+ source.after(workbench);
25395
+ const render = () => {
25396
+ const snapshot = index >= 0 ? snapshots[index] : void 0;
25397
+ const visible = snapshot?.team ?? current;
25398
+ content.replaceChildren(renderBoard(visible, async (threadId) => {
25399
+ close();
25400
+ await options.openThread?.(threadId);
25401
+ }));
25402
+ teamName.textContent = visible.name;
25403
+ subtitle.textContent = visible.goal;
25404
+ subtitle.title = visible.goal;
25405
+ teamPill.textContent = stateLabel(visible.status);
25406
+ teamPill.style.cssText = pillCss(visible.status);
25407
+ statsWrap.replaceChildren(...headerStats(visible));
25408
+ const completion = completionOf(visible);
25409
+ progressBar.max = Math.max(1, completion.total);
25410
+ progressBar.value = completion.done;
25411
+ progressPct.textContent = `${completion.pct}%`;
25412
+ range.max = String(Math.max(0, snapshots.length - 1));
25413
+ range.value = String(index >= 0 ? index : Math.max(0, snapshots.length - 1));
25414
+ event.textContent = snapshot ? `${actionLabel(snapshot.action)} \xB7 ${new Date(snapshot.at).toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" })}` : "\u25CF \u5B9E\u65F6\u72B6\u6001";
25415
+ };
25416
+ range.addEventListener("input", () => {
25417
+ index = Number(range.value);
25418
+ render();
25419
+ });
25420
+ live.addEventListener("click", () => {
25421
+ index = -1;
25422
+ render();
25423
+ });
25424
+ play.addEventListener("click", () => {
25425
+ if (playTimer) {
25426
+ clearInterval(playTimer);
25427
+ playTimer = null;
25428
+ play.textContent = "\u56DE\u653E";
25429
+ return;
25430
+ }
25431
+ index = index < 0 ? 0 : index;
25432
+ play.textContent = "\u6682\u505C";
25433
+ render();
25434
+ playTimer = setInterval(() => {
25435
+ if (index >= snapshots.length - 1) {
25436
+ if (playTimer) clearInterval(playTimer);
25437
+ playTimer = null;
25438
+ index = -1;
25439
+ play.textContent = "\u56DE\u653E";
25440
+ } else index++;
25441
+ render();
25442
+ }, 800);
25443
+ });
25444
+ const refresh = async () => {
25445
+ if (!options.inspectTeam || !seed.lead_thread_id || !workbench) return;
25446
+ try {
25447
+ const result = parseInspection(await options.inspectTeam(seed.lead_thread_id, seed.team_id));
25448
+ if (!result || !workbench) return;
25449
+ current = result.team;
25450
+ snapshots = result.snapshots;
25451
+ render();
25452
+ } catch {
25453
+ }
25454
+ };
25455
+ render();
25456
+ void refresh();
25457
+ refreshTimer = setInterval(() => void refresh(), 1500);
25458
+ };
25459
+ const onKey = (event) => {
25460
+ if (event.key === "Escape" && workbench) close();
25461
+ };
25462
+ document.addEventListener("keydown", onKey);
25463
+ const scan = () => {
25464
+ if (disposed) return;
25465
+ const selector = '[data-testid*="tool"], [data-turn-key], [data-local-conversation-item-target-ids], pre[data-testid*="tool"]';
25466
+ for (const candidate of document.querySelectorAll(selector)) {
25467
+ if (candidate.closest(".harness-mix-team-panel,.harness-mix-team-workbench")) continue;
25468
+ const payload = parseTeamPayload(candidate.textContent ?? "");
25469
+ if (!payload) continue;
25470
+ if ([...candidate.querySelectorAll(selector)].some((child) => parseTeamPayload(child.textContent ?? ""))) continue;
25471
+ const signature = `${payload.updated_at ?? 0}:${payload.tasks.length}:${payload.messages.length}`;
25472
+ if (signatures.get(candidate) === signature) continue;
25473
+ const panel = renderSummary(payload, () => open(payload));
25474
+ if (candidate.tagName === "PRE") {
25475
+ if (!candidate.dataset.harnessMixTeamDisplay) candidate.dataset.harnessMixTeamDisplay = candidate.style.display || "__empty__";
25476
+ candidate.style.display = "none";
25477
+ if (candidate.nextElementSibling?.classList.contains("harness-mix-team-panel")) candidate.nextElementSibling.remove();
25478
+ candidate.after(panel);
25479
+ } else {
25480
+ candidate.querySelector(":scope > .harness-mix-team-panel")?.remove();
25481
+ candidate.append(panel);
25482
+ }
25483
+ signatures.set(candidate, signature);
25484
+ }
25485
+ };
25486
+ const removeActivePanel = () => {
25487
+ if (workbench?.dataset.teamSource === "active-thread") close();
25488
+ activePanel?.remove();
25489
+ activePanel = null;
25490
+ activeSignature = "";
25491
+ activeThreadId = "";
25492
+ };
25493
+ const refreshActiveTeam = async () => {
25494
+ if (disposed || activeRefreshPending || !options.inspectTeam || !options.activeThread) return;
25495
+ const context = options.activeThread();
25496
+ if (!context?.anchor.isConnected) {
25497
+ removeActivePanel();
25498
+ return;
25499
+ }
25500
+ activeRefreshPending = true;
25501
+ try {
25502
+ const result = parseInspection(await options.inspectTeam(context.threadId));
25503
+ if (disposed) return;
25504
+ const latest = options.activeThread();
25505
+ if (!latest || latest.threadId !== context.threadId || !latest.anchor.isConnected) {
25506
+ removeActivePanel();
25507
+ return;
25508
+ }
25509
+ if (!result) {
25510
+ removeActivePanel();
25511
+ return;
25512
+ }
25513
+ const payload = result.team;
25514
+ const signature = `${context.threadId}:${payload.team_id}:${payload.updated_at ?? 0}:${payload.tasks.length}:${payload.messages.length}`;
25515
+ const inlinePanel = [...document.querySelectorAll(".harness-mix-team-panel")].find((node) => node !== activePanel && node.dataset.teamId === payload.team_id);
25516
+ if (inlinePanel) {
25517
+ removeActivePanel();
25518
+ return;
25519
+ }
25520
+ if (activePanel?.isConnected && activeSignature === signature && activeThreadId === context.threadId) return;
25521
+ const reopen = workbench?.dataset.teamId === payload.team_id && workbench.dataset.teamSource === "active-thread";
25522
+ removeActivePanel();
25523
+ activePanel = renderSummary(payload, () => open(payload));
25524
+ activePanel.classList.add("harness-mix-team-launcher");
25525
+ activePanel.dataset.teamSource = "active-thread";
25526
+ activePanel.style.cssText += ";margin:8px 16px 0;flex:none;position:relative;z-index:11";
25527
+ const parent = latest.anchor.parentElement;
25528
+ if (!parent) {
25529
+ removeActivePanel();
25530
+ return;
25531
+ }
25532
+ parent.insertBefore(activePanel, latest.anchor);
25533
+ activeSignature = signature;
25534
+ activeThreadId = context.threadId;
25535
+ if (reopen) open(payload);
25536
+ } catch {
25537
+ removeActivePanel();
25538
+ } finally {
25539
+ activeRefreshPending = false;
24971
25540
  }
24972
25541
  };
25542
+ const observer = new MutationObserver(scan);
25543
+ observer.observe(document.body || document.documentElement, { childList: true, subtree: true, characterData: true });
25544
+ scan();
25545
+ void refreshActiveTeam();
25546
+ activeTimer = setInterval(() => void refreshActiveTeam(), 1500);
25547
+ return { scan, close, dispose() {
25548
+ disposed = true;
25549
+ observer.disconnect();
25550
+ if (activeTimer) clearInterval(activeTimer);
25551
+ activeTimer = null;
25552
+ removeActivePanel();
25553
+ close();
25554
+ style.remove();
25555
+ document.removeEventListener("keydown", onKey);
25556
+ document.querySelectorAll(".harness-mix-team-panel").forEach((node) => node.remove());
25557
+ document.querySelectorAll("[data-harness-mix-team-display]").forEach((node) => {
25558
+ node.style.display = node.dataset.harnessMixTeamDisplay === "__empty__" ? "" : node.dataset.harnessMixTeamDisplay ?? "";
25559
+ delete node.dataset.harnessMixTeamDisplay;
25560
+ });
25561
+ } };
24973
25562
  }
24974
25563
 
24975
25564
  // src/native-ui/renderer-extension/src/codex-locale-adapter.ts
@@ -25382,10 +25971,10 @@ ${error51.stderrTail}`] : []
25382
25971
  return status;
25383
25972
  }
25384
25973
  function createAccessibleText(document2, message) {
25385
- const text = document2.createElement("span");
25386
- text.className = "settings-visually-hidden";
25387
- text.textContent = message;
25388
- return text;
25974
+ const text2 = document2.createElement("span");
25975
+ text2.className = "settings-visually-hidden";
25976
+ text2.textContent = message;
25977
+ return text2;
25389
25978
  }
25390
25979
  function createSessionImportSettingsPage(messages, getClient, openImportedThread) {
25391
25980
  return Object.freeze({
@@ -25901,11 +26490,11 @@ ${error51.stderrTail}`] : []
25901
26490
  root.append(paragraph);
25902
26491
  return index;
25903
26492
  }
25904
- function appendInline(document2, parent, text) {
26493
+ function appendInline(document2, parent, text2) {
25905
26494
  let lastIndex = 0;
25906
- for (const match of text.matchAll(INLINE_PATTERN)) {
26495
+ for (const match of text2.matchAll(INLINE_PATTERN)) {
25907
26496
  const index = match.index ?? 0;
25908
- if (index > lastIndex) parent.append(text.slice(lastIndex, index));
26497
+ if (index > lastIndex) parent.append(text2.slice(lastIndex, index));
25909
26498
  if (match[2] !== void 0) {
25910
26499
  const code = document2.createElement("code");
25911
26500
  code.textContent = match[2];
@@ -25929,11 +26518,11 @@ ${error51.stderrTail}`] : []
25929
26518
  }
25930
26519
  lastIndex = index + match[0].length;
25931
26520
  }
25932
- if (lastIndex < text.length) parent.append(text.slice(lastIndex));
26521
+ if (lastIndex < text2.length) parent.append(text2.slice(lastIndex));
25933
26522
  }
25934
26523
  function isSafeLink(href) {
25935
26524
  try {
25936
- const url2 = new URL(href, "https://codexhost.invalid");
26525
+ const url2 = new URL(href, "https://harnessmix.invalid");
25937
26526
  return url2.protocol === "http:" || url2.protocol === "https:";
25938
26527
  } catch {
25939
26528
  return false;
@@ -25954,37 +26543,37 @@ ${error51.stderrTail}`] : []
25954
26543
  return context.signal.aborted;
25955
26544
  } };
25956
26545
  const doc = content.ownerDocument;
25957
- const el = (tag, text = "") => {
26546
+ const el2 = (tag, text2 = "") => {
25958
26547
  const node = doc.createElement(tag);
25959
- node.textContent = text;
26548
+ node.textContent = text2;
25960
26549
  return node;
25961
26550
  };
25962
- const title = el("h2", kind === "mcp" ? "MCP" : "Skills");
25963
- const note = el("p", kind === "mcp" ? tr("\u6309 Harness \u7BA1\u7406 MCP \u670D\u52A1\u5668\u3002\u914D\u7F6E\u4F1A\u5728\u4E0B\u6B21\u6253\u5F00\u539F\u751F\u4F1A\u8BDD\u65F6\u4F20\u5165\u3002", "Manage MCP servers per Harness. Configuration is passed to the next native session.") : tr("\u628A\u6280\u80FD\u6587\u4EF6\u6216\u5B8C\u6574\u6280\u80FD\u6587\u4EF6\u5939\u62D6\u5230\u8FD9\u91CC\uFF0C\u76F4\u63A5\u5B89\u88C5\u5230\u539F\u751F\u6280\u80FD\u76EE\u5F55\u3002", "Drop a skill file or a complete skill folder here to install it in the native skill directory."));
26551
+ const title = el2("h2", kind === "mcp" ? "MCP" : "Skills");
26552
+ const note = el2("p", kind === "mcp" ? tr("\u6309 Harness \u7BA1\u7406 MCP \u670D\u52A1\u5668\u3002\u914D\u7F6E\u4F1A\u5728\u4E0B\u6B21\u6253\u5F00\u539F\u751F\u4F1A\u8BDD\u65F6\u4F20\u5165\u3002", "Manage MCP servers per Harness. Configuration is passed to the next native session.") : tr("\u628A\u6280\u80FD\u6587\u4EF6\u6216\u5B8C\u6574\u6280\u80FD\u6587\u4EF6\u5939\u62D6\u5230\u8FD9\u91CC\uFF0C\u76F4\u63A5\u5B89\u88C5\u5230\u539F\u751F\u6280\u80FD\u76EE\u5F55\u3002", "Drop a skill file or a complete skill folder here to install it in the native skill directory."));
25964
26553
  note.className = "settings-page-description";
25965
- const controls = el("div");
26554
+ const controls = el2("div");
25966
26555
  controls.className = "settings-integrations-controls";
25967
- const harness = el("select");
26556
+ const harness = el2("select");
25968
26557
  harness.setAttribute("aria-label", "Harness");
25969
- const level = el("select");
26558
+ const level = el2("select");
25970
26559
  level.setAttribute("aria-label", tr("\u4F5C\u7528\u8303\u56F4", "Scope"));
25971
26560
  for (const [value, label] of [["global", tr("\u5168\u5C40", "Global")], ["project", tr("\u9879\u76EE", "Project")]]) {
25972
- const option = el("option", label);
26561
+ const option = el2("option", label);
25973
26562
  option.value = value;
25974
26563
  level.append(option);
25975
26564
  }
25976
- const cwd = el("input");
26565
+ const cwd = el2("input");
25977
26566
  cwd.placeholder = tr("\u9879\u76EE\u7EDD\u5BF9\u8DEF\u5F84", "Absolute project path");
25978
26567
  cwd.setAttribute("aria-label", cwd.placeholder);
25979
26568
  cwd.hidden = true;
25980
- const refreshButton = el("button", tr("\u5237\u65B0", "Refresh"));
26569
+ const refreshButton = el2("button", tr("\u5237\u65B0", "Refresh"));
25981
26570
  refreshButton.type = "button";
25982
26571
  refreshButton.className = "settings-command-button settings-command-button--secondary";
25983
- const status = el("p");
26572
+ const status = el2("p");
25984
26573
  status.className = "settings-integrations-status";
25985
26574
  status.setAttribute("role", "status");
25986
26575
  status.setAttribute("aria-live", "polite");
25987
- const body = el("div");
26576
+ const body = el2("div");
25988
26577
  body.className = "settings-integrations-body";
25989
26578
  let busy = false;
25990
26579
  const selectedScope = () => ({ harnessId: harness.value, scope: level.value === "project" ? "project" : "global", ...level.value === "project" ? { cwd: cwd.value.trim() } : {} });
@@ -26003,7 +26592,7 @@ ${error51.stderrTail}`] : []
26003
26592
  for (const node of content.querySelectorAll("button, input, select, textarea")) node.disabled = value || node.dataset.readonly === "true";
26004
26593
  };
26005
26594
  const button = (label, action, primary = false) => {
26006
- const node = el("button", label);
26595
+ const node = el2("button", label);
26007
26596
  node.type = "button";
26008
26597
  node.className = `settings-command-button ${primary ? "settings-command-button--primary" : "settings-command-button--secondary"}`;
26009
26598
  node.addEventListener("click", action, { signal: lifecycle.signal });
@@ -26097,7 +26686,7 @@ ${error51.stderrTail}`] : []
26097
26686
  return { name, files };
26098
26687
  };
26099
26688
  const field = (form, label, node) => {
26100
- const wrap = el("label", label);
26689
+ const wrap = el2("label", label);
26101
26690
  wrap.className = "settings-integrations-field";
26102
26691
  wrap.append(node);
26103
26692
  form.append(wrap);
@@ -26133,15 +26722,15 @@ ${error51.stderrTail}`] : []
26133
26722
  };
26134
26723
  };
26135
26724
  const renderMcp = (snapshot) => {
26136
- const toolbar = el("div");
26725
+ const toolbar = el2("div");
26137
26726
  toolbar.className = "settings-integrations-toolbar";
26138
- const search = el("input");
26727
+ const search = el2("input");
26139
26728
  search.type = "search";
26140
26729
  search.placeholder = tr("\u641C\u7D22 MCP \u670D\u52A1\u5668", "Search MCP servers");
26141
26730
  search.setAttribute("aria-label", search.placeholder);
26142
- const list = el("div");
26731
+ const list = el2("div");
26143
26732
  list.className = "settings-integrations-list";
26144
- const editor = el("div");
26733
+ const editor = el2("div");
26145
26734
  editor.className = "settings-mcp-editor";
26146
26735
  editor.hidden = true;
26147
26736
  const showList = () => {
@@ -26154,11 +26743,11 @@ ${error51.stderrTail}`] : []
26154
26743
  editor.hidden = false;
26155
26744
  list.hidden = true;
26156
26745
  toolbar.hidden = true;
26157
- const heading = el("div");
26746
+ const heading = el2("div");
26158
26747
  heading.className = "settings-integrations-editor-head";
26159
26748
  const backBtn = button(tr("\u2039 \u8FD4\u56DE", "\u2039 Back"), showList);
26160
- const title2 = el("h3", server ? tr(`\u66F4\u65B0 ${server.name} MCP`, `Update ${server.name} MCP`) : tr("\u8FDE\u63A5\u81F3\u81EA\u5B9A\u4E49 MCP", "Connect to a custom MCP"));
26161
- const docsLink = el("a", tr("\u6587\u6863 \u2197", "Docs \u2197"));
26749
+ const title2 = el2("h3", server ? tr(`\u66F4\u65B0 ${server.name} MCP`, `Update ${server.name} MCP`) : tr("\u8FDE\u63A5\u81F3\u81EA\u5B9A\u4E49 MCP", "Connect to a custom MCP"));
26750
+ const docsLink = el2("a", tr("\u6587\u6863 \u2197", "Docs \u2197"));
26162
26751
  docsLink.href = "https://modelcontextprotocol.io/introduction";
26163
26752
  docsLink.target = "_blank";
26164
26753
  docsLink.rel = "noreferrer noopener";
@@ -26175,7 +26764,7 @@ ${error51.stderrTail}`] : []
26175
26764
  heading.append(uninstallBtn);
26176
26765
  }
26177
26766
  const createTrashBtn = (onRemove) => {
26178
- const btn = el("button");
26767
+ const btn = el2("button");
26179
26768
  btn.type = "button";
26180
26769
  btn.className = "settings-mcp-icon-btn";
26181
26770
  btn.setAttribute("aria-label", tr("\u79FB\u9664", "Remove"));
@@ -26185,52 +26774,52 @@ ${error51.stderrTail}`] : []
26185
26774
  return btn;
26186
26775
  };
26187
26776
  let transportType = server?.transportType === "streamable_http" || !!server?.url ? "streamable_http" : "stdio";
26188
- const form = el("form");
26777
+ const form = el2("form");
26189
26778
  form.className = "settings-integrations-form";
26190
- const basicCard = el("div");
26779
+ const basicCard = el2("div");
26191
26780
  basicCard.className = "settings-integrations-form--card";
26192
- const name = el("input");
26781
+ const name = el2("input");
26193
26782
  name.required = true;
26194
26783
  name.pattern = "[a-zA-Z0-9](?:[a-zA-Z0-9_]|-){0,63}";
26195
26784
  name.placeholder = "MCP server name";
26196
26785
  name.value = server?.name ?? "";
26197
26786
  field(basicCard, tr("\u540D\u79F0", "Name"), name);
26198
- const typeField = el("div");
26787
+ const typeField = el2("div");
26199
26788
  typeField.className = "settings-integrations-field";
26200
- typeField.append(el("span", tr("\u7C7B\u578B", "Type")));
26201
- const toggle = el("div");
26789
+ typeField.append(el2("span", tr("\u7C7B\u578B", "Type")));
26790
+ const toggle = el2("div");
26202
26791
  toggle.className = "settings-mcp-type-toggle";
26203
- const stdioBtn = el("button", "STDIO");
26792
+ const stdioBtn = el2("button", "STDIO");
26204
26793
  stdioBtn.type = "button";
26205
26794
  stdioBtn.className = "settings-mcp-type-btn";
26206
- const httpBtn = el("button", tr("\u6D41\u5F0F HTTP", "Streamable HTTP"));
26795
+ const httpBtn = el2("button", tr("\u6D41\u5F0F HTTP", "Streamable HTTP"));
26207
26796
  httpBtn.type = "button";
26208
26797
  httpBtn.className = "settings-mcp-type-btn";
26209
26798
  toggle.append(stdioBtn, httpBtn);
26210
26799
  typeField.append(toggle);
26211
26800
  basicCard.append(typeField);
26212
26801
  if (server) {
26213
- const switchNotice = el("p", tr("\u5982\u9700\u5207\u6362 MCP \u670D\u52A1\u5668\u7C7B\u578B\uFF0C\u8BF7\u5148\u5378\u8F7D\u5F53\u524D\u914D\u7F6E\u3002", "If you would like to switch MCP server type, please uninstall first."));
26802
+ const switchNotice = el2("p", tr("\u5982\u9700\u5207\u6362 MCP \u670D\u52A1\u5668\u7C7B\u578B\uFF0C\u8BF7\u5148\u5378\u8F7D\u5F53\u524D\u914D\u7F6E\u3002", "If you would like to switch MCP server type, please uninstall first."));
26214
26803
  switchNotice.className = "settings-mcp-notice";
26215
26804
  basicCard.append(switchNotice);
26216
26805
  }
26217
- const transportCard = el("div");
26806
+ const transportCard = el2("div");
26218
26807
  transportCard.className = "settings-integrations-form--card settings-mcp-transport-card";
26219
- const stdioSection = el("div");
26808
+ const stdioSection = el2("div");
26220
26809
  stdioSection.className = "settings-mcp-section";
26221
- const command = el("input");
26810
+ const command = el2("input");
26222
26811
  command.placeholder = "openai-dev-mcp serve-sqlite";
26223
26812
  command.value = server?.command ?? "";
26224
26813
  field(stdioSection, tr("\u542F\u52A8\u547D\u4EE4", "Command to launch"), command);
26225
- const argsField = el("div");
26814
+ const argsField = el2("div");
26226
26815
  argsField.className = "settings-integrations-field";
26227
- argsField.append(el("span", tr("\u53C2\u6570", "Arguments")));
26228
- const argsList = el("div");
26816
+ argsField.append(el2("span", tr("\u53C2\u6570", "Arguments")));
26817
+ const argsList = el2("div");
26229
26818
  argsList.className = "settings-mcp-args";
26230
26819
  const addArg = (value = "") => {
26231
- const row = el("div");
26820
+ const row = el2("div");
26232
26821
  row.className = "settings-mcp-arg";
26233
- const input = el("input");
26822
+ const input = el2("input");
26234
26823
  input.value = value;
26235
26824
  input.placeholder = tr("\u547D\u4EE4\u53C2\u6570", "Command argument");
26236
26825
  row.append(input, createTrashBtn(() => row.remove()));
@@ -26241,18 +26830,18 @@ ${error51.stderrTail}`] : []
26241
26830
  addArgBtn.classList.add("settings-mcp-add-arg");
26242
26831
  argsField.append(argsList, addArgBtn);
26243
26832
  stdioSection.append(argsField);
26244
- const envField = el("div");
26833
+ const envField = el2("div");
26245
26834
  envField.className = "settings-integrations-field";
26246
- envField.append(el("span", tr("\u73AF\u5883\u53D8\u91CF", "Environment variables")));
26247
- const envList = el("div");
26835
+ envField.append(el2("span", tr("\u73AF\u5883\u53D8\u91CF", "Environment variables")));
26836
+ const envList = el2("div");
26248
26837
  envList.className = "settings-mcp-args";
26249
26838
  const addEnv = (key = "", val = "") => {
26250
- const row = el("div");
26839
+ const row = el2("div");
26251
26840
  row.className = "settings-mcp-kv-row";
26252
- const keyInput = el("input");
26841
+ const keyInput = el2("input");
26253
26842
  keyInput.value = key;
26254
26843
  keyInput.placeholder = tr("\u952E", "Key");
26255
- const valInput = el("input");
26844
+ const valInput = el2("input");
26256
26845
  valInput.value = val;
26257
26846
  valInput.placeholder = tr("\u503C", "Value");
26258
26847
  row.append(keyInput, valInput, createTrashBtn(() => row.remove()));
@@ -26265,15 +26854,15 @@ ${error51.stderrTail}`] : []
26265
26854
  addEnvBtn.classList.add("settings-mcp-add-arg");
26266
26855
  envField.append(envList, addEnvBtn);
26267
26856
  stdioSection.append(envField);
26268
- const envPassField = el("div");
26857
+ const envPassField = el2("div");
26269
26858
  envPassField.className = "settings-integrations-field";
26270
- envPassField.append(el("span", tr("\u73AF\u5883\u53D8\u91CF\u4F20\u9012", "Environment variable passthrough")));
26271
- const envPassList = el("div");
26859
+ envPassField.append(el2("span", tr("\u73AF\u5883\u53D8\u91CF\u4F20\u9012", "Environment variable passthrough")));
26860
+ const envPassList = el2("div");
26272
26861
  envPassList.className = "settings-mcp-args";
26273
26862
  const addEnvPass = (value = "") => {
26274
- const row = el("div");
26863
+ const row = el2("div");
26275
26864
  row.className = "settings-mcp-arg";
26276
- const input = el("input");
26865
+ const input = el2("input");
26277
26866
  input.value = value;
26278
26867
  input.placeholder = tr("\u53D8\u91CF\u540D\uFF0C\u4F8B\u5982\uFF1AGITHUB_TOKEN", "Variable name, e.g. GITHUB_TOKEN");
26279
26868
  row.append(input, createTrashBtn(() => row.remove()));
@@ -26286,32 +26875,32 @@ ${error51.stderrTail}`] : []
26286
26875
  addEnvPassBtn.classList.add("settings-mcp-add-arg");
26287
26876
  envPassField.append(envPassList, addEnvPassBtn);
26288
26877
  stdioSection.append(envPassField);
26289
- const cwd2 = el("input");
26878
+ const cwd2 = el2("input");
26290
26879
  cwd2.placeholder = "~/code";
26291
26880
  cwd2.value = server?.cwd ?? "";
26292
26881
  field(stdioSection, tr("\u5DE5\u4F5C\u76EE\u5F55", "Working directory"), cwd2);
26293
- const httpSection = el("div");
26882
+ const httpSection = el2("div");
26294
26883
  httpSection.className = "settings-mcp-section";
26295
- const url2 = el("input");
26884
+ const url2 = el2("input");
26296
26885
  url2.placeholder = "https://mcp.example.com/mcp";
26297
26886
  url2.value = server?.url ?? "";
26298
26887
  field(httpSection, "URL", url2);
26299
- const bearerToken = el("input");
26888
+ const bearerToken = el2("input");
26300
26889
  bearerToken.placeholder = "MCP_BEARER_TOKEN";
26301
26890
  bearerToken.value = server?.bearer_token_env_var ?? "";
26302
26891
  field(httpSection, tr("Bearer \u4EE4\u724C\u73AF\u5883\u53D8\u91CF", "Bearer token env var"), bearerToken);
26303
- const headersField = el("div");
26892
+ const headersField = el2("div");
26304
26893
  headersField.className = "settings-integrations-field";
26305
- headersField.append(el("span", tr("\u6807\u5934", "Headers")));
26306
- const headersList = el("div");
26894
+ headersField.append(el2("span", tr("\u6807\u5934", "Headers")));
26895
+ const headersList = el2("div");
26307
26896
  headersList.className = "settings-mcp-args";
26308
26897
  const addHeader = (key = "", val = "") => {
26309
- const row = el("div");
26898
+ const row = el2("div");
26310
26899
  row.className = "settings-mcp-kv-row";
26311
- const keyInput = el("input");
26900
+ const keyInput = el2("input");
26312
26901
  keyInput.value = key;
26313
26902
  keyInput.placeholder = tr("\u952E", "Key");
26314
- const valInput = el("input");
26903
+ const valInput = el2("input");
26315
26904
  valInput.value = val;
26316
26905
  valInput.placeholder = tr("\u503C", "Value");
26317
26906
  row.append(keyInput, valInput, createTrashBtn(() => row.remove()));
@@ -26324,18 +26913,18 @@ ${error51.stderrTail}`] : []
26324
26913
  addHeaderBtn.classList.add("settings-mcp-add-arg");
26325
26914
  headersField.append(headersList, addHeaderBtn);
26326
26915
  httpSection.append(headersField);
26327
- const envHeadersField = el("div");
26916
+ const envHeadersField = el2("div");
26328
26917
  envHeadersField.className = "settings-integrations-field";
26329
- envHeadersField.append(el("span", tr("\u6765\u81EA\u73AF\u5883\u53D8\u91CF\u7684\u6807\u5934", "Headers from environment variables")));
26330
- const envHeadersList = el("div");
26918
+ envHeadersField.append(el2("span", tr("\u6765\u81EA\u73AF\u5883\u53D8\u91CF\u7684\u6807\u5934", "Headers from environment variables")));
26919
+ const envHeadersList = el2("div");
26331
26920
  envHeadersList.className = "settings-mcp-args";
26332
26921
  const addEnvHeader = (key = "", val = "") => {
26333
- const row = el("div");
26922
+ const row = el2("div");
26334
26923
  row.className = "settings-mcp-kv-row";
26335
- const keyInput = el("input");
26924
+ const keyInput = el2("input");
26336
26925
  keyInput.value = key;
26337
26926
  keyInput.placeholder = tr("\u6807\u5934\u540D\u79F0", "Header name");
26338
- const valInput = el("input");
26927
+ const valInput = el2("input");
26339
26928
  valInput.value = val;
26340
26929
  valInput.placeholder = tr("\u73AF\u5883\u53D8\u91CF\u540D\u79F0", "Environment variable name");
26341
26930
  row.append(keyInput, valInput, createTrashBtn(() => row.remove()));
@@ -26366,7 +26955,7 @@ ${error51.stderrTail}`] : []
26366
26955
  });
26367
26956
  updateTypeView();
26368
26957
  transportCard.append(stdioSection, httpSection);
26369
- const security = el("p", tr("\u51ED\u636E\u548C\u73AF\u5883\u53D8\u91CF\u5C06\u5728\u539F\u751F Harness \u8FD0\u884C\u73AF\u5883\u4E2D\u89E3\u6790\u4E0E\u6CE8\u5165\uFF0C\u4E0D\u4F1A\u6CC4\u9732\u5728\u5BBF\u4E3B\u8FDB\u7A0B\u4E2D\u3002", "Credentials and environment variables are resolved and injected within the native Harness environment."));
26958
+ const security = el2("p", tr("\u51ED\u636E\u548C\u73AF\u5883\u53D8\u91CF\u5C06\u5728\u539F\u751F Harness \u8FD0\u884C\u73AF\u5883\u4E2D\u89E3\u6790\u4E0E\u6CE8\u5165\uFF0C\u4E0D\u4F1A\u6CC4\u9732\u5728\u5BBF\u4E3B\u8FDB\u7A0B\u4E2D\u3002", "Credentials and environment variables are resolved and injected within the native Harness environment."));
26370
26959
  security.className = "settings-integrations-callout";
26371
26960
  const save = button(tr("\u4FDD\u5B58 MCP", "Save MCP"), () => {
26372
26961
  }, true);
@@ -26437,9 +27026,9 @@ ${error51.stderrTail}`] : []
26437
27026
  const addButton = button(tr("\uFF0B \u6DFB\u52A0 MCP", "+ Add MCP"), () => showEditor(), true);
26438
27027
  toolbar.append(search, addButton);
26439
27028
  for (const native of snapshot.native) {
26440
- const row = el("section");
27029
+ const row = el2("section");
26441
27030
  row.className = "settings-integrations-row settings-integrations-row--native";
26442
- row.append(el("strong", `${tr("\u539F\u751F\u72B6\u6001", "Native status")} \xB7 ${native.name || native.sessionId}`), el("span", native.status), el("code", native.tools.join(", ")));
27031
+ row.append(el2("strong", `${tr("\u539F\u751F\u72B6\u6001", "Native status")} \xB7 ${native.name || native.sessionId}`), el2("span", native.status), el2("code", native.tools.join(", ")));
26443
27032
  list.append(row);
26444
27033
  }
26445
27034
  const toManaged = (s, newEnabled) => ({
@@ -26459,15 +27048,15 @@ ${error51.stderrTail}`] : []
26459
27048
  });
26460
27049
  const serverRows = [];
26461
27050
  for (const server of snapshot.servers) {
26462
- const row = el("section");
27051
+ const row = el2("section");
26463
27052
  row.className = "settings-integrations-row";
26464
27053
  const isHttp = server.transportType === "streamable_http" || !!server.url;
26465
27054
  row.dataset.search = `${server.name} ${server.command || ""} ${server.url || ""}`.toLowerCase();
26466
- const detail = el("div");
27055
+ const detail = el2("div");
26467
27056
  const state = !server.effective ? tr("\u88AB\u9879\u76EE\u914D\u7F6E\u8986\u76D6", "Overridden by project") : !server.enabled ? tr("\u5DF2\u505C\u7528", "Disabled") : server.appliedSessions ? tr(`\u5DF2\u4F20\u5165 ${server.appliedSessions} \u4E2A\u4F1A\u8BDD`, `Passed to ${server.appliedSessions} sessions`) : tr("\u5DF2\u914D\u7F6E", "Configured");
26468
27057
  const typeTag = isHttp ? " [HTTP]" : "";
26469
27058
  const summary = isHttp ? server.url || "" : [server.command, ...server.args || []].filter(Boolean).join(" ");
26470
- detail.append(el("strong", `${server.name}${typeTag}`), el("p", `${server.scope === "global" ? tr("\u5168\u5C40", "Global") : tr("\u9879\u76EE", "Project")} \xB7 ${state}`), el("code", summary));
27059
+ detail.append(el2("strong", `${server.name}${typeTag}`), el2("p", `${server.scope === "global" ? tr("\u5168\u5C40", "Global") : tr("\u9879\u76EE", "Project")} \xB7 ${state}`), el2("code", summary));
26471
27060
  row.append(detail);
26472
27061
  if (server.editable) {
26473
27062
  const editBtn = button(tr("\u7F16\u8F91", "Edit"), () => showEditor(server));
@@ -26489,7 +27078,7 @@ ${error51.stderrTail}`] : []
26489
27078
  serverRows.push(row);
26490
27079
  }
26491
27080
  if (!snapshot.servers.length) {
26492
- const empty = el("div", tr("\u8FD8\u6CA1\u6709 MCP \u670D\u52A1\u5668\uFF0C\u70B9\u51FB\u201C\u6DFB\u52A0 MCP\u201D\u5F00\u59CB\u914D\u7F6E\u3002", "No MCP servers yet. Select \u201CAdd MCP\u201D to configure one."));
27081
+ const empty = el2("div", tr("\u8FD8\u6CA1\u6709 MCP \u670D\u52A1\u5668\uFF0C\u70B9\u51FB\u201C\u6DFB\u52A0 MCP\u201D\u5F00\u59CB\u914D\u7F6E\u3002", "No MCP servers yet. Select \u201CAdd MCP\u201D to configure one."));
26493
27082
  empty.className = "settings-integrations-empty";
26494
27083
  list.append(empty);
26495
27084
  }
@@ -26499,7 +27088,7 @@ ${error51.stderrTail}`] : []
26499
27088
  }, { signal: lifecycle.signal });
26500
27089
  if (!snapshot.mcpSupported) {
26501
27090
  addButton.disabled = true;
26502
- const unavailable = el("div", tr("\u6B64 Harness \u5C1A\u65E0\u5DF2\u786E\u8BA4\u7684 MCP \u914D\u7F6E\u63A5\u53E3\u3002", "This Harness has no verified MCP configuration interface."));
27091
+ const unavailable = el2("div", tr("\u6B64 Harness \u5C1A\u65E0\u5DF2\u786E\u8BA4\u7684 MCP \u914D\u7F6E\u63A5\u53E3\u3002", "This Harness has no verified MCP configuration interface."));
26503
27092
  unavailable.className = "settings-integrations-callout";
26504
27093
  list.prepend(unavailable);
26505
27094
  }
@@ -26510,17 +27099,17 @@ ${error51.stderrTail}`] : []
26510
27099
  fail(new Error(tr("\u6CA1\u6709\u5176\u4ED6\u652F\u6301 MCP \u7684\u539F\u751F Harness \u53EF\u4F9B\u540C\u6B65\u3002", "No other native Harnesses support MCP for sync.")));
26511
27100
  return;
26512
27101
  }
26513
- const modal = el("dialog");
27102
+ const modal = el2("dialog");
26514
27103
  modal.className = "settings-skills-sync-modal settings-mcp-sync-modal";
26515
- const mTitle = el("h3", tr(`\u540C\u6B65 MCP\u3010${server.name}\u3011`, `Sync MCP [${server.name}]`));
27104
+ const mTitle = el2("h3", tr(`\u540C\u6B65 MCP\u3010${server.name}\u3011`, `Sync MCP [${server.name}]`));
26516
27105
  const isHttp = server.transportType === "streamable_http" || !!server.url;
26517
27106
  const summary = isHttp ? server.url || "" : [server.command, ...server.args || []].filter(Boolean).join(" ");
26518
- const mDesc = el("p", tr(
27107
+ const mDesc = el2("p", tr(
26519
27108
  `\u4ECE ${sourceHarness.name} \u590D\u5236\u8BE5 MCP \u914D\u7F6E\uFF08${isHttp ? "HTTP" : "stdio"}\uFF1A${summary}\uFF09\u5230\u9009\u4E2D\u7684 Harness\uFF1A`,
26520
27109
  `Copy MCP configuration (${isHttp ? "HTTP" : "stdio"}: ${summary}) from ${sourceHarness.name} to selected Harnesses:`
26521
27110
  ));
26522
- const form = el("form");
26523
- const checkList = el("div");
27111
+ const form = el2("form");
27112
+ const checkList = el2("div");
26524
27113
  checkList.style.display = "grid";
26525
27114
  checkList.style.gap = "8px";
26526
27115
  checkList.style.margin = "12px 0";
@@ -26528,20 +27117,20 @@ ${error51.stderrTail}`] : []
26528
27117
  checkList.style.overflowY = "auto";
26529
27118
  const checkboxes = [];
26530
27119
  for (const h of targetHarnesses) {
26531
- const label = el("label");
27120
+ const label = el2("label");
26532
27121
  label.style.display = "flex";
26533
27122
  label.style.gap = "8px";
26534
27123
  label.style.alignItems = "center";
26535
27124
  label.style.cursor = "pointer";
26536
- const cb = el("input");
27125
+ const cb = el2("input");
26537
27126
  cb.type = "checkbox";
26538
27127
  cb.value = h.id;
26539
27128
  cb.checked = true;
26540
27129
  checkboxes.push(cb);
26541
- label.append(cb, el("span", h.name));
27130
+ label.append(cb, el2("span", h.name));
26542
27131
  checkList.append(label);
26543
27132
  }
26544
- const btnRow = el("div");
27133
+ const btnRow = el2("div");
26545
27134
  btnRow.style.display = "flex";
26546
27135
  btnRow.style.gap = "8px";
26547
27136
  btnRow.style.justifyContent = "flex-end";
@@ -26593,51 +27182,51 @@ ${error51.stderrTail}`] : []
26593
27182
  fail(new Error(tr("\u6CA1\u6709\u652F\u6301 MCP \u6CE8\u5165\u7684\u539F\u751F Harness\u3002", "No native Harnesses support MCP injection.")));
26594
27183
  return;
26595
27184
  }
26596
- const modal = el("dialog");
27185
+ const modal = el2("dialog");
26597
27186
  modal.className = "settings-mcp-distribute-modal";
26598
- const mTitle = el("h3", tr("\u65B0\u5EFA\u5E76\u6279\u91CF\u5206\u53D1 MCP", "Create & Distribute MCP"));
26599
- const mDesc = el("p", tr("\u914D\u7F6E MCP \u670D\u52A1\u5668\uFF0C\u5E76\u4E00\u6B21\u6027\u4FDD\u5B58\u5206\u53D1\u81F3\u9009\u4E2D\u7684\u6240\u6709 Harness\u3002", "Configure MCP server once and distribute to all selected Harnesses."));
26600
- const form = el("form");
27187
+ const mTitle = el2("h3", tr("\u65B0\u5EFA\u5E76\u6279\u91CF\u5206\u53D1 MCP", "Create & Distribute MCP"));
27188
+ const mDesc = el2("p", tr("\u914D\u7F6E MCP \u670D\u52A1\u5668\uFF0C\u5E76\u4E00\u6B21\u6027\u4FDD\u5B58\u5206\u53D1\u81F3\u9009\u4E2D\u7684\u6240\u6709 Harness\u3002", "Configure MCP server once and distribute to all selected Harnesses."));
27189
+ const form = el2("form");
26601
27190
  form.className = "settings-integrations-form";
26602
27191
  let transportType = "stdio";
26603
- const typeToggle = el("div");
27192
+ const typeToggle = el2("div");
26604
27193
  typeToggle.className = "settings-mcp-type-toggle";
26605
- const stdioBtn = el("button", tr("\u6807\u51C6\u8F93\u5165\u8F93\u51FA (stdio)", "Standard I/O (stdio)"));
27194
+ const stdioBtn = el2("button", tr("\u6807\u51C6\u8F93\u5165\u8F93\u51FA (stdio)", "Standard I/O (stdio)"));
26606
27195
  stdioBtn.type = "button";
26607
27196
  stdioBtn.className = "settings-mcp-type-btn";
26608
27197
  stdioBtn.dataset.active = "true";
26609
- const httpBtn = el("button", tr("\u6D41\u5F0F HTTP (SSE)", "Streamable HTTP (SSE)"));
27198
+ const httpBtn = el2("button", tr("\u6D41\u5F0F HTTP (SSE)", "Streamable HTTP (SSE)"));
26610
27199
  httpBtn.type = "button";
26611
27200
  httpBtn.className = "settings-mcp-type-btn";
26612
27201
  typeToggle.append(stdioBtn, httpBtn);
26613
- const nameInput = el("input");
27202
+ const nameInput = el2("input");
26614
27203
  nameInput.required = true;
26615
27204
  nameInput.placeholder = "my-mcp-server";
26616
27205
  nameInput.pattern = "[a-zA-Z0-9](?:[a-zA-Z0-9_]|-){0,63}";
26617
27206
  field(form, tr("MCP \u670D\u52A1\u5668\u540D\u79F0\uFF08\u5FC5\u586B\uFF09", "MCP server name (required)"), nameInput);
26618
- const typeField = el("div");
27207
+ const typeField = el2("div");
26619
27208
  typeField.className = "settings-integrations-field";
26620
- typeField.append(el("span", tr("\u4F20\u8F93\u534F\u8BAE", "Transport Protocol")), typeToggle);
27209
+ typeField.append(el2("span", tr("\u4F20\u8F93\u534F\u8BAE", "Transport Protocol")), typeToggle);
26621
27210
  form.append(typeField);
26622
- const stdioCard = el("div");
27211
+ const stdioCard = el2("div");
26623
27212
  stdioCard.className = "settings-integrations-form--card";
26624
- const cmdInput = el("input");
27213
+ const cmdInput = el2("input");
26625
27214
  cmdInput.placeholder = "npx / uvx / node / ...";
26626
27215
  field(stdioCard, tr("\u53EF\u6267\u884C\u547D\u4EE4 (Command)", "Executable Command"), cmdInput);
26627
- const argsInput = el("input");
27216
+ const argsInput = el2("input");
26628
27217
  argsInput.placeholder = "-y @modelcontextprotocol/server-filesystem D:/data";
26629
27218
  field(stdioCard, tr("\u53C2\u6570\uFF08\u7A7A\u683C\u5206\u9694\uFF0C\u652F\u6301\u5F15\u53F7\uFF09", "Arguments (space separated, quotes supported)"), argsInput);
26630
- const envInput = el("input");
27219
+ const envInput = el2("input");
26631
27220
  envInput.placeholder = "KEY1=val1, KEY2=val2";
26632
27221
  field(stdioCard, tr("\u73AF\u5883\u53D8\u91CF\uFF08\u53EF\u9009\uFF0CKEY=VAL \u9017\u53F7\u6216\u6362\u884C\u5206\u9694\uFF09", "Environment variables (optional, KEY=VAL separated)"), envInput);
26633
- const httpCard = el("div");
27222
+ const httpCard = el2("div");
26634
27223
  httpCard.className = "settings-integrations-form--card";
26635
27224
  httpCard.hidden = true;
26636
- const urlInput = el("input");
27225
+ const urlInput = el2("input");
26637
27226
  urlInput.type = "url";
26638
27227
  urlInput.placeholder = "https://mcp.example.com/sse";
26639
27228
  field(httpCard, tr("MCP \u670D\u52A1\u5668 URL", "MCP Server URL"), urlInput);
26640
- const tokenInput = el("input");
27229
+ const tokenInput = el2("input");
26641
27230
  tokenInput.placeholder = "API_KEY_ENV_NAME";
26642
27231
  field(httpCard, tr("Bearer Token \u73AF\u5883\u53D8\u91CF\u540D\uFF08\u53EF\u9009\uFF09", "Bearer token env var name (optional)"), tokenInput);
26643
27232
  stdioBtn.addEventListener("click", () => {
@@ -26655,40 +27244,40 @@ ${error51.stderrTail}`] : []
26655
27244
  httpCard.hidden = false;
26656
27245
  });
26657
27246
  form.append(stdioCard, httpCard);
26658
- const targetSection = el("div");
27247
+ const targetSection = el2("div");
26659
27248
  targetSection.className = "settings-integrations-form--card";
26660
- const targetHead = el("div");
27249
+ const targetHead = el2("div");
26661
27250
  targetHead.style.display = "flex";
26662
27251
  targetHead.style.justifyContent = "space-between";
26663
27252
  targetHead.style.alignItems = "center";
26664
27253
  targetHead.style.marginBottom = "8px";
26665
- const targetTitle = el("strong", tr("\u5206\u53D1\u76EE\u6807 Harness\uFF1A", "Target Harnesses:"));
27254
+ const targetTitle = el2("strong", tr("\u5206\u53D1\u76EE\u6807 Harness\uFF1A", "Target Harnesses:"));
26666
27255
  targetTitle.style.fontSize = "12px";
26667
- const toggleAllBtn = el("button", tr("\u5168\u9009 / \u53D6\u6D88\u5168\u9009", "Select / Deselect All"));
27256
+ const toggleAllBtn = el2("button", tr("\u5168\u9009 / \u53D6\u6D88\u5168\u9009", "Select / Deselect All"));
26668
27257
  toggleAllBtn.type = "button";
26669
27258
  toggleAllBtn.className = "settings-command-button settings-command-button--secondary";
26670
27259
  toggleAllBtn.style.fontSize = "11px";
26671
27260
  toggleAllBtn.style.padding = "3px 8px";
26672
27261
  targetHead.append(targetTitle, toggleAllBtn);
26673
27262
  targetSection.append(targetHead);
26674
- const checkList = el("div");
27263
+ const checkList = el2("div");
26675
27264
  checkList.style.display = "grid";
26676
27265
  checkList.style.gridTemplateColumns = "repeat(auto-fill, minmax(130px, 1fr))";
26677
27266
  checkList.style.gap = "8px";
26678
27267
  const checkboxes = [];
26679
27268
  for (const h of targetHarnesses) {
26680
- const label = el("label");
27269
+ const label = el2("label");
26681
27270
  label.style.display = "flex";
26682
27271
  label.style.gap = "6px";
26683
27272
  label.style.alignItems = "center";
26684
27273
  label.style.cursor = "pointer";
26685
27274
  label.style.fontSize = "12px";
26686
- const cb = el("input");
27275
+ const cb = el2("input");
26687
27276
  cb.type = "checkbox";
26688
27277
  cb.value = h.id;
26689
27278
  cb.checked = true;
26690
27279
  checkboxes.push(cb);
26691
- label.append(cb, el("span", h.name));
27280
+ label.append(cb, el2("span", h.name));
26692
27281
  checkList.append(label);
26693
27282
  }
26694
27283
  targetSection.append(checkList);
@@ -26697,7 +27286,7 @@ ${error51.stderrTail}`] : []
26697
27286
  const anyChecked = checkboxes.some((cb) => cb.checked);
26698
27287
  for (const cb of checkboxes) cb.checked = !anyChecked;
26699
27288
  });
26700
- const btnRow = el("div");
27289
+ const btnRow = el2("div");
26701
27290
  btnRow.style.display = "flex";
26702
27291
  btnRow.style.gap = "8px";
26703
27292
  btnRow.style.justifyContent = "flex-end";
@@ -26706,7 +27295,7 @@ ${error51.stderrTail}`] : []
26706
27295
  modal.close();
26707
27296
  modal.remove();
26708
27297
  });
26709
- const submitBtn = el("button", tr("\u786E\u8BA4\u5E76\u5206\u53D1", "Confirm & Distribute"));
27298
+ const submitBtn = el2("button", tr("\u786E\u8BA4\u5E76\u5206\u53D1", "Confirm & Distribute"));
26710
27299
  submitBtn.type = "submit";
26711
27300
  submitBtn.className = "settings-command-button settings-command-button--primary";
26712
27301
  btnRow.append(cancelBtn, submitBtn);
@@ -26809,26 +27398,26 @@ ${error51.stderrTail}`] : []
26809
27398
  totalNativeCount += item.snapshot.native.length;
26810
27399
  }
26811
27400
  }
26812
- const statsBar = el("div");
27401
+ const statsBar = el2("div");
26813
27402
  statsBar.className = "settings-skills-overview-stats settings-mcp-overview-stats";
26814
- const statsSummary = el("span", tr(
27403
+ const statsSummary = el2("span", tr(
26815
27404
  `\u{1F4CA} \u5171 ${items.length} \u4E2A Harness \xB7 ${supported.length} \u4E2A\u652F\u6301\u539F\u751F MCP \u6CE8\u5165 \xB7 \u5DF2\u914D\u7F6E ${uniqueServers.size} \u79CD\u72EC\u7ACB MCP\uFF08\u5171 ${totalServersCount} \u4E2A\u5B9E\u4F8B\uFF09${totalNativeCount ? ` \xB7 ${totalNativeCount} \u4E2A\u6D3B\u8DC3\u539F\u751F\u8FDE\u63A5` : ""}`,
26816
27405
  `\u{1F4CA} ${items.length} Harnesses \xB7 ${supported.length} with native MCP injection \xB7 ${uniqueServers.size} unique MCPs (${totalServersCount} instances)${totalNativeCount ? ` \xB7 ${totalNativeCount} active native connections` : ""}`
26817
27406
  ));
26818
27407
  statsBar.append(statsSummary);
26819
- const toolbar = el("div");
27408
+ const toolbar = el2("div");
26820
27409
  toolbar.className = "settings-integrations-toolbar";
26821
- const searchInput = el("input");
27410
+ const searchInput = el2("input");
26822
27411
  searchInput.type = "search";
26823
27412
  searchInput.placeholder = tr("\u6309\u540D\u79F0\u3001\u547D\u4EE4\u6216 URL \u8FC7\u6EE4 MCP \u670D\u52A1\u5668\u2026", "Filter MCP servers by name, command, or URL\u2026");
26824
27413
  searchInput.setAttribute("aria-label", searchInput.placeholder);
26825
- const tabsWrap = el("div");
27414
+ const tabsWrap = el2("div");
26826
27415
  tabsWrap.className = "settings-skills-tabs settings-mcp-tabs";
26827
- const btnByHarness = el("button", tr("\u6309 Harness \u67E5\u770B", "By Harness"));
27416
+ const btnByHarness = el2("button", tr("\u6309 Harness \u67E5\u770B", "By Harness"));
26828
27417
  btnByHarness.type = "button";
26829
27418
  btnByHarness.className = "settings-skills-tab-btn";
26830
27419
  btnByHarness.dataset.active = "true";
26831
- const btnByServer = el("button", tr("\u6309 Server \u6C47\u603B", "By Server"));
27420
+ const btnByServer = el2("button", tr("\u6309 Server \u6C47\u603B", "By Server"));
26832
27421
  btnByServer.type = "button";
26833
27422
  btnByServer.className = "settings-skills-tab-btn";
26834
27423
  tabsWrap.append(btnByHarness, btnByServer);
@@ -26836,14 +27425,14 @@ ${error51.stderrTail}`] : []
26836
27425
  showMcpDistributeDialog(supported.map((i) => i.harness));
26837
27426
  }, true);
26838
27427
  toolbar.append(searchInput, tabsWrap, distributeBtn);
26839
- const viewsContainer = el("div");
27428
+ const viewsContainer = el2("div");
26840
27429
  viewsContainer.className = "settings-skills-views settings-mcp-views";
26841
27430
  let activeTab = "harness";
26842
27431
  const updateView = () => {
26843
27432
  viewsContainer.replaceChildren();
26844
27433
  const query = searchInput.value.trim().toLowerCase();
26845
27434
  if (activeTab === "harness") {
26846
- const grid = el("div");
27435
+ const grid = el2("div");
26847
27436
  grid.className = "settings-skills-overview-grid settings-mcp-overview-grid";
26848
27437
  for (const item of items) {
26849
27438
  const allServers = item.snapshot?.servers || [];
@@ -26857,70 +27446,70 @@ ${error51.stderrTail}`] : []
26857
27446
  if (query && !item.harness.name.toLowerCase().includes(query) && matchingServers.length === 0 && matchingNative.length === 0) {
26858
27447
  continue;
26859
27448
  }
26860
- const card = el("section");
27449
+ const card = el2("section");
26861
27450
  card.className = "settings-skills-harness-card settings-mcp-harness-card";
26862
- const head = el("div");
27451
+ const head = el2("div");
26863
27452
  head.className = "settings-skills-harness-head settings-mcp-harness-head";
26864
- const hTitle = el("strong", item.harness.name);
26865
- const badge = el("span");
27453
+ const hTitle = el2("strong", item.harness.name);
27454
+ const badge = el2("span");
26866
27455
  badge.className = `settings-skills-badge ${item.harness.mcp ? "settings-skills-badge--active" : ""}`;
26867
27456
  badge.textContent = item.harness.mcp ? tr(`${allServers.length} \u4E2A MCP`, `${allServers.length} MCPs`) : tr("\u672A\u63D0\u4F9B MCP \u63A5\u53E3", "No native MCP interface");
26868
27457
  head.append(hTitle, badge);
26869
27458
  card.append(head);
26870
27459
  if (!item.harness.mcp) {
26871
- const note2 = el("p", tr("\u6B64 Harness \u5C1A\u65E0\u5DF2\u786E\u8BA4\u7684 MCP \u914D\u7F6E\u63A5\u53E3\u3002", "This Harness has no verified MCP configuration interface."));
27460
+ const note2 = el2("p", tr("\u6B64 Harness \u5C1A\u65E0\u5DF2\u786E\u8BA4\u7684 MCP \u914D\u7F6E\u63A5\u53E3\u3002", "This Harness has no verified MCP configuration interface."));
26872
27461
  note2.className = "settings-mcp-notice";
26873
27462
  card.append(note2);
26874
27463
  } else if (item.error) {
26875
- const errNote = el("p", item.error);
27464
+ const errNote = el2("p", item.error);
26876
27465
  errNote.className = "settings-mcp-notice";
26877
27466
  errNote.style.color = "#ef4444";
26878
27467
  card.append(errNote);
26879
27468
  } else {
26880
27469
  if (matchingNative.length > 0) {
26881
- const nativeBox = el("div");
27470
+ const nativeBox = el2("div");
26882
27471
  nativeBox.className = "settings-mcp-native-box";
26883
- const nativeTitle = el("div");
27472
+ const nativeTitle = el2("div");
26884
27473
  nativeTitle.className = "settings-mcp-native-title";
26885
27474
  nativeTitle.textContent = tr(`\u{1F7E2} \u539F\u751F\u8FD0\u884C\u65F6\u6D3B\u8DC3 (${matchingNative.length})`, `\u{1F7E2} Active Native Sessions (${matchingNative.length})`);
26886
27475
  nativeBox.append(nativeTitle);
26887
27476
  for (const n of matchingNative) {
26888
- const nRow = el("div");
27477
+ const nRow = el2("div");
26889
27478
  nRow.className = "settings-mcp-native-item";
26890
- const nHeader = el("div");
27479
+ const nHeader = el2("div");
26891
27480
  nHeader.append(
26892
- el("strong", n.name || n.sessionId),
26893
- el("span", ` \xB7 ${n.status}${n.tools?.length ? ` \xB7 ${n.tools.length} ${tr("\u5DE5\u5177", "tools")}` : ""}`)
27481
+ el2("strong", n.name || n.sessionId),
27482
+ el2("span", ` \xB7 ${n.status}${n.tools?.length ? ` \xB7 ${n.tools.length} ${tr("\u5DE5\u5177", "tools")}` : ""}`)
26894
27483
  );
26895
27484
  nRow.append(nHeader);
26896
27485
  if (n.tools?.length) {
26897
27486
  const toolPreview = n.tools.slice(0, 4).join(", ") + (n.tools.length > 4 ? ` +${n.tools.length - 4}` : "");
26898
- nRow.append(el("code", toolPreview));
27487
+ nRow.append(el2("code", toolPreview));
26899
27488
  }
26900
27489
  nativeBox.append(nRow);
26901
27490
  }
26902
27491
  card.append(nativeBox);
26903
27492
  }
26904
27493
  if (matchingServers.length === 0) {
26905
- const empty = el("p", query ? tr("\u65E0\u5339\u914D MCP \u670D\u52A1\u5668", "No matching MCP servers") : tr("\u6682\u672A\u914D\u7F6E MCP \u670D\u52A1\u5668", "No MCP servers configured"));
27494
+ const empty = el2("p", query ? tr("\u65E0\u5339\u914D MCP \u670D\u52A1\u5668", "No matching MCP servers") : tr("\u6682\u672A\u914D\u7F6E MCP \u670D\u52A1\u5668", "No MCP servers configured"));
26906
27495
  empty.className = "settings-mcp-notice";
26907
27496
  card.append(empty);
26908
27497
  } else {
26909
- const list = el("div");
27498
+ const list = el2("div");
26910
27499
  list.className = "settings-skills-list-compact settings-mcp-list-compact";
26911
27500
  for (const s of matchingServers) {
26912
- const row = el("div");
27501
+ const row = el2("div");
26913
27502
  row.className = "settings-skills-item-row settings-mcp-item-row";
26914
27503
  const isHttp = s.transportType === "streamable_http" || !!s.url;
26915
27504
  const summary = isHttp ? s.url || "" : [s.command, ...s.args || []].filter(Boolean).join(" ");
26916
27505
  const stateText = !s.effective ? tr(" \xB7 \u88AB\u9879\u76EE\u8986\u76D6", " \xB7 Overridden") : !s.enabled ? tr(" \xB7 \u5DF2\u505C\u7528", " \xB7 Disabled") : s.appliedSessions ? tr(` \xB7 \u4F20\u5165 ${s.appliedSessions} \u4F1A\u8BDD`, ` \xB7 ${s.appliedSessions} sessions`) : tr(" \xB7 \u5DF2\u914D\u7F6E", " \xB7 Configured");
26917
- const info = el("div");
27506
+ const info = el2("div");
26918
27507
  info.append(
26919
- el("strong", `${s.name}${isHttp ? " [HTTP]" : " [stdio]"}`),
26920
- el("span", stateText),
26921
- el("code", summary)
27508
+ el2("strong", `${s.name}${isHttp ? " [HTTP]" : " [stdio]"}`),
27509
+ el2("span", stateText),
27510
+ el2("code", summary)
26922
27511
  );
26923
- const actions = el("div");
27512
+ const actions = el2("div");
26924
27513
  actions.className = "settings-skills-item-actions settings-mcp-item-actions";
26925
27514
  actions.append(button(s.enabled ? tr("\u505C\u7528", "Disable") : tr("\u542F\u7528", "Enable"), () => {
26926
27515
  void mutateCustom(async (c) => {
@@ -26952,7 +27541,7 @@ ${error51.stderrTail}`] : []
26952
27541
  }
26953
27542
  card.append(list);
26954
27543
  }
26955
- const cardFooter = el("div");
27544
+ const cardFooter = el2("div");
26956
27545
  cardFooter.className = "settings-mcp-card-footer";
26957
27546
  const addBtn = button(tr("\uFF0B \u6DFB\u52A0 MCP", "\uFF0B Add MCP"), () => {
26958
27547
  editInHarness(item.harness.id, "__new__");
@@ -26964,7 +27553,7 @@ ${error51.stderrTail}`] : []
26964
27553
  }
26965
27554
  viewsContainer.append(grid);
26966
27555
  } else {
26967
- const matrixList = el("div");
27556
+ const matrixList = el2("div");
26968
27557
  matrixList.className = "settings-skills-matrix-list settings-mcp-matrix-list";
26969
27558
  let matchedCount = 0;
26970
27559
  for (const [serverName, installations] of uniqueServers.entries()) {
@@ -26975,38 +27564,38 @@ ${error51.stderrTail}`] : []
26975
27564
  continue;
26976
27565
  }
26977
27566
  matchedCount++;
26978
- const card = el("section");
27567
+ const card = el2("section");
26979
27568
  card.className = "settings-skills-matrix-card settings-mcp-matrix-card";
26980
- const head = el("div");
27569
+ const head = el2("div");
26981
27570
  head.className = "settings-skills-matrix-head settings-mcp-matrix-head";
26982
- const titleWrap = el("div");
27571
+ const titleWrap = el2("div");
26983
27572
  titleWrap.style.display = "flex";
26984
27573
  titleWrap.style.alignItems = "center";
26985
27574
  titleWrap.style.gap = "8px";
26986
- titleWrap.append(el("strong", serverName), el("span", `[${isHttp ? "HTTP" : "stdio"}]`));
27575
+ titleWrap.append(el2("strong", serverName), el2("span", `[${isHttp ? "HTTP" : "stdio"}]`));
26987
27576
  head.append(
26988
27577
  titleWrap,
26989
- el("span", tr(`\u5DF2\u5728 ${installations.length} \u4E2A Harness \u914D\u7F6E`, `Configured in ${installations.length} harnesses`))
27578
+ el2("span", tr(`\u5DF2\u5728 ${installations.length} \u4E2A Harness \u914D\u7F6E`, `Configured in ${installations.length} harnesses`))
26990
27579
  );
26991
- const codeSummary = el("code");
27580
+ const codeSummary = el2("code");
26992
27581
  codeSummary.style.fontSize = "11px";
26993
27582
  codeSummary.style.color = "var(--settings-muted)";
26994
27583
  codeSummary.style.overflowWrap = "anywhere";
26995
27584
  codeSummary.textContent = summary;
26996
- const tags = el("div");
27585
+ const tags = el2("div");
26997
27586
  tags.className = "settings-skills-tags settings-mcp-tags";
26998
27587
  for (const inst of installations) {
26999
- const tag = el("span");
27588
+ const tag = el2("span");
27000
27589
  tag.className = `settings-skills-tag settings-mcp-tag ${inst.server.enabled ? "" : "settings-mcp-tag--disabled"}`;
27001
27590
  tag.textContent = `\u2713 ${inst.harness.name}${inst.server.enabled ? "" : tr(" (\u5DF2\u505C\u7528)", " (disabled)")}`;
27002
27591
  tags.append(tag);
27003
27592
  }
27004
27593
  const installedIds = new Set(installations.map((i) => i.harness.id));
27005
27594
  const missingHarnesses = supported.filter((h) => !installedIds.has(h.harness.id));
27006
- const syncRow = el("div");
27595
+ const syncRow = el2("div");
27007
27596
  syncRow.className = "settings-skills-sync-actions settings-mcp-sync-actions";
27008
27597
  if (missingHarnesses.length > 0) {
27009
- const label = el("span", tr("\u672A\u914D\u7F6E\u4E8E\uFF1A", "Not configured in: "));
27598
+ const label = el2("span", tr("\u672A\u914D\u7F6E\u4E8E\uFF1A", "Not configured in: "));
27010
27599
  label.style.fontSize = "11px";
27011
27600
  label.style.color = "var(--settings-muted)";
27012
27601
  syncRow.append(label);
@@ -27050,7 +27639,7 @@ ${error51.stderrTail}`] : []
27050
27639
  syncRow.append(installAllBtn);
27051
27640
  }
27052
27641
  } else {
27053
- const complete = el("span", tr("\u2713 \u5DF2\u5728\u6240\u6709\u652F\u6301\u7684 Harness \u4E2D\u914D\u7F6E\u5C31\u7EEA", "\u2713 Ready across all supported Harnesses"));
27642
+ const complete = el2("span", tr("\u2713 \u5DF2\u5728\u6240\u6709\u652F\u6301\u7684 Harness \u4E2D\u914D\u7F6E\u5C31\u7EEA", "\u2713 Ready across all supported Harnesses"));
27054
27643
  complete.style.fontSize = "11px";
27055
27644
  complete.style.color = "#10a37f";
27056
27645
  syncRow.append(complete);
@@ -27059,7 +27648,7 @@ ${error51.stderrTail}`] : []
27059
27648
  matrixList.append(card);
27060
27649
  }
27061
27650
  if (matchedCount === 0) {
27062
- const empty = el("div", tr("\u672A\u5339\u914D\u5230\u4EFB\u4F55 MCP \u670D\u52A1\u5668\u3002", "No MCP servers matched the search."));
27651
+ const empty = el2("div", tr("\u672A\u5339\u914D\u5230\u4EFB\u4F55 MCP \u670D\u52A1\u5668\u3002", "No MCP servers matched the search."));
27063
27652
  empty.className = "settings-integrations-empty";
27064
27653
  matrixList.append(empty);
27065
27654
  }
@@ -27090,31 +27679,31 @@ ${error51.stderrTail}`] : []
27090
27679
  fail(new Error(tr("\u6CA1\u6709\u5176\u4ED6\u652F\u6301\u6280\u80FD\u7684\u539F\u751F Harness \u53EF\u4F9B\u540C\u6B65\u3002", "No other native Harnesses support skills for sync.")));
27091
27680
  return;
27092
27681
  }
27093
- const modal = el("dialog");
27682
+ const modal = el2("dialog");
27094
27683
  modal.className = "settings-skills-sync-modal";
27095
- const mTitle = el("h3", tr(`\u540C\u6B65\u6280\u80FD\u3010${skill.name}\u3011`, `Sync skill [${skill.name}]`));
27096
- const mDesc = el("p", tr(`\u4ECE ${sourceHarness.name} \u590D\u5236\u8BE5\u6280\u80FD\u5230\u4EE5\u4E0B\u9009\u4E2D\u7684 Harness\uFF1A`, `Copy skill from ${sourceHarness.name} to selected Harnesses:`));
27097
- const form = el("form");
27098
- const checkList = el("div");
27684
+ const mTitle = el2("h3", tr(`\u540C\u6B65\u6280\u80FD\u3010${skill.name}\u3011`, `Sync skill [${skill.name}]`));
27685
+ const mDesc = el2("p", tr(`\u4ECE ${sourceHarness.name} \u590D\u5236\u8BE5\u6280\u80FD\u5230\u4EE5\u4E0B\u9009\u4E2D\u7684 Harness\uFF1A`, `Copy skill from ${sourceHarness.name} to selected Harnesses:`));
27686
+ const form = el2("form");
27687
+ const checkList = el2("div");
27099
27688
  checkList.style.display = "grid";
27100
27689
  checkList.style.gap = "8px";
27101
27690
  checkList.style.margin = "12px 0";
27102
27691
  const checkboxes = [];
27103
27692
  for (const h of targetHarnesses) {
27104
- const label = el("label");
27693
+ const label = el2("label");
27105
27694
  label.style.display = "flex";
27106
27695
  label.style.gap = "8px";
27107
27696
  label.style.alignItems = "center";
27108
27697
  label.style.cursor = "pointer";
27109
- const cb = el("input");
27698
+ const cb = el2("input");
27110
27699
  cb.type = "checkbox";
27111
27700
  cb.value = h.id;
27112
27701
  cb.checked = true;
27113
27702
  checkboxes.push(cb);
27114
- label.append(cb, el("span", h.name));
27703
+ label.append(cb, el2("span", h.name));
27115
27704
  checkList.append(label);
27116
27705
  }
27117
- const btnRow = el("div");
27706
+ const btnRow = el2("div");
27118
27707
  btnRow.style.display = "flex";
27119
27708
  btnRow.style.gap = "8px";
27120
27709
  btnRow.style.justifyContent = "flex-end";
@@ -27162,20 +27751,20 @@ ${error51.stderrTail}`] : []
27162
27751
  modal.showModal();
27163
27752
  };
27164
27753
  const renderSkills = (snapshot) => {
27165
- const drop = el("div");
27754
+ const drop = el2("div");
27166
27755
  drop.className = "settings-skill-dropzone";
27167
27756
  drop.tabIndex = 0;
27168
27757
  drop.setAttribute("role", "button");
27169
- const dropTitle = el("strong", tr("\u62D6\u62FD\u6280\u80FD\u5230\u8FD9\u91CC", "Drop a skill here"));
27170
- const dropHint = el("span", tr("\u652F\u6301\u5355\u4E2A Markdown \u6587\u4EF6\u6216\u5305\u542B SKILL.md \u7684\u6587\u4EF6\u5939 \xB7 \u6700\u5927 10 MB / 500 \u4E2A\u6587\u4EF6", "Supports one Markdown file or a folder containing SKILL.md \xB7 up to 10 MB / 500 files"));
27171
- const picker = el("input");
27758
+ const dropTitle = el2("strong", tr("\u62D6\u62FD\u6280\u80FD\u5230\u8FD9\u91CC", "Drop a skill here"));
27759
+ const dropHint = el2("span", tr("\u652F\u6301\u5355\u4E2A Markdown \u6587\u4EF6\u6216\u5305\u542B SKILL.md \u7684\u6587\u4EF6\u5939 \xB7 \u6700\u5927 10 MB / 500 \u4E2A\u6587\u4EF6", "Supports one Markdown file or a folder containing SKILL.md \xB7 up to 10 MB / 500 files"));
27760
+ const picker = el2("input");
27172
27761
  picker.type = "file";
27173
27762
  picker.multiple = true;
27174
27763
  picker.hidden = true;
27175
27764
  picker.setAttribute("webkitdirectory", "");
27176
27765
  const choose = button(tr("\u9009\u62E9\u6280\u80FD\u6587\u4EF6\u5939", "Choose skill folder"), () => picker.click());
27177
27766
  drop.append(dropTitle, dropHint, choose, picker);
27178
- const list = el("div");
27767
+ const list = el2("div");
27179
27768
  list.className = "settings-integrations-list";
27180
27769
  const installFiles = async (incoming) => {
27181
27770
  const parsed = await parseDroppedSkills(incoming);
@@ -27217,17 +27806,17 @@ ${error51.stderrTail}`] : []
27217
27806
  dropHint.textContent = tr("\u6B64 Harness \u7684\u539F\u751F\u6280\u80FD\u76EE\u5F55\u5C1A\u672A\u786E\u8BA4\u3002", "This Harness has no verified native skill directory.");
27218
27807
  }
27219
27808
  for (const skill of snapshot.skills) {
27220
- const row = el("section");
27809
+ const row = el2("section");
27221
27810
  row.className = "settings-integrations-row";
27222
- const detail = el("div");
27223
- detail.append(el("strong", skill.name), el("p", skill.enabled ? tr("\u5DF2\u5B89\u88C5 \xB7 \u52A0\u8F7D\u72B6\u6001\u672A\u62A5\u544A", "Installed \xB7 load status unreported") : tr("\u5DF2\u505C\u7528 \xB7 \u6587\u4EF6\u5DF2\u4FDD\u7559", "Disabled \xB7 files retained")), el("code", skill.path));
27811
+ const detail = el2("div");
27812
+ detail.append(el2("strong", skill.name), el2("p", skill.enabled ? tr("\u5DF2\u5B89\u88C5 \xB7 \u52A0\u8F7D\u72B6\u6001\u672A\u62A5\u544A", "Installed \xB7 load status unreported") : tr("\u5DF2\u505C\u7528 \xB7 \u6587\u4EF6\u5DF2\u4FDD\u7559", "Disabled \xB7 files retained")), el2("code", skill.path));
27224
27813
  row.append(detail);
27225
27814
  if (skill.writable) {
27226
27815
  row.append(button(skill.enabled ? tr("\u505C\u7528", "Disable") : tr("\u6062\u590D", "Restore"), () => {
27227
27816
  void mutate((value, selected) => value.changeSkill({ ...selected, name: skill.name, root: skill.root, action: skill.enabled ? "disable" : "enable" }));
27228
27817
  }));
27229
27818
  } else {
27230
- row.append(el("span", tr("\u94FE\u63A5\u76EE\u5F55\uFF0C\u53EA\u8BFB", "Linked directory, read-only")));
27819
+ row.append(el2("span", tr("\u94FE\u63A5\u76EE\u5F55\uFF0C\u53EA\u8BFB", "Linked directory, read-only")));
27231
27820
  }
27232
27821
  const syncBtn = button(tr("\u540C\u6B65\u5230\u2026", "Sync to\u2026"), () => {
27233
27822
  void lifecycle.runLatest(() => client().integrationCatalog(), {
@@ -27242,35 +27831,35 @@ ${error51.stderrTail}`] : []
27242
27831
  list.append(row);
27243
27832
  }
27244
27833
  if (!snapshot.skills.length) {
27245
- const empty = el("div", tr("\u8FD8\u6CA1\u6709\u53D1\u73B0\u6280\u80FD\u3002\u62D6\u5165\u6587\u4EF6\u5373\u53EF\u5B89\u88C5\u3002", "No skills found. Drop files above to install one."));
27834
+ const empty = el2("div", tr("\u8FD8\u6CA1\u6709\u53D1\u73B0\u6280\u80FD\u3002\u62D6\u5165\u6587\u4EF6\u5373\u53EF\u5B89\u88C5\u3002", "No skills found. Drop files above to install one."));
27246
27835
  empty.className = "settings-integrations-empty";
27247
27836
  list.append(empty);
27248
27837
  }
27249
27838
  body.append(drop, list);
27250
27839
  };
27251
27840
  const renderSkillsOverview = (catalog, items) => {
27252
- const drop = el("div");
27841
+ const drop = el2("div");
27253
27842
  drop.className = "settings-skill-dropzone";
27254
27843
  drop.tabIndex = 0;
27255
27844
  drop.setAttribute("role", "button");
27256
- const dropTitle = el("strong", tr("\u62D6\u62FD\u6280\u80FD\u5230\u8FD9\u91CC\uFF0C\u4E00\u952E\u5206\u53D1\u5B89\u88C5", "Drop a skill here to distribute and install"));
27257
- const dropHint = el("span", tr("\u652F\u6301\u5355\u4E2A Markdown \u6587\u4EF6\u6216\u5305\u542B SKILL.md \u7684\u6587\u4EF6\u5939 \xB7 \u81EA\u52A8\u5B89\u88C5\u81F3\u6240\u9009 Harness", "Supports one Markdown file or folder with SKILL.md \xB7 Installs to target Harnesses"));
27258
- const targetRow = el("div");
27845
+ const dropTitle = el2("strong", tr("\u62D6\u62FD\u6280\u80FD\u5230\u8FD9\u91CC\uFF0C\u4E00\u952E\u5206\u53D1\u5B89\u88C5", "Drop a skill here to distribute and install"));
27846
+ const dropHint = el2("span", tr("\u652F\u6301\u5355\u4E2A Markdown \u6587\u4EF6\u6216\u5305\u542B SKILL.md \u7684\u6587\u4EF6\u5939 \xB7 \u81EA\u52A8\u5B89\u88C5\u81F3\u6240\u9009 Harness", "Supports one Markdown file or folder with SKILL.md \xB7 Installs to target Harnesses"));
27847
+ const targetRow = el2("div");
27259
27848
  targetRow.className = "settings-skills-target-row";
27260
- const targetLabel = el("span", tr("\u5B89\u88C5\u76EE\u6807\uFF1A", "Target: "));
27261
- const targetSelect = el("select");
27849
+ const targetLabel = el2("span", tr("\u5B89\u88C5\u76EE\u6807\uFF1A", "Target: "));
27850
+ const targetSelect = el2("select");
27262
27851
  targetSelect.setAttribute("aria-label", tr("\u9009\u62E9\u76EE\u6807 Harness", "Select target Harness"));
27263
- const allOption = el("option", tr("\u5168\u90E8\u652F\u6301\u7684 Harness", "All supported Harnesses"));
27852
+ const allOption = el2("option", tr("\u5168\u90E8\u652F\u6301\u7684 Harness", "All supported Harnesses"));
27264
27853
  allOption.value = "__all__";
27265
27854
  targetSelect.append(allOption);
27266
27855
  for (const item of items) {
27267
27856
  if (item.harness.skills) {
27268
- const opt = el("option", item.harness.name);
27857
+ const opt = el2("option", item.harness.name);
27269
27858
  opt.value = item.harness.id;
27270
27859
  targetSelect.append(opt);
27271
27860
  }
27272
27861
  }
27273
- const picker = el("input");
27862
+ const picker = el2("input");
27274
27863
  picker.type = "file";
27275
27864
  picker.multiple = true;
27276
27865
  picker.hidden = true;
@@ -27346,38 +27935,38 @@ ${error51.stderrTail}`] : []
27346
27935
  uniqueSkills.set(s.name, list);
27347
27936
  }
27348
27937
  }
27349
- const statsBar = el("div");
27938
+ const statsBar = el2("div");
27350
27939
  statsBar.className = "settings-skills-overview-stats";
27351
- const statsSummary = el("span", tr(
27940
+ const statsSummary = el2("span", tr(
27352
27941
  `\u{1F4CA} \u5171 ${items.length} \u4E2A Harness \xB7 ${supported.length} \u4E2A\u5DF2\u914D\u7F6E\u539F\u751F\u6280\u80FD\u76EE\u5F55 \xB7 \u53D1\u73B0 ${uniqueSkills.size} \u4E2A\u53BB\u91CD\u6280\u80FD`,
27353
27942
  `\u{1F4CA} ${items.length} Harnesses \xB7 ${supported.length} with native skills \xB7 ${uniqueSkills.size} unique skills found`
27354
27943
  ));
27355
27944
  statsBar.append(statsSummary);
27356
- const toolbar = el("div");
27945
+ const toolbar = el2("div");
27357
27946
  toolbar.className = "settings-integrations-toolbar";
27358
- const searchInput = el("input");
27947
+ const searchInput = el2("input");
27359
27948
  searchInput.type = "search";
27360
27949
  searchInput.placeholder = tr("\u6309\u540D\u79F0\u8FC7\u6EE4\u6280\u80FD\u2026", "Filter skills by name\u2026");
27361
27950
  searchInput.setAttribute("aria-label", searchInput.placeholder);
27362
- const tabsWrap = el("div");
27951
+ const tabsWrap = el2("div");
27363
27952
  tabsWrap.className = "settings-skills-tabs";
27364
- const btnByHarness = el("button", tr("\u6309 Harness \u67E5\u770B", "By Harness"));
27953
+ const btnByHarness = el2("button", tr("\u6309 Harness \u67E5\u770B", "By Harness"));
27365
27954
  btnByHarness.type = "button";
27366
27955
  btnByHarness.className = "settings-skills-tab-btn";
27367
27956
  btnByHarness.dataset.active = "true";
27368
- const btnBySkill = el("button", tr("\u6309 Skill \u6C47\u603B", "By Skill"));
27957
+ const btnBySkill = el2("button", tr("\u6309 Skill \u6C47\u603B", "By Skill"));
27369
27958
  btnBySkill.type = "button";
27370
27959
  btnBySkill.className = "settings-skills-tab-btn";
27371
27960
  tabsWrap.append(btnByHarness, btnBySkill);
27372
27961
  toolbar.append(searchInput, tabsWrap);
27373
- const viewsContainer = el("div");
27962
+ const viewsContainer = el2("div");
27374
27963
  viewsContainer.className = "settings-skills-views";
27375
27964
  let activeTab = "harness";
27376
27965
  const updateView = () => {
27377
27966
  viewsContainer.replaceChildren();
27378
27967
  const query = searchInput.value.trim().toLowerCase();
27379
27968
  if (activeTab === "harness") {
27380
- const grid = el("div");
27969
+ const grid = el2("div");
27381
27970
  grid.className = "settings-skills-overview-grid";
27382
27971
  for (const item of items) {
27383
27972
  const allSkills = item.snapshot?.skills || [];
@@ -27385,37 +27974,37 @@ ${error51.stderrTail}`] : []
27385
27974
  if (query && !item.harness.name.toLowerCase().includes(query) && matchingSkills.length === 0) {
27386
27975
  continue;
27387
27976
  }
27388
- const card = el("section");
27977
+ const card = el2("section");
27389
27978
  card.className = "settings-skills-harness-card";
27390
- const head = el("div");
27979
+ const head = el2("div");
27391
27980
  head.className = "settings-skills-harness-head";
27392
- const hTitle = el("strong", item.harness.name);
27393
- const badge = el("span");
27981
+ const hTitle = el2("strong", item.harness.name);
27982
+ const badge = el2("span");
27394
27983
  badge.className = `settings-skills-badge ${item.harness.skills ? "settings-skills-badge--active" : ""}`;
27395
27984
  badge.textContent = item.harness.skills ? tr(`${allSkills.length} \u4E2A\u6280\u80FD`, `${allSkills.length} skills`) : tr("\u672A\u914D\u7F6E\u76EE\u5F55", "No native directory");
27396
27985
  head.append(hTitle, badge);
27397
27986
  card.append(head);
27398
27987
  if (!item.harness.skills) {
27399
- const note2 = el("p", tr("\u6B64 Harness \u6682\u672A\u914D\u7F6E\u539F\u751F\u6280\u80FD\u76EE\u5F55\u3002", "This Harness has no verified native skill directory."));
27988
+ const note2 = el2("p", tr("\u6B64 Harness \u6682\u672A\u914D\u7F6E\u539F\u751F\u6280\u80FD\u76EE\u5F55\u3002", "This Harness has no verified native skill directory."));
27400
27989
  note2.className = "settings-mcp-notice";
27401
27990
  card.append(note2);
27402
27991
  } else if (matchingSkills.length === 0) {
27403
- const empty = el("p", query ? tr("\u65E0\u5339\u914D\u6280\u80FD", "No matching skills") : tr("\u6682\u672A\u5B89\u88C5\u6280\u80FD", "No skills installed"));
27992
+ const empty = el2("p", query ? tr("\u65E0\u5339\u914D\u6280\u80FD", "No matching skills") : tr("\u6682\u672A\u5B89\u88C5\u6280\u80FD", "No skills installed"));
27404
27993
  empty.className = "settings-mcp-notice";
27405
27994
  card.append(empty);
27406
27995
  } else {
27407
- const list = el("div");
27996
+ const list = el2("div");
27408
27997
  list.className = "settings-skills-list-compact";
27409
27998
  for (const s of matchingSkills) {
27410
- const row = el("div");
27999
+ const row = el2("div");
27411
28000
  row.className = "settings-skills-item-row";
27412
- const info = el("div");
28001
+ const info = el2("div");
27413
28002
  info.append(
27414
- el("strong", s.name),
27415
- el("span", s.enabled ? tr(" \xB7 \u5DF2\u5B89\u88C5", " \xB7 Installed") : tr(" \xB7 \u5DF2\u505C\u7528", " \xB7 Disabled")),
27416
- el("code", s.path)
28003
+ el2("strong", s.name),
28004
+ el2("span", s.enabled ? tr(" \xB7 \u5DF2\u5B89\u88C5", " \xB7 Installed") : tr(" \xB7 \u5DF2\u505C\u7528", " \xB7 Disabled")),
28005
+ el2("code", s.path)
27417
28006
  );
27418
- const actions = el("div");
28007
+ const actions = el2("div");
27419
28008
  actions.className = "settings-skills-item-actions";
27420
28009
  if (s.writable) {
27421
28010
  actions.append(button(s.enabled ? tr("\u505C\u7528", "Disable") : tr("\u6062\u590D", "Restore"), () => {
@@ -27449,7 +28038,7 @@ ${error51.stderrTail}`] : []
27449
28038
  }
27450
28039
  viewsContainer.append(grid);
27451
28040
  } else {
27452
- const matrixList = el("div");
28041
+ const matrixList = el2("div");
27453
28042
  matrixList.className = "settings-skills-matrix-list";
27454
28043
  let matchedCount = 0;
27455
28044
  for (const [skillName, installations] of uniqueSkills.entries()) {
@@ -27457,28 +28046,28 @@ ${error51.stderrTail}`] : []
27457
28046
  continue;
27458
28047
  }
27459
28048
  matchedCount++;
27460
- const card = el("section");
28049
+ const card = el2("section");
27461
28050
  card.className = "settings-skills-matrix-card";
27462
- const head = el("div");
28051
+ const head = el2("div");
27463
28052
  head.className = "settings-skills-matrix-head";
27464
28053
  head.append(
27465
- el("strong", skillName),
27466
- el("span", tr(`\u5DF2\u5728 ${installations.length} \u4E2A Harness \u5B89\u88C5`, `Installed in ${installations.length} harnesses`))
28054
+ el2("strong", skillName),
28055
+ el2("span", tr(`\u5DF2\u5728 ${installations.length} \u4E2A Harness \u5B89\u88C5`, `Installed in ${installations.length} harnesses`))
27467
28056
  );
27468
- const tags = el("div");
28057
+ const tags = el2("div");
27469
28058
  tags.className = "settings-skills-tags";
27470
28059
  for (const inst of installations) {
27471
- const tag = el("span");
28060
+ const tag = el2("span");
27472
28061
  tag.className = "settings-skills-tag";
27473
28062
  tag.textContent = `\u2713 ${inst.harness.name}${inst.skill.enabled ? "" : tr(" (\u5DF2\u505C\u7528)", " (disabled)")}`;
27474
28063
  tags.append(tag);
27475
28064
  }
27476
28065
  const installedIds = new Set(installations.map((i) => i.harness.id));
27477
28066
  const missingHarnesses = supported.filter((h) => !installedIds.has(h.harness.id));
27478
- const syncRow = el("div");
28067
+ const syncRow = el2("div");
27479
28068
  syncRow.className = "settings-skills-sync-actions";
27480
28069
  if (missingHarnesses.length > 0) {
27481
- const label = el("span", tr("\u672A\u5B89\u88C5\u4E8E\uFF1A", "Not installed in: "));
28070
+ const label = el2("span", tr("\u672A\u5B89\u88C5\u4E8E\uFF1A", "Not installed in: "));
27482
28071
  label.style.fontSize = "11px";
27483
28072
  label.style.color = "var(--settings-muted)";
27484
28073
  syncRow.append(label);
@@ -27528,7 +28117,7 @@ ${error51.stderrTail}`] : []
27528
28117
  syncRow.append(installAllBtn);
27529
28118
  }
27530
28119
  } else {
27531
- const complete = el("span", tr("\u5DF2\u5728\u6240\u6709\u652F\u6301\u7684 Harness \u4E2D\u5C31\u7EEA", "Ready across all supported Harnesses"));
28120
+ const complete = el2("span", tr("\u5DF2\u5728\u6240\u6709\u652F\u6301\u7684 Harness \u4E2D\u5C31\u7EEA", "Ready across all supported Harnesses"));
27532
28121
  complete.style.fontSize = "11px";
27533
28122
  complete.style.color = "#10a37f";
27534
28123
  syncRow.append(complete);
@@ -27537,7 +28126,7 @@ ${error51.stderrTail}`] : []
27537
28126
  matrixList.append(card);
27538
28127
  }
27539
28128
  if (matchedCount === 0) {
27540
- const empty = el("div", tr("\u672A\u5339\u914D\u5230\u4EFB\u4F55\u6280\u80FD\u3002", "No skills matched the search."));
28129
+ const empty = el2("div", tr("\u672A\u5339\u914D\u5230\u4EFB\u4F55\u6280\u80FD\u3002", "No skills matched the search."));
27541
28130
  empty.className = "settings-integrations-empty";
27542
28131
  matrixList.append(empty);
27543
28132
  }
@@ -27634,11 +28223,11 @@ ${error51.stderrTail}`] : []
27634
28223
  void refresh();
27635
28224
  }, { signal: lifecycle.signal });
27636
28225
  void lifecycle.runLatest(() => client().integrationCatalog(), { success: (data) => {
27637
- const allOption = el("option", tr("\u5168\u90E8 Harness\uFF08\u603B\u89C8\uFF09", "All Harnesses (Overview)"));
28226
+ const allOption = el2("option", tr("\u5168\u90E8 Harness\uFF08\u603B\u89C8\uFF09", "All Harnesses (Overview)"));
27638
28227
  allOption.value = "__all__";
27639
28228
  harness.append(allOption);
27640
28229
  for (const item of data.harnesses) {
27641
- const option = el("option", `${item.name}${item.available ? "" : tr(" \xB7 \u672A\u5C31\u7EEA", " \xB7 not ready")}`);
28230
+ const option = el2("option", `${item.name}${item.available ? "" : tr(" \xB7 \u672A\u5C31\u7EEA", " \xB7 not ready")}`);
27642
28231
  option.value = item.id;
27643
28232
  harness.append(option);
27644
28233
  }
@@ -28951,13 +29540,13 @@ ${error51.stderrTail}`] : []
28951
29540
  return isRendererSkinId(active) ? active : readRendererSkin(documentSkinStorage(ownerDocument));
28952
29541
  }
28953
29542
  function skinCss(skin) {
28954
- const [surface, secondary, accent, text] = skin.palette;
29543
+ const [surface, secondary, accent, text2] = skin.palette;
28955
29544
  const image = skin.heroUrl ? `url("${skin.heroUrl}")` : skin.preview;
28956
29545
  const sidebarVeil = skin.dark ? `color-mix(in srgb, ${surface} 91%, transparent)` : `color-mix(in srgb, ${surface} 88%, transparent)`;
28957
29546
  const lowerVeil = skin.dark ? `color-mix(in srgb, ${surface} 68%, transparent)` : `color-mix(in srgb, ${surface} 72%, transparent)`;
28958
29547
  const panelOpacity = skin.dark ? "84%" : "82%";
28959
- const secondaryText = `color-mix(in srgb, ${text} 72%, transparent)`;
28960
- const tertiaryText = `color-mix(in srgb, ${text} 54%, transparent)`;
29548
+ const secondaryText = `color-mix(in srgb, ${text2} 72%, transparent)`;
29549
+ const tertiaryText = `color-mix(in srgb, ${text2} 54%, transparent)`;
28961
29550
  const logoCss = skin.logoUrl ? `
28962
29551
  html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] .app-shell-left-panel button[aria-haspopup="menu"][aria-label*="ChatGPT"],
28963
29552
  html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] .app-shell-left-panel button[aria-haspopup="menu"][aria-label*="Codex"] {
@@ -28972,7 +29561,7 @@ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] body::after {
28972
29561
  content: ""; position: fixed; right: clamp(12px, 2vw, 24px); bottom: clamp(72px, 11vh, 108px);
28973
29562
  width: clamp(108px, 11.5vw, 168px); aspect-ratio: 2 / 3;
28974
29563
  background: url("${skin.polaroidUrl}") center / contain no-repeat;
28975
- filter: drop-shadow(0 12px 26px color-mix(in srgb, ${text} 24%, transparent));
29564
+ filter: drop-shadow(0 12px 26px color-mix(in srgb, ${text2} 24%, transparent));
28976
29565
  pointer-events: none; z-index: 15;
28977
29566
  }
28978
29567
  @media (max-width: 760px) {
@@ -28984,28 +29573,28 @@ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] {
28984
29573
  color-scheme: ${skin.dark ? "dark" : "light"};
28985
29574
  --codex-titlebar-tint: transparent !important;
28986
29575
  --header-tint: transparent !important;
28987
- --color-text: ${text}; --color-text-primary: ${text}; --color-token-text-primary: ${text};
28988
- --color-token-foreground: ${text}; --color-text-prose: ${text}; --color-text-emphasis: ${text};
28989
- --color-text-primary-surface: ${text}; --color-text-primary-soft: ${text};
28990
- --color-text-primary-soft-alt: ${text}; --color-text-primary-ghost: ${text};
28991
- --color-text-primary-ghost-hover: ${text}; --color-text-primary-outline: ${text};
28992
- --color-text-primary-outline-hover: ${text};
29576
+ --color-text: ${text2}; --color-text-primary: ${text2}; --color-token-text-primary: ${text2};
29577
+ --color-token-foreground: ${text2}; --color-text-prose: ${text2}; --color-text-emphasis: ${text2};
29578
+ --color-text-primary-surface: ${text2}; --color-text-primary-soft: ${text2};
29579
+ --color-text-primary-soft-alt: ${text2}; --color-text-primary-ghost: ${text2};
29580
+ --color-text-primary-ghost-hover: ${text2}; --color-text-primary-outline: ${text2};
29581
+ --color-text-primary-outline-hover: ${text2};
28993
29582
  --color-text-secondary: ${secondaryText}; --color-token-text-secondary: ${secondaryText};
28994
29583
  --color-text-secondary-soft: ${secondaryText}; --color-text-secondary-soft-alt: ${secondaryText};
28995
- --color-text-secondary-ghost: ${secondaryText}; --color-text-secondary-ghost-hover: ${text};
28996
- --color-text-secondary-outline: ${secondaryText}; --color-text-secondary-outline-hover: ${text};
29584
+ --color-text-secondary-ghost: ${secondaryText}; --color-text-secondary-ghost-hover: ${text2};
29585
+ --color-text-secondary-outline: ${secondaryText}; --color-text-secondary-outline-hover: ${text2};
28997
29586
  --color-text-secondary-solid: ${secondaryText};
28998
29587
  --color-text-tertiary: ${tertiaryText}; --color-token-text-tertiary: ${tertiaryText};
28999
29588
  --color-token-description-foreground: ${tertiaryText};
29000
- --color-token-dropdown-foreground: ${text};
29001
- --app-color-text-foreground: ${text}; --app-color-text-foreground-secondary: ${secondaryText};
29589
+ --color-token-dropdown-foreground: ${text2};
29590
+ --app-color-text-foreground: ${text2}; --app-color-text-foreground-secondary: ${secondaryText};
29002
29591
  --app-color-text-foreground-tertiary: ${tertiaryText};
29003
- --app-color-foreground-application-menu: ${text};
29004
- --app-color-text-button-secondary: ${text}; --app-color-text-button-tertiary: ${tertiaryText};
29005
- --wb-text-primary: ${text}; --wb-text-secondary: ${secondaryText}; --wb-text-tertiary: ${tertiaryText};
29006
- --color-control-thumb-foreground: ${text};
29592
+ --app-color-foreground-application-menu: ${text2};
29593
+ --app-color-text-button-secondary: ${text2}; --app-color-text-button-tertiary: ${tertiaryText};
29594
+ --wb-text-primary: ${text2}; --wb-text-secondary: ${secondaryText}; --wb-text-tertiary: ${tertiaryText};
29595
+ --color-control-thumb-foreground: ${text2};
29007
29596
  --color-text-mode-toggle-inactive: ${secondaryText};
29008
- --color-text-user-message: ${text} !important;
29597
+ --color-text-user-message: ${text2} !important;
29009
29598
  --color-surface: color-mix(in srgb, ${surface} 92%, transparent);
29010
29599
  --color-surface-secondary: color-mix(in srgb, ${surface} 88%, transparent);
29011
29600
  --color-surface-tertiary: color-mix(in srgb, ${surface} 94%, transparent);
@@ -29022,26 +29611,26 @@ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] {
29022
29611
  --color-background-primary-soft-alpha: color-mix(in srgb, ${surface} 88%, transparent);
29023
29612
  --color-background-primary-soft-hover: color-mix(in srgb, ${surface} 80%, ${accent});
29024
29613
  --color-background-primary-soft-active: color-mix(in srgb, ${surface} 72%, ${accent});
29025
- --color-background-primary-ghost-hover: color-mix(in srgb, ${text} 8%, transparent);
29026
- --color-background-secondary-soft: color-mix(in srgb, ${text} 7%, transparent);
29027
- --color-background-secondary-soft-alpha: color-mix(in srgb, ${text} 7%, transparent);
29028
- --color-background-secondary-soft-hover: color-mix(in srgb, ${text} 11%, transparent);
29614
+ --color-background-primary-ghost-hover: color-mix(in srgb, ${text2} 8%, transparent);
29615
+ --color-background-secondary-soft: color-mix(in srgb, ${text2} 7%, transparent);
29616
+ --color-background-secondary-soft-alpha: color-mix(in srgb, ${text2} 7%, transparent);
29617
+ --color-background-secondary-soft-hover: color-mix(in srgb, ${text2} 11%, transparent);
29029
29618
  --color-background-other-user-message: color-mix(in srgb, ${surface} 76%, transparent);
29030
29619
  --color-background-user-message: color-mix(in srgb, ${surface} 92%, transparent) !important;
29031
29620
  --color-background-user-message-compact: color-mix(in srgb, ${surface} 88%, transparent);
29032
- --color-border: color-mix(in srgb, ${text} 16%, transparent);
29033
- --color-border-subtle: color-mix(in srgb, ${text} 8%, transparent);
29034
- --color-border-strong: color-mix(in srgb, ${text} 20%, transparent);
29621
+ --color-border: color-mix(in srgb, ${text2} 16%, transparent);
29622
+ --color-border-subtle: color-mix(in srgb, ${text2} 8%, transparent);
29623
+ --color-border-strong: color-mix(in srgb, ${text2} 20%, transparent);
29035
29624
  --color-token-main-surface-primary: color-mix(in srgb, ${surface} 92%, transparent);
29036
29625
  --color-token-dropdown-background: color-mix(in srgb, ${surface} 96%, transparent);
29037
- --color-token-list-hover-background: color-mix(in srgb, ${text} 8%, transparent);
29038
- --color-token-border: color-mix(in srgb, ${text} 16%, transparent);
29039
- --color-token-border-default: color-mix(in srgb, ${text} 16%, transparent);
29040
- --color-token-border-light: color-mix(in srgb, ${text} 9%, transparent);
29041
- --color-token-border-heavy: color-mix(in srgb, ${text} 22%, transparent);
29042
- --color-token-input-border: color-mix(in srgb, ${text} 20%, transparent);
29043
- --color-codex-diff-surface: color-mix(in srgb, ${surface} 94%, ${text});
29044
- --color-token-diff-surface: color-mix(in srgb, ${surface} 94%, ${text});
29626
+ --color-token-list-hover-background: color-mix(in srgb, ${text2} 8%, transparent);
29627
+ --color-token-border: color-mix(in srgb, ${text2} 16%, transparent);
29628
+ --color-token-border-default: color-mix(in srgb, ${text2} 16%, transparent);
29629
+ --color-token-border-light: color-mix(in srgb, ${text2} 9%, transparent);
29630
+ --color-token-border-heavy: color-mix(in srgb, ${text2} 22%, transparent);
29631
+ --color-token-input-border: color-mix(in srgb, ${text2} 20%, transparent);
29632
+ --color-codex-diff-surface: color-mix(in srgb, ${surface} 94%, ${text2});
29633
+ --color-token-diff-surface: color-mix(in srgb, ${surface} 94%, ${text2});
29045
29634
  --color-codex-editor-inline-code-background: color-mix(in srgb, ${surface} 92%, transparent);
29046
29635
  --color-codex-terminal-background: ${surface};
29047
29636
  --codex-base-surface: ${surface};
@@ -29054,41 +29643,41 @@ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] {
29054
29643
  --app-color-background-elevated-secondary-opaque: ${surface};
29055
29644
  --app-color-background-editor-opaque: ${surface};
29056
29645
  --app-color-background-application-menu: color-mix(in srgb, ${surface} 96%, transparent);
29057
- --app-color-background-button-secondary: color-mix(in srgb, ${text} 7%, transparent);
29058
- --app-color-background-button-secondary-hover: color-mix(in srgb, ${text} 11%, transparent);
29059
- --app-color-border: color-mix(in srgb, ${text} 16%, transparent);
29060
- --app-color-border-light: color-mix(in srgb, ${text} 9%, transparent);
29061
- --app-color-border-heavy: color-mix(in srgb, ${text} 22%, transparent);
29646
+ --app-color-background-button-secondary: color-mix(in srgb, ${text2} 7%, transparent);
29647
+ --app-color-background-button-secondary-hover: color-mix(in srgb, ${text2} 11%, transparent);
29648
+ --app-color-border: color-mix(in srgb, ${text2} 16%, transparent);
29649
+ --app-color-border-light: color-mix(in srgb, ${text2} 9%, transparent);
29650
+ --app-color-border-heavy: color-mix(in srgb, ${text2} 22%, transparent);
29062
29651
  --wb-surface-primary: color-mix(in srgb, ${surface} 92%, transparent);
29063
29652
  --wb-surface-secondary: color-mix(in srgb, ${surface} 88%, transparent);
29064
- --wb-border: color-mix(in srgb, ${text} 16%, transparent);
29065
- --wb-border-hover: color-mix(in srgb, ${text} 22%, transparent);
29066
- --vscode-foreground: ${text}; --vscode-descriptionForeground: ${secondaryText};
29067
- --vscode-editor-foreground: ${text}; --vscode-input-foreground: ${text};
29653
+ --wb-border: color-mix(in srgb, ${text2} 16%, transparent);
29654
+ --wb-border-hover: color-mix(in srgb, ${text2} 22%, transparent);
29655
+ --vscode-foreground: ${text2}; --vscode-descriptionForeground: ${secondaryText};
29656
+ --vscode-editor-foreground: ${text2}; --vscode-input-foreground: ${text2};
29068
29657
  --vscode-editor-background: ${surface}; --vscode-editorPane-background: ${surface};
29069
29658
  --vscode-input-background: color-mix(in srgb, ${surface} 96%, transparent);
29070
29659
  --vscode-dropdown-background: color-mix(in srgb, ${surface} 96%, transparent);
29071
29660
  --vscode-menu-background: color-mix(in srgb, ${surface} 96%, transparent);
29072
29661
  --vscode-panel-background: color-mix(in srgb, ${surface} 96%, transparent);
29073
29662
  --vscode-terminal-background: ${surface};
29074
- --vscode-list-hoverBackground: color-mix(in srgb, ${text} 8%, transparent);
29663
+ --vscode-list-hoverBackground: color-mix(in srgb, ${text2} 8%, transparent);
29075
29664
  --vscode-list-activeSelectionBackground: color-mix(in srgb, ${accent} 24%, transparent);
29076
- --vscode-list-activeSelectionForeground: ${text};
29665
+ --vscode-list-activeSelectionForeground: ${text2};
29077
29666
  --vscode-list-inactiveSelectionBackground: color-mix(in srgb, ${accent} 16%, transparent);
29078
- --vscode-list-inactiveSelectionForeground: ${text};
29667
+ --vscode-list-inactiveSelectionForeground: ${text2};
29079
29668
  --background: color-mix(in srgb, ${surface} ${panelOpacity}, transparent);
29080
- --foreground: ${text}; --card: color-mix(in srgb, ${surface} 88%, transparent);
29081
- --card-foreground: ${text}; --popover: color-mix(in srgb, ${surface} 94%, transparent);
29082
- --popover-foreground: ${text}; --primary: ${accent}; --primary-foreground: ${surface};
29083
- --secondary: color-mix(in srgb, ${surface} 82%, ${secondary}); --secondary-foreground: ${text};
29669
+ --foreground: ${text2}; --card: color-mix(in srgb, ${surface} 88%, transparent);
29670
+ --card-foreground: ${text2}; --popover: color-mix(in srgb, ${surface} 94%, transparent);
29671
+ --popover-foreground: ${text2}; --primary: ${accent}; --primary-foreground: ${surface};
29672
+ --secondary: color-mix(in srgb, ${surface} 82%, ${secondary}); --secondary-foreground: ${text2};
29084
29673
  --muted: color-mix(in srgb, ${surface} 88%, ${secondary});
29085
- --muted-foreground: color-mix(in srgb, ${text} 68%, ${surface});
29086
- --accent: color-mix(in srgb, ${surface} 74%, ${accent}); --accent-foreground: ${text};
29087
- --border: color-mix(in srgb, ${text} 16%, transparent); --input: color-mix(in srgb, ${text} 18%, transparent); --ring: ${accent};
29674
+ --muted-foreground: color-mix(in srgb, ${text2} 68%, ${surface});
29675
+ --accent: color-mix(in srgb, ${surface} 74%, ${accent}); --accent-foreground: ${text2};
29676
+ --border: color-mix(in srgb, ${text2} 16%, transparent); --input: color-mix(in srgb, ${text2} 18%, transparent); --ring: ${accent};
29088
29677
  --sidebar: color-mix(in srgb, ${surface} 88%, transparent); --sidebar-background: color-mix(in srgb, ${surface} 88%, transparent);
29089
- --sidebar-foreground: ${text}; --sidebar-primary: ${accent}; --sidebar-primary-foreground: ${surface};
29090
- --sidebar-accent: color-mix(in srgb, ${surface} 74%, ${accent}); --sidebar-accent-foreground: ${text};
29091
- --sidebar-border: color-mix(in srgb, ${text} 14%, transparent); --sidebar-ring: ${accent};
29678
+ --sidebar-foreground: ${text2}; --sidebar-primary: ${accent}; --sidebar-primary-foreground: ${surface};
29679
+ --sidebar-accent: color-mix(in srgb, ${surface} 74%, ${accent}); --sidebar-accent-foreground: ${text2};
29680
+ --sidebar-border: color-mix(in srgb, ${text2} 14%, transparent); --sidebar-ring: ${accent};
29092
29681
  --main-surface-primary: color-mix(in srgb, ${surface} 84%, transparent);
29093
29682
  --main-surface-secondary: color-mix(in srgb, ${surface} 72%, transparent);
29094
29683
  --sidebar-surface-primary: color-mix(in srgb, ${surface} 88%, transparent);
@@ -29097,10 +29686,10 @@ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] {
29097
29686
  --composer-surface: color-mix(in srgb, ${surface} 88%, transparent);
29098
29687
  }
29099
29688
  html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] body {
29100
- color: ${text}; background: ${surface} !important;
29689
+ color: ${text2}; background: ${surface} !important;
29101
29690
  }
29102
29691
  html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] body > #root {
29103
- min-height: 100vh; color: ${text} !important;
29692
+ min-height: 100vh; color: ${text2} !important;
29104
29693
  background-color: transparent !important;
29105
29694
  background-image:
29106
29695
  linear-gradient(90deg, ${sidebarVeil} 0 22%, transparent 46%),
@@ -29131,12 +29720,12 @@ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] :where(
29131
29720
  [data-local-conversation-final-assistant]:not(:has([data-response-annotation-conversation]))
29132
29721
  ) {
29133
29722
  box-sizing: border-box;
29134
- color: ${text} !important;
29723
+ color: ${text2} !important;
29135
29724
  background: color-mix(in srgb, ${surface} 96%, transparent) !important;
29136
29725
  border: 1px solid color-mix(in srgb, ${accent} 16%, transparent) !important;
29137
29726
  border-radius: 18px;
29138
29727
  padding: 14px 16px 12px;
29139
- box-shadow: 0 8px 24px color-mix(in srgb, ${text} 8%, transparent) !important;
29728
+ box-shadow: 0 8px 24px color-mix(in srgb, ${text2} 8%, transparent) !important;
29140
29729
  backdrop-filter: blur(16px) saturate(120%) !important;
29141
29730
  }
29142
29731
  html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] :where(
@@ -29160,7 +29749,7 @@ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] :where(
29160
29749
  ) {
29161
29750
  border: 1px solid color-mix(in srgb, ${accent} 24%, transparent) !important;
29162
29751
  border-radius: 12px !important;
29163
- box-shadow: 0 4px 20px color-mix(in srgb, ${text} 8%, transparent) !important;
29752
+ box-shadow: 0 4px 20px color-mix(in srgb, ${text2} 8%, transparent) !important;
29164
29753
  overflow: hidden !important;
29165
29754
  }
29166
29755
  html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] :where(
@@ -29170,7 +29759,7 @@ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] :where(
29170
29759
  ) {
29171
29760
  background-color: color-mix(in srgb, ${surface} 98%, transparent) !important;
29172
29761
  border-bottom: 2px solid color-mix(in srgb, ${accent} 28%, transparent) !important;
29173
- color: ${text} !important;
29762
+ color: ${text2} !important;
29174
29763
  font-weight: 600 !important;
29175
29764
  padding: 8px 14px !important;
29176
29765
  }
@@ -29180,9 +29769,9 @@ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] :where(
29180
29769
  [data-response-annotation-conversation] td,
29181
29770
  [data-response-annotation-conversation] :where(th, td)
29182
29771
  ) {
29183
- border-bottom: 1px solid color-mix(in srgb, ${text} 12%, transparent) !important;
29184
- border-right: 1px solid color-mix(in srgb, ${text} 6%, transparent) !important;
29185
- color: ${text} !important;
29772
+ border-bottom: 1px solid color-mix(in srgb, ${text2} 12%, transparent) !important;
29773
+ border-right: 1px solid color-mix(in srgb, ${text2} 6%, transparent) !important;
29774
+ color: ${text2} !important;
29186
29775
  padding: 8px 14px !important;
29187
29776
  }
29188
29777
  html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] :where(
@@ -29198,7 +29787,7 @@ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] :where(
29198
29787
  background-color: color-mix(in srgb, ${accent} 10%, transparent) !important;
29199
29788
  }
29200
29789
  html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] :where(.composer-surface-chrome, [data-user-message-bubble], [data-codex-approval-surface]) {
29201
- color: ${text} !important;
29790
+ color: ${text2} !important;
29202
29791
  background: color-mix(in srgb, ${surface} 92%, transparent) !important;
29203
29792
  border-color: color-mix(in srgb, ${accent} 24%, transparent) !important;
29204
29793
  box-shadow: 0 8px 24px color-mix(in srgb, ${accent} 12%, transparent) !important;
@@ -29213,7 +29802,7 @@ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-user-message-bubble] :where(
29213
29802
  a,
29214
29803
  code
29215
29804
  ) {
29216
- color: ${text} !important;
29805
+ color: ${text2} !important;
29217
29806
  }
29218
29807
  html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] :where(
29219
29808
  header,
@@ -29250,7 +29839,7 @@ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-page-header] > [da
29250
29839
  border-radius: 0 !important;
29251
29840
  box-shadow: none !important;
29252
29841
  backdrop-filter: none !important;
29253
- color: color-mix(in srgb, ${text} 82%, ${accent}) !important;
29842
+ color: color-mix(in srgb, ${text2} 82%, ${accent}) !important;
29254
29843
  font-size: 13px !important;
29255
29844
  font-weight: 500 !important;
29256
29845
  text-shadow: 0 1px 2px color-mix(in srgb, ${surface} 72%, transparent) !important;
@@ -29268,19 +29857,19 @@ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-page-header] > [da
29268
29857
  font-size: inherit !important;
29269
29858
  font-weight: inherit !important;
29270
29859
  }
29271
- html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] header button:not([data-codexhost-settings-trigger] *),
29272
- html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-pip-obstacle="app-shell-header"] button:not([data-codexhost-settings-trigger] *),
29273
- html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-obstacle] button:not([data-codexhost-settings-trigger] *),
29274
- html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-testid="app-shell-header-context-menu-surface"] button:not([data-codexhost-settings-trigger] *),
29275
- html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-toolbar] button:not([data-codexhost-settings-trigger] *),
29276
- html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] header [role="button"]:not([data-codexhost-settings-trigger] *) {
29860
+ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] header button:not([data-harnessmix-settings-trigger] *),
29861
+ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-pip-obstacle="app-shell-header"] button:not([data-harnessmix-settings-trigger] *),
29862
+ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-obstacle] button:not([data-harnessmix-settings-trigger] *),
29863
+ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-testid="app-shell-header-context-menu-surface"] button:not([data-harnessmix-settings-trigger] *),
29864
+ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-toolbar] button:not([data-harnessmix-settings-trigger] *),
29865
+ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] header [role="button"]:not([data-harnessmix-settings-trigger] *) {
29277
29866
  background: transparent !important;
29278
29867
  background-color: transparent !important;
29279
29868
  border-color: transparent !important;
29280
29869
  box-shadow: none !important;
29281
29870
  }
29282
29871
  html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-page-header] > [data-app-shell-header-toolbar] > button[aria-haspopup="menu"] {
29283
- color: color-mix(in srgb, ${text} 62%, transparent) !important;
29872
+ color: color-mix(in srgb, ${text2} 62%, transparent) !important;
29284
29873
  background: transparent !important;
29285
29874
  background-color: transparent !important;
29286
29875
  border-color: transparent !important;
@@ -29288,17 +29877,17 @@ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-page-header] > [da
29288
29877
  filter: none !important;
29289
29878
  outline: none !important;
29290
29879
  }
29291
- html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] header button:not([data-codexhost-settings-trigger] *):hover,
29292
- html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-pip-obstacle="app-shell-header"] button:not([data-codexhost-settings-trigger] *):hover,
29293
- html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-obstacle] button:not([data-codexhost-settings-trigger] *):hover,
29294
- html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-testid="app-shell-header-context-menu-surface"] button:not([data-codexhost-settings-trigger] *):hover,
29295
- html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-toolbar] button:not([data-codexhost-settings-trigger] *):hover {
29296
- background: color-mix(in srgb, ${text} 12%, transparent) !important;
29297
- background-color: color-mix(in srgb, ${text} 12%, transparent) !important;
29880
+ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] header button:not([data-harnessmix-settings-trigger] *):hover,
29881
+ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-pip-obstacle="app-shell-header"] button:not([data-harnessmix-settings-trigger] *):hover,
29882
+ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-obstacle] button:not([data-harnessmix-settings-trigger] *):hover,
29883
+ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-testid="app-shell-header-context-menu-surface"] button:not([data-harnessmix-settings-trigger] *):hover,
29884
+ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-toolbar] button:not([data-harnessmix-settings-trigger] *):hover {
29885
+ background: color-mix(in srgb, ${text2} 12%, transparent) !important;
29886
+ background-color: color-mix(in srgb, ${text2} 12%, transparent) !important;
29298
29887
  }
29299
29888
  html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-page-header] > [data-app-shell-header-toolbar] > button[aria-haspopup="menu"]:hover,
29300
29889
  html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-page-header] > [data-app-shell-header-toolbar] > button[aria-haspopup="menu"]:focus-visible {
29301
- color: ${text} !important;
29890
+ color: ${text2} !important;
29302
29891
  background: transparent !important;
29303
29892
  background-color: transparent !important;
29304
29893
  border-color: transparent !important;
@@ -29306,17 +29895,17 @@ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-page-header] > [da
29306
29895
  filter: none !important;
29307
29896
  outline: none !important;
29308
29897
  }
29309
- html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] header button:not([data-codexhost-settings-trigger] *):active,
29310
- html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-pip-obstacle="app-shell-header"] button:not([data-codexhost-settings-trigger] *):active,
29311
- html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-obstacle] button:not([data-codexhost-settings-trigger] *):active,
29312
- html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-testid="app-shell-header-context-menu-surface"] button:not([data-codexhost-settings-trigger] *):active,
29313
- html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-toolbar] button:not([data-codexhost-settings-trigger] *):active {
29314
- background: color-mix(in srgb, ${text} 18%, transparent) !important;
29315
- background-color: color-mix(in srgb, ${text} 18%, transparent) !important;
29898
+ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] header button:not([data-harnessmix-settings-trigger] *):active,
29899
+ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-pip-obstacle="app-shell-header"] button:not([data-harnessmix-settings-trigger] *):active,
29900
+ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-obstacle] button:not([data-harnessmix-settings-trigger] *):active,
29901
+ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-testid="app-shell-header-context-menu-surface"] button:not([data-harnessmix-settings-trigger] *):active,
29902
+ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-header-toolbar] button:not([data-harnessmix-settings-trigger] *):active {
29903
+ background: color-mix(in srgb, ${text2} 18%, transparent) !important;
29904
+ background-color: color-mix(in srgb, ${text2} 18%, transparent) !important;
29316
29905
  }
29317
29906
  html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-page-header] > [data-app-shell-header-toolbar] > button[aria-haspopup="menu"]:active,
29318
29907
  html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-shell-page-header] > [data-app-shell-header-toolbar] > button[aria-haspopup="menu"][data-state="open"] {
29319
- color: ${text} !important;
29908
+ color: ${text2} !important;
29320
29909
  background: transparent !important;
29321
29910
  background-color: transparent !important;
29322
29911
  border-color: transparent !important;
@@ -29376,17 +29965,17 @@ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-tab-id] :where([class*="max-
29376
29965
  html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-app-action-sidebar-thread-active="true"] {
29377
29966
  background: linear-gradient(90deg, color-mix(in srgb, ${accent} 22%, transparent), color-mix(in srgb, ${secondary} 16%, transparent)) !important;
29378
29967
  }
29379
- html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] :where(.border-border, .border-sidebar-border) { border-color: color-mix(in srgb, ${text} 14%, transparent) !important; }
29380
- html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-codexhost-settings-shell] {
29968
+ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] :where(.border-border, .border-sidebar-border) { border-color: color-mix(in srgb, ${text2} 14%, transparent) !important; }
29969
+ html[${RENDERER_SKIN_ATTRIBUTE}="${skin.id}"] [data-harnessmix-settings-shell] {
29381
29970
  --settings-bg: color-mix(in srgb, ${surface} 90%, transparent);
29382
29971
  --settings-sidebar: color-mix(in srgb, ${surface} 86%, ${secondary});
29383
29972
  --settings-panel: color-mix(in srgb, ${surface} 90%, transparent);
29384
29973
  --settings-surface: color-mix(in srgb, ${surface} 82%, ${secondary});
29385
29974
  --settings-surface-hover: color-mix(in srgb, ${surface} 72%, ${accent});
29386
29975
  --settings-inset: color-mix(in srgb, ${surface} 92%, ${secondary});
29387
- --settings-text: ${text}; --settings-muted: color-mix(in srgb, ${text} 68%, ${surface});
29388
- --settings-subtle: color-mix(in srgb, ${text} 52%, ${surface});
29389
- --settings-border: color-mix(in srgb, ${text} 14%, transparent); --settings-focus: ${accent};
29976
+ --settings-text: ${text2}; --settings-muted: color-mix(in srgb, ${text2} 68%, ${surface});
29977
+ --settings-subtle: color-mix(in srgb, ${text2} 52%, ${surface});
29978
+ --settings-border: color-mix(in srgb, ${text2} 14%, transparent); --settings-focus: ${accent};
29390
29979
  --settings-primary: ${accent}; --settings-primary-hover: color-mix(in srgb, ${accent} 82%, white);
29391
29980
  --settings-primary-text: ${surface};
29392
29981
  }
@@ -29598,6 +30187,9 @@ ${logoCss}${polaroidCss}
29598
30187
  installedBadge: "Installed",
29599
30188
  uninstall: "Uninstall",
29600
30189
  uninstalling: "Removing...",
30190
+ retry: "Retry",
30191
+ installFailed: "Install failed",
30192
+ uninstallFailed: "Uninstall failed",
29601
30193
  tip: "Select in Appearance > Pets or type /pet to wake",
29602
30194
  empty: "No pets match the current filter.",
29603
30195
  officialBadge: "Official",
@@ -29618,6 +30210,9 @@ ${logoCss}${polaroidCss}
29618
30210
  installedBadge: "\u5DF2\u5B89\u88C5",
29619
30211
  uninstall: "\u5378\u8F7D",
29620
30212
  uninstalling: "\u5378\u8F7D\u4E2D...",
30213
+ retry: "\u91CD\u8BD5",
30214
+ installFailed: "\u5B89\u88C5\u5931\u8D25",
30215
+ uninstallFailed: "\u5378\u8F7D\u5931\u8D25",
29621
30216
  tip: "\u5B89\u88C5\u540E\u5728\u5B98\u65B9\u8BBE\u7F6E\u300C\u5916\u89C2 > \u684C\u5BA0\u300D\u6216\u8F93\u5165 /pet \u6307\u4EE4\u5524\u9192\u4F34\u4FA3",
29622
30217
  empty: "\u6CA1\u6709\u627E\u5230\u7B26\u5408\u6761\u4EF6\u7684\u684C\u5BA0\u3002",
29623
30218
  officialBadge: "\u5B98\u65B9\u9884\u8F7D",
@@ -29634,6 +30229,7 @@ ${logoCss}${polaroidCss}
29634
30229
  element.style.backgroundPosition = "0% 0%";
29635
30230
  let currentFrame = 0;
29636
30231
  let timer = null;
30232
+ let idleTimeout = null;
29637
30233
  let isHovered = false;
29638
30234
  const tick = () => {
29639
30235
  currentFrame = (currentFrame + 1) % SPRITE_FRAMES;
@@ -29670,12 +30266,20 @@ ${logoCss}${polaroidCss}
29670
30266
  const idleInterval = window.setInterval(() => {
29671
30267
  if (!isHovered && timer === null) {
29672
30268
  startLoop();
29673
- setTimeout(stopLoop, FRAME_DURATION_MS * SPRITE_FRAMES);
30269
+ if (idleTimeout !== null) window.clearTimeout(idleTimeout);
30270
+ idleTimeout = window.setTimeout(() => {
30271
+ idleTimeout = null;
30272
+ stopLoop();
30273
+ }, FRAME_DURATION_MS * SPRITE_FRAMES);
29674
30274
  }
29675
30275
  }, 4e3 + Math.random() * 3e3);
29676
30276
  return () => {
29677
30277
  stopLoop();
29678
30278
  clearInterval(idleInterval);
30279
+ if (idleTimeout !== null) {
30280
+ window.clearTimeout(idleTimeout);
30281
+ idleTimeout = null;
30282
+ }
29679
30283
  if (parentCard) {
29680
30284
  parentCard.removeEventListener("mouseenter", onMouseEnter);
29681
30285
  parentCard.removeEventListener("mouseleave", onMouseLeave);
@@ -29734,7 +30338,44 @@ ${logoCss}${polaroidCss}
29734
30338
  context.content.append(heading, intro, safety, toolbar, grid);
29735
30339
  let allPets = [];
29736
30340
  const imageCache = /* @__PURE__ */ new Map();
30341
+ const petStates = /* @__PURE__ */ new Map();
30342
+ let renderEpoch = 0;
30343
+ const runPetOperation = (pet, op) => {
30344
+ const client2 = getClient();
30345
+ const current = petStates.get(pet.id);
30346
+ if (!client2 || current && current.status !== "failed") return;
30347
+ petStates.set(pet.id, {
30348
+ status: op === "install" ? "installing" : "uninstalling"
30349
+ });
30350
+ renderGrid();
30351
+ const settle = (installed, failure) => {
30352
+ if (failure === null) {
30353
+ petStates.delete(pet.id);
30354
+ } else {
30355
+ petStates.set(pet.id, { status: "failed", op, error: failure });
30356
+ }
30357
+ allPets = allPets.map(
30358
+ (p) => p.id === pet.id ? { ...p, installed } : p
30359
+ );
30360
+ renderGrid();
30361
+ };
30362
+ const onSuccess = () => settle(op === "install", null);
30363
+ const onFailure = (err) => settle(pet.installed, err instanceof Error ? err.message : String(err));
30364
+ if (op === "install") {
30365
+ void client2.install({
30366
+ id: pet.id,
30367
+ displayName: pet.displayName,
30368
+ description: pet.description,
30369
+ spritesheetUrl: pet.spritesheetUrl,
30370
+ spriteVersionNumber: pet.spriteVersionNumber
30371
+ }).then(onSuccess, onFailure);
30372
+ } else {
30373
+ void client2.uninstall(pet.id).then(onSuccess, onFailure);
30374
+ }
30375
+ };
29737
30376
  const renderGrid = () => {
30377
+ renderEpoch += 1;
30378
+ const epoch = renderEpoch;
29738
30379
  for (const d of disposers) d();
29739
30380
  disposers.length = 0;
29740
30381
  grid.replaceChildren();
@@ -29759,55 +30400,17 @@ ${logoCss}${polaroidCss}
29759
30400
  return;
29760
30401
  }
29761
30402
  for (const pet of filtered) {
30403
+ const opState = petStates.get(pet.id);
29762
30404
  const card = document2.createElement("article");
29763
30405
  card.className = "pet-card";
29764
30406
  card.dataset.petId = pet.id;
29765
30407
  card.dataset.installed = String(pet.installed);
30408
+ if (opState) card.dataset.state = opState.status;
29766
30409
  const stage = document2.createElement("div");
29767
30410
  stage.className = "pet-card__stage";
29768
30411
  const sprite = document2.createElement("div");
29769
30412
  sprite.className = "pet-card__sprite";
29770
30413
  stage.append(sprite);
29771
- const client2 = getClient();
29772
- const cachedImg = imageCache.get(pet.id);
29773
- if (cachedImg) {
29774
- const disposeAnim = setupSpriteAnimation(sprite, cachedImg, pet.spriteVersionNumber);
29775
- disposers.push(disposeAnim);
29776
- } else if (pet.spritesheetUrl) {
29777
- imageCache.set(pet.id, pet.spritesheetUrl);
29778
- const disposeAnim = setupSpriteAnimation(
29779
- sprite,
29780
- pet.spritesheetUrl,
29781
- pet.spriteVersionNumber
29782
- );
29783
- disposers.push(disposeAnim);
29784
- } else if (client2) {
29785
- void client2.preview(pet.id).then(
29786
- (res) => {
29787
- if (res && res.dataBase64) {
29788
- const dataUrl = `data:${res.mime};base64,${res.dataBase64}`;
29789
- imageCache.set(pet.id, dataUrl);
29790
- const disposeAnim = setupSpriteAnimation(
29791
- sprite,
29792
- dataUrl,
29793
- pet.spriteVersionNumber
29794
- );
29795
- disposers.push(disposeAnim);
29796
- }
29797
- },
29798
- () => {
29799
- if (pet.previewUrl) {
29800
- sprite.style.backgroundImage = `url("${pet.previewUrl}")`;
29801
- sprite.style.backgroundSize = "contain";
29802
- sprite.style.backgroundPosition = "center";
29803
- }
29804
- }
29805
- );
29806
- } else if (pet.previewUrl) {
29807
- sprite.style.backgroundImage = `url("${pet.previewUrl}")`;
29808
- sprite.style.backgroundSize = "contain";
29809
- sprite.style.backgroundPosition = "center";
29810
- }
29811
30414
  const body = document2.createElement("div");
29812
30415
  body.className = "pet-card__body";
29813
30416
  const cardHeader = document2.createElement("div");
@@ -29817,7 +30420,12 @@ ${logoCss}${polaroidCss}
29817
30420
  title.textContent = pet.displayName;
29818
30421
  const badges = document2.createElement("div");
29819
30422
  badges.className = "pet-card__badges";
29820
- if (pet.installed) {
30423
+ if (opState?.status === "failed") {
30424
+ const b = document2.createElement("span");
30425
+ b.className = "pet-card__badge pet-card__badge--failed";
30426
+ b.textContent = opState.op === "install" ? copy.installFailed : copy.uninstallFailed;
30427
+ badges.append(b);
30428
+ } else if (pet.installed) {
29821
30429
  const b = document2.createElement("span");
29822
30430
  b.className = "pet-card__badge pet-card__badge--installed";
29823
30431
  b.append(createRendererSettingsIcon("check", 12), copy.installedBadge);
@@ -29844,65 +30452,96 @@ ${logoCss}${polaroidCss}
29844
30452
  hint.textContent = copy.tip;
29845
30453
  const actions = document2.createElement("div");
29846
30454
  actions.className = "pet-card__actions";
29847
- if (pet.installed) {
30455
+ if (opState?.status === "installing" || opState?.status === "uninstalling") {
30456
+ const busyBtn = document2.createElement("button");
30457
+ busyBtn.type = "button";
30458
+ busyBtn.className = opState.status === "installing" ? "pet-btn pet-btn--primary" : "pet-btn pet-btn--danger";
30459
+ busyBtn.disabled = true;
30460
+ busyBtn.textContent = opState.status === "installing" ? copy.installing : copy.uninstalling;
30461
+ actions.append(busyBtn);
30462
+ } else if (opState?.status === "failed") {
30463
+ const retryBtn = document2.createElement("button");
30464
+ retryBtn.type = "button";
30465
+ retryBtn.className = opState.op === "install" ? "pet-btn pet-btn--primary" : "pet-btn pet-btn--danger";
30466
+ retryBtn.textContent = copy.retry;
30467
+ retryBtn.addEventListener("click", () => runPetOperation(pet, opState.op));
30468
+ actions.append(retryBtn);
30469
+ } else if (pet.installed) {
29848
30470
  const uninstallBtn = document2.createElement("button");
29849
30471
  uninstallBtn.type = "button";
29850
30472
  uninstallBtn.className = "pet-btn pet-btn--danger";
29851
30473
  uninstallBtn.textContent = copy.uninstall;
29852
- uninstallBtn.addEventListener("click", () => {
29853
- if (!client2) return;
29854
- uninstallBtn.disabled = true;
29855
- uninstallBtn.textContent = copy.uninstalling;
29856
- void client2.uninstall(pet.id).then(
29857
- () => {
29858
- allPets = allPets.map(
29859
- (p) => p.id === pet.id ? { ...p, installed: false } : p
29860
- );
29861
- renderGrid();
29862
- },
29863
- (err) => {
29864
- uninstallBtn.disabled = false;
29865
- uninstallBtn.textContent = copy.uninstall;
29866
- alert(err instanceof Error ? err.message : String(err));
29867
- }
29868
- );
29869
- });
30474
+ uninstallBtn.addEventListener(
30475
+ "click",
30476
+ () => runPetOperation(pet, "uninstall")
30477
+ );
29870
30478
  actions.append(uninstallBtn);
29871
30479
  } else {
29872
30480
  const installBtn = document2.createElement("button");
29873
30481
  installBtn.type = "button";
29874
30482
  installBtn.className = "pet-btn pet-btn--primary";
29875
30483
  installBtn.textContent = copy.install;
29876
- installBtn.addEventListener("click", () => {
29877
- if (!client2) return;
29878
- installBtn.disabled = true;
29879
- installBtn.textContent = copy.installing;
29880
- void client2.install({
29881
- id: pet.id,
29882
- displayName: pet.displayName,
29883
- description: pet.description,
29884
- spritesheetUrl: pet.spritesheetUrl,
29885
- spriteVersionNumber: pet.spriteVersionNumber
29886
- }).then(
29887
- () => {
29888
- allPets = allPets.map(
29889
- (p) => p.id === pet.id ? { ...p, installed: true } : p
29890
- );
29891
- renderGrid();
29892
- },
29893
- (err) => {
29894
- installBtn.disabled = false;
29895
- installBtn.textContent = copy.install;
29896
- alert(err instanceof Error ? err.message : String(err));
29897
- }
29898
- );
29899
- });
30484
+ installBtn.addEventListener(
30485
+ "click",
30486
+ () => runPetOperation(pet, "install")
30487
+ );
29900
30488
  actions.append(installBtn);
29901
30489
  }
29902
30490
  footer.append(hint, actions);
29903
- body.append(cardHeader, desc, footer);
30491
+ if (opState?.status === "failed") {
30492
+ const errorBox = document2.createElement("div");
30493
+ errorBox.className = "pet-card__error";
30494
+ errorBox.textContent = opState.error;
30495
+ body.append(cardHeader, desc, errorBox, footer);
30496
+ } else if (opState) {
30497
+ const statusLine = document2.createElement("div");
30498
+ statusLine.className = "pet-card__status";
30499
+ statusLine.textContent = opState.status === "installing" ? copy.installing : copy.uninstalling;
30500
+ body.append(cardHeader, desc, statusLine, footer);
30501
+ } else {
30502
+ body.append(cardHeader, desc, footer);
30503
+ }
29904
30504
  card.append(stage, body);
29905
30505
  grid.append(card);
30506
+ const cachedImg = imageCache.get(pet.id);
30507
+ if (cachedImg) {
30508
+ disposers.push(
30509
+ setupSpriteAnimation(sprite, cachedImg, pet.spriteVersionNumber)
30510
+ );
30511
+ } else if (pet.spritesheetUrl) {
30512
+ imageCache.set(pet.id, pet.spritesheetUrl);
30513
+ disposers.push(
30514
+ setupSpriteAnimation(sprite, pet.spritesheetUrl, pet.spriteVersionNumber)
30515
+ );
30516
+ } else {
30517
+ const showStaticPreview = () => {
30518
+ if (!pet.previewUrl) return;
30519
+ sprite.style.backgroundImage = `url("${pet.previewUrl}")`;
30520
+ sprite.style.backgroundSize = "contain";
30521
+ sprite.style.backgroundPosition = "center";
30522
+ };
30523
+ const client2 = getClient();
30524
+ if (client2) {
30525
+ void client2.preview(pet.id).then(
30526
+ (res) => {
30527
+ if (epoch !== renderEpoch || !sprite.isConnected) return;
30528
+ if (res && res.dataBase64) {
30529
+ const dataUrl = `data:${res.mime};base64,${res.dataBase64}`;
30530
+ imageCache.set(pet.id, dataUrl);
30531
+ disposers.push(
30532
+ setupSpriteAnimation(sprite, dataUrl, pet.spriteVersionNumber)
30533
+ );
30534
+ }
30535
+ },
30536
+ () => {
30537
+ if (epoch !== renderEpoch || !sprite.isConnected) return;
30538
+ showStaticPreview();
30539
+ }
30540
+ );
30541
+ } else {
30542
+ showStaticPreview();
30543
+ }
30544
+ }
29906
30545
  }
29907
30546
  };
29908
30547
  for (const t of tabs) {
@@ -29941,8 +30580,18 @@ ${logoCss}${polaroidCss}
29941
30580
  );
29942
30581
  }
29943
30582
  return () => {
30583
+ renderEpoch += 1;
29944
30584
  for (const d of disposers) d();
29945
30585
  disposers.length = 0;
30586
+ for (const url2 of imageCache.values()) {
30587
+ if (url2.startsWith("blob:")) {
30588
+ try {
30589
+ URL.revokeObjectURL(url2);
30590
+ } catch {
30591
+ }
30592
+ }
30593
+ }
30594
+ imageCache.clear();
29946
30595
  };
29947
30596
  }
29948
30597
  });
@@ -29992,9 +30641,9 @@ ${logoCss}${polaroidCss}
29992
30641
  }
29993
30642
 
29994
30643
  // src/native-ui/renderer-extension/src/settings/pages.ts
29995
- var CODEXHOST_GITHUB_REPOSITORY_URL = "https://github.com/emo-xiaoyu/harness-mix";
29996
- var CODEXHOST_RELEASES_LATEST_URL = `${CODEXHOST_GITHUB_REPOSITORY_URL}/releases/latest`;
29997
- var CODEXHOST_NPM_MANUAL_UPDATE_COMMAND = "npm install -g harness-mix@latest";
30644
+ var HARNESSMIX_GITHUB_REPOSITORY_URL = "https://github.com/emo-xiaoyu/harness-mix";
30645
+ var HARNESSMIX_RELEASES_LATEST_URL = `${HARNESSMIX_GITHUB_REPOSITORY_URL}/releases/latest`;
30646
+ var HARNESSMIX_NPM_MANUAL_UPDATE_COMMAND = "npm install -g harness-mix@latest";
29998
30647
  function rendererUserAgentData(navigator2) {
29999
30648
  return navigator2.userAgentData;
30000
30649
  }
@@ -30095,7 +30744,7 @@ ${logoCss}${polaroidCss}
30095
30744
  checkUpdateBtn.className = "settings-command-button settings-command-button--secondary";
30096
30745
  checkUpdateBtn.append(createRendererSettingsIcon("updates", 14), messages.checkUpdateNow);
30097
30746
  checkUpdateBtn.addEventListener("click", () => {
30098
- const shell = document2.querySelector("[data-codexhost-settings-shell]");
30747
+ const shell = document2.querySelector("[data-harnessmix-settings-shell]");
30099
30748
  const updatesNavBtn = (shell?.shadowRoot ?? document2).querySelector(
30100
30749
  'button[data-page-id="updates"]'
30101
30750
  );
@@ -30118,11 +30767,11 @@ ${logoCss}${polaroidCss}
30118
30767
  openSource.textContent = messages.aboutOpenSource;
30119
30768
  const repository = document2.createElement("a");
30120
30769
  repository.className = "settings-about-repository-link";
30121
- repository.href = CODEXHOST_GITHUB_REPOSITORY_URL;
30770
+ repository.href = HARNESSMIX_GITHUB_REPOSITORY_URL;
30122
30771
  repository.target = "_blank";
30123
30772
  repository.rel = "noopener noreferrer";
30124
30773
  const repositoryUrl = document2.createElement("code");
30125
- repositoryUrl.textContent = CODEXHOST_GITHUB_REPOSITORY_URL;
30774
+ repositoryUrl.textContent = HARNESSMIX_GITHUB_REPOSITORY_URL;
30126
30775
  repository.append(
30127
30776
  createRendererSettingsIcon("external-link", 14),
30128
30777
  messages.aboutRepository,
@@ -30193,7 +30842,7 @@ ${logoCss}${polaroidCss}
30193
30842
  const manualNpmCommandRow = document2.createElement("div");
30194
30843
  manualNpmCommandRow.className = "settings-update-command";
30195
30844
  const manualNpmCommand = document2.createElement("code");
30196
- manualNpmCommand.textContent = CODEXHOST_NPM_MANUAL_UPDATE_COMMAND;
30845
+ manualNpmCommand.textContent = HARNESSMIX_NPM_MANUAL_UPDATE_COMMAND;
30197
30846
  const copyCommand = document2.createElement("button");
30198
30847
  copyCommand.type = "button";
30199
30848
  copyCommand.className = "settings-update-command__copy";
@@ -30211,7 +30860,7 @@ ${logoCss}${polaroidCss}
30211
30860
  restore(messages.updateCopyFailed);
30212
30861
  return;
30213
30862
  }
30214
- void clipboard.writeText(CODEXHOST_NPM_MANUAL_UPDATE_COMMAND).then(
30863
+ void clipboard.writeText(HARNESSMIX_NPM_MANUAL_UPDATE_COMMAND).then(
30215
30864
  () => restore(messages.updateCommandCopied),
30216
30865
  () => restore(messages.updateCopyFailed)
30217
30866
  );
@@ -30228,7 +30877,7 @@ ${logoCss}${polaroidCss}
30228
30877
  manualWindowsInstallerActions.className = "settings-update-actions";
30229
30878
  const manualWindowsInstallerLink = document2.createElement("a");
30230
30879
  manualWindowsInstallerLink.className = "settings-update-link";
30231
- manualWindowsInstallerLink.href = CODEXHOST_RELEASES_LATEST_URL;
30880
+ manualWindowsInstallerLink.href = HARNESSMIX_RELEASES_LATEST_URL;
30232
30881
  manualWindowsInstallerLink.target = "_blank";
30233
30882
  manualWindowsInstallerLink.rel = "noopener noreferrer";
30234
30883
  manualWindowsInstallerLink.append(
@@ -30244,7 +30893,7 @@ ${logoCss}${polaroidCss}
30244
30893
  actions.className = "settings-update-actions";
30245
30894
  const releaseLink = document2.createElement("a");
30246
30895
  releaseLink.className = "settings-update-link";
30247
- releaseLink.href = CODEXHOST_RELEASES_LATEST_URL;
30896
+ releaseLink.href = HARNESSMIX_RELEASES_LATEST_URL;
30248
30897
  releaseLink.target = "_blank";
30249
30898
  releaseLink.rel = "noopener noreferrer";
30250
30899
  releaseLink.append(
@@ -30489,7 +31138,7 @@ ${logoCss}${polaroidCss}
30489
31138
  }
30490
31139
 
30491
31140
  // src/native-ui/renderer-extension/src/settings/shell.css
30492
- var shell_default = ':host {\r\n --settings-bg: light-dark(#ffffff, #202020);\r\n --settings-sidebar: light-dark(#f7f7f8, #191919);\r\n --settings-panel: light-dark(#ffffff, #232323);\r\n --settings-surface: light-dark(#f6f6f6, #292929);\r\n --settings-surface-hover: light-dark(#eeeeee, #303030);\r\n --settings-inset: light-dark(#f3f3f3, #161616);\r\n --settings-text: light-dark(#0d0d0d, #ececec);\r\n --settings-muted: light-dark(#676767, #a3a3a3);\r\n --settings-subtle: light-dark(#8a8a8a, #777777);\r\n --settings-border: light-dark(rgb(13 13 13 / 9%), rgb(255 255 255 / 9%));\r\n --settings-divider: light-dark(rgb(13 13 13 / 7%), rgb(255 255 255 / 7%));\r\n --settings-hover: light-dark(rgb(13 13 13 / 5%), rgb(255 255 255 / 7%));\r\n --settings-active: light-dark(rgb(13 13 13 / 7%), rgb(255 255 255 / 9%));\r\n --settings-focus: light-dark(#0b75d1, #66aaf9);\r\n --settings-primary: light-dark(#171717, #f4f4f4);\r\n --settings-primary-hover: light-dark(#2f2f2f, #ffffff);\r\n --settings-primary-text: light-dark(#ffffff, #171717);\r\n --settings-warning: light-dark(#8a5500, #f5c96a);\r\n --settings-warning-bg: light-dark(#fff8e6, rgb(245 201 106 / 8%));\r\n --settings-warning-border: light-dark(#ead8a8, rgb(245 201 106 / 24%));\r\n --settings-danger: light-dark(#b42318, #f87171);\r\n --settings-danger-bg: light-dark(#fff1f0, rgb(239 68 68 / 8%));\r\n --settings-danger-border: light-dark(#f3c7c3, rgb(239 68 68 / 22%));\r\n --settings-success: light-dark(#16784a, #4ade80);\r\n color: var(--settings-text);\r\n color-scheme: inherit;\r\n font:\r\n 13px/1.5 system-ui,\r\n -apple-system,\r\n BlinkMacSystemFont,\r\n "Segoe UI",\r\n sans-serif;\r\n letter-spacing: 0;\r\n}\r\n\r\n*,\r\n*::before,\r\n*::after {\r\n box-sizing: border-box;\r\n letter-spacing: 0;\r\n}\r\n\r\nbutton,\r\ninput,\r\nselect {\r\n font: inherit;\r\n}\r\n\r\nbutton {\r\n color: inherit;\r\n}\r\n\r\n[hidden] {\r\n display: none !important;\r\n}\r\n\r\n.settings-visually-hidden {\r\n position: absolute;\r\n width: 1px;\r\n height: 1px;\r\n padding: 0;\r\n margin: -1px;\r\n overflow: hidden;\r\n clip-path: inset(50%);\r\n white-space: nowrap;\r\n border: 0;\r\n}\r\n\r\n.codexhost-settings-dialog {\r\n width: min(1120px, calc(100vw - 48px));\r\n height: min(780px, calc(100vh - 88px));\r\n max-width: none;\r\n max-height: calc(100vh - 88px);\r\n margin-top: max(56px, calc((100vh - 780px) / 2));\r\n margin-inline: auto;\r\n margin-bottom: auto;\r\n padding: 0;\r\n overflow: hidden;\r\n color: var(--settings-text);\r\n background: var(--settings-bg);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 14px;\r\n box-shadow: light-dark(0 16px 42px rgb(0 0 0 / 16%), 0 20px 54px rgb(0 0 0 / 42%));\r\n}\r\n\r\n.codexhost-settings-dialog::backdrop {\r\n background: light-dark(rgb(0 0 0 / 24%), rgb(0 0 0 / 56%));\r\n backdrop-filter: blur(1px);\r\n}\r\n\r\n.settings-frame,\r\n.settings-layout {\r\n width: 100%;\r\n height: 100%;\r\n min-width: 0;\r\n min-height: 0;\r\n}\r\n\r\n.settings-frame {\r\n display: flex;\r\n flex-direction: column;\r\n}\r\n\r\n.settings-layout {\r\n flex: 1;\r\n display: grid;\r\n grid-template-columns: 184px minmax(0, 1fr);\r\n background: var(--settings-bg);\r\n}\r\n\r\n.settings-sidebar {\r\n display: flex;\r\n min-width: 0;\r\n min-height: 0;\r\n flex-direction: column;\r\n overflow: hidden;\r\n background: var(--settings-sidebar);\r\n border-right: 1px solid var(--settings-border);\r\n padding-top: 14px;\r\n}\r\n\r\n.settings-header {\r\n display: flex;\r\n align-items: center;\r\n min-width: 0;\r\n height: 50px;\r\n flex: none;\r\n padding: 0 16px;\r\n border-bottom: 1px solid var(--settings-border);\r\n}\r\n\r\n.settings-header-actions {\r\n display: flex;\r\n align-items: center;\r\n flex: none;\r\n gap: 12px;\r\n margin-left: auto;\r\n}\r\n\r\n.settings-brand {\r\n display: flex;\r\n align-items: center;\r\n min-width: 0;\r\n gap: 7px;\r\n}\r\n\r\n.settings-brand__mark {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 26px;\r\n height: 26px;\r\n flex: none;\r\n color: var(--settings-text);\r\n}\r\n\r\n.settings-brand__mark .codexhost-settings-icon {\r\n width: 24px;\r\n height: 24px;\r\n object-fit: contain;\r\n}\r\n\r\n.settings-brand__copy {\r\n display: flex;\r\n min-width: 0;\r\n align-items: baseline;\r\n gap: 0;\r\n line-height: 20px;\r\n}\r\n\r\n.settings-brand__name {\r\n overflow: hidden;\r\n color: var(--settings-text);\r\n font-size: 13px;\r\n font-weight: 600;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.settings-brand__title {\r\n margin-left: 8px;\r\n padding-left: 8px;\r\n color: var(--settings-muted);\r\n font-size: 13px;\r\n font-weight: 400;\r\n border-left: 1px solid var(--settings-border);\r\n}\r\n\r\n.settings-nav {\r\n display: flex;\r\n min-width: 0;\r\n min-height: 0;\r\n flex: 1;\r\n flex-direction: column;\r\n gap: 2px;\r\n padding: 0 7px 10px;\r\n overflow-y: auto;\r\n}\r\n\r\n.settings-nav-section-label {\r\n min-height: 24px;\r\n padding: 4px 9px 2px;\r\n color: var(--settings-subtle);\r\n font-size: 11px;\r\n font-weight: 600;\r\n line-height: 18px;\r\n}\r\n\r\n.settings-nav-section-label:not(:first-child) {\r\n margin-top: 8px;\r\n}\r\n\r\n.settings-nav-button {\r\n display: grid;\r\n grid-template-columns: 16px minmax(0, 1fr);\r\n align-items: center;\r\n width: 100%;\r\n position: relative;\r\n min-height: 34px;\r\n flex: none;\r\n gap: 9px;\r\n padding: 6px 9px;\r\n color: var(--settings-text);\r\n font-size: 13px;\r\n line-height: 20px;\r\n text-align: left;\r\n background: transparent;\r\n border: 0;\r\n border-radius: 8px;\r\n cursor: pointer;\r\n}\r\n\r\n.settings-nav-button .codexhost-settings-icon {\r\n width: 16px;\r\n height: 16px;\r\n opacity: 0.9;\r\n}\r\n\r\n.settings-nav-button:hover {\r\n background: var(--settings-hover);\r\n}\r\n\r\n.settings-nav-button[aria-current="page"] {\r\n background: var(--settings-active);\r\n color: var(--settings-text);\r\n font-weight: 500;\r\n}\r\n\r\n.settings-nav-button span {\r\n min-width: 0;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.settings-nav-star-link {\r\n margin-top: 0;\r\n color: var(--settings-text);\r\n text-decoration: none;\r\n}\r\n\r\n.settings-nav-star-link .codexhost-settings-icon {\r\n color: var(--settings-warning);\r\n}\r\n\r\n.settings-nav-star-link:hover {\r\n color: var(--settings-warning);\r\n background: var(--settings-warning-bg);\r\n}\r\n\r\n.settings-icon-button {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 32px;\r\n height: 32px;\r\n flex: none;\r\n padding: 0;\r\n color: var(--settings-muted);\r\n background: transparent;\r\n border: 0;\r\n border-radius: 8px;\r\n cursor: pointer;\r\n transition: background-color 0.15s ease, color 0.15s ease, transform 0.08s ease;\r\n}\r\n\r\n.settings-icon-button:hover {\r\n color: var(--settings-text);\r\n background: var(--settings-hover);\r\n}\r\n\r\n.settings-icon-button:active {\r\n background: var(--settings-active);\r\n transform: scale(0.95);\r\n}\r\n\r\n.settings-header-actions .settings-icon-button {\r\n width: 34px;\r\n height: 34px;\r\n border-radius: 8px;\r\n}\r\n\r\n.settings-header-actions .settings-icon-button:hover {\r\n color: var(--settings-text);\r\n background: var(--settings-hover);\r\n}\r\n\r\n.settings-icon-button:focus-visible,\r\n.settings-nav-button:focus-visible {\r\n outline: 2px solid var(--settings-focus);\r\n outline-offset: 1px;\r\n}\r\n\r\n.settings-page {\r\n display: block;\r\n position: relative;\r\n min-width: 0;\r\n min-height: 0;\r\n overflow-y: auto;\r\n background: var(--settings-bg);\r\n scrollbar-gutter: stable;\r\n}\r\n\r\n.settings-page__content {\r\n width: min(930px, calc(100% - 80px));\r\n margin-inline: auto;\r\n}\r\n\r\n.settings-page__content {\r\n min-width: 0;\r\n padding: 28px 0 36px;\r\n}\r\n\r\n.settings-section-label {\r\n min-height: auto;\r\n margin: 0;\r\n padding: 0 0 18px;\r\n color: var(--settings-text);\r\n font-size: 18px;\r\n font-weight: 600;\r\n line-height: 26px;\r\n}\r\n\r\n.settings-status-list,\r\n.settings-empty {\r\n overflow: hidden;\r\n background: var(--settings-panel);\r\n}\r\n\r\n.settings-status-row {\r\n display: grid;\r\n grid-template-columns: minmax(170px, 1fr) auto minmax(280px, 1.45fr);\r\n position: relative;\r\n align-items: center;\r\n min-height: 72px;\r\n gap: 20px;\r\n padding: 12px 0;\r\n}\r\n\r\n.settings-status-row:not(:last-child)::after {\r\n content: "";\r\n position: absolute;\r\n right: 0;\r\n bottom: 0;\r\n left: 0;\r\n height: 1px;\r\n background: var(--settings-divider);\r\n}\r\n\r\n.settings-status-row__identity {\r\n display: inline-flex;\r\n align-items: center;\r\n min-width: 0;\r\n color: var(--settings-text);\r\n gap: 10px;\r\n font-size: 14px;\r\n font-weight: 500;\r\n line-height: 22px;\r\n}\r\n\r\n.settings-status-row__icon {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 36px;\r\n height: 36px;\r\n flex: none;\r\n color: var(--settings-muted);\r\n background: var(--settings-surface);\r\n border-radius: 50%;\r\n}\r\n\r\n.settings-status-badge {\r\n flex: none;\r\n padding: 3px 8px;\r\n color: var(--settings-muted);\r\n font-size: 11px;\r\n font-weight: 500;\r\n line-height: 18px;\r\n background: var(--settings-surface);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 6px;\r\n}\r\n\r\n.settings-status-row__detail {\r\n min-width: 0;\r\n color: var(--settings-muted);\r\n font-size: 13px;\r\n line-height: 20px;\r\n}\r\n\r\n.settings-page-description {\r\n max-width: 760px;\r\n margin: -10px 0 20px;\r\n color: var(--settings-muted);\r\n font-size: 12px;\r\n line-height: 18px;\r\n}\r\n\r\n.settings-session-import-header {\r\n display: flex;\r\n align-items: flex-start;\r\n justify-content: space-between;\r\n gap: 24px;\r\n}\r\n\r\n.settings-session-import-header .settings-section-label {\r\n min-width: 0;\r\n}\r\n\r\n.settings-session-import-harness {\r\n display: flex;\r\n align-items: center;\r\n min-width: 0;\r\n gap: 12px;\r\n margin: -12px 0 16px;\r\n color: var(--settings-muted);\r\n font-size: 13px;\r\n}\r\n\r\n.settings-session-import-harness > span {\r\n flex: none;\r\n}\r\n\r\n.settings-session-import-harness__options {\r\n display: flex;\r\n align-items: center;\r\n min-width: 0;\r\n flex: 1;\r\n gap: 6px;\r\n overflow-x: auto;\r\n overflow-y: hidden;\r\n scrollbar-width: none;\r\n}\r\n\r\n.settings-session-import-harness__options::-webkit-scrollbar {\r\n display: none;\r\n}\r\n\r\n.settings-session-import-harness__option {\r\n min-height: 32px;\r\n flex: none;\r\n padding: 6px 10px;\r\n color: var(--settings-muted);\r\n font: inherit;\r\n font-size: 12px;\r\n white-space: nowrap;\r\n background: rgb(255 255 255 / 4%);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 6px;\r\n cursor: pointer;\r\n}\r\n\r\n.settings-session-import-harness__option[aria-pressed="true"] {\r\n color: var(--settings-text);\r\n background: var(--settings-active);\r\n border-color: rgb(51 156 255 / 50%);\r\n}\r\n\r\n.settings-session-import-harness__option:disabled {\r\n opacity: 0.38;\r\n cursor: not-allowed;\r\n}\r\n\r\n.settings-session-import-harness__option:focus-visible {\r\n outline: 2px solid var(--settings-focus);\r\n outline-offset: 2px;\r\n}\r\n\r\n.settings-session-import-harness + .settings-page-description {\r\n margin-top: 0;\r\n margin-bottom: 4px;\r\n}\r\n\r\n.settings-session-import-availability-note {\r\n margin-top: 0;\r\n}\r\n\r\n.settings-session-import-search,\r\n.settings-session-import-pagination {\r\n display: flex;\r\n flex-wrap: wrap;\r\n align-items: center;\r\n gap: 10px;\r\n margin: 16px 0;\r\n}\r\n\r\n.settings-session-import-search input {\r\n flex: 1;\r\n min-width: 160px;\r\n}\r\n\r\n.settings-session-import-search input,\r\n.settings-session-import-pagination select {\r\n min-height: 36px;\r\n padding: 6px 10px;\r\n color: var(--settings-text);\r\n background: var(--settings-bg);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 6px;\r\n}\r\n\r\n.settings-session-import-search input:focus-visible,\r\n.settings-session-import-pagination select:focus-visible {\r\n outline: 2px solid var(--settings-focus);\r\n outline-offset: 2px;\r\n}\r\n\r\n.settings-session-import-pagination {\r\n color: var(--settings-muted);\r\n font-size: 12px;\r\n}\r\n\r\n.settings-session-import-pagination label {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n}\r\n\r\n.settings-session-import-pagination > span {\r\n flex: 1;\r\n min-width: 130px;\r\n}\r\n\r\n.settings-session-import-pagination__navigation {\r\n display: flex;\r\n gap: 8px;\r\n margin-left: auto;\r\n}\r\n\r\n.settings-session-import-content,\r\n.settings-session-import-list {\r\n display: grid;\r\n gap: 10px;\r\n}\r\n\r\n.settings-session-import-status {\r\n display: flex;\r\n align-items: center;\r\n min-height: 64px;\r\n gap: 12px;\r\n padding: 16px;\r\n color: var(--settings-muted);\r\n background: var(--settings-panel);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 8px;\r\n}\r\n\r\n.settings-session-import-status.is-error {\r\n color: #ef4444;\r\n}\r\n\r\n.settings-session-import-recovery {\r\n display: grid;\r\n justify-items: start;\r\n gap: 14px;\r\n padding: 16px;\r\n background: var(--settings-panel);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 8px;\r\n}\r\n\r\n.settings-session-import-recovery:focus-visible {\r\n outline: 2px solid var(--settings-focus);\r\n outline-offset: 2px;\r\n}\r\n\r\n.settings-session-import-recovery__copy {\r\n display: grid;\r\n gap: 4px;\r\n}\r\n\r\n.settings-session-import-recovery__copy strong {\r\n color: var(--settings-text);\r\n font-size: 14px;\r\n}\r\n\r\n.settings-session-import-recovery__copy p {\r\n margin: 0;\r\n color: var(--settings-muted);\r\n font-size: 13px;\r\n line-height: 20px;\r\n}\r\n\r\n.settings-session-import-recovery__path {\r\n display: flex;\r\n align-items: stretch;\r\n width: 100%;\r\n min-width: 0;\r\n overflow: hidden;\r\n border: 1px solid var(--settings-border);\r\n border-radius: 6px;\r\n}\r\n\r\n.settings-session-import-recovery__path code {\r\n min-width: 0;\r\n flex: 1;\r\n padding: 8px 10px;\r\n overflow-x: auto;\r\n color: var(--settings-text);\r\n font-size: 12px;\r\n line-height: 20px;\r\n white-space: nowrap;\r\n}\r\n\r\n.settings-session-import-recovery__path .settings-command-button {\r\n min-height: 0;\r\n flex: none;\r\n border-width: 0 0 0 1px;\r\n border-radius: 0;\r\n}\r\n\r\n.settings-session-import-row {\r\n display: grid;\r\n grid-template-columns: minmax(0, 1fr) auto;\r\n align-items: center;\r\n gap: 20px;\r\n min-width: 0;\r\n padding: 16px;\r\n background: var(--settings-panel);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 8px;\r\n}\r\n\r\n.settings-session-import-row__copy {\r\n display: grid;\r\n min-width: 0;\r\n gap: 4px;\r\n}\r\n\r\n.settings-session-import-row__copy strong {\r\n overflow: hidden;\r\n color: var(--settings-text);\r\n font-size: 14px;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.settings-session-import-row__copy span,\r\n.settings-session-import-row__cwd {\r\n overflow: hidden;\r\n color: var(--settings-muted);\r\n font-size: 12px;\r\n line-height: 18px;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.settings-session-import-row__cwd {\r\n display: block;\r\n min-width: 0;\r\n background: transparent;\r\n}\r\n\r\n.settings-session-import-row__action {\r\n display: flex;\r\n align-items: flex-end;\r\n flex-direction: column;\r\n gap: 8px;\r\n}\r\n\r\n.settings-session-import-running {\r\n color: var(--settings-muted);\r\n font-size: 12px;\r\n}\r\n\r\n.settings-preference-row {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: 32px;\r\n min-height: 88px;\r\n padding: 18px 0;\r\n border-top: 1px solid var(--settings-divider);\r\n border-bottom: 1px solid var(--settings-divider);\r\n}\r\n\r\n.settings-preference-row__copy {\r\n display: flex;\r\n flex: 1 1 auto;\r\n flex-direction: column;\r\n min-width: 0;\r\n gap: 5px;\r\n}\r\n\r\n.settings-preference-row__copy strong {\r\n color: var(--settings-text);\r\n font-size: 15px;\r\n font-weight: 600;\r\n line-height: 22px;\r\n}\r\n\r\n.settings-preference-row__copy span {\r\n max-width: 680px;\r\n color: var(--settings-muted);\r\n font-size: 13px;\r\n line-height: 20px;\r\n}\r\n\r\n.settings-preference-switch {\r\n display: inline-flex;\r\n align-items: center;\r\n width: 42px;\r\n height: 24px;\r\n flex: none;\r\n padding: 2px;\r\n border: 0;\r\n border-radius: 999px;\r\n background: var(--settings-surface-hover);\r\n cursor: pointer;\r\n transition: background 120ms ease;\r\n}\r\n\r\n.settings-preference-switch[aria-checked="true"] {\r\n justify-content: flex-end;\r\n background: var(--settings-focus);\r\n}\r\n\r\n.settings-preference-switch:focus-visible {\r\n outline: 2px solid var(--settings-focus);\r\n outline-offset: 2px;\r\n}\r\n\r\n.settings-preference-switch__thumb {\r\n width: 20px;\r\n height: 20px;\r\n border-radius: 50%;\r\n background: var(--settings-primary-text);\r\n box-shadow: 0 1px 3px rgb(0 0 0 / 24%);\r\n}\r\n\r\n.settings-connection-page-header {\r\n display: flex;\r\n align-items: flex-start;\r\n justify-content: space-between;\r\n gap: 18px;\r\n margin-bottom: 18px;\r\n}\r\n\r\n.settings-connection-page-header .settings-section-label {\r\n padding-bottom: 0;\r\n}\r\n\r\n.settings-connection-page-header .settings-page-description {\r\n margin: 5px 0 0;\r\n}\r\n\r\n.settings-connections-content,\r\n.settings-connections-layout,\r\n.settings-connection-list,\r\n.settings-connection-rows {\r\n min-width: 0;\r\n}\r\n\r\n.settings-connections-layout {\r\n display: grid;\r\n grid-template-columns: minmax(0, 1.55fr) minmax(280px, 0.85fr);\r\n align-items: start;\r\n gap: 18px;\r\n}\r\n\r\n.settings-connection-list,\r\n.settings-connection-inspector {\r\n overflow: hidden;\r\n background: var(--settings-panel);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 10px;\r\n}\r\n\r\n.settings-connection-host-strip {\r\n display: grid;\r\n grid-template-columns: 30px minmax(0, 1fr) 30px;\r\n align-items: center;\r\n min-width: 0;\r\n gap: 5px;\r\n padding: 9px 10px;\r\n border-bottom: 1px solid var(--settings-divider);\r\n}\r\n\r\n.settings-connection-host-scroll {\r\n display: none;\r\n align-items: center;\r\n justify-content: center;\r\n width: 30px;\r\n height: 34px;\r\n padding: 0;\r\n color: var(--settings-muted);\r\n background: var(--settings-inset);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 8px;\r\n cursor: pointer;\r\n}\r\n\r\n.settings-connection-host-strip[data-connection-host-overflow="true"]\r\n .settings-connection-host-scroll {\r\n display: inline-flex;\r\n}\r\n\r\n.settings-connection-host-strip:not([data-connection-host-overflow="true"]) {\r\n grid-template-columns: minmax(0, 1fr);\r\n}\r\n\r\n.settings-connection-host-scroll:hover:not(:disabled) {\r\n color: var(--settings-text);\r\n background: var(--settings-hover);\r\n}\r\n\r\n.settings-connection-host-scroll:disabled {\r\n cursor: default;\r\n opacity: 0.35;\r\n}\r\n\r\n.settings-connection-host-scroll:focus-visible,\r\n.settings-connection-host-tab:focus-visible,\r\n.settings-connection-row:focus-visible,\r\n.settings-connection-install-link:focus-visible,\r\n.settings-connection-view-error:focus-visible {\r\n outline: 2px solid var(--settings-focus);\r\n outline-offset: 1px;\r\n}\r\n\r\n.settings-connection-host-tabs {\r\n display: flex;\r\n align-items: center;\r\n min-width: 0;\r\n gap: 6px;\r\n overflow-x: auto;\r\n overflow-y: hidden;\r\n overscroll-behavior-x: contain;\r\n scrollbar-width: none;\r\n scroll-behavior: smooth;\r\n scroll-snap-type: x proximity;\r\n touch-action: pan-x;\r\n}\r\n\r\n.settings-connection-host-tabs::-webkit-scrollbar {\r\n display: none;\r\n}\r\n\r\n.settings-connection-host-tab {\r\n display: inline-flex;\r\n align-items: center;\r\n height: 30px;\r\n min-width: max-content;\r\n flex: none;\r\n padding: 0 9px;\r\n color: var(--settings-muted);\r\n font: inherit;\r\n font-size: 12px;\r\n line-height: 18px;\r\n white-space: nowrap;\r\n background: var(--settings-inset);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 7px;\r\n cursor: pointer;\r\n scroll-snap-align: start;\r\n}\r\n\r\n.settings-connection-host-tab:hover {\r\n color: var(--settings-text);\r\n background: var(--settings-hover);\r\n}\r\n\r\n.settings-connection-host-tab[aria-selected="true"] {\r\n color: var(--settings-text);\r\n font-weight: 600;\r\n background: var(--settings-active);\r\n border-color: var(--settings-border);\r\n}\r\n\r\n.settings-connection-table-header,\r\n.settings-connection-row {\r\n display: grid;\r\n grid-template-columns: minmax(160px, 1fr) minmax(92px, auto) 108px;\r\n align-items: center;\r\n min-width: 0;\r\n gap: 10px;\r\n}\r\n\r\n.settings-connection-table-header {\r\n min-height: 30px;\r\n padding: 0 10px;\r\n color: var(--settings-muted);\r\n font-size: 10px;\r\n font-weight: 600;\r\n line-height: 16px;\r\n text-transform: uppercase;\r\n letter-spacing: 0.06em;\r\n background: transparent;\r\n border-bottom: 1px solid var(--settings-divider);\r\n}\r\n\r\n.settings-connection-row {\r\n min-height: 52px;\r\n padding: 8px 10px;\r\n cursor: pointer;\r\n border-bottom: 1px solid var(--settings-divider);\r\n}\r\n\r\n.settings-connection-row:last-child {\r\n border-bottom: 0;\r\n}\r\n\r\n.settings-connection-row:hover {\r\n background: var(--settings-hover);\r\n}\r\n\r\n.settings-connection-row[data-connection-selected="true"] {\r\n background: var(--settings-surface);\r\n}\r\n\r\n.settings-connection-row__identity,\r\n.settings-connection-inspector__identity {\r\n display: inline-flex;\r\n align-items: center;\r\n min-width: 0;\r\n gap: 8px;\r\n color: var(--settings-text);\r\n}\r\n\r\n.settings-connection-row__identity strong,\r\n.settings-connection-inspector__identity strong {\r\n min-width: 0;\r\n overflow-wrap: anywhere;\r\n font-size: 12px;\r\n font-weight: 500;\r\n line-height: 18px;\r\n}\r\n\r\n.settings-connection-row__mark {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 24px;\r\n height: 24px;\r\n flex: none;\r\n color: var(--settings-muted);\r\n font-size: 10px;\r\n font-weight: 700;\r\n background: var(--settings-surface);\r\n border-radius: 6px;\r\n}\r\n\r\n.settings-connection-row__mark--logo {\r\n color: var(--settings-text);\r\n background: transparent;\r\n}\r\n\r\n.settings-connection-row__mark--logo > img,\r\n.settings-connection-row__mark--logo > svg {\r\n display: block;\r\n max-width: 18px;\r\n max-height: 18px;\r\n}\r\n\r\n.settings-connection-row__status {\r\n display: inline-flex;\r\n align-items: center;\r\n width: fit-content;\r\n gap: 5px;\r\n color: var(--settings-muted);\r\n font-size: 11px;\r\n font-weight: 500;\r\n line-height: 18px;\r\n}\r\n\r\n.settings-connection-row__status::before {\r\n width: 6px;\r\n height: 6px;\r\n flex: none;\r\n content: "";\r\n background: currentColor;\r\n border-radius: 50%;\r\n}\r\n\r\n.settings-connection-row__status[data-connection-tone="ready"] {\r\n color: var(--settings-success);\r\n}\r\n\r\n.settings-connection-row__status[data-connection-tone="checking"] {\r\n color: var(--settings-warning);\r\n}\r\n\r\n.settings-connection-row__status[data-connection-tone="setup"] {\r\n color: var(--settings-muted);\r\n}\r\n\r\n.settings-connection-row__status[data-connection-tone="setup"]::before {\r\n background: transparent;\r\n border: 1.5px solid currentColor;\r\n}\r\n\r\n.settings-connection-row__status[data-connection-tone="failed"] {\r\n color: var(--settings-danger);\r\n}\r\n\r\n.settings-connection-row__action {\r\n display: flex;\r\n align-items: center;\r\n justify-content: flex-end;\r\n min-width: 0;\r\n gap: 4px;\r\n}\r\n\r\n.settings-connection-row__handle {\r\n display: inline-flex;\r\n flex: none;\r\n align-items: center;\r\n justify-content: center;\r\n width: 16px;\r\n color: var(--settings-muted);\r\n cursor: grab;\r\n opacity: 0.6;\r\n}\r\n\r\n.settings-connection-row__handle:hover {\r\n opacity: 1;\r\n}\r\n\r\n.settings-connection-row[draggable="true"] {\r\n cursor: grab;\r\n}\r\n\r\n.settings-connection-row[data-connection-dragging="true"] {\r\n opacity: 0.4;\r\n}\r\n\r\n.settings-connection-row[data-connection-drop-indicator="before"] {\r\n box-shadow: inset 0 2px 0 0 var(--settings-focus);\r\n}\r\n\r\n.settings-connection-row[data-connection-drop-indicator="after"] {\r\n box-shadow: inset 0 -2px 0 0 var(--settings-focus);\r\n}\r\n\r\n.settings-connection-row__group-toggle {\r\n display: inline-flex;\r\n flex: none;\r\n align-items: center;\r\n justify-content: center;\r\n width: 26px;\r\n height: 26px;\r\n color: var(--settings-muted);\r\n background: transparent;\r\n border: 0;\r\n border-radius: 6px;\r\n cursor: pointer;\r\n}\r\n\r\n.settings-connection-row__group-toggle:hover {\r\n color: var(--settings-text);\r\n background: var(--settings-hover);\r\n}\r\n\r\n.settings-connection-group-divider {\r\n padding: 10px 12px 6px;\r\n color: var(--settings-muted);\r\n font-size: 10px;\r\n font-weight: 600;\r\n line-height: 16px;\r\n text-transform: uppercase;\r\n letter-spacing: 0.06em;\r\n /* No border-top here: the row immediately above already carries its own\r\n border-bottom (it is no longer :last-child once this divider follows\r\n it), so adding one here would double the separator line. */\r\n}\r\n\r\n.settings-connection-group-more[data-connection-drag-over="true"] {\r\n background: rgb(51 156 255 / 8%);\r\n}\r\n\r\n.settings-connection-group-hint {\r\n display: grid;\r\n gap: 3px;\r\n margin: 0 12px 12px;\r\n padding: 14px 16px;\r\n text-align: center;\r\n border: 1.5px dashed var(--settings-border);\r\n border-radius: 10px;\r\n}\r\n\r\n.settings-connection-group-more[data-connection-drag-over="true"] .settings-connection-group-hint {\r\n border-color: var(--settings-focus);\r\n}\r\n\r\n.settings-connection-group-hint strong {\r\n color: var(--settings-text);\r\n font-size: 12.5px;\r\n font-weight: 500;\r\n line-height: 18px;\r\n}\r\n\r\n.settings-connection-group-hint span {\r\n color: var(--settings-muted);\r\n font-size: 12px;\r\n line-height: 17px;\r\n}\r\n\r\n.settings-connection-group-reset {\r\n display: flex;\r\n width: 100%;\r\n align-items: center;\r\n gap: 6px;\r\n padding: 10px 12px;\r\n color: var(--settings-muted);\r\n font: inherit;\r\n font-size: 12px;\r\n text-align: left;\r\n background: transparent;\r\n border: 0;\r\n border-top: 1px solid var(--settings-divider);\r\n cursor: pointer;\r\n}\r\n\r\n.settings-connection-group-reset:hover {\r\n color: var(--settings-text);\r\n background: var(--settings-hover);\r\n}\r\n\r\n.settings-connection-install-link {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 26px;\r\n height: 26px;\r\n color: var(--settings-focus);\r\n text-decoration: none;\r\n background: transparent;\r\n border: 1px solid transparent;\r\n border-radius: 7px;\r\n opacity: 0;\r\n transition: opacity 120ms ease;\r\n}\r\n\r\n.settings-connection-row:hover .settings-connection-install-link,\r\n.settings-connection-install-link:focus-visible {\r\n opacity: 1;\r\n}\r\n\r\n.settings-connection-install-link:hover {\r\n color: var(--settings-focus);\r\n background: var(--settings-active);\r\n border-color: var(--settings-border);\r\n}\r\n\r\n.settings-connection-view-error {\r\n padding: 4px 7px;\r\n color: var(--settings-danger);\r\n font: inherit;\r\n font-size: 11px;\r\n line-height: 18px;\r\n background: transparent;\r\n border: 0;\r\n border-radius: 6px;\r\n cursor: pointer;\r\n}\r\n\r\n.settings-connection-view-error:hover {\r\n color: var(--settings-danger);\r\n background: var(--settings-danger-bg);\r\n}\r\n\r\n.settings-connection-inspector {\r\n position: sticky;\r\n top: 18px;\r\n}\r\n\r\n.settings-connection-inspector__header {\r\n display: flex;\r\n align-items: flex-start;\r\n justify-content: space-between;\r\n min-width: 0;\r\n gap: 10px;\r\n padding: 12px;\r\n border-bottom: 1px solid var(--settings-divider);\r\n}\r\n\r\n.settings-connection-inspector__body {\r\n display: grid;\r\n min-width: 0;\r\n gap: 12px;\r\n padding: 12px;\r\n}\r\n\r\n.settings-connection-install-callout {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 14px;\r\n padding: 14px;\r\n background: var(--settings-surface);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 10px;\r\n}\r\n\r\n.settings-connection-install-head {\r\n display: flex;\r\n align-items: flex-start;\r\n gap: 12px;\r\n min-width: 0;\r\n}\r\n\r\n.settings-connection-install-head > div {\r\n min-width: 0;\r\n flex: 1;\r\n}\r\n\r\n.settings-connection-install-callout__icon {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 32px;\r\n height: 32px;\r\n flex: none;\r\n color: var(--settings-focus);\r\n background: var(--settings-active);\r\n border-radius: 8px;\r\n}\r\n\r\n.settings-connection-install-callout strong,\r\n.settings-connection-install-head strong,\r\n.settings-connection-error-summary strong,\r\n.settings-connection-state-summary strong {\r\n display: block;\r\n margin: 0 0 4px;\r\n color: var(--settings-text);\r\n font-size: 13px;\r\n font-weight: 600;\r\n line-height: 19px;\r\n}\r\n\r\n.settings-connection-install-callout p,\r\n.settings-connection-install-head p,\r\n.settings-connection-error-summary p,\r\n.settings-connection-state-summary p,\r\n.settings-connection-issue-note {\r\n margin: 0;\r\n color: var(--settings-muted);\r\n font-size: 12px;\r\n line-height: 18px;\r\n}\r\n\r\n.settings-connection-install-button {\r\n width: 100%;\r\n}\r\n\r\n.settings-connection-error-summary {\r\n padding: 13px 14px;\r\n color: var(--settings-danger);\r\n background: var(--settings-danger-bg);\r\n border: 1px solid var(--settings-danger-border);\r\n border-radius: 10px;\r\n}\r\n\r\n.settings-connection-error-metadata {\r\n display: grid;\r\n gap: 7px;\r\n padding: 12px;\r\n background: var(--settings-inset);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 9px;\r\n}\r\n\r\n.settings-connection-detail-line {\r\n display: grid;\r\n grid-template-columns: 92px minmax(0, 1fr);\r\n gap: 10px;\r\n min-width: 0;\r\n color: var(--settings-muted);\r\n font-size: 10px;\r\n line-height: 16px;\r\n}\r\n\r\n.settings-connection-detail-line code {\r\n min-width: 0;\r\n overflow-wrap: anywhere;\r\n color: var(--settings-text);\r\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\r\n white-space: pre-wrap;\r\n}\r\n\r\n.settings-connection-error-log-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: 10px;\r\n}\r\n\r\n.settings-connection-error-log-header strong {\r\n color: var(--settings-text);\r\n font-size: 11px;\r\n font-weight: 600;\r\n}\r\n\r\n.settings-connection-error-log-header .settings-command-button {\r\n min-height: 30px;\r\n padding: 5px 9px;\r\n font-size: 11px;\r\n}\r\n\r\n.settings-connection-stderr {\r\n max-height: 220px;\r\n min-width: 0;\r\n margin: 0;\r\n padding: 11px;\r\n overflow: auto;\r\n color: var(--settings-text);\r\n font:\r\n 10px/16px ui-monospace,\r\n "SFMono-Regular",\r\n Consolas,\r\n "Liberation Mono",\r\n monospace;\r\n white-space: pre-wrap;\r\n overflow-wrap: anywhere;\r\n background: var(--settings-inset);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 9px;\r\n}\r\n\r\n.settings-connection-error-actions {\r\n display: grid;\r\n grid-template-columns: minmax(0, 1fr);\r\n gap: 8px;\r\n}\r\n\r\n.settings-connection-error-actions .settings-command-button {\r\n width: 100%;\r\n}\r\n\r\n.settings-connection-issue-note {\r\n margin-top: -4px;\r\n}\r\n\r\n.settings-connection-state-summary {\r\n padding: 14px;\r\n background: var(--settings-surface);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 10px;\r\n}\r\n\r\n.settings-empty {\r\n display: flex;\r\n align-items: center;\r\n min-height: 72px;\r\n padding: 12px 16px;\r\n}\r\n\r\n.settings-empty > div {\r\n display: grid;\r\n min-width: 0;\r\n gap: 2px;\r\n}\r\n\r\n.settings-empty strong {\r\n color: var(--settings-text);\r\n font-size: 13px;\r\n font-weight: 500;\r\n line-height: 19px;\r\n}\r\n\r\n.settings-empty span {\r\n color: var(--settings-muted);\r\n font-size: 13px;\r\n line-height: 19px;\r\n}\r\n\r\n.settings-about-panel {\r\n display: grid;\r\n max-width: 720px;\r\n gap: 18px;\r\n padding: 24px;\r\n background: var(--settings-panel);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 12px;\r\n}\r\n\r\n.settings-about-product {\r\n color: var(--settings-text);\r\n font-size: 24px;\r\n font-weight: 700;\r\n line-height: 32px;\r\n}\r\n\r\n.settings-about-tagline {\r\n color: var(--settings-text);\r\n font-size: 16px;\r\n font-weight: 600;\r\n line-height: 24px;\r\n}\r\n\r\n.settings-about-version-row {\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n margin: 4px 0 8px;\r\n}\r\n\r\n.settings-about-version-badge {\r\n display: inline-flex;\r\n align-items: center;\r\n font-size: 13px;\r\n font-weight: 600;\r\n color: var(--settings-text);\r\n background: var(--settings-surface);\r\n border: 1px solid var(--settings-border);\r\n padding: 4px 10px;\r\n border-radius: 6px;\r\n}\r\n\r\n.settings-about-copy {\r\n display: grid;\r\n max-width: 660px;\r\n gap: 12px;\r\n}\r\n\r\n.settings-about-copy p,\r\n.settings-about-repository p {\r\n margin: 0;\r\n color: var(--settings-muted);\r\n font-size: 13px;\r\n line-height: 21px;\r\n}\r\n\r\n.settings-about-star-callout {\r\n margin: 2px 0;\r\n color: var(--settings-warning);\r\n font-size: 14px;\r\n font-weight: 600;\r\n line-height: 22px;\r\n}\r\n\r\n.settings-about-repository {\r\n display: grid;\r\n gap: 10px;\r\n padding-top: 18px;\r\n border-top: 1px solid var(--settings-divider);\r\n}\r\n\r\n.settings-about-repository-link {\r\n display: flex;\r\n align-items: center;\r\n width: fit-content;\r\n min-width: 0;\r\n max-width: 100%;\r\n gap: 8px;\r\n color: var(--settings-focus);\r\n font-size: 13px;\r\n font-weight: 600;\r\n text-decoration: none;\r\n}\r\n\r\n.settings-about-repository-link:hover {\r\n text-decoration: underline;\r\n}\r\n\r\n.settings-about-repository-link code {\r\n min-width: 0;\r\n overflow: hidden;\r\n color: var(--settings-muted);\r\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\r\n font-size: 11px;\r\n font-weight: 400;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.settings-page-error {\r\n padding: 16px;\r\n color: var(--settings-text);\r\n font-size: 13px;\r\n background: var(--settings-panel);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 20px;\r\n}\r\n\r\n.settings-update-metadata {\r\n display: grid;\r\n grid-template-columns: repeat(3, minmax(0, 1fr));\r\n gap: 24px;\r\n margin-bottom: 24px;\r\n padding: 0 4px 20px;\r\n border-bottom: 1px solid var(--settings-divider);\r\n}\r\n\r\n.settings-update-metadata__item {\r\n display: grid;\r\n min-width: 0;\r\n gap: 4px;\r\n}\r\n\r\n.settings-update-metadata__item span {\r\n color: var(--settings-muted);\r\n font-size: 12px;\r\n line-height: 18px;\r\n}\r\n\r\n.settings-update-metadata__item strong {\r\n min-width: 0;\r\n overflow-wrap: anywhere;\r\n color: var(--settings-text);\r\n font-size: 15px;\r\n font-weight: 500;\r\n line-height: 22px;\r\n}\r\n\r\n/* The only emphasis on this screen: a latest version newer than the installed one. */\r\n.settings-update-metadata__value--newer {\r\n color: var(--settings-focus);\r\n}\r\n\r\n.settings-update-panel {\r\n display: grid;\r\n gap: 12px;\r\n padding: 20px;\r\n color: var(--settings-text);\r\n background: var(--settings-panel);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 8px;\r\n}\r\n\r\n.settings-update-panel__head {\r\n display: flex;\r\n align-items: center;\r\n min-width: 0;\r\n gap: 8px;\r\n}\r\n\r\n.settings-update-panel__head .codexhost-settings-icon {\r\n color: var(--settings-muted);\r\n}\r\n\r\n.settings-update-panel[data-update-state="available"] .codexhost-settings-icon,\r\n.settings-update-panel[data-update-state="downloading"] .codexhost-settings-icon,\r\n.settings-update-panel[data-update-state="installing"] .codexhost-settings-icon,\r\n.settings-update-panel[data-update-state="restarting"] .codexhost-settings-icon {\r\n color: var(--settings-focus);\r\n}\r\n\r\n.settings-update-panel[data-update-state="current"] .codexhost-settings-icon {\r\n color: var(--settings-success);\r\n}\r\n\r\n.settings-update-panel[data-update-state="failed"] .codexhost-settings-icon,\r\n.settings-update-panel[data-update-state="error"] .codexhost-settings-icon {\r\n color: var(--settings-danger);\r\n}\r\n\r\n.settings-update-panel__title {\r\n min-width: 0;\r\n overflow-wrap: anywhere;\r\n color: var(--settings-text);\r\n font-size: 14px;\r\n font-weight: 600;\r\n line-height: 22px;\r\n}\r\n\r\n.settings-update-summary,\r\n.settings-update-error {\r\n margin: 0;\r\n overflow-wrap: anywhere;\r\n font-size: 13px;\r\n line-height: 20px;\r\n}\r\n\r\n.settings-update-summary {\r\n color: var(--settings-muted);\r\n}\r\n\r\n.settings-update-error {\r\n color: var(--settings-danger);\r\n}\r\n\r\n.settings-update-progress {\r\n width: 100%;\r\n height: 8px;\r\n accent-color: var(--settings-focus);\r\n}\r\n\r\n.settings-update-progress-detail {\r\n color: var(--settings-muted);\r\n font-size: 12px;\r\n line-height: 18px;\r\n}\r\n\r\n/* Release notes scroll with the page; a scroller inside a scroller traps the wheel. */\r\n.settings-update-notes-section {\r\n min-width: 0;\r\n margin-top: 24px;\r\n padding-top: 24px;\r\n border-top: 1px solid var(--settings-divider);\r\n}\r\n\r\n.settings-update-notes-section:empty {\r\n display: none;\r\n}\r\n\r\n.settings-update-notes {\r\n display: grid;\r\n min-width: 0;\r\n gap: 12px;\r\n color: var(--settings-muted);\r\n font-size: 14px;\r\n line-height: 22px;\r\n overflow-wrap: anywhere;\r\n}\r\n\r\n.settings-update-notes > :first-child {\r\n margin-top: 0;\r\n}\r\n\r\n.settings-update-notes > :last-child {\r\n margin-bottom: 0;\r\n}\r\n\r\n.settings-update-notes h1,\r\n.settings-update-notes h2,\r\n.settings-update-notes h3,\r\n.settings-update-notes h4,\r\n.settings-update-notes h5,\r\n.settings-update-notes h6 {\r\n margin: 6px 0 0;\r\n color: var(--settings-text);\r\n font-weight: 600;\r\n}\r\n\r\n.settings-update-notes h1 {\r\n font-size: 18px;\r\n line-height: 26px;\r\n}\r\n\r\n.settings-update-notes h2 {\r\n font-size: 17px;\r\n line-height: 24px;\r\n}\r\n\r\n.settings-update-notes h3,\r\n.settings-update-notes h4,\r\n.settings-update-notes h5,\r\n.settings-update-notes h6 {\r\n font-size: 14px;\r\n line-height: 22px;\r\n}\r\n\r\n.settings-update-notes p,\r\n.settings-update-notes ul,\r\n.settings-update-notes ol,\r\n.settings-update-notes pre,\r\n.settings-update-notes blockquote {\r\n margin: 0;\r\n}\r\n\r\n.settings-update-notes ul,\r\n.settings-update-notes ol {\r\n padding-left: 24px;\r\n}\r\n\r\n.settings-update-notes li {\r\n padding-left: 4px;\r\n}\r\n\r\n.settings-update-notes li::marker {\r\n color: var(--settings-muted);\r\n font-size: 0.85em;\r\n}\r\n\r\n.settings-update-notes li + li {\r\n margin-top: 14px;\r\n}\r\n\r\n.settings-update-notes .release-note-translation {\r\n display: block;\r\n margin-top: 3px;\r\n color: var(--settings-muted);\r\n font-size: 13px;\r\n line-height: 20px;\r\n}\r\n\r\n.settings-update-notes blockquote {\r\n padding: 8px 12px;\r\n color: var(--settings-muted);\r\n border-left: 3px solid var(--settings-focus);\r\n background: var(--settings-surface);\r\n}\r\n\r\n.settings-update-notes hr {\r\n width: 100%;\r\n margin: 2px 0;\r\n border: 0;\r\n border-top: 1px solid var(--settings-divider);\r\n}\r\n\r\n.settings-update-notes strong {\r\n color: var(--settings-text);\r\n font-weight: 600;\r\n}\r\n\r\n.settings-update-notes a {\r\n color: var(--settings-focus);\r\n text-decoration: none;\r\n}\r\n\r\n.settings-update-notes a:hover {\r\n text-decoration: underline;\r\n}\r\n\r\n.settings-update-notes code {\r\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\r\n font-size: 12px;\r\n}\r\n\r\n.settings-update-notes :not(pre) > code {\r\n padding: 1px 5px;\r\n background: var(--settings-surface);\r\n border-radius: 4px;\r\n}\r\n\r\n.settings-update-notes pre {\r\n min-width: 0;\r\n max-width: 100%;\r\n padding: 10px 12px;\r\n overflow-x: auto;\r\n overflow-y: hidden;\r\n background: var(--settings-inset);\r\n border-radius: 6px;\r\n}\r\n\r\n.settings-update-notes pre code {\r\n line-height: 18px;\r\n white-space: pre-wrap;\r\n}\r\n\r\n/* Manual update sits directly under the status panel, not behind a disclosure:\r\n automatic updates can fail for machine-local reasons and this is the way out. */\r\n.settings-update-controls {\r\n display: grid;\r\n min-width: 0;\r\n gap: 10px;\r\n margin-top: 24px;\r\n}\r\n\r\n.settings-update-manual-title {\r\n color: var(--settings-text);\r\n font-size: 15px;\r\n font-weight: 600;\r\n line-height: 22px;\r\n}\r\n\r\n.settings-update-manual {\r\n display: grid;\r\n min-width: 0;\r\n gap: 8px;\r\n}\r\n\r\n.settings-update-manual[hidden] {\r\n display: none;\r\n}\r\n\r\n.settings-update-manual-description {\r\n margin: 0;\r\n color: var(--settings-muted);\r\n font-size: 12px;\r\n line-height: 18px;\r\n}\r\n\r\n.settings-update-manual-description.is-fallback {\r\n color: var(--settings-danger);\r\n}\r\n\r\n.settings-update-command {\r\n display: flex;\r\n align-items: stretch;\r\n min-width: 0;\r\n overflow: hidden;\r\n border: 1px solid var(--settings-border);\r\n border-radius: 6px;\r\n}\r\n\r\n.settings-update-command code {\r\n min-width: 0;\r\n flex: 1;\r\n padding: 9px 12px;\r\n overflow-x: auto;\r\n color: var(--settings-text);\r\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\r\n font-size: 12px;\r\n line-height: 20px;\r\n white-space: nowrap;\r\n}\r\n\r\n.settings-update-command__copy {\r\n display: inline-flex;\r\n align-items: center;\r\n flex: none;\r\n gap: 6px;\r\n padding: 0 12px;\r\n color: var(--settings-muted);\r\n font-size: 12px;\r\n background: transparent;\r\n border: 0;\r\n border-left: 1px solid var(--settings-border);\r\n cursor: pointer;\r\n}\r\n\r\n.settings-update-command__copy:hover {\r\n color: var(--settings-text);\r\n background: var(--settings-hover);\r\n}\r\n\r\n.settings-update-command__copy:focus-visible {\r\n outline: 2px solid var(--settings-focus);\r\n outline-offset: -2px;\r\n}\r\n\r\n.settings-update-actions {\n display: flex;\r\n align-items: center;\r\n min-width: 0;\r\n gap: 12px;\r\n flex-wrap: wrap;\r\n}\n\n.settings-storage-block {\n display: grid;\n gap: 12px;\n margin-bottom: 16px;\n}\n\r\n.settings-command-button,\r\n.settings-update-link {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex: none;\r\n width: max-content;\r\n max-width: 100%;\r\n min-height: 30px;\r\n gap: 6px;\r\n padding: 5px 10px;\r\n white-space: nowrap;\r\n color: var(--settings-primary-text);\r\n font: inherit;\r\n font-size: 12px;\r\n text-decoration: none;\r\n background: var(--settings-primary);\r\n border: 1px solid var(--settings-primary);\r\n border-radius: 7px;\r\n cursor: pointer;\r\n}\r\n\r\n.settings-command-button--secondary,\r\n.settings-update-link {\r\n color: var(--settings-text);\r\n background: var(--settings-panel);\r\n border-color: var(--settings-border);\r\n}\r\n\r\n.settings-command-button:hover:not(:disabled) {\r\n background: var(--settings-primary-hover);\r\n border-color: var(--settings-primary-hover);\r\n}\r\n\r\n.settings-command-button--secondary:hover:not(:disabled),\r\n.settings-update-link:hover {\r\n background: var(--settings-hover);\r\n border-color: var(--settings-border);\r\n}\r\n\r\n.settings-command-button--danger {\r\n color: #f87171;\r\n}\r\n\r\n.settings-command-button--danger:hover:not(:disabled) {\r\n color: #fecaca;\r\n background: rgb(127 29 29 / 24%);\r\n border-color: rgb(248 113 113 / 45%);\r\n}\r\n\r\n.settings-command-button:disabled {\r\n cursor: default;\r\n opacity: 0.45;\r\n}\r\n\r\n.settings-command-button:disabled,\r\n.settings-command-button[aria-disabled="true"] {\r\n opacity: 0.55;\r\n cursor: not-allowed;\r\n filter: none;\r\n}\r\n\r\n.settings-command-button:focus-visible,\r\n.settings-update-link:focus-visible {\r\n outline: 2px solid var(--settings-focus);\r\n outline-offset: 2px;\r\n}\r\n\r\n.codexhost-settings-icon {\r\n display: block;\r\n flex: none;\r\n stroke: currentColor;\r\n}\r\n\r\n@media (max-width: 720px) {\r\n .codexhost-settings-dialog {\r\n width: calc(100vw - 16px);\r\n height: calc(100vh - 16px);\r\n border-radius: 10px;\r\n }\r\n\r\n .settings-layout {\r\n grid-template-columns: minmax(0, 1fr);\r\n grid-template-rows: auto minmax(0, 1fr);\r\n }\r\n\r\n .settings-session-import-row {\r\n grid-template-columns: minmax(0, 1fr);\r\n }\r\n\r\n .settings-session-import-row__action {\r\n align-items: flex-start;\r\n }\r\n\r\n .settings-sidebar {\r\n border-right: 0;\r\n border-bottom: 1px solid var(--settings-border);\r\n }\r\n\r\n .settings-header {\r\n height: 56px;\r\n padding-inline: 14px;\r\n }\r\n\r\n .settings-sidebar {\r\n padding-top: 20px;\r\n }\r\n\r\n .settings-nav {\r\n flex: none;\r\n flex-direction: row;\r\n gap: 4px;\r\n padding: 7px 8px 8px;\r\n overflow-x: auto;\r\n overflow-y: hidden;\r\n }\r\n\r\n .settings-nav-section-label {\r\n display: none;\r\n }\r\n\r\n .settings-nav-button {\r\n width: auto;\r\n min-width: max-content;\r\n min-height: 34px;\r\n grid-template-columns: 16px auto;\r\n border-radius: 10px;\r\n }\r\n\r\n .settings-nav-star-link {\r\n margin-top: 0;\r\n }\r\n\r\n .settings-page__content {\r\n width: calc(100% - 40px);\r\n }\r\n\r\n .settings-page__content {\r\n padding-top: 32px;\r\n padding-bottom: 32px;\r\n }\r\n\r\n .settings-section-label {\r\n padding-bottom: 20px;\r\n font-size: 20px;\r\n line-height: 26px;\r\n }\r\n\r\n .settings-update-metadata {\r\n grid-template-columns: minmax(0, 1fr);\r\n gap: 16px;\r\n }\r\n\r\n .settings-status-row {\r\n grid-template-columns: minmax(0, 1fr) auto;\r\n gap: 16px;\r\n }\r\n\r\n .settings-account-header,\r\n .settings-connection-page-header {\r\n flex-direction: column;\r\n }\r\n\r\n .settings-account-header > .settings-command-button,\r\n .settings-connection-page-header > .settings-command-button {\r\n width: 100%;\r\n }\r\n\r\n .settings-connections-layout {\r\n grid-template-columns: minmax(0, 1fr);\r\n }\r\n\r\n .settings-connection-inspector {\r\n position: static;\r\n }\r\n\r\n .settings-status-row__detail {\r\n grid-column: 1 / -1;\r\n margin: -8px 0 0 58px;\r\n }\r\n}\r\n\r\n@media (forced-colors: active) {\r\n :host {\r\n --settings-bg: Canvas;\r\n --settings-sidebar: Canvas;\r\n --settings-panel: Canvas;\r\n --settings-surface: Canvas;\r\n --settings-surface-hover: Highlight;\r\n --settings-inset: Canvas;\r\n --settings-text: CanvasText;\r\n --settings-muted: GrayText;\r\n --settings-subtle: GrayText;\r\n --settings-border: ButtonBorder;\r\n --settings-divider: ButtonBorder;\r\n --settings-hover: Highlight;\r\n --settings-active: Highlight;\r\n --settings-focus: Highlight;\r\n --settings-primary: ButtonFace;\r\n --settings-primary-hover: Highlight;\r\n --settings-primary-text: ButtonText;\r\n --settings-warning: CanvasText;\r\n --settings-warning-bg: Canvas;\r\n --settings-warning-border: ButtonBorder;\r\n --settings-danger: CanvasText;\r\n --settings-danger-bg: Canvas;\r\n --settings-danger-border: ButtonBorder;\r\n --settings-success: CanvasText;\r\n }\r\n}\r\n\r\n@media (prefers-reduced-motion: reduce) {\r\n *,\r\n *::before,\r\n *::after {\r\n scroll-behavior: auto !important;\r\n transition-duration: 0s !important;\r\n }\r\n}\r\n\r\n/* Harness Mix: Model Configuration & One-click Install */\r\n.settings-model-config-panel {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 12px;\r\n padding: 14px;\r\n margin-top: 14px;\r\n border-radius: 8px;\r\n background: var(--settings-surface);\r\n border: 1px solid var(--settings-border);\r\n}\r\n\r\n.settings-model-config-head {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n}\r\n\r\n.settings-model-config-title {\r\n font-size: 13px;\r\n font-weight: 600;\r\n color: var(--settings-text);\r\n}\r\n\r\n.settings-model-config-description {\r\n font-size: 11px;\r\n color: var(--settings-muted);\r\n margin: 0;\r\n}\r\n\r\n.settings-model-config-loading,\r\n.settings-model-config-empty {\r\n font-size: 12px;\r\n color: var(--settings-muted);\r\n padding: 8px 0;\r\n}\r\n\r\n.settings-model-config-form {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 12px;\r\n margin-top: 4px;\r\n}\r\n\r\n.settings-model-config-field {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 6px;\r\n}\r\n\r\n.settings-model-config-label {\r\n font-size: 11px;\r\n font-weight: 600;\r\n color: var(--settings-muted);\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n}\r\n\r\n.settings-model-config-select {\r\n height: 32px;\r\n padding: 0 10px;\r\n border-radius: 6px;\r\n border: 1px solid var(--settings-border);\r\n background: var(--settings-panel);\r\n color: var(--settings-text);\r\n font-size: 12px;\r\n outline: none;\r\n}\r\n\r\n.settings-model-config-select:focus {\r\n border-color: var(--settings-primary);\r\n}\r\n\r\n.settings-model-config-actions {\r\n display: flex;\r\n align-items: center;\r\n flex-wrap: wrap;\r\n gap: 8px;\r\n margin-top: 6px;\r\n}\r\n\r\n.settings-model-config-feedback {\r\n font-size: 12px;\r\n font-weight: 500;\r\n}\r\n\r\n.settings-feedback-success {\r\n color: var(--settings-success);\r\n}\r\n\r\n.settings-feedback-error {\r\n color: var(--settings-danger);\r\n}\r\n\r\n.settings-feedback-info {\r\n color: var(--settings-primary);\r\n}\r\n\r\n.settings-install-command-box {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 6px;\r\n min-width: 0;\r\n margin: 0;\r\n}\r\n\r\n.settings-install-command-label {\r\n font-size: 11px;\r\n font-weight: 600;\r\n color: var(--settings-muted);\r\n}\r\n\r\n.settings-install-command-row {\r\n display: flex;\r\n align-items: center;\r\n background: var(--settings-inset);\r\n padding: 8px 12px;\r\n border-radius: 6px;\r\n border: 1px solid var(--settings-border);\r\n min-width: 0;\r\n overflow-x: auto;\r\n}\r\n\r\n.settings-install-command-row code {\r\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\r\n font-size: 12px;\r\n line-height: 18px;\r\n color: var(--settings-text);\r\n user-select: all;\r\n white-space: pre-wrap;\r\n word-break: break-all;\r\n}\r\n\r\n.settings-install-actions {\r\n display: grid;\r\n grid-template-columns: minmax(0, 1fr);\r\n gap: 8px;\r\n margin-top: 4px;\r\n}\r\n\r\n.settings-install-actions .settings-command-button {\r\n width: 100%;\r\n justify-content: center;\r\n}\r\n\r\n.settings-install-feedback {\r\n font-size: 12px;\r\n font-weight: 500;\r\n line-height: 18px;\r\n margin-top: 2px;\r\n overflow-wrap: anywhere;\r\n}\r\n\r\n.settings-install-manual-card {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 8px;\r\n background: var(--settings-inset);\r\n padding: 12px 14px;\r\n border-radius: 8px;\r\n border: 1px solid var(--settings-border);\r\n margin-top: 6px;\r\n margin-bottom: 4px;\r\n}\r\n\r\n.settings-install-manual-badge {\r\n display: inline-flex;\r\n align-items: center;\r\n font-size: 11px;\r\n font-weight: 600;\r\n color: var(--settings-accent, #10a37f);\r\n background: var(--settings-accent-subtle, rgba(16, 163, 127, 0.1));\r\n padding: 2px 8px;\r\n border-radius: 4px;\r\n width: fit-content;\r\n}\r\n\r\n.settings-install-manual-notice {\r\n font-size: 12px;\r\n line-height: 18px;\r\n color: var(--settings-text);\r\n margin: 0;\r\n}\r\n\r\n.settings-install-steps {\r\n margin: 0;\r\n padding-left: 18px;\r\n font-size: 12px;\r\n line-height: 20px;\r\n color: var(--settings-muted);\r\n}\r\n\r\n.settings-install-steps li {\r\n margin-bottom: 2px;\r\n}\r\n/* MCP and Skills share native settings controls while keeping separate flows. */\n.settings-integrations-controls { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; margin: 18px 0 12px; }\n.settings-integrations-controls input { flex: 1; min-width: 180px; }\n.settings-integrations-controls input[hidden] { display: none; }\n.settings-integrations-controls select, .settings-integrations-controls input,\n.settings-integrations-field input, .settings-integrations-toolbar input { box-sizing: border-box; padding: 9px 11px; border: 1px solid var(--settings-border, #8885); border-radius: 8px; color: inherit; background: var(--settings-input, transparent); font: inherit; }\n.settings-integrations-status { min-height: 18px; margin: 0 0 6px; color: var(--settings-muted); font-size: 12px; }\n.settings-integrations-body p { font-size: 12px; line-height: 1.6; opacity: .8; }\n.settings-integrations-toolbar { display: flex; gap: 10px; align-items: center; margin: 8px 0 16px; }\n.settings-integrations-toolbar input { flex: 1; }\n.settings-integrations-list { display: grid; gap: 8px; }\n.settings-integrations-row { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; border: 1px solid var(--settings-border, #8885); padding: 14px; border-radius: 10px; background: var(--settings-surface, transparent); }\n.settings-integrations-row > div { flex: 1; min-width: 180px; }\n.settings-integrations-row p { margin: 3px 0; }\n.settings-integrations-row code { display: block; overflow-wrap: anywhere; font-size: 11px; color: var(--settings-muted); }\n.settings-integrations-row--native { border-style: dashed; }\n.settings-integrations-empty { padding: 36px 18px; border: 1px dashed var(--settings-border, #8885); border-radius: 10px; text-align: center; color: var(--settings-muted); font-size: 12px; }\n.settings-integrations-editor-head { display: flex; align-items: center; gap: 12px; }\n.settings-integrations-editor-head h3 { margin: 0; }\n.settings-integrations-form { display: grid; gap: 14px; margin: 16px 0 28px; }\n.settings-integrations-form--card { padding: 16px; border: 1px solid var(--settings-border, #8885); border-radius: 12px; }\n.settings-integrations-field { display: grid; gap: 6px; font-size: 12px; }\n.settings-integrations-form > button { justify-self: start; }\n.settings-mcp-args { display: grid; gap: 7px; }\n.settings-mcp-arg { display: flex; gap: 8px; align-items: center; }\n.settings-mcp-arg input { flex: 1; }\n.settings-mcp-kv-row { display: flex; gap: 8px; align-items: center; }\n.settings-mcp-kv-row input { flex: 1; }\n.settings-mcp-add-arg { margin-top: 7px; }\n.settings-mcp-docs-link { display: inline-flex; align-items: center; gap: 4px; color: var(--settings-muted, #888); font-size: 13px; text-decoration: none; transition: color 150ms ease; }\n.settings-mcp-docs-link:hover { color: var(--settings-text, #fff); text-decoration: underline; }\n.settings-integrations-editor-head .settings-command-button--danger { margin-left: auto; }\n.settings-mcp-type-toggle { display: inline-flex; padding: 3px; border-radius: 8px; background: var(--settings-inset, rgba(255, 255, 255, 0.06)); border: 1px solid var(--settings-border, #8885); gap: 2px; width: fit-content; }\n.settings-mcp-type-btn { padding: 5px 14px; border-radius: 6px; border: none; background: transparent; color: var(--settings-muted, #888); font: inherit; font-size: 12px; font-weight: 500; cursor: pointer; transition: all 120ms ease; }\n.settings-mcp-type-btn:hover { color: var(--settings-text, #fff); }\n.settings-mcp-type-btn[data-active="true"] { background: var(--settings-active, rgba(255, 255, 255, 0.15)); color: var(--settings-text, #fff); font-weight: 600; }\n.settings-mcp-notice { margin: 4px 0 0; color: var(--settings-muted, #888); font-size: 12px; line-height: 1.5; }\n.settings-mcp-section { display: grid; gap: 14px; }\n.settings-mcp-icon-btn { display: inline-flex; align-items: center; justify-content: center; width: 34px; height: 34px; padding: 0; border: 1px solid var(--settings-border, #8885); border-radius: 8px; background: var(--settings-input, transparent); color: var(--settings-muted, #888); cursor: pointer; flex: none; transition: all 120ms ease; }\n.settings-mcp-icon-btn:hover:not(:disabled) { background: rgba(239, 68, 68, 0.15); border-color: rgba(239, 68, 68, 0.4); color: #f87171; }\n.settings-mcp-icon-btn svg { width: 14px; height: 14px; display: block; }\n.settings-integrations-callout { margin: 0; padding: 10px 12px; border-radius: 8px; background: var(--settings-inset); }\n.settings-skill-dropzone { display: grid; justify-items: center; gap: 8px; padding: 34px 22px; margin: 8px 0 18px; border: 1.5px dashed var(--settings-border, #8887); border-radius: 14px; background: var(--settings-inset); text-align: center; transition: border-color 120ms ease, background 120ms ease, transform 120ms ease; }\n.settings-skill-dropzone > span { max-width: 520px; color: var(--settings-muted); font-size: 12px; line-height: 18px; }\n.settings-skill-dropzone[data-drag-over="true"] { border-color: var(--settings-accent, #10a37f); background: var(--settings-accent-subtle, rgba(16, 163, 127, .1)); transform: scale(.995); }\n.settings-skill-dropzone[data-disabled="true"] { opacity: .55; }\n.settings-skills-target-row { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; justify-content: center; margin-top: 6px; }\n.settings-skills-target-row select { padding: 6px 10px; border: 1px solid var(--settings-border, #8885); border-radius: 8px; background: var(--settings-input, transparent); color: inherit; font: inherit; font-size: 12px; }\n.settings-skills-overview-stats { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; margin: 6px 0 10px; font-size: 12px; color: var(--settings-muted); }\n.settings-skills-tabs { display: inline-flex; padding: 3px; border-radius: 8px; background: var(--settings-inset, rgba(255, 255, 255, 0.06)); border: 1px solid var(--settings-border, #8885); gap: 2px; }\n.settings-skills-tab-btn { padding: 5px 14px; border-radius: 6px; border: none; background: transparent; color: var(--settings-muted, #888); font: inherit; font-size: 12px; font-weight: 500; cursor: pointer; transition: all 120ms ease; }\n.settings-skills-tab-btn:hover { color: var(--settings-text, #fff); }\n.settings-skills-tab-btn[data-active="true"] { background: var(--settings-active, rgba(255, 255, 255, 0.15)); color: var(--settings-text, #fff); font-weight: 600; }\n.settings-skills-overview-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); gap: 14px; margin-top: 10px; }\n.settings-skills-harness-card { border: 1px solid var(--settings-border, #8885); border-radius: 12px; padding: 14px; background: var(--settings-surface, transparent); display: flex; flex-direction: column; gap: 10px; }\n.settings-skills-harness-head { display: flex; justify-content: space-between; align-items: center; border-bottom: 1px solid var(--settings-border, #8883); padding-bottom: 8px; }\n.settings-skills-harness-head strong { font-size: 14px; }\n.settings-skills-badge { font-size: 11px; padding: 2px 8px; border-radius: 10px; background: var(--settings-inset, rgba(255, 255, 255, 0.08)); color: var(--settings-muted); }\n.settings-skills-badge--active { background: rgba(16, 163, 127, 0.15); color: #10a37f; }\n.settings-skills-list-compact { display: flex; flex-direction: column; gap: 8px; max-height: 280px; overflow-y: auto; }\n.settings-skills-item-row { display: flex; justify-content: space-between; align-items: center; gap: 8px; padding: 6px 8px; border-radius: 6px; background: var(--settings-inset, rgba(255, 255, 255, 0.03)); font-size: 12px; }\n.settings-skills-item-row strong { font-size: 13px; }\n.settings-skills-item-row code { font-size: 10px; color: var(--settings-muted); overflow-wrap: anywhere; display: block; }\n.settings-skills-item-actions { display: flex; gap: 6px; align-items: center; flex: none; }\n.settings-skills-matrix-list { display: flex; flex-direction: column; gap: 10px; margin-top: 10px; }\n.settings-skills-matrix-card { border: 1px solid var(--settings-border, #8885); border-radius: 10px; padding: 12px 14px; background: var(--settings-surface, transparent); display: flex; flex-direction: column; gap: 8px; }\n.settings-skills-matrix-head { display: flex; justify-content: space-between; align-items: center; }\n.settings-skills-matrix-head span { font-size: 11px; color: var(--settings-muted); }\n.settings-skills-tags { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }\n.settings-skills-tag { font-size: 11px; padding: 3px 8px; border-radius: 6px; background: rgba(16, 163, 127, 0.15); color: #10a37f; border: 1px solid rgba(16, 163, 127, 0.3); }\n.settings-skills-sync-actions { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; margin-top: 4px; }\n.settings-skills-sync-modal { border: 1px solid var(--settings-border, #8885); border-radius: 12px; background: var(--settings-bg, #1e1e1e); color: inherit; padding: 20px 24px; max-width: 420px; box-shadow: 0 16px 32px rgba(0, 0, 0, 0.5); }\n.settings-skills-sync-modal::backdrop { background: rgba(0, 0, 0, 0.6); backdrop-filter: blur(2px); }\n.settings-skills-sync-modal h3 { margin: 0 0 8px; font-size: 16px; }\n.settings-skills-sync-modal p { margin: 0 0 12px; font-size: 12px; color: var(--settings-muted); }\n.settings-mcp-overview-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(340px, 1fr)); gap: 14px; margin-top: 10px; }\n.settings-mcp-harness-card { border: 1px solid var(--settings-border, #8885); border-radius: 12px; padding: 14px; background: var(--settings-surface, transparent); display: flex; flex-direction: column; gap: 10px; }\n.settings-mcp-harness-head { display: flex; justify-content: space-between; align-items: center; border-bottom: 1px solid var(--settings-border, #8883); padding-bottom: 8px; }\n.settings-mcp-harness-head strong { font-size: 14px; }\n.settings-mcp-native-box { padding: 8px 10px; border-radius: 8px; background: rgba(16, 163, 127, 0.08); border: 1px dashed rgba(16, 163, 127, 0.3); font-size: 11px; display: flex; flex-direction: column; gap: 4px; }\n.settings-mcp-native-title { font-weight: 600; color: #10a37f; display: flex; align-items: center; gap: 6px; }\n.settings-mcp-native-item { display: flex; flex-direction: column; gap: 2px; color: var(--settings-muted); }\n.settings-mcp-native-item code { font-size: 10px; overflow-wrap: anywhere; }\n.settings-mcp-list-compact { display: flex; flex-direction: column; gap: 8px; max-height: 280px; overflow-y: auto; }\n.settings-mcp-item-row { display: flex; justify-content: space-between; align-items: center; gap: 8px; padding: 6px 8px; border-radius: 6px; background: var(--settings-inset, rgba(255, 255, 255, 0.03)); font-size: 12px; }\n.settings-mcp-item-row strong { font-size: 13px; }\n.settings-mcp-item-row code { font-size: 10px; color: var(--settings-muted); overflow-wrap: anywhere; display: block; }\n.settings-mcp-item-actions { display: flex; gap: 6px; align-items: center; flex: none; }\n.settings-mcp-card-footer { display: flex; justify-content: flex-end; margin-top: auto; padding-top: 6px; border-top: 1px solid var(--settings-border, #8882); }\n.settings-mcp-matrix-list { display: flex; flex-direction: column; gap: 10px; margin-top: 10px; }\n.settings-mcp-matrix-card { border: 1px solid var(--settings-border, #8885); border-radius: 10px; padding: 12px 14px; background: var(--settings-surface, transparent); display: flex; flex-direction: column; gap: 8px; }\n.settings-mcp-matrix-head { display: flex; justify-content: space-between; align-items: center; }\n.settings-mcp-matrix-head span { font-size: 11px; color: var(--settings-muted); }\n.settings-mcp-tags { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }\n.settings-mcp-tag { font-size: 11px; padding: 3px 8px; border-radius: 6px; background: rgba(16, 163, 127, 0.15); color: #10a37f; border: 1px solid rgba(16, 163, 127, 0.3); }\n.settings-mcp-tag--disabled { background: rgba(255, 255, 255, 0.05); color: var(--settings-muted); border-color: var(--settings-border, #8885); }\n.settings-mcp-sync-actions { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; margin-top: 4px; }\n.settings-mcp-distribute-modal { border: 1px solid var(--settings-border, #8885); border-radius: 12px; background: var(--settings-bg, #1e1e1e); color: inherit; padding: 20px 24px; max-width: 540px; width: 92%; max-height: 85vh; overflow-y: auto; box-shadow: 0 16px 32px rgba(0, 0, 0, 0.5); }\n.settings-mcp-distribute-modal::backdrop { background: rgba(0, 0, 0, 0.6); backdrop-filter: blur(2px); }\n.settings-mcp-distribute-modal h3 { margin: 0 0 8px; font-size: 16px; }\n.settings-mcp-distribute-modal p { margin: 0 0 12px; font-size: 12px; color: var(--settings-muted); }\n\n';
31141
+ var shell_default = ':host {\r\n --settings-bg: light-dark(#ffffff, #202020);\r\n --settings-sidebar: light-dark(#f7f7f8, #191919);\r\n --settings-panel: light-dark(#ffffff, #232323);\r\n --settings-surface: light-dark(#f6f6f6, #292929);\r\n --settings-surface-hover: light-dark(#eeeeee, #303030);\r\n --settings-inset: light-dark(#f3f3f3, #161616);\r\n --settings-text: light-dark(#0d0d0d, #ececec);\r\n --settings-muted: light-dark(#676767, #a3a3a3);\r\n --settings-subtle: light-dark(#8a8a8a, #777777);\r\n --settings-border: light-dark(rgb(13 13 13 / 9%), rgb(255 255 255 / 9%));\r\n --settings-divider: light-dark(rgb(13 13 13 / 7%), rgb(255 255 255 / 7%));\r\n --settings-hover: light-dark(rgb(13 13 13 / 5%), rgb(255 255 255 / 7%));\r\n --settings-active: light-dark(rgb(13 13 13 / 7%), rgb(255 255 255 / 9%));\r\n --settings-focus: light-dark(#0b75d1, #66aaf9);\r\n --settings-primary: light-dark(#171717, #f4f4f4);\r\n --settings-primary-hover: light-dark(#2f2f2f, #ffffff);\r\n --settings-primary-text: light-dark(#ffffff, #171717);\r\n --settings-warning: light-dark(#8a5500, #f5c96a);\r\n --settings-warning-bg: light-dark(#fff8e6, rgb(245 201 106 / 8%));\r\n --settings-warning-border: light-dark(#ead8a8, rgb(245 201 106 / 24%));\r\n --settings-danger: light-dark(#b42318, #f87171);\r\n --settings-danger-bg: light-dark(#fff1f0, rgb(239 68 68 / 8%));\r\n --settings-danger-border: light-dark(#f3c7c3, rgb(239 68 68 / 22%));\r\n --settings-success: light-dark(#16784a, #4ade80);\r\n color: var(--settings-text);\r\n color-scheme: inherit;\r\n font:\r\n 13px/1.5 system-ui,\r\n -apple-system,\r\n BlinkMacSystemFont,\r\n "Segoe UI",\r\n sans-serif;\r\n letter-spacing: 0;\r\n}\r\n\r\n*,\r\n*::before,\r\n*::after {\r\n box-sizing: border-box;\r\n letter-spacing: 0;\r\n}\r\n\r\nbutton,\r\ninput,\r\nselect {\r\n font: inherit;\r\n}\r\n\r\nbutton {\r\n color: inherit;\r\n}\r\n\r\n[hidden] {\r\n display: none !important;\r\n}\r\n\r\n.settings-visually-hidden {\r\n position: absolute;\r\n width: 1px;\r\n height: 1px;\r\n padding: 0;\r\n margin: -1px;\r\n overflow: hidden;\r\n clip-path: inset(50%);\r\n white-space: nowrap;\r\n border: 0;\r\n}\r\n\r\n.harnessmix-settings-dialog {\r\n width: min(1120px, calc(100vw - 48px));\r\n height: min(780px, calc(100vh - 88px));\r\n max-width: none;\r\n max-height: calc(100vh - 88px);\r\n margin-top: max(56px, calc((100vh - 780px) / 2));\r\n margin-inline: auto;\r\n margin-bottom: auto;\r\n padding: 0;\r\n overflow: hidden;\r\n color: var(--settings-text);\r\n background: var(--settings-bg);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 14px;\r\n box-shadow: light-dark(0 16px 42px rgb(0 0 0 / 16%), 0 20px 54px rgb(0 0 0 / 42%));\r\n}\r\n\r\n.harnessmix-settings-dialog::backdrop {\r\n background: light-dark(rgb(0 0 0 / 24%), rgb(0 0 0 / 56%));\r\n backdrop-filter: blur(1px);\r\n}\r\n\r\n.settings-frame,\r\n.settings-layout {\r\n width: 100%;\r\n height: 100%;\r\n min-width: 0;\r\n min-height: 0;\r\n}\r\n\r\n.settings-frame {\r\n display: flex;\r\n flex-direction: column;\r\n}\r\n\r\n.settings-layout {\r\n flex: 1;\r\n display: grid;\r\n grid-template-columns: 184px minmax(0, 1fr);\r\n background: var(--settings-bg);\r\n}\r\n\r\n.settings-sidebar {\r\n display: flex;\r\n min-width: 0;\r\n min-height: 0;\r\n flex-direction: column;\r\n overflow: hidden;\r\n background: var(--settings-sidebar);\r\n border-right: 1px solid var(--settings-border);\r\n padding-top: 14px;\r\n}\r\n\r\n.settings-header {\r\n display: flex;\r\n align-items: center;\r\n min-width: 0;\r\n height: 50px;\r\n flex: none;\r\n padding: 0 16px;\r\n border-bottom: 1px solid var(--settings-border);\r\n}\r\n\r\n.settings-header-actions {\r\n display: flex;\r\n align-items: center;\r\n flex: none;\r\n gap: 12px;\r\n margin-left: auto;\r\n}\r\n\r\n.settings-brand {\r\n display: flex;\r\n align-items: center;\r\n min-width: 0;\r\n gap: 7px;\r\n}\r\n\r\n.settings-brand__mark {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 26px;\r\n height: 26px;\r\n flex: none;\r\n color: var(--settings-text);\r\n}\r\n\r\n.settings-brand__mark .harnessmix-settings-icon {\r\n width: 24px;\r\n height: 24px;\r\n object-fit: contain;\r\n}\r\n\r\n.settings-brand__copy {\r\n display: flex;\r\n min-width: 0;\r\n align-items: baseline;\r\n gap: 0;\r\n line-height: 20px;\r\n}\r\n\r\n.settings-brand__name {\r\n overflow: hidden;\r\n color: var(--settings-text);\r\n font-size: 13px;\r\n font-weight: 600;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.settings-brand__title {\r\n margin-left: 8px;\r\n padding-left: 8px;\r\n color: var(--settings-muted);\r\n font-size: 13px;\r\n font-weight: 400;\r\n border-left: 1px solid var(--settings-border);\r\n}\r\n\r\n.settings-nav {\r\n display: flex;\r\n min-width: 0;\r\n min-height: 0;\r\n flex: 1;\r\n flex-direction: column;\r\n gap: 2px;\r\n padding: 0 7px 10px;\r\n overflow-y: auto;\r\n}\r\n\r\n.settings-nav-section-label {\r\n min-height: 24px;\r\n padding: 4px 9px 2px;\r\n color: var(--settings-subtle);\r\n font-size: 11px;\r\n font-weight: 600;\r\n line-height: 18px;\r\n}\r\n\r\n.settings-nav-section-label:not(:first-child) {\r\n margin-top: 8px;\r\n}\r\n\r\n.settings-nav-button {\r\n display: grid;\r\n grid-template-columns: 16px minmax(0, 1fr);\r\n align-items: center;\r\n width: 100%;\r\n position: relative;\r\n min-height: 34px;\r\n flex: none;\r\n gap: 9px;\r\n padding: 6px 9px;\r\n color: var(--settings-text);\r\n font-size: 13px;\r\n line-height: 20px;\r\n text-align: left;\r\n background: transparent;\r\n border: 0;\r\n border-radius: 8px;\r\n cursor: pointer;\r\n}\r\n\r\n.settings-nav-button .harnessmix-settings-icon {\r\n width: 16px;\r\n height: 16px;\r\n opacity: 0.9;\r\n}\r\n\r\n.settings-nav-button:hover {\r\n background: var(--settings-hover);\r\n}\r\n\r\n.settings-nav-button[aria-current="page"] {\r\n background: var(--settings-active);\r\n color: var(--settings-text);\r\n font-weight: 500;\r\n}\r\n\r\n.settings-nav-button span {\r\n min-width: 0;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.settings-nav-star-link {\r\n margin-top: 0;\r\n color: var(--settings-text);\r\n text-decoration: none;\r\n}\r\n\r\n.settings-nav-star-link .harnessmix-settings-icon {\r\n color: var(--settings-warning);\r\n}\r\n\r\n.settings-nav-star-link:hover {\r\n color: var(--settings-warning);\r\n background: var(--settings-warning-bg);\r\n}\r\n\r\n.settings-icon-button {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 32px;\r\n height: 32px;\r\n flex: none;\r\n padding: 0;\r\n color: var(--settings-muted);\r\n background: transparent;\r\n border: 0;\r\n border-radius: 8px;\r\n cursor: pointer;\r\n transition: background-color 0.15s ease, color 0.15s ease, transform 0.08s ease;\r\n}\r\n\r\n.settings-icon-button:hover {\r\n color: var(--settings-text);\r\n background: var(--settings-hover);\r\n}\r\n\r\n.settings-icon-button:active {\r\n background: var(--settings-active);\r\n transform: scale(0.95);\r\n}\r\n\r\n.settings-header-actions .settings-icon-button {\r\n width: 34px;\r\n height: 34px;\r\n border-radius: 8px;\r\n}\r\n\r\n.settings-header-actions .settings-icon-button:hover {\r\n color: var(--settings-text);\r\n background: var(--settings-hover);\r\n}\r\n\r\n.settings-icon-button:focus-visible,\r\n.settings-nav-button:focus-visible {\r\n outline: 2px solid var(--settings-focus);\r\n outline-offset: 1px;\r\n}\r\n\r\n.settings-page {\r\n display: block;\r\n position: relative;\r\n min-width: 0;\r\n min-height: 0;\r\n overflow-y: auto;\r\n background: var(--settings-bg);\r\n scrollbar-gutter: stable;\r\n}\r\n\r\n.settings-page__content {\r\n width: min(930px, calc(100% - 80px));\r\n margin-inline: auto;\r\n}\r\n\r\n.settings-page__content {\r\n min-width: 0;\r\n padding: 28px 0 36px;\r\n}\r\n\r\n.settings-section-label {\r\n min-height: auto;\r\n margin: 0;\r\n padding: 0 0 18px;\r\n color: var(--settings-text);\r\n font-size: 18px;\r\n font-weight: 600;\r\n line-height: 26px;\r\n}\r\n\r\n.settings-status-list,\r\n.settings-empty {\r\n overflow: hidden;\r\n background: var(--settings-panel);\r\n}\r\n\r\n.settings-status-row {\r\n display: grid;\r\n grid-template-columns: minmax(170px, 1fr) auto minmax(280px, 1.45fr);\r\n position: relative;\r\n align-items: center;\r\n min-height: 72px;\r\n gap: 20px;\r\n padding: 12px 0;\r\n}\r\n\r\n.settings-status-row:not(:last-child)::after {\r\n content: "";\r\n position: absolute;\r\n right: 0;\r\n bottom: 0;\r\n left: 0;\r\n height: 1px;\r\n background: var(--settings-divider);\r\n}\r\n\r\n.settings-status-row__identity {\r\n display: inline-flex;\r\n align-items: center;\r\n min-width: 0;\r\n color: var(--settings-text);\r\n gap: 10px;\r\n font-size: 14px;\r\n font-weight: 500;\r\n line-height: 22px;\r\n}\r\n\r\n.settings-status-row__icon {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 36px;\r\n height: 36px;\r\n flex: none;\r\n color: var(--settings-muted);\r\n background: var(--settings-surface);\r\n border-radius: 50%;\r\n}\r\n\r\n.settings-status-badge {\r\n flex: none;\r\n padding: 3px 8px;\r\n color: var(--settings-muted);\r\n font-size: 11px;\r\n font-weight: 500;\r\n line-height: 18px;\r\n background: var(--settings-surface);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 6px;\r\n}\r\n\r\n.settings-status-row__detail {\r\n min-width: 0;\r\n color: var(--settings-muted);\r\n font-size: 13px;\r\n line-height: 20px;\r\n}\r\n\r\n.settings-page-description {\r\n max-width: 760px;\r\n margin: -10px 0 20px;\r\n color: var(--settings-muted);\r\n font-size: 12px;\r\n line-height: 18px;\r\n}\r\n\r\n.settings-session-import-header {\r\n display: flex;\r\n align-items: flex-start;\r\n justify-content: space-between;\r\n gap: 24px;\r\n}\r\n\r\n.settings-session-import-header .settings-section-label {\r\n min-width: 0;\r\n}\r\n\r\n.settings-session-import-harness {\r\n display: flex;\r\n align-items: center;\r\n min-width: 0;\r\n gap: 12px;\r\n margin: -12px 0 16px;\r\n color: var(--settings-muted);\r\n font-size: 13px;\r\n}\r\n\r\n.settings-session-import-harness > span {\r\n flex: none;\r\n}\r\n\r\n.settings-session-import-harness__options {\r\n display: flex;\r\n align-items: center;\r\n min-width: 0;\r\n flex: 1;\r\n gap: 6px;\r\n overflow-x: auto;\r\n overflow-y: hidden;\r\n scrollbar-width: none;\r\n}\r\n\r\n.settings-session-import-harness__options::-webkit-scrollbar {\r\n display: none;\r\n}\r\n\r\n.settings-session-import-harness__option {\r\n min-height: 32px;\r\n flex: none;\r\n padding: 6px 10px;\r\n color: var(--settings-muted);\r\n font: inherit;\r\n font-size: 12px;\r\n white-space: nowrap;\r\n background: rgb(255 255 255 / 4%);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 6px;\r\n cursor: pointer;\r\n}\r\n\r\n.settings-session-import-harness__option[aria-pressed="true"] {\r\n color: var(--settings-text);\r\n background: var(--settings-active);\r\n border-color: rgb(51 156 255 / 50%);\r\n}\r\n\r\n.settings-session-import-harness__option:disabled {\r\n opacity: 0.38;\r\n cursor: not-allowed;\r\n}\r\n\r\n.settings-session-import-harness__option:focus-visible {\r\n outline: 2px solid var(--settings-focus);\r\n outline-offset: 2px;\r\n}\r\n\r\n.settings-session-import-harness + .settings-page-description {\r\n margin-top: 0;\r\n margin-bottom: 4px;\r\n}\r\n\r\n.settings-session-import-availability-note {\r\n margin-top: 0;\r\n}\r\n\r\n.settings-session-import-search,\r\n.settings-session-import-pagination {\r\n display: flex;\r\n flex-wrap: wrap;\r\n align-items: center;\r\n gap: 10px;\r\n margin: 16px 0;\r\n}\r\n\r\n.settings-session-import-search input {\r\n flex: 1;\r\n min-width: 160px;\r\n}\r\n\r\n.settings-session-import-search input,\r\n.settings-session-import-pagination select {\r\n min-height: 36px;\r\n padding: 6px 10px;\r\n color: var(--settings-text);\r\n background: var(--settings-bg);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 6px;\r\n}\r\n\r\n.settings-session-import-search input:focus-visible,\r\n.settings-session-import-pagination select:focus-visible {\r\n outline: 2px solid var(--settings-focus);\r\n outline-offset: 2px;\r\n}\r\n\r\n.settings-session-import-pagination {\r\n color: var(--settings-muted);\r\n font-size: 12px;\r\n}\r\n\r\n.settings-session-import-pagination label {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n}\r\n\r\n.settings-session-import-pagination > span {\r\n flex: 1;\r\n min-width: 130px;\r\n}\r\n\r\n.settings-session-import-pagination__navigation {\r\n display: flex;\r\n gap: 8px;\r\n margin-left: auto;\r\n}\r\n\r\n.settings-session-import-content,\r\n.settings-session-import-list {\r\n display: grid;\r\n gap: 10px;\r\n}\r\n\r\n.settings-session-import-status {\r\n display: flex;\r\n align-items: center;\r\n min-height: 64px;\r\n gap: 12px;\r\n padding: 16px;\r\n color: var(--settings-muted);\r\n background: var(--settings-panel);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 8px;\r\n}\r\n\r\n.settings-session-import-status.is-error {\r\n color: #ef4444;\r\n}\r\n\r\n.settings-session-import-recovery {\r\n display: grid;\r\n justify-items: start;\r\n gap: 14px;\r\n padding: 16px;\r\n background: var(--settings-panel);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 8px;\r\n}\r\n\r\n.settings-session-import-recovery:focus-visible {\r\n outline: 2px solid var(--settings-focus);\r\n outline-offset: 2px;\r\n}\r\n\r\n.settings-session-import-recovery__copy {\r\n display: grid;\r\n gap: 4px;\r\n}\r\n\r\n.settings-session-import-recovery__copy strong {\r\n color: var(--settings-text);\r\n font-size: 14px;\r\n}\r\n\r\n.settings-session-import-recovery__copy p {\r\n margin: 0;\r\n color: var(--settings-muted);\r\n font-size: 13px;\r\n line-height: 20px;\r\n}\r\n\r\n.settings-session-import-recovery__path {\r\n display: flex;\r\n align-items: stretch;\r\n width: 100%;\r\n min-width: 0;\r\n overflow: hidden;\r\n border: 1px solid var(--settings-border);\r\n border-radius: 6px;\r\n}\r\n\r\n.settings-session-import-recovery__path code {\r\n min-width: 0;\r\n flex: 1;\r\n padding: 8px 10px;\r\n overflow-x: auto;\r\n color: var(--settings-text);\r\n font-size: 12px;\r\n line-height: 20px;\r\n white-space: nowrap;\r\n}\r\n\r\n.settings-session-import-recovery__path .settings-command-button {\r\n min-height: 0;\r\n flex: none;\r\n border-width: 0 0 0 1px;\r\n border-radius: 0;\r\n}\r\n\r\n.settings-session-import-row {\r\n display: grid;\r\n grid-template-columns: minmax(0, 1fr) auto;\r\n align-items: center;\r\n gap: 20px;\r\n min-width: 0;\r\n padding: 16px;\r\n background: var(--settings-panel);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 8px;\r\n}\r\n\r\n.settings-session-import-row__copy {\r\n display: grid;\r\n min-width: 0;\r\n gap: 4px;\r\n}\r\n\r\n.settings-session-import-row__copy strong {\r\n overflow: hidden;\r\n color: var(--settings-text);\r\n font-size: 14px;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.settings-session-import-row__copy span,\r\n.settings-session-import-row__cwd {\r\n overflow: hidden;\r\n color: var(--settings-muted);\r\n font-size: 12px;\r\n line-height: 18px;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.settings-session-import-row__cwd {\r\n display: block;\r\n min-width: 0;\r\n background: transparent;\r\n}\r\n\r\n.settings-session-import-row__action {\r\n display: flex;\r\n align-items: flex-end;\r\n flex-direction: column;\r\n gap: 8px;\r\n}\r\n\r\n.settings-session-import-running {\r\n color: var(--settings-muted);\r\n font-size: 12px;\r\n}\r\n\r\n.settings-preference-row {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: 32px;\r\n min-height: 88px;\r\n padding: 18px 0;\r\n border-top: 1px solid var(--settings-divider);\r\n border-bottom: 1px solid var(--settings-divider);\r\n}\r\n\r\n.settings-preference-row__copy {\r\n display: flex;\r\n flex: 1 1 auto;\r\n flex-direction: column;\r\n min-width: 0;\r\n gap: 5px;\r\n}\r\n\r\n.settings-preference-row__copy strong {\r\n color: var(--settings-text);\r\n font-size: 15px;\r\n font-weight: 600;\r\n line-height: 22px;\r\n}\r\n\r\n.settings-preference-row__copy span {\r\n max-width: 680px;\r\n color: var(--settings-muted);\r\n font-size: 13px;\r\n line-height: 20px;\r\n}\r\n\r\n.settings-preference-switch {\r\n display: inline-flex;\r\n align-items: center;\r\n width: 42px;\r\n height: 24px;\r\n flex: none;\r\n padding: 2px;\r\n border: 0;\r\n border-radius: 999px;\r\n background: var(--settings-surface-hover);\r\n cursor: pointer;\r\n transition: background 120ms ease;\r\n}\r\n\r\n.settings-preference-switch[aria-checked="true"] {\r\n justify-content: flex-end;\r\n background: var(--settings-focus);\r\n}\r\n\r\n.settings-preference-switch:focus-visible {\r\n outline: 2px solid var(--settings-focus);\r\n outline-offset: 2px;\r\n}\r\n\r\n.settings-preference-switch__thumb {\r\n width: 20px;\r\n height: 20px;\r\n border-radius: 50%;\r\n background: var(--settings-primary-text);\r\n box-shadow: 0 1px 3px rgb(0 0 0 / 24%);\r\n}\r\n\r\n.settings-connection-page-header {\r\n display: flex;\r\n align-items: flex-start;\r\n justify-content: space-between;\r\n gap: 18px;\r\n margin-bottom: 18px;\r\n}\r\n\r\n.settings-connection-page-header .settings-section-label {\r\n padding-bottom: 0;\r\n}\r\n\r\n.settings-connection-page-header .settings-page-description {\r\n margin: 5px 0 0;\r\n}\r\n\r\n.settings-connections-content,\r\n.settings-connections-layout,\r\n.settings-connection-list,\r\n.settings-connection-rows {\r\n min-width: 0;\r\n}\r\n\r\n.settings-connections-layout {\r\n display: grid;\r\n grid-template-columns: minmax(0, 1.55fr) minmax(280px, 0.85fr);\r\n align-items: start;\r\n gap: 18px;\r\n}\r\n\r\n.settings-connection-list,\r\n.settings-connection-inspector {\r\n overflow: hidden;\r\n background: var(--settings-panel);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 10px;\r\n}\r\n\r\n.settings-connection-host-strip {\r\n display: grid;\r\n grid-template-columns: 30px minmax(0, 1fr) 30px;\r\n align-items: center;\r\n min-width: 0;\r\n gap: 5px;\r\n padding: 9px 10px;\r\n border-bottom: 1px solid var(--settings-divider);\r\n}\r\n\r\n.settings-connection-host-scroll {\r\n display: none;\r\n align-items: center;\r\n justify-content: center;\r\n width: 30px;\r\n height: 34px;\r\n padding: 0;\r\n color: var(--settings-muted);\r\n background: var(--settings-inset);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 8px;\r\n cursor: pointer;\r\n}\r\n\r\n.settings-connection-host-strip[data-connection-host-overflow="true"]\r\n .settings-connection-host-scroll {\r\n display: inline-flex;\r\n}\r\n\r\n.settings-connection-host-strip:not([data-connection-host-overflow="true"]) {\r\n grid-template-columns: minmax(0, 1fr);\r\n}\r\n\r\n.settings-connection-host-scroll:hover:not(:disabled) {\r\n color: var(--settings-text);\r\n background: var(--settings-hover);\r\n}\r\n\r\n.settings-connection-host-scroll:disabled {\r\n cursor: default;\r\n opacity: 0.35;\r\n}\r\n\r\n.settings-connection-host-scroll:focus-visible,\r\n.settings-connection-host-tab:focus-visible,\r\n.settings-connection-row:focus-visible,\r\n.settings-connection-install-link:focus-visible,\r\n.settings-connection-view-error:focus-visible {\r\n outline: 2px solid var(--settings-focus);\r\n outline-offset: 1px;\r\n}\r\n\r\n.settings-connection-host-tabs {\r\n display: flex;\r\n align-items: center;\r\n min-width: 0;\r\n gap: 6px;\r\n overflow-x: auto;\r\n overflow-y: hidden;\r\n overscroll-behavior-x: contain;\r\n scrollbar-width: none;\r\n scroll-behavior: smooth;\r\n scroll-snap-type: x proximity;\r\n touch-action: pan-x;\r\n}\r\n\r\n.settings-connection-host-tabs::-webkit-scrollbar {\r\n display: none;\r\n}\r\n\r\n.settings-connection-host-tab {\r\n display: inline-flex;\r\n align-items: center;\r\n height: 30px;\r\n min-width: max-content;\r\n flex: none;\r\n padding: 0 9px;\r\n color: var(--settings-muted);\r\n font: inherit;\r\n font-size: 12px;\r\n line-height: 18px;\r\n white-space: nowrap;\r\n background: var(--settings-inset);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 7px;\r\n cursor: pointer;\r\n scroll-snap-align: start;\r\n}\r\n\r\n.settings-connection-host-tab:hover {\r\n color: var(--settings-text);\r\n background: var(--settings-hover);\r\n}\r\n\r\n.settings-connection-host-tab[aria-selected="true"] {\r\n color: var(--settings-text);\r\n font-weight: 600;\r\n background: var(--settings-active);\r\n border-color: var(--settings-border);\r\n}\r\n\r\n.settings-connection-table-header,\r\n.settings-connection-row {\r\n display: grid;\r\n grid-template-columns: minmax(160px, 1fr) minmax(92px, auto) 108px;\r\n align-items: center;\r\n min-width: 0;\r\n gap: 10px;\r\n}\r\n\r\n.settings-connection-table-header {\r\n min-height: 30px;\r\n padding: 0 10px;\r\n color: var(--settings-muted);\r\n font-size: 10px;\r\n font-weight: 600;\r\n line-height: 16px;\r\n text-transform: uppercase;\r\n letter-spacing: 0.06em;\r\n background: transparent;\r\n border-bottom: 1px solid var(--settings-divider);\r\n}\r\n\r\n.settings-connection-row {\r\n min-height: 52px;\r\n padding: 8px 10px;\r\n cursor: pointer;\r\n border-bottom: 1px solid var(--settings-divider);\r\n}\r\n\r\n.settings-connection-row:last-child {\r\n border-bottom: 0;\r\n}\r\n\r\n.settings-connection-row:hover {\r\n background: var(--settings-hover);\r\n}\r\n\r\n.settings-connection-row[data-connection-selected="true"] {\r\n background: var(--settings-surface);\r\n}\r\n\r\n.settings-connection-row__identity,\r\n.settings-connection-inspector__identity {\r\n display: inline-flex;\r\n align-items: center;\r\n min-width: 0;\r\n gap: 8px;\r\n color: var(--settings-text);\r\n}\r\n\r\n.settings-connection-row__identity strong,\r\n.settings-connection-inspector__identity strong {\r\n min-width: 0;\r\n overflow-wrap: anywhere;\r\n font-size: 12px;\r\n font-weight: 500;\r\n line-height: 18px;\r\n}\r\n\r\n.settings-connection-row__mark {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 24px;\r\n height: 24px;\r\n flex: none;\r\n color: var(--settings-muted);\r\n font-size: 10px;\r\n font-weight: 700;\r\n background: var(--settings-surface);\r\n border-radius: 6px;\r\n}\r\n\r\n.settings-connection-row__mark--logo {\r\n color: var(--settings-text);\r\n background: transparent;\r\n}\r\n\r\n.settings-connection-row__mark--logo > img,\r\n.settings-connection-row__mark--logo > svg {\r\n display: block;\r\n max-width: 18px;\r\n max-height: 18px;\r\n}\r\n\r\n.settings-connection-row__status {\r\n display: inline-flex;\r\n align-items: center;\r\n width: fit-content;\r\n gap: 5px;\r\n color: var(--settings-muted);\r\n font-size: 11px;\r\n font-weight: 500;\r\n line-height: 18px;\r\n}\r\n\r\n.settings-connection-row__status::before {\r\n width: 6px;\r\n height: 6px;\r\n flex: none;\r\n content: "";\r\n background: currentColor;\r\n border-radius: 50%;\r\n}\r\n\r\n.settings-connection-row__status[data-connection-tone="ready"] {\r\n color: var(--settings-success);\r\n}\r\n\r\n.settings-connection-row__status[data-connection-tone="checking"] {\r\n color: var(--settings-warning);\r\n}\r\n\r\n.settings-connection-row__status[data-connection-tone="setup"] {\r\n color: var(--settings-muted);\r\n}\r\n\r\n.settings-connection-row__status[data-connection-tone="setup"]::before {\r\n background: transparent;\r\n border: 1.5px solid currentColor;\r\n}\r\n\r\n.settings-connection-row__status[data-connection-tone="failed"] {\r\n color: var(--settings-danger);\r\n}\r\n\r\n.settings-connection-row__action {\r\n display: flex;\r\n align-items: center;\r\n justify-content: flex-end;\r\n min-width: 0;\r\n gap: 4px;\r\n}\r\n\r\n.settings-connection-row__handle {\r\n display: inline-flex;\r\n flex: none;\r\n align-items: center;\r\n justify-content: center;\r\n width: 16px;\r\n color: var(--settings-muted);\r\n cursor: grab;\r\n opacity: 0.6;\r\n}\r\n\r\n.settings-connection-row__handle:hover {\r\n opacity: 1;\r\n}\r\n\r\n.settings-connection-row[draggable="true"] {\r\n cursor: grab;\r\n}\r\n\r\n.settings-connection-row[data-connection-dragging="true"] {\r\n opacity: 0.4;\r\n}\r\n\r\n.settings-connection-row[data-connection-drop-indicator="before"] {\r\n box-shadow: inset 0 2px 0 0 var(--settings-focus);\r\n}\r\n\r\n.settings-connection-row[data-connection-drop-indicator="after"] {\r\n box-shadow: inset 0 -2px 0 0 var(--settings-focus);\r\n}\r\n\r\n.settings-connection-row__group-toggle {\r\n display: inline-flex;\r\n flex: none;\r\n align-items: center;\r\n justify-content: center;\r\n width: 26px;\r\n height: 26px;\r\n color: var(--settings-muted);\r\n background: transparent;\r\n border: 0;\r\n border-radius: 6px;\r\n cursor: pointer;\r\n}\r\n\r\n.settings-connection-row__group-toggle:hover {\r\n color: var(--settings-text);\r\n background: var(--settings-hover);\r\n}\r\n\r\n.settings-connection-group-divider {\r\n padding: 10px 12px 6px;\r\n color: var(--settings-muted);\r\n font-size: 10px;\r\n font-weight: 600;\r\n line-height: 16px;\r\n text-transform: uppercase;\r\n letter-spacing: 0.06em;\r\n /* No border-top here: the row immediately above already carries its own\r\n border-bottom (it is no longer :last-child once this divider follows\r\n it), so adding one here would double the separator line. */\r\n}\r\n\r\n.settings-connection-group-more[data-connection-drag-over="true"] {\r\n background: rgb(51 156 255 / 8%);\r\n}\r\n\r\n.settings-connection-group-hint {\r\n display: grid;\r\n gap: 3px;\r\n margin: 0 12px 12px;\r\n padding: 14px 16px;\r\n text-align: center;\r\n border: 1.5px dashed var(--settings-border);\r\n border-radius: 10px;\r\n}\r\n\r\n.settings-connection-group-more[data-connection-drag-over="true"] .settings-connection-group-hint {\r\n border-color: var(--settings-focus);\r\n}\r\n\r\n.settings-connection-group-hint strong {\r\n color: var(--settings-text);\r\n font-size: 12.5px;\r\n font-weight: 500;\r\n line-height: 18px;\r\n}\r\n\r\n.settings-connection-group-hint span {\r\n color: var(--settings-muted);\r\n font-size: 12px;\r\n line-height: 17px;\r\n}\r\n\r\n.settings-connection-group-reset {\r\n display: flex;\r\n width: 100%;\r\n align-items: center;\r\n gap: 6px;\r\n padding: 10px 12px;\r\n color: var(--settings-muted);\r\n font: inherit;\r\n font-size: 12px;\r\n text-align: left;\r\n background: transparent;\r\n border: 0;\r\n border-top: 1px solid var(--settings-divider);\r\n cursor: pointer;\r\n}\r\n\r\n.settings-connection-group-reset:hover {\r\n color: var(--settings-text);\r\n background: var(--settings-hover);\r\n}\r\n\r\n.settings-connection-install-link {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 26px;\r\n height: 26px;\r\n color: var(--settings-focus);\r\n text-decoration: none;\r\n background: transparent;\r\n border: 1px solid transparent;\r\n border-radius: 7px;\r\n opacity: 0;\r\n transition: opacity 120ms ease;\r\n}\r\n\r\n.settings-connection-row:hover .settings-connection-install-link,\r\n.settings-connection-install-link:focus-visible {\r\n opacity: 1;\r\n}\r\n\r\n.settings-connection-install-link:hover {\r\n color: var(--settings-focus);\r\n background: var(--settings-active);\r\n border-color: var(--settings-border);\r\n}\r\n\r\n.settings-connection-view-error {\r\n padding: 4px 7px;\r\n color: var(--settings-danger);\r\n font: inherit;\r\n font-size: 11px;\r\n line-height: 18px;\r\n background: transparent;\r\n border: 0;\r\n border-radius: 6px;\r\n cursor: pointer;\r\n}\r\n\r\n.settings-connection-view-error:hover {\r\n color: var(--settings-danger);\r\n background: var(--settings-danger-bg);\r\n}\r\n\r\n.settings-connection-inspector {\r\n position: sticky;\r\n top: 18px;\r\n}\r\n\r\n.settings-connection-inspector__header {\r\n display: flex;\r\n align-items: flex-start;\r\n justify-content: space-between;\r\n min-width: 0;\r\n gap: 10px;\r\n padding: 12px;\r\n border-bottom: 1px solid var(--settings-divider);\r\n}\r\n\r\n.settings-connection-inspector__body {\r\n display: grid;\r\n min-width: 0;\r\n gap: 12px;\r\n padding: 12px;\r\n}\r\n\r\n.settings-connection-install-callout {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 14px;\r\n padding: 14px;\r\n background: var(--settings-surface);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 10px;\r\n}\r\n\r\n.settings-connection-install-head {\r\n display: flex;\r\n align-items: flex-start;\r\n gap: 12px;\r\n min-width: 0;\r\n}\r\n\r\n.settings-connection-install-head > div {\r\n min-width: 0;\r\n flex: 1;\r\n}\r\n\r\n.settings-connection-install-callout__icon {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 32px;\r\n height: 32px;\r\n flex: none;\r\n color: var(--settings-focus);\r\n background: var(--settings-active);\r\n border-radius: 8px;\r\n}\r\n\r\n.settings-connection-install-callout strong,\r\n.settings-connection-install-head strong,\r\n.settings-connection-error-summary strong,\r\n.settings-connection-state-summary strong {\r\n display: block;\r\n margin: 0 0 4px;\r\n color: var(--settings-text);\r\n font-size: 13px;\r\n font-weight: 600;\r\n line-height: 19px;\r\n}\r\n\r\n.settings-connection-install-callout p,\r\n.settings-connection-install-head p,\r\n.settings-connection-error-summary p,\r\n.settings-connection-state-summary p,\r\n.settings-connection-issue-note {\r\n margin: 0;\r\n color: var(--settings-muted);\r\n font-size: 12px;\r\n line-height: 18px;\r\n}\r\n\r\n.settings-connection-install-button {\r\n width: 100%;\r\n}\r\n\r\n.settings-connection-error-summary {\r\n padding: 13px 14px;\r\n color: var(--settings-danger);\r\n background: var(--settings-danger-bg);\r\n border: 1px solid var(--settings-danger-border);\r\n border-radius: 10px;\r\n}\r\n\r\n.settings-connection-error-metadata {\r\n display: grid;\r\n gap: 7px;\r\n padding: 12px;\r\n background: var(--settings-inset);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 9px;\r\n}\r\n\r\n.settings-connection-detail-line {\r\n display: grid;\r\n grid-template-columns: 92px minmax(0, 1fr);\r\n gap: 10px;\r\n min-width: 0;\r\n color: var(--settings-muted);\r\n font-size: 10px;\r\n line-height: 16px;\r\n}\r\n\r\n.settings-connection-detail-line code {\r\n min-width: 0;\r\n overflow-wrap: anywhere;\r\n color: var(--settings-text);\r\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\r\n white-space: pre-wrap;\r\n}\r\n\r\n.settings-connection-error-log-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: 10px;\r\n}\r\n\r\n.settings-connection-error-log-header strong {\r\n color: var(--settings-text);\r\n font-size: 11px;\r\n font-weight: 600;\r\n}\r\n\r\n.settings-connection-error-log-header .settings-command-button {\r\n min-height: 30px;\r\n padding: 5px 9px;\r\n font-size: 11px;\r\n}\r\n\r\n.settings-connection-stderr {\r\n max-height: 220px;\r\n min-width: 0;\r\n margin: 0;\r\n padding: 11px;\r\n overflow: auto;\r\n color: var(--settings-text);\r\n font:\r\n 10px/16px ui-monospace,\r\n "SFMono-Regular",\r\n Consolas,\r\n "Liberation Mono",\r\n monospace;\r\n white-space: pre-wrap;\r\n overflow-wrap: anywhere;\r\n background: var(--settings-inset);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 9px;\r\n}\r\n\r\n.settings-connection-error-actions {\r\n display: grid;\r\n grid-template-columns: minmax(0, 1fr);\r\n gap: 8px;\r\n}\r\n\r\n.settings-connection-error-actions .settings-command-button {\r\n width: 100%;\r\n}\r\n\r\n.settings-connection-issue-note {\r\n margin-top: -4px;\r\n}\r\n\r\n.settings-connection-state-summary {\r\n padding: 14px;\r\n background: var(--settings-surface);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 10px;\r\n}\r\n\r\n.settings-empty {\r\n display: flex;\r\n align-items: center;\r\n min-height: 72px;\r\n padding: 12px 16px;\r\n}\r\n\r\n.settings-empty > div {\r\n display: grid;\r\n min-width: 0;\r\n gap: 2px;\r\n}\r\n\r\n.settings-empty strong {\r\n color: var(--settings-text);\r\n font-size: 13px;\r\n font-weight: 500;\r\n line-height: 19px;\r\n}\r\n\r\n.settings-empty span {\r\n color: var(--settings-muted);\r\n font-size: 13px;\r\n line-height: 19px;\r\n}\r\n\r\n.settings-about-panel {\r\n display: grid;\r\n max-width: 720px;\r\n gap: 18px;\r\n padding: 24px;\r\n background: var(--settings-panel);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 12px;\r\n}\r\n\r\n.settings-about-product {\r\n color: var(--settings-text);\r\n font-size: 24px;\r\n font-weight: 700;\r\n line-height: 32px;\r\n}\r\n\r\n.settings-about-tagline {\r\n color: var(--settings-text);\r\n font-size: 16px;\r\n font-weight: 600;\r\n line-height: 24px;\r\n}\r\n\r\n.settings-about-version-row {\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n margin: 4px 0 8px;\r\n}\r\n\r\n.settings-about-version-badge {\r\n display: inline-flex;\r\n align-items: center;\r\n font-size: 13px;\r\n font-weight: 600;\r\n color: var(--settings-text);\r\n background: var(--settings-surface);\r\n border: 1px solid var(--settings-border);\r\n padding: 4px 10px;\r\n border-radius: 6px;\r\n}\r\n\r\n.settings-about-copy {\r\n display: grid;\r\n max-width: 660px;\r\n gap: 12px;\r\n}\r\n\r\n.settings-about-copy p,\r\n.settings-about-repository p {\r\n margin: 0;\r\n color: var(--settings-muted);\r\n font-size: 13px;\r\n line-height: 21px;\r\n}\r\n\r\n.settings-about-star-callout {\r\n margin: 2px 0;\r\n color: var(--settings-warning);\r\n font-size: 14px;\r\n font-weight: 600;\r\n line-height: 22px;\r\n}\r\n\r\n.settings-about-repository {\r\n display: grid;\r\n gap: 10px;\r\n padding-top: 18px;\r\n border-top: 1px solid var(--settings-divider);\r\n}\r\n\r\n.settings-about-repository-link {\r\n display: flex;\r\n align-items: center;\r\n width: fit-content;\r\n min-width: 0;\r\n max-width: 100%;\r\n gap: 8px;\r\n color: var(--settings-focus);\r\n font-size: 13px;\r\n font-weight: 600;\r\n text-decoration: none;\r\n}\r\n\r\n.settings-about-repository-link:hover {\r\n text-decoration: underline;\r\n}\r\n\r\n.settings-about-repository-link code {\r\n min-width: 0;\r\n overflow: hidden;\r\n color: var(--settings-muted);\r\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\r\n font-size: 11px;\r\n font-weight: 400;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.settings-page-error {\r\n padding: 16px;\r\n color: var(--settings-text);\r\n font-size: 13px;\r\n background: var(--settings-panel);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 20px;\r\n}\r\n\r\n.settings-update-metadata {\r\n display: grid;\r\n grid-template-columns: repeat(3, minmax(0, 1fr));\r\n gap: 24px;\r\n margin-bottom: 24px;\r\n padding: 0 4px 20px;\r\n border-bottom: 1px solid var(--settings-divider);\r\n}\r\n\r\n.settings-update-metadata__item {\r\n display: grid;\r\n min-width: 0;\r\n gap: 4px;\r\n}\r\n\r\n.settings-update-metadata__item span {\r\n color: var(--settings-muted);\r\n font-size: 12px;\r\n line-height: 18px;\r\n}\r\n\r\n.settings-update-metadata__item strong {\r\n min-width: 0;\r\n overflow-wrap: anywhere;\r\n color: var(--settings-text);\r\n font-size: 15px;\r\n font-weight: 500;\r\n line-height: 22px;\r\n}\r\n\r\n/* The only emphasis on this screen: a latest version newer than the installed one. */\r\n.settings-update-metadata__value--newer {\r\n color: var(--settings-focus);\r\n}\r\n\r\n.settings-update-panel {\r\n display: grid;\r\n gap: 12px;\r\n padding: 20px;\r\n color: var(--settings-text);\r\n background: var(--settings-panel);\r\n border: 1px solid var(--settings-border);\r\n border-radius: 8px;\r\n}\r\n\r\n.settings-update-panel__head {\r\n display: flex;\r\n align-items: center;\r\n min-width: 0;\r\n gap: 8px;\r\n}\r\n\r\n.settings-update-panel__head .harnessmix-settings-icon {\r\n color: var(--settings-muted);\r\n}\r\n\r\n.settings-update-panel[data-update-state="available"] .harnessmix-settings-icon,\r\n.settings-update-panel[data-update-state="downloading"] .harnessmix-settings-icon,\r\n.settings-update-panel[data-update-state="installing"] .harnessmix-settings-icon,\r\n.settings-update-panel[data-update-state="restarting"] .harnessmix-settings-icon {\r\n color: var(--settings-focus);\r\n}\r\n\r\n.settings-update-panel[data-update-state="current"] .harnessmix-settings-icon {\r\n color: var(--settings-success);\r\n}\r\n\r\n.settings-update-panel[data-update-state="failed"] .harnessmix-settings-icon,\r\n.settings-update-panel[data-update-state="error"] .harnessmix-settings-icon {\r\n color: var(--settings-danger);\r\n}\r\n\r\n.settings-update-panel__title {\r\n min-width: 0;\r\n overflow-wrap: anywhere;\r\n color: var(--settings-text);\r\n font-size: 14px;\r\n font-weight: 600;\r\n line-height: 22px;\r\n}\r\n\r\n.settings-update-summary,\r\n.settings-update-error {\r\n margin: 0;\r\n overflow-wrap: anywhere;\r\n font-size: 13px;\r\n line-height: 20px;\r\n}\r\n\r\n.settings-update-summary {\r\n color: var(--settings-muted);\r\n}\r\n\r\n.settings-update-error {\r\n color: var(--settings-danger);\r\n}\r\n\r\n.settings-update-progress {\r\n width: 100%;\r\n height: 8px;\r\n accent-color: var(--settings-focus);\r\n}\r\n\r\n.settings-update-progress-detail {\r\n color: var(--settings-muted);\r\n font-size: 12px;\r\n line-height: 18px;\r\n}\r\n\r\n/* Release notes scroll with the page; a scroller inside a scroller traps the wheel. */\r\n.settings-update-notes-section {\r\n min-width: 0;\r\n margin-top: 24px;\r\n padding-top: 24px;\r\n border-top: 1px solid var(--settings-divider);\r\n}\r\n\r\n.settings-update-notes-section:empty {\r\n display: none;\r\n}\r\n\r\n.settings-update-notes {\r\n display: grid;\r\n min-width: 0;\r\n gap: 12px;\r\n color: var(--settings-muted);\r\n font-size: 14px;\r\n line-height: 22px;\r\n overflow-wrap: anywhere;\r\n}\r\n\r\n.settings-update-notes > :first-child {\r\n margin-top: 0;\r\n}\r\n\r\n.settings-update-notes > :last-child {\r\n margin-bottom: 0;\r\n}\r\n\r\n.settings-update-notes h1,\r\n.settings-update-notes h2,\r\n.settings-update-notes h3,\r\n.settings-update-notes h4,\r\n.settings-update-notes h5,\r\n.settings-update-notes h6 {\r\n margin: 6px 0 0;\r\n color: var(--settings-text);\r\n font-weight: 600;\r\n}\r\n\r\n.settings-update-notes h1 {\r\n font-size: 18px;\r\n line-height: 26px;\r\n}\r\n\r\n.settings-update-notes h2 {\r\n font-size: 17px;\r\n line-height: 24px;\r\n}\r\n\r\n.settings-update-notes h3,\r\n.settings-update-notes h4,\r\n.settings-update-notes h5,\r\n.settings-update-notes h6 {\r\n font-size: 14px;\r\n line-height: 22px;\r\n}\r\n\r\n.settings-update-notes p,\r\n.settings-update-notes ul,\r\n.settings-update-notes ol,\r\n.settings-update-notes pre,\r\n.settings-update-notes blockquote {\r\n margin: 0;\r\n}\r\n\r\n.settings-update-notes ul,\r\n.settings-update-notes ol {\r\n padding-left: 24px;\r\n}\r\n\r\n.settings-update-notes li {\r\n padding-left: 4px;\r\n}\r\n\r\n.settings-update-notes li::marker {\r\n color: var(--settings-muted);\r\n font-size: 0.85em;\r\n}\r\n\r\n.settings-update-notes li + li {\r\n margin-top: 14px;\r\n}\r\n\r\n.settings-update-notes .release-note-translation {\r\n display: block;\r\n margin-top: 3px;\r\n color: var(--settings-muted);\r\n font-size: 13px;\r\n line-height: 20px;\r\n}\r\n\r\n.settings-update-notes blockquote {\r\n padding: 8px 12px;\r\n color: var(--settings-muted);\r\n border-left: 3px solid var(--settings-focus);\r\n background: var(--settings-surface);\r\n}\r\n\r\n.settings-update-notes hr {\r\n width: 100%;\r\n margin: 2px 0;\r\n border: 0;\r\n border-top: 1px solid var(--settings-divider);\r\n}\r\n\r\n.settings-update-notes strong {\r\n color: var(--settings-text);\r\n font-weight: 600;\r\n}\r\n\r\n.settings-update-notes a {\r\n color: var(--settings-focus);\r\n text-decoration: none;\r\n}\r\n\r\n.settings-update-notes a:hover {\r\n text-decoration: underline;\r\n}\r\n\r\n.settings-update-notes code {\r\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\r\n font-size: 12px;\r\n}\r\n\r\n.settings-update-notes :not(pre) > code {\r\n padding: 1px 5px;\r\n background: var(--settings-surface);\r\n border-radius: 4px;\r\n}\r\n\r\n.settings-update-notes pre {\r\n min-width: 0;\r\n max-width: 100%;\r\n padding: 10px 12px;\r\n overflow-x: auto;\r\n overflow-y: hidden;\r\n background: var(--settings-inset);\r\n border-radius: 6px;\r\n}\r\n\r\n.settings-update-notes pre code {\r\n line-height: 18px;\r\n white-space: pre-wrap;\r\n}\r\n\r\n/* Manual update sits directly under the status panel, not behind a disclosure:\r\n automatic updates can fail for machine-local reasons and this is the way out. */\r\n.settings-update-controls {\r\n display: grid;\r\n min-width: 0;\r\n gap: 10px;\r\n margin-top: 24px;\r\n}\r\n\r\n.settings-update-manual-title {\r\n color: var(--settings-text);\r\n font-size: 15px;\r\n font-weight: 600;\r\n line-height: 22px;\r\n}\r\n\r\n.settings-update-manual {\r\n display: grid;\r\n min-width: 0;\r\n gap: 8px;\r\n}\r\n\r\n.settings-update-manual[hidden] {\r\n display: none;\r\n}\r\n\r\n.settings-update-manual-description {\r\n margin: 0;\r\n color: var(--settings-muted);\r\n font-size: 12px;\r\n line-height: 18px;\r\n}\r\n\r\n.settings-update-manual-description.is-fallback {\r\n color: var(--settings-danger);\r\n}\r\n\r\n.settings-update-command {\r\n display: flex;\r\n align-items: stretch;\r\n min-width: 0;\r\n overflow: hidden;\r\n border: 1px solid var(--settings-border);\r\n border-radius: 6px;\r\n}\r\n\r\n.settings-update-command code {\r\n min-width: 0;\r\n flex: 1;\r\n padding: 9px 12px;\r\n overflow-x: auto;\r\n color: var(--settings-text);\r\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\r\n font-size: 12px;\r\n line-height: 20px;\r\n white-space: nowrap;\r\n}\r\n\r\n.settings-update-command__copy {\r\n display: inline-flex;\r\n align-items: center;\r\n flex: none;\r\n gap: 6px;\r\n padding: 0 12px;\r\n color: var(--settings-muted);\r\n font-size: 12px;\r\n background: transparent;\r\n border: 0;\r\n border-left: 1px solid var(--settings-border);\r\n cursor: pointer;\r\n}\r\n\r\n.settings-update-command__copy:hover {\r\n color: var(--settings-text);\r\n background: var(--settings-hover);\r\n}\r\n\r\n.settings-update-command__copy:focus-visible {\r\n outline: 2px solid var(--settings-focus);\r\n outline-offset: -2px;\r\n}\r\n\r\n.settings-update-actions {\n display: flex;\r\n align-items: center;\r\n min-width: 0;\r\n gap: 12px;\r\n flex-wrap: wrap;\r\n}\n\n.settings-storage-block {\n display: grid;\n gap: 12px;\n margin-bottom: 16px;\n}\n\r\n.settings-command-button,\r\n.settings-update-link {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex: none;\r\n width: max-content;\r\n max-width: 100%;\r\n min-height: 30px;\r\n gap: 6px;\r\n padding: 5px 10px;\r\n white-space: nowrap;\r\n color: var(--settings-primary-text);\r\n font: inherit;\r\n font-size: 12px;\r\n text-decoration: none;\r\n background: var(--settings-primary);\r\n border: 1px solid var(--settings-primary);\r\n border-radius: 7px;\r\n cursor: pointer;\r\n}\r\n\r\n.settings-command-button--secondary,\r\n.settings-update-link {\r\n color: var(--settings-text);\r\n background: var(--settings-panel);\r\n border-color: var(--settings-border);\r\n}\r\n\r\n.settings-command-button:hover:not(:disabled) {\r\n background: var(--settings-primary-hover);\r\n border-color: var(--settings-primary-hover);\r\n}\r\n\r\n.settings-command-button--secondary:hover:not(:disabled),\r\n.settings-update-link:hover {\r\n background: var(--settings-hover);\r\n border-color: var(--settings-border);\r\n}\r\n\r\n.settings-command-button--danger {\r\n color: #f87171;\r\n}\r\n\r\n.settings-command-button--danger:hover:not(:disabled) {\r\n color: #fecaca;\r\n background: rgb(127 29 29 / 24%);\r\n border-color: rgb(248 113 113 / 45%);\r\n}\r\n\r\n.settings-command-button:disabled {\r\n cursor: default;\r\n opacity: 0.45;\r\n}\r\n\r\n.settings-command-button:disabled,\r\n.settings-command-button[aria-disabled="true"] {\r\n opacity: 0.55;\r\n cursor: not-allowed;\r\n filter: none;\r\n}\r\n\r\n.settings-command-button:focus-visible,\r\n.settings-update-link:focus-visible {\r\n outline: 2px solid var(--settings-focus);\r\n outline-offset: 2px;\r\n}\r\n\r\n.harnessmix-settings-icon {\r\n display: block;\r\n flex: none;\r\n stroke: currentColor;\r\n}\r\n\r\n@media (max-width: 720px) {\r\n .harnessmix-settings-dialog {\r\n width: calc(100vw - 16px);\r\n height: calc(100vh - 16px);\r\n border-radius: 10px;\r\n }\r\n\r\n .settings-layout {\r\n grid-template-columns: minmax(0, 1fr);\r\n grid-template-rows: auto minmax(0, 1fr);\r\n }\r\n\r\n .settings-session-import-row {\r\n grid-template-columns: minmax(0, 1fr);\r\n }\r\n\r\n .settings-session-import-row__action {\r\n align-items: flex-start;\r\n }\r\n\r\n .settings-sidebar {\r\n border-right: 0;\r\n border-bottom: 1px solid var(--settings-border);\r\n }\r\n\r\n .settings-header {\r\n height: 56px;\r\n padding-inline: 14px;\r\n }\r\n\r\n .settings-sidebar {\r\n padding-top: 20px;\r\n }\r\n\r\n .settings-nav {\r\n flex: none;\r\n flex-direction: row;\r\n gap: 4px;\r\n padding: 7px 8px 8px;\r\n overflow-x: auto;\r\n overflow-y: hidden;\r\n }\r\n\r\n .settings-nav-section-label {\r\n display: none;\r\n }\r\n\r\n .settings-nav-button {\r\n width: auto;\r\n min-width: max-content;\r\n min-height: 34px;\r\n grid-template-columns: 16px auto;\r\n border-radius: 10px;\r\n }\r\n\r\n .settings-nav-star-link {\r\n margin-top: 0;\r\n }\r\n\r\n .settings-page__content {\r\n width: calc(100% - 40px);\r\n }\r\n\r\n .settings-page__content {\r\n padding-top: 32px;\r\n padding-bottom: 32px;\r\n }\r\n\r\n .settings-section-label {\r\n padding-bottom: 20px;\r\n font-size: 20px;\r\n line-height: 26px;\r\n }\r\n\r\n .settings-update-metadata {\r\n grid-template-columns: minmax(0, 1fr);\r\n gap: 16px;\r\n }\r\n\r\n .settings-status-row {\r\n grid-template-columns: minmax(0, 1fr) auto;\r\n gap: 16px;\r\n }\r\n\r\n .settings-account-header,\r\n .settings-connection-page-header {\r\n flex-direction: column;\r\n }\r\n\r\n .settings-account-header > .settings-command-button,\r\n .settings-connection-page-header > .settings-command-button {\r\n width: 100%;\r\n }\r\n\r\n .settings-connections-layout {\r\n grid-template-columns: minmax(0, 1fr);\r\n }\r\n\r\n .settings-connection-inspector {\r\n position: static;\r\n }\r\n\r\n .settings-status-row__detail {\r\n grid-column: 1 / -1;\r\n margin: -8px 0 0 58px;\r\n }\r\n}\r\n\r\n@media (forced-colors: active) {\r\n :host {\r\n --settings-bg: Canvas;\r\n --settings-sidebar: Canvas;\r\n --settings-panel: Canvas;\r\n --settings-surface: Canvas;\r\n --settings-surface-hover: Highlight;\r\n --settings-inset: Canvas;\r\n --settings-text: CanvasText;\r\n --settings-muted: GrayText;\r\n --settings-subtle: GrayText;\r\n --settings-border: ButtonBorder;\r\n --settings-divider: ButtonBorder;\r\n --settings-hover: Highlight;\r\n --settings-active: Highlight;\r\n --settings-focus: Highlight;\r\n --settings-primary: ButtonFace;\r\n --settings-primary-hover: Highlight;\r\n --settings-primary-text: ButtonText;\r\n --settings-warning: CanvasText;\r\n --settings-warning-bg: Canvas;\r\n --settings-warning-border: ButtonBorder;\r\n --settings-danger: CanvasText;\r\n --settings-danger-bg: Canvas;\r\n --settings-danger-border: ButtonBorder;\r\n --settings-success: CanvasText;\r\n }\r\n}\r\n\r\n@media (prefers-reduced-motion: reduce) {\r\n *,\r\n *::before,\r\n *::after {\r\n scroll-behavior: auto !important;\r\n transition-duration: 0s !important;\r\n }\r\n}\r\n\r\n/* Harness Mix: Model Configuration & One-click Install */\r\n.settings-model-config-panel {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 12px;\r\n padding: 14px;\r\n margin-top: 14px;\r\n border-radius: 8px;\r\n background: var(--settings-surface);\r\n border: 1px solid var(--settings-border);\r\n}\r\n\r\n.settings-model-config-head {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n}\r\n\r\n.settings-model-config-title {\r\n font-size: 13px;\r\n font-weight: 600;\r\n color: var(--settings-text);\r\n}\r\n\r\n.settings-model-config-description {\r\n font-size: 11px;\r\n color: var(--settings-muted);\r\n margin: 0;\r\n}\r\n\r\n.settings-model-config-loading,\r\n.settings-model-config-empty {\r\n font-size: 12px;\r\n color: var(--settings-muted);\r\n padding: 8px 0;\r\n}\r\n\r\n.settings-model-config-form {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 12px;\r\n margin-top: 4px;\r\n}\r\n\r\n.settings-model-config-field {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 6px;\r\n}\r\n\r\n.settings-model-config-label {\r\n font-size: 11px;\r\n font-weight: 600;\r\n color: var(--settings-muted);\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n}\r\n\r\n.settings-model-config-select {\r\n height: 32px;\r\n padding: 0 10px;\r\n border-radius: 6px;\r\n border: 1px solid var(--settings-border);\r\n background: var(--settings-panel);\r\n color: var(--settings-text);\r\n font-size: 12px;\r\n outline: none;\r\n}\r\n\r\n.settings-model-config-select:focus {\r\n border-color: var(--settings-primary);\r\n}\r\n\r\n.settings-model-config-actions {\r\n display: flex;\r\n align-items: center;\r\n flex-wrap: wrap;\r\n gap: 8px;\r\n margin-top: 6px;\r\n}\r\n\r\n.settings-model-config-feedback {\r\n font-size: 12px;\r\n font-weight: 500;\r\n}\r\n\r\n.settings-feedback-success {\r\n color: var(--settings-success);\r\n}\r\n\r\n.settings-feedback-error {\r\n color: var(--settings-danger);\r\n}\r\n\r\n.settings-feedback-info {\r\n color: var(--settings-primary);\r\n}\r\n\r\n.settings-install-command-box {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 6px;\r\n min-width: 0;\r\n margin: 0;\r\n}\r\n\r\n.settings-install-command-label {\r\n font-size: 11px;\r\n font-weight: 600;\r\n color: var(--settings-muted);\r\n}\r\n\r\n.settings-install-command-row {\r\n display: flex;\r\n align-items: center;\r\n background: var(--settings-inset);\r\n padding: 8px 12px;\r\n border-radius: 6px;\r\n border: 1px solid var(--settings-border);\r\n min-width: 0;\r\n overflow-x: auto;\r\n}\r\n\r\n.settings-install-command-row code {\r\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\r\n font-size: 12px;\r\n line-height: 18px;\r\n color: var(--settings-text);\r\n user-select: all;\r\n white-space: pre-wrap;\r\n word-break: break-all;\r\n}\r\n\r\n.settings-install-actions {\r\n display: grid;\r\n grid-template-columns: minmax(0, 1fr);\r\n gap: 8px;\r\n margin-top: 4px;\r\n}\r\n\r\n.settings-install-actions .settings-command-button {\r\n width: 100%;\r\n justify-content: center;\r\n}\r\n\r\n.settings-install-feedback {\r\n font-size: 12px;\r\n font-weight: 500;\r\n line-height: 18px;\r\n margin-top: 2px;\r\n overflow-wrap: anywhere;\r\n}\r\n\r\n.settings-install-manual-card {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 8px;\r\n background: var(--settings-inset);\r\n padding: 12px 14px;\r\n border-radius: 8px;\r\n border: 1px solid var(--settings-border);\r\n margin-top: 6px;\r\n margin-bottom: 4px;\r\n}\r\n\r\n.settings-install-manual-badge {\r\n display: inline-flex;\r\n align-items: center;\r\n font-size: 11px;\r\n font-weight: 600;\r\n color: var(--settings-accent, #10a37f);\r\n background: var(--settings-accent-subtle, rgba(16, 163, 127, 0.1));\r\n padding: 2px 8px;\r\n border-radius: 4px;\r\n width: fit-content;\r\n}\r\n\r\n.settings-install-manual-notice {\r\n font-size: 12px;\r\n line-height: 18px;\r\n color: var(--settings-text);\r\n margin: 0;\r\n}\r\n\r\n.settings-install-steps {\r\n margin: 0;\r\n padding-left: 18px;\r\n font-size: 12px;\r\n line-height: 20px;\r\n color: var(--settings-muted);\r\n}\r\n\r\n.settings-install-steps li {\r\n margin-bottom: 2px;\r\n}\r\n/* MCP and Skills share native settings controls while keeping separate flows. */\n.settings-integrations-controls { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; margin: 18px 0 12px; }\n.settings-integrations-controls input { flex: 1; min-width: 180px; }\n.settings-integrations-controls input[hidden] { display: none; }\n.settings-integrations-controls select, .settings-integrations-controls input,\n.settings-integrations-field input, .settings-integrations-toolbar input { box-sizing: border-box; padding: 9px 11px; border: 1px solid var(--settings-border, #8885); border-radius: 8px; color: inherit; background: var(--settings-input, transparent); font: inherit; }\n.settings-integrations-status { min-height: 18px; margin: 0 0 6px; color: var(--settings-muted); font-size: 12px; }\n.settings-integrations-body p { font-size: 12px; line-height: 1.6; opacity: .8; }\n.settings-integrations-toolbar { display: flex; gap: 10px; align-items: center; margin: 8px 0 16px; }\n.settings-integrations-toolbar input { flex: 1; }\n.settings-integrations-list { display: grid; gap: 8px; }\n.settings-integrations-row { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; border: 1px solid var(--settings-border, #8885); padding: 14px; border-radius: 10px; background: var(--settings-surface, transparent); }\n.settings-integrations-row > div { flex: 1; min-width: 180px; }\n.settings-integrations-row p { margin: 3px 0; }\n.settings-integrations-row code { display: block; overflow-wrap: anywhere; font-size: 11px; color: var(--settings-muted); }\n.settings-integrations-row--native { border-style: dashed; }\n.settings-integrations-empty { padding: 36px 18px; border: 1px dashed var(--settings-border, #8885); border-radius: 10px; text-align: center; color: var(--settings-muted); font-size: 12px; }\n.settings-integrations-editor-head { display: flex; align-items: center; gap: 12px; }\n.settings-integrations-editor-head h3 { margin: 0; }\n.settings-integrations-form { display: grid; gap: 14px; margin: 16px 0 28px; }\n.settings-integrations-form--card { padding: 16px; border: 1px solid var(--settings-border, #8885); border-radius: 12px; }\n.settings-integrations-field { display: grid; gap: 6px; font-size: 12px; }\n.settings-integrations-form > button { justify-self: start; }\n.settings-mcp-args { display: grid; gap: 7px; }\n.settings-mcp-arg { display: flex; gap: 8px; align-items: center; }\n.settings-mcp-arg input { flex: 1; }\n.settings-mcp-kv-row { display: flex; gap: 8px; align-items: center; }\n.settings-mcp-kv-row input { flex: 1; }\n.settings-mcp-add-arg { margin-top: 7px; }\n.settings-mcp-docs-link { display: inline-flex; align-items: center; gap: 4px; color: var(--settings-muted, #888); font-size: 13px; text-decoration: none; transition: color 150ms ease; }\n.settings-mcp-docs-link:hover { color: var(--settings-text, #fff); text-decoration: underline; }\n.settings-integrations-editor-head .settings-command-button--danger { margin-left: auto; }\n.settings-mcp-type-toggle { display: inline-flex; padding: 3px; border-radius: 8px; background: var(--settings-inset, rgba(255, 255, 255, 0.06)); border: 1px solid var(--settings-border, #8885); gap: 2px; width: fit-content; }\n.settings-mcp-type-btn { padding: 5px 14px; border-radius: 6px; border: none; background: transparent; color: var(--settings-muted, #888); font: inherit; font-size: 12px; font-weight: 500; cursor: pointer; transition: all 120ms ease; }\n.settings-mcp-type-btn:hover { color: var(--settings-text, #fff); }\n.settings-mcp-type-btn[data-active="true"] { background: var(--settings-active, rgba(255, 255, 255, 0.15)); color: var(--settings-text, #fff); font-weight: 600; }\n.settings-mcp-notice { margin: 4px 0 0; color: var(--settings-muted, #888); font-size: 12px; line-height: 1.5; }\n.settings-mcp-section { display: grid; gap: 14px; }\n.settings-mcp-icon-btn { display: inline-flex; align-items: center; justify-content: center; width: 34px; height: 34px; padding: 0; border: 1px solid var(--settings-border, #8885); border-radius: 8px; background: var(--settings-input, transparent); color: var(--settings-muted, #888); cursor: pointer; flex: none; transition: all 120ms ease; }\n.settings-mcp-icon-btn:hover:not(:disabled) { background: rgba(239, 68, 68, 0.15); border-color: rgba(239, 68, 68, 0.4); color: #f87171; }\n.settings-mcp-icon-btn svg { width: 14px; height: 14px; display: block; }\n.settings-integrations-callout { margin: 0; padding: 10px 12px; border-radius: 8px; background: var(--settings-inset); }\n.settings-skill-dropzone { display: grid; justify-items: center; gap: 8px; padding: 34px 22px; margin: 8px 0 18px; border: 1.5px dashed var(--settings-border, #8887); border-radius: 14px; background: var(--settings-inset); text-align: center; transition: border-color 120ms ease, background 120ms ease, transform 120ms ease; }\n.settings-skill-dropzone > span { max-width: 520px; color: var(--settings-muted); font-size: 12px; line-height: 18px; }\n.settings-skill-dropzone[data-drag-over="true"] { border-color: var(--settings-accent, #10a37f); background: var(--settings-accent-subtle, rgba(16, 163, 127, .1)); transform: scale(.995); }\n.settings-skill-dropzone[data-disabled="true"] { opacity: .55; }\n.settings-skills-target-row { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; justify-content: center; margin-top: 6px; }\n.settings-skills-target-row select { padding: 6px 10px; border: 1px solid var(--settings-border, #8885); border-radius: 8px; background: var(--settings-input, transparent); color: inherit; font: inherit; font-size: 12px; }\n.settings-skills-overview-stats { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; margin: 6px 0 10px; font-size: 12px; color: var(--settings-muted); }\n.settings-skills-tabs { display: inline-flex; padding: 3px; border-radius: 8px; background: var(--settings-inset, rgba(255, 255, 255, 0.06)); border: 1px solid var(--settings-border, #8885); gap: 2px; }\n.settings-skills-tab-btn { padding: 5px 14px; border-radius: 6px; border: none; background: transparent; color: var(--settings-muted, #888); font: inherit; font-size: 12px; font-weight: 500; cursor: pointer; transition: all 120ms ease; }\n.settings-skills-tab-btn:hover { color: var(--settings-text, #fff); }\n.settings-skills-tab-btn[data-active="true"] { background: var(--settings-active, rgba(255, 255, 255, 0.15)); color: var(--settings-text, #fff); font-weight: 600; }\n.settings-skills-overview-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); gap: 14px; margin-top: 10px; }\n.settings-skills-harness-card { border: 1px solid var(--settings-border, #8885); border-radius: 12px; padding: 14px; background: var(--settings-surface, transparent); display: flex; flex-direction: column; gap: 10px; }\n.settings-skills-harness-head { display: flex; justify-content: space-between; align-items: center; border-bottom: 1px solid var(--settings-border, #8883); padding-bottom: 8px; }\n.settings-skills-harness-head strong { font-size: 14px; }\n.settings-skills-badge { font-size: 11px; padding: 2px 8px; border-radius: 10px; background: var(--settings-inset, rgba(255, 255, 255, 0.08)); color: var(--settings-muted); }\n.settings-skills-badge--active { background: rgba(16, 163, 127, 0.15); color: #10a37f; }\n.settings-skills-list-compact { display: flex; flex-direction: column; gap: 8px; max-height: 280px; overflow-y: auto; }\n.settings-skills-item-row { display: flex; justify-content: space-between; align-items: center; gap: 8px; padding: 6px 8px; border-radius: 6px; background: var(--settings-inset, rgba(255, 255, 255, 0.03)); font-size: 12px; }\n.settings-skills-item-row strong { font-size: 13px; }\n.settings-skills-item-row code { font-size: 10px; color: var(--settings-muted); overflow-wrap: anywhere; display: block; }\n.settings-skills-item-actions { display: flex; gap: 6px; align-items: center; flex: none; }\n.settings-skills-matrix-list { display: flex; flex-direction: column; gap: 10px; margin-top: 10px; }\n.settings-skills-matrix-card { border: 1px solid var(--settings-border, #8885); border-radius: 10px; padding: 12px 14px; background: var(--settings-surface, transparent); display: flex; flex-direction: column; gap: 8px; }\n.settings-skills-matrix-head { display: flex; justify-content: space-between; align-items: center; }\n.settings-skills-matrix-head span { font-size: 11px; color: var(--settings-muted); }\n.settings-skills-tags { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }\n.settings-skills-tag { font-size: 11px; padding: 3px 8px; border-radius: 6px; background: rgba(16, 163, 127, 0.15); color: #10a37f; border: 1px solid rgba(16, 163, 127, 0.3); }\n.settings-skills-sync-actions { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; margin-top: 4px; }\n.settings-skills-sync-modal { border: 1px solid var(--settings-border, #8885); border-radius: 12px; background: var(--settings-bg, #1e1e1e); color: inherit; padding: 20px 24px; max-width: 420px; box-shadow: 0 16px 32px rgba(0, 0, 0, 0.5); }\n.settings-skills-sync-modal::backdrop { background: rgba(0, 0, 0, 0.6); backdrop-filter: blur(2px); }\n.settings-skills-sync-modal h3 { margin: 0 0 8px; font-size: 16px; }\n.settings-skills-sync-modal p { margin: 0 0 12px; font-size: 12px; color: var(--settings-muted); }\n.settings-mcp-overview-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(340px, 1fr)); gap: 14px; margin-top: 10px; }\n.settings-mcp-harness-card { border: 1px solid var(--settings-border, #8885); border-radius: 12px; padding: 14px; background: var(--settings-surface, transparent); display: flex; flex-direction: column; gap: 10px; }\n.settings-mcp-harness-head { display: flex; justify-content: space-between; align-items: center; border-bottom: 1px solid var(--settings-border, #8883); padding-bottom: 8px; }\n.settings-mcp-harness-head strong { font-size: 14px; }\n.settings-mcp-native-box { padding: 8px 10px; border-radius: 8px; background: rgba(16, 163, 127, 0.08); border: 1px dashed rgba(16, 163, 127, 0.3); font-size: 11px; display: flex; flex-direction: column; gap: 4px; }\n.settings-mcp-native-title { font-weight: 600; color: #10a37f; display: flex; align-items: center; gap: 6px; }\n.settings-mcp-native-item { display: flex; flex-direction: column; gap: 2px; color: var(--settings-muted); }\n.settings-mcp-native-item code { font-size: 10px; overflow-wrap: anywhere; }\n.settings-mcp-list-compact { display: flex; flex-direction: column; gap: 8px; max-height: 280px; overflow-y: auto; }\n.settings-mcp-item-row { display: flex; justify-content: space-between; align-items: center; gap: 8px; padding: 6px 8px; border-radius: 6px; background: var(--settings-inset, rgba(255, 255, 255, 0.03)); font-size: 12px; }\n.settings-mcp-item-row strong { font-size: 13px; }\n.settings-mcp-item-row code { font-size: 10px; color: var(--settings-muted); overflow-wrap: anywhere; display: block; }\n.settings-mcp-item-actions { display: flex; gap: 6px; align-items: center; flex: none; }\n.settings-mcp-card-footer { display: flex; justify-content: flex-end; margin-top: auto; padding-top: 6px; border-top: 1px solid var(--settings-border, #8882); }\n.settings-mcp-matrix-list { display: flex; flex-direction: column; gap: 10px; margin-top: 10px; }\n.settings-mcp-matrix-card { border: 1px solid var(--settings-border, #8885); border-radius: 10px; padding: 12px 14px; background: var(--settings-surface, transparent); display: flex; flex-direction: column; gap: 8px; }\n.settings-mcp-matrix-head { display: flex; justify-content: space-between; align-items: center; }\n.settings-mcp-matrix-head span { font-size: 11px; color: var(--settings-muted); }\n.settings-mcp-tags { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }\n.settings-mcp-tag { font-size: 11px; padding: 3px 8px; border-radius: 6px; background: rgba(16, 163, 127, 0.15); color: #10a37f; border: 1px solid rgba(16, 163, 127, 0.3); }\n.settings-mcp-tag--disabled { background: rgba(255, 255, 255, 0.05); color: var(--settings-muted); border-color: var(--settings-border, #8885); }\n.settings-mcp-sync-actions { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; margin-top: 4px; }\n.settings-mcp-distribute-modal { border: 1px solid var(--settings-border, #8885); border-radius: 12px; background: var(--settings-bg, #1e1e1e); color: inherit; padding: 20px 24px; max-width: 540px; width: 92%; max-height: 85vh; overflow-y: auto; box-shadow: 0 16px 32px rgba(0, 0, 0, 0.5); }\n.settings-mcp-distribute-modal::backdrop { background: rgba(0, 0, 0, 0.6); backdrop-filter: blur(2px); }\n.settings-mcp-distribute-modal h3 { margin: 0 0 8px; font-size: 16px; }\n.settings-mcp-distribute-modal p { margin: 0 0 12px; font-size: 12px; color: var(--settings-muted); }\n\n';
30493
31142
 
30494
31143
  // src/native-ui/renderer-extension/src/settings/accounts.css
30495
31144
  var accounts_default = '.settings-harness-accounts {\n margin-top: 32px;\n}\n\n.settings-harness-accounts__title {\n margin: 0 0 16px;\n font-size: 14px;\n font-weight: 500;\n}\n\n.settings-harness-account__identity {\n min-width: 0;\n}\n\n.settings-harness-account__identity > .settings-account-email {\n display: block;\n max-width: 24ch;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.settings-harness-account__logo {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n flex: none;\n}\n\n.settings-harness-account {\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-wrap: wrap;\n gap: 20px;\n padding: 20px 24px;\n}\n\n.settings-harness-account > .settings-account-row__person {\n flex: 1 1 280px;\n min-width: 0;\n}\n\n.settings-harness-account > .settings-account-usage {\n flex: 1 1 220px;\n min-width: 0;\n}\n\n.settings-harness-account > .settings-harness-account__actions {\n flex: 0 0 auto;\n}\n\n.settings-harness-account__badge {\n display: inline-flex;\n align-items: center;\n padding: 1px 7px;\n border-radius: 999px;\n font-size: 11px;\n font-weight: 500;\n line-height: 16px;\n}\n\n.settings-harness-account__badge--ready {\n background: rgba(16, 185, 129, 0.12);\n color: #10b981;\n border: 1px solid rgba(16, 185, 129, 0.28);\n}\n\n.settings-harness-account__badge--unconfigured {\n background: rgba(245, 158, 11, 0.12);\n color: #f59e0b;\n border: 1px solid rgba(245, 158, 11, 0.28);\n}\n\n.settings-harness-account__badge--not_installed {\n background: rgba(156, 163, 175, 0.12);\n color: var(--settings-muted);\n border: 1px solid rgba(156, 163, 175, 0.25);\n}\n\n.settings-harness-account__config-hint {\n margin-top: 6px;\n font-size: 11px;\n color: var(--settings-muted);\n display: flex;\n align-items: center;\n gap: 4px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.settings-harness-account__config-hint code {\n font-family: ui-monospace, Consolas, monospace;\n font-size: 11px;\n background: var(--settings-surface);\n border: 1px solid var(--settings-border);\n padding: 1px 5px;\n border-radius: 4px;\n}\n\n.settings-harness-account__actions {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.settings-harness-account__login-btn {\n font-size: 12px;\n padding: 6px 12px;\n white-space: nowrap;\n}\n\n.settings-harness-account + .settings-harness-account {\n border-top: 1px solid var(--settings-border);\n}\n\n.settings-harness-account > div {\n min-width: 0;\n overflow-wrap: anywhere;\n}\n\n@media (max-width: 700px) {\n .settings-harness-account {\n grid-template-columns: minmax(0, 1fr);\n padding: 16px;\n }\n}\n\n.settings-account-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 20px;\n}\n\n.settings-account-eyebrow {\n margin: 0 0 8px;\n color: var(--settings-muted);\n font-size: 11px;\n letter-spacing: 0.13em;\n}\n\n.settings-account-header > :first-child {\n min-width: 0;\n flex: 1 1 auto;\n}\n\n.settings-account-header > .settings-command-button {\n flex: none;\n white-space: nowrap;\n margin-top: 20px;\n min-height: 36px;\n padding: 8px 12px;\n border-radius: 7px;\n}\n\n.settings-account-header .settings-section-label {\n margin: 0;\n padding: 0;\n font-size: 27px;\n line-height: 1.4;\n font-weight: 650;\n letter-spacing: -0.035em;\n}\n.settings-account-header .settings-page-description {\n margin: 8px 0 0;\n font-size: 13px;\n}\n\n.settings-account-status {\n margin: 0;\n color: var(--settings-muted);\n font-size: 12px;\n}\n.settings-account-status:empty {\n display: none;\n}\n\n.settings-account-help-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n margin-top: 20px;\n flex-wrap: wrap;\n}\n.settings-account-task-hint {\n display: flex;\n align-items: flex-start;\n gap: 9px;\n margin: 0;\n color: var(--settings-muted);\n font-size: 12px;\n flex: 1 1 280px;\n}\n.settings-account-task-hint svg {\n flex: none;\n margin-top: 1px;\n}\n.settings-account-help-button {\n display: inline-flex;\n align-items: center;\n gap: 7px;\n padding: 8px 12px;\n color: var(--settings-muted);\n font-size: 12px;\n background: transparent;\n border: 0;\n border-radius: 7px;\n cursor: pointer;\n}\n.settings-account-help-button:hover {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n.settings-account-device-code-note {\n margin: 12px 0 0;\n font-size: 12px;\n padding: 10px 12px;\n color: var(--settings-warning);\n background: var(--settings-warning-bg);\n border: 1px solid var(--settings-warning-border);\n border-radius: 8px;\n}\n\n.settings-account-toolbar {\n margin-top: 27px;\n padding: 18px 0;\n border-top: 1px solid var(--settings-border);\n display: flex;\n align-items: center;\n gap: 14px;\n flex-wrap: wrap;\n}\n.settings-account-count {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n white-space: nowrap;\n}\n.settings-account-count > :last-child {\n color: var(--settings-muted);\n font-variant-numeric: tabular-nums;\n}\n.settings-account-search {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--settings-muted);\n margin-right: auto;\n min-width: 0;\n max-width: 100%;\n}\n.settings-account-search svg {\n flex: none;\n}\n.settings-account-toolbar input {\n min-width: 80px;\n width: 150px;\n max-width: 100%;\n padding: 5px 0;\n color: var(--settings-text);\n background: transparent;\n border: 0;\n font-size: 13px;\n}\n.settings-account-toolbar input::placeholder {\n color: var(--settings-muted);\n}\n.settings-account-display-controls {\n display: flex;\n padding: 3px;\n border: 1px solid var(--settings-border);\n border-radius: 7px;\n background: var(--settings-inset);\n}\n.settings-account-display-controls button {\n padding: 4px 10px;\n color: var(--settings-muted);\n background: transparent;\n border: 0;\n border-radius: 4px;\n font-size: 12px;\n cursor: pointer;\n}\n.settings-account-display-controls button:hover {\n color: var(--settings-text);\n}\n.settings-account-display-controls button[aria-pressed="true"] {\n color: var(--settings-text);\n background: var(--settings-active);\n}\n\n.settings-account-list {\n --account-border: light-dark(#e2e2e8, #36363b);\n --account-muted: light-dark(#676773, #a5a5af);\n border: 1px solid var(--account-border);\n border-radius: 11px;\n overflow: hidden;\n container-type: inline-size;\n}\n.settings-account-table {\n width: 100%;\n table-layout: fixed;\n border-collapse: collapse;\n font-size: 12px;\n}\n.settings-account-table th {\n padding: 13px 20px;\n color: var(--account-muted);\n background: light-dark(#f8f8fa, #202024);\n font-size: 11px;\n font-weight: 500;\n text-align: left;\n}\n.settings-account-table th:nth-child(1) {\n width: 32%;\n}\n.settings-account-table th:nth-child(2) {\n width: 38%;\n}\n.settings-account-table th:nth-child(3) {\n width: 12%;\n}\n.settings-account-table th:nth-child(4) {\n width: 18%;\n text-align: right;\n}\n.settings-account-table td {\n padding: 19px 20px;\n vertical-align: middle;\n border-top: 1px solid var(--settings-divider);\n}\n.settings-account-row {\n background: light-dark(#ffffff, #232326);\n}\n.settings-account-row:hover {\n background: light-dark(#f7f7fa, #26262a);\n}\n.settings-account-row__person {\n display: grid;\n grid-template-columns: 34px minmax(0, 1fr);\n align-items: center;\n gap: 11px;\n min-width: 0;\n}\n.settings-account-row__mark {\n display: grid;\n place-items: center;\n width: 34px;\n height: 34px;\n color: light-dark(#67558d, #c3baff);\n background: light-dark(#f0ecf7, #353044);\n border: 1px solid light-dark(#d9d0e6, #4d435f);\n border-radius: 10px;\n}\n.settings-account-row__identity {\n min-width: 0;\n}\n.settings-account-title {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n}\n.settings-account-email {\n min-width: 0;\n overflow: hidden;\n font-size: 13px;\n font-weight: 550;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.settings-account-metadata {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 7px;\n margin-top: 4px;\n color: var(--settings-muted);\n}\n.settings-account-domain {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.settings-account-plan-separator {\n flex: none;\n}\n.settings-account-plan {\n flex: none;\n padding: 1px 6px;\n color: var(--settings-muted);\n border: 1px solid var(--settings-border);\n border-radius: 5px;\n font-size: 11px;\n white-space: nowrap;\n}\n.settings-account-plan--highlighted {\n color: light-dark(#654f91, #c8bfff);\n background: light-dark(#f2edf9, #a99bff18);\n border-color: light-dark(#d9ccea, #a99bff52);\n font-weight: 600;\n}\n.settings-account-active {\n flex: none;\n padding: 2px 7px;\n color: light-dark(#66548e, #bdb4ff);\n background: light-dark(#f4f0fb, #aca0ff12);\n border: 1px solid light-dark(#dfd5f1, #aca0ff24);\n border-radius: 5px;\n font-size: 11px;\n white-space: nowrap;\n}\n\n.settings-account-usage {\n display: grid;\n gap: 14px;\n max-width: 380px;\n}\n.settings-account-usage__meter {\n display: grid;\n grid-template-columns: 48px minmax(36px, 1fr) 96px;\n align-items: center;\n gap: 3px 10px;\n}\n:host([lang="zh-CN"]) .settings-account-usage__meter {\n grid-template-columns: 48px minmax(36px, 1fr) 72px;\n}\n\n.settings-account-usage__title {\n color: light-dark(#5d5d68, #c3c3cd);\n font-size: 12px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.settings-account-usage__percent {\n display: flex;\n align-items: baseline;\n justify-content: flex-end;\n gap: 4px;\n font-size: 14px;\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n}\n.settings-account-usage__value-label {\n color: var(--settings-muted);\n font-size: 11px;\n font-weight: 400;\n}\n.settings-account-usage__percent--warn {\n color: var(--settings-warning);\n}\n.settings-account-usage__percent--hot {\n color: var(--settings-danger);\n}\n.settings-account-usage__bar {\n height: 4px;\n overflow: hidden;\n background: light-dark(#e3e1e8, #3c3c43);\n border-radius: 4px;\n}\n.settings-account-usage__bar > span {\n display: block;\n height: 100%;\n background: light-dark(#81769e, #9993b8);\n border-radius: inherit;\n}\n.settings-account-usage__bar--warn > span {\n background: var(--settings-warning);\n}\n.settings-account-usage__bar--hot > span {\n background: var(--settings-danger);\n}\n.settings-account-usage__sub {\n grid-column: 2 / -1;\n color: var(--account-muted);\n font-size: 11px;\n font-variant-numeric: tabular-nums;\n overflow-wrap: anywhere;\n}\n.settings-account-usage__message,\n.settings-account-unknown {\n color: var(--settings-muted);\n}\n.settings-account-usage > button {\n justify-self: start;\n}\n.settings-account-actions {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n gap: 4px;\n flex-wrap: wrap;\n}\n.settings-account-action {\n padding: 8px 10px;\n min-height: 36px;\n font-size: 12px;\n color: var(--settings-text);\n background: transparent;\n border: 1px solid transparent;\n border-radius: 7px;\n white-space: nowrap;\n cursor: pointer;\n}\n.settings-account-action:hover {\n background: var(--settings-hover);\n}\n.settings-account-action:disabled {\n opacity: 0.45;\n cursor: not-allowed;\n}\n.settings-account-actions .settings-account-delete {\n color: var(--settings-muted);\n}\n.settings-account-actions .settings-account-delete:hover,\n.settings-account-actions .settings-account-delete:focus-visible {\n color: var(--settings-danger);\n background: var(--settings-danger-bg);\n}\n.settings-account-mobile-label {\n display: none;\n}\n.settings-account-reset-summary {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n min-height: 32px;\n padding: 3px 0;\n font-size: 12px;\n white-space: nowrap;\n color: var(--settings-text);\n background: transparent;\n border: 0;\n border-radius: 5px;\n cursor: pointer;\n}\n.settings-account-reset-summary:hover {\n background: var(--settings-hover);\n}\n.settings-account-reset-summary[aria-expanded="true"] > svg:last-child {\n transform: rotate(90deg);\n}\n.settings-account-details-row > td {\n background: var(--settings-inset);\n}\n.settings-account-reset-details {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 16px;\n flex-wrap: wrap;\n}\n.settings-account-reset-details strong {\n font-size: 12px;\n}\n.settings-account-reset-expiry {\n margin: 6px 0;\n color: var(--settings-muted);\n font-size: 11px;\n}\n.settings-account-reset-expiry.is-warn {\n color: var(--settings-warning);\n}\n.settings-account-reset-expiry.is-hot {\n color: var(--settings-danger);\n}\n.settings-account-reset-list {\n margin: 8px 0 0;\n padding: 0;\n list-style: none;\n color: var(--settings-muted);\n font-size: 11px;\n}\n.settings-account-reset-list li + li {\n margin-top: 4px;\n}\n.settings-account-empty {\n text-align: center;\n color: var(--settings-muted);\n}\n.settings-account-verification {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n color: var(--settings-muted);\n}\n.settings-account-verification a {\n color: var(--settings-focus);\n overflow-wrap: anywhere;\n}\n.settings-account-verification code {\n padding: 5px 8px;\n color: var(--settings-text);\n font-size: 15px;\n font-weight: 600;\n letter-spacing: 0.08em;\n background: var(--settings-inset);\n border-radius: 6px;\n}\n.settings-account-list :focus-visible,\n.settings-account-toolbar :focus-visible,\n.settings-account-help-button:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: -2px;\n}\n\n@container (min-width: 611px) and (max-width: 800px) {\n .settings-account-table th,\n .settings-account-table td {\n padding-left: 12px;\n padding-right: 12px;\n }\n .settings-account-table th:nth-child(1) {\n width: 30%;\n }\n .settings-account-table th:nth-child(2) {\n width: 37%;\n }\n .settings-account-table th:nth-child(4) {\n width: 21%;\n }\n}\n\n@container (max-width: 610px) {\n .settings-account-table,\n .settings-account-table tbody {\n display: block;\n }\n .settings-account-table thead {\n display: none;\n }\n .settings-account-row {\n display: grid;\n grid-template-columns: 1fr 1fr;\n padding: 16px;\n gap: 12px;\n border-bottom: 1px solid var(--settings-divider);\n }\n .settings-account-table .settings-account-row > td {\n padding: 0;\n border: 0;\n }\n .settings-account-row > td:nth-child(1),\n .settings-account-row > td:nth-child(2) {\n grid-column: 1 / -1;\n }\n .settings-account-row > td:nth-child(3) {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n .settings-account-mobile-label {\n display: inline;\n color: var(--settings-muted);\n font-size: 11px;\n }\n .settings-account-usage {\n max-width: none;\n }\n .settings-account-table tr:not(.settings-account-row),\n .settings-account-table tr:not(.settings-account-row) > td {\n display: block;\n }\n}\n\n@media (forced-colors: active) {\n .settings-account-usage__bar {\n border: 1px solid CanvasText;\n }\n .settings-account-usage__bar > span {\n background: Highlight;\n }\n}\n';
@@ -30498,10 +31147,10 @@ ${logoCss}${polaroidCss}
30498
31147
  var skin_market_default = '.skin-market__intro {\n max-width: 680px;\n margin: -8px 0 18px;\n color: var(--settings-muted);\n font-size: 13px;\n}\n\n.skin-safety-note {\n display: grid;\n grid-template-columns: 18px minmax(0, 1fr);\n align-items: start;\n gap: 10px;\n margin: 0 0 22px;\n padding: 12px 14px;\n color: var(--settings-muted);\n background: var(--settings-inset);\n border: 1px solid var(--settings-border);\n border-radius: 10px;\n}\n\n.skin-safety-note > span,\n.skin-safety-note strong {\n display: block;\n}\n\n.skin-safety-note strong {\n margin-bottom: 2px;\n color: var(--settings-text);\n font-weight: 600;\n}\n\n.skin-market-grid {\n display: grid;\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: 13px;\n}\n\n.skin-card {\n overflow: hidden;\n position: relative;\n min-width: 0;\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 12px;\n}\n\n.skin-card[data-selected] {\n border-color: color-mix(in srgb, var(--settings-focus) 62%, var(--settings-border));\n box-shadow: inset 3px 0 0 var(--settings-focus);\n}\n\n.skin-preview {\n position: relative;\n height: 128px;\n overflow: hidden;\n border-bottom: 1px solid rgb(255 255 255 / 10%);\n}\n\n.skin-preview::after {\n content: "";\n position: absolute;\n inset: 0;\n background: linear-gradient(180deg, rgb(255 255 255 / 8%), transparent 36%);\n pointer-events: none;\n}\n\n.skin-preview__dots {\n position: absolute;\n top: 11px;\n left: 12px;\n width: 5px;\n height: 5px;\n border-radius: 50%;\n background: rgb(255 255 255 / 70%);\n box-shadow: 9px 0 rgb(255 255 255 / 42%), 18px 0 rgb(255 255 255 / 24%);\n}\n\n.skin-preview__sidebar,\n.skin-preview__conversation,\n.skin-preview__composer {\n position: absolute;\n background: rgb(5 10 16 / 48%);\n border: 1px solid rgb(255 255 255 / 14%);\n backdrop-filter: blur(8px);\n}\n\n.skin-preview__sidebar {\n inset: 27px auto 10px 10px;\n width: 26%;\n border-radius: 6px;\n}\n\n.skin-preview__conversation {\n inset: 27px 10px 42px 31%;\n border-radius: 7px;\n}\n\n.skin-preview__conversation::before,\n.skin-preview__conversation::after {\n content: "";\n position: absolute;\n left: 12px;\n height: 5px;\n border-radius: 3px;\n background: rgb(255 255 255 / 48%);\n}\n\n.skin-preview__conversation::before {\n top: 14px;\n width: 56%;\n}\n\n.skin-preview__conversation::after {\n top: 27px;\n width: 38%;\n opacity: 0.55;\n}\n\n.skin-preview__composer {\n right: 10px;\n bottom: 10px;\n left: 31%;\n height: 24px;\n border-radius: 8px;\n}\n\n.skin-card__body {\n padding: 14px;\n}\n\n.skin-card__title-row,\n.skin-card__footer {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.skin-card__title {\n font-size: 14px;\n font-weight: 600;\n}\n\n.skin-card__current {\n margin-left: auto;\n color: var(--settings-success);\n font-size: 11px;\n font-weight: 600;\n}\n\n.skin-card__description {\n min-height: 38px;\n margin: 7px 0 13px;\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 1.55;\n}\n\n.skin-card__description a {\n color: inherit;\n text-decoration: underline;\n text-decoration-color: var(--settings-border);\n text-underline-offset: 3px;\n}\n\n.skin-card__description a:hover {\n color: var(--settings-text);\n}\n\n.skin-card__palette {\n display: flex;\n align-items: center;\n}\n\n.skin-card__palette i {\n width: 18px;\n height: 18px;\n margin-left: -4px;\n border: 2px solid var(--settings-panel);\n border-radius: 50%;\n}\n\n.skin-card__palette i:first-child {\n margin-left: 0;\n}\n\n.skin-card__apply {\n margin-left: auto;\n}\n\n.skin-card__apply:disabled {\n color: var(--settings-muted);\n background: var(--settings-surface);\n cursor: default;\n}\n\n@media (max-width: 900px) {\n .skin-market-grid {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n}\n\n@media (max-width: 620px) {\n .skin-market-grid {\n grid-template-columns: 1fr;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .skin-card,\n .skin-card * {\n transition: none !important;\n }\n}\n';
30499
31148
 
30500
31149
  // src/native-ui/renderer-extension/src/settings/pet-market.css
30501
- var pet_market_default = '.pet-market__intro {\n margin: 0 0 16px;\n font-size: 13px;\n line-height: 1.5;\n color: var(--text-secondary, rgba(255, 255, 255, 0.65));\n}\n\n.pet-safety-note {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n padding: 10px 14px;\n margin-bottom: 20px;\n border-radius: 8px;\n background: var(--bg-secondary, rgba(255, 255, 255, 0.04));\n border: 1px solid var(--border-subtle, rgba(255, 255, 255, 0.08));\n font-size: 12px;\n line-height: 1.4;\n color: var(--text-secondary, rgba(255, 255, 255, 0.7));\n}\n\n.pet-safety-note strong {\n display: block;\n font-size: 12px;\n font-weight: 600;\n color: var(--text-primary, #ffffff);\n margin-bottom: 2px;\n}\n\n.pet-safety-note svg {\n flex-shrink: 0;\n color: var(--accent, #10a37f);\n margin-top: 1px;\n}\n\n.pet-market__toolbar {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n margin-bottom: 18px;\n}\n\n.pet-market__tabs {\n display: flex;\n align-items: center;\n gap: 6px;\n background: var(--bg-secondary, rgba(255, 255, 255, 0.04));\n padding: 3px;\n border-radius: 8px;\n border: 1px solid var(--border-subtle, rgba(255, 255, 255, 0.08));\n}\n\n.pet-market__tab {\n appearance: none;\n background: transparent;\n border: none;\n color: var(--text-secondary, rgba(255, 255, 255, 0.6));\n padding: 5px 12px;\n border-radius: 6px;\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s, color 0.15s;\n}\n\n.pet-market__tab:hover {\n color: var(--text-primary, #ffffff);\n background: rgba(255, 255, 255, 0.05);\n}\n\n.pet-market__tab[data-active="true"] {\n background: var(--bg-tertiary, rgba(255, 255, 255, 0.12));\n color: var(--text-primary, #ffffff);\n font-weight: 600;\n}\n\n.pet-market__search-wrap {\n position: relative;\n min-width: 200px;\n flex: 1;\n max-width: 280px;\n}\n\n.pet-market__search-wrap svg {\n position: absolute;\n left: 10px;\n top: 50%;\n transform: translateY(-50%);\n pointer-events: none;\n color: var(--text-tertiary, rgba(255, 255, 255, 0.4));\n}\n\n.pet-market__search {\n width: 100%;\n padding: 6px 12px 6px 32px;\n border-radius: 6px;\n background: var(--bg-secondary, rgba(255, 255, 255, 0.05));\n border: 1px solid var(--border-subtle, rgba(255, 255, 255, 0.1));\n color: var(--text-primary, #ffffff);\n font-size: 12px;\n outline: none;\n transition: border-color 0.15s;\n}\n\n.pet-market__search:focus {\n border-color: var(--accent, #10a37f);\n}\n\n.pet-market-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 16px;\n}\n\n.pet-card {\n display: flex;\n flex-direction: column;\n background: var(--bg-secondary, rgba(255, 255, 255, 0.03));\n border: 1px solid var(--border-subtle, rgba(255, 255, 255, 0.08));\n border-radius: 10px;\n overflow: hidden;\n transition: border-color 0.2s, box-shadow 0.2s;\n}\n\n.pet-card:hover {\n border-color: var(--border-strong, rgba(255, 255, 255, 0.18));\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);\n}\n\n.pet-card[data-installed="true"] {\n border-color: rgba(16, 163, 127, 0.35);\n}\n\n.pet-card__stage {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n height: 140px;\n background: radial-gradient(circle at center, rgba(255, 255, 255, 0.06) 0%, rgba(255, 255, 255, 0.01) 70%);\n border-bottom: 1px solid var(--border-subtle, rgba(255, 255, 255, 0.06));\n overflow: hidden;\n user-select: none;\n}\n\n.pet-card__sprite {\n width: 96px;\n height: 104px;\n background-repeat: no-repeat;\n image-rendering: pixelated;\n image-rendering: -webkit-optimize-contrast;\n transition: transform 0.2s;\n}\n\n.pet-card:hover .pet-card__sprite {\n transform: scale(1.08);\n}\n\n.pet-card__body {\n display: flex;\n flex-direction: column;\n flex: 1;\n padding: 14px;\n}\n\n.pet-card__header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 8px;\n margin-bottom: 6px;\n}\n\n.pet-card__title {\n font-size: 14px;\n font-weight: 600;\n color: var(--text-primary, #ffffff);\n}\n\n.pet-card__badges {\n display: flex;\n align-items: center;\n gap: 4px;\n flex-shrink: 0;\n}\n\n.pet-card__badge {\n display: inline-flex;\n align-items: center;\n gap: 3px;\n font-size: 10.5px;\n padding: 2px 6px;\n border-radius: 4px;\n font-weight: 500;\n}\n\n.pet-card__badge--official {\n background: rgba(59, 130, 246, 0.15);\n color: #60a5fa;\n border: 1px solid rgba(59, 130, 246, 0.3);\n}\n\n.pet-card__badge--community {\n background: rgba(168, 85, 247, 0.15);\n color: #c084fc;\n border: 1px solid rgba(168, 85, 247, 0.3);\n}\n\n.pet-card__badge--installed {\n background: rgba(16, 163, 127, 0.15);\n color: #10a37f;\n border: 1px solid rgba(16, 163, 127, 0.3);\n}\n\n.pet-card__description {\n margin: 0 0 14px;\n font-size: 12px;\n line-height: 1.45;\n color: var(--text-secondary, rgba(255, 255, 255, 0.6));\n flex: 1;\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.pet-card__footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n margin-top: auto;\n padding-top: 10px;\n border-top: 1px solid var(--border-subtle, rgba(255, 255, 255, 0.05));\n}\n\n.pet-card__dir-hint {\n font-size: 11px;\n color: var(--text-tertiary, rgba(255, 255, 255, 0.4));\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.pet-card__actions {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-left: auto;\n}\n\n.pet-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n font-size: 12px;\n font-weight: 500;\n padding: 5px 12px;\n border-radius: 6px;\n border: 1px solid transparent;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.pet-btn--primary {\n background: var(--accent, #10a37f);\n color: #ffffff;\n}\n\n.pet-btn--primary:hover:not(:disabled) {\n filter: brightness(1.1);\n}\n\n.pet-btn--secondary {\n background: var(--bg-tertiary, rgba(255, 255, 255, 0.08));\n border-color: var(--border-subtle, rgba(255, 255, 255, 0.1));\n color: var(--text-secondary, rgba(255, 255, 255, 0.75));\n}\n\n.pet-btn--secondary:hover:not(:disabled) {\n background: rgba(255, 255, 255, 0.12);\n color: var(--text-primary, #ffffff);\n}\n\n.pet-btn--danger {\n background: transparent;\n border-color: rgba(239, 68, 68, 0.25);\n color: #f87171;\n}\n\n.pet-btn--danger:hover:not(:disabled) {\n background: rgba(239, 68, 68, 0.12);\n border-color: rgba(239, 68, 68, 0.5);\n}\n\n.pet-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.pet-market__empty {\n grid-column: 1 / -1;\n text-align: center;\n padding: 40px 20px;\n color: var(--text-tertiary, rgba(255, 255, 255, 0.45));\n font-size: 13px;\n}\n';
31150
+ var pet_market_default = '.pet-market__intro {\n margin: 0 0 16px;\n font-size: 13px;\n line-height: 1.5;\n color: var(--text-secondary, rgba(255, 255, 255, 0.65));\n}\n\n.pet-safety-note {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n padding: 10px 14px;\n margin-bottom: 20px;\n border-radius: 8px;\n background: var(--bg-secondary, rgba(255, 255, 255, 0.04));\n border: 1px solid var(--border-subtle, rgba(255, 255, 255, 0.08));\n font-size: 12px;\n line-height: 1.4;\n color: var(--text-secondary, rgba(255, 255, 255, 0.7));\n}\n\n.pet-safety-note strong {\n display: block;\n font-size: 12px;\n font-weight: 600;\n color: var(--text-primary, #ffffff);\n margin-bottom: 2px;\n}\n\n.pet-safety-note svg {\n flex-shrink: 0;\n color: var(--accent, #10a37f);\n margin-top: 1px;\n}\n\n.pet-market__toolbar {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n margin-bottom: 18px;\n}\n\n.pet-market__tabs {\n display: flex;\n align-items: center;\n gap: 6px;\n background: var(--bg-secondary, rgba(255, 255, 255, 0.04));\n padding: 3px;\n border-radius: 8px;\n border: 1px solid var(--border-subtle, rgba(255, 255, 255, 0.08));\n}\n\n.pet-market__tab {\n appearance: none;\n background: transparent;\n border: none;\n color: var(--text-secondary, rgba(255, 255, 255, 0.6));\n padding: 5px 12px;\n border-radius: 6px;\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s, color 0.15s;\n}\n\n.pet-market__tab:hover {\n color: var(--text-primary, #ffffff);\n background: rgba(255, 255, 255, 0.05);\n}\n\n.pet-market__tab[data-active="true"] {\n background: var(--bg-tertiary, rgba(255, 255, 255, 0.12));\n color: var(--text-primary, #ffffff);\n font-weight: 600;\n}\n\n.pet-market__search-wrap {\n position: relative;\n min-width: 200px;\n flex: 1;\n max-width: 280px;\n}\n\n.pet-market__search-wrap svg {\n position: absolute;\n left: 10px;\n top: 50%;\n transform: translateY(-50%);\n pointer-events: none;\n color: var(--text-tertiary, rgba(255, 255, 255, 0.4));\n}\n\n.pet-market__search {\n width: 100%;\n padding: 6px 12px 6px 32px;\n border-radius: 6px;\n background: var(--bg-secondary, rgba(255, 255, 255, 0.05));\n border: 1px solid var(--border-subtle, rgba(255, 255, 255, 0.1));\n color: var(--text-primary, #ffffff);\n font-size: 12px;\n outline: none;\n transition: border-color 0.15s;\n}\n\n.pet-market__search:focus {\n border-color: var(--accent, #10a37f);\n}\n\n.pet-market-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 16px;\n}\n\n.pet-card {\n display: flex;\n flex-direction: column;\n background: var(--bg-secondary, rgba(255, 255, 255, 0.03));\n border: 1px solid var(--border-subtle, rgba(255, 255, 255, 0.08));\n border-radius: 10px;\n overflow: hidden;\n transition: border-color 0.2s, box-shadow 0.2s;\n}\n\n.pet-card:hover {\n border-color: var(--border-strong, rgba(255, 255, 255, 0.18));\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);\n}\n\n.pet-card[data-installed="true"] {\n border-color: rgba(16, 163, 127, 0.35);\n}\n\n.pet-card[data-state="installing"] .pet-card__stage,\n.pet-card[data-state="uninstalling"] .pet-card__stage {\n opacity: 0.55;\n}\n\n.pet-card[data-state="failed"] {\n border-color: rgba(239, 68, 68, 0.35);\n}\n\n.pet-card__stage {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n height: 140px;\n background: radial-gradient(circle at center, rgba(255, 255, 255, 0.06) 0%, rgba(255, 255, 255, 0.01) 70%);\n border-bottom: 1px solid var(--border-subtle, rgba(255, 255, 255, 0.06));\n overflow: hidden;\n user-select: none;\n}\n\n.pet-card__sprite {\n width: 96px;\n height: 104px;\n background-repeat: no-repeat;\n image-rendering: pixelated;\n image-rendering: -webkit-optimize-contrast;\n transition: transform 0.2s;\n}\n\n.pet-card:hover .pet-card__sprite {\n transform: scale(1.08);\n}\n\n.pet-card__body {\n display: flex;\n flex-direction: column;\n flex: 1;\n padding: 14px;\n}\n\n.pet-card__header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 8px;\n margin-bottom: 6px;\n}\n\n.pet-card__title {\n font-size: 14px;\n font-weight: 600;\n color: var(--text-primary, #ffffff);\n}\n\n.pet-card__badges {\n display: flex;\n align-items: center;\n gap: 4px;\n flex-shrink: 0;\n}\n\n.pet-card__badge {\n display: inline-flex;\n align-items: center;\n gap: 3px;\n font-size: 10.5px;\n padding: 2px 6px;\n border-radius: 4px;\n font-weight: 500;\n}\n\n.pet-card__badge--official {\n background: rgba(59, 130, 246, 0.15);\n color: #60a5fa;\n border: 1px solid rgba(59, 130, 246, 0.3);\n}\n\n.pet-card__badge--community {\n background: rgba(168, 85, 247, 0.15);\n color: #c084fc;\n border: 1px solid rgba(168, 85, 247, 0.3);\n}\n\n.pet-card__badge--installed {\n background: rgba(16, 163, 127, 0.15);\n color: #10a37f;\n border: 1px solid rgba(16, 163, 127, 0.3);\n}\n\n.pet-card__badge--failed {\n background: rgba(239, 68, 68, 0.15);\n color: #f87171;\n border: 1px solid rgba(239, 68, 68, 0.3);\n}\n\n.pet-card__status {\n margin: 0 0 10px;\n font-size: 11.5px;\n color: var(--text-secondary, rgba(255, 255, 255, 0.6));\n}\n\n.pet-card__error {\n margin: 0 0 10px;\n padding: 6px 8px;\n border-radius: 6px;\n background: rgba(239, 68, 68, 0.08);\n border: 1px solid rgba(239, 68, 68, 0.25);\n color: #f87171;\n font-size: 11.5px;\n line-height: 1.4;\n word-break: break-word;\n}\n\n.pet-card__description {\n margin: 0 0 14px;\n font-size: 12px;\n line-height: 1.45;\n color: var(--text-secondary, rgba(255, 255, 255, 0.6));\n flex: 1;\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.pet-card__footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n margin-top: auto;\n padding-top: 10px;\n border-top: 1px solid var(--border-subtle, rgba(255, 255, 255, 0.05));\n}\n\n.pet-card__dir-hint {\n font-size: 11px;\n color: var(--text-tertiary, rgba(255, 255, 255, 0.4));\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.pet-card__actions {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-left: auto;\n}\n\n.pet-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n font-size: 12px;\n font-weight: 500;\n padding: 5px 12px;\n border-radius: 6px;\n border: 1px solid transparent;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.pet-btn--primary {\n background: var(--accent, #10a37f);\n color: #ffffff;\n}\n\n.pet-btn--primary:hover:not(:disabled) {\n filter: brightness(1.1);\n}\n\n.pet-btn--secondary {\n background: var(--bg-tertiary, rgba(255, 255, 255, 0.08));\n border-color: var(--border-subtle, rgba(255, 255, 255, 0.1));\n color: var(--text-secondary, rgba(255, 255, 255, 0.75));\n}\n\n.pet-btn--secondary:hover:not(:disabled) {\n background: rgba(255, 255, 255, 0.12);\n color: var(--text-primary, #ffffff);\n}\n\n.pet-btn--danger {\n background: transparent;\n border-color: rgba(239, 68, 68, 0.25);\n color: #f87171;\n}\n\n.pet-btn--danger:hover:not(:disabled) {\n background: rgba(239, 68, 68, 0.12);\n border-color: rgba(239, 68, 68, 0.5);\n}\n\n.pet-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.pet-market__empty {\n grid-column: 1 / -1;\n text-align: center;\n padding: 40px 20px;\n color: var(--text-tertiary, rgba(255, 255, 255, 0.45));\n font-size: 13px;\n}\n';
30502
31151
 
30503
31152
  // src/native-ui/renderer-extension/src/settings/shell.ts
30504
- var SETTINGS_SHELL_ATTRIBUTE = "data-codexhost-settings-shell";
31153
+ var SETTINGS_SHELL_ATTRIBUTE = "data-harnessmix-settings-shell";
30505
31154
  var RENDERER_SETTINGS_COLOR_SCHEME = "inherit";
30506
31155
  function isRendererSettingsDialogSupported(dialog) {
30507
31156
  return typeof dialog.showModal === "function" && typeof dialog.close === "function";
@@ -30516,7 +31165,7 @@ ${logoCss}${polaroidCss}
30516
31165
  const resolvedRegistry = registry2 ?? createDefaultRendererSettingsRegistry(messages);
30517
31166
  if (!ownerDocument.body) throw new Error("Renderer document body is unavailable");
30518
31167
  if (ownerDocument.querySelector(`[${SETTINGS_SHELL_ATTRIBUTE}]`)) {
30519
- throw new Error("A codexhost settings shell is already mounted");
31168
+ throw new Error("A harnessmix settings shell is already mounted");
30520
31169
  }
30521
31170
  const root = ownerDocument.createElement("div");
30522
31171
  root.setAttribute(SETTINGS_SHELL_ATTRIBUTE, "v1");
@@ -30529,7 +31178,7 @@ ${accounts_default}
30529
31178
  ${skin_market_default}
30530
31179
  ${pet_market_default}`;
30531
31180
  const dialog = ownerDocument.createElement("dialog");
30532
- dialog.className = "codexhost-settings-dialog";
31181
+ dialog.className = "harnessmix-settings-dialog";
30533
31182
  const frame = ownerDocument.createElement("div");
30534
31183
  frame.className = "settings-frame";
30535
31184
  const header = ownerDocument.createElement("header");
@@ -30546,7 +31195,7 @@ ${pet_market_default}`;
30546
31195
  brandName.textContent = "Harness Mix";
30547
31196
  const brandTitle = ownerDocument.createElement("span");
30548
31197
  brandTitle.className = "settings-brand__title";
30549
- brandTitle.id = "codexhost-settings-dialog-title";
31198
+ brandTitle.id = "harnessmix-settings-dialog-title";
30550
31199
  brandTitle.textContent = messages.title;
30551
31200
  brandCopy.append(brandName, brandTitle);
30552
31201
  brand.append(brandMark, brandCopy);
@@ -30650,7 +31299,7 @@ ${pet_market_default}`;
30650
31299
  }
30651
31300
  const starLink = ownerDocument.createElement("a");
30652
31301
  starLink.className = "settings-nav-button settings-nav-star-link";
30653
- starLink.href = CODEXHOST_GITHUB_REPOSITORY_URL;
31302
+ starLink.href = HARNESSMIX_GITHUB_REPOSITORY_URL;
30654
31303
  starLink.target = "_blank";
30655
31304
  starLink.rel = "noopener noreferrer";
30656
31305
  starLink.setAttribute("aria-label", messages.starOnGitHub);
@@ -30741,24 +31390,24 @@ ${pet_market_default}`;
30741
31390
  const registry2 = definitions ? createRendererSettingsPageRegistry(definitions) : createDefaultRendererSettingsRegistry(messages);
30742
31391
  const ownerWindow = ownerDocument.defaultView ?? (typeof window !== "undefined" ? window : void 0);
30743
31392
  if (ownerWindow) {
30744
- ownerWindow.__codexhostSettingsShellV1?.dispose();
31393
+ ownerWindow.__harnessmixSettingsShellV1?.dispose();
30745
31394
  }
30746
31395
  const shell = mountRendererSettingsShell(registry2, ownerDocument, messages);
30747
31396
  if (ownerWindow) {
30748
- ownerWindow.__codexhostSettingsShellV1 = shell;
31397
+ ownerWindow.__harnessmixSettingsShellV1 = shell;
30749
31398
  }
30750
31399
  const dispose = shell.dispose.bind(shell);
30751
31400
  shell.dispose = () => {
30752
31401
  dispose();
30753
- if (ownerWindow && ownerWindow.__codexhostSettingsShellV1 === shell) {
30754
- delete ownerWindow.__codexhostSettingsShellV1;
31402
+ if (ownerWindow && ownerWindow.__harnessmixSettingsShellV1 === shell) {
31403
+ delete ownerWindow.__harnessmixSettingsShellV1;
30755
31404
  }
30756
31405
  };
30757
31406
  return shell;
30758
31407
  }
30759
31408
 
30760
31409
  // src/native-ui/renderer-extension/src/settings/trigger.ts
30761
- var SETTINGS_TRIGGER_ATTRIBUTE = "data-codexhost-settings-trigger";
31410
+ var SETTINGS_TRIGGER_ATTRIBUTE = "data-harnessmix-settings-trigger";
30762
31411
  var SETTINGS_APPLICATION_HEADER_SELECTOR = 'header[data-pip-obstacle="app-shell-header"]';
30763
31412
  var SETTINGS_HEADER_SLOT_SELECTOR = ':scope > [data-test-id="header-shell-slot"]';
30764
31413
  function measuredBounds(element) {
@@ -31437,7 +32086,7 @@ ${pet_market_default}`;
31437
32086
  return normalized;
31438
32087
  }
31439
32088
  function installRendererBindingProbe(options = {}) {
31440
- const existing = window.__codexhostRendererBindingProbeV1;
32089
+ const existing = window.__harnessmixRendererBindingProbeV1;
31441
32090
  if (existing) return existing;
31442
32091
  const enabledAgents = [...new Set(options.enabledAgents ?? DEFAULT_RENDERER_AGENTS)];
31443
32092
  const enabledAgentSet = new Set(enabledAgents);
@@ -31511,6 +32160,25 @@ ${pet_market_default}`;
31511
32160
  return client?.applyThreadWorkspace?.({ threadId, digest }) ?? { patch: "", digest: "" };
31512
32161
  }
31513
32162
  });
32163
+ const teamCards = installTeamCards({
32164
+ inspectTeam: async (threadId, teamId) => {
32165
+ const client = modelClientForHost("local");
32166
+ return client?.inspectThreadTeam?.({ threadId, ...teamId ? { teamId } : {} }) ?? null;
32167
+ },
32168
+ openThread: (threadId) => openRendererThread(hostThreadIdSchema.parse(threadId), { hostId: "local" }),
32169
+ activeThread: () => {
32170
+ const mounted = [...mountedByComposer.values()].find((candidate) => {
32171
+ if (!candidate.composer.isConnected || !candidate.control.root.isConnected) return false;
32172
+ if (!threadIdFromComposerModelTarget(candidate.modelTarget)) return false;
32173
+ const style = window.getComputedStyle(candidate.composer);
32174
+ return style.display !== "none" && style.visibility !== "hidden" && candidate.composer.getClientRects().length > 0;
32175
+ });
32176
+ const threadId = mounted ? threadIdFromComposerModelTarget(mounted.modelTarget) : null;
32177
+ const scroll = mounted?.composer.closest(".thread-scroll-container");
32178
+ const content = scroll?.parentElement?.parentElement;
32179
+ return mounted && threadId ? { threadId, anchor: content ?? mounted.composer } : null;
32180
+ }
32181
+ });
31514
32182
  let connectionDiagnostics = null;
31515
32183
  const settingsLifecycle = installRendererSettingsLifecycle(window, {
31516
32184
  getUpdateClient: () => modelControl,
@@ -31636,7 +32304,7 @@ ${pet_market_default}`;
31636
32304
  }
31637
32305
  }
31638
32306
  window.dispatchEvent(
31639
- new CustomEvent("codexhost:renderer-submission", {
32307
+ new CustomEvent("harnessmix:renderer-submission", {
31640
32308
  detail: {
31641
32309
  composerId: state.composerId,
31642
32310
  agent: state.agent,
@@ -31702,7 +32370,7 @@ ${pet_market_default}`;
31702
32370
  await modelControl.executeThreadCommand({ threadId, commandId: command.id });
31703
32371
  } catch (error51) {
31704
32372
  console.error(
31705
- "codexhost Harness command failed",
32373
+ "harnessmix Harness command failed",
31706
32374
  error51 instanceof Error ? error51.message : String(error51)
31707
32375
  );
31708
32376
  } finally {
@@ -31719,7 +32387,7 @@ ${pet_market_default}`;
31719
32387
  })) {
31720
32388
  return;
31721
32389
  }
31722
- console.error("codexhost Harness command could not claim the current Composer editor");
32390
+ console.error("harnessmix Harness command could not claim the current Composer editor");
31723
32391
  };
31724
32392
  const applyThreadUsageUpdate = (update) => {
31725
32393
  for (const mounted of mountedByComposer.values()) {
@@ -32631,12 +33299,7 @@ ${pet_market_default}`;
32631
33299
  sidebarAgentIcons.refresh();
32632
33300
  return switched;
32633
33301
  } catch {
32634
- adapterStatus = {
32635
- ...adapterStatus,
32636
- state: "unsupported",
32637
- reason: "draft-prewarm-clear-failed",
32638
- hook: null
32639
- };
33302
+ renderMounted(mounted);
32640
33303
  return false;
32641
33304
  } finally {
32642
33305
  for (const candidate of mountedByComposer.values()) {
@@ -32674,7 +33337,7 @@ ${pet_market_default}`;
32674
33337
  const policy = await waitForRendererDraftPrewarmPolicy(window);
32675
33338
  if (!isCurrent() || policy.hostId !== hostId) return;
32676
33339
  await policy.clear();
32677
- if (!isCurrent() || window.__codexhostDraftPrewarmPolicyV1 !== policy) return;
33340
+ if (!isCurrent() || window.__harnessmixDraftPrewarmPolicyV1 !== policy) return;
32678
33341
  if (!policy.selectAccount) throw new Error("Codex Account selection is unavailable");
32679
33342
  policy.selectAccount(codexAccountRouteOverride(accounts.accounts, accountId));
32680
33343
  accounts.overrideAccountId = accountId === accounts.selection.activeAccountId ? null : accountId;
@@ -33195,7 +33858,7 @@ ${pet_market_default}`;
33195
33858
  composerCodexAccounts(composer)?.accounts ?? [],
33196
33859
  accountId
33197
33860
  );
33198
- const policy = window.__codexhostDraftPrewarmPolicyV1;
33861
+ const policy = window.__harnessmixDraftPrewarmPolicyV1;
33199
33862
  if (override !== null && (policy?.hostId !== mounted.hostId || !policy.selectAccount)) {
33200
33863
  return false;
33201
33864
  }
@@ -33234,6 +33897,7 @@ ${pet_market_default}`;
33234
33897
  blockEvent(event);
33235
33898
  return;
33236
33899
  }
33900
+ harnessMentions.prepareSubmission(composer);
33237
33901
  notifySubmission(composer, "submit");
33238
33902
  };
33239
33903
  const onKeyDown = (event) => {
@@ -33256,6 +33920,7 @@ ${pet_market_default}`;
33256
33920
  blockEvent(event);
33257
33921
  return;
33258
33922
  }
33923
+ harnessMentions.prepareSubmission(composer);
33259
33924
  notifySubmission(composer, "enter");
33260
33925
  };
33261
33926
  const onClick = (event) => {
@@ -33270,6 +33935,7 @@ ${pet_market_default}`;
33270
33935
  blockEvent(event);
33271
33936
  return;
33272
33937
  }
33938
+ harnessMentions.prepareSubmission(composer);
33273
33939
  notifySubmission(composer, "click");
33274
33940
  };
33275
33941
  const mutationObserver = new MutationObserver((mutations) => {
@@ -33332,8 +33998,8 @@ ${pet_market_default}`;
33332
33998
  void refreshHarnessAvailability(true);
33333
33999
  }
33334
34000
  };
33335
- window.addEventListener("codexhost:draft-prewarm-policy-changed", onHostRouteChange);
33336
- window.addEventListener("codexhost:renderer-adapter-status", onAdapterStatus);
34001
+ window.addEventListener("harnessmix:draft-prewarm-policy-changed", onHostRouteChange);
34002
+ window.addEventListener("harnessmix:renderer-adapter-status", onAdapterStatus);
33337
34003
  window.addEventListener("focus", onWindowFocus);
33338
34004
  const connectedComposers = () => [...mountedByComposer.values()].filter(
33339
34005
  (mounted) => mounted.composer.isConnected && mounted.control.root.isConnected
@@ -33439,13 +34105,14 @@ ${pet_market_default}`;
33439
34105
  sidebarAgentIcons.dispose();
33440
34106
  harnessMentions.dispose();
33441
34107
  collabCards.dispose();
34108
+ teamCards.dispose();
33442
34109
  settingsLifecycle.dispose();
33443
34110
  document.removeEventListener("beforeinput", onBeforeInput, true);
33444
34111
  document.removeEventListener("submit", onSubmit, true);
33445
34112
  document.removeEventListener("keydown", onKeyDown, true);
33446
34113
  document.removeEventListener("click", onClick, true);
33447
- window.removeEventListener("codexhost:draft-prewarm-policy-changed", onHostRouteChange);
33448
- window.removeEventListener("codexhost:renderer-adapter-status", onAdapterStatus);
34114
+ window.removeEventListener("harnessmix:draft-prewarm-policy-changed", onHostRouteChange);
34115
+ window.removeEventListener("harnessmix:renderer-adapter-status", onAdapterStatus);
33449
34116
  window.removeEventListener("focus", onWindowFocus);
33450
34117
  for (const state of harnessAvailabilityByHost.values()) {
33451
34118
  state.requestGeneration += 1;
@@ -33463,24 +34130,24 @@ ${pet_market_default}`;
33463
34130
  pendingReplacements.clear();
33464
34131
  connectionListeners.clear();
33465
34132
  connectionDiagnostics = null;
33466
- delete window.__codexhostRendererBindingProbeV1;
34133
+ delete window.__harnessmixRendererBindingProbeV1;
33467
34134
  }
33468
34135
  };
33469
- window.__codexhostRendererBindingProbeV1 = api;
34136
+ window.__harnessmixRendererBindingProbeV1 = api;
33470
34137
  scan();
33471
34138
  return api;
33472
34139
  }
33473
34140
 
33474
34141
  // src/native-ui/renderer-extension/src/install-renderer-binding.ts
33475
34142
  function installRendererBinding(enabledAgents = DEFAULT_RENDERER_AGENTS, defaultAgent = "codex") {
33476
- window.__codexhostRendererBindingProbeV1?.dispose();
34143
+ window.__harnessmixRendererBindingProbeV1?.dispose();
33477
34144
  const binding = installRendererBindingProbe({ enabledAgents, defaultAgent });
33478
34145
  try {
33479
34146
  const adapter = installCurrentRendererAdapter();
33480
34147
  binding.setAdapter(adapter.status, adapter.dispose, adapter.applyAgent, adapter.modelControl);
33481
34148
  } catch (error51) {
33482
34149
  console.error(
33483
- "codexhost Renderer Adapter installation failed",
34150
+ "harnessmix Renderer Adapter installation failed",
33484
34151
  error51 instanceof Error ? error51.name : "UnknownError"
33485
34152
  );
33486
34153
  binding.setAdapter({
@@ -33494,8 +34161,8 @@ ${pet_market_default}`;
33494
34161
  }
33495
34162
 
33496
34163
  // src/native-ui/renderer-extension/src/production-entry.ts
33497
- var configuration = window.__codexhostProductionConfigV1;
33498
- delete window.__codexhostProductionConfigV1;
34164
+ var configuration = window.__harnessmixProductionConfigV1;
34165
+ delete window.__harnessmixProductionConfigV1;
33499
34166
  var install = () => {
33500
34167
  installRendererBinding(DEFAULT_RENDERER_AGENTS, configuration?.defaultAgent ?? "codex");
33501
34168
  };