botmux 3.15.0 → 3.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (780) hide show
  1. package/README.en.md +2 -2
  2. package/README.md +2 -2
  3. package/dist/.runtime-build-id +1 -1
  4. package/dist/adapters/backend/destroy-result.d.ts +159 -0
  5. package/dist/adapters/backend/destroy-result.d.ts.map +1 -0
  6. package/dist/adapters/backend/destroy-result.js +223 -0
  7. package/dist/adapters/backend/destroy-result.js.map +1 -0
  8. package/dist/adapters/backend/herdr-backend.d.ts +4 -0
  9. package/dist/adapters/backend/herdr-backend.d.ts.map +1 -1
  10. package/dist/adapters/backend/herdr-backend.js +23 -1
  11. package/dist/adapters/backend/herdr-backend.js.map +1 -1
  12. package/dist/adapters/backend/mojo-backend.d.ts +577 -0
  13. package/dist/adapters/backend/mojo-backend.d.ts.map +1 -0
  14. package/dist/adapters/backend/mojo-backend.js +2471 -0
  15. package/dist/adapters/backend/mojo-backend.js.map +1 -0
  16. package/dist/adapters/backend/mojo-budgets.d.ts +21 -0
  17. package/dist/adapters/backend/mojo-budgets.d.ts.map +1 -0
  18. package/dist/adapters/backend/mojo-budgets.js +22 -0
  19. package/dist/adapters/backend/mojo-budgets.js.map +1 -0
  20. package/dist/adapters/backend/mojo-isolated-workspace.d.ts +69 -0
  21. package/dist/adapters/backend/mojo-isolated-workspace.d.ts.map +1 -0
  22. package/dist/adapters/backend/mojo-isolated-workspace.js +213 -0
  23. package/dist/adapters/backend/mojo-isolated-workspace.js.map +1 -0
  24. package/dist/adapters/backend/mojo-process-tree.d.ts +292 -0
  25. package/dist/adapters/backend/mojo-process-tree.d.ts.map +1 -0
  26. package/dist/adapters/backend/mojo-process-tree.js +486 -0
  27. package/dist/adapters/backend/mojo-process-tree.js.map +1 -0
  28. package/dist/adapters/backend/mojo-types.d.ts +542 -0
  29. package/dist/adapters/backend/mojo-types.d.ts.map +1 -0
  30. package/dist/adapters/backend/mojo-types.js +682 -0
  31. package/dist/adapters/backend/mojo-types.js.map +1 -0
  32. package/dist/adapters/backend/reproduce-command.js +3 -3
  33. package/dist/adapters/backend/reproduce-command.js.map +1 -1
  34. package/dist/adapters/backend/riff-backend.js +1 -1
  35. package/dist/adapters/backend/riff-backend.js.map +1 -1
  36. package/dist/adapters/backend/sandbox.d.ts +44 -7
  37. package/dist/adapters/backend/sandbox.d.ts.map +1 -1
  38. package/dist/adapters/backend/sandbox.js +30 -7
  39. package/dist/adapters/backend/sandbox.js.map +1 -1
  40. package/dist/adapters/backend/session-backend-selector.d.ts +14 -1
  41. package/dist/adapters/backend/session-backend-selector.d.ts.map +1 -1
  42. package/dist/adapters/backend/session-backend-selector.js +82 -10
  43. package/dist/adapters/backend/session-backend-selector.js.map +1 -1
  44. package/dist/adapters/backend/types.d.ts +101 -6
  45. package/dist/adapters/backend/types.d.ts.map +1 -1
  46. package/dist/adapters/backend/types.js.map +1 -1
  47. package/dist/adapters/backend/zmx-backend.d.ts +11 -0
  48. package/dist/adapters/backend/zmx-backend.d.ts.map +1 -1
  49. package/dist/adapters/backend/zmx-backend.js +16 -1
  50. package/dist/adapters/backend/zmx-backend.js.map +1 -1
  51. package/dist/adapters/cli/codex-app.d.ts.map +1 -1
  52. package/dist/adapters/cli/codex-app.js +2 -2
  53. package/dist/adapters/cli/codex-app.js.map +1 -1
  54. package/dist/adapters/cli/codex.d.ts.map +1 -1
  55. package/dist/adapters/cli/codex.js +7 -0
  56. package/dist/adapters/cli/codex.js.map +1 -1
  57. package/dist/adapters/cli/copilot.d.ts +3 -1
  58. package/dist/adapters/cli/copilot.d.ts.map +1 -1
  59. package/dist/adapters/cli/copilot.js +23 -5
  60. package/dist/adapters/cli/copilot.js.map +1 -1
  61. package/dist/adapters/cli/cursor.d.ts.map +1 -1
  62. package/dist/adapters/cli/cursor.js +13 -3
  63. package/dist/adapters/cli/cursor.js.map +1 -1
  64. package/dist/adapters/cli/grok.d.ts.map +1 -1
  65. package/dist/adapters/cli/grok.js +24 -5
  66. package/dist/adapters/cli/grok.js.map +1 -1
  67. package/dist/adapters/cli/kimi.d.ts.map +1 -1
  68. package/dist/adapters/cli/kimi.js +19 -1
  69. package/dist/adapters/cli/kimi.js.map +1 -1
  70. package/dist/adapters/cli/mojo.d.ts +28 -0
  71. package/dist/adapters/cli/mojo.d.ts.map +1 -0
  72. package/dist/adapters/cli/mojo.js +58 -0
  73. package/dist/adapters/cli/mojo.js.map +1 -0
  74. package/dist/adapters/cli/pi.d.ts +6 -4
  75. package/dist/adapters/cli/pi.d.ts.map +1 -1
  76. package/dist/adapters/cli/pi.js +6 -4
  77. package/dist/adapters/cli/pi.js.map +1 -1
  78. package/dist/adapters/cli/read-isolation.d.ts +251 -1
  79. package/dist/adapters/cli/read-isolation.d.ts.map +1 -1
  80. package/dist/adapters/cli/read-isolation.js +254 -1
  81. package/dist/adapters/cli/read-isolation.js.map +1 -1
  82. package/dist/adapters/cli/registry.d.ts +13 -1
  83. package/dist/adapters/cli/registry.d.ts.map +1 -1
  84. package/dist/adapters/cli/registry.js +19 -1
  85. package/dist/adapters/cli/registry.js.map +1 -1
  86. package/dist/adapters/cli/runner-input.d.ts +3 -3
  87. package/dist/adapters/cli/runner-input.d.ts.map +1 -1
  88. package/dist/adapters/cli/runner-input.js +4 -3
  89. package/dist/adapters/cli/runner-input.js.map +1 -1
  90. package/dist/adapters/cli/shared-hints.d.ts +3 -1
  91. package/dist/adapters/cli/shared-hints.d.ts.map +1 -1
  92. package/dist/adapters/cli/shared-hints.js +22 -6
  93. package/dist/adapters/cli/shared-hints.js.map +1 -1
  94. package/dist/adapters/cli/types.d.ts +29 -4
  95. package/dist/adapters/cli/types.d.ts.map +1 -1
  96. package/dist/bot-registry.d.ts +20 -0
  97. package/dist/bot-registry.d.ts.map +1 -1
  98. package/dist/bot-registry.js +30 -4
  99. package/dist/bot-registry.js.map +1 -1
  100. package/dist/cli/arg-utils.d.ts +5 -0
  101. package/dist/cli/arg-utils.d.ts.map +1 -1
  102. package/dist/cli/arg-utils.js +7 -0
  103. package/dist/cli/arg-utils.js.map +1 -1
  104. package/dist/cli/bots-list-output.d.ts +130 -2
  105. package/dist/cli/bots-list-output.d.ts.map +1 -1
  106. package/dist/cli/bots-list-output.js +173 -27
  107. package/dist/cli/bots-list-output.js.map +1 -1
  108. package/dist/cli/daemon-lifecycle-env.d.ts +10 -3
  109. package/dist/cli/daemon-lifecycle-env.d.ts.map +1 -1
  110. package/dist/cli/daemon-lifecycle-env.js +38 -11
  111. package/dist/cli/daemon-lifecycle-env.js.map +1 -1
  112. package/dist/cli/dashboard-command.d.ts +15 -0
  113. package/dist/cli/dashboard-command.d.ts.map +1 -1
  114. package/dist/cli/dashboard-command.js +22 -0
  115. package/dist/cli/dashboard-command.js.map +1 -1
  116. package/dist/cli/log-tail.d.ts +54 -0
  117. package/dist/cli/log-tail.d.ts.map +1 -0
  118. package/dist/cli/log-tail.js +167 -0
  119. package/dist/cli/log-tail.js.map +1 -0
  120. package/dist/cli/pm2-env.d.ts +16 -0
  121. package/dist/cli/pm2-env.d.ts.map +1 -0
  122. package/dist/cli/pm2-env.js +63 -0
  123. package/dist/cli/pm2-env.js.map +1 -0
  124. package/dist/cli/pm2-fleet-lock.d.ts +26 -0
  125. package/dist/cli/pm2-fleet-lock.d.ts.map +1 -0
  126. package/dist/cli/pm2-fleet-lock.js +50 -0
  127. package/dist/cli/pm2-fleet-lock.js.map +1 -0
  128. package/dist/cli/pm2-god-retirement.d.ts +59 -0
  129. package/dist/cli/pm2-god-retirement.d.ts.map +1 -0
  130. package/dist/cli/pm2-god-retirement.js +95 -0
  131. package/dist/cli/pm2-god-retirement.js.map +1 -0
  132. package/dist/cli/session-list-wake.d.ts +41 -0
  133. package/dist/cli/session-list-wake.d.ts.map +1 -0
  134. package/dist/cli/session-list-wake.js +102 -0
  135. package/dist/cli/session-list-wake.js.map +1 -0
  136. package/dist/cli/workflow.d.ts.map +1 -1
  137. package/dist/cli/workflow.js +26 -0
  138. package/dist/cli/workflow.js.map +1 -1
  139. package/dist/cli.d.ts.map +1 -1
  140. package/dist/cli.js +933 -115
  141. package/dist/cli.js.map +1 -1
  142. package/dist/codex-app-runner.js +261 -49
  143. package/dist/codex-app-runner.js.map +1 -1
  144. package/dist/core/cli-runtime-update.d.ts +8 -0
  145. package/dist/core/cli-runtime-update.d.ts.map +1 -1
  146. package/dist/core/cli-runtime-update.js +127 -8
  147. package/dist/core/cli-runtime-update.js.map +1 -1
  148. package/dist/core/close-residual.d.ts +64 -0
  149. package/dist/core/close-residual.d.ts.map +1 -0
  150. package/dist/core/close-residual.js +93 -0
  151. package/dist/core/close-residual.js.map +1 -0
  152. package/dist/core/closed-session-card.d.ts.map +1 -1
  153. package/dist/core/closed-session-card.js +11 -3
  154. package/dist/core/closed-session-card.js.map +1 -1
  155. package/dist/core/command-handler.d.ts.map +1 -1
  156. package/dist/core/command-handler.js +129 -27
  157. package/dist/core/command-handler.js.map +1 -1
  158. package/dist/core/cost-calculator.d.ts +3 -1
  159. package/dist/core/cost-calculator.d.ts.map +1 -1
  160. package/dist/core/cost-calculator.js +230 -1
  161. package/dist/core/cost-calculator.js.map +1 -1
  162. package/dist/core/daemon-background-close.d.ts +19 -0
  163. package/dist/core/daemon-background-close.d.ts.map +1 -0
  164. package/dist/core/daemon-background-close.js +39 -0
  165. package/dist/core/daemon-background-close.js.map +1 -0
  166. package/dist/core/dashboard-command/overview.d.ts +4 -0
  167. package/dist/core/dashboard-command/overview.d.ts.map +1 -1
  168. package/dist/core/dashboard-command/overview.js +8 -1
  169. package/dist/core/dashboard-command/overview.js.map +1 -1
  170. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  171. package/dist/core/dashboard-ipc-server.js +373 -41
  172. package/dist/core/dashboard-ipc-server.js.map +1 -1
  173. package/dist/core/dashboard-rows.d.ts +4 -0
  174. package/dist/core/dashboard-rows.d.ts.map +1 -1
  175. package/dist/core/dashboard-rows.js +3 -0
  176. package/dist/core/dashboard-rows.js.map +1 -1
  177. package/dist/core/dashboard-url.d.ts +37 -0
  178. package/dist/core/dashboard-url.d.ts.map +1 -1
  179. package/dist/core/dashboard-url.js +71 -0
  180. package/dist/core/dashboard-url.js.map +1 -1
  181. package/dist/core/deferred-schedule-settlement.d.ts +15 -1
  182. package/dist/core/deferred-schedule-settlement.d.ts.map +1 -1
  183. package/dist/core/deferred-schedule-settlement.js +4 -1
  184. package/dist/core/deferred-schedule-settlement.js.map +1 -1
  185. package/dist/core/device-isolation-daemon.d.ts +91 -1
  186. package/dist/core/device-isolation-daemon.d.ts.map +1 -1
  187. package/dist/core/device-isolation-daemon.js +346 -2
  188. package/dist/core/device-isolation-daemon.js.map +1 -1
  189. package/dist/core/local-terminal-opener.d.ts.map +1 -1
  190. package/dist/core/local-terminal-opener.js +5 -1
  191. package/dist/core/local-terminal-opener.js.map +1 -1
  192. package/dist/core/loopback-target.d.ts +14 -0
  193. package/dist/core/loopback-target.d.ts.map +1 -0
  194. package/dist/core/loopback-target.js +20 -0
  195. package/dist/core/loopback-target.js.map +1 -0
  196. package/dist/core/maintenance.d.ts.map +1 -1
  197. package/dist/core/maintenance.js +16 -2
  198. package/dist/core/maintenance.js.map +1 -1
  199. package/dist/core/mojo-containment-command.d.ts +20 -0
  200. package/dist/core/mojo-containment-command.d.ts.map +1 -0
  201. package/dist/core/mojo-containment-command.js +266 -0
  202. package/dist/core/mojo-containment-command.js.map +1 -0
  203. package/dist/core/mojo-containment.d.ts +575 -0
  204. package/dist/core/mojo-containment.d.ts.map +1 -0
  205. package/dist/core/mojo-containment.js +1158 -0
  206. package/dist/core/mojo-containment.js.map +1 -0
  207. package/dist/core/mojo-launcher-env-quarantine.d.ts +30 -0
  208. package/dist/core/mojo-launcher-env-quarantine.d.ts.map +1 -0
  209. package/dist/core/mojo-launcher-env-quarantine.js +175 -0
  210. package/dist/core/mojo-launcher-env-quarantine.js.map +1 -0
  211. package/dist/core/mojo-session-identity.d.ts +3 -0
  212. package/dist/core/mojo-session-identity.d.ts.map +1 -0
  213. package/dist/core/mojo-session-identity.js +126 -0
  214. package/dist/core/mojo-session-identity.js.map +1 -0
  215. package/dist/core/persistent-backend.d.ts +32 -8
  216. package/dist/core/persistent-backend.d.ts.map +1 -1
  217. package/dist/core/persistent-backend.js +55 -17
  218. package/dist/core/persistent-backend.js.map +1 -1
  219. package/dist/core/plugins/mcp/gateway.d.ts +14 -1
  220. package/dist/core/plugins/mcp/gateway.d.ts.map +1 -1
  221. package/dist/core/plugins/mcp/gateway.js +70 -3
  222. package/dist/core/plugins/mcp/gateway.js.map +1 -1
  223. package/dist/core/plugins/mcp/host.d.ts +2 -0
  224. package/dist/core/plugins/mcp/host.d.ts.map +1 -1
  225. package/dist/core/plugins/mcp/host.js +2 -0
  226. package/dist/core/plugins/mcp/host.js.map +1 -1
  227. package/dist/core/plugins/pm2.d.ts.map +1 -1
  228. package/dist/core/plugins/pm2.js +16 -3
  229. package/dist/core/plugins/pm2.js.map +1 -1
  230. package/dist/core/plugins/service-manager.d.ts +9 -0
  231. package/dist/core/plugins/service-manager.d.ts.map +1 -1
  232. package/dist/core/plugins/service-manager.js +33 -16
  233. package/dist/core/plugins/service-manager.js.map +1 -1
  234. package/dist/core/preview-port-owner.d.ts +109 -0
  235. package/dist/core/preview-port-owner.d.ts.map +1 -0
  236. package/dist/core/preview-port-owner.js +320 -0
  237. package/dist/core/preview-port-owner.js.map +1 -0
  238. package/dist/core/remote-cli-ids.d.ts +5 -0
  239. package/dist/core/remote-cli-ids.d.ts.map +1 -0
  240. package/dist/core/remote-cli-ids.js +24 -0
  241. package/dist/core/remote-cli-ids.js.map +1 -0
  242. package/dist/core/{riff-shutdown-detach.d.ts → remote-shutdown-detach.d.ts} +40 -39
  243. package/dist/core/remote-shutdown-detach.d.ts.map +1 -0
  244. package/dist/core/{riff-shutdown-detach.js → remote-shutdown-detach.js} +85 -83
  245. package/dist/core/remote-shutdown-detach.js.map +1 -0
  246. package/dist/core/{riff-worker-shutdown-readiness.d.ts → remote-worker-shutdown-readiness.d.ts} +5 -4
  247. package/dist/core/remote-worker-shutdown-readiness.d.ts.map +1 -0
  248. package/dist/core/{riff-worker-shutdown-readiness.js → remote-worker-shutdown-readiness.js} +4 -3
  249. package/dist/core/remote-worker-shutdown-readiness.js.map +1 -0
  250. package/dist/core/reply-target.d.ts +16 -1
  251. package/dist/core/reply-target.d.ts.map +1 -1
  252. package/dist/core/reply-target.js +61 -0
  253. package/dist/core/reply-target.js.map +1 -1
  254. package/dist/core/session-group-birth.d.ts +26 -0
  255. package/dist/core/session-group-birth.d.ts.map +1 -1
  256. package/dist/core/session-group-birth.js +81 -4
  257. package/dist/core/session-group-birth.js.map +1 -1
  258. package/dist/core/session-manager.d.ts +15 -2
  259. package/dist/core/session-manager.d.ts.map +1 -1
  260. package/dist/core/session-manager.js +259 -5
  261. package/dist/core/session-manager.js.map +1 -1
  262. package/dist/core/session-model.d.ts +46 -0
  263. package/dist/core/session-model.d.ts.map +1 -0
  264. package/dist/core/session-model.js +42 -0
  265. package/dist/core/session-model.js.map +1 -0
  266. package/dist/core/session-owner-reminder.d.ts +63 -0
  267. package/dist/core/session-owner-reminder.d.ts.map +1 -0
  268. package/dist/core/session-owner-reminder.js +196 -0
  269. package/dist/core/session-owner-reminder.js.map +1 -0
  270. package/dist/core/session-preview-registry.d.ts +53 -0
  271. package/dist/core/session-preview-registry.d.ts.map +1 -0
  272. package/dist/core/session-preview-registry.js +82 -0
  273. package/dist/core/session-preview-registry.js.map +1 -0
  274. package/dist/core/session-preview.d.ts +114 -0
  275. package/dist/core/session-preview.d.ts.map +1 -0
  276. package/dist/core/session-preview.js +184 -0
  277. package/dist/core/session-preview.js.map +1 -0
  278. package/dist/core/session-rename.d.ts.map +1 -1
  279. package/dist/core/session-rename.js +5 -3
  280. package/dist/core/session-rename.js.map +1 -1
  281. package/dist/core/session-wake-deadline.d.ts +5 -0
  282. package/dist/core/session-wake-deadline.d.ts.map +1 -0
  283. package/dist/core/session-wake-deadline.js +13 -0
  284. package/dist/core/session-wake-deadline.js.map +1 -0
  285. package/dist/core/shutdown-budgets.d.ts +7 -6
  286. package/dist/core/shutdown-budgets.d.ts.map +1 -1
  287. package/dist/core/shutdown-budgets.js +11 -10
  288. package/dist/core/shutdown-budgets.js.map +1 -1
  289. package/dist/core/terminal-control-grant.d.ts +74 -0
  290. package/dist/core/terminal-control-grant.d.ts.map +1 -0
  291. package/dist/core/terminal-control-grant.js +183 -0
  292. package/dist/core/terminal-control-grant.js.map +1 -0
  293. package/dist/core/terminal-proxy.d.ts.map +1 -1
  294. package/dist/core/terminal-proxy.js +4 -5
  295. package/dist/core/terminal-proxy.js.map +1 -1
  296. package/dist/core/terminal-write-auth.d.ts +4 -11
  297. package/dist/core/terminal-write-auth.d.ts.map +1 -1
  298. package/dist/core/terminal-write-auth.js +19 -16
  299. package/dist/core/terminal-write-auth.js.map +1 -1
  300. package/dist/core/trigger-session.d.ts.map +1 -1
  301. package/dist/core/trigger-session.js +36 -29
  302. package/dist/core/trigger-session.js.map +1 -1
  303. package/dist/core/types.d.ts +88 -10
  304. package/dist/core/types.d.ts.map +1 -1
  305. package/dist/core/types.js +9 -7
  306. package/dist/core/types.js.map +1 -1
  307. package/dist/core/workbench-link.d.ts +81 -0
  308. package/dist/core/workbench-link.d.ts.map +1 -0
  309. package/dist/core/workbench-link.js +109 -0
  310. package/dist/core/workbench-link.js.map +1 -0
  311. package/dist/core/worker-pool.d.ts +312 -11
  312. package/dist/core/worker-pool.d.ts.map +1 -1
  313. package/dist/core/worker-pool.js +2494 -209
  314. package/dist/core/worker-pool.js.map +1 -1
  315. package/dist/daemon.d.ts +6 -0
  316. package/dist/daemon.d.ts.map +1 -1
  317. package/dist/daemon.js +443 -106
  318. package/dist/daemon.js.map +1 -1
  319. package/dist/dashboard/aggregator.d.ts +33 -3
  320. package/dist/dashboard/aggregator.d.ts.map +1 -1
  321. package/dist/dashboard/aggregator.js +93 -17
  322. package/dist/dashboard/aggregator.js.map +1 -1
  323. package/dist/dashboard/auth-session-connections.d.ts +59 -0
  324. package/dist/dashboard/auth-session-connections.d.ts.map +1 -0
  325. package/dist/dashboard/auth-session-connections.js +109 -0
  326. package/dist/dashboard/auth-session-connections.js.map +1 -0
  327. package/dist/dashboard/auth.d.ts +99 -1
  328. package/dist/dashboard/auth.d.ts.map +1 -1
  329. package/dist/dashboard/auth.js +176 -64
  330. package/dist/dashboard/auth.js.map +1 -1
  331. package/dist/dashboard/bot-payload.d.ts +1 -0
  332. package/dist/dashboard/bot-payload.d.ts.map +1 -1
  333. package/dist/dashboard/bot-payload.js +3 -0
  334. package/dist/dashboard/bot-payload.js.map +1 -1
  335. package/dist/dashboard/control-audit.d.ts +112 -0
  336. package/dist/dashboard/control-audit.d.ts.map +1 -0
  337. package/dist/dashboard/control-audit.js +195 -0
  338. package/dist/dashboard/control-audit.js.map +1 -0
  339. package/dist/dashboard/control-csrf.d.ts +123 -0
  340. package/dist/dashboard/control-csrf.d.ts.map +1 -0
  341. package/dist/dashboard/control-csrf.js +392 -0
  342. package/dist/dashboard/control-csrf.js.map +1 -0
  343. package/dist/dashboard/daemon-reconcile.d.ts +26 -0
  344. package/dist/dashboard/daemon-reconcile.d.ts.map +1 -0
  345. package/dist/dashboard/daemon-reconcile.js +46 -0
  346. package/dist/dashboard/daemon-reconcile.js.map +1 -0
  347. package/dist/dashboard/debug-terminal.d.ts.map +1 -1
  348. package/dist/dashboard/debug-terminal.js +18 -4
  349. package/dist/dashboard/debug-terminal.js.map +1 -1
  350. package/dist/dashboard/events-sse.d.ts +60 -0
  351. package/dist/dashboard/events-sse.d.ts.map +1 -0
  352. package/dist/dashboard/events-sse.js +63 -0
  353. package/dist/dashboard/events-sse.js.map +1 -0
  354. package/dist/dashboard/h5-auth.d.ts +256 -0
  355. package/dist/dashboard/h5-auth.d.ts.map +1 -0
  356. package/dist/dashboard/h5-auth.js +825 -0
  357. package/dist/dashboard/h5-auth.js.map +1 -0
  358. package/dist/dashboard/managed-spawn.d.ts +36 -0
  359. package/dist/dashboard/managed-spawn.d.ts.map +1 -0
  360. package/dist/dashboard/managed-spawn.js +169 -0
  361. package/dist/dashboard/managed-spawn.js.map +1 -0
  362. package/dist/dashboard/preview-content-capability.d.ts +41 -0
  363. package/dist/dashboard/preview-content-capability.d.ts.map +1 -0
  364. package/dist/dashboard/preview-content-capability.js +127 -0
  365. package/dist/dashboard/preview-content-capability.js.map +1 -0
  366. package/dist/dashboard/preview-contract.d.ts +85 -0
  367. package/dist/dashboard/preview-contract.d.ts.map +1 -0
  368. package/dist/dashboard/preview-contract.js +198 -0
  369. package/dist/dashboard/preview-contract.js.map +1 -0
  370. package/dist/dashboard/preview-guard-page.d.ts +52 -0
  371. package/dist/dashboard/preview-guard-page.d.ts.map +1 -0
  372. package/dist/dashboard/preview-guard-page.js +162 -0
  373. package/dist/dashboard/preview-guard-page.js.map +1 -0
  374. package/dist/dashboard/preview-interaction.d.ts +57 -0
  375. package/dist/dashboard/preview-interaction.d.ts.map +1 -0
  376. package/dist/dashboard/preview-interaction.js +198 -0
  377. package/dist/dashboard/preview-interaction.js.map +1 -0
  378. package/dist/dashboard/preview-proxy.d.ts +113 -0
  379. package/dist/dashboard/preview-proxy.d.ts.map +1 -0
  380. package/dist/dashboard/preview-proxy.js +543 -0
  381. package/dist/dashboard/preview-proxy.js.map +1 -0
  382. package/dist/dashboard/public-redact.d.ts +23 -0
  383. package/dist/dashboard/public-redact.d.ts.map +1 -1
  384. package/dist/dashboard/public-redact.js +90 -21
  385. package/dist/dashboard/public-redact.js.map +1 -1
  386. package/dist/dashboard/request-identity.d.ts +77 -0
  387. package/dist/dashboard/request-identity.d.ts.map +1 -0
  388. package/dist/dashboard/request-identity.js +72 -0
  389. package/dist/dashboard/request-identity.js.map +1 -0
  390. package/dist/dashboard/session-cleanup.d.ts +5 -0
  391. package/dist/dashboard/session-cleanup.d.ts.map +1 -1
  392. package/dist/dashboard/session-cleanup.js +4 -0
  393. package/dist/dashboard/session-cleanup.js.map +1 -1
  394. package/dist/dashboard/settings-write-applier.d.ts +5 -1
  395. package/dist/dashboard/settings-write-applier.d.ts.map +1 -1
  396. package/dist/dashboard/settings-write-applier.js +14 -0
  397. package/dist/dashboard/settings-write-applier.js.map +1 -1
  398. package/dist/dashboard/standing-link.d.ts +76 -0
  399. package/dist/dashboard/standing-link.d.ts.map +1 -0
  400. package/dist/dashboard/standing-link.js +111 -0
  401. package/dist/dashboard/standing-link.js.map +1 -0
  402. package/dist/dashboard/terminal-control.d.ts +105 -0
  403. package/dist/dashboard/terminal-control.d.ts.map +1 -0
  404. package/dist/dashboard/terminal-control.js +296 -0
  405. package/dist/dashboard/terminal-control.js.map +1 -0
  406. package/dist/dashboard/terminal-front-proxy.d.ts +55 -0
  407. package/dist/dashboard/terminal-front-proxy.d.ts.map +1 -0
  408. package/dist/dashboard/terminal-front-proxy.js +397 -0
  409. package/dist/dashboard/terminal-front-proxy.js.map +1 -0
  410. package/dist/dashboard/terminal-view-capability.d.ts +97 -0
  411. package/dist/dashboard/terminal-view-capability.d.ts.map +1 -0
  412. package/dist/dashboard/terminal-view-capability.js +145 -0
  413. package/dist/dashboard/terminal-view-capability.js.map +1 -0
  414. package/dist/dashboard/web/agent-workbench-api.d.ts +59 -0
  415. package/dist/dashboard/web/agent-workbench-api.d.ts.map +1 -0
  416. package/dist/dashboard/web/agent-workbench-api.js +227 -0
  417. package/dist/dashboard/web/agent-workbench-api.js.map +1 -0
  418. package/dist/dashboard/web/agent-workbench-appearance-menu.d.ts +59 -0
  419. package/dist/dashboard/web/agent-workbench-appearance-menu.d.ts.map +1 -0
  420. package/dist/dashboard/web/agent-workbench-appearance-menu.js +195 -0
  421. package/dist/dashboard/web/agent-workbench-appearance-menu.js.map +1 -0
  422. package/dist/dashboard/web/agent-workbench-appearance.d.ts +222 -0
  423. package/dist/dashboard/web/agent-workbench-appearance.d.ts.map +1 -0
  424. package/dist/dashboard/web/agent-workbench-appearance.js +499 -0
  425. package/dist/dashboard/web/agent-workbench-appearance.js.map +1 -0
  426. package/dist/dashboard/web/agent-workbench-capabilities.d.ts +13 -0
  427. package/dist/dashboard/web/agent-workbench-capabilities.d.ts.map +1 -0
  428. package/dist/dashboard/web/agent-workbench-capabilities.js +24 -0
  429. package/dist/dashboard/web/agent-workbench-capabilities.js.map +1 -0
  430. package/dist/dashboard/web/agent-workbench-chat.d.ts +90 -0
  431. package/dist/dashboard/web/agent-workbench-chat.d.ts.map +1 -0
  432. package/dist/dashboard/web/agent-workbench-chat.js +168 -0
  433. package/dist/dashboard/web/agent-workbench-chat.js.map +1 -0
  434. package/dist/dashboard/web/agent-workbench-dock-page.d.ts +3 -0
  435. package/dist/dashboard/web/agent-workbench-dock-page.d.ts.map +1 -0
  436. package/dist/dashboard/web/agent-workbench-dock-page.js +23 -0
  437. package/dist/dashboard/web/agent-workbench-dock-page.js.map +1 -0
  438. package/dist/dashboard/web/agent-workbench-dock-view.d.ts +22 -0
  439. package/dist/dashboard/web/agent-workbench-dock-view.d.ts.map +1 -0
  440. package/dist/dashboard/web/agent-workbench-dock-view.js +76 -0
  441. package/dist/dashboard/web/agent-workbench-dock-view.js.map +1 -0
  442. package/dist/dashboard/web/agent-workbench-model.d.ts +196 -0
  443. package/dist/dashboard/web/agent-workbench-model.d.ts.map +1 -0
  444. package/dist/dashboard/web/agent-workbench-model.js +529 -0
  445. package/dist/dashboard/web/agent-workbench-model.js.map +1 -0
  446. package/dist/dashboard/web/agent-workbench-page.d.ts +3 -0
  447. package/dist/dashboard/web/agent-workbench-page.d.ts.map +1 -0
  448. package/dist/dashboard/web/agent-workbench-page.js +27 -0
  449. package/dist/dashboard/web/agent-workbench-page.js.map +1 -0
  450. package/dist/dashboard/web/agent-workbench-panes.d.ts +49 -0
  451. package/dist/dashboard/web/agent-workbench-panes.d.ts.map +1 -0
  452. package/dist/dashboard/web/agent-workbench-panes.js +468 -0
  453. package/dist/dashboard/web/agent-workbench-panes.js.map +1 -0
  454. package/dist/dashboard/web/agent-workbench-session-list.d.ts +42 -0
  455. package/dist/dashboard/web/agent-workbench-session-list.d.ts.map +1 -0
  456. package/dist/dashboard/web/agent-workbench-session-list.js +353 -0
  457. package/dist/dashboard/web/agent-workbench-session-list.js.map +1 -0
  458. package/dist/dashboard/web/agent-workbench-storage.d.ts +49 -0
  459. package/dist/dashboard/web/agent-workbench-storage.d.ts.map +1 -0
  460. package/dist/dashboard/web/agent-workbench-storage.js +197 -0
  461. package/dist/dashboard/web/agent-workbench-storage.js.map +1 -0
  462. package/dist/dashboard/web/agent-workbench-touch.d.ts +46 -0
  463. package/dist/dashboard/web/agent-workbench-touch.d.ts.map +1 -0
  464. package/dist/dashboard/web/agent-workbench-touch.js +96 -0
  465. package/dist/dashboard/web/agent-workbench-touch.js.map +1 -0
  466. package/dist/dashboard/web/agent-workbench-view.d.ts +34 -0
  467. package/dist/dashboard/web/agent-workbench-view.d.ts.map +1 -0
  468. package/dist/dashboard/web/agent-workbench-view.js +439 -0
  469. package/dist/dashboard/web/agent-workbench-view.js.map +1 -0
  470. package/dist/dashboard/web/app.d.ts.map +1 -1
  471. package/dist/dashboard/web/app.js +63 -2
  472. package/dist/dashboard/web/app.js.map +1 -1
  473. package/dist/dashboard/web/bot-defaults-page.d.ts +11 -0
  474. package/dist/dashboard/web/bot-defaults-page.d.ts.map +1 -1
  475. package/dist/dashboard/web/bot-defaults-page.js +267 -36
  476. package/dist/dashboard/web/bot-defaults-page.js.map +1 -1
  477. package/dist/dashboard/web/bot-defaults.d.ts +6 -0
  478. package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
  479. package/dist/dashboard/web/bot-defaults.js.map +1 -1
  480. package/dist/dashboard/web/control-csrf.d.ts +4 -0
  481. package/dist/dashboard/web/control-csrf.d.ts.map +1 -0
  482. package/dist/dashboard/web/control-csrf.js +26 -0
  483. package/dist/dashboard/web/control-csrf.js.map +1 -0
  484. package/dist/dashboard/web/dashboard-routes.d.ts.map +1 -1
  485. package/dist/dashboard/web/dashboard-routes.js +2 -0
  486. package/dist/dashboard/web/dashboard-routes.js.map +1 -1
  487. package/dist/dashboard/web/groups-page.d.ts.map +1 -1
  488. package/dist/dashboard/web/groups-page.js +11 -2
  489. package/dist/dashboard/web/groups-page.js.map +1 -1
  490. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  491. package/dist/dashboard/web/i18n.js +132 -6
  492. package/dist/dashboard/web/i18n.js.map +1 -1
  493. package/dist/dashboard/web/overview-page.d.ts.map +1 -1
  494. package/dist/dashboard/web/overview-page.js +3 -2
  495. package/dist/dashboard/web/overview-page.js.map +1 -1
  496. package/dist/dashboard/web/sessions-page.d.ts.map +1 -1
  497. package/dist/dashboard/web/sessions-page.js +41 -1
  498. package/dist/dashboard/web/sessions-page.js.map +1 -1
  499. package/dist/dashboard/web/sessions.d.ts.map +1 -1
  500. package/dist/dashboard/web/sessions.js +5 -1
  501. package/dist/dashboard/web/sessions.js.map +1 -1
  502. package/dist/dashboard/web/settings-page.d.ts +3 -0
  503. package/dist/dashboard/web/settings-page.d.ts.map +1 -1
  504. package/dist/dashboard/web/settings-page.js +56 -10
  505. package/dist/dashboard/web/settings-page.js.map +1 -1
  506. package/dist/dashboard/web/store.d.ts +27 -2
  507. package/dist/dashboard/web/store.d.ts.map +1 -1
  508. package/dist/dashboard/web/store.js +43 -4
  509. package/dist/dashboard/web/store.js.map +1 -1
  510. package/dist/dashboard/web/ui.d.ts +3 -0
  511. package/dist/dashboard/web/ui.d.ts.map +1 -1
  512. package/dist/dashboard/web/ui.js +11 -0
  513. package/dist/dashboard/web/ui.js.map +1 -1
  514. package/dist/dashboard/web/update-action.d.ts +12 -0
  515. package/dist/dashboard/web/update-action.d.ts.map +1 -1
  516. package/dist/dashboard/web/update-action.js +11 -0
  517. package/dist/dashboard/web/update-action.js.map +1 -1
  518. package/dist/dashboard/workbench-doctor.d.ts +114 -0
  519. package/dist/dashboard/workbench-doctor.d.ts.map +1 -0
  520. package/dist/dashboard/workbench-doctor.js +620 -0
  521. package/dist/dashboard/workbench-doctor.js.map +1 -0
  522. package/dist/dashboard/workbench-ticket.d.ts +165 -0
  523. package/dist/dashboard/workbench-ticket.d.ts.map +1 -0
  524. package/dist/dashboard/workbench-ticket.js +495 -0
  525. package/dist/dashboard/workbench-ticket.js.map +1 -0
  526. package/dist/dashboard-web/app.js +1 -1
  527. package/dist/dashboard-web/chunks/agent-workbench-dock-page-IKAC5CFL.js +1 -0
  528. package/dist/dashboard-web/chunks/agent-workbench-page-M53UN5EB.js +1 -0
  529. package/dist/dashboard-web/chunks/bot-defaults-page-YKE5SDZF.js +10 -0
  530. package/dist/dashboard-web/chunks/chunk-22WIADUT.js +2 -0
  531. package/dist/dashboard-web/chunks/chunk-24ONYQMR.js +1 -0
  532. package/dist/dashboard-web/chunks/{chunk-Z7B3E3US.js → chunk-2W6SCN3M.js} +1 -1
  533. package/dist/dashboard-web/chunks/chunk-4XNJX6B3.js +1 -0
  534. package/dist/dashboard-web/chunks/{chunk-VMWNR3SV.js → chunk-F6KNPF4R.js} +11 -9
  535. package/dist/dashboard-web/chunks/chunk-FXW3V4JR.js +1 -0
  536. package/dist/dashboard-web/chunks/chunk-G5ZS2YUS.js +1 -0
  537. package/dist/dashboard-web/chunks/chunk-KTQ7B6ZR.js +1 -0
  538. package/dist/dashboard-web/chunks/{chunk-Z7DO42GJ.js → chunk-NACP7BMR.js} +1 -1
  539. package/dist/dashboard-web/chunks/{connectors-page-CPH6VVFY.js → connectors-page-VOISXXII.js} +1 -1
  540. package/dist/dashboard-web/chunks/{feedback-page-J2FKQ3LK.js → feedback-page-RN6HRZMS.js} +1 -1
  541. package/dist/dashboard-web/chunks/groups-page-UQT6DCB7.js +8 -0
  542. package/dist/dashboard-web/chunks/{insights-page-A2LWTKJD.js → insights-page-HJFDYR5N.js} +3 -3
  543. package/dist/dashboard-web/chunks/{monitor-room-2YR752E3.js → monitor-room-V7PCP47V.js} +1 -1
  544. package/dist/dashboard-web/chunks/{monitoring-page-BGYSKZGM.js → monitoring-page-NKEKVQAP.js} +1 -1
  545. package/dist/dashboard-web/chunks/{office-page-ZZHTEAE4.js → office-page-GVJF73XW.js} +1 -1
  546. package/dist/dashboard-web/chunks/overview-page-KHLV6VTI.js +1 -0
  547. package/dist/dashboard-web/chunks/{plugin-page-VEGTCEAS.js → plugin-page-J3OF5IY4.js} +1 -1
  548. package/dist/dashboard-web/chunks/{roles-page-YUC4YLJG.js → roles-page-WQIRSOLZ.js} +1 -1
  549. package/dist/dashboard-web/chunks/{schedules-page-2L2NKTDJ.js → schedules-page-J2DEY2X6.js} +1 -1
  550. package/dist/dashboard-web/chunks/sessions-page-7BQFEA5P.js +8 -0
  551. package/dist/dashboard-web/chunks/settings-page-BJEIOFJH.js +2 -0
  552. package/dist/dashboard-web/chunks/{skills-page-DQPBBI3T.js → skills-page-HGIFR3IU.js} +1 -1
  553. package/dist/dashboard-web/chunks/{team-federation-page-LQKLDV4K.js → team-federation-page-MR5ZPL4B.js} +1 -1
  554. package/dist/dashboard-web/chunks/{v3-page-RVKQIMAP.js → v3-page-GBR5JWPE.js} +2 -2
  555. package/dist/dashboard-web/chunks/{whiteboards-page-S5K55HRZ.js → whiteboards-page-QAZM4BN3.js} +1 -1
  556. package/dist/dashboard-web/index.html +8 -1
  557. package/dist/dashboard-web/style.css +2006 -10
  558. package/dist/dashboard.js +1006 -263
  559. package/dist/dashboard.js.map +1 -1
  560. package/dist/global-config.d.ts +30 -0
  561. package/dist/global-config.d.ts.map +1 -1
  562. package/dist/global-config.js +33 -0
  563. package/dist/global-config.js.map +1 -1
  564. package/dist/i18n/en.d.ts.map +1 -1
  565. package/dist/i18n/en.js +31 -1
  566. package/dist/i18n/en.js.map +1 -1
  567. package/dist/i18n/zh.d.ts.map +1 -1
  568. package/dist/i18n/zh.js +28 -1
  569. package/dist/i18n/zh.js.map +1 -1
  570. package/dist/im/lark/card-builder.d.ts +1 -1
  571. package/dist/im/lark/card-builder.d.ts.map +1 -1
  572. package/dist/im/lark/card-builder.js +22 -6
  573. package/dist/im/lark/card-builder.js.map +1 -1
  574. package/dist/im/lark/card-handler.d.ts.map +1 -1
  575. package/dist/im/lark/card-handler.js +118 -24
  576. package/dist/im/lark/card-handler.js.map +1 -1
  577. package/dist/im/lark/client.d.ts +15 -0
  578. package/dist/im/lark/client.d.ts.map +1 -1
  579. package/dist/im/lark/client.js +30 -0
  580. package/dist/im/lark/client.js.map +1 -1
  581. package/dist/im/lark/event-dispatcher.d.ts +48 -0
  582. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  583. package/dist/im/lark/event-dispatcher.js +133 -22
  584. package/dist/im/lark/event-dispatcher.js.map +1 -1
  585. package/dist/im/lark/identity-cache.d.ts +14 -6
  586. package/dist/im/lark/identity-cache.d.ts.map +1 -1
  587. package/dist/im/lark/identity-cache.js +69 -26
  588. package/dist/im/lark/identity-cache.js.map +1 -1
  589. package/dist/im/lark/lark-hosts.d.ts +13 -0
  590. package/dist/im/lark/lark-hosts.d.ts.map +1 -1
  591. package/dist/im/lark/lark-hosts.js +16 -0
  592. package/dist/im/lark/lark-hosts.js.map +1 -1
  593. package/dist/im/lark/overview-card.d.ts +22 -0
  594. package/dist/im/lark/overview-card.d.ts.map +1 -1
  595. package/dist/im/lark/overview-card.js +53 -3
  596. package/dist/im/lark/overview-card.js.map +1 -1
  597. package/dist/im/lark/sessions-card.d.ts.map +1 -1
  598. package/dist/im/lark/sessions-card.js +26 -3
  599. package/dist/im/lark/sessions-card.js.map +1 -1
  600. package/dist/im/lark/workflow-slash-command.d.ts +6 -0
  601. package/dist/im/lark/workflow-slash-command.d.ts.map +1 -1
  602. package/dist/im/lark/workflow-slash-command.js +7 -0
  603. package/dist/im/lark/workflow-slash-command.js.map +1 -1
  604. package/dist/index-daemon.js +27 -4
  605. package/dist/index-daemon.js.map +1 -1
  606. package/dist/index-dashboard.d.ts +3 -0
  607. package/dist/index-dashboard.d.ts.map +1 -0
  608. package/dist/index-dashboard.js +94 -0
  609. package/dist/index-dashboard.js.map +1 -0
  610. package/dist/platform/team-agents-client.d.ts +199 -0
  611. package/dist/platform/team-agents-client.d.ts.map +1 -0
  612. package/dist/platform/team-agents-client.js +263 -0
  613. package/dist/platform/team-agents-client.js.map +1 -0
  614. package/dist/platform/tunnel-client.d.ts +6 -0
  615. package/dist/platform/tunnel-client.d.ts.map +1 -1
  616. package/dist/platform/tunnel-client.js.map +1 -1
  617. package/dist/services/async-trigger-state.d.ts +7 -3
  618. package/dist/services/async-trigger-state.d.ts.map +1 -1
  619. package/dist/services/async-trigger-state.js +28 -0
  620. package/dist/services/async-trigger-state.js.map +1 -1
  621. package/dist/services/async-trigger-store.d.ts +13 -4
  622. package/dist/services/async-trigger-store.d.ts.map +1 -1
  623. package/dist/services/async-trigger-store.js +55 -8
  624. package/dist/services/async-trigger-store.js.map +1 -1
  625. package/dist/services/bot-config-store.d.ts +1 -11
  626. package/dist/services/bot-config-store.d.ts.map +1 -1
  627. package/dist/services/bot-config-store.js +27 -3
  628. package/dist/services/bot-config-store.js.map +1 -1
  629. package/dist/services/bot-profile-store.d.ts +17 -2
  630. package/dist/services/bot-profile-store.d.ts.map +1 -1
  631. package/dist/services/bot-profile-store.js +93 -12
  632. package/dist/services/bot-profile-store.js.map +1 -1
  633. package/dist/services/bridge-turn-queue.d.ts +10 -1
  634. package/dist/services/bridge-turn-queue.d.ts.map +1 -1
  635. package/dist/services/bridge-turn-queue.js +29 -9
  636. package/dist/services/bridge-turn-queue.js.map +1 -1
  637. package/dist/services/claude-transcript.d.ts +19 -0
  638. package/dist/services/claude-transcript.d.ts.map +1 -1
  639. package/dist/services/claude-transcript.js +57 -5
  640. package/dist/services/claude-transcript.js.map +1 -1
  641. package/dist/services/codex-app-threads.d.ts +2 -0
  642. package/dist/services/codex-app-threads.d.ts.map +1 -1
  643. package/dist/services/codex-app-threads.js +1 -1
  644. package/dist/services/codex-app-threads.js.map +1 -1
  645. package/dist/services/codex-reasoning-effort.d.ts +8 -0
  646. package/dist/services/codex-reasoning-effort.d.ts.map +1 -1
  647. package/dist/services/codex-reasoning-effort.js +24 -0
  648. package/dist/services/codex-reasoning-effort.js.map +1 -1
  649. package/dist/services/cursor-resume-policy.d.ts.map +1 -1
  650. package/dist/services/cursor-resume-policy.js +15 -3
  651. package/dist/services/cursor-resume-policy.js.map +1 -1
  652. package/dist/services/open-platform-rename.d.ts.map +1 -1
  653. package/dist/services/open-platform-rename.js +3 -2
  654. package/dist/services/open-platform-rename.js.map +1 -1
  655. package/dist/services/ordinary-turn-recovery.d.ts +76 -0
  656. package/dist/services/ordinary-turn-recovery.d.ts.map +1 -0
  657. package/dist/services/ordinary-turn-recovery.js +349 -0
  658. package/dist/services/ordinary-turn-recovery.js.map +1 -0
  659. package/dist/services/resume-fresh-policy.d.ts +17 -0
  660. package/dist/services/resume-fresh-policy.d.ts.map +1 -0
  661. package/dist/services/resume-fresh-policy.js +24 -0
  662. package/dist/services/resume-fresh-policy.js.map +1 -0
  663. package/dist/services/session-group-title.d.ts +1 -0
  664. package/dist/services/session-group-title.d.ts.map +1 -1
  665. package/dist/services/session-group-title.js +16 -1
  666. package/dist/services/session-group-title.js.map +1 -1
  667. package/dist/services/session-groups-store.d.ts +30 -0
  668. package/dist/services/session-groups-store.d.ts.map +1 -1
  669. package/dist/services/session-groups-store.js +26 -4
  670. package/dist/services/session-groups-store.js.map +1 -1
  671. package/dist/services/session-owner-notification.d.ts +9 -0
  672. package/dist/services/session-owner-notification.d.ts.map +1 -0
  673. package/dist/services/session-owner-notification.js +10 -0
  674. package/dist/services/session-owner-notification.js.map +1 -0
  675. package/dist/services/session-owner-reminder-config-store.d.ts +9 -0
  676. package/dist/services/session-owner-reminder-config-store.d.ts.map +1 -0
  677. package/dist/services/session-owner-reminder-config-store.js +24 -0
  678. package/dist/services/session-owner-reminder-config-store.js.map +1 -0
  679. package/dist/services/session-owner-reminder-store.d.ts +5 -0
  680. package/dist/services/session-owner-reminder-store.d.ts.map +1 -0
  681. package/dist/services/session-owner-reminder-store.js +54 -0
  682. package/dist/services/session-owner-reminder-store.js.map +1 -0
  683. package/dist/services/session-store.d.ts +98 -21
  684. package/dist/services/session-store.d.ts.map +1 -1
  685. package/dist/services/session-store.js +406 -48
  686. package/dist/services/session-store.js.map +1 -1
  687. package/dist/services/structured-bridge-clis.d.ts +9 -5
  688. package/dist/services/structured-bridge-clis.d.ts.map +1 -1
  689. package/dist/services/structured-bridge-clis.js +9 -4
  690. package/dist/services/structured-bridge-clis.js.map +1 -1
  691. package/dist/services/transcript-resolver.d.ts +1 -1
  692. package/dist/services/transcript-resolver.d.ts.map +1 -1
  693. package/dist/services/transcript-resolver.js +6 -1
  694. package/dist/services/transcript-resolver.js.map +1 -1
  695. package/dist/setup/bot-config-editor.d.ts.map +1 -1
  696. package/dist/setup/bot-config-editor.js +7 -2
  697. package/dist/setup/bot-config-editor.js.map +1 -1
  698. package/dist/setup/ensure-herdr-integrations.d.ts +13 -0
  699. package/dist/setup/ensure-herdr-integrations.d.ts.map +1 -1
  700. package/dist/setup/ensure-herdr-integrations.js +21 -3
  701. package/dist/setup/ensure-herdr-integrations.js.map +1 -1
  702. package/dist/setup/open-platform-automation.d.ts +1 -0
  703. package/dist/setup/open-platform-automation.d.ts.map +1 -1
  704. package/dist/setup/open-platform-automation.js +107 -7
  705. package/dist/setup/open-platform-automation.js.map +1 -1
  706. package/dist/skills/definitions.d.ts +17 -0
  707. package/dist/skills/definitions.d.ts.map +1 -1
  708. package/dist/skills/definitions.js +78 -8
  709. package/dist/skills/definitions.js.map +1 -1
  710. package/dist/skills/injection-mode.d.ts +24 -3
  711. package/dist/skills/injection-mode.d.ts.map +1 -1
  712. package/dist/skills/injection-mode.js +64 -15
  713. package/dist/skills/injection-mode.js.map +1 -1
  714. package/dist/skills/installer.d.ts +18 -0
  715. package/dist/skills/installer.d.ts.map +1 -1
  716. package/dist/skills/installer.js +45 -1
  717. package/dist/skills/installer.js.map +1 -1
  718. package/dist/types.d.ts +221 -10
  719. package/dist/types.d.ts.map +1 -1
  720. package/dist/utils/child-env.d.ts +92 -2
  721. package/dist/utils/child-env.d.ts.map +1 -1
  722. package/dist/utils/child-env.js +195 -1
  723. package/dist/utils/child-env.js.map +1 -1
  724. package/dist/utils/cli-usage-limit.d.ts +25 -14
  725. package/dist/utils/cli-usage-limit.d.ts.map +1 -1
  726. package/dist/utils/cli-usage-limit.js +25 -15
  727. package/dist/utils/cli-usage-limit.js.map +1 -1
  728. package/dist/utils/daemon-rejection-guard.d.ts +35 -0
  729. package/dist/utils/daemon-rejection-guard.d.ts.map +1 -0
  730. package/dist/utils/daemon-rejection-guard.js +101 -0
  731. package/dist/utils/daemon-rejection-guard.js.map +1 -0
  732. package/dist/utils/dashboard-env.d.ts +53 -0
  733. package/dist/utils/dashboard-env.d.ts.map +1 -0
  734. package/dist/utils/dashboard-env.js +116 -0
  735. package/dist/utils/dashboard-env.js.map +1 -0
  736. package/dist/utils/global-install.d.ts.map +1 -1
  737. package/dist/utils/global-install.js +61 -5
  738. package/dist/utils/global-install.js.map +1 -1
  739. package/dist/utils/install-diagnostics.d.ts +14 -7
  740. package/dist/utils/install-diagnostics.d.ts.map +1 -1
  741. package/dist/utils/install-diagnostics.js +20 -11
  742. package/dist/utils/install-diagnostics.js.map +1 -1
  743. package/dist/utils/local-dev-update.d.ts +132 -0
  744. package/dist/utils/local-dev-update.d.ts.map +1 -0
  745. package/dist/utils/local-dev-update.js +176 -0
  746. package/dist/utils/local-dev-update.js.map +1 -0
  747. package/dist/utils/pending-input-queue.d.ts +12 -1
  748. package/dist/utils/pending-input-queue.d.ts.map +1 -1
  749. package/dist/utils/pending-input-queue.js.map +1 -1
  750. package/dist/worker.js +1284 -225
  751. package/dist/worker.js.map +1 -1
  752. package/dist/workflows/definition.d.ts +68 -68
  753. package/dist/workflows/events/payloads.d.ts +14 -14
  754. package/dist/workflows/events/schema.d.ts +312 -312
  755. package/dist/workflows/migration/v2-run-archive-schema.d.ts +40 -40
  756. package/dist/workflows/v3/cli-run.d.ts.map +1 -1
  757. package/dist/workflows/v3/cli-run.js +7 -0
  758. package/dist/workflows/v3/cli-run.js.map +1 -1
  759. package/dist/workflows/v3/goal-cli.d.ts +3 -0
  760. package/dist/workflows/v3/goal-cli.d.ts.map +1 -1
  761. package/dist/workflows/v3/goal-cli.js +11 -0
  762. package/dist/workflows/v3/goal-cli.js.map +1 -1
  763. package/dist/workflows/v3/run-envelope.d.ts +144 -144
  764. package/package.json +3 -2
  765. package/dist/cli/pm2-god-admission.d.ts +0 -8
  766. package/dist/cli/pm2-god-admission.d.ts.map +0 -1
  767. package/dist/cli/pm2-god-admission.js +0 -25
  768. package/dist/cli/pm2-god-admission.js.map +0 -1
  769. package/dist/core/riff-shutdown-detach.d.ts.map +0 -1
  770. package/dist/core/riff-shutdown-detach.js.map +0 -1
  771. package/dist/core/riff-worker-shutdown-readiness.d.ts.map +0 -1
  772. package/dist/core/riff-worker-shutdown-readiness.js.map +0 -1
  773. package/dist/dashboard-web/chunks/bot-defaults-page-65SMZ4QY.js +0 -10
  774. package/dist/dashboard-web/chunks/chunk-G5XGBCM6.js +0 -1
  775. package/dist/dashboard-web/chunks/chunk-IKN6WURK.js +0 -1
  776. package/dist/dashboard-web/chunks/chunk-WLIVBPJC.js +0 -1
  777. package/dist/dashboard-web/chunks/groups-page-VDOOLS4M.js +0 -8
  778. package/dist/dashboard-web/chunks/overview-page-7NYPKQSB.js +0 -1
  779. package/dist/dashboard-web/chunks/sessions-page-DYZZMKFL.js +0 -8
  780. package/dist/dashboard-web/chunks/settings-page-LIULUSMH.js +0 -2
