@keith9681/dsh-sidebar 0.15.2

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 (220) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +0 -0
  3. package/README_EN.md +0 -0
  4. package/cordis.patch.yml +49 -0
  5. package/lib/client-editor.js +34651 -0
  6. package/lib/client-mermaid.js +200629 -0
  7. package/lib/client-registry.js +13388 -0
  8. package/lib/client-terminal.js +8904 -0
  9. package/lib/client.js +13388 -0
  10. package/lib/index.js +3959 -0
  11. package/lib/invariant.js +22 -0
  12. package/lib/types/agent-pty.d.ts +226 -0
  13. package/lib/types/browser-probe.d.ts +15 -0
  14. package/lib/types/bundle-route.d.ts +12 -0
  15. package/lib/types/client/BrowserView.d.ts +22 -0
  16. package/lib/types/client/DiffTab.d.ts +6 -0
  17. package/lib/types/client/DiffView.d.ts +51 -0
  18. package/lib/types/client/EditorHost.d.ts +12 -0
  19. package/lib/types/client/FileTree.d.ts +36 -0
  20. package/lib/types/client/GitView.d.ts +8 -0
  21. package/lib/types/client/OrphanedTab.d.ts +11 -0
  22. package/lib/types/client/PdfView.d.ts +6 -0
  23. package/lib/types/client/RenderBoundary.d.ts +32 -0
  24. package/lib/types/client/SandboxStatusBar.d.ts +10 -0
  25. package/lib/types/client/SideCardSection.d.ts +74 -0
  26. package/lib/types/client/SideChatView.d.ts +16 -0
  27. package/lib/types/client/Sidebar.d.ts +6 -0
  28. package/lib/types/client/SubagentView.d.ts +16 -0
  29. package/lib/types/client/TabBar.d.ts +43 -0
  30. package/lib/types/client/TerminalView.d.ts +24 -0
  31. package/lib/types/client/TextEditor.d.ts +10 -0
  32. package/lib/types/client/TreePanel.d.ts +23 -0
  33. package/lib/types/client/UploadOverlay.d.ts +20 -0
  34. package/lib/types/client/add-plugin-modal.d.ts +15 -0
  35. package/lib/types/client/api.d.ts +268 -0
  36. package/lib/types/client/binary-download.d.ts +12 -0
  37. package/lib/types/client/breakpoints.d.ts +12 -0
  38. package/lib/types/client/browser.d.ts +50 -0
  39. package/lib/types/client/builtins/index.d.ts +18 -0
  40. package/lib/types/client/builtins/tabs.d.ts +11 -0
  41. package/lib/types/client/builtins/viewers.d.ts +3 -0
  42. package/lib/types/client/chunk-loader.d.ts +124 -0
  43. package/lib/types/client/chunks/editor.d.ts +9 -0
  44. package/lib/types/client/chunks/mermaid.d.ts +10 -0
  45. package/lib/types/client/chunks/terminal.d.ts +9 -0
  46. package/lib/types/client/cm-themes.d.ts +24 -0
  47. package/lib/types/client/conversation-draft.d.ts +14 -0
  48. package/lib/types/client/desktop-env.d.ts +35 -0
  49. package/lib/types/client/editable-state.d.ts +27 -0
  50. package/lib/types/client/editor-load.d.ts +66 -0
  51. package/lib/types/client/frame-batcher.d.ts +24 -0
  52. package/lib/types/client/icons.d.ts +57 -0
  53. package/lib/types/client/image-types.d.ts +3 -0
  54. package/lib/types/client/ime-guard.d.ts +36 -0
  55. package/lib/types/client/index.d.ts +19 -0
  56. package/lib/types/client/intercept.d.ts +33 -0
  57. package/lib/types/client/lang.d.ts +12 -0
  58. package/lib/types/client/lazy-chunk.d.ts +25 -0
  59. package/lib/types/client/link-intercept.d.ts +42 -0
  60. package/lib/types/client/locales.d.ts +366 -0
  61. package/lib/types/client/mermaid-blocks.d.ts +41 -0
  62. package/lib/types/client/mermaid-sanitize.d.ts +2 -0
  63. package/lib/types/client/mermaid.d.ts +12 -0
  64. package/lib/types/client/open-when-sized.d.ts +20 -0
  65. package/lib/types/client/open-with-settings.d.ts +4 -0
  66. package/lib/types/client/open-with.d.ts +87 -0
  67. package/lib/types/client/openpath-intercept.d.ts +41 -0
  68. package/lib/types/client/paths.d.ts +35 -0
  69. package/lib/types/client/pdf-types.d.ts +2 -0
  70. package/lib/types/client/plugin-settings.d.ts +8 -0
  71. package/lib/types/client/plugins-shared.d.ts +27 -0
  72. package/lib/types/client/plugins-tabs.d.ts +3 -0
  73. package/lib/types/client/plugins-viewers.d.ts +3 -0
  74. package/lib/types/client/prefs.d.ts +41 -0
  75. package/lib/types/client/produced-files.d.ts +23 -0
  76. package/lib/types/client/selection-payload.d.ts +27 -0
  77. package/lib/types/client/service.d.ts +440 -0
  78. package/lib/types/client/settings-nav-icon.d.ts +19 -0
  79. package/lib/types/client/shell-presets.d.ts +48 -0
  80. package/lib/types/client/sidechat-transcript.d.ts +103 -0
  81. package/lib/types/client/split-pane.d.ts +30 -0
  82. package/lib/types/client/state.d.ts +359 -0
  83. package/lib/types/client/subagent-detect.d.ts +54 -0
  84. package/lib/types/client/subagent-jobs.d.ts +63 -0
  85. package/lib/types/client/tab-content-memo.d.ts +33 -0
  86. package/lib/types/client/terminal-font.d.ts +20 -0
  87. package/lib/types/client/theme.d.ts +45 -0
  88. package/lib/types/client/titlebar-strip.d.ts +23 -0
  89. package/lib/types/client/upload.d.ts +69 -0
  90. package/lib/types/client/wco.d.ts +47 -0
  91. package/lib/types/config.d.ts +64 -0
  92. package/lib/types/context-types.d.ts +603 -0
  93. package/lib/types/fs-operations.d.ts +28 -0
  94. package/lib/types/fs-search.d.ts +24 -0
  95. package/lib/types/fs-tree.d.ts +51 -0
  96. package/lib/types/git.d.ts +82 -0
  97. package/lib/types/html-route.d.ts +59 -0
  98. package/lib/types/index.d.ts +47 -0
  99. package/lib/types/invariant.d.ts +15 -0
  100. package/lib/types/jobs-routes.d.ts +45 -0
  101. package/lib/types/open-external.d.ts +24 -0
  102. package/lib/types/prefs-shared.d.ts +225 -0
  103. package/lib/types/pty-deps.d.ts +78 -0
  104. package/lib/types/pty-manager.d.ts +168 -0
  105. package/lib/types/sidechat-core.d.ts +172 -0
  106. package/lib/types/sidechat-routes.d.ts +30 -0
  107. package/lib/types/subagent-activity.d.ts +44 -0
  108. package/lib/types/subagent-live-route.d.ts +44 -0
  109. package/lib/types/tools.d.ts +31 -0
  110. package/lib/types/trust-fence.d.ts +24 -0
  111. package/lib/types/wire.d.ts +38 -0
  112. package/package.json +173 -0
  113. package/scripts/install.ps1 +289 -0
  114. package/scripts/install.sh +287 -0
  115. package/src/agent-pty.ts +527 -0
  116. package/src/browser-probe.ts +26 -0
  117. package/src/bundle-route.ts +129 -0
  118. package/src/client/BrowserView.tsx +253 -0
  119. package/src/client/DiffTab.tsx +110 -0
  120. package/src/client/DiffView.tsx +305 -0
  121. package/src/client/EditorHost.tsx +525 -0
  122. package/src/client/FileTree.tsx +653 -0
  123. package/src/client/GitView.tsx +558 -0
  124. package/src/client/OrphanedTab.tsx +27 -0
  125. package/src/client/PdfView.tsx +110 -0
  126. package/src/client/RenderBoundary.tsx +49 -0
  127. package/src/client/SandboxStatusBar.tsx +60 -0
  128. package/src/client/SideCardSection.module.css +960 -0
  129. package/src/client/SideCardSection.tsx +1152 -0
  130. package/src/client/SideChatView.module.css +437 -0
  131. package/src/client/SideChatView.tsx +644 -0
  132. package/src/client/Sidebar.tsx +1148 -0
  133. package/src/client/SubagentView.module.css +547 -0
  134. package/src/client/SubagentView.tsx +883 -0
  135. package/src/client/TabBar.tsx +305 -0
  136. package/src/client/TerminalView.tsx +383 -0
  137. package/src/client/TextEditor.tsx +500 -0
  138. package/src/client/TreePanel.tsx +273 -0
  139. package/src/client/UploadOverlay.tsx +62 -0
  140. package/src/client/add-plugin-modal.tsx +199 -0
  141. package/src/client/api.ts +335 -0
  142. package/src/client/binary-download.tsx +23 -0
  143. package/src/client/breakpoints.ts +51 -0
  144. package/src/client/browser.ts +119 -0
  145. package/src/client/builtins/index.ts +37 -0
  146. package/src/client/builtins/tabs.tsx +331 -0
  147. package/src/client/builtins/viewers.tsx +125 -0
  148. package/src/client/chunk-loader.ts +351 -0
  149. package/src/client/chunks/editor.tsx +9 -0
  150. package/src/client/chunks/mermaid.tsx +10 -0
  151. package/src/client/chunks/terminal.tsx +9 -0
  152. package/src/client/cm-themes.ts +129 -0
  153. package/src/client/conversation-draft.ts +29 -0
  154. package/src/client/css-modules.d.ts +5 -0
  155. package/src/client/desktop-env.ts +72 -0
  156. package/src/client/editable-state.ts +70 -0
  157. package/src/client/editor-load.ts +92 -0
  158. package/src/client/frame-batcher.ts +56 -0
  159. package/src/client/icons.tsx +161 -0
  160. package/src/client/image-types.ts +8 -0
  161. package/src/client/ime-guard.ts +47 -0
  162. package/src/client/index.tsx +369 -0
  163. package/src/client/intercept.tsx +110 -0
  164. package/src/client/lang.ts +103 -0
  165. package/src/client/layout.css +94 -0
  166. package/src/client/lazy-chunk.tsx +89 -0
  167. package/src/client/link-intercept.ts +73 -0
  168. package/src/client/locales.ts +734 -0
  169. package/src/client/mermaid-blocks.ts +110 -0
  170. package/src/client/mermaid-sanitize.ts +93 -0
  171. package/src/client/mermaid.tsx +401 -0
  172. package/src/client/open-when-sized.ts +43 -0
  173. package/src/client/open-with-settings.tsx +135 -0
  174. package/src/client/open-with.ts +221 -0
  175. package/src/client/openpath-intercept.ts +62 -0
  176. package/src/client/paths.ts +47 -0
  177. package/src/client/pdf-types.ts +4 -0
  178. package/src/client/plugin-settings.ts +43 -0
  179. package/src/client/plugins-shared.ts +29 -0
  180. package/src/client/plugins-tabs.ts +87 -0
  181. package/src/client/plugins-viewers.ts +30 -0
  182. package/src/client/prefs.ts +207 -0
  183. package/src/client/produced-files.ts +91 -0
  184. package/src/client/selection-payload.ts +86 -0
  185. package/src/client/service.ts +838 -0
  186. package/src/client/settings-nav-icon.ts +45 -0
  187. package/src/client/shell-presets.ts +83 -0
  188. package/src/client/sidebar.module.css +2577 -0
  189. package/src/client/sidechat-transcript.ts +321 -0
  190. package/src/client/split-pane.tsx +322 -0
  191. package/src/client/state.ts +1175 -0
  192. package/src/client/subagent-detect.ts +137 -0
  193. package/src/client/subagent-jobs.ts +161 -0
  194. package/src/client/tab-content-memo.ts +46 -0
  195. package/src/client/terminal-font.ts +28 -0
  196. package/src/client/theme.ts +110 -0
  197. package/src/client/titlebar-strip.ts +37 -0
  198. package/src/client/upload.ts +187 -0
  199. package/src/client/wco.ts +120 -0
  200. package/src/config.ts +155 -0
  201. package/src/context-types.ts +610 -0
  202. package/src/fs-operations.ts +99 -0
  203. package/src/fs-search.ts +86 -0
  204. package/src/fs-tree.ts +158 -0
  205. package/src/git.ts +244 -0
  206. package/src/html-route.ts +106 -0
  207. package/src/index.ts +1132 -0
  208. package/src/invariant.ts +32 -0
  209. package/src/jobs-routes.ts +257 -0
  210. package/src/open-external.ts +90 -0
  211. package/src/prefs-shared.ts +268 -0
  212. package/src/pty-deps.ts +240 -0
  213. package/src/pty-manager.ts +376 -0
  214. package/src/sidechat-core.ts +468 -0
  215. package/src/sidechat-routes.ts +344 -0
  216. package/src/subagent-activity.ts +91 -0
  217. package/src/subagent-live-route.ts +93 -0
  218. package/src/tools.ts +479 -0
  219. package/src/trust-fence.ts +77 -0
  220. package/src/wire.ts +100 -0
