botmux 2.86.0 → 2.88.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 (247) hide show
  1. package/README.en.md +27 -0
  2. package/README.md +27 -0
  3. package/dist/adapters/backend/herdr-backend.d.ts.map +1 -1
  4. package/dist/adapters/backend/herdr-backend.js +12 -1
  5. package/dist/adapters/backend/herdr-backend.js.map +1 -1
  6. package/dist/adapters/backend/liveness-gate.d.ts +38 -0
  7. package/dist/adapters/backend/liveness-gate.d.ts.map +1 -0
  8. package/dist/adapters/backend/liveness-gate.js +53 -0
  9. package/dist/adapters/backend/liveness-gate.js.map +1 -0
  10. package/dist/adapters/backend/pty-backend.d.ts.map +1 -1
  11. package/dist/adapters/backend/pty-backend.js +4 -1
  12. package/dist/adapters/backend/pty-backend.js.map +1 -1
  13. package/dist/adapters/backend/tmux-backend.d.ts +22 -1
  14. package/dist/adapters/backend/tmux-backend.d.ts.map +1 -1
  15. package/dist/adapters/backend/tmux-backend.js +124 -36
  16. package/dist/adapters/backend/tmux-backend.js.map +1 -1
  17. package/dist/adapters/backend/tmux-pipe-backend.d.ts +20 -0
  18. package/dist/adapters/backend/tmux-pipe-backend.d.ts.map +1 -1
  19. package/dist/adapters/backend/tmux-pipe-backend.js +86 -20
  20. package/dist/adapters/backend/tmux-pipe-backend.js.map +1 -1
  21. package/dist/adapters/backend/types.d.ts +9 -0
  22. package/dist/adapters/backend/types.d.ts.map +1 -1
  23. package/dist/adapters/backend/types.js.map +1 -1
  24. package/dist/adapters/backend/zellij-backend.js +1 -1
  25. package/dist/adapters/backend/zellij-backend.js.map +1 -1
  26. package/dist/adapters/backend/zellij-observe-backend.d.ts +13 -0
  27. package/dist/adapters/backend/zellij-observe-backend.d.ts.map +1 -1
  28. package/dist/adapters/backend/zellij-observe-backend.js +51 -12
  29. package/dist/adapters/backend/zellij-observe-backend.js.map +1 -1
  30. package/dist/adapters/cli/codex.d.ts.map +1 -1
  31. package/dist/adapters/cli/codex.js +8 -5
  32. package/dist/adapters/cli/codex.js.map +1 -1
  33. package/dist/adapters/cli/shared-hints.d.ts +2 -1
  34. package/dist/adapters/cli/shared-hints.d.ts.map +1 -1
  35. package/dist/adapters/cli/shared-hints.js +25 -3
  36. package/dist/adapters/cli/shared-hints.js.map +1 -1
  37. package/dist/adapters/cli/traex.d.ts.map +1 -1
  38. package/dist/adapters/cli/traex.js +4 -0
  39. package/dist/adapters/cli/traex.js.map +1 -1
  40. package/dist/adapters/cli/types.d.ts +6 -0
  41. package/dist/adapters/cli/types.d.ts.map +1 -1
  42. package/dist/bot-registry.d.ts +23 -0
  43. package/dist/bot-registry.d.ts.map +1 -1
  44. package/dist/bot-registry.js +9 -0
  45. package/dist/bot-registry.js.map +1 -1
  46. package/dist/cli.d.ts.map +1 -1
  47. package/dist/cli.js +368 -16
  48. package/dist/cli.js.map +1 -1
  49. package/dist/core/command-handler.d.ts.map +1 -1
  50. package/dist/core/command-handler.js +7 -5
  51. package/dist/core/command-handler.js.map +1 -1
  52. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  53. package/dist/core/dashboard-ipc-server.js +210 -5
  54. package/dist/core/dashboard-ipc-server.js.map +1 -1
  55. package/dist/core/dashboard-rows.d.ts +3 -0
  56. package/dist/core/dashboard-rows.d.ts.map +1 -1
  57. package/dist/core/dashboard-rows.js +4 -1
  58. package/dist/core/dashboard-rows.js.map +1 -1
  59. package/dist/core/maintenance.d.ts +18 -0
  60. package/dist/core/maintenance.d.ts.map +1 -1
  61. package/dist/core/maintenance.js +58 -30
  62. package/dist/core/maintenance.js.map +1 -1
  63. package/dist/core/per-bot-env.d.ts +38 -0
  64. package/dist/core/per-bot-env.d.ts.map +1 -0
  65. package/dist/core/per-bot-env.js +79 -0
  66. package/dist/core/per-bot-env.js.map +1 -0
  67. package/dist/core/session-activity.d.ts +1 -0
  68. package/dist/core/session-activity.d.ts.map +1 -1
  69. package/dist/core/session-activity.js +7 -4
  70. package/dist/core/session-activity.js.map +1 -1
  71. package/dist/core/session-create.d.ts +62 -0
  72. package/dist/core/session-create.d.ts.map +1 -0
  73. package/dist/core/session-create.js +131 -0
  74. package/dist/core/session-create.js.map +1 -0
  75. package/dist/core/session-manager.d.ts +43 -0
  76. package/dist/core/session-manager.d.ts.map +1 -1
  77. package/dist/core/session-manager.js +306 -8
  78. package/dist/core/session-manager.js.map +1 -1
  79. package/dist/core/skills/discovery.d.ts +7 -0
  80. package/dist/core/skills/discovery.d.ts.map +1 -1
  81. package/dist/core/skills/discovery.js +51 -0
  82. package/dist/core/skills/discovery.js.map +1 -1
  83. package/dist/core/trigger-session.d.ts.map +1 -1
  84. package/dist/core/trigger-session.js +5 -2
  85. package/dist/core/trigger-session.js.map +1 -1
  86. package/dist/core/update-check.d.ts +67 -0
  87. package/dist/core/update-check.d.ts.map +1 -0
  88. package/dist/core/update-check.js +159 -0
  89. package/dist/core/update-check.js.map +1 -0
  90. package/dist/core/worker-pool.d.ts.map +1 -1
  91. package/dist/core/worker-pool.js +82 -4
  92. package/dist/core/worker-pool.js.map +1 -1
  93. package/dist/daemon.d.ts.map +1 -1
  94. package/dist/daemon.js +40 -11
  95. package/dist/daemon.js.map +1 -1
  96. package/dist/dashboard/bot-payload.d.ts +2 -0
  97. package/dist/dashboard/bot-payload.d.ts.map +1 -1
  98. package/dist/dashboard/bot-payload.js +2 -0
  99. package/dist/dashboard/bot-payload.js.map +1 -1
  100. package/dist/dashboard/session-cleanup.d.ts +30 -0
  101. package/dist/dashboard/session-cleanup.d.ts.map +1 -0
  102. package/dist/dashboard/session-cleanup.js +47 -0
  103. package/dist/dashboard/session-cleanup.js.map +1 -0
  104. package/dist/dashboard/skill-install-request.d.ts +10 -0
  105. package/dist/dashboard/skill-install-request.d.ts.map +1 -1
  106. package/dist/dashboard/skill-install-request.js +17 -0
  107. package/dist/dashboard/skill-install-request.js.map +1 -1
  108. package/dist/dashboard/web/app.d.ts.map +1 -1
  109. package/dist/dashboard/web/app.js +29 -1
  110. package/dist/dashboard/web/app.js.map +1 -1
  111. package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
  112. package/dist/dashboard/web/bot-defaults.js +82 -6
  113. package/dist/dashboard/web/bot-defaults.js.map +1 -1
  114. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  115. package/dist/dashboard/web/i18n.js +312 -2
  116. package/dist/dashboard/web/i18n.js.map +1 -1
  117. package/dist/dashboard/web/insights.d.ts.map +1 -1
  118. package/dist/dashboard/web/insights.js +355 -30
  119. package/dist/dashboard/web/insights.js.map +1 -1
  120. package/dist/dashboard/web/sessions.d.ts +2 -0
  121. package/dist/dashboard/web/sessions.d.ts.map +1 -1
  122. package/dist/dashboard/web/sessions.js +457 -30
  123. package/dist/dashboard/web/sessions.js.map +1 -1
  124. package/dist/dashboard/web/settings.d.ts.map +1 -1
  125. package/dist/dashboard/web/settings.js +289 -0
  126. package/dist/dashboard/web/settings.js.map +1 -1
  127. package/dist/dashboard/web/skills.d.ts.map +1 -1
  128. package/dist/dashboard/web/skills.js +183 -10
  129. package/dist/dashboard/web/skills.js.map +1 -1
  130. package/dist/dashboard/web/whiteboards.d.ts +2 -0
  131. package/dist/dashboard/web/whiteboards.d.ts.map +1 -0
  132. package/dist/dashboard/web/whiteboards.js +267 -0
  133. package/dist/dashboard/web/whiteboards.js.map +1 -0
  134. package/dist/dashboard-web/app.js +879 -591
  135. package/dist/dashboard-web/index.html +1 -0
  136. package/dist/dashboard-web/style.css +528 -8
  137. package/dist/dashboard.js +472 -5
  138. package/dist/dashboard.js.map +1 -1
  139. package/dist/global-config.d.ts +6 -0
  140. package/dist/global-config.d.ts.map +1 -1
  141. package/dist/global-config.js +12 -0
  142. package/dist/global-config.js.map +1 -1
  143. package/dist/i18n/en.d.ts.map +1 -1
  144. package/dist/i18n/en.js +21 -1
  145. package/dist/i18n/en.js.map +1 -1
  146. package/dist/i18n/zh.d.ts.map +1 -1
  147. package/dist/i18n/zh.js +21 -1
  148. package/dist/i18n/zh.js.map +1 -1
  149. package/dist/im/lark/card-builder.d.ts +4 -5
  150. package/dist/im/lark/card-builder.d.ts.map +1 -1
  151. package/dist/im/lark/card-builder.js +113 -11
  152. package/dist/im/lark/card-builder.js.map +1 -1
  153. package/dist/im/lark/card-handler.d.ts +3 -2
  154. package/dist/im/lark/card-handler.d.ts.map +1 -1
  155. package/dist/im/lark/card-handler.js +174 -14
  156. package/dist/im/lark/card-handler.js.map +1 -1
  157. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  158. package/dist/im/lark/event-dispatcher.js +19 -5
  159. package/dist/im/lark/event-dispatcher.js.map +1 -1
  160. package/dist/im/lark/grant-pending.d.ts.map +1 -1
  161. package/dist/im/lark/grant-pending.js +9 -2
  162. package/dist/im/lark/grant-pending.js.map +1 -1
  163. package/dist/index-daemon.js +5 -0
  164. package/dist/index-daemon.js.map +1 -1
  165. package/dist/platform/bind.d.ts +2 -0
  166. package/dist/platform/bind.d.ts.map +1 -0
  167. package/dist/platform/bind.js +91 -0
  168. package/dist/platform/bind.js.map +1 -0
  169. package/dist/platform/binding.d.ts +22 -0
  170. package/dist/platform/binding.d.ts.map +1 -0
  171. package/dist/platform/binding.js +33 -0
  172. package/dist/platform/binding.js.map +1 -0
  173. package/dist/platform/tunnel-client.d.ts +15 -0
  174. package/dist/platform/tunnel-client.d.ts.map +1 -0
  175. package/dist/platform/tunnel-client.js +193 -0
  176. package/dist/platform/tunnel-client.js.map +1 -0
  177. package/dist/services/bot-config-store.d.ts.map +1 -1
  178. package/dist/services/bot-config-store.js +20 -0
  179. package/dist/services/bot-config-store.js.map +1 -1
  180. package/dist/services/git-worktree.d.ts +10 -0
  181. package/dist/services/git-worktree.d.ts.map +1 -1
  182. package/dist/services/git-worktree.js +71 -26
  183. package/dist/services/git-worktree.js.map +1 -1
  184. package/dist/services/grant-prefs-store.d.ts +3 -0
  185. package/dist/services/grant-prefs-store.d.ts.map +1 -1
  186. package/dist/services/grant-prefs-store.js +17 -2
  187. package/dist/services/grant-prefs-store.js.map +1 -1
  188. package/dist/services/insight/claude-span-reader.d.ts.map +1 -1
  189. package/dist/services/insight/claude-span-reader.js +18 -2
  190. package/dist/services/insight/claude-span-reader.js.map +1 -1
  191. package/dist/services/insight/codex-span-reader.d.ts.map +1 -1
  192. package/dist/services/insight/codex-span-reader.js +17 -1
  193. package/dist/services/insight/codex-span-reader.js.map +1 -1
  194. package/dist/services/insight/report.d.ts.map +1 -1
  195. package/dist/services/insight/report.js +48 -6
  196. package/dist/services/insight/report.js.map +1 -1
  197. package/dist/services/insight/types.d.ts +9 -0
  198. package/dist/services/insight/types.d.ts.map +1 -1
  199. package/dist/services/insight/types.js.map +1 -1
  200. package/dist/services/resumable-session-discovery.d.ts.map +1 -1
  201. package/dist/services/resumable-session-discovery.js +21 -4
  202. package/dist/services/resumable-session-discovery.js.map +1 -1
  203. package/dist/services/skill-registry-store.d.ts +1 -0
  204. package/dist/services/skill-registry-store.d.ts.map +1 -1
  205. package/dist/services/skill-registry-store.js +32 -0
  206. package/dist/services/skill-registry-store.js.map +1 -1
  207. package/dist/services/whiteboard-store.d.ts +67 -0
  208. package/dist/services/whiteboard-store.d.ts.map +1 -0
  209. package/dist/services/whiteboard-store.js +450 -0
  210. package/dist/services/whiteboard-store.js.map +1 -0
  211. package/dist/services/worktree-slug-ai.d.ts.map +1 -1
  212. package/dist/services/worktree-slug-ai.js +3 -1
  213. package/dist/services/worktree-slug-ai.js.map +1 -1
  214. package/dist/setup/bot-config-editor.d.ts +8 -0
  215. package/dist/setup/bot-config-editor.d.ts.map +1 -1
  216. package/dist/setup/bot-config-editor.js +9 -0
  217. package/dist/setup/bot-config-editor.js.map +1 -1
  218. package/dist/skills/definitions.d.ts.map +1 -1
  219. package/dist/skills/definitions.js +118 -0
  220. package/dist/skills/definitions.js.map +1 -1
  221. package/dist/types.d.ts +15 -0
  222. package/dist/types.d.ts.map +1 -1
  223. package/dist/utils/crash-log.d.ts +22 -0
  224. package/dist/utils/crash-log.d.ts.map +1 -0
  225. package/dist/utils/crash-log.js +37 -0
  226. package/dist/utils/crash-log.js.map +1 -0
  227. package/dist/utils/input-gate.d.ts +10 -0
  228. package/dist/utils/input-gate.d.ts.map +1 -1
  229. package/dist/utils/input-gate.js +7 -0
  230. package/dist/utils/input-gate.js.map +1 -1
  231. package/dist/utils/install-diagnostics.d.ts +52 -0
  232. package/dist/utils/install-diagnostics.d.ts.map +1 -0
  233. package/dist/utils/install-diagnostics.js +155 -0
  234. package/dist/utils/install-diagnostics.js.map +1 -0
  235. package/dist/utils/install-info.d.ts +4 -0
  236. package/dist/utils/install-info.d.ts.map +1 -1
  237. package/dist/utils/install-info.js +6 -0
  238. package/dist/utils/install-info.js.map +1 -1
  239. package/dist/utils/stdio-epipe-guard.d.ts +39 -0
  240. package/dist/utils/stdio-epipe-guard.d.ts.map +1 -0
  241. package/dist/utils/stdio-epipe-guard.js +67 -0
  242. package/dist/utils/stdio-epipe-guard.js.map +1 -0
  243. package/dist/worker.js +222 -26
  244. package/dist/worker.js.map +1 -1
  245. package/dist/workflows/daemon-spawn.d.ts +2 -0
  246. package/dist/workflows/daemon-spawn.d.ts.map +1 -1
  247. package/package.json +1 -1
