@yadsh/dsh-qa-surface 0.15.2 → 0.15.4

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 (62) hide show
  1. package/README.md +49 -8
  2. package/lib/access/model.js +15 -0
  3. package/lib/access/model.js.map +1 -1
  4. package/lib/access/service.js +56 -16
  5. package/lib/access/service.js.map +1 -1
  6. package/lib/approvals.js +42 -1
  7. package/lib/approvals.js.map +1 -1
  8. package/lib/client/QaSessionController.js +103 -3
  9. package/lib/client/QaSessionController.js.map +1 -1
  10. package/lib/client/QaSurface.js +6 -1
  11. package/lib/client/QaSurface.js.map +1 -1
  12. package/lib/client/QaTranscriptAdapter.js +33 -3
  13. package/lib/client/QaTranscriptAdapter.js.map +1 -1
  14. package/lib/client/components/QaChangelog.js +31 -0
  15. package/lib/client/components/QaChangelog.js.map +1 -1
  16. package/lib/client/components/QaComposer.js +3 -0
  17. package/lib/client/components/QaComposer.js.map +1 -1
  18. package/lib/client/components/QaHeader.js +29 -3
  19. package/lib/client/components/QaHeader.js.map +1 -1
  20. package/lib/client/components/QaRightRail.js +20 -1
  21. package/lib/client/components/QaRightRail.js.map +1 -1
  22. package/lib/client/components/QaSidebar.js +12 -2
  23. package/lib/client/components/QaSidebar.js.map +1 -1
  24. package/lib/client/components/QaSourcesPanel.js +1 -1
  25. package/lib/client/components/QaSourcesPanel.js.map +1 -1
  26. package/lib/client/components/QaWorkGroup.js +13 -7
  27. package/lib/client/components/QaWorkGroup.js.map +1 -1
  28. package/lib/client/components/QaWorkspaceBrowser.js +5 -1
  29. package/lib/client/components/QaWorkspaceBrowser.js.map +1 -1
  30. package/lib/client/settings/styles.js +16 -10
  31. package/lib/client/settings/styles.js.map +1 -1
  32. package/lib/client/slash/SlashPalette.js +3 -1
  33. package/lib/client/slash/SlashPalette.js.map +1 -1
  34. package/lib/client/styles.js +31 -15
  35. package/lib/client/styles.js.map +1 -1
  36. package/lib/client.js +343 -153
  37. package/lib/client.js.map +1 -1
  38. package/lib/enforcement/skill-policy.js +2 -1
  39. package/lib/enforcement/skill-policy.js.map +1 -1
  40. package/lib/index.js +11 -9
  41. package/lib/index.js.map +1 -1
  42. package/lib/qa-tools/file-delete-gate.js +35 -10
  43. package/lib/qa-tools/file-delete-gate.js.map +1 -1
  44. package/lib/qa-tools/file-delete.js +1 -1
  45. package/lib/qa-tools/file-delete.js.map +1 -1
  46. package/lib/slash/catalog.js.map +1 -1
  47. package/lib/typert.host.js +75 -75
  48. package/lib/typert.remote-client.js +75 -75
  49. package/lib/types/access/model.d.ts +13 -0
  50. package/lib/types/access/service.d.ts +26 -0
  51. package/lib/types/approvals.d.ts +18 -1
  52. package/lib/types/client/QaSessionController.d.ts +23 -0
  53. package/lib/types/client/components/QaHeader.d.ts +10 -1
  54. package/lib/types/client/components/QaRightRail.d.ts +7 -1
  55. package/lib/types/client/components/QaSidebar.d.ts +5 -0
  56. package/lib/types/client/components/QaWorkGroup.d.ts +5 -2
  57. package/lib/types/client/settings/styles.d.ts +6 -0
  58. package/lib/types/index.d.ts +6 -4
  59. package/lib/types/qa-tools/file-delete-gate.d.ts +24 -7
  60. package/lib/types/slash/catalog.d.ts +5 -0
  61. package/lib/types/types.d.ts +5 -2
  62. package/package.json +4 -4
package/lib/client.js CHANGED
@@ -8721,7 +8721,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8721
8721
  },
8722
8722
  sourceLocation: {
8723
8723
  "file": "packages/dsh-qa-surface/src/index.ts",
8724
- "line": 1029,
8724
+ "line": 1034,
8725
8725
  "column": 9
8726
8726
  }
8727
8727
  },
@@ -8757,7 +8757,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8757
8757
  },
8758
8758
  sourceLocation: {
8759
8759
  "file": "packages/dsh-qa-surface/src/index.ts",
8760
- "line": 1040,
8760
+ "line": 1045,
8761
8761
  "column": 3
8762
8762
  }
8763
8763
  },
@@ -8784,7 +8784,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8784
8784
  },
8785
8785
  sourceLocation: {
8786
8786
  "file": "packages/dsh-qa-surface/src/index.ts",
8787
- "line": 1014,
8787
+ "line": 1019,
8788
8788
  "column": 3
8789
8789
  }
8790
8790
  },
@@ -8833,7 +8833,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8833
8833
  },
8834
8834
  sourceLocation: {
8835
8835
  "file": "packages/dsh-qa-surface/src/index.ts",
8836
- "line": 1054,
8836
+ "line": 1059,
8837
8837
  "column": 3
8838
8838
  }
8839
8839
  },
@@ -8869,7 +8869,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8869
8869
  },
8870
8870
  sourceLocation: {
8871
8871
  "file": "packages/dsh-qa-surface/src/index.ts",
8872
- "line": 1020,
8872
+ "line": 1025,
8873
8873
  "column": 3
8874
8874
  }
8875
8875
  },
@@ -8905,7 +8905,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8905
8905
  },
8906
8906
  sourceLocation: {
8907
8907
  "file": "packages/dsh-qa-surface/src/index.ts",
8908
- "line": 1099,
8908
+ "line": 1104,
8909
8909
  "column": 3
8910
8910
  }
8911
8911
  },
@@ -8954,7 +8954,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8954
8954
  },
8955
8955
  sourceLocation: {
8956
8956
  "file": "packages/dsh-qa-surface/src/index.ts",
8957
- "line": 1076,
8957
+ "line": 1081,
8958
8958
  "column": 3
8959
8959
  }
8960
8960
  },
@@ -8990,7 +8990,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8990
8990
  },
8991
8991
  sourceLocation: {
8992
8992
  "file": "packages/dsh-qa-surface/src/index.ts",
8993
- "line": 1066,
8993
+ "line": 1071,
8994
8994
  "column": 3
8995
8995
  }
8996
8996
  },
@@ -9026,7 +9026,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9026
9026
  },
9027
9027
  sourceLocation: {
9028
9028
  "file": "packages/dsh-qa-surface/src/index.ts",
9029
- "line": 1088,
9029
+ "line": 1093,
9030
9030
  "column": 3
9031
9031
  }
9032
9032
  },
@@ -9075,7 +9075,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9075
9075
  },
9076
9076
  sourceLocation: {
9077
9077
  "file": "packages/dsh-qa-surface/src/index.ts",
9078
- "line": 1047,
9078
+ "line": 1052,
9079
9079
  "column": 3
9080
9080
  }
9081
9081
  },
@@ -9124,7 +9124,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9124
9124
  },
9125
9125
  sourceLocation: {
9126
9126
  "file": "packages/dsh-qa-surface/src/index.ts",
9127
- "line": 735,
9127
+ "line": 740,
9128
9128
  "column": 3
9129
9129
  }
9130
9130
  },
@@ -9160,7 +9160,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9160
9160
  },
9161
9161
  sourceLocation: {
9162
9162
  "file": "packages/dsh-qa-surface/src/index.ts",
9163
- "line": 769,
9163
+ "line": 774,
9164
9164
  "column": 3
9165
9165
  }
9166
9166
  },
@@ -9196,7 +9196,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9196
9196
  },
9197
9197
  sourceLocation: {
9198
9198
  "file": "packages/dsh-qa-surface/src/index.ts",
9199
- "line": 856,
9199
+ "line": 861,
9200
9200
  "column": 3
9201
9201
  }
9202
9202
  },
@@ -9223,7 +9223,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9223
9223
  },
9224
9224
  sourceLocation: {
9225
9225
  "file": "packages/dsh-qa-surface/src/index.ts",
9226
- "line": 790,
9226
+ "line": 795,
9227
9227
  "column": 3
9228
9228
  }
9229
9229
  },
@@ -9250,7 +9250,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9250
9250
  },
9251
9251
  sourceLocation: {
9252
9252
  "file": "packages/dsh-qa-surface/src/index.ts",
9253
- "line": 843,
9253
+ "line": 848,
9254
9254
  "column": 3
9255
9255
  }
9256
9256
  },
@@ -9286,7 +9286,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9286
9286
  },
9287
9287
  sourceLocation: {
9288
9288
  "file": "packages/dsh-qa-surface/src/index.ts",
9289
- "line": 729,
9289
+ "line": 734,
9290
9290
  "column": 3
9291
9291
  }
9292
9292
  },
@@ -9313,7 +9313,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9313
9313
  },
9314
9314
  sourceLocation: {
9315
9315
  "file": "packages/dsh-qa-surface/src/index.ts",
9316
- "line": 780,
9316
+ "line": 785,
9317
9317
  "column": 3
9318
9318
  }
9319
9319
  },
@@ -9349,7 +9349,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9349
9349
  },
9350
9350
  sourceLocation: {
9351
9351
  "file": "packages/dsh-qa-surface/src/index.ts",
9352
- "line": 724,
9352
+ "line": 729,
9353
9353
  "column": 3
9354
9354
  }
9355
9355
  },
@@ -9376,7 +9376,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9376
9376
  },
9377
9377
  sourceLocation: {
9378
9378
  "file": "packages/dsh-qa-surface/src/index.ts",
9379
- "line": 753,
9379
+ "line": 758,
9380
9380
  "column": 3
9381
9381
  }
9382
9382
  },
@@ -9412,7 +9412,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9412
9412
  },
9413
9413
  sourceLocation: {
9414
9414
  "file": "packages/dsh-qa-surface/src/index.ts",
9415
- "line": 869,
9415
+ "line": 874,
9416
9416
  "column": 3
9417
9417
  }
9418
9418
  },
@@ -9448,7 +9448,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9448
9448
  },
9449
9449
  sourceLocation: {
9450
9450
  "file": "packages/dsh-qa-surface/src/index.ts",
9451
- "line": 830,
9451
+ "line": 835,
9452
9452
  "column": 3
9453
9453
  }
9454
9454
  },
@@ -9484,7 +9484,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9484
9484
  },
9485
9485
  sourceLocation: {
9486
9486
  "file": "packages/dsh-qa-surface/src/index.ts",
9487
- "line": 803,
9487
+ "line": 808,
9488
9488
  "column": 3
9489
9489
  }
9490
9490
  },
@@ -9520,7 +9520,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9520
9520
  },
9521
9521
  sourceLocation: {
9522
9522
  "file": "packages/dsh-qa-surface/src/index.ts",
9523
- "line": 816,
9523
+ "line": 821,
9524
9524
  "column": 3
9525
9525
  }
9526
9526
  },
@@ -9547,7 +9547,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9547
9547
  },
9548
9548
  sourceLocation: {
9549
9549
  "file": "packages/dsh-qa-surface/src/index.ts",
9550
- "line": 759,
9550
+ "line": 764,
9551
9551
  "column": 3
9552
9552
  }
9553
9553
  },
@@ -9606,7 +9606,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9606
9606
  },
