dsh-winrm 0.1.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 (64) hide show
  1. package/LICENSE +73 -0
  2. package/README.md +112 -0
  3. package/README.zh.md +119 -0
  4. package/RELEASING.md +75 -0
  5. package/cordis.patch.yml +8 -0
  6. package/lib/client.js +2076 -0
  7. package/lib/index.js +2458 -0
  8. package/lib/invariant.js +6 -0
  9. package/lib/types/client/api.d.ts +59 -0
  10. package/lib/types/client/index.d.ts +38 -0
  11. package/lib/types/client/locales.d.ts +231 -0
  12. package/lib/types/client/panel/ConsoleTab.d.ts +11 -0
  13. package/lib/types/client/panel/HostFormDialog.d.ts +12 -0
  14. package/lib/types/client/panel/HostsTab.d.ts +9 -0
  15. package/lib/types/client/panel/ProcessesTab.d.ts +7 -0
  16. package/lib/types/client/panel/ServicesTab.d.ts +7 -0
  17. package/lib/types/client/panel/TransferTab.d.ts +7 -0
  18. package/lib/types/client/panel/WinrmPanel.d.ts +12 -0
  19. package/lib/types/client/panel/WinrmPanelIcon.d.ts +8 -0
  20. package/lib/types/client/panel/helpers.d.ts +16 -0
  21. package/lib/types/engine/client.d.ts +49 -0
  22. package/lib/types/engine/console.d.ts +23 -0
  23. package/lib/types/engine.d.ts +58 -0
  24. package/lib/types/index.d.ts +44 -0
  25. package/lib/types/invariant.d.ts +3 -0
  26. package/lib/types/loopback.d.ts +24 -0
  27. package/lib/types/mount-once.d.ts +24 -0
  28. package/lib/types/powershell.d.ts +73 -0
  29. package/lib/types/protocol.d.ts +176 -0
  30. package/lib/types/routes.d.ts +26 -0
  31. package/lib/types/smb.d.ts +31 -0
  32. package/lib/types/store.d.ts +44 -0
  33. package/lib/types/tools.d.ts +20 -0
  34. package/package.json +111 -0
  35. package/scripts/enable-winrm.ps1 +0 -0
  36. package/scripts/postbuild.mjs +40 -0
  37. package/scripts/validate-manifest.mjs +18 -0
  38. package/src/client/api.ts +345 -0
  39. package/src/client/css-modules.d.ts +5 -0
  40. package/src/client/index.ts +82 -0
  41. package/src/client/locales.ts +243 -0
  42. package/src/client/panel/ConsoleTab.tsx +142 -0
  43. package/src/client/panel/HostFormDialog.tsx +142 -0
  44. package/src/client/panel/HostsTab.tsx +153 -0
  45. package/src/client/panel/ProcessesTab.tsx +119 -0
  46. package/src/client/panel/ServicesTab.tsx +123 -0
  47. package/src/client/panel/TransferTab.tsx +161 -0
  48. package/src/client/panel/WinrmPanel.tsx +85 -0
  49. package/src/client/panel/WinrmPanelIcon.tsx +27 -0
  50. package/src/client/panel/helpers.ts +33 -0
  51. package/src/client/panel/panel.module.css +1000 -0
  52. package/src/engine/client.ts +291 -0
  53. package/src/engine/console.ts +62 -0
  54. package/src/engine.ts +331 -0
  55. package/src/index.ts +142 -0
  56. package/src/invariant.ts +4 -0
  57. package/src/loopback.ts +63 -0
  58. package/src/mount-once.ts +48 -0
  59. package/src/powershell.ts +208 -0
  60. package/src/protocol.ts +178 -0
  61. package/src/routes.ts +490 -0
  62. package/src/smb.ts +129 -0
  63. package/src/store.ts +232 -0
  64. package/src/tools.ts +387 -0