@@ -32,12 +32,13 @@
32
32
  --modal-backdrop: rgba(10, 14, 18, 0.48);
33
33
  --qr-surface: #ffffff;
34
34
  --shadow: 0 18px 44px rgba(15, 23, 42, 0.08);
35
- --radius-xs: 12px;
36
- --radius-sm: 12px;
37
- --radius-md: 12px;
38
- --radius-lg: 12px;
39
- --radius-xl: 12px;
35
+ /* 圆角三档 + full,档位定义见下面第二个 :root(那份才是最终生效的)。 */
36
+ --radius-sm: 6px;
37
+ --radius-md: 10px;
38
+ --radius-lg: 14px;
40
39
  --radius-full: 999px;
40
+ --radius-xs: var(--radius-sm);
41
+ --radius-xl: var(--radius-lg);
41
42
  --radius: var(--radius-md);
42
43
  --button-height: 34px;
43
44
  --button-compact-height: 34px;
@@ -8055,12 +8056,19 @@ dialog.onboarding-dialog::backdrop {
8055
8056
  --accent: #565ee4;
8056
8057
  --accent-strong: var(--brand-accent-strong);
8057
8058
  --accent-soft: rgba(100, 108, 234, 0.12);
8058
- --radius-xs: 12px;
8059
- --radius-sm: 12px;
8060
- --radius-md: 12px;
8061
- --radius-lg: 12px;
8062
- --radius-xl: 12px;
8059
+ /* 圆角三档 + full:每档 1.4–1.7× 递进,肉眼分得出档位。五级全是 12px 的旧体系
8060
+ 等于没有尺度——小徽标读成药丸、大面板读成方角。取档按「半径 ≈ 高度 / 3.5」:
8061
+ ≤30px 取 sm(徽标 / chip / 分段控件)· 31–47px 取 md(按钮 / 输入框 / 下拉)·
8062
+ ≥48px 取 lg(卡片 / 面板 / 浮层 / 弹窗)。full 只给正圆(状态点、分栏握把、
8063
+ 头像、滚动条 thumb),不许用在矩形上。
8064
+ 旧的 xs / xl 不再是独立档位,按就近取档并进 sm / lg —— 全站 200+ 处引用照常
8065
+ 工作,非工作台组件的位移不超过 2px。 */
8066
+ --radius-sm: 6px;
8067
+ --radius-md: 10px;
8068
+ --radius-lg: 14px;
8063
8069
  --radius-full: 999px;
8070
+ --radius-xs: var(--radius-sm);
8071
+ --radius-xl: var(--radius-lg);
8064
8072
  --radius: var(--radius-md);
8065
8073
  --sidebar-width: 190px;
8066
8074
  --topbar-height: 60px;
@@ -12971,6 +12979,34 @@ button.contrast:hover { background: var(--danger-soft); border-color: var(--dang
12971
12979
  color: var(--fg);
12972
12980
  font: 12px/1.5 var(--mono);
12973
12981
  }
12982
+
12983
+ .bd-feedback-advanced {
12984
+ margin-top: 12px;
12985
+ border-top: 1px solid var(--border-soft);
12986
+ padding-top: 10px;
12987
+ }
12988
+ .bd-feedback-advanced > summary {
12989
+ width: fit-content;
12990
+ cursor: pointer;
12991
+ color: var(--muted);
12992
+ font-size: 12px;
12993
+ font-weight: 700;
12994
+ user-select: none;
12995
+ }
12996
+ .bd-feedback-advanced > summary:hover { color: var(--fg); }
12997
+ .bd-feedback-advanced-body { padding-top: 4px; }
12998
+ .bd-tile textarea.bd-feedback-json {
12999
+ min-height: 112px;
13000
+ max-height: 320px;
13001
+ resize: vertical;
13002
+ }
13003
+ .bd-feedback-chat-override {
13004
+ margin-top: 16px;
13005
+ border-top: 1px solid var(--border-soft);
13006
+ padding-top: 14px;
13007
+ }
13008
+ .bd-feedback-chat-override > h4 { margin: 0 0 4px; }
13009
+ .bd-feedback-chat-override > .hint { margin: 0; }
12974
13010
  :root[data-theme="dark"] .bd-tile textarea,
12975
13011
  :root[data-theme="dark"] .bd-tile input[type=text],
12976
13012
  :root[data-theme="dark"] .bd-tile input[type=number] {
@@ -23601,6 +23637,24 @@ dialog select[multiple]:hover:not(:disabled) {
23601
23637
  resize: vertical;
23602
23638
  }
23603
23639
 
23640
+ .bot-defaults-page .bd-owner-reminder-states {
23641
+ display: grid;
23642
+ grid-template-columns: repeat(2, minmax(0, 1fr));
23643
+ gap: 8px 12px;
23644
+ }
23645
+
23646
+ .bot-defaults-page .bd-owner-reminder-states label {
23647
+ display: flex;
23648
+ align-items: center;
23649
+ gap: 7px;
23650
+ color: var(--text);
23651
+ font-size: 13px;
23652
+ }
23653
+
23654
+ @media (max-width: 620px) {
23655
+ .bot-defaults-page .bd-owner-reminder-states { grid-template-columns: 1fr; }
23656
+ }
23657
+
23604
23658
  .bot-defaults-page .bd-tile input[type="text"]:not([type=checkbox]):not([type=radio]):not([type=range]):not([type=color]):not([type=file]):not([type=submit]):not([type=button]),
23605
23659
  .bot-defaults-page .bd-tile input[type="number"]:not([type=checkbox]):not([type=radio]):not([type=range]):not([type=color]):not([type=file]):not([type=submit]):not([type=button]) {
23606
23660
  width: 100%;
@@ -27642,3 +27696,1945 @@ button.skills-issue-badge:hover {
27642
27696
  .feedback-more { margin-top: 12px; }
27643
27697
  @media (max-width: 1100px) { .feedback-kpis { grid-template-columns: repeat(3, 1fr); } .feedback-deliveries > div { grid-template-columns: 1fr 1fr; } }
27644
27698
  @media (max-width: 700px) { .feedback-kpis, .feedback-grid { grid-template-columns: 1fr; } }
27699
+ /* Agent Workbench — reader-flavoured terminal surface: no gradients, no decorative
27700
+ rules, and independent from the Dashboard card/aurora vocabulary.
27701
+ 段内三条硬约束,改之前先读:
27702
+ ① 实线只给白名单五类(内容区↔固定工具条的功能性边界、chip 的 1px 亮环、脱离
27703
+ 文档流的浮层外圈、:focus-visible 焦点环、选中态的 accent 内投影),颜色只能
27704
+ 取 var(--border-keep);其余一律 border: 0,分层交给 --bg-l0..l3 的色差和留白。
27705
+ ② 每一个 border-radius 只能是 var(--radius-sm|md|lg|full) / 0 / 50%,裸像素值
27706
+ 是漂移 bug,样式契约测试(test/agent-workbench-style.test.ts)会拦。
27707
+ ③ 段内零渐变、零装饰阴影;只有浮层用 --shadow-pop。 */
27708
+ .workbench-route-host,
27709
+ .workbench-route-host > #root {
27710
+ width: 100%;
27711
+ height: 100%;
27712
+ min-height: 0;
27713
+ overflow: hidden;
27714
+ }
27715
+
27716
+ /* #root inherits the Dashboard route padding (12px 32px 24px 0) plus a -32px
27717
+ right margin, which inset the Workbench and left it short of the viewport.
27718
+ The Workbench draws its own edges, so clear both inside this host only. */
27719
+ .workbench-route-host > #root,
27720
+ .workbench-route-host .agent-workbench-page,
27721
+ .workbench-route-host .agent-workbench-dock {
27722
+ padding: 0;
27723
+ margin: 0;
27724
+ }
27725
+
27726
+ /* 配色令牌 = 四层底 + 三档文字 + 语义色。四层底之间的亮度差控制在 1.08–1.5:
27727
+ 低于 1.02 看不见,高于 1.6 就读成「块」而不是「层」。
27728
+ L0 页面底 · L1 侧栏 / 顶栏 · L2 卡片 / 面板 / 浮层 / 按钮组底板 · L3 选中 & 悬浮。
27729
+ hover 与 selected 共用 L3,靠 accent 竖条和标题色区分,不再引入第五档灰。
27730
+ --term-bg 是第五个特例层:与 L0 同色相再暗一档,且 L0 ↔ term-bg 对比度必须 ≥1.15
27731
+ —— 面板不画描边,边界全靠「留白 + 圆角 + 画布底色」表达,这条不达标就等于没有边界。
27732
+ 三档文字在 L0/L1/L2/L3 四个底上全部 ≥4.5:1(WCAG AA)。
27733
+ 本块是深色族默认皮肤 slate-blue,没有 data-skin 时也自洽。 */
27734
+ .agent-workbench-page,
27735
+ .agent-workbench-dock {
27736
+ --bg-l0: #141922;
27737
+ --bg-l1: #19212c;
27738
+ --bg-l2: #202a36;
27739
+ --bg-l3: #333f4e;
27740
+ --text-1: #e4ebf2;
27741
+ --text-2: #afbecd;
27742
+ --text-3: #a2b2c3;
27743
+ --accent: #6fcbf7;
27744
+ --ok: #63d6a0;
27745
+ --warn: #edb95c;
27746
+ --err: #f58a94;
27747
+ /* 白名单之外一律 border: 0,这一个色只给白名单五类线用(见下面的实线白名单)。 */
27748
+ --border-keep: #2e3a48;
27749
+ --on-accent: #141922;
27750
+ --term-bg: #030407;
27751
+ --badge-todo: #e6edf4;
27752
+ /* 浮层是唯一保留阴影的东西:它会盖在任意背景上,没有阴影就和背景粘住。
27753
+ 面板 / 卡片一律无阴影 —— 深色底上的黑阴影只糊边、出不了层次。 */
27754
+ --shadow-pop: 0 8px 24px rgba(0, 0, 0, .5);
27755
+ color-scheme: dark;
27756
+
27757
+ /* —— 历史令牌 → 上面这套的映射 ——
27758
+ 段内还有约 50 处样式读 --wb-*,映射之后换皮肤只改上面一段,不会漏掉任何一处,
27759
+ 也不用把 1200 行样式逐条改写。新写的规则一律直接读新令牌。
27760
+ 三档线(--wb-border / -strong / --wb-divider)并成一档并已无引用:删线之后剩下的
27761
+ 都是白名单里的功能线,不需要「更重 / 更轻」的分级;--wb-surface* 同理,分层统一
27762
+ 由 --bg-l0..l3 表达。两组名字都不再保留。
27763
+ 语义色的 *-soft 底改成 12% 透明叠加:固定的深色 soft 值换皮肤时会撞色相。 */
27764
+ --wb-bg: var(--bg-l0);
27765
+ --wb-text: var(--text-1);
27766
+ --wb-muted: var(--text-2);
27767
+ --wb-faint: var(--text-3);
27768
+ --wb-accent: var(--accent);
27769
+ --wb-success: var(--ok);
27770
+ --wb-success-soft: color-mix(in srgb, var(--ok) 12%, transparent);
27771
+ --wb-warning: var(--warn);
27772
+ --wb-warning-soft: color-mix(in srgb, var(--warn) 12%, transparent);
27773
+ --wb-danger: var(--err);
27774
+ --wb-focus: var(--accent);
27775
+ /* 圆角改读全站统一的三档 + full(见 :root 的 --radius-*):原来工作台自带的四级
27776
+ 令牌(4/8/10/12)尺度差太小、视觉读数差很大,一屏之内四个值肉眼像随机;10 与 12
27777
+ 的差别更是分不出来,只制造不确定感。工作台段内已无 --wb-radius-* 的引用。 */
27778
+ /* 触控目标下限:桌面 28px,(hover: none) 下整体提到 44px。尺寸只写一次,
27779
+ 媒体查询只改这个令牌的值,避免同一个高度被四处规则反复重定义。 */
27780
+ --touch-target: 28px;
27781
+ /* 终端渲染风格的三个可继承变量,由 .wb-term-classic / .wb-term-reader 覆盖;
27782
+ 挂在任意祖先上都生效(继承),iframe 内的取值由 TS 侧读这里再 postMessage 下发。
27783
+ 默认取 classic(现状渲染)。 */
27784
+ --term-pad: 4px 8px 8px 8px;
27785
+ --term-line-height: 1;
27786
+ --term-font-size: 12px;
27787
+ color: var(--text-1);
27788
+ background: var(--bg-l0);
27789
+ font: 12px/1.4 var(--mono);
27790
+ }
27791
+
27792
+ /* 浅色族:分层方向反转但规则不变 —— L0 最灰、L2 纯白(卡片浮起)、L3 带蓝调向下沉
27793
+ (浅色里「被按下」必须变暗才有语义)。--term-bg 是唯一不跟着反转的令牌:终端内容是
27794
+ 彩色 ANSI,浅底会毁掉前景色可读性,业界通行做法就是留深色画布。 */
27795
+ :root[data-theme="light"] .agent-workbench-page,
27796
+ :root[data-theme="light"] .agent-workbench-dock {
27797
+ --bg-l0: #e8ecf1;
27798
+ --bg-l1: #f3f6f9;
27799
+ --bg-l2: #ffffff;
27800
+ --bg-l3: #c9d7e8;
27801
+ --text-1: #131820;
27802
+ --text-2: #3b4855;
27803
+ --text-3: #46525f;
27804
+ --accent: #0b5f8f;
27805
+ --ok: #0f6141;
27806
+ --warn: #6b4904;
27807
+ --err: #9e2531;
27808
+ --border-keep: #c2cdda;
27809
+ --on-accent: #ffffff;
27810
+ --term-bg: #16202b;
27811
+ --badge-todo: #1b2430;
27812
+ /* 浅色下阴影带蓝调,纯黑阴影在白底上会发灰。 */
27813
+ --shadow-pop: 0 8px 24px rgba(20, 30, 45, .16);
27814
+ color-scheme: light;
27815
+ }
27816
+
27817
+ /* 四套皮肤。分工:mode(现有的明暗机制)决定明暗族,data-skin 决定族内配色;
27818
+ light-frost 属 light 族,其余三套属 dark 族,跟随系统时在「用户最后选的深色皮肤」
27819
+ 与 light-frost 之间切换。
27820
+ 皮肤只重定义上面那组工作台令牌,不动全站任何变量,也不写 data-theme —— 明暗仲裁
27821
+ 仍归 ui.ts 的 applyTheme 管,工作台再插一手必打架。
27822
+ 放在浅色块之后:两者特异性相同,显式选中的皮肤要赢过「浅色族」的兜底。 */
27823
+ :root[data-skin="ink"] .agent-workbench-page,
27824
+ :root[data-skin="ink"] .agent-workbench-dock {
27825
+ /* 完全中性的灰阶外壳,彩色预算只服务状态与身份。L1↔L3 只有 1.46:L3 被 --text-3
27826
+ 的 AA 4.53 顶死,抬不动,四套里只有这套付这个代价。 */
27827
+ --bg-l0: #181818;
27828
+ --bg-l1: #212121;
27829
+ --bg-l2: #2b2b2b;
27830
+ --bg-l3: #3c3c3c;
27831
+ --text-1: #ededed;
27832
+ --text-2: #b8b8b8;
27833
+ --text-3: #a6a6a6;
27834
+ --accent: #ff8b63;
27835
+ --ok: #3ed598;
27836
+ --warn: #efc260;
27837
+ --err: #ff8c8f;
27838
+ --border-keep: #3f3f3f;
27839
+ --on-accent: #181818;
27840
+ --term-bg: #030303;
27841
+ --badge-todo: #eaeaea;
27842
+ --shadow-pop: 0 8px 24px rgba(0, 0, 0, .55);
27843
+ color-scheme: dark;
27844
+ }
27845
+
27846
+ :root[data-skin="slate-blue"] .agent-workbench-page,
27847
+ :root[data-skin="slate-blue"] .agent-workbench-dock {
27848
+ /* 默认皮肤:保留产品现有的蓝黑品牌感,只收紧色相、按新分层重排台阶、把 meta
27849
+ 文字提到 AA。与上面的基准块同值,显式选中时也要能压过浅色兜底。 */
27850
+ --bg-l0: #141922;
27851
+ --bg-l1: #19212c;
27852
+ --bg-l2: #202a36;
27853
+ --bg-l3: #333f4e;
27854
+ --text-1: #e4ebf2;
27855
+ --text-2: #afbecd;
27856
+ --text-3: #a2b2c3;
27857
+ --accent: #6fcbf7;
27858
+ --ok: #63d6a0;
27859
+ --warn: #edb95c;
27860
+ --err: #f58a94;
27861
+ --border-keep: #2e3a48;
27862
+ --on-accent: #141922;
27863
+ --term-bg: #030407;
27864
+ --badge-todo: #e6edf4;
27865
+ --shadow-pop: 0 8px 24px rgba(0, 0, 0, .5);
27866
+ color-scheme: dark;
27867
+ }
27868
+
27869
+ :root[data-skin="warm-graphite"] .agent-workbench-page,
27870
+ :root[data-skin="warm-graphite"] .agent-workbench-dock {
27871
+ /* 灰阶往暖里偏(色相约 40°、极低饱和),长时间盯屏比纯中性灰舒服。
27872
+ accent 与 --warn 同族,所以 warn 状态在这套里要靠形状而不只是颜色区分。 */
27873
+ --bg-l0: #1b1912;
27874
+ --bg-l1: #24211a;
27875
+ --bg-l2: #2e2b22;
27876
+ --bg-l3: #443e34;
27877
+ --text-1: #f0ebe1;
27878
+ --text-2: #c2baac;
27879
+ --text-3: #b3aa9c;
27880
+ --accent: #f2a33c;
27881
+ --ok: #5fce9b;
27882
+ --warn: #eac14f;
27883
+ --err: #ff9186;
27884
+ --border-keep: #453f35;
27885
+ --on-accent: #1b1912;
27886
+ --term-bg: #040402;
27887
+ --badge-todo: #f2ede3;
27888
+ --shadow-pop: 0 8px 24px rgba(0, 0, 0, .55);
27889
+ color-scheme: dark;
27890
+ }
27891
+
27892
+ :root[data-skin="light-frost"] .agent-workbench-page,
27893
+ :root[data-skin="light-frost"] .agent-workbench-dock {
27894
+ /* 浅色族唯一的一套。选中台阶做到 1.35(现行浅色只有 1.14,几乎等于没有)。 */
27895
+ --bg-l0: #e8ecf1;
27896
+ --bg-l1: #f3f6f9;
27897
+ --bg-l2: #ffffff;
27898
+ --bg-l3: #c9d7e8;
27899
+ --text-1: #131820;
27900
+ --text-2: #3b4855;
27901
+ --text-3: #46525f;
27902
+ --accent: #0b5f8f;
27903
+ --ok: #0f6141;
27904
+ --warn: #6b4904;
27905
+ --err: #9e2531;
27906
+ --border-keep: #c2cdda;
27907
+ --on-accent: #ffffff;
27908
+ --term-bg: #16202b;
27909
+ --badge-todo: #1b2430;
27910
+ --shadow-pop: 0 8px 24px rgba(20, 30, 45, .16);
27911
+ color-scheme: light;
27912
+ }
27913
+
27914
+ .agent-workbench-page *,
27915
+ .agent-workbench-dock * { box-sizing: border-box; }
27916
+
27917
+ /* 删线的前置:Dashboard 的全局裸元素规则(`button, .btn-link { border: 1px … }`、
27918
+ 给所有 select 塞箭头槽的那条)特异性只有 (0,0,1),会直接漏进工作台 —— 只删
27919
+ .wb-* 自己的描边,线不会消失。这条 reset 用 :where() 保持 0 特异性外壳,选择器
27920
+ 实际权重与那些全局规则相同、位置更靠后,于是稳压一头,而任何 .wb-* 规则(≥0,1,0)
27921
+ 都能照常覆盖它。 */
27922
+ :where(.agent-workbench-page, .agent-workbench-dock) :is(button, select, input, textarea) {
27923
+ border: 0;
27924
+ border-radius: var(--radius-md);
27925
+ min-height: 0;
27926
+ box-shadow: none;
27927
+ }
27928
+
27929
+ .agent-workbench-page button,
27930
+ .agent-workbench-page input,
27931
+ .agent-workbench-page a,
27932
+ .agent-workbench-dock button,
27933
+ .agent-workbench-dock input,
27934
+ .agent-workbench-dock a {
27935
+ font: inherit;
27936
+ }
27937
+
27938
+ /* 控件基线:所有按钮和链接一律 10px(md 档)。更小的徽标 / chip 在下面单独降到
27939
+ 6px,面板级容器升到 14px。过渡放在这里统一给:底色、描边、文字三者一起走
27940
+ 140ms ease-out,悬浮态不再是瞬间跳变;prefers-reduced-motion 那条 !important
27941
+ 会整体关掉。 */
27942
+ .agent-workbench-page button,
27943
+ .agent-workbench-dock button,
27944
+ .agent-workbench-page a,
27945
+ .agent-workbench-dock a {
27946
+ border-radius: var(--radius-md);
27947
+ transition: background-color .14s ease-out, border-color .14s ease-out, color .14s ease-out;
27948
+ }
27949
+
27950
+ .agent-workbench-page button:focus-visible,
27951
+ .agent-workbench-page a:focus-visible,
27952
+ .agent-workbench-page input:focus-visible,
27953
+ .agent-workbench-dock button:focus-visible,
27954
+ .agent-workbench-dock a:focus-visible,
27955
+ .agent-workbench-dock input:focus-visible {
27956
+ outline: 2px solid var(--wb-focus);
27957
+ outline-offset: -1px;
27958
+ }
27959
+
27960
+ .wb-visually-hidden {
27961
+ position: absolute;
27962
+ width: 1px;
27963
+ height: 1px;
27964
+ padding: 0;
27965
+ margin: -1px;
27966
+ overflow: hidden;
27967
+ clip: rect(0, 0, 0, 0);
27968
+ white-space: nowrap;
27969
+ border: 0;
27970
+ }
27971
+
27972
+ /* The page is a single full-height region: the brand/status bar that used to
27973
+ own the first row is gone, and the live/offline dot moved into the session
27974
+ list heading. */
27975
+ .agent-workbench-page {
27976
+ display: grid;
27977
+ grid-template-rows: minmax(0, 1fr);
27978
+ width: 100%;
27979
+ height: 100%;
27980
+ min-height: 0;
27981
+ overflow: hidden;
27982
+ }
27983
+
27984
+ .wb-desktop-layout {
27985
+ display: grid;
27986
+ grid-template-columns: var(--wb-rail-width) 6px minmax(0, 1fr);
27987
+ min-height: 0;
27988
+ overflow: hidden;
27989
+ }
27990
+
27991
+ .wb-desktop-layout.is-rail-collapsed {
27992
+ grid-template-columns: var(--wb-rail-width) minmax(0, 1fr);
27993
+ }
27994
+
27995
+ .wb-session-rail {
27996
+ display: grid;
27997
+ grid-template-rows: 38px 38px minmax(0, 1fr);
27998
+ min-width: 0;
27999
+ min-height: 0;
28000
+ /* 分栏不画竖线:会话栏是 L1、终端画布是 term-bg,中间隔一条 6px 透明握把带,
28001
+ 靠底色差 + 留白分区。原来这里一条 border-right、握把带一整条实色、面板再一圈
28002
+ 描边,7 个 CSS 像素里挤了三条不同灰度的竖线。 */
28003
+ border: 0;
28004
+ background: var(--bg-l1);
28005
+ overflow: hidden;
28006
+ }
28007
+
28008
+ .wb-session-rail.is-collapsed {
28009
+ position: relative;
28010
+ display: flex;
28011
+ align-items: stretch;
28012
+ width: 40px;
28013
+ }
28014
+
28015
+ .wb-rail-expand {
28016
+ display: flex;
28017
+ flex: 1;
28018
+ flex-direction: column;
28019
+ align-items: center;
28020
+ gap: 10px;
28021
+ padding: 9px 0;
28022
+ border: 0;
28023
+ color: var(--wb-muted);
28024
+ background: transparent;
28025
+ cursor: pointer;
28026
+ }
28027
+
28028
+ .wb-rail-expand:hover { color: var(--text-1); background: var(--bg-l3); }
28029
+ .wb-rail-expand:not(button) { cursor: default; }
28030
+ .wb-rail-vertical-label { writing-mode: vertical-rl; letter-spacing: .14em; font-size: 11px; }
28031
+ /* 待办计数:近白实心 + L1 深字,不再是一圈红描边。计数徽章只分两档 —— 待办用这套
28032
+ 实心,中性计数用 --bg-l3 底 + --text-3 字,中间不设第三档。 */
28033
+ .wb-rail-count {
28034
+ position: absolute;
28035
+ right: 6px;
28036
+ bottom: 8px;
28037
+ min-width: 18px;
28038
+ padding: 2px 3px;
28039
+ border: 0;
28040
+ border-radius: var(--radius-sm);
28041
+ color: var(--bg-l1);
28042
+ background: var(--badge-todo);
28043
+ font-weight: 600;
28044
+ text-align: center;
28045
+ }
28046
+
28047
+ /* 栏头不画下沿线:它落在 L1 上、列表也在 L1 上,靠 12px 留白和字重分层就够。
28048
+ 窄屏上通栏线的线长 / 屏宽比接近 1,一条线就横断整个视野。 */
28049
+ .wb-rail-heading {
28050
+ display: flex;
28051
+ align-items: center;
28052
+ /* 左组紧凑排列,只把收起按钮推到最右。原来 space-between 与 .wb-group-dim 自己的
28053
+ margin-left:auto 两套分配机制叠加,中间挂出约 90px 死空白。 */
28054
+ justify-content: flex-start;
28055
+ gap: 8px;
28056
+ /* 左 22 与组头箭头、行状态标同一条线:栏头的 live 圆点原来在 12px,比列表里所有
28057
+ 首字形都往左突出 10px,会话栏左缘于是有 12 / 22 两条参差的线。栏头没有圆角底板、
28058
+ 不受裁切,但既然是同一列的首字形,就该落在同一条基线上。 */
28059
+ padding: 0 12px 0 22px;
28060
+ border: 0;
28061
+ }
28062
+
28063
+ /* 「标题 + 计数」是一个短语,不是两端对齐的表格行:计数紧贴标题 6px。 */
28064
+ .wb-rail-heading > div { display: flex; align-items: center; gap: 6px; letter-spacing: .08em; }
28065
+ .wb-rail-heading > div > span { color: var(--text-3); }
28066
+ .wb-rail-heading > button:last-child { margin-left: auto; }
28067
+ /* Live/last-snapshot state now rides the list heading instead of a page-wide
28068
+ status bar. */
28069
+ .wb-rail-heading .is-online { color: var(--wb-success); }
28070
+ .wb-rail-heading .is-offline { color: var(--wb-danger); }
28071
+ .wb-rail-heading button,
28072
+ .wb-session-search button {
28073
+ width: 24px;
28074
+ height: 24px;
28075
+ padding: 0;
28076
+ border: 0;
28077
+ border-radius: var(--radius-sm);
28078
+ color: var(--text-2);
28079
+ background: transparent;
28080
+ cursor: pointer;
28081
+ }
28082
+ /* 图标按钮的可点性靠一小块 hover 底色表达,不靠描边变色。 */
28083
+ .wb-rail-heading button:hover,
28084
+ .wb-session-search button:hover { color: var(--text-1); background: var(--bg-l3); }
28085
+
28086
+ /* 搜索框改填充式:整圈描边换成 L2 填充,聚焦时才画 2px accent 环(焦点环属白名单)。 */
28087
+ .wb-session-search {
28088
+ display: flex;
28089
+ align-items: center;
28090
+ gap: 5px;
28091
+ /* 左缘对齐:外边距收到 8px,与会话行 / 组头两块 ::before 底板的 8px 内缩线重合
28092
+ (列表左侧只留一条容器线);内边距 14px 让 ⌕ 落在 22px 基线上,且 14 ≥ 圆角
28093
+ 半径 --radius-md(10),字形永远咬不到填充块的弧线。 */
28094
+ margin: 6px 8px 4px;
28095
+ padding: 0 14px;
28096
+ border: 0;
28097
+ border-radius: var(--radius-md);
28098
+ color: var(--text-3);
28099
+ background: var(--bg-l2);
28100
+ }
28101
+
28102
+ .wb-session-search:focus-within { outline: 2px solid var(--accent); outline-offset: -2px; }
28103
+ .wb-session-search input {
28104
+ width: 100%;
28105
+ min-width: 0;
28106
+ height: 26px;
28107
+ padding: 0;
28108
+ border: 0;
28109
+ outline: 0;
28110
+ color: var(--wb-text);
28111
+ background: transparent;
28112
+ }
28113
+ .wb-session-search input::placeholder { color: var(--wb-faint); }
28114
+
28115
+ .wb-session-list {
28116
+ position: relative;
28117
+ min-height: 0;
28118
+ overflow: auto;
28119
+ outline: 0;
28120
+ contain: strict;
28121
+ }
28122
+ .wb-session-list:focus-visible { outline: 2px solid var(--wb-focus); outline-offset: -2px; }
28123
+ .wb-session-list-space { position: relative; width: 100%; }
28124
+ .wb-session-group,
28125
+ .wb-session-row { position: absolute; left: 0; width: 100%; }
28126
+ .wb-session-group {
28127
+ display: grid;
28128
+ grid-template-columns: 14px 1fr auto;
28129
+ align-items: center;
28130
+ gap: 4px;
28131
+ /* 组头的折叠箭头必须和它下面那些行的状态标共用一条竖直基线,所以左右内边距跟着
28132
+ .wb-session-row 走(22 / 14),不再是自己的一份 9px。
28133
+ ⚠️ 组头**渲染时永远带 .wb-session-group-toggle**,真正生效的是下面那条
28134
+ `.wb-session-group.wb-session-group-toggle`(特异性 0,2,0 压过这里的 0,1,0)。
28135
+ 改内边距必须两处一起改,只改这里等于什么都没改 —— 上一轮就是这么漏的,
28136
+ agent-workbench-style.test.ts 现在按「两条规则的左右内边距必须相等」钉住。 */
28137
+ padding: 5px 14px 3px 22px;
28138
+ color: var(--text-3);
28139
+ font-size: 11px;
28140
+ letter-spacing: .09em;
28141
+ }
28142
+ .wb-session-group-needs-you { color: var(--wb-danger); }
28143
+ .wb-session-group-active { color: var(--wb-success); }
28144
+
28145
+ .wb-session-row {
28146
+ display: grid;
28147
+ grid-template-columns: 14px minmax(0, 1fr);
28148
+ align-items: center;
28149
+ gap: 4px;
28150
+ /* 左内边距 22 = 高亮底板左缘(::before 的 inset 左 8)+ 圆角半径(--radius-lg 14)。
28151
+ 原来是 8px,正好等于底板左缘 —— 状态标那一格距底板左缘 0px,字形直接压在圆角
28152
+ 边界上,选中态那条 2px accent 内影更是从字形上横穿过去,读起来就是「行首被切掉
28153
+ 一块」。规范的既有结论是「文字左内边距 ≥ 圆角半径」,这里把它补齐。
28154
+ 右 14 同理留出弧线余量:meta 行的时间戳贴在右内边距上,它的字形底部落在底板下方
28155
+ 圆角的水平带里,8px 已经只剩 5.6px 净空,再窄就会啃到弧线。
28156
+ 上下 5(原 6):省出来的 2px 给标题撑行框用,算式见下面
28157
+ `.wb-session-row .wb-session-title`。行总高仍是 54px,虚拟滚动契约不受影响;
28158
+ 内容在行里是 align-items:center 居中的,少 1px 内边距不改变它的视觉位置。 */
28159
+ padding: 5px 14px 5px 22px;
28160
+ /* 每行一条通栏横线原本一屏 18 条,还横穿圆角高亮底板,把药丸上下切平。整条删掉,
28161
+ 行间关系交给留白节奏(项间留白 ÷ 项内行距 ≥ 2.5)+ 分组组头 + 选中底板。
28162
+ 选中态的 accent 竖条也不再是 border-left(方头、和圆角底板中间夹 5px 缝),
28163
+ 并进 ::before 的 inset box-shadow,跟着 14px 圆角走。 */
28164
+ border: 0;
28165
+ color: var(--wb-text);
28166
+ background: transparent;
28167
+ text-align: left;
28168
+ cursor: pointer;
28169
+ }
28170
+ /* Hover is the row's only affordance now that the title no longer underlines,
28171
+ so it has to be legible on its own: surface-3 is a clear step up from the
28172
+ rail's own surface, where surface-2 was almost invisible against it. Hover
28173
+ stays neutral grey and selection stays the accent blue plus the left bar, so
28174
+ the two states never read as the same thing. */
28175
+ /* 高亮不再铺满整行:::before 是一块四周留白的圆角底板,行本身始终保持透明。
28176
+ 四点说明,动之前先读:
28177
+ ① inset 是相对行的 padding box 量的,所以底板天然让开左侧 2px 的选中条和底部
28178
+ 1px 的分隔线,两者不会被圆角切到;
28179
+ ② z-index:-1 让底板落到内容之下。.wb-session-list 的 contain:strict 本身就是
28180
+ 层叠上下文,负层只会压在这个列表自己的(透明)底色之上,掉不到会话栏的
28181
+ --wb-surface 背景后面去,所以高亮照常可见;
28182
+ ③ 刻意不给 .wb-session-row 加 position/z-index —— .wb-session-copy-link::after
28183
+ 那层撑满整行的点击区拿它当包含块,动一下整行可点就没了;
28184
+ ④ 行高(54 / 84)、padding、grid 列都没动,底板只是画上去的一层,虚拟滚动的
28185
+ 摆放模型完全不受影响。 */
28186
+ .wb-session-row::before {
28187
+ content: '';
28188
+ position: absolute;
28189
+ z-index: -1;
28190
+ inset: 2px 8px;
28191
+ border-radius: var(--radius-lg);
28192
+ background: transparent;
28193
+ transition: background-color .14s ease-out;
28194
+ }
28195
+ /* hover 与 selected 共用 L3:区分靠形状和颜色(accent 竖条 + accent 标题),
28196
+ 不靠又一个几乎相同的灰。多一档而不可辨 = 噪声。 */
28197
+ .wb-session-row:hover::before { background: var(--bg-l3); }
28198
+ .wb-session-row.is-selected::before {
28199
+ background: var(--bg-l3);
28200
+ box-shadow: inset 2px 0 0 var(--accent);
28201
+ }
28202
+ .wb-session-row.is-selected .wb-session-title { color: var(--accent); }
28203
+ .wb-session-row-needs-you .wb-session-state-mark { color: var(--wb-danger); }
28204
+ .wb-session-row-active .wb-session-state-mark { color: var(--wb-success); }
28205
+ .wb-session-row-recent .wb-session-state-mark { color: var(--wb-faint); }
28206
+ .wb-session-copy { display: grid; min-width: 0; gap: 4px; }
28207
+ /* Row-as-link: same cell, but a real anchor so chat-follow opens on the
28208
+ user's own trusted click instead of a scripted one. The ::after overlay
28209
+ stretches the anchor's hit area across the whole row (state dot and blank
28210
+ space included); the action buttons sit above it and keep working.
28211
+ The row reads as a list item, not as body copy with a hyperlink in it, so it
28212
+ never underlines: hover is carried entirely by .wb-session-row:hover's
28213
+ background. Keep the anchor undecorated in every state — the UA underlines
28214
+ a[href] by default, and the Dashboard's global chrome adds `… a:hover`
28215
+ rules that would otherwise reach in here. */
28216
+ .wb-session-copy-link { color: inherit; text-decoration: none; cursor: pointer; }
28217
+ .wb-session-copy-link::after { content: ''; position: absolute; inset: 0; }
28218
+ .wb-session-copy-link:link,
28219
+ .wb-session-copy-link:visited,
28220
+ .wb-session-copy-link:hover,
28221
+ .wb-session-copy-link:focus,
28222
+ .wb-session-copy-link:active,
28223
+ .wb-session-copy-link * { text-decoration: none; }
28224
+ .wb-session-copy-link:focus-visible { outline: 1px solid currentColor; outline-offset: -1px; }
28225
+ /* ⚠️ 单行省略号截断 = overflow:hidden,而 hidden 是按**盒子**裁的,连字形一起裁。
28226
+ 一行文字的内容盒高度就是行框(line-height),字形却按字体自己的 em 盒画:实测
28227
+ (Chromium + 中文回退字体)12px 字号下 fontBoundingBoxAscent 11px + Descent 3px
28228
+ = 14px,而「查 / 看 / 后」这类汉字的 actualBoundingBoxAscent 就是 11px —— 墨迹
28229
+ 顶到 em 盒上沿,一格不剩。line-height 只有 1.3(15.6px)时半行距 (15.6−14)/2 =
28230
+ 0.8px,逐像素扫出来的净空更是只剩 0.13px:字形上沿的横笔画正压在裁切线上。
28231
+ 换成 em 盒更高的中文字体(PingFang SC ≈ 1.4em = 16.8px > 15.6px)半行距直接变负,
28232
+ 上沿被整齐削平 —— 线上反馈的「查看」被切就是这个。
28233
+ 所以本段所有截断文字统一两件事:① 行框放宽到 ≥ 1.4em;② 再各留 1px 上下内边距。
28234
+ 内边距是关键:它把**裁切框**(padding box)撑得比行框大,净空不再取决于字体度量,
28235
+ 换任何一套中文字体都还剩 ≥1px。改这些数之前先跑 glyphscan 逐像素体检。 */
28236
+ .wb-session-title { overflow: hidden; color: var(--wb-text); font-weight: 700; text-overflow: ellipsis; white-space: nowrap; }
28237
+ .wb-session-meta { display: flex; justify-content: space-between; gap: 6px; min-width: 0; color: var(--text-3); font-size: 11px; }
28238
+ /* meta 行每一格都是 flex 拉伸项,高度由行里最高的那个(徽标 18px)定;给它们加
28239
+ 1px 上下内边距只是把行框在**既有高度内**往里缩,meta 行总高不变,不吃预算。 */
28240
+ .wb-session-meta > span:not(.wb-session-kind) {
28241
+ overflow: hidden;
28242
+ padding-block: 1px;
28243
+ text-overflow: ellipsis;
28244
+ white-space: nowrap;
28245
+ }
28246
+ .wb-session-meta time { flex: none; padding-block: 1px; }
28247
+ .wb-session-reason { color: var(--wb-warning); }
28248
+ .wb-session-empty { position: absolute; inset: 60px 8px auto; color: var(--wb-faint); text-align: center; }
28249
+
28250
+ /* 分栏带整条透明,只留中间一颗握把。原来这 5px 是一条实色带(比会话栏底色还亮,
28251
+ 读起来是「凸起的亮带」而不是分隔线),注释说已经改成细带 + 握把,代码没跟上。
28252
+ 握把就是原来那个 ⋮ span(父级 color 已经是 transparent,字形本来就不显示),
28253
+ 给它固定尺寸当色块用,不新增任何 DOM。 */
28254
+ .wb-rail-separator {
28255
+ z-index: 2;
28256
+ display: grid;
28257
+ place-items: center;
28258
+ width: 6px;
28259
+ min-width: 6px;
28260
+ padding: 0;
28261
+ border: 0;
28262
+ color: transparent;
28263
+ background: transparent;
28264
+ cursor: col-resize;
28265
+ }
28266
+ .wb-rail-separator > span {
28267
+ display: block;
28268
+ width: 3px;
28269
+ height: 28px;
28270
+ border-radius: var(--radius-full);
28271
+ background: var(--border-keep);
28272
+ overflow: hidden;
28273
+ transition: background-color .14s ease-out;
28274
+ }
28275
+ .wb-rail-separator:hover,
28276
+ .wb-rail-separator:focus-visible { color: transparent; background: transparent; }
28277
+ .wb-rail-separator:hover > span,
28278
+ .wb-rail-separator:focus-visible > span { background: var(--text-3); }
28279
+
28280
+ /* Two children, two rows: the header and the pane stack. Leaving the old
28281
+ toolbar/chat-contract rows in place pushed the stack into an `auto` track,
28282
+ which is why the terminal iframe collapsed to its 150px intrinsic height. */
28283
+ .wb-workspace {
28284
+ position: relative;
28285
+ display: grid;
28286
+ grid-template-rows: 46px minmax(0, 1fr);
28287
+ min-width: 0;
28288
+ min-height: 0;
28289
+ overflow: hidden;
28290
+ background: var(--wb-bg);
28291
+ }
28292
+ .wb-workspace-header {
28293
+ display: flex;
28294
+ align-items: center;
28295
+ justify-content: space-between;
28296
+ gap: 10px;
28297
+ min-width: 0;
28298
+ padding: 0 16px;
28299
+ /* 保留线①(白名单第 1 类):线两侧一边会滚动、一边不会,这个语义色差表达不了。
28300
+ 必须满出血、左右不缩进 —— 缩进的线会读成装饰。 */
28301
+ border: 0;
28302
+ border-bottom: 1px solid var(--border-keep);
28303
+ background: var(--bg-l0);
28304
+ }
28305
+ .wb-workspace-title { display: flex; align-items: center; gap: 8px; min-width: 0; }
28306
+ .wb-workspace-title > span:last-child { display: grid; min-width: 0; }
28307
+ /* 工作区头部的会话名与副行:同样是单行省略号截断,同样按裁切框留净空。
28308
+ 副行 small 只有 10px 字号、行框 14px,是全段最挤的一处(实测上沿净空 0.44px),
28309
+ 所以除了 1px 内边距还把行框显式提到 1.5。头部高 46px,两行加起来 34.5px,够。 */
28310
+ .wb-workspace-title strong {
28311
+ overflow: hidden;
28312
+ max-width: 58vw;
28313
+ padding-block: 1px;
28314
+ text-overflow: ellipsis;
28315
+ white-space: nowrap;
28316
+ }
28317
+ .wb-workspace-title small {
28318
+ overflow: hidden;
28319
+ padding-block: 1px;
28320
+ color: var(--wb-muted);
28321
+ line-height: 1.5;
28322
+ text-overflow: ellipsis;
28323
+ white-space: nowrap;
28324
+ }
28325
+ .wb-bot-mark {
28326
+ display: grid;
28327
+ place-items: center;
28328
+ width: 25px;
28329
+ height: 25px;
28330
+ flex: none;
28331
+ border: 0;
28332
+ /* 25px 的身份方块按「圆角图标」处理,比徽标再圆一档;描边换成 L3 底。 */
28333
+ border-radius: var(--radius-md);
28334
+ background: var(--bg-l3);
28335
+ color: var(--accent);
28336
+ font-weight: 800;
28337
+ }
28338
+ /* 标签的 1px 亮环(白名单第 2 类):在无边框环境里,chip 靠这圈比填充更亮的环
28339
+ 跳出来,不靠底色。字号不低于 11px。 */
28340
+ .wb-layout-level {
28341
+ flex: none;
28342
+ padding: 2px 6px;
28343
+ border: 1px solid var(--border-keep);
28344
+ border-radius: var(--radius-sm);
28345
+ color: var(--text-2);
28346
+ font-size: 11px;
28347
+ letter-spacing: .04em;
28348
+ }
28349
+
28350
+ .wb-pane-toolbar {
28351
+ display: flex;
28352
+ align-items: center;
28353
+ gap: 5px;
28354
+ min-width: 0;
28355
+ padding: 4px 7px;
28356
+ border: 0;
28357
+ background: var(--bg-l2);
28358
+ overflow-x: auto;
28359
+ }
28360
+ .wb-toolbar-group { display: inline-flex; gap: 2px; padding-right: 5px; border: 0; }
28361
+ .wb-toolbar-spacer { flex: 1; }
28362
+ .wb-pane-toolbar button,
28363
+ .wb-pane-actions button,
28364
+ .wb-pane-actions a,
28365
+ .wb-dock-action-grid button,
28366
+ .wb-dock-action-grid a,
28367
+ .wb-dock-action-grid span,
28368
+ .wb-primary-action {
28369
+ display: inline-flex;
28370
+ align-items: center;
28371
+ justify-content: center;
28372
+ gap: 5px;
28373
+ min-height: 25px;
28374
+ padding: 2px 8px;
28375
+ /* 次级按钮一律裸排:无描边、无常态底色,只有 hover 才显 L3 底。三个描边框并排的
28376
+ 视觉重量之和会超过唯一的主行动按钮,主次就此失守。 */
28377
+ border: 0;
28378
+ border-radius: var(--radius-md);
28379
+ color: var(--text-2);
28380
+ background: transparent;
28381
+ text-decoration: none;
28382
+ white-space: nowrap;
28383
+ cursor: pointer;
28384
+ }
28385
+ .wb-pane-toolbar button:hover,
28386
+ .wb-pane-actions button:hover,
28387
+ .wb-pane-actions a:hover,
28388
+ .wb-dock-action-grid button:hover,
28389
+ .wb-dock-action-grid a:hover { color: var(--text-1); background: var(--bg-l3); }
28390
+ .wb-pane-toolbar button.is-active { color: var(--accent); background: var(--bg-l3); }
28391
+ .wb-pane-toolbar button:disabled,
28392
+ .wb-pane-actions button:disabled { opacity: .5; cursor: not-allowed; }
28393
+
28394
+ .wb-chat-contract {
28395
+ display: grid;
28396
+ grid-template-columns: 14px max-content minmax(0, 1fr);
28397
+ align-items: center;
28398
+ gap: 6px;
28399
+ padding: 0 8px;
28400
+ border: 0;
28401
+ color: var(--text-3);
28402
+ font-size: 11px;
28403
+ overflow: hidden;
28404
+ }
28405
+ /* 单行截断同样留净空(理由见 .wb-session-title 那条长注释)。 */
28406
+ .wb-chat-contract > span:last-child { overflow: hidden; padding-block: 1px; text-overflow: ellipsis; white-space: nowrap; }
28407
+ .wb-chat-contract .is-open { color: var(--wb-success); }
28408
+
28409
+ .wb-pane-region { min-width: 0; min-height: 0; padding: 5px; overflow: hidden; }
28410
+ .wb-pane,
28411
+ .wb-pane-split { width: 100%; height: 100%; min-width: 0; min-height: 0; }
28412
+ /* 终端不再是「工作台里的一块卡片」,而是一块屏幕:描边、圆角、外留白、阴影全部去掉,
28413
+ --term-bg 从标题栏以下一路铺到窗口右缘和下缘,最像本机 tmux / iTerm。
28414
+ 原来的「上圆 12px、下方 4px」是同一圈边上下不一致的病根,注释里给的理由(终端页
28415
+ 有 4px 内边距)本身就不成立 —— 工作台 iframe 加载的是 /s/<sessionId>,那个页面
28416
+ 内边距是 0。去掉圆角之后隐患从根上消失。
28417
+ 第二行(反馈行)改 auto:内容为空时整行折叠,省下 25px 和一条线;有内容时照旧。 */
28418
+ .wb-pane {
28419
+ display: grid;
28420
+ grid-template-rows: 34px auto minmax(0, 1fr);
28421
+ border: 0;
28422
+ border-radius: 0;
28423
+ /* 与外壳同一个变量:面板骨架露出来的那几像素也不能是第二种黑。 */
28424
+ background: var(--term-canvas-bg, var(--term-bg));
28425
+ box-shadow: none;
28426
+ overflow: hidden;
28427
+ }
28428
+ .wb-pane-split { display: flex; overflow: hidden; }
28429
+ .wb-pane-split.is-horizontal { flex-direction: row; }
28430
+ .wb-pane-split.is-horizontal > :first-child { flex: 0 0 calc(var(--wb-split-first) - 3px); }
28431
+ .wb-pane-split.is-horizontal > :last-child { flex: 0 0 calc(var(--wb-split-second) - 3px); }
28432
+ .wb-pane-split.is-vertical { flex-direction: column; }
28433
+ .wb-pane-split.is-vertical > :first-child { flex: 0 0 calc(var(--wb-split-first) - 3px); }
28434
+ .wb-pane-split.is-vertical > :last-child { flex: 0 0 calc(var(--wb-split-second) - 3px); }
28435
+ .wb-pane-separator {
28436
+ display: grid;
28437
+ place-items: center;
28438
+ flex: 0 0 6px;
28439
+ padding: 0;
28440
+ border: 0;
28441
+ color: var(--wb-faint);
28442
+ background: var(--wb-bg);
28443
+ }
28444
+ .wb-pane-split.is-horizontal > .wb-pane-separator { cursor: col-resize; }
28445
+ .wb-pane-split.is-vertical > .wb-pane-separator { cursor: row-resize; }
28446
+ .wb-pane-separator:hover,
28447
+ .wb-pane-separator:focus-visible { color: var(--wb-text); background: var(--wb-accent); }
28448
+
28449
+ /* 标题栏贴 L1 上、满出血、无下边线:它与终端画布靠 L1 ↔ term-bg 的色差分层,
28450
+ 这个对比比 L0 ↔ term-bg 更大,四套配色天然满足。模式标签、风格切换、权限说明
28451
+ 都挂在它上面,所以它不能删。 */
28452
+ .wb-pane-titlebar {
28453
+ display: flex;
28454
+ align-items: center;
28455
+ justify-content: space-between;
28456
+ gap: 8px;
28457
+ min-width: 0;
28458
+ padding: 0 8px;
28459
+ border: 0;
28460
+ background: var(--bg-l1);
28461
+ }
28462
+ .wb-pane-identity,
28463
+ .wb-pane-actions { display: flex; align-items: center; gap: 6px; min-width: 0; }
28464
+ .wb-pane-glyph { color: var(--wb-accent); font-weight: 800; }
28465
+ /* 模式标签的 1px 亮环(白名单第 2 类)。字号从 9px 提到 11px —— 11px 以下不用。 */
28466
+ .wb-mode-chip {
28467
+ display: inline-flex;
28468
+ align-items: center;
28469
+ gap: 4px;
28470
+ padding: 1px 6px;
28471
+ border: 1px solid var(--border-keep);
28472
+ border-radius: var(--radius-sm);
28473
+ font-size: 11px;
28474
+ letter-spacing: .06em;
28475
+ }
28476
+ /* 语义态只改字色和 12% 底,不改那圈环的颜色:白名单里的线只允许取 --border-keep,
28477
+ 状态由字色 + 填充说,一处一个说法。 */
28478
+ .wb-mode-chip.is-controlled,
28479
+ .wb-mode-chip.is-interactive { color: var(--ok); background: var(--wb-success-soft); }
28480
+ .wb-mode-chip.is-readonly,
28481
+ .wb-mode-chip.is-preview { color: var(--warn); background: var(--wb-warning-soft); }
28482
+ .wb-lease-time { color: var(--text-3); font-size: 11px; white-space: nowrap; }
28483
+ .wb-pane-feedback {
28484
+ overflow: hidden;
28485
+ padding: 4px 8px;
28486
+ border: 0;
28487
+ color: var(--text-2);
28488
+ background: var(--bg-l1);
28489
+ font-size: 11px;
28490
+ text-overflow: ellipsis;
28491
+ white-space: nowrap;
28492
+ }
28493
+ /* 没有反馈文案时整行让位:grid 的第二轨是 auto,display:none 之后它收成 0。 */
28494
+ .wb-pane-feedback:empty { display: none; }
28495
+ /* 终端画布。三件事:
28496
+ ① 底色读 --term-canvas-bg:那是**这一刻真正渲染出来的 xterm 底色**,由 TS 侧的
28497
+ workbenchTermCanvasStyle() 把 workbenchTermTheme() 的 background 写成内联变量
28498
+ (同一份 theme 也在往终端 iframe 里推,所以外壳和画布永远同源同色)。
28499
+ 只读 --term-bg 的老写法在经典渲染下必然露边:经典 xterm 的底是它自己的
28500
+ #1a1b26,皮肤令牌是 #030407 一类,画布外那圈安全边距就成了一道更黑的框。
28501
+ 变量没设上时回落 --term-bg,与改动前完全一致(网页预览面板走的就是这条)。
28502
+ ② 左安全边距 8px 由这层的 padding 给 —— 外壳和 iframe 同底色,视觉上就是终端本色
28503
+ 铺满,但第 0 列字形不会贴在会话栏色块的交界上被抗锯齿吃掉半个。这条与是否有
28504
+ 圆角要内切无关:没有圆角要躲,不等于可以归零;
28505
+ ③ position: relative 是 .wb-ws-blocked 的定位基准(实时连接被拦时盖在 iframe 上
28506
+ 的那层提示),别去掉。
28507
+ 状态条是 CLI 写进终端缓冲区的 TTY 输出,不是工作台自绘 chrome:不加上沿线、不加
28508
+ 底色,跟着画布走。 */
28509
+ .wb-pane-frame-shell {
28510
+ position: relative;
28511
+ min-height: 0;
28512
+ padding: var(--term-pad);
28513
+ background: var(--term-canvas-bg, var(--term-bg));
28514
+ overflow: hidden;
28515
+ }
28516
+ .wb-pane-frame { display: block; width: 100%; height: 100%; border: 0; background: var(--term-canvas-bg, var(--term-bg)); }
28517
+
28518
+ /* 网页预览面板复用同一套 .wb-pane 骨架,但它装的是普通网页不是终端:底色回到 L2,
28519
+ 也不需要为字形留安全边距。 */
28520
+ .wb-web-pane,
28521
+ .wb-web-pane > .wb-pane-frame-shell { padding: 0; background: var(--bg-l2); }
28522
+ .wb-web-pane .wb-pane-frame { background: var(--bg-l2); }
28523
+
28524
+ /* 终端渲染风格:两套容器 class 只负责几何(行距 / 内边距 / 字号),配色由 TS 侧的
28525
+ 两套 xterm theme 预设承担。class 挂在工作台根或终端面板上都行 —— 下面三个变量是
28526
+ 可继承的,落到 .wb-pane-frame-shell 和 iframe 下发通道上都读得到。
28527
+ classic = 现状渲染(存量零变化),reader(「阅读」)= 规范里更松的行距与更大的呼吸。
28528
+ 两套都保留 8px 左安全边距,这条不因风格而失效。
28529
+ ⚠️ --term-line-height 是 WORKBENCH_TERM_LINE_HEIGHTS(agent-workbench-appearance.ts)
28530
+ 的 CSS 侧副本:真正落到 xterm 上的是终端页那行 term.options.lineHeight,这里只做
28531
+ 声明与查阅。两处必须一字不差,agent-workbench-style.test.ts 按那张表比对。 */
28532
+ .wb-term-classic {
28533
+ --term-pad: 4px 8px 8px 8px;
28534
+ --term-line-height: 1;
28535
+ --term-font-size: 12px;
28536
+ }
28537
+ .wb-term-reader {
28538
+ --term-pad: 6px 8px 8px 8px;
28539
+ --term-line-height: 1.3;
28540
+ --term-font-size: 12px;
28541
+ }
28542
+ .wb-pane-empty {
28543
+ display: grid;
28544
+ place-content: center;
28545
+ justify-items: center;
28546
+ gap: 7px;
28547
+ width: 100%;
28548
+ height: 100%;
28549
+ padding: 20px;
28550
+ color: var(--wb-muted);
28551
+ text-align: center;
28552
+ }
28553
+ .wb-pane-empty > span { color: var(--wb-faint); font-size: 22px; }
28554
+ .wb-pane-empty p { max-width: 460px; margin: 0; color: var(--wb-faint); }
28555
+ .wb-pane-empty a { color: var(--wb-accent); }
28556
+
28557
+ /* 手机端(尤其飞书 iOS 内嵌浏览器)会拦掉 http 页面里 JS 发起的 ws:// 连接:iframe 照常
28558
+ 加载,实时通道却永远连不上,终端区域一片黑。这一层盖在 iframe 上说明情况,iframe 不
28559
+ 卸载,页面自己重连成功后这层就撤掉。底色要不透明,否则下面的黑屏透出来会显得像没盖住。 */
28560
+ .wb-ws-blocked {
28561
+ position: absolute;
28562
+ inset: 0;
28563
+ z-index: 3;
28564
+ /* 这层是不透明的,铺满 .wb-pane-frame-shell。面板已经不带圆角,它跟着收成方角。 */
28565
+ border-radius: 0;
28566
+ background: var(--bg-l1);
28567
+ }
28568
+ .wb-ws-blocked a {
28569
+ display: inline-flex;
28570
+ align-items: center;
28571
+ min-height: 32px;
28572
+ padding: 0 12px;
28573
+ border: 0;
28574
+ border-radius: var(--radius-md);
28575
+ background: var(--bg-l3);
28576
+ }
28577
+ .wb-ws-blocked a:hover { color: var(--accent); }
28578
+ /* 末尾那句「⋯ 菜单」是补充说明,压一号字,别和上面的正文抢注意力 */
28579
+ .wb-ws-blocked p:last-of-type { font-size: 11px; }
28580
+
28581
+ .wb-info-drawer {
28582
+ position: absolute;
28583
+ top: 106px;
28584
+ right: 0;
28585
+ bottom: 0;
28586
+ z-index: 8;
28587
+ width: min(330px, 42%);
28588
+ /* 脱离文档流的浮层(白名单第 3 类):它会盖在任意背景上,底色差不可控,
28589
+ 必须有确定的边缘 + --shadow-pop。 */
28590
+ border: 0;
28591
+ border-left: 1px solid var(--border-keep);
28592
+ /* 抽屉从右边推出来,只有左侧两角露在外面,圆右侧等于圆到屏幕外。 */
28593
+ border-radius: var(--radius-lg) 0 0 var(--radius-lg);
28594
+ background: var(--bg-l2);
28595
+ box-shadow: var(--shadow-pop);
28596
+ overflow: auto;
28597
+ }
28598
+ .wb-info-drawer > header {
28599
+ position: sticky;
28600
+ top: 0;
28601
+ display: flex;
28602
+ align-items: center;
28603
+ justify-content: space-between;
28604
+ height: 34px;
28605
+ padding: 0 8px;
28606
+ /* 抽屉内部「会滚动的内容 ↔ 不滚动的固定头」的功能性边界,白名单第 1 类。 */
28607
+ border: 0;
28608
+ border-bottom: 1px solid var(--border-keep);
28609
+ background: var(--bg-l2);
28610
+ }
28611
+ .wb-info-drawer > header button { width: 25px; height: 25px; border: 0; color: var(--text-1); background: transparent; }
28612
+ .wb-info-drawer > header button:hover { background: var(--bg-l3); }
28613
+ .wb-info-content { padding: 12px; }
28614
+ .wb-info-content h2 { margin: 0 0 12px; color: var(--text-1); font-size: 14px; overflow-wrap: anywhere; }
28615
+ /* 键值表靠留白分行,不靠每行一条线。 */
28616
+ .wb-info-content dl { display: grid; margin: 0; border: 0; }
28617
+ .wb-info-content dl > div { display: grid; grid-template-columns: 92px minmax(0, 1fr); gap: 8px; padding: 7px 0; border: 0; }
28618
+ .wb-info-content dt { color: var(--text-3); }
28619
+ /* 单行截断同样留净空(理由见 .wb-session-title 那条长注释)。 */
28620
+ .wb-info-content dd { margin: 0; overflow: hidden; padding-block: 1px; color: var(--text-2); text-overflow: ellipsis; white-space: nowrap; }
28621
+ .wb-info-note { padding-left: 8px; border: 0; color: var(--text-3); }
28622
+
28623
+ .wb-no-selection {
28624
+ display: grid;
28625
+ grid-template-rows: auto;
28626
+ place-content: center;
28627
+ justify-items: center;
28628
+ color: var(--wb-muted);
28629
+ text-align: center;
28630
+ }
28631
+ .wb-no-selection > span { color: var(--wb-accent); font-size: 34px; }
28632
+ .wb-no-selection h2 { margin: 8px 0 3px; color: var(--wb-text); font-size: 15px; }
28633
+ .wb-no-selection p { margin: 0; color: var(--wb-faint); }
28634
+
28635
+ /* Drill-down, not tabs: the stack renders exactly one in-flow child — the session
28636
+ list at the home level, or .wb-mobile-detail once a session is pushed.
28637
+ .wb-mobile-nav was removed from the component, so the old 38px nav row had no
28638
+ owner and would have parked that single child on it, leaving the 1fr row
28639
+ empty. One row, and the child gets the full height. */
28640
+ .wb-mobile-stack { display: grid; grid-template-rows: minmax(0, 1fr); min-height: 0; overflow: hidden; }
28641
+ .wb-mobile-nav { display: grid; grid-template-columns: repeat(3, 1fr); border: 0; background: var(--bg-l1); }
28642
+ .wb-mobile-nav button { border: 0; color: var(--text-2); background: transparent; }
28643
+ .wb-mobile-nav button[aria-current="page"] { color: var(--accent); background: var(--bg-l3); }
28644
+ .wb-mobile-stack .wb-session-rail { width: 100%; border-right: 0; }
28645
+ .wb-mobile-stack .wb-workspace { grid-template-rows: 46px minmax(0, 1fr); }
28646
+ .wb-mobile-info { overflow: auto; }
28647
+
28648
+ .agent-workbench-dock {
28649
+ display: grid;
28650
+ grid-template-rows: 40px minmax(220px, 1fr) auto 24px;
28651
+ width: 100%;
28652
+ height: 100%;
28653
+ min-height: 0;
28654
+ overflow: hidden;
28655
+ }
28656
+ .wb-dock-header {
28657
+ display: flex;
28658
+ align-items: center;
28659
+ justify-content: space-between;
28660
+ padding: 0 12px;
28661
+ /* 顶栏不画下沿线:顶栏是 L1、内容区是 L0,色差已经分了区。 */
28662
+ border: 0;
28663
+ background: var(--bg-l1);
28664
+ }
28665
+ .wb-dock-header > div { display: flex; gap: 4px; align-items: center; }
28666
+ .wb-dock-header > div > span { color: var(--wb-accent); }
28667
+ .wb-dock-header .is-online { color: var(--wb-success); }
28668
+ .wb-dock-header .is-offline { color: var(--wb-danger); }
28669
+ .agent-workbench-dock .wb-session-rail { width: 100%; border-right: 0; }
28670
+ /* 保留线①(白名单第 1 类):内容区 ↔ 固定操作条的功能性边界,满出血。 */
28671
+ .wb-dock-actions { display: grid; gap: 8px; padding: 12px; border: 0; border-top: 1px solid var(--border-keep); background: var(--bg-l1); }
28672
+ .wb-dock-selected { display: grid; min-width: 0; }
28673
+ /* 截断两行同样按裁切框留净空(理由见会话行标题那条);这一格在 grid 的 auto 轨道
28674
+ 里,多出来的 2px 由轨道自己吸收,不碰 dock 的 40/220/24 三条固定轨。 */
28675
+ .wb-dock-selected strong,
28676
+ .wb-dock-selected span {
28677
+ overflow: hidden;
28678
+ padding-block: 1px;
28679
+ text-overflow: ellipsis;
28680
+ white-space: nowrap;
28681
+ }
28682
+ .wb-dock-selected span { color: var(--wb-muted); }
28683
+ /* 页面唯一的主行动改实心:描边式的主按钮压不住下面三个次级按钮的重量之和。 */
28684
+ .wb-primary-action {
28685
+ min-height: 44px;
28686
+ border: 0;
28687
+ border-radius: var(--radius-md);
28688
+ color: var(--on-accent);
28689
+ background: var(--accent);
28690
+ font-weight: 600;
28691
+ }
28692
+ .wb-primary-action:hover { color: var(--on-accent); background: var(--accent); }
28693
+ /* 三个次级按钮本来就是一组同类操作,走「全裸同行」:等宽、同高、同色、gap 4px、
28694
+ 谁都没有底板 —— 这已经读成一组。给它们加容器底会把刚压下去的重量原样抬回来。 */
28695
+ .wb-dock-action-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 4px; }
28696
+ .wb-dock-action-grid > * { min-width: 0; min-height: 40px; white-space: normal; text-align: center; }
28697
+ .wb-dock-action-grid span[aria-disabled="true"] { color: var(--text-3); cursor: not-allowed; }
28698
+ .wb-dock-actions p { margin: 0; color: var(--text-3); }
28699
+ .agent-workbench-dock > footer { padding: 6px 12px; border: 0; color: var(--text-3); font-size: 11px; text-align: center; }
28700
+
28701
+ @media (max-width: 767px) {
28702
+ /* No hard floor: a Feishu side panel can be narrower than 320px, and forcing
28703
+ a minimum here just pushed the row's right edge (and its actions) out of
28704
+ view instead of letting the layout compress. */
28705
+ .agent-workbench-page { min-width: 0; }
28706
+ .wb-workspace-title strong { max-width: 62vw; }
28707
+ .wb-pane-toolbar { gap: 3px; }
28708
+ .wb-pane-toolbar button { padding-inline: 5px; }
28709
+ .wb-pane-region { padding: 3px; }
28710
+ .wb-pane-titlebar { flex-wrap: wrap; height: auto; min-height: 34px; }
28711
+ .wb-lease-time { display: none; }
28712
+ .wb-info-content dl > div { grid-template-columns: 78px minmax(0, 1fr); }
28713
+ }
28714
+
28715
+ @media (prefers-reduced-motion: reduce) {
28716
+ .agent-workbench-page *,
28717
+ .agent-workbench-dock * { scroll-behavior: auto !important; transition: none !important; animation: none !important; }
28718
+ }
28719
+
28720
+ /* Row-level surface shortcuts. The actions are an overlay rather than a column,
28721
+ so the row itself stays two cells: state mark + copy. Kept alongside the base
28722
+ rule as the appended section's record of that layout. */
28723
+ .wb-session-row { grid-template-columns: 14px minmax(0, 1fr); }
28724
+ .wb-session-row-action {
28725
+ width: 20px;
28726
+ height: 18px;
28727
+ display: inline-flex;
28728
+ align-items: center;
28729
+ justify-content: center;
28730
+ padding: 0;
28731
+ border: 0;
28732
+ border-radius: var(--radius-md);
28733
+ color: var(--text-2);
28734
+ background: transparent;
28735
+ font-size: 11px;
28736
+ line-height: 1;
28737
+ cursor: pointer;
28738
+ }
28739
+ .wb-session-row-action:hover { color: var(--accent); background: var(--bg-l3); }
28740
+ .wb-session-row-action:focus-visible { outline: 2px solid var(--accent); outline-offset: -1px; }
28741
+
28742
+ /* The Dashboard's global control rule is `input:not(...)` seven times over,
28743
+ which outranks any plain `.wb-… input` selector and was re-skinning the
28744
+ Workbench search box into a 34px pill with its own background — the floating
28745
+ overlay reported from the Feishu client. Match that specificity inside the
28746
+ Workbench scope so the flat terminal styling wins without !important. */
28747
+ .agent-workbench-page input:not([type=checkbox]):not([type=radio]):not([type=range]):not([type=color]):not([type=file]):not([type=submit]):not([type=button]),
28748
+ .agent-workbench-dock input:not([type=checkbox]):not([type=radio]):not([type=range]):not([type=color]):not([type=file]):not([type=submit]):not([type=button]) {
28749
+ min-height: 0;
28750
+ height: 24px;
28751
+ padding: 0;
28752
+ border: 0;
28753
+ border-radius: 0;
28754
+ background: transparent;
28755
+ color: var(--wb-text);
28756
+ font: inherit;
28757
+ font-size: 12px;
28758
+ line-height: 1.4;
28759
+ box-shadow: none;
28760
+ }
28761
+
28762
+ /* Panes accumulate left-to-right; each keeps its own scroll and close control. */
28763
+ .wb-pane-stack {
28764
+ display: flex;
28765
+ min-width: 0;
28766
+ min-height: 0;
28767
+ overflow-x: auto;
28768
+ overflow-y: hidden;
28769
+ }
28770
+ .wb-stacked-pane {
28771
+ position: relative;
28772
+ display: flex;
28773
+ flex-direction: column;
28774
+ flex: 1 1 0;
28775
+ min-width: 320px;
28776
+ min-height: 0;
28777
+ border: 0;
28778
+ }
28779
+ .wb-stacked-pane > .wb-pane { flex: 1; min-height: 0; }
28780
+ .wb-pane-close {
28781
+ position: absolute;
28782
+ top: 4px;
28783
+ right: 6px;
28784
+ z-index: 2;
28785
+ width: 20px;
28786
+ height: 18px;
28787
+ padding: 0;
28788
+ border: 0;
28789
+ border-radius: var(--radius-md);
28790
+ color: var(--text-2);
28791
+ background: var(--bg-l2);
28792
+ font-size: 11px;
28793
+ line-height: 1;
28794
+ cursor: pointer;
28795
+ }
28796
+ .wb-pane-close:hover { color: var(--text-1); background: var(--bg-l3); }
28797
+ .wb-pane-placeholder {
28798
+ display: flex;
28799
+ flex: 1;
28800
+ flex-direction: column;
28801
+ align-items: center;
28802
+ justify-content: center;
28803
+ gap: 8px;
28804
+ color: var(--wb-faint);
28805
+ font-size: 12px;
28806
+ }
28807
+ .wb-pane-placeholder span { font-size: 20px; }
28808
+
28809
+ /* The toolbar and chat-contract rows were removed; the workspace is exactly a
28810
+ header plus the pane stack, and the stack must land on the 1fr track or the
28811
+ terminal iframe falls back to its 150px intrinsic height. */
28812
+ .wb-workspace { grid-template-rows: 46px minmax(0, 1fr); }
28813
+ .wb-mobile-stack .wb-workspace { grid-template-rows: 46px minmax(0, 1fr); }
28814
+
28815
+ /* The close control floats over the pane's own titlebar; reserve room so it
28816
+ never lands on top of the Take control / Open tab actions. */
28817
+ .wb-stacked-pane .wb-pane-titlebar { padding-right: 32px; }
28818
+
28819
+ /* Single terminal fills the workspace: the row button is a toggle, and Feishu —
28820
+ not this document — owns any multi-column arrangement. */
28821
+ .wb-pane-stack { display: flex; flex-direction: column; min-width: 0; min-height: 0; overflow: hidden; }
28822
+ .wb-pane-stack > .wb-pane { flex: 1; min-height: 0; }
28823
+ .wb-terminal-toggle {
28824
+ border: 0;
28825
+ border-radius: var(--radius-md);
28826
+ color: var(--text-2);
28827
+ background: transparent;
28828
+ cursor: pointer;
28829
+ }
28830
+ .wb-terminal-toggle:hover { color: var(--text-1); background: var(--bg-l3); }
28831
+
28832
+ /* Terminal closed: the rail is the whole product surface, so it takes the full
28833
+ width and the workspace column disappears entirely. In the Feishu side panel
28834
+ this is the "session list + native chat" arrangement — chat lives in Feishu's
28835
+ own column, so we simply stop reserving space we are not drawing into. */
28836
+ .wb-desktop-layout.is-terminal-closed { grid-template-columns: minmax(0, 1fr); }
28837
+ .wb-desktop-layout.is-terminal-closed > .wb-rail-separator,
28838
+ .wb-desktop-layout.is-terminal-closed > .wb-workspace { display: none; }
28839
+ /* With the terminal closed the rail is the only thing we draw. Cap it so the
28840
+ page stops claiming width it does not need — in a Feishu column that surplus
28841
+ is what squeezes the native chat next to it. */
28842
+ .wb-desktop-layout.is-terminal-closed .wb-session-rail {
28843
+ width: 100%;
28844
+ max-width: var(--wb-rail-width);
28845
+ }
28846
+
28847
+ /* The chat control is an anchor so the client receives a genuine link
28848
+ activation; it still has to read as one of the row buttons. */
28849
+ a.wb-session-row-action { text-decoration: none; }
28850
+
28851
+ /* Virtualisation positions every row from a fixed 54px estimate (see
28852
+ workbenchListItemHeight in agent-workbench-model.ts — the two numbers must
28853
+ move together), so a row that grows — a wrapping title, or action buttons
28854
+ pushed to a second line in a narrow rail — desynchronises the scroll model
28855
+ from what is painted. That drift is what let the list keep scrolling past its
28856
+ own top. Pin the height and let the contents clip instead.
28857
+ 54 = 6px + 6px padding + 1px bottom border + 41px content, and the content is
28858
+ one 15.6px title line + 4px gap + a 14px meta line = 33.6px. Touch layouts
28859
+ keep their taller rows; see the 620px block above. */
28860
+ .wb-session-row {
28861
+ height: 54px;
28862
+ overflow: hidden;
28863
+ }
28864
+ .wb-session-row .wb-session-copy { min-width: 0; overflow: hidden; }
28865
+
28866
+ /* Keep wheel momentum inside the list: at the boundary it would otherwise chain
28867
+ to the host document, which in the Feishu WebView reads as endless scrolling. */
28868
+ .wb-session-list { overscroll-behavior: contain; }
28869
+
28870
+ /* Terminal closed: use the whole column we were given rather than leaving a
28871
+ dead band beside a 300px rail — the session list is the entire product here. */
28872
+ .wb-desktop-layout.is-terminal-closed .wb-session-rail {
28873
+ width: 100%;
28874
+ max-width: none;
28875
+ }
28876
+
28877
+ /* Fit the row's contents inside that fixed height: one title line plus one meta
28878
+ line; the actions float above them rather than taking a column.
28879
+ The title is a single ellipsised line — the base .wb-session-title sets
28880
+ white-space: nowrap, and the -webkit-line-clamp:2 that used to sit here was
28881
+ inert anyway (clamping needs display:-webkit-box, which was never set), so the
28882
+ row has always painted one line. Keep it that way at 54px and let the full
28883
+ name come from the element's own title= tooltip.
28884
+ 行框(第三次修,这次是**竖直方向**):原来 line-height:1.3 = 15.6px,正好等于
28885
+ 标题的内容盒高度,而 overflow:hidden 就贴着这个盒子裁 —— 12px 中文字形的墨迹高
28886
+ 14px 且顶满 em 盒上沿,逐像素扫出来上沿净空只剩 0.13px,「查 / 看」的第一横被
28887
+ 削平。前两轮改的是 padding-left(左缘),跟这条完全无关,所以没修到。
28888
+ 现在 1.5(18px)+ 上下各 1px 内边距 → 裁切框 20px,字形上下各留 ≥3px(换 em 盒
28889
+ 1.4em 的中文字体也还有 1.6px)。
28890
+ 54px 的虚拟滚动契约没动,靠行内重新分配吸收:
28891
+ 54 = 5 上内边距 + 42 内容 + 5 下内边距 + 2 余量
28892
+ 内容 42 = 标题 20(18 行框 + 2 内边距)+ 4 间距 + meta 18
28893
+ 行的上下内边距从 6 收到 5(本条下面 .wb-session-row 的四值 padding),这 2px 就是
28894
+ 标题多出来的高度的来源;左右两个数一个没动,左缘那两轮修复原样保留。 */
28895
+ .wb-session-row .wb-session-title {
28896
+ line-height: 1.5;
28897
+ padding-block: 1px;
28898
+ }
28899
+ .wb-session-row .wb-session-meta {
28900
+ overflow: hidden;
28901
+ white-space: nowrap;
28902
+ text-overflow: ellipsis;
28903
+ }
28904
+
28905
+ /* Row actions are secondary to the title: in a ~600px column three bordered
28906
+ boxes read as the loudest thing in the row. Drop to bare labels inside the
28907
+ overlay and let each button's own surface appear only on hover/focus, so they
28908
+ stay reachable without competing with the session name. Each label is two
28909
+ characters of text, so the width follows the copy instead of a fixed square. */
28910
+ .wb-session-row-action {
28911
+ width: auto;
28912
+ height: 20px;
28913
+ /* The Dashboard's global `button, .btn-link { min-height: 32px }` outranks a
28914
+ bare `height` (min-height wins over height in the used-value calculation),
28915
+ so the three <button> actions inflated to 32px while the <a> "chat" action
28916
+ stayed at 20px — the row's actions rendered top-aligned and bottom-ragged.
28917
+ Zero the floor here so `height` is what actually decides the box. */
28918
+ min-height: 0;
28919
+ padding: 0 6px;
28920
+ border: 0;
28921
+ background: transparent;
28922
+ font-size: 11px;
28923
+ line-height: 1;
28924
+ white-space: nowrap;
28925
+ }
28926
+ .wb-session-row-action:hover,
28927
+ .wb-session-row-action:focus-visible {
28928
+ background: var(--bg-l3);
28929
+ }
28930
+
28931
+ .wb-workspace-controls { display: flex; align-items: center; gap: 6px; }
28932
+
28933
+ /* The rail must never push the row wider than the column it was given. */
28934
+ .wb-session-rail, .wb-session-list { max-width: 100%; overflow-x: hidden; }
28935
+
28936
+ /* The Dashboard sets body { min-width: 320px } for its own multi-column pages.
28937
+ A Feishu side panel can be narrower than that, and the floor made the whole
28938
+ document overflow rather than letting the rail compress. Lift it only while a
28939
+ Workbench surface is mounted. */
28940
+ body:has(.workbench-route-host) { min-width: 0; }
28941
+
28942
+ /* Mobile workspace header: title and the terminal toggle cannot always sit on
28943
+ one 390px line. Let it wrap and keep the controls reachable. */
28944
+ @media (max-width: 620px) {
28945
+ .wb-workspace-header { flex-wrap: wrap; gap: 4px; padding: 6px 8px; height: auto; }
28946
+ .wb-workspace-controls { flex-wrap: wrap; }
28947
+ .wb-workspace-title { min-width: 0; flex: 1 1 100%; }
28948
+ .wb-layout-level { font-size: 11px; padding: 2px 6px; }
28949
+ }
28950
+
28951
+ /* Mobile: the page switcher belongs under the thumb, not at the top of a phone
28952
+ held one-handed. Content first, nav last, and the bar keeps clear of the home
28953
+ indicator. Targets go to 44px — the row actions are 20px tall on desktop,
28954
+ fine for a mouse and too small for a fingertip. */
28955
+ @media (max-width: 620px) {
28956
+ .wb-mobile-stack {
28957
+ grid-template-rows: minmax(0, 1fr) auto;
28958
+ grid-template-areas: "content" "nav";
28959
+ }
28960
+ .wb-mobile-stack > .wb-mobile-nav {
28961
+ grid-area: nav;
28962
+ border: 0;
28963
+ padding-bottom: env(safe-area-inset-bottom, 0px);
28964
+ }
28965
+ .wb-mobile-stack > :not(.wb-mobile-nav) { grid-area: content; min-height: 0; }
28966
+ .wb-mobile-nav button { min-height: 44px; font-size: 12px; }
28967
+
28968
+ .wb-session-row-action { height: 34px; padding: 0 8px; font-size: 12px; }
28969
+ .wb-session-search input { height: 34px; font-size: 13px; }
28970
+ }
28971
+
28972
+ /* Mobile drill-down chrome: back control, session name, and a compact segment
28973
+ for the surfaces inside one session. */
28974
+ /* 下钻容器按「盖上来的一张卡」处理:只圆上两角,下面是贴底的导航/终端,圆了会露缝。 */
28975
+ /* 只保留一层圆角:外层是 bottom-sheet 的形状语义,内层的终端画布直接铺满,不再
28976
+ 套第二个同心圆角(原来两层 12px 圆角贴在一起,容器自己又没有底色,顶角裁出来
28977
+ 的是页面底色 —— 首屏顶部就露出两个小缺角)。 */
28978
+ .wb-mobile-detail {
28979
+ display: grid;
28980
+ grid-template-rows: auto minmax(0, 1fr);
28981
+ min-height: 0;
28982
+ border-radius: var(--radius-lg) var(--radius-lg) 0 0;
28983
+ background: var(--bg-l1);
28984
+ overflow: hidden;
28985
+ }
28986
+ .wb-mobile-detail .wb-pane { border-radius: 0; }
28987
+ .wb-mobile-detail-bar {
28988
+ display: flex;
28989
+ align-items: center;
28990
+ gap: 8px;
28991
+ min-width: 0;
28992
+ padding: 6px 8px;
28993
+ /* 不画下沿线:这条边界由 L1 ↔ term-bg 的色差表达。 */
28994
+ border: 0;
28995
+ background: var(--bg-l1);
28996
+ }
28997
+ .wb-mobile-back {
28998
+ min-height: 44px;
28999
+ padding: 0 8px;
29000
+ border: 0;
29001
+ border-radius: var(--radius-md);
29002
+ color: var(--accent);
29003
+ background: transparent;
29004
+ font-size: 13px;
29005
+ cursor: pointer;
29006
+ }
29007
+ .wb-mobile-back:hover { background: var(--bg-l3); }
29008
+ .wb-mobile-detail-title {
29009
+ flex: 1;
29010
+ min-width: 0;
29011
+ overflow: hidden;
29012
+ /* 同会话行标题:截断靠 hidden,净空靠内边距。这条 bar 的高度由 44px 的返回按钮
29013
+ 定,标题多 2px 完全在里面,手机端行高不受影响。 */
29014
+ padding-block: 1px;
29015
+ white-space: nowrap;
29016
+ text-overflow: ellipsis;
29017
+ color: var(--wb-text);
29018
+ font-size: 12px;
29019
+ }
29020
+ /* 分段控件走「共享底板」:一块容器底 + overflow:hidden,圆角完全由容器裁,
29021
+ 子项恒为方角 —— 每个元素四角同值仍然成立,不需要 `10px 0 0 10px` 那种四值写法。 */
29022
+ .wb-mobile-detail-seg { display: flex; flex: 0 0 auto; border: 0; border-radius: var(--radius-md); background: var(--bg-l2); overflow: hidden; }
29023
+ .wb-mobile-detail-seg button {
29024
+ min-height: 36px;
29025
+ padding: 0 10px;
29026
+ border: 0;
29027
+ border-radius: 0;
29028
+ color: var(--text-3);
29029
+ background: transparent;
29030
+ font-size: 11px;
29031
+ font-weight: 500;
29032
+ cursor: pointer;
29033
+ }
29034
+ .wb-mobile-detail-seg button:hover { background: var(--bg-l3); }
29035
+ /* 选中段:字色 + 字重 + 2px accent 内底线,不引入第五档灰做 thumb。 */
29036
+ .wb-mobile-detail-seg button[aria-current="page"] {
29037
+ color: var(--text-1);
29038
+ font-weight: 600;
29039
+ box-shadow: inset 0 -2px 0 var(--accent);
29040
+ }
29041
+
29042
+ /* Fingertip targets for the row actions on touch layouts.
29043
+ 行高 84 → 60:84px 里只装「标题 + meta」两行,竖直方向约 24px 是空的。60px 仍是
29044
+ 两行(12 padding + 18 标题 + 4 + 14 meta + 12 padding),把空掉的那 24px 换成密度
29045
+ —— 390×844 下同一块列表区从 5 条变成 8 条。
29046
+ ⚠️ 行高是虚拟滚动的硬契约:这个数必须和 workbenchListItemHeight 的触屏分支
29047
+ (agent-workbench-model.ts)一字不差,对不上列表就会滚过自己的末尾。 */
29048
+ @media (max-width: 620px) {
29049
+ .wb-session-row-action { height: 44px; padding: 0 10px; font-size: 13px; }
29050
+ .wb-session-row { height: 60px; }
29051
+ .wb-session-row .wb-session-copy { gap: 4px; }
29052
+ }
29053
+
29054
+ /* P1-17:指尖目标按「指针类型」补齐,不再只按视口宽度。
29055
+ 44px 那套原先只写在 max-width: 620px 里,横屏 iPad(1024–1366px 且 hover: none)
29056
+ 于是两头落空,拿到的还是给鼠标做的 18–25px 目标:终端/接管、坞里的三个动作、
29057
+ 收起后的会话栏,手指都够不着。
29058
+ 这里刻意不动 .wb-session-row 的行高——虚拟滚动按 workbenchListItemHeight 摆放每
29059
+ 一行,行高只能跟着那份宽度契约走(54 / 84)。行操作是绝对定位的浮层,把按钮撑到
29060
+ 44px 不参与任何一行的摆放,所以两者不冲突。 */
29061
+ @media (hover: none) {
29062
+ /* 触控尺寸只在这里改一个令牌,具体元素的下限由 var(--touch-target) 读它。
29063
+ 下面那几条 44px 的字面量是历史契约(单测按它们钉住指尖目标),保留。 */
29064
+ .agent-workbench-page,
29065
+ .agent-workbench-dock { --touch-target: 44px; }
29066
+ .wb-session-row-action { min-width: 44px; height: 44px; padding: 0 10px; font-size: 13px; }
29067
+ .wb-appearance-btn,
29068
+ .wb-more-btn { min-width: 44px; min-height: 44px; }
29069
+ .wb-pane-toolbar button,
29070
+ .wb-pane-actions button,
29071
+ .wb-pane-actions a,
29072
+ .wb-dock-action-grid button,
29073
+ .wb-dock-action-grid a,
29074
+ .wb-dock-action-grid span,
29075
+ .wb-primary-action { min-height: 44px; padding-inline: 10px; }
29076
+ .wb-mobile-detail-seg button { min-height: 44px; }
29077
+ /* 收起的会话栏是把列表叫回来的唯一入口(P1-18):40px 的窄条在触屏上本来就难点,
29078
+ 栏宽和它所在的网格列要一起放宽,否则按钮撑不满、右边露一道缝。
29079
+ 终端关着的时候栏本来就铺满整页(.is-terminal-closed,那时它是唯一要画的东西),
29080
+ 那条更宽的规则不能被这里改窄——否则触屏反而只剩 44px 可点。 */
29081
+ .wb-desktop-layout.is-rail-collapsed:not(.is-terminal-closed) { grid-template-columns: 44px minmax(0, 1fr); }
29082
+ .wb-session-rail.is-collapsed { width: 44px; }
29083
+ }
29084
+
29085
+ /* Mobile detail already shows the session name and its surface switcher, so the
29086
+ workspace's own header would repeat both and cost ~46px of the little height
29087
+ a phone terminal has. One bar, not two.
29088
+
29089
+ The header is display:none at this breakpoint, so it is out of flow and takes
29090
+ no grid cell at all — .wb-pane-stack is the workspace's only in-flow child.
29091
+ The template therefore has to be a single row. A leading auto row would eat
29092
+ the stack (it lands on row 1, ~61px) and leave the 1fr row empty, which
29093
+ collapses .wb-pane-frame-shell → .wb-pane-frame to 0 height and renders
29094
+ no terminal on a phone. */
29095
+ @media (max-width: 620px) {
29096
+ .wb-mobile-detail .wb-workspace-header { display: none; }
29097
+ .wb-mobile-detail .wb-workspace { grid-template-rows: minmax(0, 1fr); }
29098
+ .wb-mobile-detail-bar { padding: 4px 8px; gap: 6px; }
29099
+ .wb-mobile-back { min-height: 40px; padding: 0 6px; }
29100
+ }
29101
+
29102
+ .wb-mobile-preview { display: flex; min-height: 0; overflow: hidden; }
29103
+ .wb-mobile-preview > .wb-pane { flex: 1; min-height: 0; }
29104
+
29105
+ /* 行操作浮层:平时隐藏,悬停/聚焦出现,垂直居中不与时间戳抢位 */
29106
+ .wb-session-row-actions {
29107
+ position: absolute;
29108
+ top: 50%;
29109
+ /* 和行的右内边距对齐:浮层自己带边和阴影,压在底板圆角上会看出两层圆弧不同心。 */
29110
+ right: 14px;
29111
+ z-index: 2;
29112
+ display: flex;
29113
+ gap: 4px;
29114
+ padding: 2px 4px;
29115
+ /* 脱离文档流的浮层(白名单第 3 类):底色差不可控,必须有确定的边缘 + 阴影。
29116
+ 外壳比里面的按钮(10px)再大一档,包住时圆弧才是同心的。 */
29117
+ border: 1px solid var(--border-keep);
29118
+ border-radius: var(--radius-lg);
29119
+ background: var(--bg-l2);
29120
+ box-shadow: var(--shadow-pop);
29121
+ transform: translateY(-50%);
29122
+ opacity: 0;
29123
+ pointer-events: none;
29124
+ transition: opacity .14s ease-out;
29125
+ }
29126
+ .wb-session-row:hover .wb-session-row-actions,
29127
+ .wb-session-row:focus-within .wb-session-row-actions {
29128
+ opacity: 1;
29129
+ pointer-events: auto;
29130
+ }
29131
+ /* 触屏无 hover:点选中的行显示浮层 */
29132
+ @media (hover: none) {
29133
+ .wb-session-row.is-selected .wb-session-row-actions { opacity: 1; pointer-events: auto; }
29134
+ }
29135
+
29136
+ /* 会话类型徽标(话题 / 群 / 单聊)。挤在 meta 行里,所以行高由 line-height 锁死,
29137
+ 总高 16px < meta 行本身的高度,不会把虚拟滚动算好的行高撑开。 */
29138
+ /* chip 的 1px 亮环(白名单第 2 类):在无边框环境里,chip 靠这圈比填充更亮的环
29139
+ 跳出来。字号提到 11px,总高仍小于 meta 行本身,撑不开虚拟滚动算好的行高。 */
29140
+ .wb-session-kind {
29141
+ flex: none;
29142
+ padding: 0 5px;
29143
+ border: 1px solid var(--border-keep);
29144
+ border-radius: var(--radius-sm);
29145
+ color: var(--text-3);
29146
+ font-size: 11px;
29147
+ line-height: 16px;
29148
+ /* 徽标刻意**不**跟 meta 行其它格一起开 overflow:hidden(见上面那条 :not() 选择
29149
+ 器)。它是 flex:none + 一两个字的固定文案(话题 / 群 / 单聊),永远没有要截断
29150
+ 的内容,开了 hidden 等于白架一把裁刀 —— 16px 行框装 11px 中文,遇到 em 盒高的
29151
+ 中文字体半行距只剩 0.3px,「话」字上沿就被自己这圈框削平了。
29152
+ 不裁之后,它的字形只受 meta 行那层裁切管,而 1px 亮环天然把内容又让进 1px,
29153
+ 净空恒 ≥1px。nowrap 仍要保留:两个字的徽标不能折行。 */
29154
+ white-space: nowrap;
29155
+ }
29156
+ /* meta 行是 space-between 的两栏(描述 | 时间)。插进徽标就变成三栏,自由空间
29157
+ 会被均分到徽标和描述之间。让描述吃掉剩余空间,恢复「左对齐 + 时间靠右」。 */
29158
+ .wb-session-kind + span { margin-right: auto; }
29159
+
29160
+ /* 定位成功后的短暂确认态 */
29161
+ .wb-session-row-action.is-locate.is-located { color: var(--ok); }
29162
+
29163
+ /* 未读点:时间戳左边一颗 8px 实心圆,accent 蓝在深浅两套主题下都够显眼。
29164
+ flex:none 保证 meta 行被挤窄时它不会被压扁成一条线。
29165
+ 标题颜色刻意不动:标题本来就是 --wb-text + 700,两套主题里都没有「更重」的余地,
29166
+ 未读全靠这颗点 + 进「待你处理」组 + 行内「有新回复」三件事表达。 */
29167
+ .wb-unread-dot {
29168
+ width: 8px;
29169
+ height: 8px;
29170
+ flex: none;
29171
+ /* 它也是 .wb-session-meta 的直接子 span,会吃到上面那条「截断文字留 1px 上下
29172
+ 内边距」的规则。这颗点是纯色块不是文字,尺寸只由 width/height 说了算:
29173
+ 全站 box-sizing:border-box 下 8×8 本来就不会变形,这里显式归零,免得哪天
29174
+ 谁把 border-box 撤了,圆点被撑成椭圆。 */
29175
+ padding: 0;
29176
+ border-radius: 50%;
29177
+ background: var(--wb-accent);
29178
+ }
29179
+ /* meta 行原本靠 space-between 撑成「描述 | 时间」两栏,插进未读点就成了三栏,
29180
+ 没有类型徽标的行会把点甩到行中间。让第一栏(没有徽标时就是描述本身)吃掉
29181
+ 剩余空间,点和时间就永远贴在右边。有徽标的行由上面的 .wb-session-kind + span
29182
+ 规则负责,两条规则互斥,任何一行都只会有一个 auto 外边距。 */
29183
+ .wb-session-meta > span:first-child:not(.wb-session-kind) { margin-right: auto; }
29184
+
29185
+ /* 分组维度下拉:和栏头的收起按钮同一套线条语言(透明底 + 1px 描边 + 24px 高)。
29186
+ 全站的 select 基线规则(min-height 34px / padding 7px 11px / 右侧 30px 留给箭头)
29187
+ 特异性只有 0,0,1,这里逐条压掉;箭头沿用那条规则里的默认 SVG,不自绘。
29188
+ margin-left:auto 把它推到收起按钮旁边,栏头保持「左标题 · 右控件」。 */
29189
+ .wb-group-dim {
29190
+ height: 24px;
29191
+ min-height: 0;
29192
+ max-width: 96px;
29193
+ padding: 0 16px 0 6px;
29194
+ border: 0;
29195
+ border-radius: var(--radius-md);
29196
+ color: var(--text-2);
29197
+ background-color: transparent;
29198
+ background-position: right 3px center;
29199
+ font: inherit;
29200
+ font-size: 11px;
29201
+ line-height: 24px;
29202
+ cursor: pointer;
29203
+ }
29204
+ .wb-group-dim:hover { color: var(--text-1); background-color: var(--bg-l3); }
29205
+ /* 展开的选项列表由浏览器绘制,只保证它跟随当前主题的底色和字色。 */
29206
+ .wb-group-dim option { color: var(--text-1); background: var(--bg-l2); }
29207
+
29208
+ /* 分组组头 = 折叠开关。它就是原来那个 .wb-session-group 元素本身,只是标签换成了
29209
+ <button>,于是全站的按钮基线(min-height 32px / 1px 描边 / raised 底色 / 居中
29210
+ 文字)会突然罩进来。组头高度是虚拟滚动算好后写死在 style 上的 30px,min-height
29211
+ 在 used value 上压过 height,不清零就会撑成 32px、和滚动模型差 2px 一路累积。
29212
+ 选择器故意用两个类:全局的 `.agent-workbench-page button { font: inherit }`
29213
+ 特异性是 (0,1,1),单靠 .wb-session-group 的 font-size:10px (0,1,0) 压不住,
29214
+ 组头字号会被顶回 12px。
29215
+ 这里一个字都不提 color —— 待你处理的红、进行中的绿由 .wb-session-group-needs-you
29216
+ / -active 负责,写了 color 就会被这条更特异的规则洗掉。 */
29217
+ .wb-session-group.wb-session-group-toggle {
29218
+ width: 100%;
29219
+ min-height: 0;
29220
+ /* 左缘对齐(第二次修):这条规则比 .wb-session-group 特异性高,组头**实际生效的**
29221
+ 内边距一直是这里的 `2px`,上一轮改在 .wb-session-group 上的 22px 从来没落到过
29222
+ 渲染上——组头下面那块 hover 底板(::before,inset 1px 8px、圆角 14)左缘在 8px,
29223
+ 折叠箭头却坐在 2px,整个字形落在底板**外面**、离会话栏左边缘只剩 3.7px,读起来
29224
+ 就是「箭头贴边被切」。
29225
+ 现在四列写成「箭头列 = 行的状态标列」:左内边距 22(= 底板左缘 8 + 圆角 14)后
29226
+ 箭头占 22–36,与 .wb-session-row 的状态标格逐像素重合;第二列 14px 的组图标落在
29227
+ 40,正好是行标题的起点。整条列表左侧只剩 22 / 40 两条线。 */
29228
+ grid-template-columns: 14px 14px minmax(0, 1fr) auto;
29229
+ padding: 5px 14px 3px 22px;
29230
+ border: 0;
29231
+ border-radius: 0;
29232
+ background: transparent;
29233
+ font-size: 11px;
29234
+ /* 1.4 → 1.5:组头自己也是 overflow:hidden,11px 中文在 15.4px 行框里半行距归零,
29235
+ 组名上沿会被这层裁切削平。组头高 30px、上下内边距 5/3,内容区有 22px,
29236
+ 16.5px 的行框加组名那 2px 内边距(下一条)也才 18.5px,装得下。 */
29237
+ line-height: 1.5;
29238
+ letter-spacing: .09em;
29239
+ text-align: left;
29240
+ white-space: nowrap;
29241
+ overflow: hidden;
29242
+ cursor: pointer;
29243
+ }
29244
+ /* 组头的 hover 底色和会话行走同一套:::before 是圆角内缩底板,按钮本身保持透明、
29245
+ 保持方角(它的 overflow:hidden 按方角裁,裁不到内缩的底板)。
29246
+ 同样用 z-index:-1 落到内容之下,理由见 .wb-session-row::before 的注释。 */
29247
+ .wb-session-group.wb-session-group-toggle::before {
29248
+ content: '';
29249
+ position: absolute;
29250
+ z-index: -1;
29251
+ /* 与会话行底板同一条 8px 内缩线:两块底板左右对齐,列表左侧只剩一条对齐线。 */
29252
+ inset: 1px 8px;
29253
+ border-radius: var(--radius-lg);
29254
+ background: transparent;
29255
+ transition: background-color .14s ease-out;
29256
+ }
29257
+ .wb-session-group-caret { text-align: center; }
29258
+ /* 长组名(会话名、仓库名都是自由文本)截断,别压到右边的计数上。
29259
+ 自己开了 overflow:hidden 就要自己留净空,理由同标题那条。 */
29260
+ .wb-session-group-toggle > strong {
29261
+ min-width: 0;
29262
+ overflow: hidden;
29263
+ padding-block: 1px;
29264
+ text-overflow: ellipsis;
29265
+ }
29266
+ /* hover:中性组提亮文字;语义色的两组只加底色,一 hover 就把红/绿洗成前景色会丢语义。 */
29267
+ .wb-session-group-toggle:hover { color: var(--wb-text); }
29268
+ .wb-session-group-toggle:hover::before { background: var(--bg-l3); }
29269
+ .wb-session-group-toggle.wb-session-group-needs-you:hover { color: var(--wb-danger); }
29270
+ .wb-session-group-toggle.wb-session-group-active:hover { color: var(--wb-success); }
29271
+
29272
+ /* 拖动会话栏宽度期间:iframe 不抢指针事件,页面不选中文字 */
29273
+ .agent-workbench-page.is-rail-dragging { user-select: none; }
29274
+ .agent-workbench-page.is-rail-dragging iframe { pointer-events: none; }
29275
+
29276
+ /* ───────────────────────────────────────────────────────────────────────────
29277
+ 按钮成组:同组操作 = 一个视觉对象
29278
+ 分组关系用「共享底板」或「统一裸排」表达,绝不用「每人一块小板」表达。
29279
+ 一排各自带圆角、各自带底色、中间还留缝的按钮,读起来是几个互不相干的东西,
29280
+ 而不是同一个对象的几个操作 —— 这是本段要从语法上堵死的形态。
29281
+ 合法形态只有两种:
29282
+ (a) 共享底板 = 下面的 .wb-action-group;
29283
+ (b) 全裸同行 = 谁都没有底板、同高同色等距(dock 三个次级按钮、⋯ 菜单项、
29284
+ 外观面板里的 4 枚色板都走这种,不需要额外的类)。
29285
+ 单按钮不成组:给一个按钮套一个盒子只是多一块噪声。
29286
+ ─────────────────────────────────────────────────────────────────────────── */
29287
+ .wb-action-group,
29288
+ .wb-seg {
29289
+ display: flex;
29290
+ align-items: stretch;
29291
+ flex: 0 0 auto;
29292
+ padding: 0;
29293
+ border: 0;
29294
+ /* 组落在 L0 / L1 上取 L2;落在 L2 上的组加 .on-l2 往亮走一档,永远与父层拉开一档。 */
29295
+ border-radius: var(--radius-lg);
29296
+ background: var(--bg-l2);
29297
+ box-shadow: none;
29298
+ /* 组内子项的圆角全靠它裁 */
29299
+ overflow: hidden;
29300
+ }
29301
+ .wb-action-group.on-l2,
29302
+ .wb-seg.on-l2 { background: var(--bg-l3); }
29303
+ /* 选择器带上 .agent-workbench-* 前缀不是啰嗦:工作台的控件基线是
29304
+ `.agent-workbench-page button`(0,1,1),比裸的 `.wb-action-group > *`(0,1,0)更特异,
29305
+ 不加前缀的话组内子项会被那条规则重新塞回 10px 圆角,「圆角全由容器裁」当场失效。 */
29306
+ .agent-workbench-page .wb-action-group > *,
29307
+ .agent-workbench-dock .wb-action-group > *,
29308
+ .agent-workbench-page .wb-seg-item,
29309
+ .agent-workbench-dock .wb-seg-item {
29310
+ display: inline-flex;
29311
+ align-items: center;
29312
+ justify-content: center;
29313
+ min-width: var(--touch-target);
29314
+ min-height: var(--touch-target);
29315
+ padding: 0 10px;
29316
+ border: 0;
29317
+ /* 恒为 0:两端的圆角由容器裁出来,每个元素仍然四角同值 */
29318
+ border-radius: 0;
29319
+ color: var(--text-2);
29320
+ background: transparent;
29321
+ font-size: 12px;
29322
+ font-weight: 500;
29323
+ text-decoration: none;
29324
+ white-space: nowrap;
29325
+ cursor: pointer;
29326
+ }
29327
+ .wb-action-group > *:hover,
29328
+ .wb-action-group > *[aria-selected="true"],
29329
+ .wb-action-group > *[aria-current="page"],
29330
+ .wb-seg-item:hover,
29331
+ .wb-seg-item.is-on { background: var(--bg-l3); }
29332
+ .wb-action-group.on-l2 > *:hover,
29333
+ .wb-action-group.on-l2 > *[aria-selected="true"],
29334
+ .wb-action-group.on-l2 > *[aria-current="page"],
29335
+ .wb-seg.on-l2 > .wb-seg-item:hover,
29336
+ .wb-seg.on-l2 > .wb-seg-item.is-on { background: var(--bg-l2); }
29337
+
29338
+ /* 组内分线是「按需开」,不是默认开:只允许挂在「≥3 项 且 容器高 ≥40px」的组上。
29339
+ 用伪元素而不是 box-shadow —— 分线必须上下各内缩 10px,满高的线会在组的上下边缘
29340
+ 顶到容器圆角上,看起来就像组被切成了几块,又回到独立浮块。
29341
+ `> * + *` 本身就保证第一项不画线,也就保证线永远不会出现在组的外缘。 */
29342
+ .wb-action-group.has-dividers > * + * { position: relative; }
29343
+ .wb-action-group.has-dividers > * + *::before {
29344
+ content: '';
29345
+ position: absolute;
29346
+ left: 0;
29347
+ top: 10px;
29348
+ bottom: 10px;
29349
+ width: 1px;
29350
+ background: var(--border-keep);
29351
+ }
29352
+
29353
+ /* 破坏性 / 不可逆动作留在组内,靠字色和字重区分,不靠隔离 —— 距离表达的是「不同类」,
29354
+ 而这几个操作恰恰是同一类,只是后果轻重不同。轻重是强调问题,强调用字色和字重。
29355
+ 用 accent 而不是 err:err 已经被「会话状态点 = 需要你处理」占了语义。 */
29356
+ .wb-action-group .is-danger { color: var(--accent); font-weight: 600; }
29357
+ .wb-action-group .is-danger:hover { background: color-mix(in srgb, var(--accent) 12%, transparent); }
29358
+
29359
+ /* 分段控件(阅读 / 经典、跟随系统 / 浅色 / 深色):容器 24px 高,按自身高度取档 → sm。
29360
+ 选中段 = 字色 + 600 字重 + 2px accent 内底线,不引入第五档灰做 thumb。
29361
+ 只有 2 项、或容器高 < 40px 的组一律不画组内分线(白名单第 6 类第 ③④ 条)。 */
29362
+ .wb-seg,
29363
+ .wb-action-group.is-segmented {
29364
+ height: 24px;
29365
+ border-radius: var(--radius-sm);
29366
+ }
29367
+ .agent-workbench-page .wb-seg-item,
29368
+ .agent-workbench-dock .wb-seg-item,
29369
+ .agent-workbench-page .wb-action-group.is-segmented > *,
29370
+ .agent-workbench-dock .wb-action-group.is-segmented > * {
29371
+ min-width: 40px;
29372
+ min-height: 0;
29373
+ padding: 0 8px;
29374
+ color: var(--text-3);
29375
+ font-size: 12px;
29376
+ }
29377
+ .wb-seg-item.is-on,
29378
+ .wb-action-group.is-segmented > *[aria-selected="true"],
29379
+ .wb-action-group.is-segmented > *[aria-current="page"] {
29380
+ color: var(--text-1);
29381
+ font-weight: 600;
29382
+ box-shadow: inset 0 -2px 0 var(--accent);
29383
+ }
29384
+ /* 「跟随系统」比另外两段长,给模式分段一个更宽的下限,三段仍然等宽。 */
29385
+ .wb-appearance-mode-seg > .wb-seg-item { min-width: 56px; }
29386
+
29387
+ /* 触屏露出的操作组:一块 156×56 的板,不是三块。
29388
+ 156 = 3 × 52,每个动作 52 × 56,宽高都超过 44px 的指尖下限;56 = 行卡底板高
29389
+ (60px 行高减去上下各 2px inset),与行卡等高。
29390
+ 组的右缘与行卡的 8px 内缩落在同一条线上:贴屏边会让滑出的这一行比其余每一行都
29391
+ 多探出 8px,静态图上一眼看得出跑偏。
29392
+ 选择器只写 `.wb-session-row-actions`:行操作那个 <span> 从来只有这一个类,
29393
+ 原来写的 `.wb-session-row-actions.wb-action-group` 一次都没匹配上,整段是死的。
29394
+ 也不能反过来去 TSX 上补 `wb-action-group` —— 那个类在本文件里排得更后、特异性
29395
+ 相同,会把桌面浮层的 1px 描边和投影一并抹掉(浮层归白名单第 3 类,必须有边有影)。
29396
+ `overflow` 与子项的 `border-radius: 0` 本来由 `.wb-action-group` 提供,这里就地
29397
+ 补上:组的圆角由容器裁,子项四角同值,才读得成一个对象。 */
29398
+ @media (hover: none) {
29399
+ .wb-session-row-actions {
29400
+ right: 8px;
29401
+ gap: 0;
29402
+ width: 156px;
29403
+ height: 56px;
29404
+ padding: 0;
29405
+ border: 0;
29406
+ border-radius: var(--radius-lg);
29407
+ background: var(--bg-l2);
29408
+ box-shadow: none;
29409
+ overflow: hidden;
29410
+ }
29411
+ .agent-workbench-page .wb-session-row-actions > *,
29412
+ .agent-workbench-dock .wb-session-row-actions > * {
29413
+ flex: 1;
29414
+ width: 52px;
29415
+ min-width: 52px;
29416
+ height: 56px;
29417
+ padding: 0;
29418
+ border-radius: 0;
29419
+ font-size: 12px;
29420
+ }
29421
+ }
29422
+
29423
+ /* ⋯ 菜单:`⋯` 是单按钮,不套容器底板 —— 给一个按钮加一个盒子只是多一块噪声。
29424
+ 下拉浮层走白名单第 3 类(1px --border-keep + --shadow-pop);里面的菜单项走形态
29425
+ (b):全裸列表项,等高等距,谁都没有自己的底板,hover 才显满宽 L3 底。 */
29426
+ .wb-more { position: relative; display: inline-flex; }
29427
+ .wb-more-btn {
29428
+ display: inline-flex;
29429
+ align-items: center;
29430
+ justify-content: center;
29431
+ min-width: var(--touch-target);
29432
+ min-height: var(--touch-target);
29433
+ padding: 0 6px;
29434
+ border: 0;
29435
+ border-radius: var(--radius-md);
29436
+ color: var(--text-2);
29437
+ background: transparent;
29438
+ line-height: 1;
29439
+ cursor: pointer;
29440
+ }
29441
+ .wb-more-btn:hover,
29442
+ .wb-more-btn[aria-expanded="true"] { color: var(--text-1); background: var(--bg-l3); }
29443
+ .wb-more-menu {
29444
+ position: absolute;
29445
+ top: calc(100% + 4px);
29446
+ right: 0;
29447
+ z-index: 10;
29448
+ min-width: 156px;
29449
+ padding: 4px;
29450
+ border: 1px solid var(--border-keep);
29451
+ border-radius: var(--radius-lg);
29452
+ background: var(--bg-l2);
29453
+ box-shadow: var(--shadow-pop);
29454
+ overflow: hidden;
29455
+ }
29456
+ /* 同样带前缀压过 `.agent-workbench-page button` 的 10px 基线(见上)。 */
29457
+ .agent-workbench-page .wb-more-item,
29458
+ .agent-workbench-dock .wb-more-item {
29459
+ display: flex;
29460
+ align-items: center;
29461
+ gap: 6px;
29462
+ width: 100%;
29463
+ min-height: 32px;
29464
+ padding: 0 12px;
29465
+ border: 0;
29466
+ border-radius: var(--radius-sm);
29467
+ color: var(--text-2);
29468
+ background: transparent;
29469
+ font-size: 12px;
29470
+ text-align: left;
29471
+ text-decoration: none;
29472
+ white-space: nowrap;
29473
+ cursor: pointer;
29474
+ }
29475
+ .wb-more-item + .wb-more-item { margin-top: 2px; }
29476
+ .wb-more-item:hover { color: var(--text-1); background: var(--bg-l3); }
29477
+ /* 破坏性动作(接管)固定在列表最末,靠字色和字重标识,不加分组线、不额外留缝。 */
29478
+ .wb-more-item.is-danger { color: var(--accent); font-weight: 600; }
29479
+
29480
+ /* ───────────────────────────────────────────────────────────────────────────
29481
+ 外观面板:主题(4 枚色板)+ 明暗(分段控件)+ 终端渲染(分段控件)
29482
+ 桌面是下拉浮层,移动是底部 sheet;两处入口、一个状态源。
29483
+ ─────────────────────────────────────────────────────────────────────────── */
29484
+ /* H5 列表页顶栏那枚 ◐:与右邻的收起按钮各是一个单按钮 —— 等高等色、都没有底板,
29485
+ 也不套共享底板(一个管外观、一个管会话,不是同一组操作)。 */
29486
+ .wb-appearance-btn {
29487
+ display: inline-flex;
29488
+ align-items: center;
29489
+ justify-content: center;
29490
+ min-width: var(--touch-target);
29491
+ min-height: var(--touch-target);
29492
+ padding: 0 6px;
29493
+ border: 0;
29494
+ border-radius: var(--radius-md);
29495
+ color: var(--text-2);
29496
+ background: transparent;
29497
+ font-size: 15px;
29498
+ line-height: 1;
29499
+ cursor: pointer;
29500
+ }
29501
+ .wb-appearance-btn:hover { color: var(--text-1); background: var(--bg-l3); }
29502
+
29503
+ /* 桌面:挂在 ⋯ 按钮下方的下拉浮层(白名单第 3 类)。宽 260px:
29504
+ 4 枚 28px 色板 + 3×12px 间距 + 2×12px 内边距 = 172px,装得下。 */
29505
+ .wb-appearance-pop {
29506
+ position: absolute;
29507
+ top: calc(100% + 4px);
29508
+ right: 0;
29509
+ z-index: 10;
29510
+ width: 260px;
29511
+ padding: 12px;
29512
+ border: 1px solid var(--border-keep);
29513
+ border-radius: var(--radius-lg);
29514
+ background: var(--bg-l2);
29515
+ box-shadow: var(--shadow-pop);
29516
+ }
29517
+ /* 移动:同一块内容改底部 sheet。顶角与下钻容器同形、贴屏底不圆下两角 —— 这是
29518
+ 「一个元素四角同值」唯一的例外。 */
29519
+ .wb-appearance-backdrop {
29520
+ position: fixed;
29521
+ inset: 0;
29522
+ z-index: 10;
29523
+ display: flex;
29524
+ align-items: flex-end;
29525
+ background: var(--modal-backdrop, rgba(10, 14, 18, .48));
29526
+ }
29527
+ .wb-appearance-sheet {
29528
+ width: 100%;
29529
+ padding: 16px 16px calc(16px + env(safe-area-inset-bottom, 0px));
29530
+ border: 0;
29531
+ border-radius: var(--radius-lg) var(--radius-lg) 0 0;
29532
+ background: var(--bg-l2);
29533
+ box-shadow: var(--shadow-pop);
29534
+ }
29535
+ .wb-appearance-head {
29536
+ display: flex;
29537
+ align-items: center;
29538
+ justify-content: space-between;
29539
+ gap: 8px;
29540
+ margin-bottom: 12px;
29541
+ color: var(--text-1);
29542
+ font-size: 13px;
29543
+ }
29544
+ .wb-appearance-head button {
29545
+ min-width: var(--touch-target);
29546
+ min-height: var(--touch-target);
29547
+ border: 0;
29548
+ border-radius: var(--radius-md);
29549
+ color: var(--text-3);
29550
+ background: transparent;
29551
+ cursor: pointer;
29552
+ }
29553
+ .wb-appearance-head button:hover { color: var(--text-1); background: var(--bg-l3); }
29554
+ /* 两组之间 16px 留白 + 组标题,不画分组线(白名单里没有「面板内分组线」这一类)。 */
29555
+ .wb-appearance-group { display: grid; gap: 8px; justify-items: start; }
29556
+ .wb-appearance-group + .wb-appearance-group { margin-top: 16px; }
29557
+ .wb-appearance-group-label { color: var(--text-3); font-size: 11px; }
29558
+ .wb-appearance-note { margin: 0; color: var(--text-3); font-size: 11px; line-height: 16px; }
29559
+
29560
+ /* 常驻链接弹层:定位/描边/投影完全由 .wb-appearance-pop 那一份负责(同一族浮层,
29561
+ 不另起一套),这里只排里面的三样东西——只读链接框、复制按钮、说明。
29562
+ 链接是一长串等宽字符,宽一点才不至于一眼全是省略号。 */
29563
+ .wb-standing-link-pop { width: 300px; }
29564
+ .wb-standing-link-body { display: grid; gap: 8px; }
29565
+ /* 只读文本框而不是 <code>:能整条选中、能用系统的复制手势,是自动复制被浏览器
29566
+ 策略拦掉时唯一还管用的退路。折行显示——链接有六七十个字符,单行框里只看得见
29567
+ 开头一截,而这块弹层的用途就是把**完整**链接摆出来。 */
29568
+ .wb-standing-link-url {
29569
+ width: 100%;
29570
+ min-height: var(--touch-target);
29571
+ padding: 6px 8px;
29572
+ border: 1px solid var(--border-keep);
29573
+ border-radius: var(--radius-sm);
29574
+ color: var(--text-1);
29575
+ background: var(--bg-l1);
29576
+ font-family: var(--mono, ui-monospace, SFMono-Regular, Menlo, monospace);
29577
+ font-size: 11px;
29578
+ line-height: 17px;
29579
+ word-break: break-all;
29580
+ resize: none;
29581
+ }
29582
+ .wb-standing-link-copy,
29583
+ .wb-standing-link-open {
29584
+ display: inline-flex;
29585
+ align-items: center;
29586
+ justify-content: center;
29587
+ min-height: var(--touch-target);
29588
+ padding: 0 12px;
29589
+ border: 1px solid var(--border-keep);
29590
+ border-radius: var(--radius-sm);
29591
+ color: var(--text-1);
29592
+ background: var(--bg-l2);
29593
+ font-size: 12px;
29594
+ cursor: pointer;
29595
+ }
29596
+ .wb-standing-link-copy:hover,
29597
+ .wb-standing-link-open:hover { background: var(--bg-l3); }
29598
+ /* sheet 里那枚入口占满一行:底部 sheet 的其余控件都是整行节奏。 */
29599
+ .wb-standing-link-open { width: 100%; }
29600
+ .wb-standing-link-status { margin: 0; color: var(--text-3); font-size: 12px; }
29601
+ .wb-standing-link-note { margin-top: 12px; }
29602
+
29603
+ /* 4 枚色板走形态 (b):它们是单选项不是操作按钮,四枚等距同尺寸本身已经读成一组。
29604
+ 给色板加一块容器底反而会干扰对色相的判读 —— 底色会影响对色相的感知。 */
29605
+ .wb-skin-swatches { display: flex; gap: 12px; }
29606
+ .wb-skin-swatch {
29607
+ display: grid;
29608
+ justify-items: center;
29609
+ gap: 4px;
29610
+ padding: 0;
29611
+ border: 0;
29612
+ background: transparent;
29613
+ cursor: pointer;
29614
+ }
29615
+ /* 三色缩影:左 2/3 = 该套的 L1、右上 1/3 = L3、右下 1/3 = accent,一眼看出色相和
29616
+ accent,不用点进去试。三块纯色由两个伪元素叠出来,刻意不用渐变(段内零渐变)。
29617
+ 三个色值由 TS 侧按皮肤内联下发(--sw-bg / --sw-raise / --sw-accent):色板画的是
29618
+ 「目标皮肤」的颜色,当前页的令牌给不了。 */
29619
+ .wb-skin-swatch-chip {
29620
+ position: relative;
29621
+ width: 28px;
29622
+ height: 28px;
29623
+ border-radius: var(--radius-sm);
29624
+ background: var(--sw-bg);
29625
+ overflow: hidden;
29626
+ }
29627
+ .wb-skin-swatch-chip::before,
29628
+ .wb-skin-swatch-chip::after {
29629
+ content: '';
29630
+ position: absolute;
29631
+ right: 0;
29632
+ width: 33.33%;
29633
+ height: 50%;
29634
+ }
29635
+ .wb-skin-swatch-chip::before { top: 0; background: var(--sw-raise); }
29636
+ .wb-skin-swatch-chip::after { bottom: 0; background: var(--sw-accent); }
29637
+ /* 选中标识:外圈 2px accent 环(与焦点环同族画法,但常驻) */
29638
+ .wb-skin-swatch.is-active .wb-skin-swatch-chip { box-shadow: 0 0 0 2px var(--accent); }
29639
+ .wb-skin-swatch-name { color: var(--text-3); font-size: 11px; line-height: 14px; white-space: nowrap; }
29640
+ .wb-skin-swatch.is-active .wb-skin-swatch-name { color: var(--text-1); font-weight: 600; }