9607
9607
  sourceLocation: {
9608
9608
  "file": "packages/dsh-qa-surface/src/index.ts",
9609
- "line": 1471,
9609
+ "line": 1476,
9610
9610
  "column": 3
9611
9611
  }
9612
9612
  },
@@ -9642,7 +9642,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9642
9642
  },
9643
9643
  sourceLocation: {
9644
9644
  "file": "packages/dsh-qa-surface/src/index.ts",
9645
- "line": 1351,
9645
+ "line": 1356,
9646
9646
  "column": 3
9647
9647
  }
9648
9648
  },
@@ -9702,7 +9702,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9702
9702
  },
9703
9703
  sourceLocation: {
9704
9704
  "file": "packages/dsh-qa-surface/src/index.ts",
9705
- "line": 1331,
9705
+ "line": 1336,
9706
9706
  "column": 3
9707
9707
  }
9708
9708
  },
@@ -9738,7 +9738,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9738
9738
  },
9739
9739
  sourceLocation: {
9740
9740
  "file": "packages/dsh-qa-surface/src/index.ts",
9741
- "line": 1366,
9741
+ "line": 1371,
9742
9742
  "column": 3
9743
9743
  }
9744
9744
  },
@@ -9797,7 +9797,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9797
9797
  },
9798
9798
  sourceLocation: {
9799
9799
  "file": "packages/dsh-qa-surface/src/index.ts",
9800
- "line": 1376,
9800
+ "line": 1381,
9801
9801
  "column": 3
9802
9802
  }
9803
9803
  },
@@ -9833,7 +9833,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9833
9833
  },
9834
9834
  sourceLocation: {
9835
9835
  "file": "packages/dsh-qa-surface/src/index.ts",
9836
- "line": 1413,
9836
+ "line": 1418,
9837
9837
  "column": 3
9838
9838
  }
9839
9839
  },
@@ -9892,7 +9892,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9892
9892
  },
9893
9893
  sourceLocation: {
9894
9894
  "file": "packages/dsh-qa-surface/src/index.ts",
9895
- "line": 1225,
9895
+ "line": 1230,
9896
9896
  "column": 3
9897
9897
  }
9898
9898
  },
@@ -9941,7 +9941,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9941
9941
  },
9942
9942
  sourceLocation: {
9943
9943
  "file": "packages/dsh-qa-surface/src/index.ts",
9944
- "line": 1238,
9944
+ "line": 1243,
9945
9945
  "column": 3
9946
9946
  }
9947
9947
  },
@@ -10010,7 +10010,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10010
10010
  },
10011
10011
  sourceLocation: {
10012
10012
  "file": "packages/dsh-qa-surface/src/index.ts",
10013
- "line": 1211,
10013
+ "line": 1216,
10014
10014
  "column": 3
10015
10015
  }
10016
10016
  },
@@ -10037,7 +10037,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10037
10037
  },
10038
10038
  sourceLocation: {
10039
10039
  "file": "packages/dsh-qa-surface/src/index.ts",
10040
- "line": 1205,
10040
+ "line": 1210,
10041
10041
  "column": 3
10042
10042
  }
10043
10043
  },
@@ -10086,7 +10086,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10086
10086
  },
10087
10087
  sourceLocation: {
10088
10088
  "file": "packages/dsh-qa-surface/src/index.ts",
10089
- "line": 1256,
10089
+ "line": 1261,
10090
10090
  "column": 3
10091
10091
  }
10092
10092
  },
@@ -10114,7 +10114,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10114
10114
  },
10115
10115
  sourceLocation: {
10116
10116
  "file": "packages/dsh-qa-surface/src/index.ts",
10117
- "line": 1464,
10117
+ "line": 1469,
10118
10118
  "column": 3
10119
10119
  }
10120
10120
  },
@@ -10142,7 +10142,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10142
10142
  },
10143
10143
  sourceLocation: {
10144
10144
  "file": "packages/dsh-qa-surface/src/index.ts",
10145
- "line": 1275,
10145
+ "line": 1280,
10146
10146
  "column": 3
10147
10147
  }
10148
10148
  },
@@ -10169,7 +10169,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10169
10169
  },
10170
10170
  sourceLocation: {
10171
10171
  "file": "packages/dsh-qa-surface/src/index.ts",
10172
- "line": 1311,
10172
+ "line": 1316,
10173
10173
  "column": 3
10174
10174
  }
10175
10175
  },
@@ -10218,7 +10218,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10218
10218
  },
10219
10219
  sourceLocation: {
10220
10220
  "file": "packages/dsh-qa-surface/src/index.ts",
10221
- "line": 1441,
10221
+ "line": 1446,
10222
10222
  "column": 3
10223
10223
  }
10224
10224
  },
@@ -10277,7 +10277,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10277
10277
  },
10278
10278
  sourceLocation: {
10279
10279
  "file": "packages/dsh-qa-surface/src/index.ts",
10280
- "line": 1397,
10280
+ "line": 1402,
10281
10281
  "column": 3
10282
10282
  }
10283
10283
  },
@@ -10326,7 +10326,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10326
10326
  },
10327
10327
  sourceLocation: {
10328
10328
  "file": "packages/dsh-qa-surface/src/index.ts",
10329
- "line": 1320,
10329
+ "line": 1325,
10330
10330
  "column": 3
10331
10331
  }
10332
10332
  },
@@ -10376,7 +10376,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10376
10376
  },
10377
10377
  sourceLocation: {
10378
10378
  "file": "packages/dsh-qa-surface/src/index.ts",
10379
- "line": 1423,
10379
+ "line": 1428,
10380
10380
  "column": 3
10381
10381
  }
10382
10382
  },
@@ -10412,7 +10412,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10412
10412
  },
10413
10413
  sourceLocation: {
10414
10414
  "file": "packages/dsh-qa-surface/src/index.ts",
10415
- "line": 1456,
10415
+ "line": 1461,
10416
10416
  "column": 3
10417
10417
  }
10418
10418
  },
@@ -10461,7 +10461,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10461
10461
  },
10462
10462
  sourceLocation: {
10463
10463
  "file": "packages/dsh-qa-surface/src/index.ts",
10464
- "line": 1129,
10464
+ "line": 1134,
10465
10465
  "column": 3
10466
10466
  }
10467
10467
  },
@@ -10520,7 +10520,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10520
10520
  },
10521
10521
  sourceLocation: {
10522
10522
  "file": "packages/dsh-qa-surface/src/index.ts",
10523
- "line": 1157,
10523
+ "line": 1162,
10524
10524
  "column": 3
10525
10525
  }
10526
10526
  },
@@ -10556,7 +10556,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10556
10556
  },
10557
10557
  sourceLocation: {
10558
10558
  "file": "packages/dsh-qa-surface/src/index.ts",
10559
- "line": 1120,
10559
+ "line": 1125,
10560
10560
  "column": 3
10561
10561
  }
10562
10562
  },
@@ -10615,7 +10615,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10615
10615
  },
10616
10616
  sourceLocation: {
10617
10617
  "file": "packages/dsh-qa-surface/src/index.ts",
10618
- "line": 1144,
10618
+ "line": 1149,
10619
10619
  "column": 3
10620
10620
  }
10621
10621
  },
@@ -10651,7 +10651,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10651
10651
  },
10652
10652
  sourceLocation: {
10653
10653
  "file": "packages/dsh-qa-surface/src/index.ts",
10654
- "line": 1183,
10654
+ "line": 1188,
10655
10655
  "column": 9
10656
10656
  }
10657
10657
  },
@@ -10710,7 +10710,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10710
10710
  },
10711
10711
  sourceLocation: {
10712
10712
  "file": "packages/dsh-qa-surface/src/index.ts",
10713
- "line": 1170,
10713
+ "line": 1175,
10714
10714
  "column": 3
10715
10715
  }
10716
10716
  },
@@ -10759,7 +10759,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10759
10759
  },
10760
10760
  sourceLocation: {
10761
10761
  "file": "packages/dsh-qa-surface/src/index.ts",
10762
- "line": 1300,
10762
+ "line": 1305,
10763
10763
  "column": 3
10764
10764
  }
10765
10765
  },
@@ -10795,7 +10795,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10795
10795
  },
10796
10796
  sourceLocation: {
10797
10797
  "file": "packages/dsh-qa-surface/src/index.ts",
10798
- "line": 1294,
10798
+ "line": 1299,
10799
10799
  "column": 3
10800
10800
  }
10801
10801
  },
@@ -10854,7 +10854,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10854
10854
  },
10855
10855
  sourceLocation: {
10856
10856
  "file": "packages/dsh-qa-surface/src/index.ts",
10857
- "line": 1282,
10857
+ "line": 1287,
10858
10858
  "column": 3
10859
10859
  }
10860
10860
  },
@@ -10913,7 +10913,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10913
10913
  },
10914
10914
  sourceLocation: {
10915
10915
  "file": "packages/dsh-qa-surface/src/index.ts",
10916
- "line": 1550,
10916
+ "line": 1555,
10917
10917
  "column": 9
10918
10918
  }
10919
10919
  },
@@ -10972,7 +10972,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10972
10972
  },
10973
10973
  sourceLocation: {
10974
10974
  "file": "packages/dsh-qa-surface/src/index.ts",
10975
- "line": 1579,
10975
+ "line": 1584,
10976
10976
  "column": 9
10977
10977
  }
10978
10978
  },
@@ -11021,7 +11021,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11021
11021
  },
11022
11022
  sourceLocation: {
11023
11023
  "file": "packages/dsh-qa-surface/src/index.ts",
11024
- "line": 1591,
11024
+ "line": 1596,
11025
11025
  "column": 9
11026
11026
  }
11027
11027
  },
@@ -11070,7 +11070,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11070
11070
  },
11071
11071
  sourceLocation: {
11072
11072
  "file": "packages/dsh-qa-surface/src/index.ts",
11073
- "line": 915,
11073
+ "line": 920,
11074
11074
  "column": 9
11075
11075
  }
11076
11076
  },
@@ -11088,7 +11088,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11088
11088
  },
11089
11089
  sourceLocation: {
11090
11090
  "file": "packages/dsh-qa-surface/src/index.ts",
11091
- "line": 884,
11091
+ "line": 889,
11092
11092
  "column": 3
11093
11093
  }
11094
11094
  },
@@ -11137,7 +11137,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11137
11137
  },
11138
11138
  sourceLocation: {
11139
11139
  "file": "packages/dsh-qa-surface/src/index.ts",
11140
- "line": 1659,
11140
+ "line": 1664,
11141
11141
  "column": 9
11142
11142
  }
11143
11143
  },
@@ -11173,7 +11173,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11173
11173
  },
11174
11174
  sourceLocation: {
11175
11175
  "file": "packages/dsh-qa-surface/src/index.ts",
11176
- "line": 1536,
11176
+ "line": 1541,
11177
11177
  "column": 9
11178
11178
  }
11179
11179
  },
@@ -11209,7 +11209,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11209
11209
  },
11210
11210
  sourceLocation: {
11211
11211
  "file": "packages/dsh-qa-surface/src/index.ts",
11212
- "line": 1565,
11212
+ "line": 1570,
11213
11213
  "column": 9
11214
11214
  }
11215
11215
  },
@@ -11258,7 +11258,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11258
11258
  },
11259
11259
  sourceLocation: {
11260
11260
  "file": "packages/dsh-qa-surface/src/index.ts",
11261
- "line": 1720,
11261
+ "line": 1725,
11262
11262
  "column": 9
11263
11263
  }
11264
11264
  },
@@ -11276,7 +11276,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11276
11276
  },
