dsh-audiogen 0.3.4 → 0.4.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.
@@ -0,0 +1,686 @@
1
+ /**
2
+ * 资源库 (resource library) view: filters, card grid, detail drawer with full
3
+ * provenance, and batch management. Rides the dsh --dsw-alias-* tokens.
4
+ */
5
+
6
+ .library {
7
+ display: flex;
8
+ flex-direction: column;
9
+ gap: 10px;
10
+ flex: 1;
11
+ min-height: 0;
12
+ min-width: 0;
13
+ }
14
+
15
+ /* ------------------------------------------------------------------ toolbar */
16
+
17
+ .toolbar {
18
+ display: flex;
19
+ align-items: center;
20
+ gap: 12px;
21
+ flex: none;
22
+ flex-wrap: wrap;
23
+ }
24
+
25
+ .searchBox {
26
+ display: inline-flex;
27
+ align-items: center;
28
+ gap: 7px;
29
+ flex: 1 1 220px;
30
+ min-width: 170px;
31
+ height: 33px;
32
+ padding: 0 11px;
33
+ border: 1px solid var(--dsw-alias-border-l2, #d1d5db);
34
+ border-radius: 999px;
35
+ background: var(--dsw-alias-bg-layer-1, #fff);
36
+ color: var(--dsw-alias-label-tertiary, #9ca3af);
37
+ }
38
+
39
+ .searchBox:focus-within {
40
+ border-color: var(--dsw-alias-brand-primary, #2563eb);
41
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--dsw-alias-brand-primary, #2563eb) 14%, transparent);
42
+ }
43
+
44
+ .searchInput {
45
+ flex: 1;
46
+ min-width: 0;
47
+ height: 100%;
48
+ border: 0;
49
+ background: transparent;
50
+ color: var(--dsw-alias-label-primary, #1f2328);
51
+ font-family: inherit;
52
+ font-size: 12.5px;
53
+ outline: none;
54
+ }
55
+
56
+ .searchInput::placeholder {
57
+ color: var(--dsw-alias-label-tertiary, #9ca3af);
58
+ }
59
+
60
+ .typeChips {
61
+ display: inline-flex;
62
+ align-items: center;
63
+ gap: 5px;
64
+ padding: 3px;
65
+ border: 1px solid var(--dsw-alias-border-l1, #e5e7eb);
66
+ border-radius: 10px;
67
+ background: var(--dsw-alias-bg-layer-2, #f3f4f6);
68
+ }
69
+
70
+ .chip {
71
+ display: inline-flex;
72
+ align-items: center;
73
+ gap: 5px;
74
+ min-height: 27px;
75
+ padding: 0 11px;
76
+ border: 0;
77
+ border-radius: 8px;
78
+ background: transparent;
79
+ color: var(--dsw-alias-label-secondary, #6b7280);
80
+ font-family: inherit;
81
+ font-size: 12px;
82
+ white-space: nowrap;
83
+ cursor: pointer;
84
+ transition: color 0.12s, background 0.12s;
85
+ }
86
+
87
+ .chip:hover {
88
+ color: var(--dsw-alias-label-primary, #1f2328);
89
+ }
90
+
91
+ .chip[data-active='true'] {
92
+ color: var(--dsw-alias-brand-primary, #2563eb);
93
+ background: var(--dsw-alias-bg-layer-1, #fff);
94
+ font-weight: 600;
95
+ box-shadow: 0 1px 3px rgb(0 0 0 / 10%);
96
+ }
97
+
98
+ .chipCount {
99
+ padding: 1px 6px;
100
+ border-radius: 999px;
101
+ background: var(--dsw-alias-bg-layer-1, #fff);
102
+ color: var(--dsw-alias-label-tertiary, #9ca3af);
103
+ font-size: 10.5px;
104
+ font-variant-numeric: tabular-nums;
105
+ }
106
+
107
+ .chip[data-active='true'] .chipCount {
108
+ background: color-mix(in srgb, var(--dsw-alias-brand-primary, #2563eb) 10%, transparent);
109
+ color: var(--dsw-alias-brand-primary, #2563eb);
110
+ }
111
+
112
+ /* ------------------------------------------------------------------ filters */
113
+
114
+ .filterRow {
115
+ display: flex;
116
+ align-items: center;
117
+ gap: 6px;
118
+ flex-wrap: wrap;
119
+ flex: none;
120
+ }
121
+
122
+ .filterLabel {
123
+ font-size: 11px;
124
+ font-weight: 600;
125
+ color: var(--dsw-alias-label-tertiary, #9ca3af);
126
+ }
127
+
128
+ .smallChip {
129
+ display: inline-flex;
130
+ align-items: center;
131
+ gap: 4px;
132
+ min-height: 24px;
133
+ padding: 0 10px;
134
+ border: 1px solid var(--dsw-alias-border-l1, #e5e7eb);
135
+ border-radius: 999px;
136
+ background: var(--dsw-alias-bg-layer-2, #f3f4f6);
137
+ color: var(--dsw-alias-label-secondary, #6b7280);
138
+ font-family: inherit;
139
+ font-size: 11.5px;
140
+ cursor: pointer;
141
+ }
142
+
143
+ .smallChip:hover {
144
+ color: var(--dsw-alias-label-primary, #1f2328);
145
+ border-color: var(--dsw-alias-label-dimmed, #9ca3af);
146
+ }
147
+
148
+ .smallChip[data-active='true'] {
149
+ color: var(--dsw-alias-brand-primary, #2563eb);
150
+ border-color: var(--dsw-alias-brand-primary, #2563eb);
151
+ background: color-mix(in srgb, var(--dsw-alias-brand-primary, #2563eb) 9%, transparent);
152
+ font-weight: 600;
153
+ }
154
+
155
+ /* ------------------------------------------------------------- list header */
156
+
157
+ .listHead {
158
+ display: flex;
159
+ align-items: center;
160
+ justify-content: space-between;
161
+ gap: 10px;
162
+ flex: none;
163
+ padding-bottom: 2px;
164
+ border-bottom: 1px solid var(--dsw-alias-border-l1, #e5e7eb);
165
+ }
166
+
167
+ .listCount {
168
+ font-size: 12px;
169
+ color: var(--dsw-alias-label-tertiary, #9ca3af);
170
+ }
171
+
172
+ .listActions {
173
+ display: inline-flex;
174
+ align-items: center;
175
+ gap: 6px;
176
+ flex-wrap: wrap;
177
+ }
178
+
179
+ .selCount {
180
+ font-size: 11.5px;
181
+ font-weight: 600;
182
+ color: var(--dsw-alias-brand-primary, #2563eb);
183
+ }
184
+
185
+ .smallSelect {
186
+ height: 27px;
187
+ padding: 0 8px;
188
+ border: 1px solid var(--dsw-alias-border-l1, #e5e7eb);
189
+ border-radius: 7px;
190
+ background: var(--dsw-alias-bg-layer-1, #fff);
191
+ color: var(--dsw-alias-label-primary, #1f2328);
192
+ font-family: inherit;
193
+ font-size: 11.5px;
194
+ outline: none;
195
+ }
196
+
197
+ .ghostBtn {
198
+ display: inline-flex;
199
+ align-items: center;
200
+ gap: 5px;
201
+ min-height: 27px;
202
+ padding: 0 11px;
203
+ border: 1px solid var(--dsw-alias-border-l1, #e5e7eb);
204
+ border-radius: 999px;
205
+ background: var(--dsw-alias-bg-layer-1, #fff);
206
+ color: var(--dsw-alias-label-secondary, #6b7280);
207
+ font-family: inherit;
208
+ font-size: 11.5px;
209
+ cursor: pointer;
210
+ }
211
+
212
+ .ghostBtn:hover:not(:disabled) {
213
+ color: var(--dsw-alias-brand-primary, #2563eb);
214
+ border-color: var(--dsw-alias-brand-primary, #2563eb);
215
+ }
216
+
217
+ .dangerBtn {
218
+ display: inline-flex;
219
+ align-items: center;
220
+ gap: 5px;
221
+ min-height: 27px;
222
+ padding: 0 11px;
223
+ border: 1px solid var(--dsw-alias-label-error, #b91c1c);
224
+ border-radius: 999px;
225
+ background: transparent;
226
+ color: var(--dsw-alias-label-error, #b91c1c);
227
+ font-family: inherit;
228
+ font-size: 11.5px;
229
+ cursor: pointer;
230
+ }
231
+
232
+ .dangerBtn:hover:not(:disabled) {
233
+ background: color-mix(in srgb, var(--dsw-alias-label-error, #b91c1c) 8%, transparent);
234
+ }
235
+
236
+ .ghostBtn:disabled,
237
+ .dangerBtn:disabled {
238
+ opacity: 0.45;
239
+ cursor: default;
240
+ }
241
+
242
+ /* ------------------------------------------------------------------ states */
243
+
244
+ .stateNote {
245
+ margin: 0;
246
+ padding: 8px 4px;
247
+ font-size: 12px;
248
+ color: var(--dsw-alias-label-tertiary, #9ca3af);
249
+ }
250
+
251
+ .stateNote[data-error] {
252
+ color: var(--dsw-alias-label-error, #b91c1c);
253
+ }
254
+
255
+ .empty {
256
+ flex: 1;
257
+ display: flex;
258
+ flex-direction: column;
259
+ align-items: center;
260
+ justify-content: center;
261
+ gap: 6px;
262
+ text-align: center;
263
+ color: var(--dsw-alias-label-secondary, #6b7280);
264
+ font-size: 13px;
265
+ }
266
+
267
+ .emptyIcon {
268
+ display: inline-flex;
269
+ align-items: center;
270
+ justify-content: center;
271
+ width: 56px;
272
+ height: 56px;
273
+ margin-bottom: 4px;
274
+ border-radius: 50%;
275
+ background: var(--dsw-alias-bg-layer-2, #f3f4f6);
276
+ font-size: 26px;
277
+ }
278
+
279
+ .emptyHint {
280
+ margin: 0;
281
+ font-size: 11.5px;
282
+ color: var(--dsw-alias-label-tertiary, #9ca3af);
283
+ }
284
+
285
+ /* -------------------------------------------------------------------- grid */
286
+
287
+ .grid {
288
+ flex: 1;
289
+ min-height: 0;
290
+ overflow-y: auto;
291
+ display: grid;
292
+ grid-template-columns: repeat(auto-fill, minmax(230px, 1fr));
293
+ gap: 12px;
294
+ align-content: start;
295
+ padding: 2px 2px 6px 2px;
296
+ scrollbar-width: thin;
297
+ scrollbar-color: var(--dsw-alias-border-l2) transparent;
298
+ }
299
+
300
+ .grid::-webkit-scrollbar { width: 8px; }
301
+ .grid::-webkit-scrollbar-thumb { background: var(--dsw-alias-border-l2); border-radius: 999px; }
302
+
303
+ .card {
304
+ position: relative;
305
+ display: flex;
306
+ flex-direction: column;
307
+ gap: 7px;
308
+ padding: 11px;
309
+ border: 1px solid var(--dsw-alias-border-l1, #e5e7eb);
310
+ border-radius: 12px;
311
+ background: var(--dsw-alias-bg-layer-1, #fff);
312
+ cursor: pointer;
313
+ transition: border-color 0.12s, box-shadow 0.12s, transform 0.12s;
314
+ }
315
+
316
+ .card:hover {
317
+ border-color: var(--dsw-alias-label-dimmed, #9ca3af);
318
+ box-shadow: 0 4px 14px rgb(24 32 54 / 8%);
319
+ transform: translateY(-1px);
320
+ }
321
+
322
+ .card[data-selected='true'] {
323
+ border-color: var(--dsw-alias-brand-primary, #2563eb);
324
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--dsw-alias-brand-primary, #2563eb) 24%, transparent);
325
+ }
326
+
327
+ .cardCheck {
328
+ position: absolute;
329
+ top: 9px;
330
+ right: 9px;
331
+ z-index: 2;
332
+ }
333
+
334
+ .cardCheck input {
335
+ width: 16px;
336
+ height: 16px;
337
+ accent-color: var(--dsw-alias-brand-primary, #2563eb);
338
+ cursor: pointer;
339
+ }
340
+
341
+ .cardHead {
342
+ display: flex;
343
+ align-items: center;
344
+ justify-content: space-between;
345
+ gap: 8px;
346
+ }
347
+
348
+ .typeBadge {
349
+ display: inline-flex;
350
+ align-items: center;
351
+ gap: 5px;
352
+ padding: 2px 9px;
353
+ border-radius: 999px;
354
+ font-size: 10.5px;
355
+ font-weight: 600;
356
+ background: var(--dsw-alias-bg-layer-2, #f3f4f6);
357
+ color: var(--dsw-alias-label-secondary, #6b7280);
358
+ }
359
+
360
+ .typeBadge[data-type='voice'] {
361
+ background: color-mix(in srgb, #8b5cf6 12%, transparent);
362
+ color: #8b5cf6;
363
+ }
364
+
365
+ .typeBadge[data-type='music'] {
366
+ background: color-mix(in srgb, #10b981 12%, transparent);
367
+ color: #059669;
368
+ }
369
+
370
+ .typeBadge[data-type='sfx'] {
371
+ background: color-mix(in srgb, #f59e0b 14%, transparent);
372
+ color: #b45309;
373
+ }
374
+
375
+ .typeBadge[data-type='tts'] {
376
+ background: color-mix(in srgb, #3b82f6 12%, transparent);
377
+ color: #2563eb;
378
+ }
379
+
380
+ .cardTime {
381
+ font-size: 10.5px;
382
+ color: var(--dsw-alias-label-tertiary, #9ca3af);
383
+ white-space: nowrap;
384
+ }
385
+
386
+ .cardName {
387
+ font-size: 12.5px;
388
+ line-height: 1.4;
389
+ color: var(--dsw-alias-label-primary, #1f2328);
390
+ display: -webkit-box;
391
+ -webkit-line-clamp: 2;
392
+ -webkit-box-orient: vertical;
393
+ overflow: hidden;
394
+ min-height: 34px;
395
+ }
396
+
397
+ .cardFoot {
398
+ display: flex;
399
+ align-items: center;
400
+ gap: 5px;
401
+ flex-wrap: wrap;
402
+ }
403
+
404
+ .metaChip {
405
+ max-width: 140px;
406
+ overflow: hidden;
407
+ padding: 1px 8px;
408
+ border-radius: 999px;
409
+ background: var(--dsw-alias-bg-layer-2, #f3f4f6);
410
+ color: var(--dsw-alias-label-tertiary, #9ca3af);
411
+ font-size: 10.5px;
412
+ text-overflow: ellipsis;
413
+ white-space: nowrap;
414
+ }
415
+
416
+ .metaChip[data-tag] {
417
+ color: var(--dsw-alias-brand-primary, #2563eb);
418
+ background: color-mix(in srgb, var(--dsw-alias-brand-primary, #2563eb) 10%, transparent);
419
+ }
420
+
421
+ /* ------------------------------------------------------------ detail drawer */
422
+
423
+ .drawerMask {
424
+ position: absolute;
425
+ inset: 0;
426
+ z-index: 120;
427
+ display: flex;
428
+ justify-content: flex-end;
429
+ background: rgb(0 0 0 / 30%);
430
+ backdrop-filter: blur(2px);
431
+ }
432
+
433
+ .drawer {
434
+ display: flex;
435
+ flex-direction: column;
436
+ width: min(430px, calc(100% - 24px));
437
+ height: 100%;
438
+ background: var(--dsw-alias-bg-layer-1, #fff);
439
+ border-left: 1px solid var(--dsw-alias-border-l2, #d1d5db);
440
+ box-shadow: -12px 0 36px rgb(0 0 0 / 18%);
441
+ animation: audiogenDrawerIn 180ms ease-out;
442
+ }
443
+
444
+ @keyframes audiogenDrawerIn {
445
+ from { transform: translateX(20px); opacity: 0; }
446
+ to { transform: translateX(0); opacity: 1; }
447
+ }
448
+
449
+ .drawerHead {
450
+ display: flex;
451
+ align-items: center;
452
+ justify-content: space-between;
453
+ gap: 10px;
454
+ padding: 13px 14px;
455
+ border-bottom: 1px solid var(--dsw-alias-border-l1, #e5e7eb);
456
+ flex: none;
457
+ }
458
+
459
+ .drawerTitle {
460
+ overflow: hidden;
461
+ font-size: 13.5px;
462
+ font-weight: 700;
463
+ color: var(--dsw-alias-label-primary, #1f2328);
464
+ text-overflow: ellipsis;
465
+ white-space: nowrap;
466
+ }
467
+
468
+ .iconBtn {
469
+ display: inline-flex;
470
+ align-items: center;
471
+ justify-content: center;
472
+ flex: none;
473
+ width: 26px;
474
+ height: 26px;
475
+ border: 0;
476
+ border-radius: 7px;
477
+ background: transparent;
478
+ color: var(--dsw-alias-label-tertiary, #9ca3af);
479
+ font-size: 16px;
480
+ line-height: 1;
481
+ cursor: pointer;
482
+ }
483
+
484
+ .iconBtn:hover {
485
+ color: var(--dsw-alias-label-primary, #1f2328);
486
+ background: var(--dsw-alias-bg-layer-2, #f3f4f6);
487
+ }
488
+
489
+ .drawerBody {
490
+ flex: 1;
491
+ min-height: 0;
492
+ overflow-y: auto;
493
+ display: flex;
494
+ flex-direction: column;
495
+ gap: 14px;
496
+ padding: 14px;
497
+ scrollbar-width: thin;
498
+ scrollbar-color: var(--dsw-alias-border-l2) transparent;
499
+ }
500
+
501
+ .drawerBody::-webkit-scrollbar { width: 8px; }
502
+ .drawerBody::-webkit-scrollbar-thumb { background: var(--dsw-alias-border-l2); border-radius: 999px; }
503
+
504
+ .drawerSection {
505
+ display: flex;
506
+ flex-direction: column;
507
+ gap: 9px;
508
+ }
509
+
510
+ .drawerLabel {
511
+ font-size: 11px;
512
+ font-weight: 700;
513
+ letter-spacing: 0.04em;
514
+ color: var(--dsw-alias-label-tertiary, #9ca3af);
515
+ text-transform: uppercase;
516
+ }
517
+
518
+ .drawerPlayerList {
519
+ display: flex;
520
+ flex-direction: column;
521
+ gap: 8px;
522
+ }
523
+
524
+ .drawerPlayer {
525
+ display: flex;
526
+ flex-direction: column;
527
+ gap: 4px;
528
+ }
529
+
530
+ .drawerPlayerName {
531
+ padding-left: 4px;
532
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
533
+ font-size: 10px;
534
+ color: var(--dsw-alias-label-tertiary, #9ca3af);
535
+ overflow: hidden;
536
+ text-overflow: ellipsis;
537
+ white-space: nowrap;
538
+ }
539
+
540
+ .drawerField {
541
+ display: flex;
542
+ flex-direction: column;
543
+ gap: 4px;
544
+ font-size: 11.5px;
545
+ font-weight: 600;
546
+ color: var(--dsw-alias-label-secondary, #6b7280);
547
+ }
548
+
549
+ .drawerSplit {
550
+ display: grid;
551
+ grid-template-columns: 1fr 1fr;
552
+ gap: 9px;
553
+ }
554
+
555
+ .input,
556
+ .textarea {
557
+ width: 100%;
558
+ min-height: 32px;
559
+ padding: 6px 9px;
560
+ border: 1px solid var(--dsw-alias-border-l2, #d1d5db);
561
+ border-radius: 8px;
562
+ background: var(--dsw-alias-bg-layer-2, #f7f7f8);
563
+ color: var(--dsw-alias-label-primary, #1f2328);
564
+ font-family: inherit;
565
+ font-size: 12.5px;
566
+ outline: none;
567
+ }
568
+
569
+ .input:focus,
570
+ .textarea:focus {
571
+ border-color: var(--dsw-alias-brand-primary, #2563eb);
572
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--dsw-alias-brand-primary, #2563eb) 12%, transparent);
573
+ }
574
+
575
+ .textarea {
576
+ resize: vertical;
577
+ }
578
+
579
+ .provenance {
580
+ display: flex;
581
+ flex-direction: column;
582
+ gap: 7px;
583
+ padding: 10px 11px;
584
+ border: 1px solid var(--dsw-alias-border-l1, #e5e7eb);
585
+ border-radius: 10px;
586
+ background: var(--dsw-alias-bg-layer-2, #f7f7f8);
587
+ }
588
+
589
+ .provRow {
590
+ display: flex;
591
+ gap: 8px;
592
+ min-width: 0;
593
+ }
594
+
595
+ .provKey {
596
+ flex: none;
597
+ width: 64px;
598
+ font-size: 11px;
599
+ font-weight: 600;
600
+ color: var(--dsw-alias-label-tertiary, #9ca3af);
601
+ padding-top: 1px;
602
+ }
603
+
604
+ .provValue {
605
+ display: flex;
606
+ align-items: flex-start;
607
+ gap: 6px;
608
+ min-width: 0;
609
+ flex-wrap: wrap;
610
+ font-size: 12px;
611
+ line-height: 1.5;
612
+ color: var(--dsw-alias-label-primary, #1f2328);
613
+ overflow-wrap: anywhere;
614
+ }
615
+
616
+ .mono {
617
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
618
+ font-size: 10.5px;
619
+ color: var(--dsw-alias-label-secondary, #6b7280);
620
+ }
621
+
622
+ .promptText {
623
+ color: var(--dsw-alias-label-secondary, #6b7280);
624
+ }
625
+
626
+ .code {
627
+ padding: 2px 6px;
628
+ border-radius: 5px;
629
+ background: var(--dsw-alias-bg-layer-3, #eceef1);
630
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
631
+ font-size: 10.5px;
632
+ overflow-wrap: anywhere;
633
+ }
634
+
635
+ .paramsDetails summary {
636
+ cursor: pointer;
637
+ font-size: 11px;
638
+ color: var(--dsw-alias-brand-primary, #2563eb);
639
+ user-select: none;
640
+ }
641
+
642
+ .paramsDetails pre {
643
+ width: 100%;
644
+ max-height: 200px;
645
+ margin: 5px 0 0;
646
+ padding: 8px;
647
+ overflow: auto;
648
+ border-radius: 7px;
649
+ background: var(--dsw-alias-bg-layer-3, #eceef1);
650
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
651
+ font-size: 10px;
652
+ line-height: 1.5;
653
+ color: var(--dsw-alias-label-secondary, #6b7280);
654
+ }
655
+
656
+ .drawerActions {
657
+ display: flex;
658
+ align-items: center;
659
+ gap: 8px;
660
+ flex-wrap: wrap;
661
+ }
662
+
663
+ .primaryBtn {
664
+ display: inline-flex;
665
+ align-items: center;
666
+ gap: 6px;
667
+ min-height: 30px;
668
+ padding: 0 13px;
669
+ border: 0;
670
+ border-radius: 8px;
671
+ background: var(--dsw-alias-label-primary, #1f2328);
672
+ color: var(--dsw-alias-bg-layer-3, #fff);
673
+ font-family: inherit;
674
+ font-size: 12px;
675
+ font-weight: 600;
676
+ cursor: pointer;
677
+ }
678
+
679
+ .primaryBtn:disabled {
680
+ opacity: 0.5;
681
+ cursor: default;
682
+ }
683
+
684
+ @media (prefers-reduced-motion: reduce) {
685
+ .drawer { animation-duration: 1ms; }
686
+ }
@@ -6,6 +6,8 @@ export const zh = {
6
6
  'entry.label': 'AI 音频',
7
7
  'entry.tooltip': 'AI 音频面板(TTS / 音乐 / 音效)',
8
8
  'panel.title': 'AI 音频',
9
+ 'tab.studio': '生成',
10
+ 'tab.library': '资源库',
9
11
  'mode.tts': '文本转语音',
10
12
  'mode.music': '音乐生成',
11
13
  'mode.sfx': '音效生成',
@@ -33,6 +35,7 @@ export const zh = {
33
35
  'settings.enabled': '启用插件',
34
36
  'settings.announceToAgent': '向 Agent 播报本插件',
35
37
  'settings.allowAgentAudio': '允许 Agent 调用音频生成',
38
+ 'settings.autoSaveLibrary': '生成后自动保存到资源库',
36
39
  'settings.save': '保存',
37
40
  'settings.saving': '保存中…',
38
41
  'settings.discard': '放弃修改',
@@ -107,6 +110,8 @@ export const en: Record<AudioGenKey, string> = {
107
110
  'entry.label': 'AI Audio',
108
111
  'entry.tooltip': 'AI audio panel (TTS / music / SFX)',
109
112
  'panel.title': 'AI Audio',
113
+ 'tab.studio': 'Studio',
114
+ 'tab.library': 'Library',
110
115
  'mode.tts': 'Text to speech',
111
116
  'mode.music': 'Music',
112
117
  'mode.sfx': 'Sound effects',
@@ -134,6 +139,7 @@ export const en: Record<AudioGenKey, string> = {
134
139
  'settings.enabled': 'Enable plugin',
135
140
  'settings.announceToAgent': 'Announce this plugin to agents',
136
141
  'settings.allowAgentAudio': 'Allow agents to generate audio',
142
+ 'settings.autoSaveLibrary': 'Auto-save generated audio to the library',
137
143
  'settings.save': 'Save',
138
144
  'settings.saving': 'Saving…',
139
145
  'settings.discard': 'Discard',
@@ -29,6 +29,8 @@ export interface AudiogenConfig {
29
29
  /** Channel used when a request does not name one. */
30
30
  defaultChannelId?: string
31
31
  defaultModel?: string
32
+ /** 生成完成后自动保存到资源库(面板与 Agent 生成均生效)。 */
33
+ autoSaveToLibrary?: boolean
32
34
  }
33
35
 
34
36
  /** One settings path-op as the bridge consumes it. */