pinokiod 8.0.39 → 8.0.41

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 (37) hide show
  1. package/kernel/api/hf/index.js +2 -2
  2. package/kernel/api/index.js +12 -3
  3. package/kernel/connect/index.js +2 -2
  4. package/kernel/connect/providers/huggingface/index.js +14 -5
  5. package/kernel/index.js +14 -2
  6. package/kernel/shell.js +3 -2
  7. package/kernel/shells.js +6 -0
  8. package/kernel/vault/constants.js +13 -0
  9. package/kernel/vault/hash_worker.js +9 -2
  10. package/kernel/vault/index.js +1856 -316
  11. package/kernel/vault/registry.js +526 -52
  12. package/kernel/vault/snapshot.js +29 -0
  13. package/kernel/vault/sweeper.js +480 -210
  14. package/kernel/vault/walker.js +142 -0
  15. package/package.json +1 -1
  16. package/server/index.js +79 -90
  17. package/server/lib/privacy_filter_cache.js +4 -1
  18. package/server/public/storage-size.js +12 -0
  19. package/server/public/style.css +13 -0
  20. package/server/public/tab-link-popover.js +3 -0
  21. package/server/public/vault-nav.js +96 -0
  22. package/server/public/vault.css +1079 -0
  23. package/server/public/vault.js +1835 -0
  24. package/server/views/app.ejs +93 -16
  25. package/server/views/connect/huggingface.ejs +7 -9
  26. package/server/views/partials/main_sidebar.ejs +6 -1
  27. package/server/views/partials/vault_workspace.ejs +55 -0
  28. package/server/views/vault.ejs +5 -1532
  29. package/server/views/vault_app.ejs +22 -0
  30. package/test/hf-api.test.js +4 -2
  31. package/test/huggingface-connect.test.js +7 -11
  32. package/test/huggingface-token-validity.test.js +135 -0
  33. package/test/plugin-action-functions.test.js +19 -0
  34. package/test/privacy-filter-cache.test.js +1 -0
  35. package/test/vault-engine.test.js +1276 -26
  36. package/test/vault-sweep.test.js +1043 -35
  37. package/test/vault-ui.test.js +2184 -65