11277
11277
  sourceLocation: {
11278
11278
  "file": "packages/dsh-qa-surface/src/index.ts",
11279
- "line": 902,
11279
+ "line": 907,
11280
11280
  "column": 3
11281
11281
  }
11282
11282
  },
@@ -11325,7 +11325,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11325
11325
  },
11326
11326
  sourceLocation: {
11327
11327
  "file": "packages/dsh-qa-surface/src/index.ts",
11328
- "line": 1610,
11328
+ "line": 1615,
11329
11329
  "column": 9
11330
11330
  }
11331
11331
  },
@@ -11374,7 +11374,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11374
11374
  },
11375
11375
  sourceLocation: {
11376
11376
  "file": "packages/dsh-qa-surface/src/index.ts",
11377
- "line": 1686,
11377
+ "line": 1691,
11378
11378
  "column": 9
11379
11379
  }
11380
11380
  },
@@ -11410,7 +11410,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11410
11410
  },
11411
11411
  sourceLocation: {
11412
11412
  "file": "packages/dsh-qa-surface/src/index.ts",
11413
- "line": 1484,
11413
+ "line": 1489,
11414
11414
  "column": 9
11415
11415
  }
11416
11416
  },
@@ -11446,7 +11446,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11446
11446
  },
11447
11447
  sourceLocation: {
11448
11448
  "file": "packages/dsh-qa-surface/src/index.ts",
11449
- "line": 1790,
11449
+ "line": 1795,
11450
11450
  "column": 3
11451
11451
  }
11452
11452
  },
@@ -11482,7 +11482,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11482
11482
  },
11483
11483
  sourceLocation: {
11484
11484
  "file": "packages/dsh-qa-surface/src/index.ts",
11485
- "line": 1784,
11485
+ "line": 1789,
11486
11486
  "column": 3
11487
11487
  }
11488
11488
  },
@@ -11509,7 +11509,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11509
11509
  },
11510
11510
  sourceLocation: {
11511
11511
  "file": "packages/dsh-qa-surface/src/index.ts",
11512
- "line": 1778,
11512
+ "line": 1783,
11513
11513
  "column": 3
11514
11514
  }
11515
11515
  },
@@ -11558,7 +11558,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11558
11558
  },
11559
11559
  sourceLocation: {
11560
11560
  "file": "packages/dsh-qa-surface/src/index.ts",
11561
- "line": 1809,
11561
+ "line": 1814,
11562
11562
  "column": 3
11563
11563
  }
11564
11564
  },
@@ -11585,7 +11585,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11585
11585
  },
11586
11586
  sourceLocation: {
11587
11587
  "file": "packages/dsh-qa-surface/src/index.ts",
11588
- "line": 1835,
11588
+ "line": 1840,
11589
11589
  "column": 3
11590
11590
  }
11591
11591
  },
@@ -11634,7 +11634,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11634
11634
  },
11635
11635
  sourceLocation: {
11636
11636
  "file": "packages/dsh-qa-surface/src/index.ts",
11637
- "line": 1799,
11637
+ "line": 1804,
11638
11638
  "column": 3
11639
11639
  }
11640
11640
  },
@@ -11683,7 +11683,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11683
11683
  },
11684
11684
  sourceLocation: {
11685
11685
  "file": "packages/dsh-qa-surface/src/index.ts",
11686
- "line": 1822,
11686
+ "line": 1827,
11687
11687
  "column": 3
11688
11688
  }
11689
11689
  },
@@ -11719,7 +11719,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11719
11719
  },
11720
11720
  sourceLocation: {
11721
11721
  "file": "packages/dsh-qa-surface/src/index.ts",
11722
- "line": 1852,
11722
+ "line": 1857,
11723
11723
  "column": 3
11724
11724
  }
11725
11725
  },
@@ -11778,7 +11778,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11778
11778
  },
11779
11779
  sourceLocation: {
11780
11780
  "file": "packages/dsh-qa-surface/src/index.ts",
11781
- "line": 1867,
11781
+ "line": 1872,
11782
11782
  "column": 3
11783
11783
  }
11784
11784
  },
@@ -11814,7 +11814,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11814
11814
  },
11815
11815
  sourceLocation: {
11816
11816
  "file": "packages/dsh-qa-surface/src/index.ts",
11817
- "line": 1523,
11817
+ "line": 1528,
11818
11818
  "column": 9
11819
11819
  }
11820
11820
  }
@@ -16342,6 +16342,12 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
16342
16342
  */
16343
16343
  const QA_REGENERATE_MARKER = "Перегенерируй свой предыдущий ответ — дай новый вариант, не повторяя предыдущий.";
16344
16344
  /**
16345
+ * Terminal row of a turn a person stopped. "Готово" claims a complete answer,
16346
+ * and a stopped turn commits a prefix instead, so the row says both what
16347
+ * happened and what the reader is holding.
16348
+ */
16349
+ const QA_TURN_STOPPED_COPY = "Ход остановлен: ответ неполный. Отправь запрос ещё раз, чтобы получить ответ целиком.";
16350
+ /**
16345
16351
  * Durable image references carried by user content. The core ContentBlock
16346
16352
  * vocabulary is not installed client-side, so the shape is matched
16347
16353
  * structurally against the host contract ({type:"image", attachment:{...}}).
@@ -16431,6 +16437,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
16431
16437
  }
16432
16438
  function collectAssistant(node, turns, toolHeads, showReasoning, workspaceRoot) {
16433
16439
  const turn = getTurn(turns, node.turn);
16440
+ if (node.interrupted === true) turn.stoppedAt = node.seq;
16434
16441
  const text = visibleAssistantText(node.blocks, workspaceRoot);
16435
16442
  if (text !== "") turn.text.push({
16436
16443
  id: `assistant:${node.messageId ?? node.seq}`,
@@ -16538,6 +16545,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
16538
16545
  function emitTurn(legacy, running, turn, output, erroredCode) {
16539
16546
  const timing = legacy.turnTimings.get(turn.turn);
16540
16547
  const completed = timing?.endTime !== void 0 || legacy.turnEnds.has(turn.turn);
16548
+ const stoppedAt = erroredCode === void 0 ? turn.stoppedAt : void 0;
16541
16549
  const sortedText = [...turn.text].sort((left, right) => left.order - right.order);
16542
16550
  const partial = sortedText.find((message) => message.status === "streaming");
16543
16551
  const committed = sortedText.filter((message) => message.status === "committed");
@@ -16562,7 +16570,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
16562
16570
  id: `work:${turn.turn}`,
16563
16571
  role: "work",
16564
16572
  turn: turn.turn,
16565
- status: erroredCode !== void 0 ? "error" : completed || !running ? "complete" : "running",
16573
+ status: erroredCode !== void 0 ? "error" : stoppedAt !== void 0 ? "stopped" : completed || !running ? "complete" : "running",
16566
16574
  ...timing?.startTime === void 0 ? {} : { startedAt: timing.startTime },
16567
16575
  ...timing?.endTime === void 0 ? {} : { endedAt: timing.endTime },
16568
16576
  items
@@ -16595,6 +16603,15 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
16595
16603
  ...turn.artifacts.length === 0 ? {} : { artifacts: turn.artifacts }
16596
16604
  }
16597
16605
  });
16606
+ if (stoppedAt !== void 0) output.push({
16607
+ order: stoppedAt + .5,
16608
+ message: {
16609
+ id: `turn-stopped:${turn.turn}`,
16610
+ role: "system",
16611
+ text: QA_TURN_STOPPED_COPY,
16612
+ status: "info"
16613
+ }
16614
+ });
16598
16615
  }
16599
16616
  /** Project end-user messages plus optional operator-approved work detail. */
16600
16617
  function projectTranscript(snapshot, options = {}) {
@@ -16926,6 +16943,17 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
16926
16943
  */
16927
16944
  const SLASH_CATALOG_STALE_MS = 3e3;
16928
16945
  /**
16946
+ * How long a refused retain waits for its row to come into this browser's
16947
+ * Session catalog. Short on purpose, and shorter than the adoption timeout: the
16948
+ * row arrives either as a Host push or as the answer of the one pull asked for
16949
+ * here, so it is a round-trip away — while a whole `timeoutMs` of patience
16950
+ * would stack a second window onto the waits that follow and hold a chat that
16951
+ * never opens on screen for two of them. A row that misses this window loses
16952
+ * the chat, and the plate's «Повторить» re-runs the adoption on a catalog that
16953
+ * has had the pull.
16954
+ */
16955
+ const CATALOG_ROW_PATIENCE_MS = 5e3;
16956
+ /**
16929
16957
  * Spacing of the parked-request poll. A request is answered by a person, so a
16930
16958
  * second of latency is invisible; the poll only runs while a turn runs.
16931
16959
  */
@@ -17995,7 +18023,15 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
17995
18023
  */
17996
18024
  async bind(id, options) {
17997
18025
  const { operation, report = true, attest = true, track = true, allowCompatibilityReadOnly = false } = options;
17998
- const reference = this.sessions.retain(id, { source: QA_SURFACE_SESSION_SOURCE });
18026
+ const retainAttemptedAt = Date.now();
18027
+ let reference;
18028
+ try {
18029
+ reference = this.sessions.retain(id, { source: QA_SURFACE_SESSION_SOURCE });
18030
+ } catch (error) {
18031
+ if (this.catalogLists(id)) throw error;
18032
+ if (!await this.awaitCatalogRow(id, retainAttemptedAt, operation, error)) return false;
18033
+ reference = this.sessions.retain(id, { source: QA_SURFACE_SESSION_SOURCE });
18034
+ }
17999
18035
  let binding = this.sessions.binding(id);
18000
18036
  try {
18001
18037
  if (binding === void 0) {
@@ -18063,6 +18099,53 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
18063
18099
  return true;
18064
18100
  }
18065
18101
  /**
18102
+ * Whether this browser's Session catalog names one id. The Host answers a
18103
+ * retain from exactly this set, so a refusal of a listed session is a refusal
18104
+ * of a session it knows — never the race this adoption can wait out.
18105
+ */
18106
+ catalogLists(id) {
18107
+ return Object.hasOwn(this.sessions.list.getSnapshot().byId, id);
18108
+ }
18109
+ /**
18110
+ * Wait for this browser's Session catalog to come to know one id, after
18111
+ * {@link bind} was refused a reference to it, and answer whether the chat on
18112
+ * screen still belongs to the adoption that asked (`false` — it moved on, and
18113
+ * nothing is retained). Only an id the catalog does not name reaches here: a
18114
+ * refusal of a session it already lists is not this race and goes back as it
18115
+ * came, so there is always a row to wait for. A refusal is only final once
18116
+ * that row has had its chance: this is the one window where the race is
18117
+ * repairable rather than reportable, so the failure the caller reads stays the
18118
+ * Host's own refusal, not a timeout nobody asked for.
18119
+ *
18120
+ * Both timestamps are logged because the race is intermittent and the stand
18121
+ * keeps no other trace of it: the server never sees a retain, so its journal
18122
+ * cannot say which chat lost the create, and the next round needs the id and
18123
+ * the two moments to line this up with its own observations.
18124
+ */
18125
+ async awaitCatalogRow(id, retainAttemptedAt, operation, failure) {
18126
+ if (this.disposed || operation !== this.generation) return false;
18127
+ console.warn("dsh-qa-surface: sessions.retain raced the session catalog", {
18128
+ sessionId: id,
18129
+ retainAttemptedAt: new Date(retainAttemptedAt).toISOString()
18130
+ });
18131
+ this.sessions.refresh().catch((cause) => {
18132
+ console.warn("dsh-qa-surface: session catalog refresh refused", {
18133
+ sessionId: id,
18134
+ cause: cause instanceof Error ? cause.message : String(cause)
18135
+ });
18136
+ });
18137
+ try {
18138
+ await waitFor(this.sessions.list, (snapshot) => Object.hasOwn(snapshot.byId, id), Math.min(this.timeoutMs, CATALOG_ROW_PATIENCE_MS));
18139
+ } catch {
18140
+ throw failure;
18141
+ }
18142
+ console.warn("dsh-qa-surface: session catalog row landed", {
18143
+ sessionId: id,
18144
+ waitedMs: Date.now() - retainAttemptedAt
18145
+ });
18146
+ return !this.disposed && operation === this.generation;
18147
+ }
18148
+ /**
18066
18149
  * Give up on an adoption the chat on screen has outgrown, and answer whether
18067
18150
  * that is what happened (`true` — the caller has nothing left to publish).
18068
18151
  *
@@ -19524,6 +19607,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
19524
19607
  }
19525
19608
  //#endregion
19526
19609
  //#region src/client/slash/SlashPalette.tsx
19610
+ /** Whether a Host-supplied description is written in the surface's language. */
19611
+ const isCyrillic = /[А-Яа-яЁё]/u;
19527
19612
  const KIND_LABEL = Object.freeze({
19528
19613
  skill: "Навык",
19529
19614
  command: "Команда"
@@ -19599,6 +19684,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
19599
19684
  }), props.showDescriptions && entry.description !== "" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
19600
19685
  className: "dsh-qa-slash__description",
19601
19686
  "data-testid": "qa-slash-row-description",
19687
+ lang: isCyrillic.test(entry.description) ? "ru" : "en",
19602
19688
  children: entry.description
19603
19689
  }) : null]
