dsh-side-chat-plus 0.3.1

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 (44) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +317 -0
  3. package/README.zh.md +261 -0
  4. package/cordis.patch.yml +8 -0
  5. package/dsh.plugin.json +16 -0
  6. package/lib/client-registry.js +2949 -0
  7. package/lib/client-registry.js.map +1 -0
  8. package/lib/client.js +2949 -0
  9. package/lib/client.js.map +1 -0
  10. package/lib/index.js +840 -0
  11. package/lib/types/client/api.d.ts +218 -0
  12. package/lib/types/client/attachments/AttachmentRail.d.ts +39 -0
  13. package/lib/types/client/attachments/DropOverlay.d.ts +18 -0
  14. package/lib/types/client/attachments/ImageLightbox.d.ts +20 -0
  15. package/lib/types/client/attachments/MessageImage.d.ts +38 -0
  16. package/lib/types/client/attachments/index.d.ts +18 -0
  17. package/lib/types/client/index.d.ts +6 -0
  18. package/lib/types/client/locales.d.ts +178 -0
  19. package/lib/types/context-types.d.ts +390 -0
  20. package/lib/types/index.d.ts +7 -0
  21. package/lib/types/settings-shared.d.ts +24 -0
  22. package/lib/types/trust-fence.d.ts +20 -0
  23. package/lib/types/wire.d.ts +25 -0
  24. package/package.json +114 -0
  25. package/src/client/api.ts +112 -0
  26. package/src/client/attachments/AttachmentRail.module.css +89 -0
  27. package/src/client/attachments/AttachmentRail.tsx +173 -0
  28. package/src/client/attachments/DropOverlay.module.css +38 -0
  29. package/src/client/attachments/DropOverlay.tsx +62 -0
  30. package/src/client/attachments/ImageLightbox.module.css +44 -0
  31. package/src/client/attachments/ImageLightbox.tsx +58 -0
  32. package/src/client/attachments/MessageImage.module.css +61 -0
  33. package/src/client/attachments/MessageImage.tsx +120 -0
  34. package/src/client/attachments/index.ts +19 -0
  35. package/src/client/client.module.css +1032 -0
  36. package/src/client/index.tsx +1966 -0
  37. package/src/client/layout.css +16 -0
  38. package/src/client/locales.ts +181 -0
  39. package/src/context-types.ts +384 -0
  40. package/src/css-modules.d.ts +10 -0
  41. package/src/index.ts +840 -0
  42. package/src/settings-shared.ts +33 -0
  43. package/src/trust-fence.ts +70 -0
  44. package/src/wire.ts +81 -0
