botmux 3.16.0 → 3.17.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 (619) hide show
  1. package/dist/.runtime-build-id +1 -1
  2. package/dist/adapters/backend/riff-backend.d.ts +84 -1
  3. package/dist/adapters/backend/riff-backend.d.ts.map +1 -1
  4. package/dist/adapters/backend/riff-backend.js +202 -19
  5. package/dist/adapters/backend/riff-backend.js.map +1 -1
  6. package/dist/adapters/backend/sandbox.d.ts +8 -0
  7. package/dist/adapters/backend/sandbox.d.ts.map +1 -1
  8. package/dist/adapters/backend/sandbox.js +15 -0
  9. package/dist/adapters/backend/sandbox.js.map +1 -1
  10. package/dist/adapters/backend/tmux-backend.d.ts +61 -7
  11. package/dist/adapters/backend/tmux-backend.d.ts.map +1 -1
  12. package/dist/adapters/backend/tmux-backend.js +80 -9
  13. package/dist/adapters/backend/tmux-backend.js.map +1 -1
  14. package/dist/adapters/backend/tmux-pipe-backend.d.ts +62 -4
  15. package/dist/adapters/backend/tmux-pipe-backend.d.ts.map +1 -1
  16. package/dist/adapters/backend/tmux-pipe-backend.js +240 -27
  17. package/dist/adapters/backend/tmux-pipe-backend.js.map +1 -1
  18. package/dist/adapters/cli/claude-code.d.ts.map +1 -1
  19. package/dist/adapters/cli/claude-code.js +4 -2
  20. package/dist/adapters/cli/claude-code.js.map +1 -1
  21. package/dist/adapters/cli/coco.d.ts.map +1 -1
  22. package/dist/adapters/cli/coco.js +27 -0
  23. package/dist/adapters/cli/coco.js.map +1 -1
  24. package/dist/adapters/cli/codex-app.d.ts.map +1 -1
  25. package/dist/adapters/cli/codex-app.js +28 -0
  26. package/dist/adapters/cli/codex-app.js.map +1 -1
  27. package/dist/adapters/cli/codex.d.ts.map +1 -1
  28. package/dist/adapters/cli/codex.js +51 -23
  29. package/dist/adapters/cli/codex.js.map +1 -1
  30. package/dist/adapters/cli/dsh-tui.d.ts +24 -0
  31. package/dist/adapters/cli/dsh-tui.d.ts.map +1 -0
  32. package/dist/adapters/cli/dsh-tui.js +99 -0
  33. package/dist/adapters/cli/dsh-tui.js.map +1 -0
  34. package/dist/adapters/cli/dsh.d.ts.map +1 -1
  35. package/dist/adapters/cli/dsh.js +15 -9
  36. package/dist/adapters/cli/dsh.js.map +1 -1
  37. package/dist/adapters/cli/fs-policy.d.ts +98 -1
  38. package/dist/adapters/cli/fs-policy.d.ts.map +1 -1
  39. package/dist/adapters/cli/fs-policy.js +182 -7
  40. package/dist/adapters/cli/fs-policy.js.map +1 -1
  41. package/dist/adapters/cli/grok.js +16 -18
  42. package/dist/adapters/cli/grok.js.map +1 -1
  43. package/dist/adapters/cli/model-catalog-json.d.ts +17 -0
  44. package/dist/adapters/cli/model-catalog-json.d.ts.map +1 -0
  45. package/dist/adapters/cli/model-catalog-json.js +43 -0
  46. package/dist/adapters/cli/model-catalog-json.js.map +1 -0
  47. package/dist/adapters/cli/oh-my-pi.d.ts +2 -0
  48. package/dist/adapters/cli/oh-my-pi.d.ts.map +1 -1
  49. package/dist/adapters/cli/oh-my-pi.js +45 -13
  50. package/dist/adapters/cli/oh-my-pi.js.map +1 -1
  51. package/dist/adapters/cli/opencode.js +1 -1
  52. package/dist/adapters/cli/opencode.js.map +1 -1
  53. package/dist/adapters/cli/registry.d.ts +2 -1
  54. package/dist/adapters/cli/registry.d.ts.map +1 -1
  55. package/dist/adapters/cli/registry.js +6 -1
  56. package/dist/adapters/cli/registry.js.map +1 -1
  57. package/dist/adapters/cli/relay.d.ts.map +1 -1
  58. package/dist/adapters/cli/relay.js +7 -0
  59. package/dist/adapters/cli/relay.js.map +1 -1
  60. package/dist/adapters/cli/seed.d.ts.map +1 -1
  61. package/dist/adapters/cli/seed.js +6 -0
  62. package/dist/adapters/cli/seed.js.map +1 -1
  63. package/dist/adapters/cli/shared-hints.d.ts.map +1 -1
  64. package/dist/adapters/cli/shared-hints.js +20 -14
  65. package/dist/adapters/cli/shared-hints.js.map +1 -1
  66. package/dist/adapters/cli/traex.d.ts +4 -0
  67. package/dist/adapters/cli/traex.d.ts.map +1 -1
  68. package/dist/adapters/cli/traex.js +153 -0
  69. package/dist/adapters/cli/traex.js.map +1 -1
  70. package/dist/adapters/cli/types.d.ts +42 -1
  71. package/dist/adapters/cli/types.d.ts.map +1 -1
  72. package/dist/autostart.d.ts +6 -0
  73. package/dist/autostart.d.ts.map +1 -1
  74. package/dist/autostart.js +21 -1
  75. package/dist/autostart.js.map +1 -1
  76. package/dist/bot-registry.d.ts +27 -0
  77. package/dist/bot-registry.d.ts.map +1 -1
  78. package/dist/bot-registry.js +62 -2
  79. package/dist/bot-registry.js.map +1 -1
  80. package/dist/cli/vc-agent.d.ts.map +1 -1
  81. package/dist/cli/vc-agent.js +21 -3
  82. package/dist/cli/vc-agent.js.map +1 -1
  83. package/dist/cli.d.ts.map +1 -1
  84. package/dist/cli.js +92 -1
  85. package/dist/cli.js.map +1 -1
  86. package/dist/codex-app-runner.js +28 -0
  87. package/dist/codex-app-runner.js.map +1 -1
  88. package/dist/core/bot-steer-directive.d.ts +25 -0
  89. package/dist/core/bot-steer-directive.d.ts.map +1 -0
  90. package/dist/core/bot-steer-directive.js +47 -0
  91. package/dist/core/bot-steer-directive.js.map +1 -0
  92. package/dist/core/command-handler.d.ts.map +1 -1
  93. package/dist/core/command-handler.js +102 -18
  94. package/dist/core/command-handler.js.map +1 -1
  95. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  96. package/dist/core/dashboard-ipc-server.js +53 -13
  97. package/dist/core/dashboard-ipc-server.js.map +1 -1
  98. package/dist/core/dashboard-rows.d.ts +3 -0
  99. package/dist/core/dashboard-rows.d.ts.map +1 -1
  100. package/dist/core/dashboard-rows.js +26 -5
  101. package/dist/core/dashboard-rows.js.map +1 -1
  102. package/dist/core/dashboard-url.d.ts +10 -1
  103. package/dist/core/dashboard-url.d.ts.map +1 -1
  104. package/dist/core/dashboard-url.js +12 -2
  105. package/dist/core/dashboard-url.js.map +1 -1
  106. package/dist/core/dispatch.d.ts.map +1 -1
  107. package/dist/core/dispatch.js +5 -4
  108. package/dist/core/dispatch.js.map +1 -1
  109. package/dist/core/existing-app-server.d.ts +22 -0
  110. package/dist/core/existing-app-server.d.ts.map +1 -0
  111. package/dist/core/existing-app-server.js +85 -0
  112. package/dist/core/existing-app-server.js.map +1 -0
  113. package/dist/core/native-topic-id.d.ts +9 -0
  114. package/dist/core/native-topic-id.d.ts.map +1 -0
  115. package/dist/core/native-topic-id.js +14 -0
  116. package/dist/core/native-topic-id.js.map +1 -0
  117. package/dist/core/per-bot-env.d.ts.map +1 -1
  118. package/dist/core/per-bot-env.js +10 -0
  119. package/dist/core/per-bot-env.js.map +1 -1
  120. package/dist/core/plugins/mcp/gateway.d.ts +27 -3
  121. package/dist/core/plugins/mcp/gateway.d.ts.map +1 -1
  122. package/dist/core/plugins/mcp/gateway.js +272 -26
  123. package/dist/core/plugins/mcp/gateway.js.map +1 -1
  124. package/dist/core/plugins/mcp/host.d.ts +18 -0
  125. package/dist/core/plugins/mcp/host.d.ts.map +1 -1
  126. package/dist/core/plugins/mcp/host.js +80 -16
  127. package/dist/core/plugins/mcp/host.js.map +1 -1
  128. package/dist/core/plugins/mcp/launch-record.d.ts +14 -0
  129. package/dist/core/plugins/mcp/launch-record.d.ts.map +1 -0
  130. package/dist/core/plugins/mcp/launch-record.js +63 -0
  131. package/dist/core/plugins/mcp/launch-record.js.map +1 -0
  132. package/dist/core/session-activity.d.ts +11 -0
  133. package/dist/core/session-activity.d.ts.map +1 -1
  134. package/dist/core/session-activity.js +23 -0
  135. package/dist/core/session-activity.js.map +1 -1
  136. package/dist/core/session-group-birth.d.ts.map +1 -1
  137. package/dist/core/session-group-birth.js +23 -8
  138. package/dist/core/session-group-birth.js.map +1 -1
  139. package/dist/core/session-manager.d.ts +1 -4
  140. package/dist/core/session-manager.d.ts.map +1 -1
  141. package/dist/core/session-manager.js +16 -20
  142. package/dist/core/session-manager.js.map +1 -1
  143. package/dist/core/shared-adopt.d.ts +20 -0
  144. package/dist/core/shared-adopt.d.ts.map +1 -0
  145. package/dist/core/shared-adopt.js +26 -0
  146. package/dist/core/shared-adopt.js.map +1 -0
  147. package/dist/core/skills/customize-command.d.ts +7 -0
  148. package/dist/core/skills/customize-command.d.ts.map +1 -0
  149. package/dist/core/skills/customize-command.js +303 -0
  150. package/dist/core/skills/customize-command.js.map +1 -0
  151. package/dist/core/terminal-write-auth.d.ts +15 -0
  152. package/dist/core/terminal-write-auth.d.ts.map +1 -1
  153. package/dist/core/terminal-write-auth.js +15 -0
  154. package/dist/core/terminal-write-auth.js.map +1 -1
  155. package/dist/core/terminal-write-frame.d.ts +30 -0
  156. package/dist/core/terminal-write-frame.d.ts.map +1 -0
  157. package/dist/core/terminal-write-frame.js +44 -0
  158. package/dist/core/terminal-write-frame.js.map +1 -0
  159. package/dist/core/types.d.ts +14 -4
  160. package/dist/core/types.d.ts.map +1 -1
  161. package/dist/core/types.js +6 -8
  162. package/dist/core/types.js.map +1 -1
  163. package/dist/core/worker-pool.d.ts +31 -6
  164. package/dist/core/worker-pool.d.ts.map +1 -1
  165. package/dist/core/worker-pool.js +444 -102
  166. package/dist/core/worker-pool.js.map +1 -1
  167. package/dist/core/worker-startup-retry.d.ts +52 -0
  168. package/dist/core/worker-startup-retry.d.ts.map +1 -0
  169. package/dist/core/worker-startup-retry.js +68 -0
  170. package/dist/core/worker-startup-retry.js.map +1 -0
  171. package/dist/daemon.d.ts +9 -8
  172. package/dist/daemon.d.ts.map +1 -1
  173. package/dist/daemon.js +467 -171
  174. package/dist/daemon.js.map +1 -1
  175. package/dist/dashboard/autostart-api.d.ts +26 -0
  176. package/dist/dashboard/autostart-api.d.ts.map +1 -0
  177. package/dist/dashboard/autostart-api.js +88 -0
  178. package/dist/dashboard/autostart-api.js.map +1 -0
  179. package/dist/dashboard/bot-payload.d.ts +5 -0
  180. package/dist/dashboard/bot-payload.d.ts.map +1 -1
  181. package/dist/dashboard/bot-payload.js +2 -0
  182. package/dist/dashboard/bot-payload.js.map +1 -1
  183. package/dist/dashboard/control-csrf.d.ts +29 -1
  184. package/dist/dashboard/control-csrf.d.ts.map +1 -1
  185. package/dist/dashboard/control-csrf.js +49 -10
  186. package/dist/dashboard/control-csrf.js.map +1 -1
  187. package/dist/dashboard/customization-api.d.ts +23 -0
  188. package/dist/dashboard/customization-api.d.ts.map +1 -0
  189. package/dist/dashboard/customization-api.js +198 -0
  190. package/dist/dashboard/customization-api.js.map +1 -0
  191. package/dist/dashboard/debug-terminal.d.ts +13 -1
  192. package/dist/dashboard/debug-terminal.d.ts.map +1 -1
  193. package/dist/dashboard/debug-terminal.js +18 -4
  194. package/dist/dashboard/debug-terminal.js.map +1 -1
  195. package/dist/dashboard/settings-write-applier.d.ts +0 -23
  196. package/dist/dashboard/settings-write-applier.d.ts.map +1 -1
  197. package/dist/dashboard/settings-write-applier.js +7 -28
  198. package/dist/dashboard/settings-write-applier.js.map +1 -1
  199. package/dist/dashboard/terminal-control-route.d.ts +32 -0
  200. package/dist/dashboard/terminal-control-route.d.ts.map +1 -0
  201. package/dist/dashboard/terminal-control-route.js +70 -0
  202. package/dist/dashboard/terminal-control-route.js.map +1 -0
  203. package/dist/dashboard/terminal-control.d.ts +64 -13
  204. package/dist/dashboard/terminal-control.d.ts.map +1 -1
  205. package/dist/dashboard/terminal-control.js +77 -14
  206. package/dist/dashboard/terminal-control.js.map +1 -1
  207. package/dist/dashboard/terminal-front-proxy.d.ts.map +1 -1
  208. package/dist/dashboard/terminal-front-proxy.js +41 -9
  209. package/dist/dashboard/terminal-front-proxy.js.map +1 -1
  210. package/dist/dashboard/vc-consumer-profiles-api.d.ts +69 -18
  211. package/dist/dashboard/vc-consumer-profiles-api.d.ts.map +1 -1
  212. package/dist/dashboard/vc-consumer-profiles-api.js +149 -29
  213. package/dist/dashboard/vc-consumer-profiles-api.js.map +1 -1
  214. package/dist/dashboard/web/agent-workbench-api.d.ts +34 -2
  215. package/dist/dashboard/web/agent-workbench-api.d.ts.map +1 -1
  216. package/dist/dashboard/web/agent-workbench-api.js +39 -4
  217. package/dist/dashboard/web/agent-workbench-api.js.map +1 -1
  218. package/dist/dashboard/web/agent-workbench-appearance.d.ts +6 -3
  219. package/dist/dashboard/web/agent-workbench-appearance.d.ts.map +1 -1
  220. package/dist/dashboard/web/agent-workbench-appearance.js +7 -4
  221. package/dist/dashboard/web/agent-workbench-appearance.js.map +1 -1
  222. package/dist/dashboard/web/agent-workbench-model.d.ts +2 -0
  223. package/dist/dashboard/web/agent-workbench-model.d.ts.map +1 -1
  224. package/dist/dashboard/web/agent-workbench-model.js.map +1 -1
  225. package/dist/dashboard/web/agent-workbench-page.js +2 -2
  226. package/dist/dashboard/web/agent-workbench-page.js.map +1 -1
  227. package/dist/dashboard/web/agent-workbench-panes.d.ts +59 -4
  228. package/dist/dashboard/web/agent-workbench-panes.d.ts.map +1 -1
  229. package/dist/dashboard/web/agent-workbench-panes.js +493 -85
  230. package/dist/dashboard/web/agent-workbench-panes.js.map +1 -1
  231. package/dist/dashboard/web/agent-workbench-session-list.d.ts +11 -7
  232. package/dist/dashboard/web/agent-workbench-session-list.d.ts.map +1 -1
  233. package/dist/dashboard/web/agent-workbench-session-list.js +24 -31
  234. package/dist/dashboard/web/agent-workbench-session-list.js.map +1 -1
  235. package/dist/dashboard/web/agent-workbench-terminal-control.d.ts +198 -0
  236. package/dist/dashboard/web/agent-workbench-terminal-control.d.ts.map +1 -0
  237. package/dist/dashboard/web/agent-workbench-terminal-control.js +292 -0
  238. package/dist/dashboard/web/agent-workbench-terminal-control.js.map +1 -0
  239. package/dist/dashboard/web/agent-workbench-view.d.ts +3 -2
  240. package/dist/dashboard/web/agent-workbench-view.d.ts.map +1 -1
  241. package/dist/dashboard/web/agent-workbench-view.js +69 -50
  242. package/dist/dashboard/web/agent-workbench-view.js.map +1 -1
  243. package/dist/dashboard/web/app.d.ts.map +1 -1
  244. package/dist/dashboard/web/app.js +58 -7
  245. package/dist/dashboard/web/app.js.map +1 -1
  246. package/dist/dashboard/web/bot-defaults-page.d.ts +24 -0
  247. package/dist/dashboard/web/bot-defaults-page.d.ts.map +1 -1
  248. package/dist/dashboard/web/bot-defaults-page.js +191 -16
  249. package/dist/dashboard/web/bot-defaults-page.js.map +1 -1
  250. package/dist/dashboard/web/bot-defaults.d.ts +17 -0
  251. package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
  252. package/dist/dashboard/web/bot-defaults.js +51 -2
  253. package/dist/dashboard/web/bot-defaults.js.map +1 -1
  254. package/dist/dashboard/web/bot-onboarding.d.ts.map +1 -1
  255. package/dist/dashboard/web/bot-onboarding.js +32 -8
  256. package/dist/dashboard/web/bot-onboarding.js.map +1 -1
  257. package/dist/dashboard/web/confirm-modal.d.ts +35 -0
  258. package/dist/dashboard/web/confirm-modal.d.ts.map +1 -0
  259. package/dist/dashboard/web/confirm-modal.js +111 -0
  260. package/dist/dashboard/web/confirm-modal.js.map +1 -0
  261. package/dist/dashboard/web/connectors-page.d.ts.map +1 -1
  262. package/dist/dashboard/web/connectors-page.js +2 -1
  263. package/dist/dashboard/web/connectors-page.js.map +1 -1
  264. package/dist/dashboard/web/customization-page.d.ts +3 -0
  265. package/dist/dashboard/web/customization-page.d.ts.map +1 -0
  266. package/dist/dashboard/web/customization-page.js +315 -0
  267. package/dist/dashboard/web/customization-page.js.map +1 -0
  268. package/dist/dashboard/web/dashboard-routes.d.ts.map +1 -1
  269. package/dist/dashboard/web/dashboard-routes.js +1 -0
  270. package/dist/dashboard/web/dashboard-routes.js.map +1 -1
  271. package/dist/dashboard/web/groups-page.d.ts.map +1 -1
  272. package/dist/dashboard/web/groups-page.js +11 -9
  273. package/dist/dashboard/web/groups-page.js.map +1 -1
  274. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  275. package/dist/dashboard/web/i18n.js +226 -42
  276. package/dist/dashboard/web/i18n.js.map +1 -1
  277. package/dist/dashboard/web/monitor-room.d.ts.map +1 -1
  278. package/dist/dashboard/web/monitor-room.js +3 -2
  279. package/dist/dashboard/web/monitor-room.js.map +1 -1
  280. package/dist/dashboard/web/overview-page.d.ts.map +1 -1
  281. package/dist/dashboard/web/overview-page.js +98 -63
  282. package/dist/dashboard/web/overview-page.js.map +1 -1
  283. package/dist/dashboard/web/roles-page.d.ts.map +1 -1
  284. package/dist/dashboard/web/roles-page.js +4 -3
  285. package/dist/dashboard/web/roles-page.js.map +1 -1
  286. package/dist/dashboard/web/schedules-page.d.ts.map +1 -1
  287. package/dist/dashboard/web/schedules-page.js +165 -18
  288. package/dist/dashboard/web/schedules-page.js.map +1 -1
  289. package/dist/dashboard/web/sessions-kanban.d.ts +2 -0
  290. package/dist/dashboard/web/sessions-kanban.d.ts.map +1 -1
  291. package/dist/dashboard/web/sessions-kanban.js +142 -24
  292. package/dist/dashboard/web/sessions-kanban.js.map +1 -1
  293. package/dist/dashboard/web/sessions-page.d.ts.map +1 -1
  294. package/dist/dashboard/web/sessions-page.js +177 -94
  295. package/dist/dashboard/web/sessions-page.js.map +1 -1
  296. package/dist/dashboard/web/sessions.d.ts.map +1 -1
  297. package/dist/dashboard/web/sessions.js +5 -4
  298. package/dist/dashboard/web/sessions.js.map +1 -1
  299. package/dist/dashboard/web/settings-page.d.ts +0 -8
  300. package/dist/dashboard/web/settings-page.d.ts.map +1 -1
  301. package/dist/dashboard/web/settings-page.js +185 -65
  302. package/dist/dashboard/web/settings-page.js.map +1 -1
  303. package/dist/dashboard/web/skills/skill-library-tab.d.ts +2 -0
  304. package/dist/dashboard/web/skills/skill-library-tab.d.ts.map +1 -1
  305. package/dist/dashboard/web/skills/skill-library-tab.js +15 -1
  306. package/dist/dashboard/web/skills/skill-library-tab.js.map +1 -1
  307. package/dist/dashboard/web/skills-page.d.ts.map +1 -1
  308. package/dist/dashboard/web/skills-page.js +5 -4
  309. package/dist/dashboard/web/skills-page.js.map +1 -1
  310. package/dist/dashboard/web/store.d.ts +5 -0
  311. package/dist/dashboard/web/store.d.ts.map +1 -1
  312. package/dist/dashboard/web/store.js +4 -0
  313. package/dist/dashboard/web/store.js.map +1 -1
  314. package/dist/dashboard/web/team-federation-page.d.ts.map +1 -1
  315. package/dist/dashboard/web/team-federation-page.js +3 -2
  316. package/dist/dashboard/web/team-federation-page.js.map +1 -1
  317. package/dist/dashboard/web/toast.d.ts +15 -0
  318. package/dist/dashboard/web/toast.d.ts.map +1 -0
  319. package/dist/dashboard/web/toast.js +70 -0
  320. package/dist/dashboard/web/toast.js.map +1 -0
  321. package/dist/dashboard/web/v3-components.d.ts.map +1 -1
  322. package/dist/dashboard/web/v3-components.js +2 -1
  323. package/dist/dashboard/web/v3-components.js.map +1 -1
  324. package/dist/dashboard/web/vc-consumer-profiles-section.d.ts +10 -12
  325. package/dist/dashboard/web/vc-consumer-profiles-section.d.ts.map +1 -1
  326. package/dist/dashboard/web/vc-consumer-profiles-section.js +219 -200
  327. package/dist/dashboard/web/vc-consumer-profiles-section.js.map +1 -1
  328. package/dist/dashboard/web/whiteboards-page.d.ts.map +1 -1
  329. package/dist/dashboard/web/whiteboards-page.js +2 -1
  330. package/dist/dashboard/web/whiteboards-page.js.map +1 -1
  331. package/dist/dashboard-web/app.js +1 -1
  332. package/dist/dashboard-web/chunks/agent-workbench-dock-page-LZSUOCEQ.js +1 -0
  333. package/dist/dashboard-web/chunks/agent-workbench-page-YONDRJU7.js +1 -0
  334. package/dist/dashboard-web/chunks/bot-defaults-page-X7LV6373.js +1 -0
  335. package/dist/dashboard-web/chunks/chunk-2PVRDXEL.js +1 -0
  336. package/dist/dashboard-web/chunks/chunk-53JUKBU2.js +10 -0
  337. package/dist/dashboard-web/chunks/{chunk-5CJMHTT4.js → chunk-5QX4OYOR.js} +1 -1
  338. package/dist/dashboard-web/chunks/{chunk-NACP7BMR.js → chunk-5VRVJFQR.js} +1 -1
  339. package/dist/dashboard-web/chunks/{chunk-FDZ7WOBW.js → chunk-6ROOZWYV.js} +1 -1
  340. package/dist/dashboard-web/chunks/{chunk-F6KNPF4R.js → chunk-CK22743G.js} +15 -19
  341. package/dist/dashboard-web/chunks/chunk-CVNIMUPY.js +25 -0
  342. package/dist/dashboard-web/chunks/chunk-GJC2TMWS.js +2 -0
  343. package/dist/dashboard-web/chunks/chunk-OT6L6G7R.js +1 -0
  344. package/dist/dashboard-web/chunks/chunk-QITAMHW6.js +1 -0
  345. package/dist/dashboard-web/chunks/chunk-RHVFZC5Z.js +1 -0
  346. package/dist/dashboard-web/chunks/chunk-SOBMN2VY.js +1 -0
  347. package/dist/dashboard-web/chunks/chunk-SZOB6VK2.js +1 -0
  348. package/dist/dashboard-web/chunks/chunk-XVIXNQGC.js +44 -0
  349. package/dist/dashboard-web/chunks/chunk-YUJF34ME.js +1 -0
  350. package/dist/dashboard-web/chunks/connectors-page-LB2HEJ7F.js +1 -0
  351. package/dist/dashboard-web/chunks/customization-page-4GXBYLG6.js +105 -0
  352. package/dist/dashboard-web/chunks/feedback-page-IZQ7VLDG.js +1 -0
  353. package/dist/dashboard-web/chunks/groups-page-4WCP5OEV.js +8 -0
  354. package/dist/dashboard-web/chunks/{insights-page-HJFDYR5N.js → insights-page-TXQHIPQL.js} +1 -1
  355. package/dist/dashboard-web/chunks/{monitor-room-V7PCP47V.js → monitor-room-VBRVWXCM.js} +8 -8
  356. package/dist/dashboard-web/chunks/monitoring-page-QDDZWERE.js +2 -0
  357. package/dist/dashboard-web/chunks/office-page-PENFNYPG.js +1 -0
  358. package/dist/dashboard-web/chunks/overview-page-BZQDP6MP.js +1 -0
  359. package/dist/dashboard-web/chunks/plugin-page-JX4GSWZS.js +1 -0
  360. package/dist/dashboard-web/chunks/roles-page-VPNINZNK.js +1 -0
  361. package/dist/dashboard-web/chunks/schedules-page-BITO6HEA.js +1 -0
  362. package/dist/dashboard-web/chunks/sessions-page-ZKCOVTD2.js +8 -0
  363. package/dist/dashboard-web/chunks/settings-page-UT6JDTS6.js +2 -0
  364. package/dist/dashboard-web/chunks/skills-page-GULXVAJY.js +4 -0
  365. package/dist/dashboard-web/chunks/team-federation-page-CUUJWGEG.js +1 -0
  366. package/dist/dashboard-web/chunks/v3-page-5WVJ5AUR.js +94 -0
  367. package/dist/dashboard-web/chunks/whiteboards-page-FZ2CME4H.js +1 -0
  368. package/dist/dashboard-web/design-tokens.css +236 -0
  369. package/dist/dashboard-web/index.html +1 -0
  370. package/dist/dashboard-web/style.css +1930 -114
  371. package/dist/dashboard.js +360 -279
  372. package/dist/dashboard.js.map +1 -1
  373. package/dist/desktop/renderer/app.js +6 -0
  374. package/dist/desktop/renderer/app.js.map +1 -1
  375. package/dist/dsh-runner.js +139 -17
  376. package/dist/dsh-runner.js.map +1 -1
  377. package/dist/global-config.d.ts +33 -2
  378. package/dist/global-config.d.ts.map +1 -1
  379. package/dist/global-config.js +62 -0
  380. package/dist/global-config.js.map +1 -1
  381. package/dist/i18n/en.d.ts.map +1 -1
  382. package/dist/i18n/en.js +13 -4
  383. package/dist/i18n/en.js.map +1 -1
  384. package/dist/i18n/index.d.ts +27 -3
  385. package/dist/i18n/index.d.ts.map +1 -1
  386. package/dist/i18n/index.js +33 -4
  387. package/dist/i18n/index.js.map +1 -1
  388. package/dist/i18n/zh.d.ts.map +1 -1
  389. package/dist/i18n/zh.js +13 -4
  390. package/dist/i18n/zh.js.map +1 -1
  391. package/dist/im/lark/card-builder.d.ts +2 -0
  392. package/dist/im/lark/card-builder.d.ts.map +1 -1
  393. package/dist/im/lark/card-builder.js +7 -4
  394. package/dist/im/lark/card-builder.js.map +1 -1
  395. package/dist/im/lark/card-handler.d.ts.map +1 -1
  396. package/dist/im/lark/card-handler.js +135 -20
  397. package/dist/im/lark/card-handler.js.map +1 -1
  398. package/dist/im/lark/event-dispatcher.d.ts +38 -3
  399. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  400. package/dist/im/lark/event-dispatcher.js +163 -13
  401. package/dist/im/lark/event-dispatcher.js.map +1 -1
  402. package/dist/im/lark/v3-blocked-card-handler.d.ts.map +1 -1
  403. package/dist/im/lark/v3-blocked-card-handler.js +2 -1
  404. package/dist/im/lark/v3-blocked-card-handler.js.map +1 -1
  405. package/dist/im/lark/v3-blocked-card.d.ts +1 -1
  406. package/dist/im/lark/v3-blocked-card.d.ts.map +1 -1
  407. package/dist/im/lark/v3-blocked-card.js +14 -0
  408. package/dist/im/lark/v3-blocked-card.js.map +1 -1
  409. package/dist/index-core-only.js +2 -0
  410. package/dist/index-core-only.js.map +1 -1
  411. package/dist/index-daemon.js +3 -0
  412. package/dist/index-daemon.js.map +1 -1
  413. package/dist/platform/binding.d.ts +37 -0
  414. package/dist/platform/binding.d.ts.map +1 -1
  415. package/dist/platform/binding.js +15 -0
  416. package/dist/platform/binding.js.map +1 -1
  417. package/dist/services/bridge-turn-journal.d.ts +63 -0
  418. package/dist/services/bridge-turn-journal.d.ts.map +1 -0
  419. package/dist/services/bridge-turn-journal.js +149 -0
  420. package/dist/services/bridge-turn-journal.js.map +1 -0
  421. package/dist/services/bridge-turn-queue.d.ts +8 -1
  422. package/dist/services/bridge-turn-queue.d.ts.map +1 -1
  423. package/dist/services/bridge-turn-queue.js +2 -1
  424. package/dist/services/bridge-turn-queue.js.map +1 -1
  425. package/dist/services/codex-app-runner-protocol.d.ts +5 -0
  426. package/dist/services/codex-app-runner-protocol.d.ts.map +1 -1
  427. package/dist/services/codex-app-runner-protocol.js +5 -0
  428. package/dist/services/codex-app-runner-protocol.js.map +1 -1
  429. package/dist/services/customization-store.d.ts +93 -0
  430. package/dist/services/customization-store.d.ts.map +1 -0
  431. package/dist/services/customization-store.js +542 -0
  432. package/dist/services/customization-store.js.map +1 -0
  433. package/dist/services/file-bridge-path.d.ts.map +1 -1
  434. package/dist/services/file-bridge-path.js +3 -0
  435. package/dist/services/file-bridge-path.js.map +1 -1
  436. package/dist/services/grok-transcript.d.ts.map +1 -1
  437. package/dist/services/grok-transcript.js +44 -9
  438. package/dist/services/grok-transcript.js.map +1 -1
  439. package/dist/services/local-cli-opener.d.ts.map +1 -1
  440. package/dist/services/local-cli-opener.js +12 -3
  441. package/dist/services/local-cli-opener.js.map +1 -1
  442. package/dist/services/model-catalog.d.ts +54 -0
  443. package/dist/services/model-catalog.d.ts.map +1 -0
  444. package/dist/services/model-catalog.js +147 -0
  445. package/dist/services/model-catalog.js.map +1 -0
  446. package/dist/services/omp-transcript.d.ts +27 -0
  447. package/dist/services/omp-transcript.d.ts.map +1 -0
  448. package/dist/services/omp-transcript.js +214 -0
  449. package/dist/services/omp-transcript.js.map +1 -0
  450. package/dist/services/platform-team-store.d.ts +16 -8
  451. package/dist/services/platform-team-store.d.ts.map +1 -1
  452. package/dist/services/platform-team-store.js +17 -10
  453. package/dist/services/platform-team-store.js.map +1 -1
  454. package/dist/services/project-scanner.d.ts.map +1 -1
  455. package/dist/services/project-scanner.js +13 -8
  456. package/dist/services/project-scanner.js.map +1 -1
  457. package/dist/services/resumable-session-discovery.d.ts.map +1 -1
  458. package/dist/services/resumable-session-discovery.js +117 -35
  459. package/dist/services/resumable-session-discovery.js.map +1 -1
  460. package/dist/services/structured-bridge-clis.d.ts +5 -3
  461. package/dist/services/structured-bridge-clis.d.ts.map +1 -1
  462. package/dist/services/structured-bridge-clis.js +5 -1
  463. package/dist/services/structured-bridge-clis.js.map +1 -1
  464. package/dist/services/vc-meeting-action-gate.d.ts.map +1 -1
  465. package/dist/services/vc-meeting-action-gate.js +15 -4
  466. package/dist/services/vc-meeting-action-gate.js.map +1 -1
  467. package/dist/services/vc-meeting-consumer-profile-bootstrap.d.ts +46 -66
  468. package/dist/services/vc-meeting-consumer-profile-bootstrap.d.ts.map +1 -1
  469. package/dist/services/vc-meeting-consumer-profile-bootstrap.js +33 -292
  470. package/dist/services/vc-meeting-consumer-profile-bootstrap.js.map +1 -1
  471. package/dist/services/vc-meeting-consumer-profile-templates.js +3 -3
  472. package/dist/services/vc-meeting-consumer-profile-templates.js.map +1 -1
  473. package/dist/services/vc-meeting-delivery-store.d.ts +18 -0
  474. package/dist/services/vc-meeting-delivery-store.d.ts.map +1 -1
  475. package/dist/services/vc-meeting-delivery-store.js +55 -0
  476. package/dist/services/vc-meeting-delivery-store.js.map +1 -1
  477. package/dist/services/vc-meeting-send-policy.d.ts +21 -1
  478. package/dist/services/vc-meeting-send-policy.d.ts.map +1 -1
  479. package/dist/services/vc-meeting-send-policy.js +30 -2
  480. package/dist/services/vc-meeting-send-policy.js.map +1 -1
  481. package/dist/services/vc-meeting-shared-consumer-catalog-store.d.ts +78 -0
  482. package/dist/services/vc-meeting-shared-consumer-catalog-store.d.ts.map +1 -0
  483. package/dist/services/vc-meeting-shared-consumer-catalog-store.js +227 -0
  484. package/dist/services/vc-meeting-shared-consumer-catalog-store.js.map +1 -0
  485. package/dist/services/vc-meeting-shared-consumer-catalog.d.ts +53 -0
  486. package/dist/services/vc-meeting-shared-consumer-catalog.d.ts.map +1 -0
  487. package/dist/services/vc-meeting-shared-consumer-catalog.js +161 -0
  488. package/dist/services/vc-meeting-shared-consumer-catalog.js.map +1 -0
  489. package/dist/setup/bot-config-editor.d.ts.map +1 -1
  490. package/dist/setup/bot-config-editor.js +1 -0
  491. package/dist/setup/bot-config-editor.js.map +1 -1
  492. package/dist/setup/open-platform-automation.d.ts +20 -0
  493. package/dist/setup/open-platform-automation.d.ts.map +1 -1
  494. package/dist/setup/open-platform-automation.js +27 -0
  495. package/dist/setup/open-platform-automation.js.map +1 -1
  496. package/dist/skills/customization-bundle.d.ts +83 -0
  497. package/dist/skills/customization-bundle.d.ts.map +1 -0
  498. package/dist/skills/customization-bundle.js +214 -0
  499. package/dist/skills/customization-bundle.js.map +1 -0
  500. package/dist/skills/definitions.d.ts.map +1 -1
  501. package/dist/skills/definitions.js +10 -3
  502. package/dist/skills/definitions.js.map +1 -1
  503. package/dist/skills/effective-builtins.d.ts +38 -0
  504. package/dist/skills/effective-builtins.d.ts.map +1 -0
  505. package/dist/skills/effective-builtins.js +96 -0
  506. package/dist/skills/effective-builtins.js.map +1 -0
  507. package/dist/skills/injection-mode.d.ts +4 -1
  508. package/dist/skills/injection-mode.d.ts.map +1 -1
  509. package/dist/skills/injection-mode.js +11 -3
  510. package/dist/skills/injection-mode.js.map +1 -1
  511. package/dist/skills/installer.d.ts.map +1 -1
  512. package/dist/skills/installer.js +24 -1
  513. package/dist/skills/installer.js.map +1 -1
  514. package/dist/skills/prompt-fragments.d.ts +58 -0
  515. package/dist/skills/prompt-fragments.d.ts.map +1 -0
  516. package/dist/skills/prompt-fragments.js +88 -0
  517. package/dist/skills/prompt-fragments.js.map +1 -0
  518. package/dist/types.d.ts +51 -0
  519. package/dist/types.d.ts.map +1 -1
  520. package/dist/utils/cli-usage-limit.d.ts +50 -0
  521. package/dist/utils/cli-usage-limit.d.ts.map +1 -1
  522. package/dist/utils/cli-usage-limit.js +43 -0
  523. package/dist/utils/cli-usage-limit.js.map +1 -1
  524. package/dist/utils/idle-detector.d.ts +12 -0
  525. package/dist/utils/idle-detector.d.ts.map +1 -1
  526. package/dist/utils/idle-detector.js +88 -2
  527. package/dist/utils/idle-detector.js.map +1 -1
  528. package/dist/utils/stuck-detector.d.ts +5 -0
  529. package/dist/utils/stuck-detector.d.ts.map +1 -1
  530. package/dist/utils/stuck-detector.js +41 -0
  531. package/dist/utils/stuck-detector.js.map +1 -1
  532. package/dist/utils/usage-limit-tracker.d.ts +46 -0
  533. package/dist/utils/usage-limit-tracker.d.ts.map +1 -0
  534. package/dist/utils/usage-limit-tracker.js +91 -0
  535. package/dist/utils/usage-limit-tracker.js.map +1 -0
  536. package/dist/utils/user-token.js +1 -1
  537. package/dist/utils/user-token.js.map +1 -1
  538. package/dist/worker.js +812 -125
  539. package/dist/worker.js.map +1 -1
  540. package/dist/workflows/definition.d.ts +14 -14
  541. package/dist/workflows/events/payloads.d.ts +12 -12
  542. package/dist/workflows/events/schema.d.ts +164 -164
  543. package/dist/workflows/migration/v2-to-v3.js +1 -1
  544. package/dist/workflows/migration/v2-to-v3.js.map +1 -1
  545. package/dist/workflows/v3/architect.d.ts.map +1 -1
  546. package/dist/workflows/v3/architect.js +11 -5
  547. package/dist/workflows/v3/architect.js.map +1 -1
  548. package/dist/workflows/v3/artifact-contract-declarations.d.ts +22 -0
  549. package/dist/workflows/v3/artifact-contract-declarations.d.ts.map +1 -0
  550. package/dist/workflows/v3/artifact-contract-declarations.js +95 -0
  551. package/dist/workflows/v3/artifact-contract-declarations.js.map +1 -0
  552. package/dist/workflows/v3/contract.d.ts +1 -0
  553. package/dist/workflows/v3/contract.d.ts.map +1 -1
  554. package/dist/workflows/v3/contract.js.map +1 -1
  555. package/dist/workflows/v3/daemon-run.d.ts +2 -2
  556. package/dist/workflows/v3/daemon-run.d.ts.map +1 -1
  557. package/dist/workflows/v3/daemon-run.js +4 -0
  558. package/dist/workflows/v3/daemon-run.js.map +1 -1
  559. package/dist/workflows/v3/dag.d.ts +7 -0
  560. package/dist/workflows/v3/dag.d.ts.map +1 -1
  561. package/dist/workflows/v3/dag.js +69 -8
  562. package/dist/workflows/v3/dag.js.map +1 -1
  563. package/dist/workflows/v3/ephemeral-pool.js +1 -1
  564. package/dist/workflows/v3/ephemeral-pool.js.map +1 -1
  565. package/dist/workflows/v3/event-contract.d.ts +3 -1
  566. package/dist/workflows/v3/event-contract.d.ts.map +1 -1
  567. package/dist/workflows/v3/host.d.ts.map +1 -1
  568. package/dist/workflows/v3/host.js +5 -1
  569. package/dist/workflows/v3/host.js.map +1 -1
  570. package/dist/workflows/v3/journal.d.ts +1 -1
  571. package/dist/workflows/v3/journal.d.ts.map +1 -1
  572. package/dist/workflows/v3/journal.js.map +1 -1
  573. package/dist/workflows/v3/library-materialize.d.ts.map +1 -1
  574. package/dist/workflows/v3/library-materialize.js +9 -1
  575. package/dist/workflows/v3/library-materialize.js.map +1 -1
  576. package/dist/workflows/v3/library-schema.d.ts +3 -1
  577. package/dist/workflows/v3/library-schema.d.ts.map +1 -1
  578. package/dist/workflows/v3/library-schema.js +20 -4
  579. package/dist/workflows/v3/library-schema.js.map +1 -1
  580. package/dist/workflows/v3/library-store.d.ts.map +1 -1
  581. package/dist/workflows/v3/library-store.js +15 -3
  582. package/dist/workflows/v3/library-store.js.map +1 -1
  583. package/dist/workflows/v3/run-envelope.d.ts +16 -16
  584. package/dist/workflows/v3/shared-node-runtime.d.ts +2 -1
  585. package/dist/workflows/v3/shared-node-runtime.d.ts.map +1 -1
  586. package/dist/workflows/v3/shared-node-runtime.js +48 -7
  587. package/dist/workflows/v3/shared-node-runtime.js.map +1 -1
  588. package/package.json +2 -1
  589. package/dist/dashboard-web/chunks/agent-workbench-dock-page-IKAC5CFL.js +0 -1
  590. package/dist/dashboard-web/chunks/agent-workbench-page-M53UN5EB.js +0 -1
  591. package/dist/dashboard-web/chunks/bot-defaults-page-YKE5SDZF.js +0 -10
  592. package/dist/dashboard-web/chunks/chunk-22WIADUT.js +0 -2
  593. package/dist/dashboard-web/chunks/chunk-24ONYQMR.js +0 -1
  594. package/dist/dashboard-web/chunks/chunk-2W6SCN3M.js +0 -1
  595. package/dist/dashboard-web/chunks/chunk-4XNJX6B3.js +0 -1
  596. package/dist/dashboard-web/chunks/chunk-5THX4DI2.js +0 -66
  597. package/dist/dashboard-web/chunks/chunk-7SZRL6FY.js +0 -1
  598. package/dist/dashboard-web/chunks/chunk-AGCPF6MT.js +0 -1
  599. package/dist/dashboard-web/chunks/chunk-FXW3V4JR.js +0 -1
  600. package/dist/dashboard-web/chunks/chunk-SYC6D5XU.js +0 -1
  601. package/dist/dashboard-web/chunks/connectors-page-VOISXXII.js +0 -1
  602. package/dist/dashboard-web/chunks/feedback-page-RN6HRZMS.js +0 -1
  603. package/dist/dashboard-web/chunks/groups-page-UQT6DCB7.js +0 -8
  604. package/dist/dashboard-web/chunks/monitoring-page-NKEKVQAP.js +0 -2
  605. package/dist/dashboard-web/chunks/office-page-GVJF73XW.js +0 -1
  606. package/dist/dashboard-web/chunks/overview-page-KHLV6VTI.js +0 -1
  607. package/dist/dashboard-web/chunks/plugin-page-J3OF5IY4.js +0 -1
  608. package/dist/dashboard-web/chunks/roles-page-WQIRSOLZ.js +0 -1
  609. package/dist/dashboard-web/chunks/schedules-page-J2DEY2X6.js +0 -1
  610. package/dist/dashboard-web/chunks/sessions-page-7BQFEA5P.js +0 -8
  611. package/dist/dashboard-web/chunks/settings-page-BJEIOFJH.js +0 -2
  612. package/dist/dashboard-web/chunks/skills-page-HGIFR3IU.js +0 -4
  613. package/dist/dashboard-web/chunks/team-federation-page-MR5ZPL4B.js +0 -1
  614. package/dist/dashboard-web/chunks/v3-page-GBR5JWPE.js +0 -94
  615. package/dist/dashboard-web/chunks/whiteboards-page-QAZM4BN3.js +0 -1
  616. package/dist/services/vc-meeting-consumer-profile-store.d.ts +0 -39
  617. package/dist/services/vc-meeting-consumer-profile-store.d.ts.map +0 -1
  618. package/dist/services/vc-meeting-consumer-profile-store.js +0 -191
  619. package/dist/services/vc-meeting-consumer-profile-store.js.map +0 -1