@@ -0,0 +1,1079 @@
1
+ .vault-page {
2
+ --vault-warning: #b06a09;
3
+ --vault-warning-soft: color-mix(in srgb, var(--vault-warning) 8%, var(--task-panel));
4
+ --vault-selected: color-mix(in srgb, var(--task-accent) 10%, var(--task-panel));
5
+ --vault-inline: 18px;
6
+ --vault-control-height: 28px;
7
+ --vault-row-height: 44px;
8
+ --vault-tree-row: 26px;
9
+ --vault-tree-path-row: 34px;
10
+ }
11
+ body.dark.vault-page {
12
+ --vault-warning: #dca451;
13
+ --vault-warning-soft: color-mix(in srgb, var(--vault-warning) 8%, var(--task-panel));
14
+ --vault-selected: color-mix(in srgb, var(--task-accent) 9%, var(--task-panel));
15
+ }
16
+ .vault-shell,
17
+ .vault-shell * { box-sizing: border-box; }
18
+ .vault-embed-page {
19
+ width: 100%;
20
+ height: 100vh;
21
+ margin: 0;
22
+ overflow: hidden;
23
+ }
24
+ .vault-embed-main {
25
+ display: flex;
26
+ width: 100%;
27
+ height: 100%;
28
+ min-width: 0;
29
+ min-height: 0;
30
+ overflow: hidden;
31
+ }
32
+ .vault-embed-main .vault-shell { width: 100%; }
33
+ body.vault-page .task-container {
34
+ display: flex;
35
+ min-height: 0;
36
+ overflow: hidden;
37
+ }
38
+ .vault-shell {
39
+ display: flex;
40
+ min-height: 0;
41
+ flex: 1 1 auto;
42
+ flex-direction: column;
43
+ }
44
+ .vault-shell .task-shell-body {
45
+ display: block;
46
+ min-height: 0;
47
+ flex: 1 1 auto;
48
+ overflow: hidden;
49
+ padding: 0;
50
+ }
51
+ .vault-body {
52
+ display: flex;
53
+ height: 100%;
54
+ min-width: 0;
55
+ min-height: 0;
56
+ flex-direction: column;
57
+ color: var(--task-text);
58
+ }
59
+ .vault-overview {
60
+ display: flex;
61
+ align-items: center;
62
+ gap: 10px;
63
+ padding: 7px var(--vault-inline);
64
+ border-bottom: 1px solid var(--task-border);
65
+ }
66
+ .vault-metrics {
67
+ display: flex;
68
+ flex: 1;
69
+ min-width: 0;
70
+ align-items: stretch;
71
+ }
72
+ body[data-vault-mode="global"] .vault-overview,
73
+ body[data-vault-mode="app"] .vault-overview {
74
+ min-height: 104px;
75
+ padding-top: 10px;
76
+ padding-bottom: 10px;
77
+ }
78
+ .vault-metrics.summary {
79
+ display: grid;
80
+ grid-template-columns: minmax(430px, 620px) minmax(230px, 1fr);
81
+ align-items: center;
82
+ gap: 28px;
83
+ }
84
+ .vault-summary-main { min-width: 0; }
85
+ .vault-summary-label {
86
+ display: flex;
87
+ align-items: center;
88
+ gap: 7px;
89
+ color: var(--task-muted);
90
+ font-size: 11px;
91
+ font-weight: 600;
92
+ line-height: 1.2;
93
+ }
94
+ .vault-summary-label i { width: 13px; color: var(--task-text); text-align: center; }
95
+ .vault-summary-value {
96
+ margin-top: 2px;
97
+ color: var(--task-text);
98
+ font-size: 20px;
99
+ font-weight: 680;
100
+ letter-spacing: -.025em;
101
+ line-height: 1.15;
102
+ }
103
+ .vault-comparison {
104
+ display: grid;
105
+ max-width: 540px;
106
+ gap: 4px;
107
+ margin-top: 7px;
108
+ }
109
+ .vault-compare-row {
110
+ display: grid;
111
+ grid-template-columns: 54px minmax(180px, 1fr) 68px;
112
+ align-items: center;
113
+ gap: 9px;
114
+ min-width: 0;
115
+ }
116
+ .vault-compare-label,
117
+ .vault-compare-value {
118
+ color: var(--task-muted);
119
+ font-size: 10px;
120
+ line-height: 1;
121
+ white-space: nowrap;
122
+ }
123
+ .vault-compare-label { display: inline-flex; align-items: center; gap: 5px; }
124
+ .vault-compare-info {
125
+ position: relative;
126
+ display: inline-flex;
127
+ align-items: center;
128
+ justify-content: center;
129
+ width: 14px;
130
+ height: 14px;
131
+ padding: 0;
132
+ border: 0;
133
+ background: transparent;
134
+ color: var(--task-muted);
135
+ font-size: 9px;
136
+ cursor: help;
137
+ }
138
+ .vault-compare-info:focus-visible {
139
+ outline: 2px solid color-mix(in srgb, var(--task-accent) 55%, transparent);
140
+ outline-offset: 1px;
141
+ border-radius: 50%;
142
+ }
143
+ .vault-compare-tooltip {
144
+ position: fixed;
145
+ z-index: 30;
146
+ width: 220px;
147
+ max-width: calc(100vw - 16px);
148
+ padding: 7px 9px;
149
+ border: 1px solid var(--task-border-strong);
150
+ border-radius: 6px;
151
+ background: var(--task-panel);
152
+ box-shadow: 0 6px 18px color-mix(in srgb, var(--task-text) 10%, transparent);
153
+ color: var(--task-text);
154
+ font-size: 10.5px;
155
+ font-weight: 400;
156
+ line-height: 1.4;
157
+ pointer-events: none;
158
+ transform: translateX(-50%);
159
+ white-space: normal;
160
+ }
161
+ .vault-compare-value { font-variant-numeric: tabular-nums; text-align: right; }
162
+ .vault-compare-track {
163
+ position: relative;
164
+ display: block;
165
+ height: 6px;
166
+ overflow: hidden;
167
+ border-radius: 999px;
168
+ background: var(--task-soft);
169
+ }
170
+ .vault-compare-fill {
171
+ position: absolute;
172
+ inset: 0 auto 0 0;
173
+ display: block;
174
+ border-radius: inherit;
175
+ }
176
+ .vault-compare-fill.before {
177
+ width: 100%;
178
+ background: color-mix(in srgb, var(--task-muted) 40%, var(--task-soft));
179
+ }
180
+ .vault-compare-fill.after {
181
+ width: var(--vault-after-ratio);
182
+ background: var(--task-accent);
183
+ }
184
+ .vault-summary-side {
185
+ display: flex;
186
+ min-width: 0;
187
+ align-items: center;
188
+ justify-content: flex-end;
189
+ gap: 10px;
190
+ color: var(--task-muted);
191
+ font-size: 11px;
192
+ white-space: nowrap;
193
+ }
194
+ .vault-summary-state { display: inline-flex; align-items: center; gap: 7px; color: var(--task-text); }
195
+ .vault-summary-state i { width: 12px; color: var(--task-muted); text-align: center; }
196
+ .vault-summary-state.attention i,
197
+ .vault-summary-state.attention strong { color: var(--task-accent); }
198
+ .vault-summary-divider { width: 1px; height: 18px; flex: 0 0 1px; background: var(--task-border); }
199
+ .vault-summary-freshness { font-variant-numeric: tabular-nums; }
200
+ .vault-overview-actions {
201
+ display: flex;
202
+ align-items: center;
203
+ justify-content: flex-end;
204
+ gap: 8px;
205
+ flex: 0 0 auto;
206
+ }
207
+ .vault-candidate-size {
208
+ display: inline-flex;
209
+ min-height: var(--vault-control-height);
210
+ align-items: center;
211
+ overflow: hidden;
212
+ border: 1px solid var(--task-border-strong);
213
+ border-radius: 7px;
214
+ background: color-mix(in srgb, var(--task-panel) 94%, var(--task-soft));
215
+ color: var(--task-muted);
216
+ font-size: 11px;
217
+ line-height: 1;
218
+ white-space: nowrap;
219
+ }
220
+ .vault-candidate-size > span { padding-left: 10px; }
221
+ .vault-candidate-size select {
222
+ height: calc(var(--vault-control-height) - 2px);
223
+ max-width: 142px;
224
+ padding: 0 24px 0 6px;
225
+ border: 0;
226
+ outline: 0;
227
+ background: transparent;
228
+ color: var(--task-text);
229
+ font: inherit;
230
+ font-weight: 600;
231
+ cursor: pointer;
232
+ }
233
+ .vault-candidate-size:focus-within {
234
+ border-color: color-mix(in srgb, var(--task-accent) 55%, var(--task-border-strong));
235
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--task-accent) 14%, transparent);
236
+ }
237
+ .vault-candidate-size select:disabled { cursor: default; opacity: .55; }
238
+ .vault-button,
239
+ .vault-icon-button,
240
+ .vault-text-button {
241
+ appearance: none;
242
+ border: 1px solid var(--task-border-strong);
243
+ background: color-mix(in srgb, var(--task-panel) 94%, var(--task-soft));
244
+ color: var(--task-text);
245
+ font: inherit;
246
+ cursor: pointer;
247
+ }
248
+ .vault-button {
249
+ display: inline-flex;
250
+ min-height: var(--vault-control-height);
251
+ align-items: center;
252
+ justify-content: center;
253
+ gap: 7px;
254
+ padding: 6px 12px;
255
+ border-radius: 7px;
256
+ font-size: 12px;
257
+ line-height: 1;
258
+ white-space: nowrap;
259
+ }
260
+ .vault-button:hover { background: var(--task-soft); }
261
+ .vault-button.primary {
262
+ border-color: var(--task-accent-surface);
263
+ background: var(--task-accent-surface);
264
+ color: var(--task-accent-contrast);
265
+ }
266
+ .vault-button.primary:hover { background: var(--task-accent-hover); }
267
+ .vault-button.review-primary {
268
+ border-color: var(--task-accent-contrast);
269
+ background: var(--task-accent-contrast);
270
+ color: #101828;
271
+ font-weight: 650;
272
+ }
273
+ .vault-button.review-primary:hover {
274
+ border-color: color-mix(in srgb, var(--task-accent-contrast) 88%, var(--task-panel));
275
+ background: color-mix(in srgb, var(--task-accent-contrast) 88%, var(--task-panel));
276
+ color: #101828;
277
+ }
278
+ .vault-button:disabled { opacity: .5; cursor: default; }
279
+ .vault-icon-button {
280
+ width: var(--vault-control-height);
281
+ height: var(--vault-control-height);
282
+ display: inline-flex;
283
+ align-items: center;
284
+ justify-content: center;
285
+ padding: 0;
286
+ border-radius: 7px;
287
+ font-size: 12px;
288
+ }
289
+ .vault-icon-button:hover { background: var(--task-soft); }
290
+ .vault-advanced { position: relative; }
291
+ .vault-advanced > summary { list-style: none; cursor: pointer; }
292
+ .vault-advanced > summary::-webkit-details-marker { display: none; }
293
+ .vault-advanced-menu {
294
+ position: absolute;
295
+ z-index: 20;
296
+ top: calc(100% + 6px);
297
+ right: 0;
298
+ width: 272px;
299
+ box-sizing: border-box;
300
+ padding: 12px;
301
+ border: 1px solid var(--task-border-strong);
302
+ border-radius: 9px;
303
+ background: var(--task-panel);
304
+ box-shadow: 0 12px 30px color-mix(in srgb, var(--task-text) 10%, transparent);
305
+ }
306
+ .vault-advanced-title { color: var(--task-text); font-size: 12.5px; font-weight: 650; }
307
+ .vault-advanced-copy { margin: 4px 0 10px; color: var(--task-muted); font-size: 11px; line-height: 1.45; }
308
+ .vault-advanced-divider { height: 1px; margin: 11px -12px; background: var(--task-border); }
309
+ .vault-storage-list { display: grid; gap: 7px; margin: 8px 0 0; }
310
+ .vault-storage-list > div { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }
311
+ .vault-storage-list dt { min-width: 0; color: var(--task-muted); font-size: 11px; }
312
+ .vault-storage-list dd { margin: 0; color: var(--task-text); font-size: 11px; font-variant-numeric: tabular-nums; white-space: nowrap; }
313
+ .vault-button:focus-visible,
314
+ .vault-icon-button:focus-visible,
315
+ .vault-text-button:focus-visible,
316
+ .vault-sharing-switch:focus-visible,
317
+ .vault-rail-add:focus-visible,
318
+ .vault-source-remove:focus-visible,
319
+ .vault-result-toggle:focus-visible,
320
+ .vault-nav-row:focus-visible,
321
+ .vault-sort-button:focus-visible,
322
+ .vault-display-mode button:focus-visible,
323
+ .vault-search input:focus-visible,
324
+ .vault-select:focus-visible {
325
+ outline: 2px solid color-mix(in srgb, var(--task-accent) 55%, transparent);
326
+ outline-offset: 2px;
327
+ }
328
+ .vault-scan-state,
329
+ .vault-result,
330
+ .vault-feedback,
331
+ .vault-cloud-warning {
332
+ display: none;
333
+ align-items: center;
334
+ min-height: 38px;
335
+ gap: 9px;
336
+ padding: 6px var(--vault-inline);
337
+ border-bottom: 1px solid var(--task-border);
338
+ font-size: 12.5px;
339
+ }
340
+ .vault-scan-state {
341
+ position: relative;
342
+ overflow: hidden;
343
+ }
344
+ .vault-scan-state.show,
345
+ .vault-result.show,
346
+ .vault-feedback.show,
347
+ .vault-cloud-warning.show { display: flex; }
348
+ .vault-scan-state i,
349
+ .vault-result > i { color: var(--task-accent); }
350
+ .vault-result strong { font-weight: 650; }
351
+ .vault-result-detail,
352
+ .vault-scan-detail { color: var(--task-muted); }
353
+ .vault-result.incomplete {
354
+ display: block;
355
+ flex: 0 0 auto;
356
+ min-height: 40px;
357
+ padding: 0 var(--vault-inline);
358
+ background: var(--vault-warning-soft);
359
+ }
360
+ .vault-result-message {
361
+ display: grid;
362
+ min-height: 40px;
363
+ grid-template-columns: 16px minmax(0, 1fr) auto;
364
+ align-items: center;
365
+ gap: 9px;
366
+ }
367
+ .vault-result-message > i {
368
+ color: var(--vault-warning);
369
+ }
370
+ .vault-result-actions {
371
+ display: flex;
372
+ align-items: center;
373
+ gap: 10px;
374
+ }
375
+ .vault-result-heading {
376
+ display: flex;
377
+ min-width: 0;
378
+ align-items: baseline;
379
+ gap: 8px;
380
+ }
381
+ .vault-result-heading strong {
382
+ flex: 0 0 auto;
383
+ white-space: nowrap;
384
+ }
385
+ .vault-result-heading > span {
386
+ min-width: 0;
387
+ color: var(--task-muted);
388
+ }
389
+ .vault-result-toggle {
390
+ appearance: none;
391
+ display: inline-flex;
392
+ flex: 0 0 auto;
393
+ align-items: center;
394
+ gap: 6px;
395
+ padding: 4px 0;
396
+ border: 0;
397
+ border-radius: 4px;
398
+ background: transparent;
399
+ color: var(--task-text);
400
+ cursor: pointer;
401
+ font: inherit;
402
+ font-size: 11.5px;
403
+ font-weight: 600;
404
+ white-space: nowrap;
405
+ }
406
+ .vault-result-toggle:hover { color: var(--task-accent); }
407
+ .vault-result-toggle i {
408
+ font-size: 9px;
409
+ transition: transform 180ms cubic-bezier(.22, 1, .36, 1);
410
+ }
411
+ .vault-result.expanded .vault-result-toggle i { transform: rotate(180deg); }
412
+ .vault-result-paths {
413
+ display: grid;
414
+ max-height: 144px;
415
+ gap: 5px;
416
+ margin: 0 0 10px 25px;
417
+ padding: 8px 10px;
418
+ overflow-y: auto;
419
+ border: 1px solid var(--task-border);
420
+ border-radius: 6px;
421
+ background: var(--task-panel);
422
+ }
423
+ .vault-result-paths[hidden] { display: none; }
424
+ .vault-result-path {
425
+ display: grid;
426
+ grid-template-columns: 5px minmax(0, 1fr);
427
+ align-items: start;
428
+ gap: 9px;
429
+ color: var(--task-muted);
430
+ font-size: 11.5px;
431
+ line-height: 1.35;
432
+ }
433
+ .vault-result-path-dot {
434
+ width: 4px;
435
+ height: 4px;
436
+ margin-top: 5px;
437
+ border-radius: 50%;
438
+ background: var(--task-muted);
439
+ }
440
+ .vault-result-path span {
441
+ min-width: 0;
442
+ overflow-wrap: anywhere;
443
+ white-space: normal;
444
+ }
445
+ .vault-scan-detail {
446
+ min-width: 0;
447
+ overflow: hidden;
448
+ text-overflow: ellipsis;
449
+ white-space: nowrap;
450
+ }
451
+ .vault-scan-percent {
452
+ flex: 0 0 auto;
453
+ margin-left: auto;
454
+ color: var(--task-muted);
455
+ font-size: 11.5px;
456
+ font-variant-numeric: tabular-nums;
457
+ font-weight: 650;
458
+ }
459
+ .vault-progress-track {
460
+ position: absolute;
461
+ right: 0;
462
+ bottom: 0;
463
+ left: 0;
464
+ height: 4px;
465
+ overflow: hidden;
466
+ background: color-mix(in srgb, var(--task-accent) 12%, transparent);
467
+ }
468
+ .vault-progress-bar {
469
+ display: block;
470
+ width: 100%;
471
+ height: 100%;
472
+ background: var(--task-accent);
473
+ transform-origin: left center;
474
+ }
475
+ .vault-progress-bar.determinate {
476
+ transform: scaleX(var(--vault-progress, 0));
477
+ transition: transform 320ms cubic-bezier(.22, 1, .36, 1);
478
+ }
479
+ .vault-progress-bar.indeterminate {
480
+ width: 28%;
481
+ animation: vault-progress-discovery 1.15s ease-in-out infinite;
482
+ }
483
+ @keyframes vault-progress-discovery {
484
+ from { transform: translateX(-110%); }
485
+ to { transform: translateX(370%); }
486
+ }
487
+ .vault-result .vault-button { min-height: 28px; margin-left: auto; padding: 4px 10px; }
488
+ .vault-feedback { min-height: 34px; background: var(--task-soft); }
489
+ .vault-feedback.error { color: var(--vault-warning); }
490
+ .vault-cloud-warning { min-height: 34px; background: var(--vault-warning-soft); }
491
+ .vault-cloud-warning > i { color: var(--vault-warning); }
492
+ .vault-cloud-warning .vault-text-button { margin-left: auto; }
493
+ .vault-explorer {
494
+ display: grid;
495
+ min-height: 0;
496
+ flex: 1 1 auto;
497
+ grid-template-columns: 248px minmax(0, 1fr);
498
+ overflow: hidden;
499
+ }
500
+ .vault-rail {
501
+ min-width: 0;
502
+ min-height: 0;
503
+ border-right: 1px solid var(--task-border);
504
+ background: color-mix(in srgb, var(--task-panel) 96%, var(--task-soft));
505
+ overflow-x: hidden;
506
+ overflow-y: auto;
507
+ overscroll-behavior: contain;
508
+ }
509
+ .vault-rail-section {
510
+ display: block;
511
+ min-height: 0;
512
+ padding: 12px 9px;
513
+ }
514
+ .vault-rail-section + .vault-rail-section { border-top: 1px solid var(--task-border); }
515
+ .vault-rail-label {
516
+ margin: 0 7px 6px;
517
+ color: var(--task-muted);
518
+ font-size: 10.5px;
519
+ font-weight: 700;
520
+ letter-spacing: .08em;
521
+ }
522
+ .vault-rail-heading {
523
+ display: flex;
524
+ height: 20px;
525
+ align-items: center;
526
+ margin: 0 5px 4px 7px;
527
+ }
528
+ .vault-rail-heading .vault-rail-label { flex: 1 1 auto; margin: 0; }
529
+ .vault-rail-add {
530
+ width: 20px;
531
+ height: 20px;
532
+ display: inline-flex;
533
+ flex: 0 0 20px;
534
+ align-items: center;
535
+ justify-content: center;
536
+ padding: 0;
537
+ border: 0;
538
+ border-radius: 5px;
539
+ background: transparent;
540
+ color: var(--task-muted);
541
+ cursor: pointer;
542
+ font: inherit;
543
+ font-size: 10px;
544
+ }
545
+ .vault-rail-add:hover { background: var(--task-soft); color: var(--task-text); }
546
+ .vault-rail-add:disabled { opacity: .45; cursor: default; }
547
+ .vault-nav-list { display: grid; gap: 0; }
548
+ .vault-nav-row {
549
+ width: 100%;
550
+ min-width: 0;
551
+ height: var(--vault-tree-row);
552
+ min-height: var(--vault-tree-row);
553
+ max-height: var(--vault-tree-row);
554
+ display: grid;
555
+ grid-template-columns: 18px minmax(0, 1fr) auto;
556
+ align-items: center;
557
+ gap: 6px;
558
+ padding: 2px 6px;
559
+ border: 1px solid transparent;
560
+ border-radius: 7px;
561
+ background: transparent;
562
+ color: var(--task-text);
563
+ text-align: left;
564
+ font: inherit;
565
+ cursor: pointer;
566
+ }
567
+ .vault-nav-row:hover { background: var(--task-soft); }
568
+ .vault-nav-row.selected {
569
+ border-color: color-mix(in srgb, var(--task-accent) 72%, var(--task-border-strong));
570
+ background: var(--vault-selected);
571
+ }
572
+ .vault-nav-row > i { width: 15px; color: var(--task-muted); text-align: center; font-size: 11.5px; }
573
+ .vault-nav-copy { min-width: 0; }
574
+ .vault-nav-name {
575
+ display: block;
576
+ overflow: hidden;
577
+ font-size: 11.75px;
578
+ font-weight: 520;
579
+ line-height: 1.25;
580
+ text-overflow: ellipsis;
581
+ white-space: nowrap;
582
+ }
583
+ .vault-nav-path {
584
+ display: block;
585
+ overflow: hidden;
586
+ margin-top: 1px;
587
+ color: var(--task-muted);
588
+ font-size: 10px;
589
+ line-height: 1.25;
590
+ text-overflow: ellipsis;
591
+ white-space: nowrap;
592
+ }
593
+ .vault-nav-count {
594
+ color: var(--task-muted);
595
+ font-size: 11px;
596
+ font-variant-numeric: tabular-nums;
597
+ }
598
+ .vault-nav-count.attention { color: var(--vault-warning); font-weight: 650; }
599
+ #vault-locations {
600
+ display: flex;
601
+ min-height: 0;
602
+ flex-direction: column;
603
+ align-items: stretch;
604
+ justify-content: flex-start;
605
+ gap: 0;
606
+ }
607
+ .vault-source-line {
608
+ display: grid;
609
+ flex: 0 0 auto;
610
+ height: var(--vault-tree-row);
611
+ min-height: var(--vault-tree-row);
612
+ max-height: var(--vault-tree-row);
613
+ grid-template-columns: 18px minmax(0, 1fr);
614
+ align-items: start;
615
+ align-self: stretch;
616
+ margin: 0;
617
+ }
618
+ .vault-source-line.has-path {
619
+ height: var(--vault-tree-path-row);
620
+ min-height: var(--vault-tree-path-row);
621
+ max-height: var(--vault-tree-path-row);
622
+ }
623
+ .vault-source-line.depth-1 { padding-left: 12px; }
624
+ .vault-source-line.depth-2 { padding-left: 24px; }
625
+ .vault-source-line.removable { grid-template-columns: 18px minmax(0, 1fr) 20px; }
626
+ .vault-source-toggle {
627
+ width: 18px;
628
+ height: 100%;
629
+ padding: 0;
630
+ border: 0;
631
+ background: transparent;
632
+ color: var(--task-muted);
633
+ cursor: pointer;
634
+ font-size: 10px;
635
+ }
636
+ .vault-source-toggle.placeholder { cursor: default; }
637
+ .vault-source-remove {
638
+ width: 20px;
639
+ height: 100%;
640
+ padding: 0;
641
+ border: 0;
642
+ border-radius: 5px;
643
+ background: transparent;
644
+ color: var(--task-muted);
645
+ cursor: pointer;
646
+ font-size: 10px;
647
+ }
648
+ .vault-source-remove:hover { background: var(--task-soft); color: var(--task-text); }
649
+ .vault-source-remove:disabled { opacity: .45; cursor: default; }
650
+ .vault-source-line .vault-nav-row { grid-template-columns: 18px minmax(0, 1fr) auto; }
651
+ .vault-source-line.has-path .vault-nav-row {
652
+ height: var(--vault-tree-path-row);
653
+ min-height: var(--vault-tree-path-row);
654
+ max-height: var(--vault-tree-path-row);
655
+ }
656
+ .vault-rail-footer { padding: 0 16px 12px; }
657
+ .vault-text-button {
658
+ padding: 2px 0;
659
+ border: 0;
660
+ background: transparent;
661
+ color: var(--task-muted);
662
+ font-size: 11.5px;
663
+ }
664
+ .vault-text-button:hover { color: var(--task-text); }
665
+ .vault-pane {
666
+ display: grid;
667
+ min-width: 0;
668
+ min-height: 0;
669
+ grid-template-rows: auto minmax(0, 1fr) auto;
670
+ overflow: hidden;
671
+ }
672
+ .vault-pane-action-note { color: var(--task-muted); font-size: 11.5px; white-space: nowrap; }
673
+ .vault-toolbar {
674
+ display: flex;
675
+ align-items: center;
676
+ gap: 8px;
677
+ min-height: 44px;
678
+ padding: 6px var(--vault-inline);
679
+ border-bottom: 1px solid var(--task-border);
680
+ }
681
+ .vault-search { position: relative; width: min(320px, 55%); }
682
+ .vault-search i {
683
+ position: absolute;
684
+ top: 50%;
685
+ left: 10px;
686
+ color: var(--task-muted);
687
+ font-size: 12px;
688
+ transform: translateY(-50%);
689
+ pointer-events: none;
690
+ }
691
+ .vault-search input,
692
+ .vault-select {
693
+ height: 30px;
694
+ box-sizing: border-box;
695
+ border: 1px solid var(--task-border-strong);
696
+ border-radius: 7px;
697
+ background: var(--task-panel);
698
+ color: var(--task-text);
699
+ font: inherit;
700
+ font-size: 12px;
701
+ }
702
+ .vault-search input { width: 100%; padding: 5px 10px 5px 30px; }
703
+ .vault-search input::placeholder { color: var(--task-muted); }
704
+ .vault-select { padding: 4px 28px 4px 9px; }
705
+ .vault-display-mode {
706
+ display: inline-flex;
707
+ height: 30px;
708
+ flex: 0 0 auto;
709
+ overflow: hidden;
710
+ border: 1px solid var(--task-border-strong);
711
+ border-radius: 7px;
712
+ background: var(--task-panel);
713
+ }
714
+ .vault-display-mode button {
715
+ min-width: 58px;
716
+ padding: 0 10px;
717
+ border: 0;
718
+ background: transparent;
719
+ color: var(--task-muted);
720
+ font: inherit;
721
+ font-size: 11.5px;
722
+ cursor: pointer;
723
+ }
724
+ .vault-display-mode button + button { border-left: 1px solid var(--task-border); }
725
+ .vault-display-mode button:hover { color: var(--task-text); }
726
+ .vault-display-mode button.selected {
727
+ background: var(--task-soft);
728
+ color: var(--task-text);
729
+ font-weight: 600;
730
+ }
731
+ .vault-display-mode button:focus-visible { outline-offset: -2px; }
732
+ .vault-toolbar-count { margin-left: auto; color: var(--task-muted); font-size: 11.5px; white-space: nowrap; }
733
+ .vault-toolbar-action { flex: 0 0 auto; }
734
+ .vault-table { min-width: 660px; }
735
+ .vault-table-wrap {
736
+ min-height: 0;
737
+ overflow: auto;
738
+ overscroll-behavior: contain;
739
+ }
740
+ .vault-columns,
741
+ .vault-file-row,
742
+ .vault-group-row {
743
+ display: grid;
744
+ grid-template-columns: minmax(220px, 1.6fr) minmax(64px, .4fr) minmax(118px, .8fr) minmax(96px, .6fr) minmax(76px, auto);
745
+ align-items: center;
746
+ column-gap: 10px;
747
+ }
748
+ .vault-table.inventory .vault-columns,
749
+ .vault-table.inventory .vault-file-row,
750
+ .vault-table.inventory .vault-group-row {
751
+ grid-template-columns: minmax(260px, 1.7fr) minmax(72px, .4fr) minmax(240px, 1fr);
752
+ }
753
+ .vault-table.inventory .vault-group-main { grid-column: 1 / 3; }
754
+ .vault-table.inventory .vault-group-action { grid-column: 3; }
755
+ .vault-table.flat .vault-columns,
756
+ .vault-table.flat .vault-file-row {
757
+ grid-template-columns: minmax(180px, .85fr) minmax(360px, 1.8fr) minmax(72px, .38fr) minmax(220px, 1fr);
758
+ }
759
+ .vault-table.matches .vault-columns,
760
+ .vault-table.matches .vault-file-row,
761
+ .vault-table.matches .vault-group-row {
762
+ grid-template-columns: minmax(210px, 1.5fr) minmax(64px, .4fr) minmax(140px, 1fr) minmax(96px, .55fr) minmax(76px, auto);
763
+ }
764
+ .vault-table.activity .vault-columns,
765
+ .vault-table.activity .vault-file-row {
766
+ grid-template-columns: minmax(260px, 1.6fr) minmax(72px, .4fr) minmax(140px, .8fr) minmax(76px, auto);
767
+ }
768
+ .vault-table.reclaimable .vault-columns,
769
+ .vault-table.reclaimable .vault-file-row {
770
+ grid-template-columns: minmax(260px, 1.6fr) minmax(72px, .4fr) minmax(110px, .6fr) minmax(76px, auto);
771
+ }
772
+ .vault-columns {
773
+ min-height: 34px;
774
+ padding: 0 var(--vault-inline);
775
+ border-bottom: 1px solid var(--task-border);
776
+ color: var(--task-muted);
777
+ font-size: 10.5px;
778
+ font-weight: 600;
779
+ }
780
+ .vault-sort-column { align-self: stretch; }
781
+ .vault-sort-button {
782
+ display: inline-flex;
783
+ height: 100%;
784
+ align-items: center;
785
+ gap: 5px;
786
+ padding: 0;
787
+ border: 0;
788
+ background: transparent;
789
+ color: inherit;
790
+ font: inherit;
791
+ cursor: pointer;
792
+ }
793
+ .vault-sort-button i { width: 10px; font-size: 9px; opacity: .55; }
794
+ .vault-sort-button:hover,
795
+ .vault-sort-button.active { color: var(--task-text); }
796
+ .vault-sort-button:hover i,
797
+ .vault-sort-button.active i { opacity: 1; }
798
+ .vault-file-row {
799
+ min-height: var(--vault-row-height);
800
+ padding: 6px var(--vault-inline);
801
+ border-bottom: 1px solid var(--task-border);
802
+ font-size: 12px;
803
+ }
804
+ .vault-file-row:hover { background: color-mix(in srgb, var(--task-soft) 64%, transparent); }
805
+ .vault-file-row.directory { min-height: 38px; padding-top: 4px; padding-bottom: 4px; background: color-mix(in srgb, var(--task-soft) 38%, transparent); }
806
+ .vault-group-row {
807
+ min-height: 48px;
808
+ padding: 6px var(--vault-inline);
809
+ border-bottom: 1px solid var(--task-border-strong);
810
+ background: color-mix(in srgb, var(--task-soft) 56%, transparent);
811
+ }
812
+ .vault-group-main { min-width: 0; }
813
+ .vault-group-title {
814
+ display: flex;
815
+ min-width: 0;
816
+ align-items: center;
817
+ gap: 8px;
818
+ color: var(--task-text);
819
+ font-size: 12.5px;
820
+ font-weight: 600;
821
+ }
822
+ .vault-group-title span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
823
+ .vault-group-meta { margin: 2px 0 0 23px; color: var(--task-muted); font-size: 10px; }
824
+ .vault-group-action { grid-column: 5; justify-self: end; }
825
+ .vault-group-action .vault-button { min-height: 28px; padding: 4px 9px; }
826
+ .vault-deduplicate-button {
827
+ position: relative;
828
+ min-width: 142px;
829
+ overflow: hidden;
830
+ }
831
+ .vault-deduplicate-button:disabled { opacity: 1; }
832
+ .vault-deduplicate-progress {
833
+ position: absolute;
834
+ right: 0;
835
+ bottom: 0;
836
+ left: 0;
837
+ height: 3px;
838
+ background: color-mix(in srgb, currentColor 22%, transparent);
839
+ }
840
+ .vault-deduplicate-progress > span {
841
+ display: block;
842
+ width: var(--vault-deduplicate-progress);
843
+ height: 100%;
844
+ background: currentColor;
845
+ transition: width 120ms linear;
846
+ }
847
+ .vault-name-cell { display: flex; min-width: 0; align-items: center; gap: 8px; }
848
+ .vault-name-cell.indent-1 { padding-left: 18px; }
849
+ .vault-name-cell.indent-2 { padding-left: 36px; }
850
+ .vault-name-icon { width: 16px; flex: 0 0 16px; color: var(--task-muted); text-align: center; }
851
+ .vault-disclosure {
852
+ width: 16px;
853
+ height: 24px;
854
+ flex: 0 0 16px;
855
+ padding: 0;
856
+ border: 0;
857
+ background: transparent;
858
+ color: var(--task-muted);
859
+ cursor: pointer;
860
+ font-size: 10px;
861
+ }
862
+ .vault-name-copy { min-width: 0; }
863
+ .vault-file-name {
864
+ display: block;
865
+ overflow: hidden;
866
+ color: var(--task-text);
867
+ font-size: 12px;
868
+ font-weight: 520;
869
+ line-height: 1.3;
870
+ text-overflow: ellipsis;
871
+ white-space: nowrap;
872
+ }
873
+ .vault-file-path {
874
+ display: block;
875
+ overflow: hidden;
876
+ color: var(--task-muted);
877
+ font-size: 10.5px;
878
+ line-height: 1.3;
879
+ text-overflow: ellipsis;
880
+ white-space: nowrap;
881
+ }
882
+ .vault-flat-location {
883
+ min-width: 0;
884
+ color: var(--task-muted);
885
+ font-size: 10.5px;
886
+ line-height: 1.35;
887
+ overflow-wrap: anywhere;
888
+ white-space: normal;
889
+ word-break: break-word;
890
+ }
891
+ .vault-match-path {
892
+ display: block;
893
+ min-width: 0;
894
+ color: var(--task-muted);
895
+ font-size: 10.5px;
896
+ line-height: 1.35;
897
+ overflow-wrap: anywhere;
898
+ white-space: normal;
899
+ word-break: break-word;
900
+ }
901
+ .vault-size,
902
+ .vault-space { color: var(--task-muted); font-variant-numeric: tabular-nums; white-space: nowrap; }
903
+ .vault-status { display: inline-flex; min-width: 0; align-items: center; gap: 7px; color: var(--task-text); }
904
+ .vault-status-dot { width: 6px; height: 6px; flex: 0 0 6px; border-radius: 50%; background: var(--task-muted); }
905
+ .vault-status-dot.warning { background: var(--vault-warning); }
906
+ .vault-status i { width: 12px; color: var(--task-muted); text-align: center; }
907
+ .vault-status-cell {
908
+ display: flex;
909
+ min-width: 0;
910
+ align-items: center;
911
+ justify-content: space-between;
912
+ gap: 12px;
913
+ }
914
+ .vault-status-cell.busy { justify-content: stretch; }
915
+ .vault-file-action-queued {
916
+ display: inline-flex;
917
+ flex: 0 0 auto;
918
+ align-items: center;
919
+ gap: 5px;
920
+ color: var(--task-muted);
921
+ font-size: 10px;
922
+ font-weight: 600;
923
+ white-space: nowrap;
924
+ }
925
+ .vault-file-action-queued i { width: 11px; text-align: center; }
926
+ .vault-file-action-progress {
927
+ display: grid;
928
+ width: min(100%, 300px);
929
+ gap: 4px;
930
+ }
931
+ .vault-file-action-head {
932
+ display: flex;
933
+ align-items: baseline;
934
+ justify-content: space-between;
935
+ gap: 10px;
936
+ color: var(--task-muted);
937
+ font-size: 10px;
938
+ font-variant-numeric: tabular-nums;
939
+ }
940
+ .vault-file-action-head strong { color: var(--task-text); font-weight: 600; }
941
+ .vault-file-action-track {
942
+ display: block;
943
+ height: 3px;
944
+ overflow: hidden;
945
+ border-radius: 999px;
946
+ background: var(--task-soft);
947
+ }
948
+ .vault-file-action-track > span {
949
+ display: block;
950
+ width: var(--vault-file-action-progress);
951
+ height: 100%;
952
+ border-radius: inherit;
953
+ background: var(--task-accent);
954
+ transition: width 120ms linear;
955
+ }
956
+ .vault-status-cell > .vault-text-button { flex: 0 0 auto; }
957
+ .vault-sharing-switch {
958
+ position: relative;
959
+ width: 44px;
960
+ height: 28px;
961
+ flex: 0 0 44px;
962
+ padding: 0;
963
+ border: 0;
964
+ background: transparent;
965
+ cursor: pointer;
966
+ }
967
+ .vault-sharing-switch::before {
968
+ position: absolute;
969
+ top: 5px;
970
+ left: 6px;
971
+ width: 32px;
972
+ height: 18px;
973
+ box-sizing: border-box;
974
+ border: 1px solid var(--task-border-strong);
975
+ border-radius: 999px;
976
+ background: var(--task-soft);
977
+ content: "";
978
+ }
979
+ .vault-sharing-thumb {
980
+ position: absolute;
981
+ z-index: 1;
982
+ top: 8px;
983
+ left: 9px;
984
+ width: 12px;
985
+ height: 12px;
986
+ border-radius: 50%;
987
+ background: var(--task-muted);
988
+ transition: transform 130ms ease-out, background 130ms ease-out;
989
+ }
990
+ .vault-sharing-switch.on::before {
991
+ border-color: var(--task-text);
992
+ background: var(--task-text);
993
+ }
994
+ .vault-sharing-switch.on .vault-sharing-thumb {
995
+ background: var(--task-panel);
996
+ transform: translateX(14px);
997
+ }
998
+ .vault-sharing-switch:hover::before { border-color: var(--task-muted); }
999
+ .vault-sharing-switch.on:hover::before { background: color-mix(in srgb, var(--task-text) 86%, var(--task-panel)); }
1000
+ .vault-sharing-switch:disabled { opacity: .55; cursor: progress; }
1001
+ .vault-row-action { justify-self: end; }
1002
+ .vault-row-action .vault-text-button { color: var(--task-text); font-size: 11.5px; }
1003
+ .vault-detail {
1004
+ padding: 8px var(--vault-inline) 9px 56px;
1005
+ border-bottom: 1px solid var(--task-border);
1006
+ background: color-mix(in srgb, var(--task-soft) 48%, transparent);
1007
+ }
1008
+ .vault-detail-label { margin-bottom: 5px; color: var(--task-muted); font-size: 10px; font-weight: 650; }
1009
+ .vault-location-detail { display: flex; align-items: center; gap: 7px; padding: 2px 0; color: var(--task-text); font-size: 10.5px; }
1010
+ .vault-location-detail i { color: var(--task-muted); }
1011
+ .vault-empty {
1012
+ display: grid;
1013
+ min-height: 190px;
1014
+ place-items: center;
1015
+ padding: 28px;
1016
+ text-align: center;
1017
+ }
1018
+ .vault-empty-inner { max-width: 420px; }
1019
+ .vault-empty i { color: var(--task-muted); font-size: 18px; }
1020
+ .vault-empty h3 { margin: 9px 0 4px; font-size: 14px; }
1021
+ .vault-empty p { margin: 0; color: var(--task-muted); font-size: 12px; line-height: 1.55; }
1022
+ .vault-empty .vault-button { margin-top: 10px; }
1023
+ .vault-pane-footer {
1024
+ padding: 9px var(--vault-inline) 11px;
1025
+ color: var(--task-muted);
1026
+ font-size: 10.5px;
1027
+ }
1028
+ .vault-event-kind { font-weight: 570; }
1029
+ .vault-event-time { color: var(--task-muted); font-size: 10.5px; }
1030
+ .vault-unavailable { color: var(--task-muted); font-size: 11px; }
1031
+ @media (max-width: 1140px) {
1032
+ .vault-overview { align-items: flex-start; flex-direction: column; }
1033
+ .vault-overview-actions { width: 100%; justify-content: flex-start; }
1034
+ .vault-metrics { width: 100%; }
1035
+ .vault-explorer { grid-template-columns: 224px minmax(0, 1fr); }
1036
+ }
1037
+ @media (max-width: 820px) {
1038
+ body.vault-page .task-container { display: block; overflow-y: auto; }
1039
+ .vault-shell,
1040
+ .vault-shell .task-shell-body,
1041
+ .vault-body { height: auto; overflow: visible; }
1042
+ .vault-metrics { width: 100%; overflow-x: auto; }
1043
+ .vault-metrics.summary { grid-template-columns: minmax(0, 1fr); gap: 11px; overflow: visible; }
1044
+ .vault-summary-side { justify-content: flex-start; flex-wrap: wrap; white-space: normal; }
1045
+ .vault-overview-actions { flex-wrap: wrap; }
1046
+ .vault-comparison { max-width: 100%; }
1047
+ .vault-explorer { display: block; overflow: visible; }
1048
+ .vault-rail { max-height: 330px; border-right: 0; border-bottom: 1px solid var(--task-border); }
1049
+ .vault-pane { display: block; overflow: visible; }
1050
+ .vault-table-wrap { overflow-x: auto; overflow-y: visible; }
1051
+ .vault-result-message { grid-template-columns: 16px minmax(0, 1fr); padding: 9px 0; }
1052
+ .vault-result-heading { align-items: flex-start; flex-direction: column; gap: 2px; }
1053
+ .vault-result-actions { grid-column: 2; }
1054
+ .vault-result.incomplete .vault-button { margin: 0; }
1055
+ }
1056
+ @media (pointer: coarse) {
1057
+ .vault-page {
1058
+ --vault-control-height: 44px;
1059
+ --vault-tree-row: 44px;
1060
+ --vault-tree-path-row: 52px;
1061
+ }
1062
+ .vault-button,
1063
+ .vault-result .vault-button,
1064
+ .vault-group-action .vault-button { min-height: 44px; }
1065
+ .vault-icon-button { width: 44px; height: 44px; }
1066
+ .vault-rail-add { width: 44px; height: 44px; flex-basis: 44px; }
1067
+ .vault-rail-heading { height: 44px; }
1068
+ .vault-source-line { grid-template-columns: 44px minmax(0, 1fr); }
1069
+ .vault-source-line.removable { grid-template-columns: 44px minmax(0, 1fr) 44px; }
1070
+ .vault-source-toggle,
1071
+ .vault-source-remove,
1072
+ .vault-disclosure { width: 44px; min-height: 44px; flex-basis: 44px; }
1073
+ }
1074
+ @media (prefers-reduced-motion: reduce) {
1075
+ .vault-page * { scroll-behavior: auto !important; }
1076
+ .vault-progress-bar { transition: none; }
1077
+ .vault-progress-bar.indeterminate { animation: none; transform: none; opacity: .65; }
1078
+ .vault-page .fa-spin { animation: none !important; }
1079
+ }