@@ -0,0 +1,1032 @@
1
+ /* dsh-side-chat client styles. Per the DSH web-styling rules every visual
2
+ value rides the theme: --dsw-alias-* semantic tokens for colors and
3
+ --dsw-font-family for typography. No static palette values, no color
4
+ literals — light/dark adaptation is the theme package's job. */
5
+
6
+ /* ---- Floating selection menu ---- */
7
+ .selectionMenu {
8
+ position: fixed;
9
+ z-index: 2147483000;
10
+ transform: translate(-50%, 0);
11
+ display: flex;
12
+ gap: 4px;
13
+ background: var(--dsw-alias-bg-overlay);
14
+ border: 1px solid var(--dsw-alias-border-l3);
15
+ border-radius: 10px;
16
+ padding: 4px;
17
+ box-shadow: 0 4px 16px var(--dsw-alias-bg-mask-2);
18
+ pointer-events: auto;
19
+ }
20
+
21
+ .selectionButton {
22
+ font-family: var(--dsw-font-family);
23
+ font-size: 13px;
24
+ line-height: 20px;
25
+ color: var(--dsw-alias-label-primary);
26
+ background: transparent;
27
+ border: none;
28
+ border-radius: 7px;
29
+ padding: 6px 10px;
30
+ cursor: pointer;
31
+ white-space: nowrap;
32
+ }
33
+
34
+ .selectionButton:hover:not(:disabled) {
35
+ background: var(--dsw-alias-interactive-bg-hover);
36
+ }
37
+
38
+ .selectionButton:disabled {
39
+ cursor: default;
40
+ opacity: 0.55;
41
+ }
42
+
43
+ /* ---- Right-side panel ---- */
44
+ .panel {
45
+ position: fixed;
46
+ top: 0;
47
+ right: 0;
48
+ bottom: 0;
49
+ width: var(--dsh-subchat-width, 360px);
50
+ z-index: 2147482990;
51
+ display: flex;
52
+ flex-direction: column;
53
+ background: var(--dsw-specific-sidebar-fill);
54
+ border-left: 1px solid var(--dsw-alias-border-l2);
55
+ color: var(--dsw-alias-label-primary);
56
+ font-family: var(--dsw-font-family);
57
+ font-size: 14px;
58
+ pointer-events: auto;
59
+ }
60
+
61
+ .panelResize {
62
+ position: absolute;
63
+ left: -4px;
64
+ top: 0;
65
+ bottom: 0;
66
+ width: 8px;
67
+ cursor: col-resize;
68
+ z-index: 2;
69
+ touch-action: none;
70
+ }
71
+
72
+ .panelHeader {
73
+ flex: none;
74
+ display: flex;
75
+ align-items: center;
76
+ justify-content: space-between;
77
+ padding: 12px 14px;
78
+ border-bottom: 1px solid var(--dsw-alias-border-l1);
79
+ }
80
+
81
+ .panelTitle {
82
+ font-weight: 600;
83
+ }
84
+
85
+ .panelHeaderActions {
86
+ display: flex;
87
+ align-items: center;
88
+ gap: 4px;
89
+ }
90
+
91
+ .panelIconButton {
92
+ display: grid;
93
+ place-items: center;
94
+ width: 28px;
95
+ height: 28px;
96
+ color: var(--dsw-alias-label-secondary);
97
+ background: transparent;
98
+ border: none;
99
+ border-radius: 999px;
100
+ cursor: pointer;
101
+ }
102
+
103
+ .panelIconButton:hover {
104
+ background: var(--dsw-alias-interactive-bg-hover);
105
+ color: var(--dsw-alias-label-primary);
106
+ }
107
+
108
+ .panelClose {
109
+ font-family: var(--dsw-font-family);
110
+ font-size: 13px;
111
+ color: var(--dsw-alias-label-secondary);
112
+ background: transparent;
113
+ border: none;
114
+ cursor: pointer;
115
+ padding: 4px 8px;
116
+ border-radius: 6px;
117
+ }
118
+
119
+ .panelClose:hover {
120
+ background: var(--dsw-alias-interactive-bg-hover);
121
+ color: var(--dsw-alias-label-primary);
122
+ }
123
+
124
+ /* Collapsed handle: a floating round button on the right edge. */
125
+ .collapsedHandle {
126
+ position: fixed;
127
+ top: 50%;
128
+ right: 8px;
129
+ transform: translateY(-50%);
130
+ z-index: 2147482990;
131
+ display: grid;
132
+ place-items: center;
133
+ width: 32px;
134
+ height: 32px;
135
+ color: var(--dsw-alias-label-secondary);
136
+ background: var(--dsw-alias-bg-overlay);
137
+ border: 1px solid var(--dsw-alias-border-l2);
138
+ border-radius: 999px;
139
+ cursor: pointer;
140
+ box-shadow: var(--dsw-shadow-lv2);
141
+ }
142
+
143
+ .collapsedHandle:hover {
144
+ color: var(--dsw-alias-label-primary);
145
+ background: var(--dsw-alias-interactive-bg-hover);
146
+ }
147
+
148
+ /* Floating entry shown (panel closed) when the main conversation has a question dialog. */
149
+ .questionFab {
150
+ position: fixed;
151
+ z-index: 2147482990;
152
+ display: grid;
153
+ place-items: center;
154
+ width: 32px;
155
+ height: 32px;
156
+ color: var(--dsw-alias-label-secondary);
157
+ background: var(--dsw-alias-bg-overlay);
158
+ border: 1px solid var(--dsw-alias-state-business-primary);
159
+ border-radius: 999px;
160
+ cursor: pointer;
161
+ box-shadow: var(--dsw-shadow-lv2);
162
+ }
163
+
164
+ .questionFab:hover {
165
+ color: var(--dsw-alias-label-primary);
166
+ background: var(--dsw-alias-interactive-bg-hover);
167
+ }
168
+
169
+ .questionFabDot {
170
+ position: absolute;
171
+ top: 4px;
172
+ right: 4px;
173
+ width: 8px;
174
+ height: 8px;
175
+ border-radius: 50%;
176
+ background: var(--dsw-alias-state-business-primary);
177
+ }
178
+
179
+ /* Pending main-conversation question dialog, listed item-by-item. */
180
+ .questionBlock {
181
+ flex: none;
182
+ max-height: 40%;
183
+ overflow-y: auto;
184
+ display: flex;
185
+ flex-direction: column;
186
+ gap: 8px;
187
+ padding: 8px;
188
+ border-bottom: 1px solid var(--dsw-alias-border-l1);
189
+ }
190
+
191
+ .questionBlockActions {
192
+ display: flex;
193
+ align-items: center;
194
+ justify-content: space-between;
195
+ }
196
+
197
+ .questionToggle {
198
+ font-family: var(--dsw-font-family);
199
+ font-size: 12px;
200
+ line-height: 18px;
201
+ color: var(--dsw-alias-label-tertiary);
202
+ background: transparent;
203
+ border: none;
204
+ border-radius: 6px;
205
+ padding: 2px 6px;
206
+ cursor: pointer;
207
+ }
208
+
209
+ .questionToggle:hover {
210
+ color: var(--dsw-alias-label-primary);
211
+ background: var(--dsw-alias-interactive-bg-hover);
212
+ }
213
+
214
+ .questionDeleteAll {
215
+ font-family: var(--dsw-font-family);
216
+ font-size: 12px;
217
+ line-height: 18px;
218
+ color: var(--dsw-alias-label-tertiary);
219
+ background: transparent;
220
+ border: none;
221
+ border-radius: 6px;
222
+ padding: 2px 6px;
223
+ cursor: pointer;
224
+ }
225
+
226
+ .questionDeleteAll:hover {
227
+ color: var(--dsw-alias-state-error-primary);
228
+ background: var(--dsw-alias-interactive-bg-hover);
229
+ }
230
+
231
+ .questionItemCollapsed {
232
+ gap: 0;
233
+ padding: 8px 12px;
234
+ }
235
+
236
+ .questionItem {
237
+ display: flex;
238
+ flex-direction: column;
239
+ gap: 6px;
240
+ border: 1px solid var(--dsw-alias-border-l1);
241
+ background: var(--dsw-alias-bg-layer-2);
242
+ border-radius: 12px;
243
+ padding: 10px 12px;
244
+ }
245
+
246
+ .questionHeader {
247
+ display: flex;
248
+ align-items: center;
249
+ justify-content: space-between;
250
+ gap: 8px;
251
+ }
252
+
253
+ .questionHeaderText {
254
+ flex: 1;
255
+ min-width: 0;
256
+ color: var(--dsw-alias-label-primary);
257
+ font-weight: 600;
258
+ font-size: 13px;
259
+ line-height: 20px;
260
+ overflow: hidden;
261
+ text-overflow: ellipsis;
262
+ white-space: nowrap;
263
+ }
264
+
265
+ .questionHeaderActions {
266
+ flex: none;
267
+ display: flex;
268
+ align-items: center;
269
+ gap: 4px;
270
+ }
271
+
272
+ .questionBody {
273
+ color: var(--dsw-alias-label-primary);
274
+ font-size: 14px;
275
+ line-height: 22px;
276
+ white-space: pre-wrap;
277
+ word-break: break-word;
278
+ }
279
+
280
+ .questionDetail {
281
+ color: var(--dsw-alias-label-secondary);
282
+ font-size: 12px;
283
+ line-height: 18px;
284
+ white-space: pre-wrap;
285
+ word-break: break-word;
286
+ }
287
+
288
+ .questionOption {
289
+ display: flex;
290
+ align-items: center;
291
+ justify-content: space-between;
292
+ gap: 8px;
293
+ border: 1px solid var(--dsw-alias-border-l1);
294
+ background: var(--dsw-alias-bg-layer-1);
295
+ border-radius: 10px;
296
+ padding: 6px 8px 6px 10px;
297
+ }
298
+
299
+ .questionOptionText {
300
+ flex: 1;
301
+ min-width: 0;
302
+ color: var(--dsw-alias-label-primary);
303
+ font-size: 13px;
304
+ line-height: 20px;
305
+ word-break: break-word;
306
+ }
307
+
308
+ .questionOptionLabel {
309
+ font-weight: 500;
310
+ }
311
+
312
+ .questionOptionDesc {
313
+ color: var(--dsw-alias-label-secondary);
314
+ }
315
+
316
+ .questionBringButton {
317
+ flex: none;
318
+ font-family: var(--dsw-font-family);
319
+ font-size: 12px;
320
+ line-height: 18px;
321
+ color: var(--dsw-alias-label-primary);
322
+ background: transparent;
323
+ border: 1px solid var(--dsw-alias-border-l2);
324
+ border-radius: 999px;
325
+ padding: 2px 10px;
326
+ cursor: pointer;
327
+ white-space: nowrap;
328
+ }
329
+
330
+ .questionBringButton:hover:not(:disabled) {
331
+ background: var(--dsw-alias-interactive-bg-hover);
332
+ }
333
+
334
+ .questionBringButton:disabled {
335
+ cursor: default;
336
+ opacity: 0.55;
337
+ }
338
+
339
+ .questionDelete {
340
+ flex: none;
341
+ width: 22px;
342
+ height: 22px;
343
+ display: grid;
344
+ place-items: center;
345
+ color: var(--dsw-alias-label-tertiary);
346
+ background: transparent;
347
+ border: none;
348
+ border-radius: 6px;
349
+ cursor: pointer;
350
+ font-size: 14px;
351
+ line-height: 20px;
352
+ }
353
+
354
+ .questionDelete:hover {
355
+ color: var(--dsw-alias-state-error-primary);
356
+ background: var(--dsw-alias-interactive-bg-hover);
357
+ }
358
+
359
+ /* ---- Side-chat list ---- */
360
+ .panelList {
361
+ flex: none;
362
+ display: flex;
363
+ flex-direction: column;
364
+ gap: 2px;
365
+ padding: 8px;
366
+ border-bottom: 1px solid var(--dsw-alias-border-l1);
367
+ max-height: 132px;
368
+ overflow-y: auto;
369
+ }
370
+
371
+ .panelEmpty {
372
+ color: var(--dsw-alias-label-tertiary);
373
+ font-size: 12px;
374
+ line-height: 18px;
375
+ padding: 6px 8px;
376
+ }
377
+
378
+ .panelListActions {
379
+ display: flex;
380
+ justify-content: flex-end;
381
+ padding: 0 2px 2px;
382
+ }
383
+
384
+ .panelListDeleteAll {
385
+ font-family: var(--dsw-font-family);
386
+ font-size: 12px;
387
+ line-height: 18px;
388
+ color: var(--dsw-alias-label-tertiary);
389
+ background: transparent;
390
+ border: none;
391
+ border-radius: 6px;
392
+ padding: 2px 6px;
393
+ cursor: pointer;
394
+ }
395
+
396
+ .panelListDeleteAll:hover {
397
+ color: var(--dsw-alias-state-error-primary);
398
+ background: var(--dsw-alias-interactive-bg-hover);
399
+ }
400
+
401
+ .panelListItem {
402
+ display: flex;
403
+ align-items: center;
404
+ gap: 8px;
405
+ font-family: var(--dsw-font-family);
406
+ color: var(--dsw-alias-label-primary);
407
+ background: transparent;
408
+ border: none;
409
+ border-radius: 8px;
410
+ padding: 6px 8px;
411
+ cursor: pointer;
412
+ text-align: left;
413
+ }
414
+
415
+ .panelListItem:hover {
416
+ background: var(--dsw-specific-sidebar-nav-item-hover);
417
+ }
418
+
419
+ .panelListItemActive {
420
+ background: var(--dsw-specific-sidebar-nav-item-active);
421
+ }
422
+
423
+ .panelListItemDot {
424
+ flex: none;
425
+ width: 8px;
426
+ height: 8px;
427
+ border-radius: 50%;
428
+ background: var(--dsw-alias-label-tertiary);
429
+ }
430
+
431
+ .panelListItemDot[data-running='1'] {
432
+ background: var(--dsw-alias-state-business-primary);
433
+ }
434
+
435
+ .panelListItemLabel {
436
+ min-width: 0;
437
+ overflow: hidden;
438
+ text-overflow: ellipsis;
439
+ white-space: nowrap;
440
+ font-size: 12px;
441
+ font-family: var(--ds-font-family-code);
442
+ }
443
+
444
+ .panelListItemRow {
445
+ display: flex;
446
+ align-items: center;
447
+ gap: 2px;
448
+ }
449
+
450
+ .panelListItemRow .panelListItem {
451
+ flex: 1;
452
+ min-width: 0;
453
+ }
454
+
455
+ .panelListItemRemove {
456
+ flex: none;
457
+ width: 22px;
458
+ height: 22px;
459
+ display: grid;
460
+ place-items: center;
461
+ color: var(--dsw-alias-label-tertiary);
462
+ background: transparent;
463
+ border: none;
464
+ border-radius: 6px;
465
+ cursor: pointer;
466
+ font-size: 14px;
467
+ line-height: 20px;
468
+ }
469
+
470
+ .panelListItemRemove:hover {
471
+ color: var(--dsw-alias-state-error-primary);
472
+ background: var(--dsw-alias-interactive-bg-hover);
473
+ }
474
+
475
+ /* ---- Transcript ---- */
476
+ .panelTranscript {
477
+ flex: 1;
478
+ min-height: 0;
479
+ overflow-y: auto;
480
+ display: flex;
481
+ flex-direction: column;
482
+ gap: 10px;
483
+ padding: 14px;
484
+ }
485
+
486
+ .messageUser {
487
+ align-self: flex-end;
488
+ background: var(--dsw-specific-bubble);
489
+ color: var(--dsw-alias-label-primary);
490
+ max-width: 86%;
491
+ white-space: pre-wrap;
492
+ word-break: break-word;
493
+ border-radius: 22px;
494
+ padding: 10px 16px;
495
+ font-size: 16px;
496
+ line-height: 24px;
497
+ }
498
+
499
+ .messageAssistant {
500
+ align-self: flex-start;
501
+ max-width: 100%;
502
+ min-width: 0;
503
+ color: var(--dsw-alias-label-primary);
504
+ }
505
+
506
+ /* Per-assistant-message "bring whole reply to main" actions. */
507
+ .messageActions {
508
+ display: flex;
509
+ gap: 6px;
510
+ margin-top: 6px;
511
+ }
512
+
513
+ .messageInsertButton {
514
+ font-family: var(--dsw-font-family);
515
+ font-size: 12px;
516
+ line-height: 18px;
517
+ color: var(--dsw-alias-label-secondary);
518
+ background: transparent;
519
+ border: 1px solid var(--dsw-alias-border-l1);
520
+ border-radius: 999px;
521
+ padding: 2px 10px;
522
+ cursor: pointer;
523
+ }
524
+
525
+ .messageInsertButton:hover:not(:disabled) {
526
+ background: var(--dsw-alias-interactive-bg-hover);
527
+ color: var(--dsw-alias-label-primary);
528
+ }
529
+
530
+ .messageInsertButton:disabled {
531
+ cursor: default;
532
+ opacity: 0.55;
533
+ }
534
+
535
+ /* Reasoning disclosure (main-conversation Think row) */
536
+ .reasoningSummary {
537
+ min-width: 0;
538
+ color: var(--dsw-alias-label-tertiary);
539
+ text-overflow: ellipsis;
540
+ white-space: nowrap;
541
+ overflow: hidden;
542
+ font-size: 14px;
543
+ line-height: 24px;
544
+ }
545
+
546
+ .reasoningBody {
547
+ color: var(--dsw-alias-label-tertiary);
548
+ white-space: pre-wrap;
549
+ word-break: break-word;
550
+ padding: 4px 0 4px 22px;
551
+ font-size: 14px;
552
+ line-height: 24px;
553
+ }
554
+
555
+ .panelRunning {
556
+ align-self: flex-start;
557
+ display: inline-flex;
558
+ align-items: center;
559
+ gap: 6px;
560
+ color: var(--dsw-alias-label-tertiary);
561
+ font-size: 12px;
562
+ line-height: 18px;
563
+ }
564
+
565
+ .panelRunningDot {
566
+ flex: none;
567
+ width: 8px;
568
+ height: 8px;
569
+ border-radius: 50%;
570
+ background: var(--dsw-alias-state-business-primary);
571
+ animation: panelRunningPulse 1s ease-in-out infinite alternate;
572
+ }
573
+
574
+ .panelRunningClock {
575
+ color: var(--dsw-alias-label-caption);
576
+ }
577
+
578
+ @keyframes panelRunningPulse {
579
+ from { opacity: 1; }
580
+ to { opacity: 0.3; }
581
+ }
582
+
583
+ @media (prefers-reduced-motion: reduce) {
584
+ .panelRunningDot {
585
+ animation: none;
586
+ }
587
+ }
588
+
589
+ .panelError {
590
+ color: var(--dsw-alias-state-error-primary);
591
+ font-size: 12px;
592
+ line-height: 18px;
593
+ }
594
+
595
+ /* ---- Composer ---- */
596
+ .panelComposer {
597
+ flex: none;
598
+ margin: 10px 14px 14px;
599
+ display: flex;
600
+ flex-direction: column;
601
+ gap: 4px;
602
+ border: 1px solid var(--dsw-alias-border-l2-darkmode-thin);
603
+ background: var(--dsw-specific-input-major);
604
+ box-shadow: var(--dsw-shadow-lv2);
605
+ border-radius: 22px;
606
+ padding: 10px;
607
+ }
608
+
609
+ .panelToolbar {
610
+ flex: none;
611
+ display: flex;
612
+ align-items: center;
613
+ justify-content: flex-end;
614
+ gap: 4px;
615
+ min-width: 0;
616
+ }
617
+
618
+ .panelTextarea {
619
+ flex: 1;
620
+ min-width: 0;
621
+ width: 100%;
622
+ box-sizing: border-box;
623
+ resize: none;
624
+ color: var(--dsw-alias-label-primary);
625
+ caret-color: var(--dsw-alias-state-business-primary);
626
+ background: transparent;
627
+ border: none;
628
+ outline: none;
629
+ font-family: var(--dsw-font-family);
630
+ font-size: 16px;
631
+ line-height: 24px;
632
+ padding: 4px 8px;
633
+ min-height: 32px;
634
+ max-height: 160px;
635
+ }
636
+
637
+ .panelLookup {
638
+ align-self: flex-start;
639
+ display: inline-flex;
640
+ align-items: center;
641
+ gap: 6px;
642
+ max-width: 100%;
643
+ height: 24px;
644
+ padding: 0 8px;
645
+ border-radius: 24px;
646
+ font-size: 12px;
647
+ font-weight: 500;
648
+ line-height: 18px;
649
+ color: var(--dsw-alias-label-secondary);
650
+ cursor: pointer;
651
+ white-space: nowrap;
652
+ }
653
+
654
+ .panelLookup span {
655
+ min-width: 0;
656
+ overflow: hidden;
657
+ text-overflow: ellipsis;
658
+ }
659
+
660
+ .panelLookup:hover {
661
+ background: var(--dsw-alias-interactive-bg-hover);
662
+ }
663
+
664
+ /* Staged selection shown as an attachment. */
665
+ .panelAttachment {
666
+ display: flex;
667
+ align-items: center;
668
+ gap: 8px;
669
+ border: 1px solid var(--dsw-alias-border-l1);
670
+ background: var(--dsw-specific-tip);
671
+ border-radius: 10px;
672
+ padding: 6px 10px;
673
+ }
674
+
675
+ .panelAttachmentText {
676
+ flex: 1;
677
+ min-width: 0;
678
+ color: var(--dsw-alias-label-secondary);
679
+ font-size: 12px;
680
+ line-height: 18px;
681
+ white-space: nowrap;
682
+ overflow: hidden;
683
+ text-overflow: ellipsis;
684
+ }
685
+
686
+ .panelAttachmentRemove {
687
+ flex: none;
688
+ width: 20px;
689
+ height: 20px;
690
+ color: var(--dsw-alias-label-secondary);
691
+ background: transparent;
692
+ border: none;
693
+ border-radius: 999px;
694
+ cursor: pointer;
695
+ font-size: 16px;
696
+ line-height: 20px;
697
+ }
698
+
699
+ .panelAttachmentRemove:hover {
700
+ background: var(--dsw-alias-interactive-bg-hover);
701
+ color: var(--dsw-alias-label-primary);
702
+ }
703
+
704
+ .panelFooter {
705
+ flex: none;
706
+ padding: 0 14px 12px;
707
+ }
708
+
709
+ .panelDispose {
710
+ font-family: var(--dsw-font-family);
711
+ font-size: 12px;
712
+ line-height: 18px;
713
+ color: var(--dsw-alias-label-tertiary);
714
+ background: transparent;
715
+ border: none;
716
+ cursor: pointer;
717
+ padding: 4px 0;
718
+ }
719
+
720
+ .panelDispose:hover {
721
+ color: var(--dsw-alias-state-error-primary);
722
+ }
723
+
724
+ /* ---- Send / stop button (main-conversation style) ---- */
725
+ .primary {
726
+ background: var(--dsw-alias-button-info-fill);
727
+ color: #fff;
728
+ cursor: pointer;
729
+ border: none;
730
+ border-radius: 999px;
731
+ flex: none;
732
+ place-items: center;
733
+ width: 34px;
734
+ height: 34px;
735
+ transition: background-color 0.1s;
736
+ display: grid;
737
+ }
738
+
739
+ .primary:hover {
740
+ background: var(--dsw-alias-button-info-hover);
741
+ }
742
+
743
+ /* ---- Attachment rail + user-message text ---- */
744
+ .panelAttachmentRail {
745
+ flex: none;
746
+ min-width: 0;
747
+ }
748
+
749
+ .messageUserText {
750
+ white-space: pre-wrap;
751
+ word-break: break-word;
752
+ }
753
+
754
+ /* ---- Model selector (main-conversation ModelSelect) ---- */
755
+ .modelSelect {
756
+ min-width: 0;
757
+ position: relative;
758
+ }
759
+
760
+ .modelSelectTrigger {
761
+ min-width: 0;
762
+ max-width: 200px;
763
+ height: 28px;
764
+ color: var(--dsw-alias-label-secondary);
765
+ cursor: pointer;
766
+ background: transparent;
767
+ border: none;
768
+ border-radius: 24px;
769
+ outline: none;
770
+ align-items: center;
771
+ gap: 4px;
772
+ padding: 0 4px 0 8px;
773
+ font-size: 13px;
774
+ font-weight: 500;
775
+ line-height: 20px;
776
+ display: flex;
777
+ }
778
+
779
+ .modelSelectTrigger:hover:not(:disabled) {
780
+ background: var(--dsw-alias-interactive-bg-hover);
781
+ }
782
+
783
+ .modelSelectLabel {
784
+ text-overflow: ellipsis;
785
+ white-space: nowrap;
786
+ min-width: 0;
787
+ overflow: hidden;
788
+ }
789
+
790
+ .modelSelectEffort {
791
+ color: var(--dsw-alias-label-caption);
792
+ flex: none;
793
+ }
794
+
795
+ .chevronOpen {
796
+ transform: rotate(180deg);
797
+ }
798
+
799
+ .modelSelectMenu {
800
+ z-index: 30;
801
+ border: 1px solid var(--dsw-alias-border-inverted);
802
+ background: var(--dsw-specific-menu);
803
+ width: min(260px, calc(100vw - 32px));
804
+ max-height: min(360px, 100vh - 96px);
805
+ box-shadow: var(--dsw-shadow-lv3);
806
+ color: var(--dsw-alias-label-primary);
807
+ border-radius: 12px;
808
+ flex-direction: column;
809
+ padding: 4px;
810
+ display: flex;
811
+ position: absolute;
812
+ bottom: calc(100% + 8px);
813
+ right: 0;
814
+ overflow: hidden;
815
+ }
816
+
817
+ .modelCell {
818
+ width: 100%;
819
+ height: 40px;
820
+ color: var(--dsw-alias-label-primary);
821
+ cursor: pointer;
822
+ text-align: left;
823
+ background: transparent;
824
+ border: none;
825
+ border-radius: 10px;
826
+ align-items: center;
827
+ gap: 8px;
828
+ padding: 0 10px;
829
+ font-size: 14px;
830
+ line-height: 22px;
831
+ display: flex;
832
+ flex: none;
833
+ }
834
+
835
+ .modelCell:hover {
836
+ background: var(--dsw-alias-interactive-bg-hover);
837
+ }
838
+
839
+ .modelCellLabel {
840
+ text-overflow: ellipsis;
841
+ white-space: nowrap;
842
+ flex: auto;
843
+ min-width: 0;
844
+ overflow: hidden;
845
+ }
846
+
847
+ .modelCellValue {
848
+ text-overflow: ellipsis;
849
+ white-space: nowrap;
850
+ min-width: 0;
851
+ color: var(--dsw-alias-label-tertiary);
852
+ flex: 0 auto;
853
+ overflow: hidden;
854
+ }
855
+
856
+ .modelCellChevron {
857
+ color: var(--dsw-alias-label-tertiary);
858
+ flex: none;
859
+ }
860
+
861
+ .modelGroups {
862
+ min-height: 0;
863
+ overflow-y: auto;
864
+ }
865
+
866
+ .modelGroup + .modelGroup {
867
+ margin-top: 4px;
868
+ }
869
+
870
+ .modelGroupTitle {
871
+ z-index: 1;
872
+ background: var(--dsw-specific-menu);
873
+ color: var(--dsw-alias-label-tertiary);
874
+ padding: 5px 8px 3px;
875
+ font-size: 12px;
876
+ font-weight: 500;
877
+ line-height: 18px;
878
+ position: sticky;
879
+ top: 0;
880
+ }
881
+
882
+ .modelOption {
883
+ width: 100%;
884
+ min-height: 38px;
885
+ color: inherit;
886
+ text-align: left;
887
+ cursor: pointer;
888
+ background: transparent;
889
+ border: none;
890
+ border-radius: 10px;
891
+ outline: none;
892
+ align-items: center;
893
+ gap: 8px;
894
+ padding: 6px 8px;
895
+ display: flex;
896
+ }
897
+
898
+ .modelOption:hover:not(:disabled) {
899
+ background: var(--dsw-alias-interactive-bg-hover);
900
+ }
901
+
902
+ .modelOptionSelected {
903
+ background: var(--dsw-alias-interactive-bg-hover);
904
+ }
905
+
906
+ .modelOptionCopy {
907
+ flex-direction: column;
908
+ flex: 1;
909
+ min-width: 0;
910
+ display: flex;
911
+ }
912
+
913
+ .modelName {
914
+ color: inherit;
915
+ text-overflow: ellipsis;
916
+ white-space: nowrap;
917
+ font-size: 14px;
918
+ font-weight: 500;
919
+ line-height: 20px;
920
+ overflow: hidden;
921
+ }
922
+
923
+ .modelDescription {
924
+ color: var(--dsw-alias-label-tertiary);
925
+ text-overflow: ellipsis;
926
+ white-space: nowrap;
927
+ font-size: 12px;
928
+ line-height: 18px;
929
+ overflow: hidden;
930
+ }
931
+
932
+ .modelCheck {
933
+ color: var(--dsw-alias-label-primary);
934
+ flex: 0 0 18px;
935
+ place-items: center;
936
+ display: grid;
937
+ }
938
+
939
+ .modelEmpty {
940
+ color: var(--dsw-alias-label-tertiary);
941
+ padding: 10px;
942
+ font-size: 13px;
943
+ line-height: 20px;
944
+ }
945
+
946
+ /* ---- Settings section ---- */
947
+ .settingsSection {
948
+ display: flex;
949
+ flex-direction: column;
950
+ gap: 8px;
951
+ }
952
+
953
+ .settingsRow {
954
+ display: flex;
955
+ align-items: center;
956
+ justify-content: space-between;
957
+ gap: 12px;
958
+ border: 1px solid var(--dsw-alias-border-l1);
959
+ background: var(--dsw-alias-bg-layer-2);
960
+ border-radius: 12px;
961
+ padding: 10px 12px;
962
+ cursor: pointer;
963
+ }
964
+
965
+ .settingsRowText {
966
+ flex: 1;
967
+ min-width: 0;
968
+ display: flex;
969
+ flex-direction: column;
970
+ gap: 2px;
971
+ }
972
+
973
+ .settingsRowTitle {
974
+ color: var(--dsw-alias-label-primary);
975
+ font-size: 14px;
976
+ line-height: 20px;
977
+ }
978
+
979
+ .settingsRowDesc {
980
+ color: var(--dsw-alias-label-tertiary);
981
+ font-size: 12px;
982
+ line-height: 18px;
983
+ }
984
+
985
+ .settingsToggle {
986
+ flex: none;
987
+ width: 16px;
988
+ height: 16px;
989
+ accent-color: var(--dsw-alias-state-business-primary);
990
+ }
991
+
992
+ .settingsBringMode {
993
+ display: flex;
994
+ flex-direction: column;
995
+ gap: 8px;
996
+ }
997
+
998
+ .settingsBringOption {
999
+ display: flex;
1000
+ align-items: flex-start;
1001
+ gap: 12px;
1002
+ border: 1px solid var(--dsw-alias-border-l1);
1003
+ background: var(--dsw-alias-bg-layer-2);
1004
+ border-radius: 12px;
1005
+ padding: 10px 12px;
1006
+ cursor: pointer;
1007
+ }
1008
+
1009
+ .settingsBringOptionActive {
1010
+ border-color: var(--dsw-alias-state-business-primary);
1011
+ }
1012
+
1013
+ .settingsPromptInput {
1014
+ box-sizing: border-box;
1015
+ width: 100%;
1016
+ min-height: 72px;
1017
+ resize: vertical;
1018
+ color: var(--dsw-alias-label-primary);
1019
+ background: var(--dsw-specific-input-major);
1020
+ border: 1px solid var(--dsw-alias-border-l2);
1021
+ border-radius: 10px;
1022
+ padding: 8px 10px;
1023
+ font-family: var(--dsw-font-family);
1024
+ font-size: 13px;
1025
+ line-height: 20px;
1026
+ }
1027
+
1028
+ .settingsPromptInput:focus {
1029
+ outline: 2px solid var(--dsw-alias-border-l3);
1030
+ outline-offset: -1px;
1031
+ }
1032
+