@@ -25,6 +25,7 @@
25
25
  <a href="#/workflows" data-route="workflows"><svg viewBox="0 0 16 16" aria-hidden="true"><circle cx="3.4" cy="8" r="1.9"/><circle cx="12.6" cy="3.6" r="1.9"/><circle cx="12.6" cy="12.4" r="1.9"/><path d="M5.2 7.2l5.6-2.8M5.2 8.8l5.6 2.8"/></svg><span data-i18n="nav.workflows">工作流(beta)</span></a>
26
26
  <a href="#/groups" data-route="groups"><svg viewBox="0 0 16 16" aria-hidden="true"><circle cx="5.6" cy="5.8" r="2.4"/><circle cx="11" cy="6.8" r="1.9"/><path d="M1.8 13.2c.5-2.4 2-3.6 3.8-3.6s3.3 1.2 3.8 3.6M9.8 12.6c.4-1.7 1.5-2.6 2.8-2.6 1 0 1.9.5 2.4 1.6"/></svg><span data-i18n="nav.groups">群组</span></a>
27
27
  <a href="#/schedules" data-route="schedules"><svg viewBox="0 0 16 16" aria-hidden="true"><circle cx="8" cy="8" r="6.2"/><path d="M8 4.5V8l2.4 1.6"/></svg><span data-i18n="nav.schedules">定时</span></a>