19604
19690
  }, entry.id);
@@ -19918,6 +20004,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
19918
20004
  if (await props.onSend(text, attachments, pick?.id ?? null)) {
19919
20005
  setDraft("");
19920
20006
  props.onAttachmentsChange([]);
20007
+ setAttachmentError(null);
19921
20008
  }
19922
20009
  } finally {
19923
20010
  setSubmitting(false);
@@ -20491,7 +20578,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
20491
20578
  ]
20492
20579
  });
20493
20580
  }
20494
- function QaHeader({ logoUrl, title, viewingSubagent, onCloseSubagent, roleSelector, themeSwitcher, administration, agentCount, agentsOpen, onToggleAgents, sourcesVisible, sourcesCount, sourcesComplete, sourcesOpen, onOpenSources, fileCount, filesEnabled, filesOpen, onOpenFiles, settings, history, panelLauncher, showReset, resetDisabled, onReset }) {
20581
+ function QaHeader({ logoUrl, title, viewingSubagent, onCloseSubagent, roleSelector, themeSwitcher, administration, agentCount, agentsOpen, onToggleAgents, sourcesVisible, sourcesCount, sourcesComplete, sourcesOpen, onOpenSources, fileCount, filesEnabled, filesOpen, onOpenFiles, settings, history, panelLauncher, showReset, resetDisabled, onReset, onBackToChat }) {
20495
20582
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("header", {
20496
20583
  className: "dsh-qa-header",
20497
20584
  "data-testid": "qa-surface-header",
@@ -20548,9 +20635,14 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
20548
20635
  type: "button",
20549
20636
  className: "dsh-qa-header__agents",
20550
20637
  "data-testid": "qa-surface-header-agents",
20551
- disabled: agentCount === 0,
20638
+ "aria-disabled": agentCount === 0 || void 0,
20552
20639
  "aria-expanded": agentsOpen,
20553
- onClick: onToggleAgents,
20640
+ ...agentCount === 0 ? { "aria-label": "Агенты: субагентов в этом чате пока нет" } : {},
20641
+ title: agentCount === 0 ? "Субагентов в этом чате пока нет" : "Показать субагентов этого чата",
20642
+ onClick: () => {
20643
+ if (agentCount === 0) return;
20644
+ onToggleAgents();
20645
+ },
20554
20646
  children: [
20555
20647
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
20556
20648
  viewBox: "0 0 16 16",
@@ -20571,8 +20663,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
20571
20663
  type: "button",
20572
20664
  className: "dsh-qa-header__sources",
20573
20665
  "data-testid": "qa-surface-header-sources",
20574
- disabled: sourcesCount === 0 && sourcesComplete,
20575
20666
  "aria-expanded": sourcesOpen,
20667
+ ...sourcesCount === 0 && sourcesComplete ? { "aria-label": "Источники: этот ответ обошёлся без источников" } : {},
20668
+ title: sourcesCount === 0 && sourcesComplete ? "Этот ответ обошёлся без источников" : "Показать источники этого ответа",
20576
20669
  onClick: onOpenSources,
20577
20670
  children: [
20578
20671
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
@@ -20592,9 +20685,14 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
20592
20685
  type: "button",
20593
20686
  className: "dsh-qa-header__files",
20594
20687
  "data-testid": "qa-surface-header-files",
20595
- disabled: !filesEnabled,
20688
+ "aria-disabled": !filesEnabled || void 0,
20596
20689
  "aria-expanded": filesOpen,
20597
- onClick: onOpenFiles,
20690
+ ...!filesEnabled ? { "aria-label": "Файлы: в этом чате нет ни вложений, ни читаемого рабочего каталога" } : {},
20691
+ title: !filesEnabled ? "В этом чате нет ни вложений, ни читаемого рабочего каталога" : "Показать файлы этого чата",
20692
+ onClick: () => {
20693
+ if (!filesEnabled) return;
20694
+ onOpenFiles();
20695
+ },
20598
20696
  children: [
20599
20697
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
20600
20698
  viewBox: "0 0 16 16",
@@ -20647,9 +20745,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
20647
20745
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
20648
20746
  className: "dsh-qa-header__tabs",
20649
20747
  "data-testid": "qa-surface-header-tabs",
20650
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
20748
+ children: onBackToChat === void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
20651
20749
  "aria-current": "page",
20652
20750
  children: "Чат"
20751
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
20752
+ type: "button",
20753
+ className: "dsh-qa-header__tab",
20754
+ "data-testid": "qa-surface-header-chat-tab",
20755
+ "aria-current": "page",
20756
+ "aria-label": "Вернуться к чату",
20757
+ title: "Закрыть панель и вернуться к чату",
20758
+ onClick: onBackToChat,
20759
+ children: "Чат"
20653
20760
  })
20654
20761
  })]
20655
20762
  })
@@ -50182,6 +50289,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
50182
50289
  }
50183
50290
  //#endregion
50184
50291
  //#region src/client/components/QaWorkGroup.tsx