@@ -0,0 +1,547 @@
1
+ /* Subagent page: main-agent topology tree. Row/card chrome mirrors the
2
+ official ui-subagent catalog row (min-height 50, 7/8/11 padding, radius 8,
3
+ flex-start alignment, tree connector lines via border-left hairlines). */
4
+ .subagent {
5
+ flex: 1;
6
+ min-height: 0;
7
+ display: flex;
8
+ flex-direction: column;
9
+ }
10
+
11
+ .subagentHeader {
12
+ flex: none;
13
+ display: flex;
14
+ align-items: center;
15
+ gap: 8px;
16
+ height: 36px;
17
+ padding: 0 8px 0 12px;
18
+ }
19
+
20
+ .subagentTitle {
21
+ flex: 1;
22
+ min-width: 0;
23
+ font: var(--dsw-font-s-14);
24
+ color: var(--dsw-alias-label-secondary);
25
+ overflow: hidden;
26
+ text-overflow: ellipsis;
27
+ white-space: nowrap;
28
+ }
29
+
30
+ /* The descendant count badge ("3 · 1 运行中") beside the title. */
31
+ .subagentCount {
32
+ flex: none;
33
+ font: var(--dsw-font-xxxs-11);
34
+ color: var(--dsw-alias-label-tertiary);
35
+ }
36
+
37
+ .subagentRefresh {
38
+ flex: none;
39
+ display: inline-flex;
40
+ align-items: center;
41
+ justify-content: center;
42
+ width: 24px;
43
+ height: 24px;
44
+ border: none;
45
+ border-radius: 6px;
46
+ background: transparent;
47
+ color: var(--dsw-alias-label-secondary);
48
+ cursor: pointer;
49
+ }
50
+
51
+ .subagentRefresh:hover {
52
+ background: var(--dsw-alias-interactive-bg-hover);
53
+ }
54
+
55
+ .subagentBody {
56
+ flex: 1;
57
+ min-height: 0;
58
+ overflow-y: auto;
59
+ padding: 2px 6px 8px;
60
+ }
61
+
62
+ /* One node card: state dot + label + secondary + (running) live lines. */
63
+ .subagentRow {
64
+ position: relative;
65
+ display: flex;
66
+ align-items: flex-start;
67
+ gap: 8px;
68
+ box-sizing: border-box;
69
+ width: 100%;
70
+ min-height: 50px;
71
+ padding: 7px 8px 7px 11px;
72
+ border: none;
73
+ border-radius: 8px;
74
+ background: transparent;
75
+ font: var(--dsw-font-s-14);
76
+ color: var(--dsw-alias-label-primary);
77
+ text-align: left;
78
+ cursor: pointer;
79
+ outline: none;
80
+ }
81
+
82
+ .subagentRow:hover {
83
+ background: var(--dsw-alias-interactive-bg-hover);
84
+ }
85
+
86
+ /* Keyboard focus (mirror of the official catalog row): a visible fill only
87
+ when focused via keyboard; the selected state below still wins on top. */
88
+ .subagentRow:focus-visible {
89
+ background: var(--dsw-alias-interactive-bg-hover);
90
+ }
91
+
92
+ /* The currently-open session, highlighted in place (mirror of the workspace
93
+ `.sessionRow.selected` — declared after the hover/focus rules so it wins). */
94
+ .subagentRowActive,
95
+ .subagentRowActive:hover,
96
+ .subagentRowActive:focus-visible {
97
+ background: var(--dsw-alias-interactive-bg-active);
98
+ }
99
+
100
+ .subagentRowDisabled {
101
+ color: var(--dsw-alias-label-dimmed);
102
+ cursor: not-allowed;
103
+ }
104
+
105
+ .subagentRowDisabled:hover {
106
+ background: transparent;
107
+ }
108
+
109
+ /* Loading placeholders are disabled but keep the default cursor (official
110
+ `.loadingRow` distinction from `.disabled`). */
111
+ .subagentRowLoading {
112
+ cursor: default;
113
+ }
114
+
115
+ /* The state dot aligns to the first text line (official catalog detail). */
116
+ .subagentDot {
117
+ margin-top: 4px;
118
+ }
119
+
120
+ .subagentContent {
121
+ display: flex;
122
+ flex: 1;
123
+ flex-direction: column;
124
+ min-width: 0;
125
+ gap: 2px;
126
+ }
127
+
128
+ .subagentLabel,
129
+ .subagentSecondary {
130
+ overflow: hidden;
131
+ text-overflow: ellipsis;
132
+ white-space: nowrap;
133
+ }
134
+
135
+ .subagentLabel {
136
+ color: inherit;
137
+ font-weight: 400;
138
+ }
139
+
140
+ .subagentSecondary {
141
+ font: var(--dsw-font-xxxs-11);
142
+ color: var(--dsw-alias-label-tertiary);
143
+ }
144
+
145
+ /* ── Live lines (running cards only) ──────────────────────────────────── */
146
+
147
+ .subagentLive {
148
+ display: flex;
149
+ align-items: baseline;
150
+ gap: 4px;
151
+ min-width: 0;
152
+ font: var(--dsw-font-xxxs-11);
153
+ color: var(--dsw-alias-label-tertiary);
154
+ overflow: hidden;
155
+ }
156
+
157
+ .subagentLiveTool {
158
+ flex: none;
159
+ font: var(--dsw-font-xxxs-strong-11);
160
+ color: var(--dsw-alias-label-secondary);
161
+ }
162
+
163
+ .subagentLiveArgs {
164
+ min-width: 0;
165
+ font-family: var(--ds-font-family-code);
166
+ font-size: var(--dsw-font-xxxs-11-font-size);
167
+ line-height: var(--dsw-font-xxxs-11-line-height);
168
+ color: var(--dsw-alias-label-tertiary);
169
+ overflow: hidden;
170
+ text-overflow: ellipsis;
171
+ white-space: nowrap;
172
+ }
173
+
174
+ .subagentLiveText {
175
+ display: -webkit-box;
176
+ -webkit-line-clamp: 2;
177
+ -webkit-box-orient: vertical;
178
+ overflow: hidden;
179
+ font: var(--dsw-font-xxxs-11);
180
+ color: var(--dsw-alias-label-secondary);
181
+ }
182
+
183
+ /* ── Tree connector lines (official catalog recipe) ────────────────────── */
184
+
185
+ .subagentNode {
186
+ position: relative;
187
+ min-width: 0;
188
+ }
189
+
190
+ .subagentChildren {
191
+ position: relative;
192
+ margin-left: 18px;
193
+ padding-left: 4px;
194
+ }
195
+
196
+ .subagentChildren::before {
197
+ content: '';
198
+ position: absolute;
199
+ left: 0;
200
+ top: -26px;
201
+ height: 26px;
202
+ border-left: 1px solid var(--dsw-alias-border-l2);
203
+ }
204
+
205
+ .subagentChildren[aria-busy='true']::before {
206
+ content: none;
207
+ }
208
+
209
+ .subagentChildren > .subagentNode::before {
210
+ content: '';
211
+ position: absolute;
212
+ top: 0;
213
+ bottom: 0;
214
+ left: -4px;
215
+ border-left: 1px solid var(--dsw-alias-border-l2);
216
+ }
217
+
218
+ .subagentChildren > .subagentNode:last-child::before {
219
+ bottom: auto;
220
+ height: 17px;
221
+ }
222
+
223
+ .subagentChildren > .subagentNode > .subagentRow::before {
224
+ content: '';
225
+ position: absolute;
226
+ top: 16px;
227
+ left: -4px;
228
+ width: 14px;
229
+ border-top: 1px solid var(--dsw-alias-border-l2);
230
+ }
231
+
232
+ .subagentEmpty {
233
+ display: flex;
234
+ flex-direction: column;
235
+ gap: 2px;
236
+ padding: 16px;
237
+ font: var(--dsw-font-xxs-12);
238
+ color: var(--dsw-alias-label-tertiary);
239
+ text-align: center;
240
+ }
241
+
242
+ .subagentEmptyHint {
243
+ font: var(--dsw-font-xxxs-11);
244
+ color: var(--dsw-alias-label-dimmed);
245
+ }
246
+
247
+ .subagentError {
248
+ display: flex;
249
+ align-items: center;
250
+ justify-content: space-between;
251
+ gap: 8px;
252
+ padding: 8px 10px;
253
+ font: var(--dsw-font-xxs-12);
254
+ color: var(--dsw-alias-state-error-primary);
255
+ }
256
+
257
+ .subagentErrorRetry {
258
+ flex: none;
259
+ display: inline-flex;
260
+ align-items: center;
261
+ gap: 4px;
262
+ height: 24px;
263
+ padding: 0 8px;
264
+ border: none;
265
+ border-radius: 6px;
266
+ background: transparent;
267
+ color: var(--dsw-alias-label-secondary);
268
+ font: var(--dsw-font-xxxs-strong-11);
269
+ cursor: pointer;
270
+ }
271
+
272
+ .subagentErrorRetry:hover {
273
+ background: var(--dsw-alias-interactive-bg-hover);
274
+ color: var(--dsw-alias-label-primary);
275
+ }
276
+
277
+ /* ── Background-job section (below the topology tree) ────────────────── */
278
+
279
+ .jobs {
280
+ margin-top: 10px;
281
+ border-top: 1px solid var(--dsw-alias-border-l2);
282
+ padding-top: 8px;
283
+ }
284
+
285
+ .jobsHeader {
286
+ display: flex;
287
+ align-items: center;
288
+ gap: 8px;
289
+ height: 26px;
290
+ padding: 0 2px;
291
+ }
292
+
293
+ .jobsTitle {
294
+ flex: 1;
295
+ min-width: 0;
296
+ font: var(--dsw-font-xxxs-strong-11);
297
+ color: var(--dsw-alias-label-secondary);
298
+ overflow: hidden;
299
+ text-overflow: ellipsis;
300
+ white-space: nowrap;
301
+ }
302
+
303
+ .jobsCount {
304
+ flex: none;
305
+ font: var(--dsw-font-xxxs-11);
306
+ color: var(--dsw-alias-label-tertiary);
307
+ }
308
+
309
+ .jobsList {
310
+ display: flex;
311
+ flex-direction: column;
312
+ gap: 2px;
313
+ margin: 0;
314
+ padding: 0;
315
+ list-style: none;
316
+ }
317
+
318
+ /* One job row; the whole row lights up on hover, the expandable target
319
+ stays transparent (the kill button rides on the row's right edge). */
320
+ .jobsRow {
321
+ display: flex;
322
+ align-items: center;
323
+ gap: 4px;
324
+ border-radius: 8px;
325
+ }
326
+
327
+ .jobsRow:hover {
328
+ background: var(--dsw-alias-interactive-bg-hover);
329
+ }
330
+
331
+ .jobsRowSettled {
332
+ opacity: 0.8;
333
+ }
334
+
335
+ /* The row whose output is shown in the bottom dock. */
336
+ .jobsRowSelected,
337
+ .jobsRowSelected:hover {
338
+ background: var(--dsw-alias-interactive-bg-active);
339
+ }
340
+
341
+ .jobsRowMain {
342
+ flex: 1;
343
+ display: flex;
344
+ align-items: flex-start;
345
+ gap: 8px;
346
+ min-width: 0;
347
+ padding: 6px 8px 6px 11px;
348
+ border: none;
349
+ border-radius: 8px;
350
+ background: transparent;
351
+ font: var(--dsw-font-s-14);
352
+ color: var(--dsw-alias-label-primary);
353
+ text-align: left;
354
+ cursor: pointer;
355
+ outline: none;
356
+ }
357
+
358
+ .jobsRowMain:focus-visible {
359
+ background: var(--dsw-alias-interactive-bg-hover);
360
+ }
361
+
362
+ .jobsDot {
363
+ margin-top: 5px;
364
+ }
365
+
366
+ .jobsContent {
367
+ display: flex;
368
+ flex-direction: column;
369
+ min-width: 0;
370
+ gap: 1px;
371
+ }
372
+
373
+ /* The command line: a kind badge followed by the command itself in the code
374
+ face, like the terminal's live lines. */
375
+ .jobsLabelLine {
376
+ display: flex;
377
+ align-items: center;
378
+ gap: 6px;
379
+ min-width: 0;
380
+ }
381
+
382
+ .jobsKind {
383
+ flex: none;
384
+ max-width: 90px;
385
+ overflow: hidden;
386
+ text-overflow: ellipsis;
387
+ white-space: nowrap;
388
+ padding: 0 5px;
389
+ border: 1px solid var(--dsw-alias-border-l2);
390
+ border-radius: 4px;
391
+ font: var(--dsw-font-xxxs-strong-11);
392
+ line-height: 14px;
393
+ color: var(--dsw-alias-label-tertiary);
394
+ }
395
+
396
+ .jobsLabel {
397
+ flex: 1;
398
+ min-width: 0;
399
+ overflow: hidden;
400
+ text-overflow: ellipsis;
401
+ white-space: nowrap;
402
+ font-family: var(--ds-font-family-code);
403
+ font-size: var(--dsw-font-xxxs-11-font-size);
404
+ line-height: var(--dsw-font-xxxs-11-line-height);
405
+ color: var(--dsw-alias-label-primary);
406
+ }
407
+
408
+ .jobsSecondary {
409
+ overflow: hidden;
410
+ text-overflow: ellipsis;
411
+ white-space: nowrap;
412
+ font: var(--dsw-font-xxxs-11);
413
+ color: var(--dsw-alias-label-tertiary);
414
+ }
415
+
416
+ .jobsKill {
417
+ flex: none;
418
+ display: inline-flex;
419
+ align-items: center;
420
+ justify-content: center;
421
+ width: 22px;
422
+ height: 22px;
423
+ margin-right: 4px;
424
+ border: none;
425
+ border-radius: 6px;
426
+ background: transparent;
427
+ color: var(--dsw-alias-label-secondary);
428
+ cursor: pointer;
429
+ }
430
+
431
+ .jobsKill:hover {
432
+ background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 12%, transparent);
433
+ color: var(--dsw-alias-state-error-primary);
434
+ }
435
+
436
+ /* The armed (first-click) state: a filled confirm chip instead of the icon. */
437
+ .jobsKillArmed,
438
+ .jobsKillArmed:hover {
439
+ width: auto;
440
+ height: 20px;
441
+ padding: 0 8px;
442
+ background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 12%, transparent);
443
+ color: var(--dsw-alias-state-error-primary);
444
+ font: var(--dsw-font-xxxs-strong-11);
445
+ white-space: nowrap;
446
+ }
447
+
448
+ .jobsKill:disabled {
449
+ opacity: 0.5;
450
+ cursor: default;
451
+ }
452
+
453
+ .jobsKillError {
454
+ flex: none;
455
+ margin-right: 4px;
456
+ font: var(--dsw-font-xxxs-11);
457
+ color: var(--dsw-alias-state-error-primary);
458
+ }
459
+
460
+ /* ── The shared output dock (bottom of the page, sticky like a terminal) ── */
461
+
462
+ /* Direct child of the scrolling body, so it docks at the scrollport's bottom
463
+ edge while the job list scrolls above it; a solid background keeps the
464
+ tree from showing through. */
465
+ .jobsPane {
466
+ position: sticky;
467
+ bottom: 0;
468
+ z-index: 1;
469
+ margin-top: 4px;
470
+ border: 1px solid var(--dsw-alias-border-l2);
471
+ border-radius: 8px;
472
+ background: var(--dsw-alias-bg-base);
473
+ box-shadow: 0 -6px 12px -8px rgba(0, 0, 0, 0.35);
474
+ overflow: hidden;
475
+ }
476
+
477
+ .jobsPaneHeader {
478
+ display: flex;
479
+ align-items: center;
480
+ gap: 6px;
481
+ height: 28px;
482
+ padding: 0 4px 0 10px;
483
+ border-bottom: 1px solid var(--dsw-alias-border-l1);
484
+ }
485
+
486
+ .jobsPaneDot {
487
+ flex: none;
488
+ }
489
+
490
+ .jobsPaneLabel {
491
+ flex: 1;
492
+ min-width: 0;
493
+ overflow: hidden;
494
+ text-overflow: ellipsis;
495
+ white-space: nowrap;
496
+ font-family: var(--ds-font-family-code);
497
+ font-size: var(--dsw-font-xxxs-11-font-size);
498
+ line-height: var(--dsw-font-xxxs-11-line-height);
499
+ color: var(--dsw-alias-label-primary);
500
+ }
501
+
502
+ .jobsPaneStatus {
503
+ flex: none;
504
+ font: var(--dsw-font-xxxs-11);
505
+ color: var(--dsw-alias-label-tertiary);
506
+ }
507
+
508
+ .jobsPaneClose {
509
+ flex: none;
510
+ display: inline-flex;
511
+ align-items: center;
512
+ justify-content: center;
513
+ width: 20px;
514
+ height: 20px;
515
+ border: none;
516
+ border-radius: 5px;
517
+ background: transparent;
518
+ color: var(--dsw-alias-label-secondary);
519
+ cursor: pointer;
520
+ }
521
+
522
+ .jobsPaneClose:hover {
523
+ background: var(--dsw-alias-interactive-bg-hover);
524
+ }
525
+
526
+ .jobsPanePre {
527
+ margin: 0;
528
+ max-height: 200px;
529
+ overflow: auto;
530
+ padding: 6px 10px;
531
+ font-family: var(--ds-font-family-code);
532
+ font-size: var(--dsw-font-xxxs-11-font-size);
533
+ line-height: 1.5;
534
+ color: var(--dsw-alias-label-primary);
535
+ white-space: pre-wrap;
536
+ word-break: break-word;
537
+ }
538
+
539
+ .jobsPaneHint {
540
+ padding: 8px 10px;
541
+ font: var(--dsw-font-xxxs-11);
542
+ color: var(--dsw-alias-label-tertiary);
543
+ }
544
+
545
+ .jobsPaneError {
546
+ color: var(--dsw-alias-state-error-primary);
547
+ }