28
+ <a href="#/whiteboards" data-route="whiteboards"><svg viewBox="0 0 16 16" aria-hidden="true"><rect x="2.2" y="2.2" width="11.6" height="11.6" rx="2"/><path d="M4.8 5.2h6.4M4.8 8h6.4M4.8 10.8h4"/></svg><span>白板</span></a>
28
29
  <a href="#/roles" data-route="roles"><svg viewBox="0 0 16 16" aria-hidden="true"><path d="M8 1.8l5.2 2v3.4c0 3.4-2.2 5.9-5.2 7-3-1.1-5.2-3.6-5.2-7V3.8z"/><path d="M5.8 8l1.6 1.6 2.8-3"/></svg><span data-i18n="nav.roles">角色管理</span></a>
29
30
  <a href="#/bot-defaults" data-route="bot-defaults"><svg viewBox="0 0 16 16" aria-hidden="true"><rect x="2.5" y="5" width="11" height="8" rx="2"/><circle cx="5.8" cy="9" r="1"/><circle cx="10.2" cy="9" r="1"/><path d="M8 5V2.5M5.5 13v1.2M10.5 13v1.2"/></svg><span data-i18n="nav.botDefaults">Bot 配置</span></a>
30
31
  <a href="#/skills" data-route="skills"><svg viewBox="0 0 16 16" aria-hidden="true"><path d="M3 2.5h10v3H3zM3 7h10v6.5H3z"/><path d="M5.4 9.2h5.2M5.4 11.2h3.8"/></svg><span data-i18n="nav.skills">Skills</span></a>