50292
+ /** Whether one turn is over: a settled group opens collapsed and stays closed. */
50293
+ function isSettled(status) {
50294
+ return status === "complete" || status === "error" || status === "stopped";
50295
+ }
50185
50296
  function Chevron({ open }) {
50186
50297
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
50187
50298
  className: "dsh-qa-work__chevron",
@@ -50356,15 +50467,15 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
50356
50467
  const now = useNow(status === "running" && startedAt !== void 0);
50357
50468
  const previousStatus = (0, react.useRef)(status);
50358
50469
  (0, react.useEffect)(() => {
50359
- if (previousStatus.current === "running" && (status === "complete" || status === "error")) setOpen(false);
50360
- else if (previousStatus.current === "complete" || previousStatus.current === "error") {
50470
+ if (previousStatus.current === "running" && isSettled(status)) setOpen(false);
50471
+ else if (isSettled(previousStatus.current)) {
50361
50472
  if (status === "running") setOpen(true);
50362
50473
  }
50363
50474
  previousStatus.current = status;
50364
50475
  }, [status]);
50365
50476
  const elapsed = (endedAt ?? now) - (startedAt ?? now);
50366
50477
  const duration = startedAt === void 0 ? null : formatWorkDuration(elapsed);
50367
- const label = status === "running" ? `${thinkingPhrase(elapsed, thinkingPhrases)}${duration === null ? "" : ` (${duration})`}` : status === "error" ? duration === null ? "Ход прерван" : `Прервано за ${duration}` : duration === null ? "Ход работы" : `Готово за ${duration}`;
50478
+ const label = status === "running" ? `${thinkingPhrase(elapsed, thinkingPhrases)}${duration === null ? "" : ` (${duration})`}` : status === "error" ? duration === null ? "Ход прерван" : `Прервано за ${duration}` : status === "stopped" ? duration === null ? "Ход остановлен" : `Остановлено на ${duration}` : duration === null ? "Ход работы" : `Готово за ${duration}`;
50368
50479
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
50369
50480
  className: "dsh-qa-work",
50370
50481
  "data-testid": "qa-surface-work-group",
@@ -52961,15 +53072,39 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
52961
53072
  }
52962
53073
  //#endregion
52963
53074
  //#region src/client/components/QaChangelog.tsx
52964
- const QA_VERSION = "0.15.2";
53075
+ const QA_VERSION = "0.15.4";
52965
53076
  const QA_CHANGELOG = [
53077
+ {
53078
+ version: "0.15.4",
53079
+ date: "2026-10-08",
53080
+ sections: [{
53081
+ title: "Исправления",
53082
+ items: [
53083
+ "Мелкие контролы поверхности стали объяснять себя, а основной текст — читаться с 16 px. Чипы «Агенты», «Источники» и «Файлы» при пустом списке просто глушились: серая кнопка выпадала из обхода Tab, не отвечала на наведение и не говорила, что именно кончилось; теперь она остаётся доступной, а причина пустоты читается в её имени и подсказке. «Чат» в шапке выглядел выбранной вкладкой, но не нажимался — когда поверх разговора открыта панель, это кнопка, которая закрывает панель и возвращает к чату, а пока ничего не открыто, он остаётся подписью. На телефоне панель, занимающая весь экран, имела один выход — крестик 26 px: у него и зона попадания размером с палец, и имя, называющее закрываемую вкладку, а Escape закрывает панель, где бы ни стоял курсор; действия у сообщения на этой ширине такие же. Ответ ассистента больше не мельчает ни относительно собственного вопроса, ни на узком экране, и карточки входа и настроек переехали на тот же кегль — ниже 16 px остались только служебные подписи. Заголовок беседы в истории, который не влезал целиком, обрывается многоточием, полное имя даёт подсказка, а поиск ищет по всему имени; третий быстрый вопрос на узкой ширине больше не отсекается — чипы переносятся. Красная строка об отказе слишком большого файла уходит вместе с отправленным сообщением, а не висит над пустым полем; «Рабочий каталог» в панели «Файлы» напечатан один раз; карточка «Ожидает одобрения» называет причину по-русски, а описания команд в палитре по `/` объявляют свой язык, чтобы перевод не звучал как ошибка.",
53084
+ "Кнопка «Источники» в шапке больше не блокируется пустым списком, и пустой список объясняет себя сам. Ход, ответивший по памяти или по тому, что уже было в этом разговоре, в список ничего не добавляет: чтения памяти не узнаёт ни один экстрактор, и это замысел, а не поломка. Прежний интерфейс молчал дважды — под ответом не было чипа, а кнопка стояла заблокированной без счётчика и без причины, и вместе с ней закрывалась единственная поверхность, способная объяснить пустоту. Теперь кнопка жива всегда, когда её показывает развёртывание, а панель на пустом завершённом ходе перечисляет, какие материалы в неё попадают, и говорит, что пустой список — не сбой сбора. Пока ход ещё идёт или делегированный запуск остался должен свои источники, объяснение молчит: об этом уже говорит строка о недоступных источниках, и два противоречащих текста на одном экране не встречаются.",
53085
+ "Остановленный ход больше не притворяется завершённым. Кнопка «стоп» обрывала ответ, а под ходом читалось «Готово за 2 с»: «готово» обещает целый ответ, и человек, остановивший ход, чтобы переформулировать вопрос, видел успех вместо того, что сделал сам. Теперь у остановки свой итог — строка «Остановлено на N с» и плашка о том, что ответ неполный и как получить его целиком. Всё, что успело прийти, остаётся обычным сообщением: его можно скопировать и оценить, так что остановка ничего уже написанного не съедает. У сбоя провайдера по-прежнему свой итог — остановка его не подменяет.",
53086
+ "Палитра слэш-команд в чате, который ещё не начался, называет те же навыки, что и в чате, где уже шёл ответ. Пока за разговором не стоял живой агент, список строился по одному общему allow-list'у развёртывания и не сужался ролью: в него попадал навык, который в этом чате вызвать нельзя — имя подсвечивалось, Enter подставлял его в строку, а в ответ приходил отказ, — и наоборот, доступный навык мог не показаться. Теперь роль учитывается при обоих чтениях, а список, который палитра показывает, и список, которым проверяется введённая строка, выводятся из одного правила, поэтому предложение в палитре и возможность его вызвать больше не могут разойтись.",
53087
+ "Делегированный вызов больше не ставит ход на паузу, которую никто не может снять. Проверяющий, вызванный из чата, не умеет спрашивать человека — харнесс отказывает таким запросам, — но заявка на подтверждение вставала карточкой над композером родителя и держала весь ход: на стенде так ждало то двенадцать минут, то больше часа, пока в основном чате шёл только таймер «думаю». Теперь запрос на подтверждение от дочерней сессии отклоняется сразу там, где он поднят, с объяснением, что дочь спрашивать не может, — модель получает это как находку, а оператор не получает зависший ход. Отдельно закрыто то, что привело к заявке: проверяющему ответа выдаются только инструменты чтения и поиска, а имена удаления файла, записи файлов и запуска команд исключены из его набора — и списком по умолчанию, и проверкой на сборке дочерней сессии.",
53088
+ "Запрос на одобрение, который никто не увидел, перестаёт владеть ходом навсегда: карточка, оставшаяся без ответа, гаснет по истечении ожидания и означает отказ, как и явный отказ оператора. Ничего при этом не разрешается автоматически: ни один путь не одобряет вызов без человека.",
53089
+ "Первый вопрос, заданный в новый черновик, больше не открывается плашкой «Не удалось начать чат.» над разговором, который стенд на самом деле создал. Список чатов браузер держит у себя, и право на сессию хост выдаёт по этому списку: идентификатор, которого в нём ещё нет, отвергается строкой `sessions.retain: unknown session`. Разговор же рождается на сервере — через собственный Remote стенда, — и ответ «создано» успевал дойти до браузера раньше, чем строка нового разговора в его список попала. Первая попытка закрепиться за сессией приходилась ровно на это окно, поэтому экран докладывал об отказе и молчал, что чат тем временем уже стоит в боковом списке строкой, в которую никто не вошёл. Теперь поверхность сначала ждёт, пока каталог браузера назовёт этот идентификатор, и сама просит свежий список, а не ждёт, что успеет прийти раньше — собственный кадр сервера или его очередная выгрузка. Ждёт недолго, на одну выгрузку: строка приходит пушем или ответом на этот же запрос, а целый таймаут ожидания лег бы вторым слоем поверх тех, что идут следом, и чат, которому не открыться, держал бы экран вдвое дольше. Если строка так и не пришла, в журнале остаётся отказ самого хоста, а не «истекло ожидание», которого никто не заказывал; отказ хоста для чата, который список уже называет, остаётся самим собой — поверхность не ждёт строку, которая на месте, и не рисует гонку там, где её не было. Отказ самой выгрузки тоже слышен: чат, потерянный в таком виде, читается как медленный каталог, а на деле это нечитаемый каталог. Случается это не на каждом входе, поэтому обе половины гонки пишутся в журнал браузера: отказ удержания — с его моментом, и пришедшая следом строка каталога — с тем, сколько пришлось ждать. Раунд, который чат всё-таки потерял, сможет сказать, на какой стороне создания он его потерял. Тот же порядок и для чата, который поверхность возвращает при открытии: он тоже сначала ждёт, пока список его назовёт, и только потом закрепляется за сессией."
53090
+ ]
53091
+ }]
53092
+ },
53093
+ {
53094
+ version: "0.15.3",
53095
+ date: "2026-10-08",
53096
+ sections: [{
53097
+ title: "Исправления",
53098
+ items: ["Палитра слэш-команд в чате, который ещё не начался, называет те же навыки, что и в чате, где уже шёл ответ. Пока за разговором не стоял живой агент, список строился по одному общему allow-list'у развёртывания и не сужался ролью: в него попадал навык, который в этом чате вызвать нельзя — имя подсвечивалось, Enter подставлял его в строку, а в ответ приходил отказ, — и наоборот, доступный навык мог не показаться. Теперь роль учитывается при обоих чтениях, а список, который палитра показывает, и список, которым проверяется введённая строка, выводятся из одного правила, поэтому предложение в палитре и возможность его вызвать больше не могут разойтись."]
53099
+ }]
53100
+ },
52966
53101
  {
52967
53102
  version: "0.15.2",
52968
53103
  date: "2026-10-07",
52969
53104
  sections: [
52970
53105
  {
52971
53106
  title: "Исправления",
52972
- items: ["Кнопка «Копировать» работает на стенде, открытом по http по адресу в локальной сети. Браузер доверяет буфер обмена только защищённым страницам, поэтому на таком стенде современного интерфейса буфера нет вовсе — и нажатие молчало: ни ошибки, ни отметки «Скопировано», ни текста в буфере, а проверка вставлялась пустой. Теперь поверхность сначала пробует буфер, а когда его нет, копирует через временное поле — этот путь доступен и на незащищённой странице. Так копируются код-блок в ответе, ответ целиком и значение интеграционного токена. Если браузер не отдал буфер ни одним путём, на месте кнопки появляется строка «Скопируйте вручную», а там, где кнопка осталась рабочей, та же строка встаёт рядом с ней после отказа: молчание больше не выглядит удачным копированием."]
53107
+ items: ["Кнопка «Копировать» работает на стенде, открытом по http по адресу в локальной сети. Браузер доверяет буфер обмена только защищённым страницам, поэтому на таком стенде современного интерфейса буфера нет вовсе — и нажатие молчало: ни ошибки, ни отметки «Скопировано», ни текста в буфере, а проверка вставлялась пустой. Теперь поверхность сначала пробует буфер, а когда его нет, копирует через временное поле — этот путь доступен и на незащищённой странице. Так копируются код-блок в ответе, ответ целиком и значение интеграционного токена. Если браузер не отдал буфер ни одним путём, на месте кнопки появляется строка «Скопируйте вручную», а там, где кнопка осталась рабочей, та же строка встаёт рядом с ней после отказа: молчание больше не выглядит удачным копированием.", "Палитра слэш-команд в чате, который ещё не начался, называет те же навыки, что и в чате, где уже шёл ответ. Пока за разговором не стоял живой агент, список строился по одному общему allow-list'у развёртывания и не сужался ролью: в него попадал навык, который в этом чате вызвать нельзя — имя подсвечивалось, Enter подставлял его в строку, а в ответ приходил отказ, — и наоборот, доступный навык мог не показаться. Теперь роль учитывается при обоих чтениях, а список, который палитра показывает, и список, которым проверяется введённая строка, выводятся из одного правила, поэтому предложение в палитре и возможность его вызвать больше не могут разойтись."]
52973
53108
  },
52974
53109
  {
52975
53110
  title: "Изменения",
@@ -53513,7 +53648,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
53513
53648
  className: "dsh-qa-changelog__date",
53514
53649
  children: entry.date
53515
53650
  }),
53516
- entry.version === "0.15.2" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
53651
+ entry.version === "0.15.4" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
53517
53652
  className: "dsh-qa-changelog__current",
53518
53653
  children: "текущая"
53519
53654
  }) : null
@@ -53811,12 +53946,16 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
53811
53946
  const summary = byId[id];
53812
53947
  if (summary === void 0 || isDelegatedSession(summary)) continue;
53813
53948
  const ownerName = ownerNameOf?.(id);
53949
+ const label = summary.blank ? "Новый чат" : summary.displayTitle;
53950
+ const full = summary.title;
53951
+ const clipped = !summary.blank && full !== void 0 && full.length > label.length;
53814
53952
  rows.push({
53815
53953
  id,
53816
- title: summary.blank ? "Новый чат" : summary.displayTitle,
53954
+ title: clipped ? `${label.trimEnd()}…` : label,
53817
53955
  running: summary.running,
53818
53956
  active: id === activeId,
53819
53957
  meta: relativeTime(summary.updatedAt, now),
53958
+ ...clipped && full !== void 0 ? { fullName: full } : {},
53820
53959
  updatedAt: summary.updatedAt,
53821
53960
  ...ownerName === void 0 ? {} : { ownerName }
53822
53961
  });
@@ -53899,7 +54038,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
53899
54038
  });
53900
54039
  }
53901
54040
  function rowMatches(row, query) {
53902
- return row.title.toLowerCase().includes(query) || row.ownerName?.toLowerCase().includes(query) === true;
54041
+ return row.title.toLowerCase().includes(query) || (row.fullName?.toLowerCase().includes(query) ?? false) || row.ownerName?.toLowerCase().includes(query) === true;
53903
54042
  }
53904
54043
  /**
53905
54044
  * How each chat is named by the controls acting on it, keyed by id. A title is
@@ -54006,6 +54145,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
54006
54145
  className: "dsh-qa-sidebar__item-main",
54007
54146
  "data-testid": "qa-surface-sidebar-item-open",
54008
54147
  "aria-current": row.active ? "true" : void 0,
54148
+ title: row.fullName ?? row.title,
54009
54149
  onClick: () => {
54010
54150
  props.onSwitch(row.id);
54011
54151
  closeDrawer();
@@ -54803,22 +54943,23 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
54803
54943
  });
54804
54944
  }
54805
54945
  const crumbs = crumbsOf(directory);
54946
+ const trail = directory === "" ? crumbs.slice(1) : crumbs;
54806
54947
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
54807
54948
  className: "dsh-qa-ws",
54808
54949
  "data-testid": "qa-surface-workspace",
54809
54950
  children: [
54810
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("nav", {
54951
+ trail.length === 0 ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("nav", {
54811
54952
  className: "dsh-qa-ws__crumbs",
54812
54953
  "data-testid": "qa-surface-workspace-crumbs",
54813
54954
  "aria-label": "Путь в рабочем каталоге",
54814
- children: crumbs.map((crumb, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: [index > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
54955
+ children: trail.map((crumb, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: [index > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
54815
54956
  "aria-hidden": "true",
54816
54957
  children: "/"
54817
54958
  }) : null, /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
54818
54959
  type: "button",
54819
54960
  className: "dsh-qa-ws__crumb",
54820
54961
  "data-testid": "qa-surface-workspace-crumb",
54821
- "aria-current": index === crumbs.length - 1 ? "true" : void 0,
54962
+ "aria-current": index === trail.length - 1 ? "true" : void 0,
54822
54963
  onClick: () => setDirectory(crumb.path),
54823
54964
  children: crumb.label
54824
54965
  })] }, crumb.path))
@@ -54975,9 +55116,24 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
54975
55116
  * The chat's right rail: a fixed column whose top edge is the tab strip,
54976
55117
  * mirroring the Harness right Sidebar's chrome. Tabs are plain chips with
54977
55118
  * counts; the strip's last control collapses the whole column.
55119
+ *
55120
+ * On the phone layout the column is the whole surface, so the strip's control
55121
+ * is the only way back and Escape has to answer from anywhere on the page —
55122
+ * the focus may well still sit in the composer behind the panel. A dialog above
55123
+ * the rail keeps the key: the innermost thing on the page is what the reader
55124
+ * means to dismiss.
54978
55125
  */