@@ -0,0 +1,1000 @@
1
+ /**
2
+ * WinRM panel styles. Every rule here is a local CSS-module class (hashed at
3
+ * build) scoped to the panel's own elements, so nothing leaks into the rest
4
+ * of the GUI; colors ride the dsh --dsw-* tokens so the panel follows the
5
+ * active theme (light/dark and skins). The panel occupies the shell's keyed
6
+ * `main` slot, which the layout swaps against the Conversation — no global
7
+ * hide/overlay rules are needed (nor safe: they would leak across plugins).
8
+ */
9
+
10
+ /* --- sidebar entry row ------------------------------------------------------- */
11
+
12
+ .entry {
13
+ display: flex;
14
+ align-items: center;
15
+ gap: 8px;
16
+ width: 100%;
17
+ height: 32px;
18
+ padding: 0 12px;
19
+ background: transparent;
20
+ border: none;
21
+ border-radius: 8px;
22
+ color: var(--dsw-alias-label-secondary);
23
+ cursor: pointer;
24
+ font-size: 13px;
25
+ white-space: nowrap;
26
+ }
27
+
28
+ .entry:hover {
29
+ background: var(--dsw-specific-sidebar-nav-item-hover);
30
+ color: var(--dsw-alias-label-primary);
31
+ }
32
+
33
+ .entry[data-active] {
34
+ background: var(--dsw-specific-sidebar-nav-item-active);
35
+ color: var(--dsw-alias-label-primary);
36
+ font-weight: 600;
37
+ }
38
+
39
+ .entryIcon {
40
+ display: inline-flex;
41
+ align-items: center;
42
+ justify-content: center;
43
+ flex: none;
44
+ }
45
+
46
+ .entryLabel {
47
+ overflow: hidden;
48
+ text-overflow: ellipsis;
49
+ }
50
+
51
+ /* Collapsed rail: icon-only, centered, matching the shell's 56px rail. */
52
+ [data-dsh-frame][data-sidebar-collapsed] .entry {
53
+ justify-content: center;
54
+ padding: 0;
55
+ width: 100%;
56
+ }
57
+
58
+ [data-dsh-frame][data-sidebar-collapsed] .entryLabel {
59
+ display: none;
60
+ }
61
+
62
+ /* --- panel frame -------------------------------------------------------------- */
63
+
64
+ .panel {
65
+ display: flex;
66
+ flex-direction: column;
67
+ height: 100%;
68
+ min-width: 0;
69
+ min-height: 0;
70
+ padding: 14px 16px 16px;
71
+ gap: 10px;
72
+ background: var(--dsw-alias-bg-base);
73
+ color: var(--dsw-alias-label-primary);
74
+ font-family: var(--dsw-font-family);
75
+ }
76
+
77
+ .panelHeader {
78
+ display: flex;
79
+ align-items: center;
80
+ gap: 10px;
81
+ flex: none;
82
+ }
83
+
84
+ .panelTitle {
85
+ margin: 0;
86
+ flex: 1;
87
+ font-size: 16px;
88
+ font-weight: 700;
89
+ color: var(--dsw-alias-label-primary);
90
+ white-space: nowrap;
91
+ }
92
+
93
+ .backButton {
94
+ display: inline-flex;
95
+ align-items: center;
96
+ gap: 4px;
97
+ }
98
+
99
+ /* --- tab bar ------------------------------------------------------------------ */
100
+
101
+ .tabBar {
102
+ display: flex;
103
+ gap: 2px;
104
+ flex: none;
105
+ border-bottom: 1px solid var(--dsw-alias-border-l1);
106
+ }
107
+
108
+ .tab {
109
+ padding: 7px 14px;
110
+ font-size: 13px;
111
+ color: var(--dsw-alias-label-secondary);
112
+ background: transparent;
113
+ border: none;
114
+ border-bottom: 2px solid transparent;
115
+ border-radius: 6px 6px 0 0;
116
+ cursor: pointer;
117
+ white-space: nowrap;
118
+ }
119
+
120
+ .tab:hover {
121
+ color: var(--dsw-alias-label-primary);
122
+ background: var(--dsw-alias-interactive-bg-hover);
123
+ }
124
+
125
+ .tab[data-active] {
126
+ color: var(--dsw-alias-label-primary);
127
+ font-weight: 600;
128
+ border-bottom-color: var(--dsw-alias-state-business-primary);
129
+ }
130
+
131
+ .panelContent {
132
+ flex: 1;
133
+ min-height: 0;
134
+ display: flex;
135
+ flex-direction: column;
136
+ overflow: hidden;
137
+ }
138
+
139
+ /* Scrollable tab body (transfer / tunnels); hosts and cluster use fillBody so
140
+ their toolbars stay put while the table scrolls internally. */
141
+ .tabBody {
142
+ display: flex;
143
+ flex-direction: column;
144
+ gap: 10px;
145
+ flex: 1;
146
+ min-height: 0;
147
+ overflow-y: auto;
148
+ }
149
+
150
+ .fillBody {
151
+ display: flex;
152
+ flex-direction: column;
153
+ gap: 10px;
154
+ flex: 1;
155
+ min-height: 0;
156
+ overflow: hidden;
157
+ }
158
+
159
+ /* --- toolbar / controls ------------------------------------------------------- */
160
+
161
+ .toolbar {
162
+ display: flex;
163
+ align-items: center;
164
+ gap: 8px;
165
+ flex: none;
166
+ flex-wrap: wrap;
167
+ }
168
+
169
+ .controls {
170
+ display: flex;
171
+ align-items: center;
172
+ gap: 8px;
173
+ flex: none;
174
+ flex-wrap: wrap;
175
+ }
176
+
177
+ .controls .input {
178
+ flex: 0 1 260px;
179
+ min-width: 150px;
180
+ }
181
+
182
+ .toolbarSpacer {
183
+ flex: 1;
184
+ }
185
+
186
+ .search {
187
+ flex: 0 1 260px;
188
+ min-width: 120px;
189
+ padding: 6px 10px;
190
+ font-size: 13px;
191
+ color: var(--dsw-alias-label-primary);
192
+ background: var(--dsw-specific-input-major);
193
+ border: 1px solid var(--dsw-alias-border-l2);
194
+ border-radius: 8px;
195
+ outline: none;
196
+ }
197
+
198
+ .search::placeholder {
199
+ color: var(--dsw-alias-label-tertiary);
200
+ }
201
+
202
+ .groupBySelect {
203
+ padding: 6px 8px;
204
+ font-size: 13px;
205
+ color: var(--dsw-alias-label-primary);
206
+ background: var(--dsw-specific-input-major);
207
+ border: 1px solid var(--dsw-alias-border-l2);
208
+ border-radius: 8px;
209
+ outline: none;
210
+ }
211
+
212
+ /* --- host groups (#379) ------------------------------------------------------- */
213
+
214
+ .groupSection + .groupSection {
215
+ border-top: 1px solid var(--dsw-alias-border-l1);
216
+ }
217
+
218
+ .groupHeader {
219
+ display: flex;
220
+ align-items: center;
221
+ gap: 8px;
222
+ padding: 4px 8px;
223
+ position: sticky;
224
+ top: 0;
225
+ background: var(--dsw-alias-bg-base, var(--dsw-specific-input-major));
226
+ }
227
+
228
+ .groupToggle {
229
+ display: flex;
230
+ align-items: center;
231
+ gap: 6px;
232
+ flex: 1;
233
+ min-width: 0;
234
+ padding: 4px 6px;
235
+ border: none;
236
+ background: none;
237
+ color: var(--dsw-alias-label-primary);
238
+ font-size: 12.5px;
239
+ font-weight: 500;
240
+ cursor: pointer;
241
+ text-align: left;
242
+ border-radius: 6px;
243
+ }
244
+
245
+ .groupToggle:hover {
246
+ background: var(--dsw-alias-interactive-bg-hover);
247
+ }
248
+
249
+ .groupChevron {
250
+ width: 7px;
251
+ height: 7px;
252
+ border-right: 1.5px solid var(--dsw-alias-label-tertiary);
253
+ border-bottom: 1.5px solid var(--dsw-alias-label-tertiary);
254
+ transform: rotate(45deg);
255
+ transition: transform 120ms ease;
256
+ flex: none;
257
+ margin-bottom: 2px;
258
+ }
259
+
260
+ .groupChevron[data-collapsed] {
261
+ transform: rotate(-45deg);
262
+ margin-bottom: 0;
263
+ }
264
+
265
+ .groupName {
266
+ overflow: hidden;
267
+ text-overflow: ellipsis;
268
+ white-space: nowrap;
269
+ }
270
+
271
+ .groupCount {
272
+ color: var(--dsw-alias-label-tertiary);
273
+ font-weight: 400;
274
+ flex: none;
275
+ }
276
+
277
+ /* --- tables ------------------------------------------------------------------- */
278
+
279
+ .tableWrap {
280
+ flex: 1;
281
+ min-height: 0;
282
+ overflow: auto;
283
+ border: 1px solid var(--dsw-alias-border-l1);
284
+ border-radius: 10px;
285
+ }
286
+
287
+ .table {
288
+ width: 100%;
289
+ border-collapse: collapse;
290
+ font-size: 12.5px;
291
+ }
292
+
293
+ .table th {
294
+ position: sticky;
295
+ top: 0;
296
+ z-index: 1;
297
+ padding: 8px 10px;
298
+ text-align: left;
299
+ background: var(--dsw-alias-bg-layer-2);
300
+ color: var(--dsw-alias-label-secondary);
301
+ font-weight: 600;
302
+ border-bottom: 1px solid var(--dsw-alias-border-l1);
303
+ white-space: nowrap;
304
+ }
305
+
306
+ .table td {
307
+ padding: 7px 10px;
308
+ border-bottom: 1px solid var(--dsw-alias-separator-primary);
309
+ vertical-align: top;
310
+ }
311
+
312
+ .table tbody tr:last-child td {
313
+ border-bottom: none;
314
+ }
315
+
316
+ .table tbody tr:hover td {
317
+ background: var(--dsw-alias-interactive-bg-hover);
318
+ }
319
+
320
+ .mono {
321
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
322
+ }
323
+
324
+ .cellMuted {
325
+ color: var(--dsw-alias-label-tertiary);
326
+ }
327
+
328
+ .actions {
329
+ display: flex;
330
+ align-items: center;
331
+ gap: 8px;
332
+ white-space: nowrap;
333
+ }
334
+
335
+ .inlineTest {
336
+ display: inline-flex;
337
+ align-items: center;
338
+ gap: 6px;
339
+ font-size: 11.5px;
340
+ color: var(--dsw-alias-label-secondary);
341
+ }
342
+
343
+ .inlineTest[data-status='ok'] {
344
+ color: var(--dsw-alias-state-success-primary);
345
+ }
346
+
347
+ .inlineTest[data-status='fail'] {
348
+ color: var(--dsw-alias-state-error-primary);
349
+ }
350
+
351
+ /* --- badges ------------------------------------------------------------------- */
352
+
353
+ .badge {
354
+ display: inline-block;
355
+ padding: 1px 8px;
356
+ font-size: 11px;
357
+ line-height: 1.6;
358
+ border-radius: 999px;
359
+ border: 1px solid var(--dsw-alias-border-l2);
360
+ color: var(--dsw-alias-label-secondary);
361
+ white-space: nowrap;
362
+ }
363
+
364
+ .badge[data-kind='key'] {
365
+ color: var(--dsw-alias-state-business-primary);
366
+ border-color: var(--dsw-alias-state-business-primary);
367
+ }
368
+
369
+ .badge[data-kind='password'] {
370
+ color: var(--dsw-alias-state-warn-primary);
371
+ border-color: var(--dsw-alias-state-warn-primary);
372
+ }
373
+
374
+ .badge[data-status='ok'] {
375
+ color: var(--dsw-alias-state-success-primary);
376
+ border-color: var(--dsw-alias-state-success-primary);
377
+ }
378
+
379
+ .badge[data-status='fail'] {
380
+ color: var(--dsw-alias-state-error-primary);
381
+ border-color: var(--dsw-alias-state-error-primary);
382
+ }
383
+
384
+ .badge[data-status='timeout'] {
385
+ color: var(--dsw-alias-state-warn-primary);
386
+ border-color: var(--dsw-alias-state-warn-primary);
387
+ }
388
+
389
+ /* --- buttons ------------------------------------------------------------------ */
390
+
391
+ .primaryButton {
392
+ padding: 6px 14px;
393
+ font-size: 13px;
394
+ font-weight: 600;
395
+ color: var(--dsw-alias-label-primary-foreground);
396
+ background: var(--dsw-alias-button-info-fill);
397
+ border: none;
398
+ border-radius: 8px;
399
+ cursor: pointer;
400
+ white-space: nowrap;
401
+ }
402
+
403
+ .primaryButton:hover:not(:disabled) {
404
+ background: var(--dsw-alias-button-info-hover);
405
+ }
406
+
407
+ .primaryButton:disabled {
408
+ opacity: 0.5;
409
+ cursor: default;
410
+ }
411
+
412
+ .ghostButton {
413
+ padding: 5px 12px;
414
+ font-size: 12px;
415
+ color: var(--dsw-alias-label-primary);
416
+ background: transparent;
417
+ border: 1px solid var(--dsw-alias-border-l2);
418
+ border-radius: 8px;
419
+ cursor: pointer;
420
+ white-space: nowrap;
421
+ }
422
+
423
+ .ghostButton:hover:not(:disabled) {
424
+ background: var(--dsw-alias-interactive-bg-hover);
425
+ }
426
+
427
+ .ghostButton:disabled {
428
+ opacity: 0.45;
429
+ cursor: default;
430
+ }
431
+
432
+ .iconButton {
433
+ display: inline-flex;
434
+ align-items: center;
435
+ justify-content: center;
436
+ width: 26px;
437
+ height: 26px;
438
+ padding: 0;
439
+ background: transparent;
440
+ border: none;
441
+ border-radius: 6px;
442
+ color: var(--dsw-alias-label-secondary);
443
+ cursor: pointer;
444
+ font-size: 13px;
445
+ }
446
+
447
+ .iconButton:hover {
448
+ background: var(--dsw-alias-interactive-bg-hover);
449
+ color: var(--dsw-alias-label-primary);
450
+ }
451
+
452
+ .linkButton {
453
+ padding: 0;
454
+ font-size: 12px;
455
+ color: var(--dsw-alias-state-business-primary);
456
+ background: none;
457
+ border: none;
458
+ cursor: pointer;
459
+ white-space: nowrap;
460
+ }
461
+
462
+ .linkButton:hover:not(:disabled) {
463
+ text-decoration: underline;
464
+ }
465
+
466
+ .linkButton:disabled {
467
+ opacity: 0.45;
468
+ cursor: default;
469
+ }
470
+
471
+ .linkButton[data-danger] {
472
+ color: var(--dsw-alias-state-error-primary);
473
+ }
474
+
475
+ /* --- spinner / banners / states ------------------------------------------------ */
476
+
477
+ .spinner {
478
+ display: inline-block;
479
+ width: 11px;
480
+ height: 11px;
481
+ flex: none;
482
+ border: 2px solid var(--dsw-alias-state-business-primary);
483
+ border-top-color: transparent;
484
+ border-radius: 50%;
485
+ animation: dshSshSpin 800ms linear infinite;
486
+ vertical-align: -1px;
487
+ }
488
+
489
+ @keyframes dshSshSpin {
490
+ to { transform: rotate(360deg); }
491
+ }
492
+
493
+ .banner {
494
+ padding: 8px 12px;
495
+ font-size: 12.5px;
496
+ line-height: 1.5;
497
+ border-radius: 8px;
498
+ border: 1px solid var(--dsw-alias-border-l2);
499
+ color: var(--dsw-alias-label-secondary);
500
+ overflow-wrap: anywhere;
501
+ }
502
+
503
+ .banner[data-kind='ok'] {
504
+ color: var(--dsw-alias-state-success-primary);
505
+ border-color: var(--dsw-alias-state-success-primary);
506
+ }
507
+
508
+ .banner[data-kind='error'] {
509
+ color: var(--dsw-alias-state-error-primary);
510
+ border-color: var(--dsw-alias-state-error-primary);
511
+ }
512
+
513
+ .banner[data-kind='info'] {
514
+ color: var(--dsw-alias-state-business-primary);
515
+ border-color: var(--dsw-alias-state-business-primary);
516
+ }
517
+
518
+ .empty {
519
+ padding: 28px 12px;
520
+ text-align: center;
521
+ font-size: 12.5px;
522
+ color: var(--dsw-alias-label-tertiary);
523
+ }
524
+
525
+ .loading {
526
+ padding: 28px 12px;
527
+ text-align: center;
528
+ font-size: 12.5px;
529
+ color: var(--dsw-alias-label-tertiary);
530
+ }
531
+
532
+ /* --- modal (host form) -------------------------------------------------------- */
533
+
534
+ .modalBackdrop {
535
+ position: fixed;
536
+ inset: 0;
537
+ z-index: 40;
538
+ display: flex;
539
+ align-items: center;
540
+ justify-content: center;
541
+ background: var(--dsw-alias-bg-mask-1);
542
+ }
543
+
544
+ .modal {
545
+ display: flex;
546
+ flex-direction: column;
547
+ gap: 12px;
548
+ width: min(560px, calc(100vw - 48px));
549
+ max-height: calc(100vh - 96px);
550
+ overflow-y: auto;
551
+ padding: 18px;
552
+ background: var(--dsw-alias-bg-base);
553
+ border: 1px solid var(--dsw-alias-border-l2);
554
+ border-radius: 14px;
555
+ box-shadow: var(--dsw-shadow-lv3);
556
+ color: var(--dsw-alias-label-primary);
557
+ }
558
+
559
+ .modalTitle {
560
+ margin: 0;
561
+ font-size: 15px;
562
+ font-weight: 700;
563
+ }
564
+
565
+ .modalFooter {
566
+ display: flex;
567
+ justify-content: flex-end;
568
+ gap: 10px;
569
+ margin-top: 4px;
570
+ }
571
+
572
+ .formError {
573
+ margin: 0;
574
+ font-size: 12px;
575
+ color: var(--dsw-alias-state-error-primary);
576
+ }
577
+
578
+ .hint {
579
+ font-size: 11.5px;
580
+ color: var(--dsw-alias-label-tertiary);
581
+ }
582
+
583
+ .field {
584
+ display: flex;
585
+ flex-direction: column;
586
+ gap: 5px;
587
+ }
588
+
589
+ .fieldLabel {
590
+ font-size: 12px;
591
+ font-weight: 600;
592
+ color: var(--dsw-alias-label-secondary);
593
+ }
594
+
595
+ .input {
596
+ padding: 7px 10px;
597
+ font-size: 13px;
598
+ color: var(--dsw-alias-label-primary);
599
+ background: var(--dsw-specific-input-major);
600
+ border: 1px solid var(--dsw-alias-border-l2);
601
+ border-radius: 8px;
602
+ outline: none;
603
+ resize: vertical;
604
+ font-family: inherit;
605
+ }
606
+
607
+ .input:focus {
608
+ border-color: var(--dsw-alias-state-business-primary);
609
+ }
610
+
611
+ .input::placeholder {
612
+ color: var(--dsw-alias-label-tertiary);
613
+ }
614
+
615
+ .input:disabled {
616
+ opacity: 0.55;
617
+ }
618
+
619
+ .formRow {
620
+ display: grid;
621
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
622
+ gap: 10px 12px;
623
+ }
624
+
625
+ .radioRow {
626
+ display: flex;
627
+ gap: 16px;
628
+ align-items: center;
629
+ }
630
+
631
+ .radioLabel {
632
+ display: inline-flex;
633
+ gap: 6px;
634
+ align-items: center;
635
+ font-size: 13px;
636
+ color: var(--dsw-alias-label-primary);
637
+ cursor: pointer;
638
+ }
639
+
640
+ /* --- terminal ----------------------------------------------------------------- */
641
+
642
+ .termBody {
643
+ display: flex;
644
+ flex-direction: column;
645
+ gap: 8px;
646
+ flex: 1;
647
+ min-height: 0;
648
+ overflow: hidden;
649
+ }
650
+
651
+ .termWrap {
652
+ position: relative;
653
+ flex: 1;
654
+ min-height: 0;
655
+ border: 1px solid var(--dsw-alias-border-l1);
656
+ border-radius: 10px;
657
+ overflow: hidden;
658
+ background: #0b0e14;
659
+ }
660
+
661
+ .termContainer {
662
+ position: absolute;
663
+ /* Inset offsets, not padding: FitAddon measures this element's height as
664
+ the drawable area, so padding here would be measured as terminal space
665
+ and clip the bottom line under a global border-box reset. */
666
+ inset: 8px 10px;
667
+ }
668
+
669
+ .termPlaceholder {
670
+ position: absolute;
671
+ inset: 0;
672
+ z-index: 2;
673
+ display: flex;
674
+ align-items: center;
675
+ justify-content: center;
676
+ padding: 0 24px;
677
+ text-align: center;
678
+ font-size: 12.5px;
679
+ color: var(--dsw-alias-label-tertiary);
680
+ background: var(--dsw-alias-bg-base);
681
+ }
682
+
683
+ /* --- transfer ----------------------------------------------------------------- */
684
+
685
+ .hiddenFile {
686
+ display: none;
687
+ }
688
+
689
+ .browsePanel {
690
+ display: flex;
691
+ flex-direction: column;
692
+ flex: none;
693
+ border: 1px solid var(--dsw-alias-border-l1);
694
+ border-radius: 10px;
695
+ overflow: hidden;
696
+ }
697
+
698
+ .browseHeader {
699
+ display: flex;
700
+ align-items: center;
701
+ gap: 8px;
702
+ padding: 8px 10px;
703
+ background: var(--dsw-alias-bg-layer-2);
704
+ border-bottom: 1px solid var(--dsw-alias-border-l1);
705
+ }
706
+
707
+ .browsePath {
708
+ flex: 1;
709
+ min-width: 0;
710
+ overflow: hidden;
711
+ text-overflow: ellipsis;
712
+ white-space: nowrap;
713
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
714
+ font-size: 12px;
715
+ color: var(--dsw-alias-label-secondary);
716
+ }
717
+
718
+ .browseList {
719
+ max-height: 240px;
720
+ overflow-y: auto;
721
+ }
722
+
723
+ .dirRow {
724
+ display: grid;
725
+ grid-template-columns: minmax(0, 1fr) auto auto;
726
+ gap: 12px;
727
+ width: 100%;
728
+ padding: 5px 10px;
729
+ text-align: left;
730
+ font: inherit;
731
+ font-size: 12.5px;
732
+ color: var(--dsw-alias-label-primary);
733
+ background: transparent;
734
+ border: none;
735
+ border-bottom: 1px solid var(--dsw-alias-separator-primary);
736
+ cursor: pointer;
737
+ }
738
+
739
+ .dirRow:hover {
740
+ background: var(--dsw-alias-interactive-bg-hover);
741
+ }
742
+
743
+ .dirRow[data-type='dir'] .dirName {
744
+ color: var(--dsw-alias-state-business-primary);
745
+ }
746
+
747
+ .dirRow[data-up] {
748
+ color: var(--dsw-alias-label-secondary);
749
+ }
750
+
751
+ .dirName {
752
+ overflow: hidden;
753
+ text-overflow: ellipsis;
754
+ white-space: nowrap;
755
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
756
+ }
757
+
758
+ .dirType {
759
+ color: var(--dsw-alias-label-tertiary);
760
+ white-space: nowrap;
761
+ }
762
+
763
+ .dirSize {
764
+ color: var(--dsw-alias-label-tertiary);
765
+ white-space: nowrap;
766
+ text-align: right;
767
+ }
768
+
769
+ .transferBlock {
770
+ display: flex;
771
+ flex-direction: column;
772
+ gap: 6px;
773
+ flex: none;
774
+ }
775
+
776
+ .progressMeta {
777
+ display: flex;
778
+ gap: 12px;
779
+ flex-wrap: wrap;
780
+ font-size: 12px;
781
+ color: var(--dsw-alias-label-secondary);
782
+ }
783
+
784
+ .progressTrack {
785
+ height: 8px;
786
+ border-radius: 999px;
787
+ background: var(--dsw-alias-interactive-bg-hover);
788
+ overflow: hidden;
789
+ }
790
+
791
+ .progressBar {
792
+ height: 100%;
793
+ border-radius: 999px;
794
+ background: var(--dsw-alias-state-business-primary);
795
+ transition: width 120ms linear;
796
+ }
797
+
798
+ /* --- tunnels ------------------------------------------------------------------ */
799
+
800
+ .tunnelList {
801
+ display: flex;
802
+ flex-direction: column;
803
+ gap: 8px;
804
+ flex: none;
805
+ }
806
+
807
+ .tunnelRow {
808
+ display: flex;
809
+ align-items: center;
810
+ gap: 10px;
811
+ padding: 8px 12px;
812
+ background: var(--dsw-alias-bg-layer-2);
813
+ border: 1px solid var(--dsw-alias-border-l2);
814
+ border-radius: 10px;
815
+ }
816
+
817
+ .tunnelRow[data-state='forwarding'] {
818
+ border-color: var(--dsw-alias-state-success-primary);
819
+ }
820
+
821
+ .tunnelRow[data-state='connecting'] {
822
+ border-color: var(--dsw-alias-state-warn-primary);
823
+ }
824
+
825
+ .tunnelRow[data-state='failed'] {
826
+ border-color: var(--dsw-alias-state-error-primary);
827
+ }
828
+
829
+ .tunnelLabel {
830
+ flex: 1;
831
+ min-width: 0;
832
+ overflow: hidden;
833
+ text-overflow: ellipsis;
834
+ white-space: nowrap;
835
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
836
+ font-size: 12.5px;
837
+ }
838
+
839
+ .formCard {
840
+ display: flex;
841
+ flex-direction: column;
842
+ gap: 10px;
843
+ padding: 12px;
844
+ background: var(--dsw-alias-bg-layer-2);
845
+ border: 1px solid var(--dsw-alias-border-l1);
846
+ border-radius: 10px;
847
+ flex: none;
848
+ }
849
+
850
+ /* --- cluster ------------------------------------------------------------------ */
851
+
852
+ .clusterForm {
853
+ display: flex;
854
+ flex-direction: column;
855
+ gap: 8px;
856
+ flex: none;
857
+ }
858
+
859
+ .clusterFilters {
860
+ display: grid;
861
+ grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
862
+ gap: 10px;
863
+ }
864
+
865
+ .commandInput {
866
+ min-height: 96px;
867
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
868
+ }
869
+
870
+ .cellDetails summary {
871
+ cursor: pointer;
872
+ font-size: 12px;
873
+ color: var(--dsw-alias-label-secondary);
874
+ }
875
+
876
+ .cellPre {
877
+ margin: 4px 0 0;
878
+ padding: 6px 8px;
879
+ max-height: 180px;
880
+ overflow: auto;
881
+ background: var(--dsw-alias-bg-layer-2);
882
+ border: 1px solid var(--dsw-alias-border-l2);
883
+ border-radius: 6px;
884
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
885
+ font-size: 11.5px;
886
+ white-space: pre-wrap;
887
+ word-break: break-all;
888
+ }
889
+
890
+ /* ------------------------------------------------- dsh-winrm console */
891
+ .consoleWrap {
892
+ flex-direction: column;
893
+ flex: 1;
894
+ min-height: 0;
895
+ gap: 8px;
896
+ display: flex;
897
+ }
898
+ .consoleHeader {
899
+ flex: none;
900
+ align-items: center;
901
+ gap: 8px;
902
+ display: flex;
903
+ }
904
+ .consoleOutput {
905
+ flex: 1;
906
+ min-height: 0;
907
+ background: var(--dsw-alias-bg-layer-2);
908
+ border: 1px solid var(--dsw-alias-border-l2);
909
+ border-radius: 6px;
910
+ overflow: auto;
911
+ margin: 0;
912
+ padding: 8px 10px;
913
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
914
+ font-size: 12.5px;
915
+ line-height: 1.45;
916
+ white-space: pre-wrap;
917
+ word-break: break-all;
918
+ color: var(--dsw-alias-label-primary);
919
+ }
920
+ .consoleInputRow {
921
+ flex: none;
922
+ align-items: center;
923
+ gap: 8px;
924
+ display: flex;
925
+ }
926
+ .consoleInputRow .input {
927
+ flex: 1;
928
+ }
929
+ .utf8Note {
930
+ flex: none;
931
+ color: var(--dsw-alias-label-tertiary);
932
+ font-size: 11.5px;
933
+ }
934
+ .checkRow {
935
+ align-items: center;
936
+ gap: 6px;
937
+ display: flex;
938
+ font-size: 13px;
939
+ }
940
+ .dialogOverlay {
941
+ position: fixed;
942
+ inset: 0;
943
+ z-index: 120;
944
+ background: rgb(0 0 0 / 40%);
945
+ align-items: center;
946
+ justify-content: center;
947
+ display: flex;
948
+ }
949
+ .dialog {
950
+ background: var(--dsw-alias-bg-layer-2);
951
+ border: 1px solid var(--dsw-alias-border-l1);
952
+ border-radius: 12px;
953
+ width: min(520px, calc(100vw - 48px));
954
+ max-height: calc(100vh - 96px);
955
+ flex-direction: column;
956
+ gap: 10px;
957
+ padding: 16px;
958
+ display: flex;
959
+ overflow-y: auto;
960
+ }
961
+ .dialogTitle {
962
+ margin: 0;
963
+ font-size: 15px;
964
+ font-weight: 700;
965
+ }
966
+ .field {
967
+ flex-direction: column;
968
+ gap: 4px;
969
+ display: flex;
970
+ font-size: 13px;
971
+ }
972
+ .fieldLabel {
973
+ color: var(--dsw-alias-label-secondary);
974
+ font-size: 12px;
975
+ }
976
+ .fieldHint {
977
+ color: var(--dsw-alias-label-tertiary);
978
+ font-size: 11.5px;
979
+ }
980
+ .formRow {
981
+ align-items: flex-start;
982
+ gap: 10px;
983
+ display: flex;
984
+ }
985
+ .formRow .field {
986
+ flex: 1;
987
+ }
988
+ .formError {
989
+ color: var(--dsw-alias-state-error-primary);
990
+ font-size: 12.5px;
991
+ }
992
+ .badge[data-kind="ok"] {
993
+ color: var(--dsw-alias-state-success-primary);
994
+ }
995
+ .badge[data-kind="muted"] {
996
+ color: var(--dsw-alias-label-secondary);
997
+ }
998
+ .badge[data-kind="password"] {
999
+ color: var(--dsw-alias-state-info-primary);
1000
+ }