@@ -157,6 +157,20 @@ a { color: inherit; }
157
157
  color: var(--accent-strong);
158
158
  }
159
159
 
160
+ /* Red dot on the Settings nav when a newer botmux version is available. */
161
+ .sidebar-nav a.nav-has-update { position: relative; }
162
+ .sidebar-nav a.nav-has-update::after {
163
+ content: "";
164
+ position: absolute;
165
+ top: 7px;
166
+ right: 8px;
167
+ width: 7px;
168
+ height: 7px;
169
+ border-radius: 50%;
170
+ background: var(--danger);
171
+ box-shadow: 0 0 0 2px var(--surface);
172
+ }
173
+
160
174
  .sidebar-foot {
161
175
  margin-top: auto;
162
176
  padding: 10px 8px 4px;
@@ -2056,6 +2070,161 @@ fieldset legend {
2056
2070
 
2057
2071
  .bulk-bar[hidden] { display: none; }
2058
2072
  .bulk-bar #bulk-count { font-weight: 800; margin-right: 4px; }
2073
+ .idle-cleanup-bar {
2074
+ display: grid;
2075
+ grid-template-columns: minmax(0, 1fr) auto;
2076
+ align-items: center;
2077
+ gap: 8px 12px;
2078
+ margin: 10px 0 2px;
2079
+ padding: 8px;
2080
+ border-radius: var(--radius);
2081
+ border: 1px solid var(--border-soft);
2082
+ background: color-mix(in srgb, var(--surface) 92%, var(--bg));
2083
+ box-shadow: 0 10px 26px rgba(15, 23, 42, 0.06);
2084
+ }
2085
+ .idle-cleanup-summary,
2086
+ .idle-cleanup-controls {
2087
+ display: flex;
2088
+ align-items: center;
2089
+ min-width: 0;
2090
+ gap: 8px;
2091
+ }
2092
+ .idle-cleanup-controls {
2093
+ justify-content: flex-end;
2094
+ flex-wrap: wrap;
2095
+ }
2096
+ .idle-cleanup-dot {
2097
+ width: 8px;
2098
+ height: 8px;
2099
+ flex: 0 0 auto;
2100
+ border-radius: 50%;
2101
+ background: var(--danger);
2102
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--danger) 12%, transparent);
2103
+ }
2104
+ .idle-cleanup-bar.is-empty .idle-cleanup-dot {
2105
+ background: var(--muted);
2106
+ box-shadow: none;
2107
+ }
2108
+ .idle-cleanup-count,
2109
+ .idle-cleanup-status,
2110
+ .idle-cleanup-label {
2111
+ min-height: 32px;
2112
+ display: inline-flex;
2113
+ align-items: center;
2114
+ white-space: nowrap;
2115
+ }
2116
+ .idle-cleanup-count {
2117
+ padding: 0 12px;
2118
+ border-radius: 999px;
2119
+ background: var(--surface-muted);
2120
+ border: 1px solid var(--border-soft);
2121
+ color: var(--fg);
2122
+ font-size: 12.5px;
2123
+ font-weight: 800;
2124
+ font-variant-numeric: tabular-nums;
2125
+ }
2126
+ .idle-cleanup-label {
2127
+ color: var(--muted);
2128
+ font-size: 12.5px;
2129
+ font-weight: 700;
2130
+ }
2131
+ .idle-cleanup-thresholds {
2132
+ display: inline-grid;
2133
+ grid-auto-flow: column;
2134
+ gap: 2px;
2135
+ min-height: 32px;
2136
+ padding: 2px;
2137
+ border-radius: 999px;
2138
+ border: 1px solid var(--border-soft);
2139
+ background: var(--surface-muted);
2140
+ }
2141
+ .idle-cleanup-thresholds button {
2142
+ min-height: 26px;
2143
+ padding: 0 10px;
2144
+ border: 0;
2145
+ border-radius: 999px;
2146
+ background: transparent;
2147
+ box-shadow: none;
2148
+ color: var(--muted);
2149
+ font-size: 12px;
2150
+ font-weight: 800;
2151
+ font-variant-numeric: tabular-nums;
2152
+ }
2153
+ .idle-cleanup-thresholds button:hover:not(.active) {
2154
+ color: var(--fg);
2155
+ background: color-mix(in srgb, var(--border-soft) 60%, transparent);
2156
+ }
2157
+ .idle-cleanup-thresholds button.active {
2158
+ background: var(--surface);
2159
+ color: var(--fg);
2160
+ box-shadow: 0 1px 4px rgba(15, 23, 42, 0.08);
2161
+ }
2162
+ .idle-cleanup-run {
2163
+ min-height: 32px;
2164
+ padding: 0 15px;
2165
+ font-weight: 800;
2166
+ transition: transform .16s ease, background-color .16s ease, border-color .16s ease, color .16s ease;
2167
+ }
2168
+ .idle-cleanup-run:hover:not(:disabled) {
2169
+ transform: translateY(-1px);
2170
+ }
2171
+ .idle-cleanup-run:active:not(:disabled) {
2172
+ transform: scale(.98);
2173
+ }
2174
+ .idle-cleanup-status {
2175
+ grid-column: 1 / -1;
2176
+ justify-self: end;
2177
+ padding: 0 11px;
2178
+ border-radius: 999px;
2179
+ border: 1px solid color-mix(in srgb, var(--success) 24%, var(--border-soft));
2180
+ background: color-mix(in srgb, var(--success) 8%, var(--surface));
2181
+ color: var(--success);
2182
+ font-size: 12px;
2183
+ font-weight: 800;
2184
+ }
2185
+ .idle-cleanup-status:empty {
2186
+ display: none;
2187
+ }
2188
+ :root[data-theme="dark"] .idle-cleanup-bar {
2189
+ background: rgba(255, 255, 255, 0.035);
2190
+ border-color: rgba(255, 255, 255, 0.08);
2191
+ box-shadow: none;
2192
+ }
2193
+ :root[data-theme="dark"] .idle-cleanup-count,
2194
+ :root[data-theme="dark"] .idle-cleanup-thresholds button.active {
2195
+ background: rgba(255, 255, 255, 0.06);
2196
+ }
2197
+ :root[data-theme="dark"] .idle-cleanup-thresholds {
2198
+ background: rgba(255, 255, 255, 0.035);
2199
+ border-color: rgba(255, 255, 255, 0.09);
2200
+ }
2201
+ :root[data-theme="dark"] .idle-cleanup-status {
2202
+ background: color-mix(in srgb, var(--success) 12%, transparent);
2203
+ }
2204
+ @media (max-width: 720px) {
2205
+ .idle-cleanup-bar {
2206
+ grid-template-columns: 1fr;
2207
+ align-items: stretch;
2208
+ }
2209
+ .idle-cleanup-controls {
2210
+ justify-content: flex-start;
2211
+ }
2212
+ .idle-cleanup-thresholds {
2213
+ flex: 1 1 180px;
2214
+ grid-template-columns: repeat(3, minmax(0, 1fr));
2215
+ grid-auto-flow: column;
2216
+ }
2217
+ .idle-cleanup-thresholds button {
2218
+ min-width: 0;
2219
+ padding: 0 8px;
2220
+ }
2221
+ .idle-cleanup-run {
2222
+ flex: 1 1 118px;
2223
+ }
2224
+ .idle-cleanup-status {
2225
+ justify-self: start;
2226
+ }
2227
+ }
2059
2228
  input.row-select,