54979
55126
  function QaRightRail({ tabs, activeTab, onTabSelect, onClose }) {
54980
55127
  const active = tabs.find((tab) => tab.id === activeTab) ?? tabs[0];
55128
+ (0, react.useEffect)(() => {
55129
+ const onKey = (event) => {
55130
+ if (event.key !== "Escape" || event.defaultPrevented) return;
55131
+ if (isQaModalOpen()) return;
55132
+ onClose();
55133
+ };
55134
+ window.addEventListener("keydown", onKey);
55135
+ return () => window.removeEventListener("keydown", onKey);
55136
+ }, [onClose]);
54981
55137
  if (active === void 0) return null;
54982
55138
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("aside", {
54983
55139
  className: "dsh-qa-panel",
@@ -55003,8 +55159,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
55003
55159
  type: "button",
55004
55160
  className: "dsh-qa-panel__close",
55005
55161
  "data-testid": "qa-surface-rail-close",
55006
- "aria-label": "Закрыть панель",
55007
- title: "Закрыть",
55162
+ "aria-label": `Закрыть панель «${active.title}» и вернуться к чату`,
55163
+ title: `Закрыть панель «${active.title}»`,
55008
55164
  onClick: onClose,
55009
55165
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
55010
55166
  viewBox: "0 0 16 16",
@@ -55308,39 +55464,47 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
55308
55464
  }) : null, detail === void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
55309
55465
  className: "dsh-qa-sources__list",
55310
55466
  "data-testid": "qa-sources-list",
55311
- children: [!complete ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("p", {
55312
- className: "dsh-qa-sources__incomplete",
55313
- "data-testid": "qa-sources-incomplete",
55314
- children: [
55315
- "Некоторые источники делегированных запусков недоступны (",
55316
- incompleteOrigins?.length ?? 1,
55317
- ")."
55318
- ]
55319
- }) : null, groups.map((group) => {
55320
- const visible = expanded.has(group.key) ? group.sources : group.sources.slice(0, display.maxInitiallyVisiblePerGroup);
55321
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
55322
- className: "dsh-qa-sources__group",
55323
- "data-testid": `qa-sources-group-${group.key}`,
55467
+ children: [
55468
+ !complete ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("p", {
55469
+ className: "dsh-qa-sources__incomplete",
55470
+ "data-testid": "qa-sources-incomplete",
55324
55471
  children: [
55325
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("h3", { children: [group.label, /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
55326
- "data-testid": "qa-sources-group-count",
55327
- children: group.sources.length
55328
- })] }),
55329
- visible.map((source) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(QaSourceCard, {
55330
- source,
55331
- showOriginBadges: display.showOriginBadges,
55332
- onOpen: () => setDetailId(source.id)
55333
- }, source.id)),
55334
- visible.length < group.sources.length ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
55335
- type: "button",
55336
- className: "dsh-qa-sources__more",
55337
- "data-testid": "qa-sources-more",
55338
- onClick: () => setExpanded(/* @__PURE__ */ new Set([...expanded, group.key])),
55339
- children: ["Показать ещё ", group.sources.length - visible.length]
55340
- }) : null
55472
+ "Некоторые источники делегированных запусков недоступны (",
55473
+ incompleteOrigins?.length ?? 1,
55474
+ ")."
55341
55475
  ]
55342
- }, group.key);
55343
- })]
55476
+ }) : null,
55477
+ complete && sources.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
55478
+ className: "dsh-qa-sources__empty",
55479
+ "data-testid": "qa-sources-empty",
55480
+ children: "Здесь появляются материалы, которые ход читал или открывал сам: файл рабочего каталога, веб-страница, выдача веб-поиска, ответ Jira, Confluence или базы знаний. Ответ, собранный по памяти или по тому, что уже было в этом разговоре, сюда ничего не добавляет — поэтому пустой список после завершённого хода означает именно это, а не сбой сбора."
55481
+ }) : null,
55482
+ groups.map((group) => {
55483
+ const visible = expanded.has(group.key) ? group.sources : group.sources.slice(0, display.maxInitiallyVisiblePerGroup);
55484
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
55485
+ className: "dsh-qa-sources__group",
55486
+ "data-testid": `qa-sources-group-${group.key}`,
55487
+ children: [
55488
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("h3", { children: [group.label, /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
55489
+ "data-testid": "qa-sources-group-count",
55490
+ children: group.sources.length
55491
+ })] }),
55492
+ visible.map((source) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(QaSourceCard, {
55493
+ source,
55494
+ showOriginBadges: display.showOriginBadges,
55495
+ onOpen: () => setDetailId(source.id)
55496
+ }, source.id)),
55497
+ visible.length < group.sources.length ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
55498
+ type: "button",
55499
+ className: "dsh-qa-sources__more",
55500
+ "data-testid": "qa-sources-more",
55501
+ onClick: () => setExpanded(/* @__PURE__ */ new Set([...expanded, group.key])),
55502
+ children: ["Показать ещё ", group.sources.length - visible.length]
55503
+ }) : null
55504
+ ]
55505
+ }, group.key);
55506
+ })
55507
+ ]
55344
55508
  }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(QaSourceDetail, {
55345
55509
  source: detail,
55346
55510
  sessionId,
@@ -64650,6 +64814,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
64650
64814
  config.ui.showHeader ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(QaHeader, {
64651
64815
  logoUrl: config.branding.logoUrl,
64652
64816
  title: conversationTitle,
64817
+ onBackToChat: rail.railOpen || agentsOpen ? () => {
64818
+ rail.close();
64819
+ setAgentsOpen(false);
64820
+ } : void 0,
64653
64821
  viewingSubagent: state.viewingSubagent !== null,
64654
64822
  onCloseSubagent: handleCloseSubagent,
64655
64823
  roleSelector: access === void 0 || selectedSubrole === null || previewing ? void 0 : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(QaRoleSelector, {
@@ -65296,17 +65464,17 @@ body[data-dsh-qa-surface="active"] div:has(>[data-shell-overlay])>:not([data-she
65296
65464
  .dsh-qa-auth__logo{width:32px;height:32px;fill:none;stroke:var(--dsh-qa-brand);stroke-width:1.4;stroke-linecap:round;stroke-linejoin:round}
65297
65465
  .dsh-qa-auth__brand h1{margin:0;color:var(--dsw-alias-label-primary);font-size:19px;font-weight:600;line-height:26px}
65298
65466
  .dsh-qa-auth__tabs{display:flex;gap:4px;padding:3px;border-radius:9px;background:var(--dsw-alias-bg-module-platform)}
65299
- .dsh-qa-auth__tab{appearance:none;flex:1;padding:6px 0;border:0;border-radius:7px;background:0 0;color:var(--dsw-alias-label-secondary);font:inherit;font-size:13px;font-weight:500;line-height:18px;cursor:pointer;transition:background .12s,color .12s}
65467
+ .dsh-qa-auth__tab{appearance:none;flex:1;padding:6px 0;border:0;border-radius:7px;background:0 0;color:var(--dsw-alias-label-secondary);font:inherit;font-size:16px;font-weight:500;line-height:22px;cursor:pointer;transition:background .12s,color .12s}
65300
65468
  .dsh-qa-auth__tab:hover{color:var(--dsw-alias-label-primary)}
65301
65469
  .dsh-qa-auth__tab--active{background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary)}
65302
65470
  .dsh-qa-auth__tab:focus-visible{outline:var(--dsw-focus-ring-width, 2px) solid var(--dsw-focus-ring-color, var(--dsh-qa-accent));outline-offset:-2px}
65303
65471
  .dsh-qa-auth__field{display:flex;flex-direction:column;gap:5px}
65304
- .dsh-qa-auth__field span{color:var(--dsw-alias-label-secondary);font-size:12px;line-height:16px}
65305
- .dsh-qa-auth__field input{appearance:none;width:100%;padding:9px 11px;border:1px solid var(--dsw-alias-border-l2);border-radius:9px;background:var(--dsw-alias-bg-base);color:var(--dsw-alias-label-primary);font:inherit;font-size:14px;line-height:20px}
65472
+ .dsh-qa-auth__field span{color:var(--dsw-alias-label-secondary);font-size:16px;line-height:22px}
65473
+ .dsh-qa-auth__field input{appearance:none;width:100%;padding:9px 11px;border:1px solid var(--dsw-alias-border-l2);border-radius:9px;background:var(--dsw-alias-bg-base);color:var(--dsw-alias-label-primary);font:inherit;font-size:16px;line-height:22px}
65306
65474
  .dsh-qa-auth__field input:focus{outline:none;border-color:var(--dsh-qa-brand)}
65307
65475
  .dsh-qa-auth__field input:disabled{opacity:.55}
65308
- .dsh-qa-auth__error{margin:0;color:var(--dsh-qa-error);font-size:12px;line-height:17px}
65309
- .dsh-qa-auth__submit{appearance:none;margin-top:2px;padding:10px 0;border:0;border-radius:9px;background:var(--dsh-qa-brand);color:var(--dsh-qa-accent-contrast);font:inherit;font-size:14px;font-weight:600;line-height:20px;cursor:pointer;transition:background .12s}
65476
+ .dsh-qa-auth__error{margin:0;color:var(--dsh-qa-error);font-size:16px;line-height:22px}
65477
+ .dsh-qa-auth__submit{appearance:none;margin-top:2px;padding:10px 0;border:0;border-radius:9px;background:var(--dsh-qa-brand);color:var(--dsh-qa-accent-contrast);font:inherit;font-size:16px;font-weight:600;line-height:22px;cursor:pointer;transition:background .12s}
65310
65478
  .dsh-qa-auth__submit:hover{background:var(--dsh-qa-accent-hover)}
65311
65479
  .dsh-qa-auth__submit:focus-visible{outline:var(--dsw-focus-ring-width, 2px) solid var(--dsw-focus-ring-color, var(--dsh-qa-accent));outline-offset:2px}
65312
65480
  .dsh-qa-auth__submit:disabled{opacity:.6;cursor:default}
@@ -65468,8 +65636,8 @@ body[data-dsh-qa-surface="active"] div:has(>[data-shell-overlay])>:not([data-she
65468
65636
  .dsh-qa-header h1{max-width:min(42vw,420px);min-width:0;overflow:hidden;margin:0;color:var(--dsw-alias-label-primary);font-size:14px;font-weight:500;line-height:20px;text-overflow:ellipsis;white-space:nowrap}
65469
65637
  .dsh-qa-header__reset{padding:5px 10px;border:0;border-radius:8px;background:transparent;color:var(--dsw-alias-label-secondary);font:inherit;font-size:13px;cursor:pointer}
65470
65638
  .dsh-qa-header__agents{display:inline-flex;align-items:center;gap:6px;flex:none;padding:5px 10px;border:0;border-radius:8px;background:transparent;color:var(--dsw-alias-label-secondary);font:inherit;font-size:13px;line-height:20px;cursor:pointer}
65471
- .dsh-qa-header__agents:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}
65472
- .dsh-qa-header__agents:disabled{opacity:.45;cursor:default}
65639
+ .dsh-qa-header__agents:hover:not(:disabled):not([aria-disabled="true"]){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}
65640
+ .dsh-qa-header__agents:disabled,.dsh-qa-header__agents[aria-disabled="true"]{opacity:.45;cursor:default}
65473
65641
  .dsh-qa-header__agents[aria-expanded="true"]{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}
65474
65642
  .dsh-qa-header__agents svg{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round}
65475
65643
  .dsh-qa-header__agents:focus-visible{outline:var(--dsw-focus-ring-width, 2px) solid var(--dsw-focus-ring-color, var(--dsh-qa-accent));outline-offset:2px}
@@ -65504,13 +65672,12 @@ body[data-dsh-qa-surface="active"] div:has(>[data-shell-overlay])>:not([data-she
65504
65672
  .dsh-qa-agents__open{flex:none;color:var(--dsh-qa-accent);font-size:12px;font-weight:500;line-height:18px}
65505
65673
  .dsh-qa-header__sources{display:inline-flex;align-items:center;gap:6px;flex:none;padding:5px 10px;border:0;border-radius:8px;background:transparent;color:var(--dsw-alias-label-secondary);font:inherit;font-size:13px;line-height:20px;cursor:pointer}
65506
65674
  .dsh-qa-header__sources:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}
65507
- .dsh-qa-header__sources:disabled{opacity:.45;cursor:default}
65508
65675
  .dsh-qa-header__sources[aria-expanded="true"]{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}
65509
65676
  .dsh-qa-header__sources svg{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round}
65510
65677
  .dsh-qa-header__sources:focus-visible{outline:var(--dsw-focus-ring-width, 2px) solid var(--dsw-focus-ring-color, var(--dsh-qa-accent));outline-offset:2px}
65511
65678
  .dsh-qa-header__files{display:inline-flex;align-items:center;gap:6px;flex:none;padding:5px 10px;border:0;border-radius:8px;background:transparent;color:var(--dsw-alias-label-secondary);font:inherit;font-size:13px;line-height:20px;cursor:pointer}
65512
- .dsh-qa-header__files:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}
65513
- .dsh-qa-header__files:disabled{opacity:.45;cursor:default}
65679
+ .dsh-qa-header__files:hover:not(:disabled):not([aria-disabled="true"]){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}
65680
+ .dsh-qa-header__files:disabled,.dsh-qa-header__files[aria-disabled="true"]{opacity:.45;cursor:default}
65514
65681
  .dsh-qa-header__files[aria-expanded="true"]{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}
65515
65682
  .dsh-qa-header__files svg{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round}
65516
65683
  .dsh-qa-header__files:focus-visible{outline:var(--dsw-focus-ring-width, 2px) solid var(--dsw-focus-ring-color, var(--dsh-qa-accent));outline-offset:2px}
@@ -65581,8 +65748,11 @@ body[data-dsh-qa-surface="active"] div:has(>[data-shell-overlay])>:not([data-she
65581
65748
  .dsh-qa-header__reset:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}
65582
65749
  .dsh-qa-header__reset:disabled{opacity:.45;cursor:default}
65583
65750
  .dsh-qa-header__tabs{position:relative;z-index:1;display:flex;gap:32px;margin-top:4px}
65584
- .dsh-qa-header__tabs span{position:relative;padding:0 0 11px;color:var(--dsh-qa-accent);font-size:13px;font-weight:500;line-height:16px}
65585
- .dsh-qa-header__tabs span::after{content:"";position:absolute;right:0;bottom:1px;left:0;height:2px;border-radius:2px;background:var(--dsh-qa-accent)}
65751
+ .dsh-qa-header__tabs span,.dsh-qa-header__tab{position:relative;padding:0 0 11px;color:var(--dsh-qa-accent);font-size:13px;font-weight:500;line-height:16px}
65752
+ .dsh-qa-header__tab{appearance:none;background:0 0;border:0;cursor:pointer;font-family:inherit}
65753
+ .dsh-qa-header__tab:hover{text-decoration:underline}
65754
+ .dsh-qa-header__tab:focus-visible{outline:var(--dsw-focus-ring-width, 2px) solid var(--dsw-focus-ring-color, var(--dsh-qa-accent));outline-offset:2px}
65755
+ .dsh-qa-header__tabs span::after,.dsh-qa-header__tab::after{content:"";position:absolute;right:0;bottom:1px;left:0;height:2px;border-radius:2px;background:var(--dsh-qa-accent)}
65586
65756
  .dsh-qa-extension-panel__resizer{position:relative;z-index:2;flex:0 0 5px;width:5px;touch-action:none;cursor:col-resize;background:var(--dsw-alias-border-l2)}
65587
65757
  .dsh-qa-extension-panel__resizer:hover,.dsh-qa-extension-panel__resizer:focus-visible{background:var(--dsh-qa-accent);outline:0}
65588
65758
  .dsh-qa-extension-panel{display:flex;flex-direction:column;min-width:0;min-height:0;background:var(--dsw-alias-bg-base);color:var(--dsw-alias-label-primary)}
@@ -65687,6 +65857,7 @@ body[data-dsh-qa-surface="active"] div:has(>[data-shell-overlay])>:not([data-she
65687
65857
  span.dsh-qa-files__thumb{display:inline-block}
65688
65858
  img.dsh-qa-files__thumb{object-fit:cover;background:var(--dsw-alias-bg-layer-3)}
65689
65859
  .dsh-qa-sources__list{flex:1;min-height:0;overflow-y:auto;overscroll-behavior:contain;padding:0 10px 12px}
65860
+ .dsh-qa-sources__empty{margin:4px 2px 12px;color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:17px}
65690
65861
  .dsh-qa-sources__group{margin:0 0 14px}
65691
65862
  .dsh-qa-sources__group h3{display:flex;align-items:center;gap:7px;margin:4px 4px 8px;color:var(--dsw-alias-label-secondary);font-size:12px;font-weight:600;line-height:18px}
65692
65863
  .dsh-qa-sources__group h3 span{display:inline-grid;place-items:center;min-width:19px;height:18px;padding:0 5px;border-radius:999px;background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-tertiary);font-size:10px}
@@ -65745,7 +65916,20 @@ a.dsh-qa-sources__title:hover{text-decoration:underline}
65745
65916
  .dsh-qa-message--assistant{align-items:flex-start;margin-right:auto}
65746
65917
  .dsh-qa-message--work{align-items:flex-start;margin:-4px 0 14px}
65747
65918
  .dsh-qa-message--system{align-items:center;margin:4px auto 20px}
65748
- .dsh-qa-message__content{max-width:100%;white-space:pre-wrap;overflow-wrap:anywhere;color:var(--dsw-alias-label-primary);font-size:15px;line-height:1.62}
65919
+ /*
65920
+ The type scale of this surface: what the reader is asked to read is 16px, and
65921
+ nothing that carries a decision sits below it — the assistant's answer, the
65922
+ operator's own draft and the composer's status line all match the 16px the
65923
+ user bubble is drawn at, so a reply never reads smaller than the question.
65924
+
65925
+ Deliberate exceptions, all of them chrome rather than content: the header row
65926
+ and the tab marker (13px), the panel tab chips and their counts (13px/10px),
65927
+ message meta and timestamps (11-12px), the quick-question chips (13px),
65928
+ system notices and turn lines (13px), code and workspace file names
65929
+ (monospace, 11-13px), the admin console's tables and badges (10-12px), the
65930
+ composer's key hint (11px) and the welcome lede (14px).
65931
+ */
65932
+ .dsh-qa-message__content{max-width:100%;white-space:pre-wrap;overflow-wrap:anywhere;color:var(--dsw-alias-label-primary);font-size:16px;line-height:1.62}
65749
65933
  .dsh-qa-message--user .dsh-qa-message__content{max-width:min(525px,82%);padding:10px 16px;border-radius:22px;background:var(--dsw-specific-bubble);font-size:16px;line-height:24px}
65750
65934
  .dsh-qa-message[data-status="pending"] .dsh-qa-message__content{opacity:.78}
65751
65935
  .dsh-qa-message__pending{display:flex;align-items:center;gap:6px;margin-top:6px;color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px}
@@ -65818,7 +66002,7 @@ a.dsh-qa-srcref:hover,button.dsh-qa-srcref:hover{border-color:var(--dsw-alias-la
65818
66002
  properties, so a font-size preference or a light/dark switch moves both
65819
66003
  surfaces together. A container that needs a denser scale (the source
65820
66004
  preview, the work-item text) overrides the ladder for its own subtree. */
65821
- .dsh-qa-md{min-width:0;white-space:normal;overflow-wrap:anywhere;color:var(--dsw-alias-label-primary);font-family:var(--dsw-font-markdown-base-font-family,inherit);font-size:var(--dsw-font-markdown-base-font-size,14px);font-weight:400;line-height:var(--dsw-font-markdown-base-line-height,24px)}
66005
+ .dsh-qa-md{min-width:0;white-space:normal;overflow-wrap:anywhere;color:var(--dsw-alias-label-primary);font-family:var(--dsw-font-markdown-base-font-family,inherit);font-size:var(--dsw-font-markdown-base-font-size,16px);font-weight:400;line-height:var(--dsw-font-markdown-base-line-height,24px)}
65822
66006
  .dsh-qa-md>:first-child{margin-top:0}
65823
66007
  .dsh-qa-md>:last-child{margin-bottom:0}
65824
66008
  .dsh-qa-md p{margin:16px 0}
@@ -66107,7 +66291,7 @@ a.dsh-qa-srcref:hover,button.dsh-qa-srcref:hover{border-color:var(--dsw-alias-la
66107
66291
  row — title, role, palette, action cluster — is wider than the viewport with
66108
66292
  every child refusing to shrink, so it wraps instead of pushing «Настройки»
66109
66293
  past the clipped edge. */
66110
- @media (max-width:600px){.dsh-qa-sidebar{display:none}.dsh-qa-sidebar[data-qa-drawer="open"]{display:flex;position:fixed;inset:0 auto 0 0;z-index:24;width:min(320px,86vw);max-width:100%;border-right:1px solid var(--dsw-alias-border-l2);box-shadow:0 18px 44px rgba(0,0,0,.28);padding-bottom:env(safe-area-inset-bottom)}.dsh-qa-sidebar__scrim{display:block;position:fixed;inset:0;z-index:22;background:var(--dsh-qa-overlay)}.dsh-qa-sidebar__resize{display:none}.dsh-qa-sidebar__collapse,.dsh-qa-sidebar__expand{width:44px;height:44px}.dsh-qa-sidebar__new,.dsh-qa-sidebar__item-main{min-height:44px}.dsh-qa-header__history{display:inline-flex}.dsh-qa-panel,.dsh-qa-agents{position:absolute;inset:0;z-index:6;width:100%;border-left:0}.dsh-qa-header__inner{padding-left:16px;padding-right:16px}.dsh-qa-header h1{max-width:48vw}.dsh-qa-header__title-row{flex-wrap:wrap;row-gap:6px}.dsh-qa-width-handle{display:none}.dsh-qa-transcript__inner{--dsh-qa-bleed:0px;max-width:100%;padding:16px 16px 28px}.dsh-qa-footer__inner{max-width:100%}.dsh-qa-message{margin-bottom:16px}.dsh-qa-message--user .dsh-qa-message__content{max-width:88%;font-size:15px}.dsh-qa-message__content{font-size:14px}.dsh-qa-footer{padding-left:10px;padding-right:10px;padding-bottom:max(8px,env(safe-area-inset-bottom))}.dsh-qa-composer{min-height:84px;padding-top:12px}.dsh-qa-composer__hint{font-size:0}.dsh-qa-composer__hint::after{content:"Enter: отправить";font-size:11px}}
66294
+ @media (max-width:600px){.dsh-qa-sidebar{display:none}.dsh-qa-sidebar[data-qa-drawer="open"]{display:flex;position:fixed;inset:0 auto 0 0;z-index:24;width:min(320px,86vw);max-width:100%;border-right:1px solid var(--dsw-alias-border-l2);box-shadow:0 18px 44px rgba(0,0,0,.28);padding-bottom:env(safe-area-inset-bottom)}.dsh-qa-sidebar__scrim{display:block;position:fixed;inset:0;z-index:22;background:var(--dsh-qa-overlay)}.dsh-qa-sidebar__resize{display:none}.dsh-qa-sidebar__collapse,.dsh-qa-sidebar__expand{width:44px;height:44px}.dsh-qa-sidebar__new,.dsh-qa-sidebar__item-main{min-height:44px}.dsh-qa-header__history{display:inline-flex}.dsh-qa-panel,.dsh-qa-agents{position:absolute;inset:0;z-index:6;width:100%;border-left:0}.dsh-qa-panel__close{width:44px;height:44px}.dsh-qa-panel__tab{min-height:44px}.dsh-qa-header__inner{padding-left:16px;padding-right:16px}.dsh-qa-header h1{max-width:48vw}.dsh-qa-header__title-row{flex-wrap:wrap;row-gap:6px}.dsh-qa-width-handle{display:none}.dsh-qa-transcript__inner{--dsh-qa-bleed:0px;max-width:100%;padding:16px 16px 28px}.dsh-qa-footer__inner{max-width:100%}.dsh-qa-message{margin-bottom:16px}.dsh-qa-message__actions{height:44px}.dsh-qa-message__actions button{width:44px;height:44px}.dsh-qa-message--user .dsh-qa-message__content{max-width:88%}.dsh-qa-footer{padding-left:10px;padding-right:10px;padding-bottom:max(8px,env(safe-area-inset-bottom))}.dsh-qa-composer{min-height:84px;padding-top:12px}.dsh-qa-quick-questions{flex-wrap:wrap;overflow-x:visible}.dsh-qa-composer__hint{font-size:0}.dsh-qa-composer__hint::after{content:"Enter: отправить";font-size:11px}}
66111
66295
  @media (max-height:480px) and (orientation:landscape){.dsh-qa-header__inner{padding-top:6px}.dsh-qa-header__tabs{display:none}.dsh-qa-transcript__inner{padding-top:12px}.dsh-qa-footer{padding-top:12px}.dsh-qa-composer{min-height:72px;gap:4px;padding-top:8px}}
66112
66296
  @media (prefers-reduced-motion:reduce){.dsh-qa-message__cursor,.dsh-qa-message__pending-spinner,.dsh-qa-work__spinner,.dsh-qa-work-item__spinner,.dsh-qa-command__spinner{animation:none}.dsh-qa-work__chevron{transition:none}.dsh-qa-rail__frame,.dsh-qa-rail__pos,.dsh-qa-rail__mark::before,.dsh-qa-rail__mark--busy::before,.dsh-qa-rail__preview{transition:none;animation:none}}
66113
66297
  ${QA_ADMIN_CONSOLE_STYLES}
@@ -68884,13 +69068,19 @@ ${QA_ROOT_STYLES}`;
68884
69068
  * pair rather than a hard-coded outline: the Host's `focus.css` suppresses an
68885
69069
  * outline under pointer modality at a specificity our rule cannot win, so a
68886
69070
  * hard-coded ring is one that goes missing rather than one that degrades.
69071
+ *
69072
+ * The type scale is the surface's: text the operator reads in order to decide —
69073
+ * section titles, field labels, the values in the controls, the toggle copy —
69074
+ * is 16px, a control's own label and an outcome line are 14px, and only chrome
69075
+ * stays small on purpose: the «Изменено» badge (9px), the status chips (11px),
69076
+ * the monospace data rows (11px) and the footer note (10px).
68887
69077
  */
68888
69078
  const QA_SETTINGS_STYLES = `.qa-card-body,.qa-card-body *{box-sizing:border-box}
68889
69079
  .qa-card-body{display:grid;gap:18px;color:var(--dsw-alias-label-primary)}
68890
69080
  .qa-card-section{display:grid;gap:12px}
68891
69081
  .qa-card-section__title{display:flex;justify-content:space-between;align-items:center;gap:12px}
68892
- .qa-card-section__title h3{font-size:13px;margin:0;display:flex;align-items:center;gap:7px}
68893
- .qa-card-muted{color:var(--dsw-alias-label-tertiary);font-size:12px;margin:0;line-height:1.5}
69082
+ .qa-card-section__title h3{font-size:16px;margin:0;display:flex;align-items:center;gap:7px}
69083
+ .qa-card-muted{color:var(--dsw-alias-label-tertiary);font-size:16px;margin:0;line-height:1.5}
68894
69084
  .qa-card-modified{font-size:9px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--dsw-alias-brand-primary);background:var(--dsw-alias-bg-module-platform);border-radius:999px;padding:1px 7px}
68895
69085
  .qa-card-grid{display:grid;grid-template-columns:minmax(0,1fr);gap:0}
68896
69086
  /* One field per row, like the first-party plugin cards: two columns drifted
@@ -68899,22 +69089,22 @@ ${QA_ROOT_STYLES}`;
68899
69089
  .qa-card-grid>*,.qa-card-section>.qa-card-field{padding:12px 0}
68900
69090
  .qa-card-grid>*+*,.qa-card-section>.qa-card-field:not(:first-child){border-top:.5px solid var(--dsw-alias-border-l2)}
68901
69091
  .qa-card-field{display:grid;gap:6px}
68902
- .qa-card-field>span{font-size:13px;color:var(--dsw-alias-label-primary);font-weight:500}
68903
- .qa-card-control{width:100%;height:34px;border:.5px solid var(--dsw-alias-border-l4);border-radius:8px;background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-primary);padding:0 12px;font:inherit;font-size:13px;line-height:1.5;outline:none}
69092
+ .qa-card-field>span{font-size:16px;color:var(--dsw-alias-label-primary);font-weight:500}
69093
+ .qa-card-control{width:100%;height:34px;border:.5px solid var(--dsw-alias-border-l4);border-radius:8px;background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-primary);padding:0 12px;font:inherit;font-size:16px;line-height:1.5;outline:none}
68904
69094
  textarea.qa-card-control{height:auto;padding:8px 12px;line-height:1.5;resize:vertical}
68905
69095
  .qa-card-control:focus-visible{border-color:var(--dsw-alias-brand-primary);outline:var(--dsw-focus-ring-width, 2px) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));outline-offset:-1px}
68906
69096
  .qa-card-control:disabled{cursor:default;opacity:.45}
68907
69097
  .qa-card-toggle-row{display:flex;align-items:center;justify-content:space-between;gap:12px}
68908
69098
  .qa-card-toggle-copy{display:grid;gap:2px;min-width:0}
68909
- .qa-card-toggle-copy strong{font-size:13px;font-weight:500;color:var(--dsw-alias-label-primary)}
68910
- .qa-card-toggle-copy span{font-size:12px;line-height:1.5;color:var(--dsw-alias-label-tertiary)}
69099
+ .qa-card-toggle-copy strong{font-size:16px;font-weight:500;color:var(--dsw-alias-label-primary)}
69100
+ .qa-card-toggle-copy span{font-size:16px;line-height:1.5;color:var(--dsw-alias-label-tertiary)}
68911
69101
  .qa-card-toggle{appearance:none;width:34px;height:19px;border-radius:999px;background:var(--dsw-alias-label-dimmed);position:relative;cursor:pointer;transition:.18s;flex:none}
68912
69102
  .qa-card-toggle:after{content:'';position:absolute;top:3px;left:3px;width:13px;height:13px;border-radius:50%;background:var(--dsw-alias-bg-layer-3);transition:.18s}
68913
69103
  .qa-card-toggle:checked{background:var(--dsw-alias-brand-primary)}
68914
69104
  .qa-card-toggle:checked:after{transform:translateX(15px)}
68915
69105
  .qa-card-toggle:disabled{cursor:default;opacity:.45}
68916
69106
  .qa-card-toggle:focus-visible{outline:var(--dsw-focus-ring-width, 2px) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));outline-offset:2px}
68917
- .qa-card-btn{height:34px;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;background:var(--dsw-alias-bg-module-platform);color:var(--dsw-alias-label-primary);padding:0 12px;font:inherit;font-size:11px;font-weight:600;cursor:pointer;white-space:nowrap}
69107
+ .qa-card-btn{height:34px;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;background:var(--dsw-alias-bg-module-platform);color:var(--dsw-alias-label-primary);padding:0 12px;font:inherit;font-size:14px;font-weight:600;cursor:pointer;white-space:nowrap}
68918
69108
  .qa-card-btn:hover:not(:disabled){border-color:var(--dsw-alias-label-dimmed);background:var(--dsw-alias-interactive-bg-hover)}
68919
69109
  .qa-card-btn:focus-visible{outline:var(--dsw-focus-ring-width, 2px) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));outline-offset:-1px}
68920
69110
  .qa-card-btn:disabled{cursor:default;opacity:.45}
@@ -68923,11 +69113,11 @@ textarea.qa-card-control{height:auto;padding:8px 12px;line-height:1.5;resize:ver
68923
69113
  .qa-card-chip{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--dsw-alias-border-l2);border-radius:999px;padding:3px 10px;font-size:11px;color:var(--dsw-alias-label-secondary)}
68924
69114
  .qa-card-chip b{font-weight:600;color:var(--dsw-alias-label-primary)}
68925
69115
  .qa-card-chip.off{color:var(--dsw-alias-label-tertiary)}
68926
- .qa-card-notice{padding:9px 11px;border-radius:8px;background:var(--dsw-alias-bg-module-platform);border:1px solid var(--dsw-alias-border-l2);font-size:11px;line-height:1.5;color:var(--dsw-alias-label-secondary)}
69116
+ .qa-card-notice{padding:9px 11px;border-radius:8px;background:var(--dsw-alias-bg-module-platform);border:1px solid var(--dsw-alias-border-l2);font-size:14px;line-height:1.5;color:var(--dsw-alias-label-secondary)}
68927
69117
  .qa-card-notice.warn{border-color:var(--dsw-alias-label-dimmed);color:var(--dsw-alias-label-primary)}
68928
- .qa-card-error{padding:9px 11px;border-radius:8px;background:color-mix(in srgb, var(--dsw-alias-state-error-primary, #b3261e) 8%, transparent);color:var(--dsw-alias-state-error-primary, #b3261e);font-size:11px;line-height:1.5}
69118
+ .qa-card-error{padding:9px 11px;border-radius:8px;background:color-mix(in srgb, var(--dsw-alias-state-error-primary, #b3261e) 8%, transparent);color:var(--dsw-alias-state-error-primary, #b3261e);font-size:14px;line-height:1.5}
68929
69119
  .qa-card-advanced{border:1px solid var(--dsw-alias-border-l2);border-radius:10px;padding:0 12px}
68930
- .qa-card-advanced summary{cursor:pointer;padding:11px 0;font-size:12px;font-weight:600}
69120
+ .qa-card-advanced summary{cursor:pointer;padding:11px 0;font-size:16px;font-weight:600}
68931
69121
  .qa-card-advanced summary:focus-visible{outline:var(--dsw-focus-ring-width, 2px) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));outline-offset:-1px}
68932
69122
  .qa-card-advanced-content{padding:2px 0 13px;display:grid;gap:10px}
68933
69123
  .qa-card-rows{display:grid;gap:6px}