@@ -8124,52 +8124,50 @@ dialog.onboarding-dialog::backdrop {
8124
8124
  .chrome-body {
8125
8125
  flex: 1;
8126
8126
  min-height: 0;
8127
- display: grid;
8128
- grid-template-columns: var(--sidebar-width) minmax(0, 1fr);
8129
- align-items: stretch;
8130
- gap: var(--chrome-x);
8131
- padding: 16px var(--chrome-x) 24px;
8127
+ /* 侧边栏悬浮成 fixed 卡片后不再占栅格列:主内容区用 .workspace 的
8128
+ margin-left 让出侧栏 + 间隙(见 .workspace),这里只留右/上/下内边距。 */
8129
+ display: block;
8130
+ padding: 16px var(--chrome-x) 24px 0;
8132
8131
  overflow: hidden;
8133
- transition: grid-template-columns 220ms cubic-bezier(.2, .8, .2, 1);
8134
8132
  }
8135
8133
 
8136
8134
  .workspace {
8137
8135
  min-width: 0;
8138
8136
  min-height: 0;
8137
+ /* chrome-body 改块级流后没有 grid stretch 给高度:显式撑满,main 的
8138
+ flex:1 + overflow-y:auto 才有确定的可滚动高度(移动端在 media query 里
8139
+ 改回 flex:1,由 flex 分配高度)。 */
8140
+ height: 100%;
8139
8141
  display: flex;
8140
8142
  flex-direction: column;
8141
8143
  overflow: visible;
8144
+ margin-left: calc(var(--sidebar-w, 248px) + 48px);
8142
8145
  }
8143
8146
 
8144
- /* ── 浮动导航 rail:顶栏贯穿全宽,tab 独立成左侧纵向模块 ───────────────── */
8147
+ /* ── 悬浮导航卡片:fixed 贴左侧悬浮,主内容区用 margin-left 让位 ──────────── */
8145
8148
  .sidebar {
8146
- align-self: start;
8147
- position: sticky;
8148
- top: calc(var(--topbar-height) + 16px);
8149
- height: 100%;
8150
- /* flex column so 创建按钮常驻顶部、导航区占满剩余高度并在矮屏(异形屏)内部纵向滚动,
8151
- 而不是整块溢出被下面的 overflow:hidden 裁掉且无法滚动。 */
8149
+ position: fixed;
8150
+ top: calc(var(--topbar-h) + 16px);
8151
+ bottom: 16px;
8152
+ left: 16px;
8153
+ z-index: 15;
8154
+ width: var(--sidebar-w, 248px);
8155
+ /* flex column:创建按钮常驻顶部,导航区占满剩余高度并在矮屏内部纵向滚动。 */
8152
8156
  display: flex;
8153
8157
  flex-direction: column;
8154
8158
  margin: 0;
8155
- padding: 12px;
8159
+ padding: var(--sp-4) var(--sp-3);
8156
8160
  border: 1px solid var(--border);
8157
- border-radius: var(--radius-xl);
8158
- background: color-mix(in srgb, var(--surface) 92%, transparent);
8159
- box-shadow: 0 18px 46px rgba(10, 20, 38, 0.08);
8160
- overflow: hidden;
8161
+ border-radius: var(--radius-lg);
8162
+ background: var(--surface);
8163
+ box-shadow: var(--sh-md);
8164
+ overflow-y: auto;
8161
8165
  transition:
8162
8166
  padding 180ms ease,
8163
8167
  border-radius 180ms ease,
8164
8168
  background-color 160ms ease,
8165
8169
  box-shadow 160ms ease;
8166
8170
  }
8167
- :root[data-theme="dark"] .sidebar {
8168
- background: color-mix(in srgb, var(--surface) 96%, var(--bg));
8169
- backdrop-filter: none;
8170
- border-color: var(--border);
8171
- box-shadow: 0 22px 56px rgba(0, 0, 0, 0.28);
8172
- }
8173
8171
 
8174
8172
  .sidebar-create-actions {
8175
8173
  display: grid;
@@ -8243,6 +8241,18 @@ button.sidebar-create-btn:focus-visible {
8243
8241
  overflow-y: auto;
8244
8242
  padding-right: 2px;
8245
8243
  }
8244
+ .nav-group-title {
8245
+ font-size: 11px;
8246
+ font-weight: 600;
8247
+ color: var(--fg-4, #b0b6c6);
8248
+ text-transform: uppercase;
8249
+ letter-spacing: .7px;
8250
+ padding: 0 var(--sp-3) var(--sp-2);
8251
+ margin-top: var(--sp-4);
8252
+ }
8253
+ .nav-group:first-child .nav-group-title {
8254
+ margin-top: 0;
8255
+ }
8246
8256
  .sidebar-nav a {
8247
8257
  position: relative;
8248
8258
  display: flex;
@@ -8256,7 +8266,6 @@ button.sidebar-create-btn:focus-visible {
8256
8266
  font-size: 13px;
8257
8267
  font-weight: 600;
8258
8268
  text-decoration: none;
8259
- overflow: hidden;
8260
8269
  outline: none;
8261
8270
  isolation: isolate;
8262
8271
  transition:
@@ -8329,6 +8338,18 @@ button.sidebar-create-btn:focus-visible {
8329
8338
  .sidebar-nav a.active svg {
8330
8339
  transform: translateX(1px);
8331
8340
  }
8341
+ /* active 左侧指示条:::before 已被 hover/active 底色占用,指示条走 ::after。
8342
+ 锚点不得 overflow:hidden,否则 left:-3px 的探出部分会被裁掉。 */
8343
+ .sidebar-nav a.active::after {
8344
+ content: "";
8345
+ position: absolute;
8346
+ left: -3px;
8347
+ top: 8px;
8348
+ bottom: 8px;
8349
+ width: 3px;
8350
+ border-radius: var(--radius-full);
8351
+ background: var(--accent);
8352
+ }
8332
8353
  .sidebar-nav a:focus,
8333
8354
  .sidebar-nav a:focus-visible {
8334
8355
  outline: none;
@@ -10212,13 +10233,9 @@ button.contrast:hover { background: var(--danger-soft); border-color: var(--dang
10212
10233
  .active-sessions-panel,
10213
10234
  .schedules-panel {
10214
10235
  display: flex;
10215
- min-height: var(--active-sessions-min-height, 260px);
10216
10236
  border-radius: var(--radius-lg);
10217
10237
  overflow: hidden;
10218
10238
  }
10219
- .schedules-panel {
10220
- min-height: var(--schedules-panel-min-height, 260px);
10221
- }
10222
10239
  .active-sessions-panel > .overview-list,
10223
10240
  .schedules-panel > .overview-list {
10224
10241
  flex: 1;
@@ -13263,6 +13280,14 @@ dialog :where(input:not([type=checkbox], [type=radio]), select, textarea) {
13263
13280
  overflow-x: auto;
13264
13281
  overflow-y: hidden;
13265
13282
  }
13283
+ /* 窄屏恢复横向 rail:组容器退化为 contents(锚点直接参与 flex 排列),
13284
+ 组标题隐藏,保持与改造前一致的横向滚动导航条。 */
13285
+ .sidebar-nav .nav-group {
13286
+ display: contents;
13287
+ }
13288
+ .sidebar-nav .nav-group-title {
13289
+ display: none;
13290
+ }
13266
13291
  .sidebar-nav a {
13267
13292
  flex: 0 0 auto;
13268
13293
  }
@@ -13270,10 +13295,9 @@ dialog :where(input:not([type=checkbox], [type=radio]), select, textarea) {
13270
13295
  flex: 1;
13271
13296
  min-height: 0;
13272
13297
  overflow: hidden;
13298
+ margin-left: 0;
13273
13299
  }
13274
13300
  .overview-layout { grid-template-columns: 1fr; }
13275
- .active-sessions-panel { min-height: auto; }
13276
- .schedules-panel { min-height: auto; }
13277
13301
  }
13278
13302
 
13279
13303
  @media (max-width: 520px) {
@@ -18766,10 +18790,103 @@ form.dashboard-toolbar > input[type="text"]:focus {
18766
18790
 
18767
18791
  .settings-layout {
18768
18792
  display: grid;
18769
- gap: 12px;
18793
+ grid-template-columns: 180px minmax(0, 1fr);
18794
+ gap: 20px;
18770
18795
  width: 100%;
18771
18796
  max-width: none;
18772
18797
  min-width: 0;
18798
+ align-items: start;
18799
+ }
18800
+
18801
+ .settings-content {
18802
+ display: grid;
18803
+ gap: 12px;
18804
+ min-width: 0;
18805
+ }
18806
+
18807
+ /* ── 粘性锚点导航 ───────────────────────────────────────────────────────── */
18808
+ .settings-nav {
18809
+ position: sticky;
18810
+ top: calc(var(--topbar-height, 56px) + 12px);
18811
+ display: flex;
18812
+ flex-direction: column;
18813
+ gap: var(--sp-4);
18814
+ padding: var(--sp-3) 0;
18815
+ }
18816
+
18817
+ .settings-nav-group {
18818
+ display: flex;
18819
+ flex-direction: column;
18820
+ gap: 2px;
18821
+ }
18822
+
18823
+ .settings-nav-group-label {
18824
+ margin: 0 0 4px;
18825
+ padding: 0 var(--sp-2);
18826
+ font-size: var(--fs-12);
18827
+ font-weight: 700;
18828
+ color: var(--fg);
18829
+ text-transform: uppercase;
18830
+ letter-spacing: 0.06em;
18831
+ }
18832
+
18833
+ .settings-nav-link {
18834
+ display: block;
18835
+ width: 100%;
18836
+ padding: 5px var(--sp-2) 5px calc(var(--sp-2) + 8px);
18837
+ border: none;
18838
+ border-left: 2px solid transparent;
18839
+ background: none;
18840
+ color: var(--muted);
18841
+ font-size: var(--fs-13);
18842
+ text-align: left;
18843
+ cursor: pointer;
18844
+ border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
18845
+ transition: color var(--t-fast), border-color var(--t-fast), background var(--t-fast);
18846
+ }
18847
+
18848
+ .settings-nav-link:hover {
18849
+ color: var(--fg);
18850
+ background: var(--surface-muted);
18851
+ }
18852
+
18853
+ .settings-nav-link.is-active {
18854
+ color: var(--accent);
18855
+ border-left-color: var(--accent);
18856
+ font-weight: 600;
18857
+ }
18858
+
18859
+ @media (max-width: 960px) {
18860
+ .settings-layout {
18861
+ grid-template-columns: 1fr;
18862
+ }
18863
+ .settings-nav {
18864
+ position: static;
18865
+ flex-direction: row;
18866
+ flex-wrap: wrap;
18867
+ gap: var(--sp-2);
18868
+ padding: 0;
18869
+ }
18870
+ .settings-nav-group {
18871
+ flex-direction: row;
18872
+ flex-wrap: wrap;
18873
+ align-items: center;
18874
+ gap: var(--sp-1);
18875
+ }
18876
+ .settings-nav-group-label {
18877
+ margin: 0;
18878
+ padding: 0;
18879
+ }
18880
+ .settings-nav-link {
18881
+ width: auto;
18882
+ padding: 3px 10px;
18883
+ border: 1px solid var(--border-soft);
18884
+ border-radius: var(--radius-full);
18885
+ font-size: var(--fs-12);
18886
+ }
18887
+ .settings-nav-link.is-active {
18888
+ border-left-color: var(--accent);
18889
+ }
18773
18890
  }
18774
18891
 
18775
18892
  .settings-module {
@@ -19060,7 +19177,32 @@ form.dashboard-toolbar > input[type="text"]:focus {
19060
19177
 
19061
19178
  .settings-alert-card,
19062
19179
  .settings-status-row {
19063
- grid-column: 1 / -1;
19180
+ position: fixed;
19181
+ right: 20px;
19182
+ bottom: 20px;
19183
+ z-index: 900;
19184
+ pointer-events: none;
19185
+ }
19186
+
19187
+ .settings-status-row .oncall-status {
19188
+ display: inline-block;
19189
+ padding: 6px 14px;
19190
+ border-radius: var(--radius-full);
19191
+ background: var(--surface);
19192
+ border: 1px solid var(--border-soft);
19193
+ box-shadow: var(--sh-md);
19194
+ font-size: var(--fs-12);
19195
+ transition: opacity var(--t-norm), transform var(--t-norm);
19196
+ }
19197
+
19198
+ .settings-status-row .oncall-status:empty {
19199
+ opacity: 0;
19200
+ transform: translateY(4px);
19201
+ }
19202
+
19203
+ .settings-status-row .oncall-status.hint-ok {
19204
+ border-color: color-mix(in srgb, var(--success, var(--st-ok)) 40%, var(--border-soft));
19205
+ color: var(--success, var(--st-ok));
19064
19206
  }
19065
19207
 
19066
19208
  .settings-block {
@@ -19347,14 +19489,6 @@ form.dashboard-toolbar > input[type="text"]:focus {
19347
19489
  margin-top: 0;
19348
19490
  }
19349
19491
 
19350
- .settings-status-row {
19351
- min-height: 24px;
19352
- }
19353
-
19354
- .settings-status-row .oncall-status:empty {
19355
- display: none;
19356
- }
19357
-
19358
19492
  .update-actions .page-primary-action {
19359
19493
  border-color: color-mix(in srgb, var(--accent) 58%, var(--border-soft));
19360
19494
  background: transparent;
@@ -22964,6 +23098,15 @@ dialog select[multiple]:hover:not(:disabled) {
22964
23098
  outline-offset: -4px;
22965
23099
  }
22966
23100
 
23101
+ /* 保存成功状态 1.5s 后淡出(StatusSpan 以文案为 key 重挂载以重启动画) */
23102
+ .bot-defaults-page .oncall-status.hint-ok {
23103
+ animation: bd-status-fade 0.3s ease 1.5s forwards;
23104
+ }
23105
+
23106
+ @keyframes bd-status-fade {
23107
+ to { opacity: 0; transform: translateY(-2px); }
23108
+ }
23109
+
22967
23110
  .bot-defaults-page .bd-tab-hint {
22968
23111
  flex: none;
22969
23112
  color: var(--faint);
@@ -24052,6 +24195,60 @@ dialog select[multiple]:hover:not(:disabled) {
24052
24195
  z-index: 1300;
24053
24196
  }
24054
24197
 
24198
+ /* ── ModelPickerField:下拉候选 + 自定义输入(defaults 页与 onboarding 共用) ── */
24199
+ .bd-model-picker {
24200
+ display: grid;
24201
+ gap: 6px;
24202
+ min-width: 0;
24203
+ }
24204
+
24205
+ /* 自定义模式:输入框与返回按钮并排,输入框占满剩余宽度 */
24206
+ .bd-model-custom {
24207
+ display: flex;
24208
+ gap: 8px;
24209
+ align-items: center;
24210
+ min-width: 0;
24211
+ }
24212
+
24213
+ .bd-model-custom > input[type="text"] {
24214
+ flex: 1 1 auto;
24215
+ min-width: 0;
24216
+ }
24217
+
24218
+ .bd-model-back {
24219
+ flex: none;
24220
+ min-height: var(--button-height);
24221
+ padding: 0 var(--button-padding-x);
24222
+ }
24223
+
24224
+ /* live 探测进行中:控件下方小转圈(无文案,避免再增 i18n key) */
24225
+ .bd-model-busy {
24226
+ display: inline-flex;
24227
+ align-items: center;
24228
+ gap: 6px;
24229
+ color: var(--muted);
24230
+ font-size: 11px;
24231
+ line-height: 1.4;
24232
+ }
24233
+
24234
+ .bd-model-spinner {
24235
+ width: 12px;
24236
+ height: 12px;
24237
+ flex: none;
24238
+ border: 2px solid color-mix(in srgb, currentColor 34%, transparent);
24239
+ border-top-color: currentColor;
24240
+ border-radius: 50%;
24241
+ animation: page-loading-rotate 0.8s linear infinite;
24242
+ }
24243
+
24244
+ /* 探测结果提示(「已探测 N 个可用模型」) */
24245
+ .bd-model-detected {
24246
+ color: var(--muted);
24247
+ font-size: 11px;
24248
+ font-weight: 500;
24249
+ line-height: 1.45;
24250
+ }
24251
+
24055
24252
  .bot-defaults-page :where(.bd-section, .bd-subsection) > .actions,
24056
24253
  .bot-defaults-page .bd-row > .actions {
24057
24254
  justify-content: flex-end;
@@ -26714,33 +26911,27 @@ button.ui-refresh-button.is-loading .ui-action-icon {
26714
26911
  }
26715
26912
  }
26716
26913
 
26717
- /* ── Schedule create/edit form modal ─────────────────────────────────────── */
26718
- .schedule-form-overlay {
26719
- position: fixed;
26720
- inset: 0;
26721
- background: color-mix(in srgb, var(--bg) 72%, transparent);
26722
- backdrop-filter: blur(3px);
26723
- display: flex;
26724
- align-items: center;
26725
- justify-content: center;
26726
- z-index: 1000;
26727
- padding: 24px;
26728
- }
26729
-
26914
+ /* ── Schedule create/edit form modal(原生 <dialog>) ────────────────────── */
26730
26915
  .schedule-form-dialog {
26731
26916
  background: var(--surface);
26732
26917
  border: 1px solid var(--border-soft);
26733
- border-radius: 12px;
26734
- box-shadow: 0 16px 48px color-mix(in srgb, #000 28%, transparent);
26735
- width: min(560px, 100%);
26918
+ border-radius: var(--radius-lg);
26919
+ box-shadow: var(--sh-lg);
26920
+ width: min(560px, calc(100vw - 32px));
26736
26921
  max-height: 90dvh;
26737
26922
  overflow-y: auto;
26738
26923
  padding: 24px;
26924
+ color: var(--text);
26925
+ }
26926
+
26927
+ .schedule-form-dialog::backdrop {
26928
+ background: color-mix(in srgb, var(--bg) 72%, transparent);
26929
+ backdrop-filter: blur(3px);
26739
26930
  }
26740
26931
 
26741
26932
  .schedule-form-dialog h2 {
26742
26933
  margin: 0 0 16px;
26743
- font-size: 18px;
26934
+ font-size: var(--fs-17);
26744
26935
  }
26745
26936
 
26746
26937
  .schedule-form {
@@ -26766,7 +26957,7 @@ button.ui-refresh-button.is-loading .ui-action-icon {
26766
26957
  width: 100%;
26767
26958
  padding: 8px 10px;
26768
26959
  border: 1px solid var(--border-soft);
26769
- border-radius: 6px;
26960
+ border-radius: var(--radius-sm);
26770
26961
  background: var(--surface);
26771
26962
  color: var(--text);
26772
26963
  font-size: 13px;
@@ -26841,58 +27032,140 @@ button.ui-refresh-button.is-loading .ui-action-icon {
26841
27032
  margin: 0;
26842
27033
  }
26843
27034
 
26844
- .schedule-form-actions {
26845
- display: flex;
26846
- justify-content: flex-end;
26847
- gap: 10px;
26848
- margin-top: 8px;
27035
+ /* 必填星号 */
27036
+ .schedule-form-label .req {
27037
+ color: var(--danger);
27038
+ font-style: normal;
27039
+ font-weight: 700;
26849
27040
  }
26850
27041
 
26851
- .schedule-form-cancel,
26852
- .schedule-form-submit {
26853
- padding: 8px 16px;
26854
- border-radius: 6px;
26855
- font-size: 13px;
26856
- cursor: pointer;
26857
- border: 1px solid var(--border-soft);
27042
+ /* 内联校验错误 / 下次执行预览 */
27043
+ .schedule-form-error-inline {
27044
+ font-size: 11px;
27045
+ color: var(--danger);
26858
27046
  }
26859
27047
 
26860
- .schedule-form-cancel {
26861
- background: transparent;
26862
- color: var(--text);
27048
+ .schedule-form-preview {
27049
+ font-size: 11px;
27050
+ color: var(--success, var(--st-ok));
26863
27051
  }
26864
27052
 
26865
- .schedule-form-submit {
26866
- background: var(--accent);
26867
- color: #fff;
26868
- border-color: var(--accent);
27053
+ /* 快捷模板 chips */
27054
+ .schedule-templates {
27055
+ display: flex;
27056
+ flex-wrap: wrap;
27057
+ gap: 6px;
27058
+ margin-bottom: 6px;
26869
27059
  }
26870
27060
 
26871
- .schedule-form-submit:disabled {
26872
- opacity: 0.5;
26873
- cursor: not-allowed;
27061
+ .schedule-template-chip {
27062
+ padding: 4px 10px;
27063
+ border: 1px solid var(--border-soft);
27064
+ border-radius: var(--radius-full);
27065
+ background: var(--surface);
27066
+ color: var(--muted);
27067
+ font-size: 11px;
27068
+ cursor: pointer;
27069
+ transition: border-color var(--t-fast), color var(--t-fast), background var(--t-fast);
26874
27070
  }
26875
27071
 
26876
- .schedule-edit-button,
26877
- .schedule-delete-button {
26878
- min-width: 56px !important;
27072
+ .schedule-template-chip:hover {
27073
+ border-color: var(--accent);
27074
+ color: var(--accent);
26879
27075
  }
26880
27076
 
26881
- .schedule-delete-button {
26882
- color: var(--danger) !important;
26883
- border-color: color-mix(in srgb, var(--danger) 48%, var(--border-soft)) !important;
27077
+ .schedule-template-chip.is-active {
27078
+ border-color: var(--accent);
27079
+ background: color-mix(in srgb, var(--accent) 10%, transparent);
27080
+ color: var(--accent);
27081
+ font-weight: 600;
26884
27082
  }
26885
27083
 
26886
- /* --- Skills page: cross-link chips, issue strip, focus highlights --- */
26887
- /* Chips rendered as <button> for click-through navigation: strip default button chrome */
26888
- button.skills-pack-chip,
26889
- button.skills-skill-chip,
26890
- button.skills-pack-ref-chip,
26891
- .skills-usage-chip,
26892
- .skills-missing-skill-chip {
27084
+ /* 手动输入 / 返回选择 链接 */
27085
+ .schedule-form-link {
27086
+ align-self: flex-start;
27087
+ margin-top: 4px;
27088
+ padding: 0;
26893
27089
  border: none;
26894
- font-family: inherit;
26895
- cursor: pointer;
27090
+ background: none;
27091
+ color: var(--accent);
27092
+ font-size: 11px;
27093
+ cursor: pointer;
27094
+ text-decoration: underline;
27095
+ text-underline-offset: 2px;
27096
+ }
27097
+
27098
+ /* select 与输入框同宽同风格 */
27099
+ .schedule-form-field select {
27100
+ width: 100%;
27101
+ padding: 8px 10px;
27102
+ border: 1px solid var(--border-soft);
27103
+ border-radius: var(--radius-sm);
27104
+ background: var(--surface);
27105
+ color: var(--text);
27106
+ font-size: 13px;
27107
+ font-family: inherit;
27108
+ }
27109
+
27110
+ /* aria-invalid 红框 */
27111
+ .schedule-form-field input[aria-invalid="true"],
27112
+ .schedule-form-field select[aria-invalid="true"],
27113
+ .schedule-form-field textarea[aria-invalid="true"] {
27114
+ border-color: var(--danger);
27115
+ }
27116
+
27117
+ .schedule-form-actions {
27118
+ display: flex;
27119
+ justify-content: flex-end;
27120
+ gap: 10px;
27121
+ margin-top: 8px;
27122
+ }
27123
+
27124
+ .schedule-form-cancel,
27125
+ .schedule-form-submit {
27126
+ padding: 8px 16px;
27127
+ border-radius: var(--radius-sm);
27128
+ font-size: 13px;
27129
+ cursor: pointer;
27130
+ border: 1px solid var(--border-soft);
27131
+ }
27132
+
27133
+ .schedule-form-cancel {
27134
+ background: transparent;
27135
+ color: var(--text);
27136
+ }
27137
+
27138
+ .schedule-form-submit {
27139
+ background: var(--accent);
27140
+ color: #fff;
27141
+ border-color: var(--accent);
27142
+ }
27143
+
27144
+ .schedule-form-submit:disabled {
27145
+ opacity: 0.5;
27146
+ cursor: not-allowed;
27147
+ }
27148
+
27149
+ .schedule-edit-button,
27150
+ .schedule-delete-button {
27151
+ min-width: 56px !important;
27152
+ }
27153
+
27154
+ .schedule-delete-button {
27155
+ color: var(--danger) !important;
27156
+ border-color: color-mix(in srgb, var(--danger) 48%, var(--border-soft)) !important;
27157
+ }
27158
+
27159
+ /* --- Skills page: cross-link chips, issue strip, focus highlights --- */
27160
+ /* Chips rendered as <button> for click-through navigation: strip default button chrome */
27161
+ button.skills-pack-chip,
27162
+ button.skills-skill-chip,
27163
+ button.skills-pack-ref-chip,
27164
+ .skills-usage-chip,
27165
+ .skills-missing-skill-chip {
27166
+ border: none;
27167
+ font-family: inherit;
27168
+ cursor: pointer;
26896
27169
  }
26897
27170
  button.skills-pack-chip:hover:not(:disabled),
26898
27171
  button.skills-skill-chip:hover:not(:disabled),
@@ -27277,7 +27550,8 @@ button.skills-issue-badge:hover {
27277
27550
  display: grid;
27278
27551
  place-items: center;
27279
27552
  padding: 20px;
27280
- background: rgb(15 23 42 / 62%);
27553
+ /* 主题感知的遮罩:暗色下更深、亮色下偏灰蓝,跟 .feishu-login-overlay 一致 */
27554
+ background: var(--modal-backdrop, rgb(15 23 42 / 62%));
27281
27555
  }
27282
27556
 
27283
27557
  .feed-group-auth-card {
@@ -27285,18 +27559,24 @@ button.skills-issue-badge:hover {
27285
27559
  padding: 24px;
27286
27560
  border: 1px solid var(--border);
27287
27561
  border-radius: 14px;
27288
- background: var(--panel, #fff);
27289
- color: #111827;
27290
- box-shadow: 0 24px 70px rgb(0 0 0 / 28%);
27562
+ /* 用主题 token 而非硬编码白底/深字:暗色主题下随 --surface/--fg 翻深,
27563
+ 不再是刺眼的白块。--panel 仅在 .insights-page 作用域定义,这里 portal 到
27564
+ body 后取不到,故直接用全站通用的 --surface。 */
27565
+ background: var(--surface);
27566
+ color: var(--fg);
27567
+ box-shadow: var(--modal-shadow, 0 24px 70px rgb(0 0 0 / 28%));
27291
27568
  }
27292
27569
 
27293
- .feed-group-auth-card h3 { margin-top: 0; }
27294
- .feed-group-auth-card p,
27570
+ .feed-group-auth-card h3 { margin-top: 0; color: var(--fg); }
27571
+ .feed-group-auth-card p { color: var(--muted); }
27295
27572
  .feed-group-auth-card label,
27296
- .feed-group-auth-card label span { color: #111827; }
27573
+ .feed-group-auth-card label span { color: var(--fg); }
27297
27574
  .feed-group-auth-card label { display: grid; gap: 8px; margin-top: 18px; }
27298
- .feed-group-auth-card input { width: 100%; box-sizing: border-box; color: #111827; background: #fff; }
27299
- .feed-group-auth-card input::placeholder { color: #4b5563; opacity: 1; }
27575
+ /* 输入框的配色/边框/内距交给全站基础 input 规则(已用 --surface-raised/--fg/
27576
+ --border,主题感知),那条规则带 7 :not() 守卫、特异性高于本作用域,这里
27577
+ 只补它不管的布局:占满宽度 + border-box。 */
27578
+ .feed-group-auth-card input { width: 100%; box-sizing: border-box; }
27579
+ .feed-group-auth-card input::placeholder { color: var(--faint); opacity: 1; }
27300
27580
  .feed-group-auth-card .actions { margin-top: 20px; justify-content: flex-end; }
27301
27581
  .feed-group-auth-open {
27302
27582
  display: inline-flex;
@@ -27305,15 +27585,15 @@ button.skills-issue-badge:hover {
27305
27585
  min-height: 42px;
27306
27586
  margin-top: 4px;
27307
27587
  padding: 0 20px;
27308
- border: 1px solid #2563eb;
27588
+ border: 1px solid var(--accent);
27309
27589
  border-radius: 8px;
27310
- color: #fff;
27311
- background: #2563eb;
27590
+ color: var(--on-accent);
27591
+ background: var(--accent);
27312
27592
  font-weight: 700;
27313
27593
  cursor: pointer;
27314
27594
  }
27315
27595
 
27316
- .feed-group-auth-open:hover { background: #1d4ed8; }
27596
+ .feed-group-auth-open:hover { background: var(--accent-hover); border-color: var(--accent-hover); }
27317
27597
 
27318
27598
  .cs-advanced-fields .cs-feed-group {
27319
27599
  min-width: 0;
@@ -27696,6 +27976,32 @@ button.skills-issue-badge:hover {
27696
27976
  .feedback-more { margin-top: 12px; }
27697
27977
  @media (max-width: 1100px) { .feedback-kpis { grid-template-columns: repeat(3, 1fr); } .feedback-deliveries > div { grid-template-columns: 1fr 1fr; } }
27698
27978
  @media (max-width: 700px) { .feedback-kpis, .feedback-grid { grid-template-columns: 1fr; } }
27979
+
27980
+ /* ── VC per-bot in-meeting output policy table ─────────────────────────── */
27981
+ .vc-bot-policy-table { display: flex; flex-direction: column; gap: 2px; }
27982
+ .vc-bot-policy-row {
27983
+ display: flex; align-items: center; gap: 12px; flex-wrap: wrap;
27984
+ padding: 6px 8px; border-radius: 6px;
27985
+ }
27986
+ .vc-bot-policy-row:nth-child(odd) { background: color-mix(in srgb, currentColor 4%, transparent); }
27987
+ .vc-bot-policy-name {
27988
+ flex: 1 1 160px; min-width: 140px; overflow: hidden;
27989
+ text-overflow: ellipsis; white-space: nowrap; font-weight: 500;
27990
+ }
27991
+ .vc-bot-policy-cell { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; opacity: .92; }
27992
+ .vc-bot-policy-select { font-size: 12px; padding: 2px 6px; border-radius: 4px; }
27993
+ .vc-bot-policy-rtv input { accent-color: var(--accent, #4c8dff); }
27994
+ .vc-bot-policy-effective { font-size: 11px; white-space: nowrap; }
27995
+ .vc-bot-policy-warn { font-style: normal; margin-left: 6px; cursor: help; opacity: .85; }
27996
+ /* ⚠ 用 InfoTip(hover 可靠、body 传送门)而非原生 title——原生 title 小元素上常
27997
+ 触发不了/延迟长。tip 包裹层内联不撑行,弹层多行分条列出。 */
27998
+ .vc-bot-policy-warn-tip { display: inline-flex; align-items: center; }
27999
+ .vc-bot-policy-warn-pop { display: flex; flex-direction: column; gap: 2px; text-align: left; }
28000
+ .vc-bot-policy-search {
28001
+ font-size: 12px; padding: 4px 8px; border-radius: 6px;
28002
+ border: 1px solid var(--border, #d0d5dd); min-width: 180px; max-width: 260px;
28003
+ }
28004
+ .vc-bot-policy-empty { padding: 12px; text-align: center; }
27699
28005
  /* Agent Workbench — reader-flavoured terminal surface: no gradients, no decorative
27700
28006
  rules, and independent from the Dashboard card/aurora vocabulary.
27701
28007
  段内三条硬约束,改之前先读:
@@ -28479,6 +28785,13 @@ button.skills-issue-badge:hover {
28479
28785
  .wb-mode-chip.is-interactive { color: var(--ok); background: var(--wb-success-soft); }
28480
28786
  .wb-mode-chip.is-readonly,
28481
28787
  .wb-mode-chip.is-preview { color: var(--warn); background: var(--wb-warning-soft); }
28788
+ /* 「未知」是真的第三种状态,不是只读的一种说法:接管/释放的回执丢了,这一刻既不
28789
+ 能说已接管也不能说只读。用中性灰把它和两个确定态区分开,别借用 warn 的黄色—
28790
+ 那会让人以为界面已经给出了只读这个结论。 */
28791
+ .wb-mode-chip.is-unknown { color: var(--text-2); background: var(--bg-l3); }
28792
+ /* 「检查中」= 首屏权威读数还没回来。和「未知」同属「没有结论」,但它是**正在收敛**
28793
+ 的一拍,不是失败态,所以用同一套中性色、不另起一种视觉语言。 */
28794
+ .wb-mode-chip.is-checking { color: var(--text-3); background: var(--bg-l3); }
28482
28795
  .wb-lease-time { color: var(--text-3); font-size: 11px; white-space: nowrap; }
28483
28796
  .wb-pane-feedback {
28484
28797
  overflow: hidden;
@@ -28536,7 +28849,7 @@ button.skills-issue-badge:hover {
28536
28849
  }
28537
28850
  .wb-term-reader {
28538
28851
  --term-pad: 6px 8px 8px 8px;
28539
- --term-line-height: 1.3;
28852
+ --term-line-height: 1.15;
28540
28853
  --term-font-size: 12px;
28541
28854
  }
28542
28855
  .wb-pane-empty {
@@ -28578,6 +28891,34 @@ button.skills-issue-badge:hover {
28578
28891
  /* 末尾那句「⋯ 菜单」是补充说明,压一号字,别和上面的正文抢注意力 */
28579
28892
  .wb-ws-blocked p:last-of-type { font-size: 11px; }
28580
28893
 
28894
+ /* 控制权状态未知(回执丢了、首屏读不到)时**顶替**终端 iframe 的那一屏——不是盖在
28895
+ 它上面:盖层只吃指针事件,焦点已经在 iframe 里时键盘照旧打得进去(真实 Chromium
28896
+ 里量过)。所以 TSX 那边直接不挂 iframe,这里铺满整块画布区,复核一回来就撤。 */
28897
+ .wb-control-unknown {
28898
+ position: absolute;
28899
+ inset: 0;
28900
+ z-index: 4;
28901
+ border-radius: 0;
28902
+ background: var(--bg-l1);
28903
+ }
28904
+ .wb-control-unknown button {
28905
+ min-height: 32px;
28906
+ padding: 0 12px;
28907
+ border: 0;
28908
+ border-radius: var(--radius-md);
28909
+ background: var(--bg-l3);
28910
+ }
28911
+
28912
+ /* 首屏控制权还在确认:与「未知」同一种「先不接入终端画面」的处理,只是文案更平静
28913
+ (这是正常的等待,不是出了岔子),所以不给重试按钮。 */
28914
+ .wb-control-checking {
28915
+ position: absolute;
28916
+ inset: 0;
28917
+ z-index: 4;
28918
+ border-radius: 0;
28919
+ background: var(--bg-l1);
28920
+ }
28921
+
28581
28922
  .wb-info-drawer {
28582
28923
  position: absolute;
28583
28924
  top: 106px;
@@ -29384,9 +29725,10 @@ body:has(.workbench-route-host) { min-width: 0; }
29384
29725
  /* 「跟随系统」比另外两段长,给模式分段一个更宽的下限,三段仍然等宽。 */
29385
29726
  .wb-appearance-mode-seg > .wb-seg-item { min-width: 56px; }
29386
29727
 
29387
- /* 触屏露出的操作组:一块 156×56 的板,不是三块。
29388
- 156 = 3 × 52,每个动作 52 × 56,宽高都超过 44px 的指尖下限;56 = 行卡底板高
29389
- (60px 行高减去上下各 2px inset),与行卡等高。
29728
+ /* 触屏露出的操作组:一块随动作数增长的 52n×56 板,不是若干散块。
29729
+ 每个动作 52 × 56,宽高都超过 44px 的指尖下限;56 = 行卡底板高
29730
+ (60px 行高减去上下各 2px inset),与行卡等高。话题行现在比普通行多
29731
+ 「定位 + 跳转」,容器不能再按旧的固定三个动作写死为 156px,否则第四项溢出。
29390
29732
  组的右缘与行卡的 8px 内缩落在同一条线上:贴屏边会让滑出的这一行比其余每一行都
29391
29733
  多探出 8px,静态图上一眼看得出跑偏。
29392
29734
  选择器只写 `.wb-session-row-actions`:行操作那个 <span> 从来只有这一个类,
@@ -29399,7 +29741,7 @@ body:has(.workbench-route-host) { min-width: 0; }
29399
29741
  .wb-session-row-actions {
29400
29742
  right: 8px;
29401
29743
  gap: 0;
29402
- width: 156px;
29744
+ width: max-content;
29403
29745
  height: 56px;
29404
29746
  padding: 0;
29405
29747
  border: 0;
@@ -29638,3 +29980,1477 @@ body:has(.workbench-route-host) { min-width: 0; }
29638
29980
  .wb-skin-swatch.is-active .wb-skin-swatch-chip { box-shadow: 0 0 0 2px var(--accent); }
29639
29981
  .wb-skin-swatch-name { color: var(--text-3); font-size: 11px; line-height: 14px; white-space: nowrap; }
29640
29982
  .wb-skin-swatch.is-active .wb-skin-swatch-name { color: var(--text-1); font-weight: 600; }
29983
+
29984
+ /* ═══════════════════════════════════════════════════════════════════
29985
+ Toast 系统(toast.tsx)
29986
+ 全局单例 + 事件发射器,容器 <ToastStack /> 在 app.tsx 挂载一次。
29987
+ ═══════════════════════════════════════════════════════════════════ */
29988
+ .toast-stack {
29989
+ position: fixed;
29990
+ bottom: 24px;
29991
+ left: 50%;
29992
+ transform: translateX(-50%);
29993
+ z-index: var(--z-toast);
29994
+ display: flex;
29995
+ flex-direction: column;
29996
+ gap: 8px;
29997
+ align-items: center;
29998
+ pointer-events: none;
29999
+ max-width: 100vw;
30000
+ }
30001
+ .toast-item {
30002
+ pointer-events: auto;
30003
+ display: flex;
30004
+ align-items: center;
30005
+ gap: 8px;
30006
+ background: var(--fg);
30007
+ color: var(--bg);
30008
+ padding: 9px 16px;
30009
+ border-radius: var(--radius-md);
30010
+ font-size: var(--fs-13);
30011
+ font-weight: var(--fw-m);
30012
+ line-height: var(--lh-title);
30013
+ box-shadow: var(--sh-lg);
30014
+ animation: toastIn var(--t-norm);
30015
+ max-width: min(90vw, 480px);
30016
+ }
30017
+ .toast-item.is-leaving {
30018
+ opacity: 0;
30019
+ transform: translateY(8px);
30020
+ transition: opacity 200ms ease-out, transform 200ms ease-out;
30021
+ }
30022
+ @keyframes toastIn {
30023
+ from { opacity: 0; transform: translateY(8px); }
30024
+ to { opacity: 1; transform: none; }
30025
+ }
30026
+ .toast-message {
30027
+ overflow-wrap: break-word;
30028
+ min-width: 0;
30029
+ white-space: pre-line;
30030
+ }
30031
+ /* 深色 chip + 浅色文字的语义配色;info/warning 与 success/error 同族语言 */
30032
+ .toast-item-success { background: #17352a; color: #7ee2b2; }
30033
+ .toast-item-error { background: #3d1d22; color: #f2a0aa; }
30034
+ .toast-item-info { background: #152f4d; color: #86bdf2; }
30035
+ .toast-item-warning { background: #3d2c12; color: #f0c478; }
30036
+ :root[data-theme="dark"] .toast-item-success { background: #123528; }
30037
+ :root[data-theme="dark"] .toast-item-error { background: #3a1c22; }
30038
+ :root[data-theme="dark"] .toast-item-info { background: #122c49; }
30039
+ :root[data-theme="dark"] .toast-item-warning { background: #382910; }
30040
+ .toast-action {
30041
+ flex: 0 0 auto;
30042
+ background: rgba(255, 255, 255, .15);
30043
+ border: none;
30044
+ color: inherit;
30045
+ padding: 2px 8px;
30046
+ border-radius: var(--radius-sm);
30047
+ font-size: 12px;
30048
+ font-weight: var(--fw-m);
30049
+ line-height: 1.4;
30050
+ cursor: pointer;
30051
+ white-space: nowrap;
30052
+ transition: background var(--t-fast);
30053
+ }
30054
+ .toast-action:hover { background: rgba(255, 255, 255, .25); }
30055
+
30056
+ /* ═══════════════════════════════════════════════════════════════════
30057
+ ConfirmModal 系统(confirm-modal.tsx)
30058
+ 基于原生 <dialog>:::backdrop 充当 mask,dialog 靠 UA margin:auto 居中。
30059
+ ═══════════════════════════════════════════════════════════════════ */
30060
+ .confirm-modal-dialog {
30061
+ width: 440px;
30062
+ max-width: calc(100vw - 40px);
30063
+ max-height: calc(100vh - 40px);
30064
+ padding: 0;
30065
+ border: 0;
30066
+ background: var(--surface);
30067
+ color: var(--fg);
30068
+ border-radius: var(--radius-lg);
30069
+ box-shadow: var(--modal-shadow);
30070
+ animation: confirmModalIn var(--t-norm);
30071
+ overflow: auto;
30072
+ }
30073
+ .confirm-modal-dialog::backdrop {
30074
+ background: var(--modal-backdrop);
30075
+ }
30076
+ @keyframes confirmModalIn {
30077
+ from { opacity: 0; transform: translateY(12px) scale(.98); }
30078
+ to { opacity: 1; transform: none; }
30079
+ }
30080
+ .confirm-modal-title {
30081
+ margin: 0;
30082
+ padding: var(--sp-5) var(--sp-5) 0;
30083
+ font-size: var(--fs-17);
30084
+ font-weight: var(--fw-s);
30085
+ line-height: var(--lh-title);
30086
+ }
30087
+ .confirm-modal-message {
30088
+ margin: 0;
30089
+ padding: var(--sp-4) var(--sp-5);
30090
+ color: var(--fg-2);
30091
+ font-size: var(--fs-13);
30092
+ line-height: var(--lh-body);
30093
+ overflow-wrap: break-word;
30094
+ white-space: pre-wrap;
30095
+ }
30096
+ .confirm-modal-input-row {
30097
+ padding: 0 var(--sp-5) var(--sp-4);
30098
+ }
30099
+ .confirm-modal-input {
30100
+ width: 100%;
30101
+ }
30102
+ .confirm-modal-footer {
30103
+ padding: 0 var(--sp-5) var(--sp-5);
30104
+ display: flex;
30105
+ justify-content: flex-end;
30106
+ gap: var(--sp-2);
30107
+ }
30108
+ /* 按钮:.btn-primary / .btn-danger / .btn-cancel 作用域收在 footer 内,
30109
+ 稳压全局裸 button 规则(0-0-1)与 dialog 内 :where() 规则(0-0-0)。 */
30110
+ .confirm-modal-footer .btn-primary,
30111
+ .confirm-modal-footer .btn-danger,
30112
+ .confirm-modal-footer .btn-cancel {
30113
+ min-height: var(--button-height);
30114
+ padding: 0 var(--button-padding-x);
30115
+ border-radius: var(--radius-full);
30116
+ font-size: 12px;
30117
+ font-weight: 700;
30118
+ line-height: 1;
30119
+ cursor: pointer;
30120
+ transition: background var(--t-fast), border-color var(--t-fast), color var(--t-fast);
30121
+ }
30122
+ .confirm-modal-footer .btn-cancel {
30123
+ background: transparent;
30124
+ border: 1px solid var(--border);
30125
+ color: var(--fg-2);
30126
+ }
30127
+ .confirm-modal-footer .btn-cancel:hover:not(:disabled) {
30128
+ border-color: var(--border-strong);
30129
+ color: var(--fg);
30130
+ }
30131
+ .confirm-modal-footer .btn-primary {
30132
+ background: var(--accent);
30133
+ border: 1px solid var(--accent);
30134
+ color: var(--on-accent);
30135
+ }
30136
+ .confirm-modal-footer .btn-primary:hover:not(:disabled) {
30137
+ background: var(--accent-hover);
30138
+ border-color: var(--accent-hover);
30139
+ }
30140
+ .confirm-modal-footer .btn-danger {
30141
+ background: var(--danger);
30142
+ border: 1px solid var(--danger);
30143
+ color: var(--on-danger);
30144
+ }
30145
+ .confirm-modal-footer .btn-danger:hover:not(:disabled) {
30146
+ background: color-mix(in srgb, var(--danger) 88%, #000);
30147
+ border-color: color-mix(in srgb, var(--danger) 88%, #000);
30148
+ }
30149
+ .confirm-modal-footer button:disabled {
30150
+ opacity: .5;
30151
+ cursor: not-allowed;
30152
+ }
30153
+
30154
+ @media (prefers-reduced-motion: reduce) {
30155
+ .toast-item,
30156
+ .confirm-modal-dialog { animation: none; }
30157
+ .toast-item.is-leaving { transition: none; }
30158
+ }
30159
+
30160
+ /* ═══════════════════════════════════════════════════════════════════
30161
+ Overview(工作台)— Calm Console:注意力即层级
30162
+ 布局顺序:头部 → 统计条 → 需要你处理 → 进行中 → 数字员工 → 定时任务
30163
+ 纯 token 驱动,暗色模式自动生效。
30164
+ ═══════════════════════════════════════════════════════════════════ */
30165
+
30166
+ /* ── 页面头部:标题 + 副标题(在线/待处理/实时同步)+ 操作 ─────────────── */
30167
+ /* hero-page 仅工作台使用:覆盖 baseline 的「首子元素 flex 横排」,让副标题落在标题下 */
30168
+ .hero-page .page-heading > :first-child {
30169
+ display: block;
30170
+ min-width: 0;
30171
+ }
30172
+ .overview-subtitle {
30173
+ display: flex;
30174
+ align-items: center;
30175
+ flex-wrap: wrap;
30176
+ gap: var(--sp-2);
30177
+ margin: var(--sp-1) 0 0;
30178
+ font-size: var(--fs-13);
30179
+ color: var(--muted);
30180
+ }
30181
+ .overview-live {
30182
+ display: inline-flex;
30183
+ align-items: center;
30184
+ gap: 6px;
30185
+ font-size: var(--fs-12);
30186
+ color: var(--faint);
30187
+ white-space: nowrap;
30188
+ }
30189
+ .overview-live i {
30190
+ width: 7px;
30191
+ height: 7px;
30192
+ border-radius: var(--radius-full);
30193
+ background: var(--success);
30194
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--success) 16%, transparent);
30195
+ animation: overview-live-pulse 2.4s ease-in-out infinite;
30196
+ }
30197
+ .overview-live.is-offline { color: var(--warning); }
30198
+ .overview-live.is-offline i {
30199
+ background: var(--warning);
30200
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--warning) 16%, transparent);
30201
+ }
30202
+ @keyframes overview-live-pulse {
30203
+ 0%, 100% { opacity: 1; }
30204
+ 50% { opacity: 0.4; }
30205
+ }
30206
+
30207
+ /* ── 统计条:4 个 stat chip(图标 + 大数字 + 标签 + 迷你 sparkline)────── */
30208
+ .overview-stats {
30209
+ display: grid;
30210
+ grid-template-columns: repeat(4, minmax(0, 1fr));
30211
+ gap: var(--sp-3);
30212
+ }
30213
+ .stat-chip {
30214
+ --chip-tone: var(--muted);
30215
+ --chip-tone-soft: var(--surface-muted);
30216
+ display: flex;
30217
+ align-items: center;
30218
+ gap: var(--sp-3);
30219
+ min-width: 0;
30220
+ padding: var(--sp-3) var(--sp-4);
30221
+ background: var(--surface);
30222
+ border: 1px solid var(--border);
30223
+ border-radius: var(--radius-lg);
30224
+ box-shadow: var(--sh-sm);
30225
+ transition: box-shadow var(--t-fast), transform var(--t-fast), border-color var(--t-fast);
30226
+ }
30227
+ .stat-chip:hover {
30228
+ box-shadow: var(--sh-md);
30229
+ transform: translateY(-1px);
30230
+ border-color: var(--border-strong);
30231
+ }
30232
+ .stat-chip--need { --chip-tone: var(--st-need); --chip-tone-soft: var(--st-need-soft); }
30233
+ .stat-chip--work { --chip-tone: var(--st-work); --chip-tone-soft: var(--st-work-soft); }
30234
+ .stat-chip--active { --chip-tone: var(--muted); --chip-tone-soft: var(--surface-muted); }
30235
+ .stat-chip--online { --chip-tone: var(--success); --chip-tone-soft: var(--success-soft); }
30236
+ .stat-chip-icon {
30237
+ display: inline-flex;
30238
+ align-items: center;
30239
+ justify-content: center;
30240
+ width: 36px;
30241
+ height: 36px;
30242
+ flex: none;
30243
+ border-radius: var(--radius-md);
30244
+ color: var(--chip-tone);
30245
+ background: var(--chip-tone-soft);
30246
+ }
30247
+ .stat-chip-body {
30248
+ display: flex;
30249
+ flex-direction: column;
30250
+ min-width: 0;
30251
+ flex: 1 1 auto;
30252
+ }
30253
+ .stat-chip-value {
30254
+ font-size: var(--fs-24);
30255
+ font-weight: var(--fw-s);
30256
+ line-height: var(--lh-tight);
30257
+ color: var(--fg);
30258
+ font-variant-numeric: tabular-nums;
30259
+ white-space: nowrap;
30260
+ }
30261
+ .stat-chip-suffix {
30262
+ margin-left: 2px;
30263
+ font-size: var(--fs-12);
30264
+ font-weight: var(--fw-m);
30265
+ color: var(--faint);
30266
+ }
30267
+ .stat-chip-label {
30268
+ font-size: var(--fs-12);
30269
+ color: var(--muted);
30270
+ white-space: nowrap;
30271
+ overflow: hidden;
30272
+ text-overflow: ellipsis;
30273
+ }
30274
+ .stat-chip-spark {
30275
+ width: 72px;
30276
+ height: 28px;
30277
+ flex: none;
30278
+ opacity: 0.9;
30279
+ }
30280
+ .stat-chip-spark polygon {
30281
+ fill: var(--chip-tone-soft);
30282
+ stroke: none;
30283
+ }
30284
+ .stat-chip-spark polyline {
30285
+ fill: none;
30286
+ stroke: var(--chip-tone);
30287
+ stroke-width: 2.5;
30288
+ stroke-linecap: round;
30289
+ stroke-linejoin: round;
30290
+ }
30291
+
30292
+ /* ── 需要你处理:琥珀左条卡片队列;无 attention 时是安静的绿色空态 ──────── */
30293
+ .attn-list {
30294
+ display: grid;
30295
+ gap: var(--sp-2);
30296
+ }
30297
+ .attn-item {
30298
+ display: flex;
30299
+ align-items: center;
30300
+ gap: var(--sp-3);
30301
+ min-width: 0;
30302
+ padding: var(--sp-3) var(--sp-4);
30303
+ background: color-mix(in srgb, var(--st-need) 5%, var(--surface));
30304
+ border: 1px solid var(--border);
30305
+ border-left: 3px solid var(--st-need);
30306
+ border-radius: var(--radius-md);
30307
+ box-shadow: var(--sh-sm);
30308
+ color: inherit;
30309
+ text-decoration: none;
30310
+ transition: box-shadow var(--t-fast), transform var(--t-fast), border-color var(--t-fast);
30311
+ }
30312
+ .attn-item:hover {
30313
+ box-shadow: var(--sh-md);
30314
+ transform: translateX(2px);
30315
+ border-color: color-mix(in srgb, var(--st-need) 38%, var(--border));
30316
+ }
30317
+ .attn-main {
30318
+ display: flex;
30319
+ flex-direction: column;
30320
+ gap: 2px;
30321
+ min-width: 0;
30322
+ flex: 1 1 auto;
30323
+ }
30324
+ .attn-main b {
30325
+ font-size: var(--fs-13);
30326
+ font-weight: var(--fw-s);
30327
+ color: var(--fg);
30328
+ white-space: nowrap;
30329
+ overflow: hidden;
30330
+ text-overflow: ellipsis;
30331
+ }
30332
+ .attn-main span {
30333
+ font-size: var(--fs-12);
30334
+ color: var(--muted);
30335
+ white-space: nowrap;
30336
+ overflow: hidden;
30337
+ text-overflow: ellipsis;
30338
+ }
30339
+ .attn-action {
30340
+ flex: none;
30341
+ display: inline-flex;
30342
+ align-items: center;
30343
+ min-height: 28px;
30344
+ padding: 0 var(--sp-3);
30345
+ border-radius: var(--radius-full);
30346
+ background: var(--st-need-soft);
30347
+ color: var(--st-need);
30348
+ font-size: var(--fs-12);
30349
+ font-weight: var(--fw-s);
30350
+ white-space: nowrap;
30351
+ }
30352
+ .attn-empty {
30353
+ display: flex;
30354
+ align-items: center;
30355
+ gap: var(--sp-3);
30356
+ padding: var(--sp-4) var(--sp-5);
30357
+ background: var(--surface);
30358
+ border: 1px solid var(--border);
30359
+ border-radius: var(--radius-lg);
30360
+ box-shadow: var(--sh-sm);
30361
+ color: var(--muted);
30362
+ font-size: var(--fs-13);
30363
+ }
30364
+ .attn-empty-icon {
30365
+ display: inline-flex;
30366
+ align-items: center;
30367
+ justify-content: center;
30368
+ width: 32px;
30369
+ height: 32px;
30370
+ flex: none;
30371
+ border-radius: var(--radius-full);
30372
+ background: var(--success-soft);
30373
+ color: var(--success);
30374
+ }
30375
+
30376
+ /* ── 进行中:面板内紧凑行,整行点击跳转会话页 ─────────────────────────── */
30377
+ .active-sessions-panel > .work-list {
30378
+ flex: 1;
30379
+ min-height: 0;
30380
+ align-content: start;
30381
+ display: grid;
30382
+ gap: var(--sp-1);
30383
+ padding: var(--sp-2);
30384
+ overflow-x: hidden;
30385
+ overflow-y: auto;
30386
+ }
30387
+ .work-item {
30388
+ display: flex;
30389
+ align-items: center;
30390
+ gap: var(--sp-3);
30391
+ min-width: 0;
30392
+ padding: var(--sp-2) var(--sp-3);
30393
+ border: 1px solid transparent;
30394
+ border-radius: var(--radius-md);
30395
+ color: inherit;
30396
+ text-decoration: none;
30397
+ transition: background var(--t-fast), border-color var(--t-fast);
30398
+ }
30399
+ .work-item:hover {
30400
+ background: var(--surface-hover);
30401
+ border-color: var(--border-soft);
30402
+ }
30403
+ .work-main {
30404
+ display: flex;
30405
+ flex-direction: column;
30406
+ gap: 2px;
30407
+ min-width: 0;
30408
+ flex: 1 1 auto;
30409
+ }
30410
+ .work-main b {
30411
+ font-size: var(--fs-13);
30412
+ font-weight: var(--fw-s);
30413
+ color: var(--fg);
30414
+ white-space: nowrap;
30415
+ overflow: hidden;
30416
+ text-overflow: ellipsis;
30417
+ }
30418
+ .work-main span {
30419
+ font-size: var(--fs-12);
30420
+ color: var(--faint);
30421
+ white-space: nowrap;
30422
+ overflow: hidden;
30423
+ text-overflow: ellipsis;
30424
+ }
30425
+ .work-status { flex: none; }
30426
+
30427
+ /* ── 数字员工卡片:收敛到 token 卡片规范(1px border + sh-sm,hover 浮起)── */
30428
+ .mate {
30429
+ gap: var(--sp-3);
30430
+ padding: var(--sp-4);
30431
+ border: 1px solid var(--border);
30432
+ border-radius: var(--radius-lg);
30433
+ box-shadow: var(--sh-sm);
30434
+ transition: transform var(--t-fast), box-shadow var(--t-fast), border-color var(--t-fast);
30435
+ }
30436
+ .mate:hover {
30437
+ transform: translateY(-2px);
30438
+ box-shadow: var(--sh-md);
30439
+ border-color: var(--border-strong);
30440
+ }
30441
+ /* 等你的卡片保持琥珀描边(覆盖上面的 hover border,注意力信号不丢) */
30442
+ .mate-attn {
30443
+ border-color: color-mix(in srgb, var(--st-need) 42%, transparent);
30444
+ }
30445
+ .mate-attn:hover {
30446
+ border-color: color-mix(in srgb, var(--st-need) 62%, var(--border-strong));
30447
+ }
30448
+ /* 旧 dark 玻璃覆盖收敛到纯 token:暗色也走 surface + border,注意力描边生效 */
30449
+ :root[data-theme="dark"] .mate {
30450
+ background: var(--surface);
30451
+ border-color: var(--border);
30452
+ backdrop-filter: none;
30453
+ }
30454
+ :root[data-theme="dark"] .mate:hover {
30455
+ border-color: var(--border-strong);
30456
+ }
30457
+ :root[data-theme="dark"] .mate-attn {
30458
+ border-color: color-mix(in srgb, var(--st-need) 45%, transparent);
30459
+ }
30460
+ :root[data-theme="dark"] .mate-attn:hover {
30461
+ border-color: color-mix(in srgb, var(--st-need) 62%, var(--border-strong));
30462
+ }
30463
+ /* 当前任务:单行截断(原来是 2 行 clamp) */
30464
+ .mate-task {
30465
+ display: block;
30466
+ min-height: 0;
30467
+ font-size: var(--fs-12);
30468
+ white-space: nowrap;
30469
+ overflow: hidden;
30470
+ text-overflow: ellipsis;
30471
+ }
30472
+
30473
+ /* ── 定时任务:紧凑行 + 时钟图标 ──────────────────────────────────────── */
30474
+ .sched-clock {
30475
+ display: inline-flex;
30476
+ align-items: center;
30477
+ justify-content: center;
30478
+ width: 28px;
30479
+ height: 28px;
30480
+ flex: none;
30481
+ border-radius: var(--radius-sm);
30482
+ background: var(--surface-muted);
30483
+ color: var(--faint);
30484
+ }
30485
+
30486
+ /* ── 排程整块隐藏时,主栏占满 ────────────────────────────────────────── */
30487
+ .overview-layout--single {
30488
+ grid-template-columns: minmax(0, 1fr);
30489
+ }
30490
+
30491
+ /* ── 响应式:统计条 2 列、bot 网格 1 列、列表全宽 ─────────────────────── */
30492
+ @media (max-width: 980px) {
30493
+ .overview-stats {
30494
+ grid-template-columns: repeat(2, minmax(0, 1fr));
30495
+ }
30496
+ }
30497
+ @media (max-width: 720px) {
30498
+ .team-grid {
30499
+ grid-template-columns: 1fr;
30500
+ }
30501
+ .stat-chip-spark {
30502
+ display: none;
30503
+ }
30504
+ .stat-chip-label {
30505
+ white-space: normal;
30506
+ }
30507
+ }
30508
+
30509
+ @media (prefers-reduced-motion: reduce) {
30510
+ .overview-live i { animation: none; }
30511
+ .stat-chip,
30512
+ .attn-item,
30513
+ .mate,
30514
+ .work-item { transition: none; }
30515
+ .stat-chip:hover,
30516
+ .attn-item:hover,
30517
+ .mate:hover { transform: none; }
30518
+ }
30519
+
30520
+ /* ═══════════════════════════════════════════════════════════════════
30521
+ Sessions 页视觉改造(2026-08)
30522
+ 筛选条收敛 / 看板卡片重设计 / Drawer 操作分组 / 骨架屏 / 列头降噪。
30523
+ 全部 token 驱动,暗色随 data-theme 自动切换。
30524
+ ═══════════════════════════════════════════════════════════════════ */
30525
+
30526
+ /* ── 1. 筛选条:搜索 + 快捷分段 + 筛选按钮 + 排序 + 清理空闲(ghost) ── */
30527
+ .sessions-page .sessions-filters.sessions-toolbar {
30528
+ display: flex;
30529
+ align-items: center;
30530
+ gap: 8px;
30531
+ flex-wrap: wrap;
30532
+ margin: 0 0 var(--sp-3);
30533
+ padding: 0;
30534
+ border: 0;
30535
+ background: transparent;
30536
+ box-shadow: none;
30537
+ min-height: 0;
30538
+ }
30539
+
30540
+ .sessions-page .sessions-toolbar input[type="search"][name="q"] {
30541
+ flex: 1 1 240px;
30542
+ min-width: 180px;
30543
+ max-width: 420px;
30544
+ height: var(--button-height);
30545
+ min-height: var(--button-height);
30546
+ max-height: var(--button-height);
30547
+ padding: 0 var(--sp-4);
30548
+ border: 1px solid var(--border);
30549
+ border-radius: var(--radius-full);
30550
+ background: var(--surface);
30551
+ font-size: var(--fs-13);
30552
+ }
30553
+
30554
+ .sessions-page .sessions-toolbar .sessions-quick-view {
30555
+ flex: none;
30556
+ border-radius: var(--radius-full);
30557
+ border-color: var(--border-soft);
30558
+ }
30559
+
30560
+ .sessions-page .sessions-toolbar .sessions-quick-view button {
30561
+ min-height: 26px;
30562
+ padding: 0 var(--sp-3);
30563
+ }
30564
+
30565
+ .sessions-filter-btn {
30566
+ display: inline-flex;
30567
+ align-items: center;
30568
+ gap: 6px;
30569
+ flex: none;
30570
+ height: var(--button-height);
30571
+ padding: 0 var(--sp-4);
30572
+ border: 1px solid var(--border);
30573
+ border-radius: var(--radius-full);
30574
+ background: var(--surface);
30575
+ color: var(--fg);
30576
+ font-size: var(--fs-12);
30577
+ font-weight: var(--fw-m);
30578
+ cursor: pointer;
30579
+ transition: border-color var(--t-fast), color var(--t-fast), background var(--t-fast);
30580
+ }
30581
+
30582
+ .sessions-filter-btn:hover {
30583
+ border-color: var(--accent);
30584
+ color: var(--accent-strong);
30585
+ }
30586
+
30587
+ .sessions-filter-btn.has-active {
30588
+ border-color: var(--accent-border);
30589
+ background: var(--accent-soft);
30590
+ color: var(--accent-strong);
30591
+ }
30592
+
30593
+ .sessions-filter-count {
30594
+ min-width: 18px;
30595
+ height: 18px;
30596
+ padding: 0 5px;
30597
+ display: inline-flex;
30598
+ align-items: center;
30599
+ justify-content: center;
30600
+ border-radius: var(--radius-full);
30601
+ background: var(--accent);
30602
+ color: var(--on-accent);
30603
+ font-size: 11px;
30604
+ font-weight: 700;
30605
+ font-variant-numeric: tabular-nums;
30606
+ }
30607
+
30608
+ .sessions-sort-menu .sect-sort-value {
30609
+ max-width: 200px;
30610
+ overflow: hidden;
30611
+ text-overflow: ellipsis;
30612
+ white-space: nowrap;
30613
+ }
30614
+
30615
+ /* 「清理空闲」降级为 ghost 链接 */
30616
+ .sessions-page .sessions-toolbar .idle-cleanup-bar {
30617
+ margin: 0 0 0 auto;
30618
+ padding: 0;
30619
+ border: 0;
30620
+ background: transparent;
30621
+ box-shadow: none;
30622
+ }
30623
+
30624
+ .sessions-page .sessions-toolbar .idle-cleanup-run {
30625
+ height: var(--button-height);
30626
+ min-height: var(--button-height);
30627
+ padding: 0 var(--sp-2);
30628
+ border: 0;
30629
+ background: transparent;
30630
+ color: var(--faint);
30631
+ font-size: var(--fs-12);
30632
+ font-weight: var(--fw-r);
30633
+ box-shadow: none;
30634
+ }
30635
+
30636
+ .sessions-page .sessions-toolbar .idle-cleanup-run:hover:not(:disabled) {
30637
+ background: transparent;
30638
+ color: var(--danger);
30639
+ }
30640
+
30641
+ .sessions-page .sessions-toolbar .idle-cleanup-run .idle-cleanup-icon {
30642
+ width: 13px;
30643
+ height: 13px;
30644
+ }
30645
+
30646
+ /* ── 2. 高级筛选抽屉 ───────────────────────────────────────────────── */
30647
+ .sessions-filter-drawer {
30648
+ width: min(400px, calc(100vw - 24px));
30649
+ max-width: 400px;
30650
+ padding: 0;
30651
+ border: 0;
30652
+ border-left: 1px solid var(--border);
30653
+ border-radius: 0;
30654
+ background: var(--surface);
30655
+ box-shadow: var(--modal-shadow);
30656
+ }
30657
+
30658
+ .sessions-filter-drawer[open] {
30659
+ display: flex;
30660
+ flex-direction: column;
30661
+ height: 100%;
30662
+ max-height: 100%;
30663
+ top: 0;
30664
+ bottom: 0;
30665
+ margin: 0 0 0 auto;
30666
+ }
30667
+
30668
+ .sessions-filter-drawer::backdrop {
30669
+ background: var(--modal-backdrop);
30670
+ }
30671
+
30672
+ .sessions-filter-drawer > header {
30673
+ flex: none;
30674
+ display: flex;
30675
+ align-items: center;
30676
+ justify-content: space-between;
30677
+ gap: var(--sp-3);
30678
+ padding: var(--sp-4) var(--sp-5);
30679
+ border-bottom: 1px solid var(--border-soft);
30680
+ }
30681
+
30682
+ .sessions-filter-drawer > header h3 {
30683
+ margin: 0;
30684
+ font-size: var(--fs-15);
30685
+ font-weight: var(--fw-s);
30686
+ color: var(--fg);
30687
+ }
30688
+
30689
+ .sessions-filter-drawer-body {
30690
+ flex: 1;
30691
+ min-height: 0;
30692
+ overflow-y: auto;
30693
+ padding: var(--sp-5);
30694
+ display: grid;
30695
+ gap: var(--sp-4);
30696
+ align-content: start;
30697
+ }
30698
+
30699
+ .sessions-filter-field {
30700
+ display: grid;
30701
+ gap: 6px;
30702
+ }
30703
+
30704
+ .sessions-filter-label {
30705
+ font-size: var(--fs-12);
30706
+ font-weight: var(--fw-m);
30707
+ color: var(--muted);
30708
+ }
30709
+
30710
+ .sessions-filter-field select {
30711
+ width: 100%;
30712
+ height: var(--button-height);
30713
+ padding: 0 var(--sp-3);
30714
+ border: 1px solid var(--border);
30715
+ border-radius: var(--radius-md);
30716
+ background-color: var(--surface-raised);
30717
+ color: var(--fg);
30718
+ font-size: var(--fs-13);
30719
+ }
30720
+
30721
+ .sessions-filter-cli {
30722
+ display: grid;
30723
+ gap: var(--sp-2);
30724
+ padding: var(--sp-3);
30725
+ border: 1px solid var(--border-soft);
30726
+ border-radius: var(--radius-md);
30727
+ background: var(--surface-muted);
30728
+ }
30729
+
30730
+ .sessions-filter-cli-search {
30731
+ height: var(--button-height);
30732
+ padding: 0 var(--sp-3);
30733
+ border: 1px solid var(--border);
30734
+ border-radius: var(--radius-md);
30735
+ background: var(--surface);
30736
+ color: var(--fg);
30737
+ font-size: var(--fs-12);
30738
+ }
30739
+
30740
+ .sessions-filter-cli-bulk {
30741
+ display: flex;
30742
+ gap: var(--sp-2);
30743
+ }
30744
+
30745
+ .sessions-filter-cli-bulk button {
30746
+ height: 26px;
30747
+ padding: 0 10px;
30748
+ border: 1px solid var(--border);
30749
+ border-radius: var(--radius-full);
30750
+ background: var(--surface);
30751
+ color: var(--muted);
30752
+ font-size: 11px;
30753
+ cursor: pointer;
30754
+ transition: border-color var(--t-fast), color var(--t-fast);
30755
+ }
30756
+
30757
+ .sessions-filter-cli-bulk button:hover {
30758
+ border-color: var(--accent);
30759
+ color: var(--accent-strong);
30760
+ }
30761
+
30762
+ .sessions-filter-cli-list {
30763
+ display: grid;
30764
+ gap: 2px;
30765
+ max-height: 180px;
30766
+ overflow-y: auto;
30767
+ }
30768
+
30769
+ .sessions-filter-cli-list .filter-check {
30770
+ padding: 4px 8px;
30771
+ border-radius: var(--radius-sm);
30772
+ }
30773
+
30774
+ .sessions-filter-cli-list .filter-check:hover {
30775
+ background: var(--surface-hover);
30776
+ }
30777
+
30778
+ .sessions-filter-toggles {
30779
+ display: grid;
30780
+ gap: var(--sp-2);
30781
+ padding-top: var(--sp-3);
30782
+ border-top: 1px solid var(--border-soft);
30783
+ }
30784
+
30785
+ .sessions-filter-drawer > footer {
30786
+ flex: none;
30787
+ display: flex;
30788
+ align-items: center;
30789
+ justify-content: space-between;
30790
+ gap: var(--sp-3);
30791
+ padding: var(--sp-4) var(--sp-5);
30792
+ border-top: 1px solid var(--border-soft);
30793
+ }
30794
+
30795
+ .sessions-filter-clear {
30796
+ height: var(--button-height);
30797
+ padding: 0 var(--sp-3);
30798
+ border: 0;
30799
+ background: transparent;
30800
+ color: var(--faint);
30801
+ font-size: var(--fs-12);
30802
+ cursor: pointer;
30803
+ }
30804
+
30805
+ .sessions-filter-clear:hover {
30806
+ color: var(--danger);
30807
+ }
30808
+
30809
+ .sessions-filter-done {
30810
+ height: var(--button-height);
30811
+ padding: 0 var(--sp-6);
30812
+ border: 1px solid var(--accent);
30813
+ border-radius: var(--radius-full);
30814
+ background: var(--accent);
30815
+ color: var(--on-accent);
30816
+ font-size: var(--fs-13);
30817
+ font-weight: var(--fw-s);
30818
+ cursor: pointer;
30819
+ transition: background var(--t-fast), border-color var(--t-fast);
30820
+ }
30821
+
30822
+ .sessions-filter-done:hover {
30823
+ background: var(--accent-hover);
30824
+ border-color: var(--accent-hover);
30825
+ }
30826
+
30827
+ /* ── 3. 看板卡片 v2:状态色条 + 标题 + meta + 预览 + 底部标签操作 ──────── */
30828
+ .kanban-card {
30829
+ gap: 5px;
30830
+ padding: 10px 12px 10px 15px;
30831
+ }
30832
+
30833
+ .kanban-card::before {
30834
+ content: '';
30835
+ position: absolute;
30836
+ left: 0;
30837
+ top: 0;
30838
+ bottom: 0;
30839
+ width: 3px;
30840
+ background: var(--st-idle);
30841
+ }
30842
+
30843
+ .kanban-card[data-signal="needs-you"]::before { background: var(--st-need); }
30844
+ .kanban-card[data-signal="working"]::before { background: var(--st-work); }
30845
+ .kanban-card[data-signal="todo"]::before { background: var(--st-todo); }
30846
+ .kanban-card[data-signal="idle"]::before { background: var(--st-idle); }
30847
+ .kanban-card[data-signal="closed"]::before { background: var(--border-strong); }
30848
+
30849
+ .kanban-card-head {
30850
+ display: flex;
30851
+ align-items: center;
30852
+ gap: 6px;
30853
+ min-width: 0;
30854
+ }
30855
+
30856
+ .kanban-card-head .badge {
30857
+ flex: none;
30858
+ max-width: 100%;
30859
+ overflow: hidden;
30860
+ text-overflow: ellipsis;
30861
+ white-space: nowrap;
30862
+ }
30863
+
30864
+ .kanban-card-head .session-signal {
30865
+ min-width: 0;
30866
+ overflow: hidden;
30867
+ text-overflow: ellipsis;
30868
+ white-space: nowrap;
30869
+ }
30870
+
30871
+ .kanban-card-meta {
30872
+ margin: 0;
30873
+ color: var(--muted);
30874
+ font-size: var(--fs-12);
30875
+ white-space: nowrap;
30876
+ overflow: hidden;
30877
+ text-overflow: ellipsis;
30878
+ }
30879
+
30880
+ .kanban-card-preview {
30881
+ margin: 0;
30882
+ padding: 6px 8px;
30883
+ border-radius: var(--radius-sm);
30884
+ background: var(--surface-muted);
30885
+ color: var(--muted);
30886
+ font-family: var(--mono);
30887
+ font-size: 11px;
30888
+ line-height: 1.45;
30889
+ display: -webkit-box;
30890
+ -webkit-line-clamp: 2;
30891
+ -webkit-box-orient: vertical;
30892
+ overflow: hidden;
30893
+ word-break: break-all;
30894
+ }
30895
+
30896
+ .kanban-card-foot {
30897
+ margin-top: 1px;
30898
+ }
30899
+
30900
+ .kanban-card-term {
30901
+ display: inline-flex;
30902
+ align-items: center;
30903
+ gap: 5px;
30904
+ flex: none;
30905
+ height: 24px;
30906
+ padding: 0 10px;
30907
+ border: 1px solid var(--border);
30908
+ border-radius: var(--radius-full);
30909
+ background: var(--surface);
30910
+ color: var(--muted);
30911
+ font-size: var(--fs-12);
30912
+ font-weight: var(--fw-m);
30913
+ cursor: pointer;
30914
+ opacity: 0;
30915
+ pointer-events: none;
30916
+ visibility: hidden;
30917
+ transition: opacity var(--t-fast), visibility var(--t-fast), border-color var(--t-fast), color var(--t-fast);
30918
+ }
30919
+
30920
+ .kanban-card-term svg {
30921
+ width: 12px;
30922
+ height: 12px;
30923
+ }
30924
+
30925
+ .kanban-card-term:hover {
30926
+ border-color: var(--accent);
30927
+ color: var(--accent-strong);
30928
+ }
30929
+
30930
+ .kanban-card-more {
30931
+ margin-left: auto;
30932
+ flex: none;
30933
+ width: 24px;
30934
+ height: 24px;
30935
+ display: inline-flex;
30936
+ align-items: center;
30937
+ justify-content: center;
30938
+ border: 0;
30939
+ border-radius: var(--radius-full);
30940
+ background: transparent;
30941
+ color: var(--faint);
30942
+ cursor: pointer;
30943
+ opacity: 0;
30944
+ pointer-events: none;
30945
+ visibility: hidden;
30946
+ transition: opacity var(--t-fast), visibility var(--t-fast), background var(--t-fast), color var(--t-fast);
30947
+ }
30948
+
30949
+ .kanban-card-more svg {
30950
+ width: 14px;
30951
+ height: 14px;
30952
+ }
30953
+
30954
+ .kanban-card-more:hover {
30955
+ background: var(--surface-hover);
30956
+ color: var(--fg);
30957
+ }
30958
+
30959
+ .kanban-card:hover .kanban-card-term,
30960
+ .kanban-card:focus-within .kanban-card-term,
30961
+ .kanban-card:hover .kanban-card-more,
30962
+ .kanban-card:focus-within .kanban-card-more,
30963
+ .kanban-card-more.is-open {
30964
+ opacity: 1;
30965
+ pointer-events: auto;
30966
+ visibility: visible;
30967
+ }
30968
+
30969
+ @media (hover: none), (max-width: 720px) {
30970
+ .kanban-card-term,
30971
+ .kanban-card-more {
30972
+ opacity: 1;
30973
+ pointer-events: auto;
30974
+ visibility: visible;
30975
+ }
30976
+ }
30977
+
30978
+ /* 卡片「⋯」菜单弹层(portal 到 body,逃出卡片 overflow:hidden) */
30979
+ .card-menu-pop {
30980
+ position: fixed;
30981
+ z-index: var(--z-modal);
30982
+ min-width: 190px;
30983
+ padding: 6px;
30984
+ display: grid;
30985
+ gap: 2px;
30986
+ border: 1px solid var(--border-soft);
30987
+ border-radius: var(--radius-md);
30988
+ background: var(--surface-raised);
30989
+ box-shadow: var(--sh-lg);
30990
+ }
30991
+
30992
+ .card-menu-item {
30993
+ display: flex;
30994
+ align-items: center;
30995
+ gap: 8px;
30996
+ width: 100%;
30997
+ min-height: 32px;
30998
+ padding: 0 10px;
30999
+ border: 0;
31000
+ border-radius: var(--radius-sm);
31001
+ background: transparent;
31002
+ color: var(--fg);
31003
+ font-size: var(--fs-13);
31004
+ text-align: left;
31005
+ cursor: pointer;
31006
+ transition: background var(--t-fast);
31007
+ }
31008
+
31009
+ .card-menu-item:hover:not(:disabled) {
31010
+ background: var(--surface-hover);
31011
+ }
31012
+
31013
+ .card-menu-item:disabled {
31014
+ opacity: 0.5;
31015
+ cursor: not-allowed;
31016
+ }
31017
+
31018
+ .card-menu-item.danger {
31019
+ color: var(--danger);
31020
+ }
31021
+
31022
+ .card-menu-item.danger:hover:not(:disabled) {
31023
+ background: var(--danger-soft);
31024
+ }
31025
+
31026
+ .card-menu-icon {
31027
+ display: inline-flex;
31028
+ flex: none;
31029
+ width: 14px;
31030
+ color: var(--faint);
31031
+ }
31032
+
31033
+ .card-menu-icon svg {
31034
+ width: 14px;
31035
+ height: 14px;
31036
+ }
31037
+
31038
+ .card-menu-item.danger .card-menu-icon {
31039
+ color: var(--danger);
31040
+ }
31041
+
31042
+ a.card-menu-item {
31043
+ text-decoration: none;
31044
+ box-sizing: border-box;
31045
+ }
31046
+
31047
+ /* ── 4. 看板列头:状态色点 + 名称 + 计数徽章 ─────────────────────────── */
31048
+ .kanban-col-dot {
31049
+ flex: none;
31050
+ width: 8px;
31051
+ height: 8px;
31052
+ border-radius: 50%;
31053
+ background: var(--st-idle);
31054
+ }
31055
+
31056
+ .kanban-col-dot-idle { background: var(--st-idle); box-shadow: 0 0 0 3px var(--st-idle-soft); }
31057
+ .kanban-col-dot-todo { background: var(--st-todo); box-shadow: 0 0 0 3px var(--st-todo-soft); }
31058
+ .kanban-col-dot-work { background: var(--st-work); box-shadow: 0 0 0 3px var(--st-work-soft); }
31059
+ .kanban-col-dot-need { background: var(--st-need); box-shadow: 0 0 0 3px var(--st-need-soft); }
31060
+ .kanban-col-dot-done { background: var(--success); box-shadow: 0 0 0 3px var(--success-soft); }
31061
+
31062
+ .kanban-column > header {
31063
+ gap: 8px;
31064
+ padding: 10px 12px;
31065
+ }
31066
+
31067
+ .kanban-column h2 {
31068
+ font-size: var(--fs-13);
31069
+ font-weight: var(--fw-s);
31070
+ }
31071
+
31072
+ .kanban-col-count {
31073
+ margin-left: auto;
31074
+ min-width: 20px;
31075
+ height: 20px;
31076
+ padding: 0 6px;
31077
+ display: inline-flex;
31078
+ align-items: center;
31079
+ justify-content: center;
31080
+ border-radius: var(--radius-full);
31081
+ background: var(--surface-muted);
31082
+ color: var(--muted);
31083
+ font-size: 11px;
31084
+ font-weight: 700;
31085
+ font-variant-numeric: tabular-nums;
31086
+ }
31087
+
31088
+ /* ── 5. 状态板列头降噪:色点保留,名称正体,描述小字,信号色对齐 st-* ──── */
31089
+ .session-board-needs-you { --col-signal: var(--st-need); }
31090
+ .session-board-working { --col-signal: var(--st-work); }
31091
+ .session-board-todo { --col-signal: var(--st-todo); }
31092
+ .session-board-idle { --col-signal: var(--st-idle); }
31093
+
31094
+ .session-board-column > header {
31095
+ min-height: 0;
31096
+ padding: 10px 12px;
31097
+ gap: 8px;
31098
+ }
31099
+
31100
+ .session-board-column h2 {
31101
+ font-family: var(--font);
31102
+ font-size: var(--fs-13);
31103
+ font-weight: var(--fw-s);
31104
+ letter-spacing: 0;
31105
+ text-transform: none;
31106
+ }
31107
+
31108
+ .session-board-column p {
31109
+ font-size: 11px;
31110
+ color: var(--faint);
31111
+ }
31112
+
31113
+ .session-board-count {
31114
+ font-family: inherit;
31115
+ font-size: 11px;
31116
+ }
31117
+
31118
+ /* 状态板卡片:状态色条 + hover 显示操作 */
31119
+ .session-card {
31120
+ padding-left: 14px;
31121
+ }
31122
+
31123
+ .session-card::before {
31124
+ content: '';
31125
+ position: absolute;
31126
+ left: 0;
31127
+ top: 0;
31128
+ bottom: 0;
31129
+ width: 3px;
31130
+ background: var(--st-idle);
31131
+ }
31132
+
31133
+ .session-card[data-signal="needs-you"]::before { background: var(--st-need); }
31134
+ .session-card[data-signal="working"]::before { background: var(--st-work); }
31135
+ .session-card[data-signal="todo"]::before { background: var(--st-todo); }
31136
+ .session-card[data-signal="idle"]::before { background: var(--st-idle); }
31137
+ .session-card[data-signal="closed"]::before { background: var(--border-strong); }
31138
+
31139
+ .session-card-actions {
31140
+ opacity: 0;
31141
+ transition: opacity var(--t-fast);
31142
+ }
31143
+
31144
+ .session-card:hover .session-card-actions,
31145
+ .session-card:focus-within .session-card-actions {
31146
+ opacity: 1;
31147
+ }
31148
+
31149
+ @media (hover: none), (max-width: 720px) {
31150
+ .session-card-actions {
31151
+ opacity: 1;
31152
+ }
31153
+ }
31154
+
31155
+ /* ── 6. Drawer:底部固定操作栏(主/次/危险 + 更多) ─────────────────── */
31156
+ #drawer {
31157
+ width: min(560px, calc(100vw - 32px));
31158
+ padding: 0;
31159
+ overflow: hidden;
31160
+ }
31161
+
31162
+ #drawer article {
31163
+ display: flex;
31164
+ flex-direction: column;
31165
+ gap: 0;
31166
+ max-height: min(86vh, 900px);
31167
+ padding: 0;
31168
+ }
31169
+
31170
+ #drawer header {
31171
+ flex: none;
31172
+ gap: 9px;
31173
+ padding: var(--sp-4) var(--sp-5) var(--sp-3);
31174
+ }
31175
+
31176
+ #drawer .drawer-body {
31177
+ flex: 1;
31178
+ min-height: 0;
31179
+ overflow-y: auto;
31180
+ padding: var(--sp-3) var(--sp-5);
31181
+ display: grid;
31182
+ gap: var(--sp-2);
31183
+ align-content: start;
31184
+ }
31185
+
31186
+ #drawer .drawer-body #insight-btn {
31187
+ justify-self: start;
31188
+ height: var(--button-height);
31189
+ margin-top: var(--sp-2);
31190
+ padding: 0 var(--sp-4);
31191
+ border: 1px solid var(--border);
31192
+ border-radius: var(--radius-full);
31193
+ background: var(--surface);
31194
+ color: var(--fg);
31195
+ font-size: var(--fs-12);
31196
+ cursor: pointer;
31197
+ }
31198
+
31199
+ #drawer .drawer-body #insight-btn:hover:not(:disabled) {
31200
+ border-color: var(--accent);
31201
+ color: var(--accent-strong);
31202
+ }
31203
+
31204
+ #drawer .drawer-foot {
31205
+ flex: none;
31206
+ display: flex;
31207
+ align-items: center;
31208
+ gap: var(--sp-2);
31209
+ padding: var(--sp-3) var(--sp-5);
31210
+ border-top: 1px solid var(--border-soft);
31211
+ background: var(--surface-muted);
31212
+ }
31213
+
31214
+ #drawer .drawer-foot-actions {
31215
+ display: flex;
31216
+ align-items: center;
31217
+ gap: var(--sp-2);
31218
+ flex-wrap: wrap;
31219
+ min-width: 0;
31220
+ }
31221
+
31222
+ .drawer-btn-primary {
31223
+ height: var(--button-height);
31224
+ padding: 0 var(--sp-5);
31225
+ border: 1px solid var(--accent);
31226
+ border-radius: var(--radius-full);
31227
+ background: var(--accent);
31228
+ color: var(--on-accent);
31229
+ font-size: var(--fs-13);
31230
+ font-weight: var(--fw-s);
31231
+ cursor: pointer;
31232
+ transition: background var(--t-fast), border-color var(--t-fast);
31233
+ }
31234
+
31235
+ .drawer-btn-primary:hover:not(:disabled) {
31236
+ background: var(--accent-hover);
31237
+ border-color: var(--accent-hover);
31238
+ }
31239
+
31240
+ .drawer-btn-primary:disabled {
31241
+ opacity: 0.5;
31242
+ cursor: not-allowed;
31243
+ }
31244
+
31245
+ .drawer-btn-secondary {
31246
+ height: var(--button-height);
31247
+ padding: 0 var(--sp-4);
31248
+ border: 1px solid var(--border-strong);
31249
+ border-radius: var(--radius-full);
31250
+ background: var(--surface);
31251
+ color: var(--fg);
31252
+ font-size: var(--fs-13);
31253
+ font-weight: var(--fw-m);
31254
+ cursor: pointer;
31255
+ transition: border-color var(--t-fast), color var(--t-fast);
31256
+ }
31257
+
31258
+ .drawer-btn-secondary:hover:not(:disabled) {
31259
+ border-color: var(--accent);
31260
+ color: var(--accent-strong);
31261
+ }
31262
+
31263
+ .drawer-btn-danger {
31264
+ height: var(--button-height);
31265
+ padding: 0 var(--sp-4);
31266
+ border: 1px solid color-mix(in srgb, var(--danger) 55%, var(--border));
31267
+ border-radius: var(--radius-full);
31268
+ background: var(--surface);
31269
+ color: var(--danger);
31270
+ font-size: var(--fs-13);
31271
+ font-weight: var(--fw-m);
31272
+ cursor: pointer;
31273
+ transition: background var(--t-fast), border-color var(--t-fast);
31274
+ }
31275
+
31276
+ .drawer-btn-danger:hover:not(:disabled) {
31277
+ background: var(--danger-soft);
31278
+ border-color: var(--danger);
31279
+ }
31280
+
31281
+ .drawer-more {
31282
+ position: relative;
31283
+ margin-left: auto;
31284
+ flex: none;
31285
+ }
31286
+
31287
+ .drawer-more > summary {
31288
+ display: inline-flex;
31289
+ align-items: center;
31290
+ height: var(--button-height);
31291
+ padding: 0 var(--sp-4);
31292
+ border: 1px solid var(--border);
31293
+ border-radius: var(--radius-full);
31294
+ background: var(--surface);
31295
+ color: var(--muted);
31296
+ font-size: var(--fs-12);
31297
+ cursor: pointer;
31298
+ list-style: none;
31299
+ transition: border-color var(--t-fast), color var(--t-fast);
31300
+ }
31301
+
31302
+ .drawer-more > summary::-webkit-details-marker {
31303
+ display: none;
31304
+ }
31305
+
31306
+ .drawer-more > summary:hover,
31307
+ .drawer-more[open] > summary {
31308
+ border-color: var(--accent);
31309
+ color: var(--accent-strong);
31310
+ }
31311
+
31312
+ .drawer-more-pop {
31313
+ position: absolute;
31314
+ bottom: calc(100% + 8px);
31315
+ right: 0;
31316
+ z-index: var(--z-drawer);
31317
+ min-width: 180px;
31318
+ padding: 6px;
31319
+ display: grid;
31320
+ gap: 2px;
31321
+ border: 1px solid var(--border-soft);
31322
+ border-radius: var(--radius-md);
31323
+ background: var(--surface-raised);
31324
+ box-shadow: var(--sh-lg);
31325
+ }
31326
+
31327
+ .drawer-more-pop > button,
31328
+ .drawer-more-item {
31329
+ display: flex;
31330
+ align-items: center;
31331
+ width: 100%;
31332
+ min-height: 32px;
31333
+ padding: 0 10px;
31334
+ border: 0;
31335
+ border-radius: var(--radius-sm);
31336
+ background: transparent;
31337
+ color: var(--fg);
31338
+ font-size: var(--fs-13);
31339
+ text-align: left;
31340
+ cursor: pointer;
31341
+ transition: background var(--t-fast);
31342
+ }
31343
+
31344
+ .drawer-more-pop > button:hover:not(:disabled),
31345
+ .drawer-more-item:hover {
31346
+ background: var(--surface-hover);
31347
+ }
31348
+
31349
+ .drawer-more-pop > button:disabled {
31350
+ opacity: 0.5;
31351
+ cursor: not-allowed;
31352
+ }
31353
+
31354
+ .drawer-more-item {
31355
+ padding: 0;
31356
+ }
31357
+
31358
+ .drawer-more-item > #locate-btn {
31359
+ width: 100%;
31360
+ min-height: 32px;
31361
+ padding: 0 10px;
31362
+ border: 0;
31363
+ background: transparent;
31364
+ color: var(--fg);
31365
+ font-size: var(--fs-13);
31366
+ text-align: left;
31367
+ cursor: pointer;
31368
+ border-radius: var(--radius-sm);
31369
+ }
31370
+
31371
+ .drawer-more-item > #locate-btn:hover:not(:disabled) {
31372
+ background: var(--surface-hover);
31373
+ }
31374
+
31375
+ .drawer-more-item > #locate-btn:disabled {
31376
+ opacity: 0.5;
31377
+ cursor: not-allowed;
31378
+ }
31379
+
31380
+ .drawer-more-link {
31381
+ text-decoration: none;
31382
+ box-sizing: border-box;
31383
+ }
31384
+
31385
+ /* ── 7. 骨架屏:首个快照到达前不闪「空」 ───────────────────────────── */
31386
+ .sessions-skeleton {
31387
+ display: grid;
31388
+ grid-template-columns: repeat(4, minmax(0, 1fr));
31389
+ gap: var(--sp-3);
31390
+ height: 100%;
31391
+ min-height: 300px;
31392
+ }
31393
+
31394
+ .sessions-skeleton-col {
31395
+ display: grid;
31396
+ gap: var(--sp-3);
31397
+ align-content: start;
31398
+ padding: var(--sp-3);
31399
+ border: 1px solid var(--border-soft);
31400
+ border-radius: var(--radius-lg);
31401
+ background: var(--surface-muted);
31402
+ }
31403
+
31404
+ .skel {
31405
+ border-radius: var(--radius-md);
31406
+ background: var(--border-soft);
31407
+ animation: skel-pulse 1.4s ease-in-out infinite;
31408
+ }
31409
+
31410
+ .skel-head {
31411
+ height: 14px;
31412
+ width: 42%;
31413
+ }
31414
+
31415
+ .skel-card {
31416
+ height: 96px;
31417
+ }
31418
+
31419
+ .skel-card-short {
31420
+ height: 72px;
31421
+ width: 88%;
31422
+ }
31423
+
31424
+ @keyframes skel-pulse {
31425
+ 0%, 100% { opacity: 1; }
31426
+ 50% { opacity: 0.45; }
31427
+ }
31428
+
31429
+ @media (prefers-reduced-motion: reduce) {
31430
+ .skel {
31431
+ animation: none;
31432
+ }
31433
+ }
31434
+
31435
+ /* ── 8. 移动端:筛选条收敛为搜索 + 筛选按钮;骨架单列 ────────────────── */
31436
+ @media (max-width: 720px) {
31437
+ .sessions-page .sessions-toolbar .sessions-quick-view,
31438
+ .sessions-page .sessions-toolbar .sessions-sort-menu,
31439
+ .sessions-page .sessions-toolbar .idle-cleanup-bar {
31440
+ display: none;
31441
+ }
31442
+
31443
+ .sessions-page .sessions-toolbar input[type="search"][name="q"] {
31444
+ flex: 1 1 auto;
31445
+ max-width: none;
31446
+ }
31447
+
31448
+ .sessions-skeleton {
31449
+ grid-template-columns: 1fr;
31450
+ height: auto;
31451
+ }
31452
+
31453
+ .sessions-filter-drawer {
31454
+ width: min(400px, calc(100vw - 24px));
31455
+ }
31456
+ }