2060
2229
  #select-all { cursor: pointer; }
2061
2230
 
@@ -2228,6 +2397,21 @@ input.row-select,
2228
2397
  }
2229
2398
  .bd-section-note { margin: 6px 0 0; color: var(--muted); font-size: 12px; line-height: 1.5; }
2230
2399
 
2400
+ /* ── Version & update card ── */
2401
+ .update-version { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; margin: 0 0 12px; }
2402
+ .update-badge { font-size: 12px; font-weight: 600; padding: 2px 8px; border-radius: 999px; }
2403
+ .update-badge-new { color: var(--accent-strong); background: var(--accent-soft); }
2404
+ .update-badge-ok { color: var(--success); background: var(--success-soft); }
2405
+ .update-actions { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 12px; }
2406
+ .update-install-list { margin: 6px 0 0; padding-left: 18px; font-size: 12px; line-height: 1.6; }
2407
+ .update-install-list code { font-size: 11px; }
2408
+ .update-install-list small { color: var(--muted); }
2409
+ .update-changelog { margin-top: 14px; display: flex; flex-direction: column; gap: 8px; }
2410
+ .update-release { border: 1px solid var(--border-soft); border-radius: 8px; padding: 8px 12px; background: var(--surface-muted); }
2411
+ .update-release > summary { cursor: pointer; font-size: 13px; display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; }
2412
+ .update-release > summary small { color: var(--muted); font-size: 11px; }
2413
+ .update-release-body { margin: 8px 0 0; white-space: pre-wrap; word-break: break-word; font-size: 12px; line-height: 1.5; max-height: 320px; overflow: auto; color: var(--fg); }
2414
+
2231
2415
  /* A lighter sub-group inside a bd-section (e.g. 主动开工 lives under 新群 Oncall).
2232
2416
  Separated by a soft top rule + indent so it reads as "part of this block". */
2233
2417
  .bd-subsection {
@@ -4179,6 +4363,19 @@ button.contrast:hover { background: var(--danger-soft); border-color: var(--dang
4179
4363
  min-width: 0;
4180
4364
  }
4181
4365
 
4366
+ .skills-source-control {
4367
+ display: grid;
4368
+ grid-template-columns: minmax(0, 1fr) auto;
4369
+ gap: 8px;
4370
+ align-items: center;
4371
+ }
4372
+
4373
+ .skills-source-control button {
4374
+ min-height: 36px;
4375
+ padding: 0 13px;
4376
+ white-space: nowrap;
4377
+ }
4378
+
4182
4379
  .skills-main-panel,
4183
4380
  .skills-bot-grid {
4184
4381
  display: grid;
@@ -4323,7 +4520,27 @@ button.contrast:hover { background: var(--danger-soft); border-color: var(--dang
4323
4520
  line-height: 1.45;
4324
4521
  overflow-wrap: anywhere;
4325
4522
  }
4326
- .skills-row small { color: var(--muted); font-family: var(--mono); font-size: 11px; overflow-wrap: anywhere; }
4523
+ .skills-row small {
4524
+ color: var(--muted);
4525
+ font-family: var(--mono);
4526
+ font-size: 11px;
4527
+ overflow-wrap: anywhere;
4528
+ }
4529
+
4530
+ .skills-source-badge {
4531
+ display: inline-flex;
4532
+ align-items: center;
4533
+ width: fit-content;
4534
+ max-width: 100%;
4535
+ min-height: 22px;
4536
+ margin-top: 4px;
4537
+ padding: 2px 7px;
4538
+ border: 1px solid var(--border-soft);
4539
+ border-radius: 999px;
4540
+ background: var(--surface-muted);
4541
+ overflow: hidden;
4542
+ text-overflow: ellipsis;
4543
+ }
4327
4544
 
4328
4545
  .skills-card-actions {
4329
4546
  display: grid;
@@ -4758,6 +4975,213 @@ button.contrast:hover { background: var(--danger-soft); border-color: var(--dang
4758
4975
  align-self: start;
4759
4976
  }
4760
4977
 
4978
+ .skills-discovery-dialog {
4979
+ width: min(860px, calc(100vw - 44px));
4980
+ max-height: min(760px, calc(100vh - 64px));
4981
+ padding: 0;
4982
+ border: 1px solid var(--border-soft);
4983
+ border-radius: 14px;
4984
+ background: var(--surface);
4985
+ box-shadow: var(--modal-shadow);
4986
+ color: var(--fg);
4987
+ }
4988
+
4989
+ .skills-discovery-dialog::backdrop {
4990
+ background: color-mix(in srgb, #0b1524 42%, transparent);
4991
+ backdrop-filter: blur(4px);
4992
+ }
4993
+
4994
+ .skills-discovery-dialog article {
4995
+ display: grid;
4996
+ grid-template-rows: auto minmax(0, 1fr) auto;
4997
+ max-height: inherit;
4998
+ }
4999
+
5000
+ .skills-discovery-dialog header {
5001
+ display: grid;
5002
+ gap: 5px;
5003
+ padding: 18px 20px 12px;
5004
+ border-bottom: 1px solid var(--border-soft);
5005
+ }
5006
+
5007
+ .skills-discovery-dialog h3,
5008
+ .skills-discovery-dialog p {
5009
+ margin: 0;
5010
+ }
5011
+
5012
+ .skills-discovery-dialog h3 {
5013
+ font-size: 17px;
5014
+ }
5015
+
5016
+ .skills-discovery-dialog p {
5017
+ color: var(--muted);
5018
+ font-size: 12.5px;
5019
+ line-height: 1.5;
5020
+ }
5021
+
5022
+ .skills-discovery-body {
5023
+ display: grid;
5024
+ gap: 12px;
5025
+ min-height: 0;
5026
+ max-height: 520px;
5027
+ overflow: auto;
5028
+ padding: 16px 20px;
5029
+ }
5030
+
5031
+ .skills-discovery-tabs {
5032
+ display: flex;
5033
+ gap: 8px;
5034
+ align-items: center;
5035
+ min-height: 40px;
5036
+ overflow-x: auto;
5037
+ overflow-y: hidden;
5038
+ padding-bottom: 2px;
5039
+ scrollbar-width: thin;
5040
+ }
5041
+
5042
+ .skills-discovery-tabs button {
5043
+ display: grid;
5044
+ grid-template-columns: auto auto;
5045
+ gap: 8px;
5046
+ align-items: center;
5047
+ flex: 0 0 auto;
5048
+ min-height: 38px;
5049
+ padding: 0 12px;
5050
+ border-radius: 999px;
5051
+ text-transform: uppercase;
5052
+ }
5053
+
5054
+ .skills-discovery-tabs button.selected {
5055
+ border-color: color-mix(in srgb, var(--accent) 72%, var(--border-soft));
5056
+ background: color-mix(in srgb, var(--accent) 10%, var(--surface));
5057
+ color: var(--fg);
5058
+ box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--accent) 35%, transparent);
5059
+ }
5060
+
5061
+ .skills-discovery-tabs strong {
5062
+ font-size: 12px;
5063
+ }
5064
+
5065
+ .skills-discovery-tabs small {
5066
+ color: var(--muted);
5067
+ font-size: 11px;
5068
+ font-weight: 700;
5069
+ text-transform: none;
5070
+ }
5071
+
5072
+ .skills-discovery-path {
5073
+ min-width: 0;
5074
+ padding: 7px 10px;
5075
+ border-radius: 8px;
5076
+ background: color-mix(in srgb, var(--surface-muted) 70%, transparent);
5077
+ }
5078
+
5079
+ .skills-discovery-path code {
5080
+ display: block;
5081
+ overflow: hidden;
5082
+ color: var(--muted);
5083
+ font-size: 12px;
5084
+ text-overflow: ellipsis;
5085
+ white-space: nowrap;
5086
+ }
5087
+
5088
+ .skills-discovery-group {
5089
+ display: grid;
5090
+ gap: 8px;
5091
+ }
5092
+
5093
+ .skills-discovery-group[hidden] {
5094
+ display: none;
5095
+ }
5096
+
5097
+ .skills-discovery-group header {
5098
+ display: grid;
5099
+ grid-template-columns: auto minmax(0, 1fr);
5100
+ gap: 8px;
5101
+ align-items: center;
5102
+ padding: 0;
5103
+ border: 0;
5104
+ }
5105
+
5106
+ .skills-discovery-group strong {
5107
+ text-transform: uppercase;
5108
+ color: var(--fg);
5109
+ font-size: 12px;
5110
+ }
5111
+
5112
+ .skills-discovery-group code {
5113
+ overflow: hidden;
5114
+ color: var(--muted);
5115
+ font-size: 11px;
5116
+ text-overflow: ellipsis;
5117
+ white-space: nowrap;
5118
+ }
5119
+
5120
+ .skills-discovery-list {
5121
+ display: grid;
5122
+ gap: 7px;
5123
+ }
5124
+
5125
+ .skills-discovery-row {
5126
+ display: grid;
5127
+ grid-template-columns: auto minmax(0, 1fr) auto;
5128
+ gap: 10px;
5129
+ align-items: start;
5130
+ min-height: 54px;
5131
+ padding: 10px 12px;
5132
+ border: 1px solid var(--border-soft);
5133
+ border-radius: 8px;
5134
+ background: var(--surface-muted);
5135
+ cursor: pointer;
5136
+ }
5137
+
5138
+ .skills-discovery-row input {
5139
+ margin-top: 3px;
5140
+ }
5141
+
5142
+ .skills-discovery-row span {
5143
+ display: grid;
5144
+ gap: 3px;
5145
+ min-width: 0;
5146
+ }
5147
+
5148
+ .skills-discovery-row strong {
5149
+ overflow: hidden;
5150
+ color: var(--fg);
5151
+ font-size: 13px;
5152
+ text-overflow: ellipsis;
5153
+ white-space: nowrap;
5154
+ }
5155
+
5156
+ .skills-discovery-row small {
5157
+ display: -webkit-box;
5158
+ -webkit-line-clamp: 2;
5159
+ -webkit-box-orient: vertical;
5160
+ overflow: hidden;
5161
+ color: var(--muted);
5162
+ font-size: 12px;
5163
+ line-height: 1.4;
5164
+ }
5165
+
5166
+ .skills-discovery-row em {
5167
+ align-self: center;
5168
+ color: var(--muted);
5169
+ font-size: 11px;
5170
+ font-style: normal;
5171
+ font-weight: 700;
5172
+ }
5173
+
5174
+ .skills-discovery-row.installed {
5175
+ opacity: 0.68;
5176
+ cursor: default;
5177
+ }
5178
+
5179
+ .skills-discovery-dialog footer {
5180
+ justify-content: end;
5181
+ padding: 12px 20px 16px;
5182
+ border-top: 1px solid var(--border-soft);
5183
+ }
5184
+
4761
5185
  .skills-policy-controls [data-bot-status] {
4762
5186
  grid-column: 1 / -1;
4763
5187
  }
@@ -4803,6 +5227,7 @@ button.contrast:hover { background: var(--danger-soft); border-color: var(--dang
4803
5227
  }
4804
5228
  .skills-side-rail,
4805
5229
  .skills-install-grid,
5230
+ .skills-source-control,
4806
5231
  .skills-section-head-row,
4807
5232
  .skills-overview,
4808
5233
  .skills-metric-strip,
@@ -6580,12 +7005,66 @@ body.cp-fx-slice main { animation: cp-fx-slice 0.32s steps(2, end); }
6580
7005
  .insights-page .hbtrack { background: var(--ins-inner); border-radius: 6px; height: 14px; overflow: hidden; }
6581
7006
  .insights-page .hbfill { height: 100%; background: linear-gradient(90deg, var(--danger-soft), var(--bad)); border-radius: 6px; min-width: 3px; transform-origin: left; animation: insight-bar-grow .55s ease both; }
6582
7007
  .insights-page .hbval { font-size: 12px; color: var(--mut); text-align: right; white-space: nowrap; }
7008
+ .insights-page .hbval small { color: var(--ins-faint); font-size: 10px; margin-left: 5px; }
6583
7009
 
6584
- /* workbench: session list | detail (master-detail) */
6585
- .insight-workbench { display: grid; grid-template-columns: minmax(260px, 320px) minmax(0, 1fr); gap: 14px; align-items: start; }
6586
- @media (max-width: 900px) { .insight-workbench { grid-template-columns: 1fr; } }
6587
- .insight-workbench > *, .insight-list-panel, .insight-detail { min-width: 0; }
6588
- .insight-list-panel, .insight-detail { background: var(--panel); border: 1px solid var(--line); border-radius: 10px; padding: 12px 14px; }
7010
+ /* top-level tabs (总览 / 会话 / 分布 / 热点) — mirrors .detailtabbar */
7011
+ .insights-page .insight-tabs { display: flex; gap: 6px; border-bottom: 1px solid var(--line); margin: 4px 0 16px; }
7012
+ .insights-page .itab {
7013
+ background: transparent; color: var(--mut); border: 1px solid transparent; border-bottom: 0;
7014
+ border-radius: 8px 8px 0 0; padding: 8px 16px; font: inherit; font-size: 13px; cursor: pointer; margin-bottom: -1px;
7015
+ transition: color .12s ease, background .12s ease;
7016
+ }
7017
+ .insights-page .itab:hover { color: var(--fg); }
7018
+ .insights-page .itab.on { color: var(--fg); background: var(--panel); border-color: var(--line); font-weight: 600; }
7019
+ .insights-page .insight-panel[hidden] { display: none; }
7020
+
7021
+ /* filter-bar additions: project/time selects, analyzable toggle, clear */
7022
+ .insights-page .ins-select {
7023
+ background: var(--ins-inner); color: var(--fg); border: 1px solid var(--line); border-radius: 8px;
7024
+ padding: 6px 10px; font: inherit; font-size: 12px; max-width: 220px; cursor: pointer;
7025
+ }
7026
+ .insights-page .ins-toggle { display: inline-flex; align-items: center; gap: 5px; font-size: 12px; color: var(--mut); cursor: pointer; white-space: nowrap; }
7027
+ .insights-page .ins-toggle input { cursor: pointer; }
7028
+ .insights-page .ins-clear {
7029
+ background: transparent; color: var(--mut); border: 1px solid var(--line); border-radius: 8px;
7030
+ padding: 6px 12px; font: inherit; font-size: 12px; cursor: pointer;
7031
+ }
7032
+ .insights-page .ins-clear:hover { color: var(--fg); border-color: var(--acc); }
7033
+
7034
+ /* distribution histograms + hotspots grids */
7035
+ .insights-page .ins-hint { margin: 0 0 12px; font-size: 12px; }
7036
+ .insights-page .ihist-grid,
7037
+ .insights-page .hot-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); gap: 14px; align-items: start; }
7038
+ .insights-page .ihist-head { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; margin-bottom: 10px; }
7039
+ .insights-page .ihist-head h3 { margin: 0; }
7040
+ .insights-page .hot-sessions, .insights-page .hot-note { grid-column: 1 / -1; }
7041
+ .insights-page .hot-note { margin-top: 2px; }
7042
+
7043
+ /* Sessions tab: full-width list ⇆ full-width detail (mirrors ASI 会话, replaces
7044
+ the cramped master-detail side panel) */
7045
+ .insights-page #insight-list-view .insight-list-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; margin-bottom: 12px; }
7046
+ .insights-page .sesssort { display: flex; flex-wrap: wrap; gap: 5px; align-items: center; }
7047
+ .insights-page .sesssort-label { font-size: 11px; margin-right: 2px; }
7048
+ .insights-page .ins-back {
7049
+ background: transparent; color: var(--mut); border: 1px solid var(--line); border-radius: 8px;
7050
+ padding: 6px 14px; font: inherit; font-size: 12px; cursor: pointer; margin-bottom: 12px;
7051
+ }
7052
+ .insights-page .ins-back:hover { color: var(--fg); border-color: var(--acc); }
7053
+ .insights-page #insight-detail-view .insight-detail { background: var(--panel); border: 1px solid var(--line); border-radius: 10px; padding: 14px 16px; }
7054
+ /* full-width rich rows */
7055
+ .insights-page .slist.wide { max-height: none; overflow: visible; gap: 10px; }
7056
+ .insights-page .slist.wide .srow { grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: 18px; padding: 13px 16px; }
7057
+ .insights-page .slist.wide .srmain strong { -webkit-line-clamp: 1; font-size: 14px; }
7058
+ .insights-page .slist.wide .mph { max-width: 440px; height: 8px; }
7059
+ .insights-page .slist.wide .srstats { flex-wrap: nowrap; justify-content: flex-end; align-items: center; }
7060
+ .insights-page .slist.wide .srmsg { justify-self: end; }
7061
+ @media (max-width: 760px) {
7062
+ .insights-page .slist.wide .srow { grid-template-columns: 1fr; }
7063
+ .insights-page .slist.wide .srstats { justify-content: flex-start; flex-wrap: wrap; }
7064
+ }
7065
+
7066
+ /* session detail panel (full-width detail view) */
7067
+ .insight-detail { min-width: 0; background: var(--panel); border: 1px solid var(--line); border-radius: 10px; padding: 12px 14px; }
6589
7068
  .insight-list-head { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; margin-bottom: 10px; }
6590
7069
  .insight-list-head h3 { font-size: 13px; margin: 0; }
6591
7070
  .insight-list-head span { font-size: 11px; color: var(--mut); }
@@ -7004,6 +7483,10 @@ body.cp-fx-slice main { animation: cp-fx-slice 0.32s steps(2, end); }
7004
7483
  .insights-page .cbub-body .md-body { font-size: 13px; }
7005
7484
  .insights-page .cbub-foot { display: flex; justify-content: flex-end; }
7006
7485
  .insights-page .cbub-ops { background: var(--ins-recess); max-width: 88%; }
7486
+ /* agent narration ("说了什么") inside the agent bubble, above its operations */
7487
+ .insights-page .cbub-saywrap { display: flex; flex-direction: column; gap: 6px; margin: 2px 0 8px; }
7488
+ .insights-page .cbub-say { font-size: 13px; color: var(--fg); border-left: 2px solid var(--acc); padding-left: 9px; overflow-wrap: anywhere; word-break: break-word; }
7489
+ .insights-page .cbub-say .md-body { font-size: 13px; }
7007
7490
  .insights-page .cbub-ops-list { display: flex; flex-direction: column; gap: 3px; }
7008
7491
  .insights-page .cop-line { display: flex; align-items: center; gap: 7px; flex-wrap: wrap; font-size: 12px; padding: 3px 5px; border-radius: 6px; }
7009
7492
  .insights-page .cop-line.clickable { cursor: pointer; }
@@ -7090,12 +7573,49 @@ body.cp-fx-slice main { animation: cp-fx-slice 0.32s steps(2, end); }
7090
7573
  @keyframes insight-bar-grow { from { transform: scaleX(0); } to { transform: scaleX(1); } }
7091
7574
  .insights-page .insights-metrics { animation: insight-fade-up .35s ease both; }
7092
7575
  .insights-page .insights-overview-grid { animation: insight-fade-up .35s ease both; animation-delay: .05s; }
7093
- .insights-page .insight-workbench { animation: insight-fade-up .35s ease both; animation-delay: .1s; }
7576
+ .insights-page .insight-panel { animation: insight-fade-up .35s ease both; animation-delay: .1s; }
7094
7577
  @media (prefers-reduced-motion: reduce) {
7095
7578
  .insights-page .insights-metrics,
7096
7579
  .insights-page .insights-overview-grid,
7097
- .insights-page .insight-workbench,
7580
+ .insights-page .insight-panel,
7098
7581
  .insights-page .hbfill { animation: none; }
7099
7582
  .insights-page .srow { transition: none; }
7100
7583
  .insights-page .srow:hover { transform: none; }
7101
7584
  }
7585
+
7586
+ /* ─── 创建会话 modal ─────────────────────────────────────────────────────── */
7587
+ .create-session-btn { white-space: nowrap; }
7588
+ .create-session-modal .cs-card { padding: 20px; }
7589
+ .create-session-modal textarea {
7590
+ width: 100%;
7591
+ box-sizing: border-box;
7592
+ resize: vertical;
7593
+ font: inherit;
7594
+ padding: 8px 10px;
7595
+ border: 1px solid var(--border);
7596
+ border-radius: 6px;
7597
+ background: var(--surface-muted);
7598
+ color: var(--fg);
7599
+ }
7600
+ .create-session-modal fieldset {
7601
+ border: 1px solid var(--border);
7602
+ border-radius: 6px;
7603
+ margin: 12px 0;
7604
+ padding: 10px 12px;
7605
+ }
7606
+ .create-session-modal legend { padding: 0 6px; color: var(--muted); font-size: 13px; }
7607
+ .create-session-modal .cs-bots {
7608
+ display: grid;
7609
+ grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
7610
+ gap: 4px 12px;
7611
+ }
7612
+ .create-session-modal .cs-bot { display: flex; align-items: center; gap: 6px; cursor: pointer; }
7613
+ .create-session-modal .cs-mode label,
7614
+ .create-session-modal .cs-column label { display: inline-flex; align-items: center; gap: 6px; margin-right: 16px; cursor: pointer; }
7615
+ .create-session-modal fieldset small { display: block; margin-top: 6px; color: var(--muted); font-size: 12px; }
7616
+ .create-session-modal .cs-lead-row { margin: 12px 0; }
7617
+ .create-session-modal .cs-lead-row select { margin: 4px 0; padding: 6px 8px; }
7618
+ .create-session-modal .cs-advanced { margin: 12px 0; }
7619
+ .create-session-modal .cs-advanced summary { cursor: pointer; color: var(--muted); }
7620
+ .create-session-modal .cs-empty { color: var(--muted); margin: 0; }
7621
+ .create-session-modal .cs-warn { color: var(--warn, #c60); }