agentworkshop 0.7.21 → 0.7.23

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 (105) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/BJbhwS5o.js +1 -0
  3. package/.output/public/_nuxt/Bo8t5fkJ.js +1 -0
  4. package/.output/public/_nuxt/{DBXhDLgl.js → BuiGDfMB.js} +1 -1
  5. package/.output/public/_nuxt/{QT54MQV9.js → C53drffV.js} +1 -1
  6. package/.output/public/_nuxt/{BA3XzwiD.js → CEHmSufQ.js} +2 -2
  7. package/.output/public/_nuxt/Dc32T41C.js +1 -0
  8. package/.output/public/_nuxt/DtzZqC0z.js +1 -0
  9. package/.output/public/_nuxt/{BOJaHO5V.js → Ko9mMsJj.js} +3 -3
  10. package/.output/public/_nuxt/{TownView.BHLKAjEu.css → TownView.zu2rU5nS.css} +1 -1
  11. package/.output/public/_nuxt/_id_.C-YXjn8Q.css +1 -0
  12. package/.output/public/_nuxt/_id_.MbzdFygI.css +1 -0
  13. package/.output/public/_nuxt/_wsId_.BqWBlY7X.css +1 -0
  14. package/.output/public/_nuxt/builds/latest.json +1 -1
  15. package/.output/public/_nuxt/builds/meta/1adc96e0-8bbd-4a79-ac7e-b6952556fef8.json +1 -0
  16. package/.output/public/_nuxt/daq.3OKj58HH.css +1 -0
  17. package/.output/public/_nuxt/dbi5bHkY.js +2 -0
  18. package/.output/public/_nuxt/dcw.rXH2fc2Z.css +1 -0
  19. package/.output/public/_nuxt/entry.OR_psZHp.css +1 -0
  20. package/.output/public/_nuxt/{DsOkkMX3.js → jyQyulh-.js} +1 -1
  21. package/.output/public/_nuxt/logs.DMOM-iHe.css +1 -0
  22. package/.output/public/_nuxt/{B-E8fXAO.js → n3vMFfrv.js} +1 -1
  23. package/.output/server/chunks/_/nitro.mjs +842 -717
  24. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  25. package/.output/server/chunks/build/{TownView-ql2eHZOg.mjs → TownView-DxeQe1Bl.mjs} +144 -143
  26. package/.output/server/chunks/build/{TownView-ql2eHZOg.mjs.map → TownView-DxeQe1Bl.mjs.map} +1 -1
  27. package/.output/server/chunks/build/{_id_-CwR5oLu9.mjs → _id_-DQDqj-cZ.mjs} +33 -35
  28. package/.output/server/chunks/build/_id_-DQDqj-cZ.mjs.map +1 -0
  29. package/.output/server/chunks/build/{_id_-Bs-euJPu.mjs → _id_-DY6v6sqB.mjs} +138 -137
  30. package/.output/server/chunks/build/_id_-DY6v6sqB.mjs.map +1 -0
  31. package/.output/server/chunks/build/{_wsId_-B3aB9bIp.mjs → _wsId_-C2O5zZsI.mjs} +6 -6
  32. package/.output/server/chunks/build/{_wsId_-B3aB9bIp.mjs.map → _wsId_-C2O5zZsI.mjs.map} +1 -1
  33. package/.output/server/chunks/build/{daq-epWL_sC7.mjs → daq-B-3xCp_2.mjs} +146 -118
  34. package/.output/server/chunks/build/daq-B-3xCp_2.mjs.map +1 -0
  35. package/.output/server/chunks/build/{dcw-CBPaFj2f.mjs → dcw-BL2dhuz7.mjs} +43 -43
  36. package/.output/server/chunks/build/{dcw-CBPaFj2f.mjs.map → dcw-BL2dhuz7.mjs.map} +1 -1
  37. package/.output/server/chunks/build/{logs-Bz1p6x_5.mjs → logs-Dto_umFY.mjs} +44 -38
  38. package/.output/server/chunks/build/logs-Dto_umFY.mjs.map +1 -0
  39. package/.output/server/chunks/build/{pages-Dq7_H4FK.mjs → pages-D9tOoJsf.mjs} +2 -2
  40. package/.output/server/chunks/build/{pages-Dq7_H4FK.mjs.map → pages-D9tOoJsf.mjs.map} +1 -1
  41. package/.output/server/chunks/build/{town-CstiKxf_.mjs → town-Dsh0jlwZ.mjs} +3 -3
  42. package/.output/server/chunks/build/{town-CstiKxf_.mjs.map → town-Dsh0jlwZ.mjs.map} +1 -1
  43. package/.output/server/chunks/build/{useDaqStream-BOOZ-p-l.mjs → useDaqStream-DkRL3tEW.mjs} +9 -1
  44. package/.output/server/chunks/build/{useDaqStream-BOOZ-p-l.mjs.map → useDaqStream-DkRL3tEW.mjs.map} +1 -1
  45. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs +1 -1
  46. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs.map +1 -1
  47. package/.output/server/chunks/routes/api/workshop/daq/_id/bindings.put.mjs +34 -0
  48. package/.output/server/chunks/routes/api/workshop/daq/_id/bindings.put.mjs.map +1 -0
  49. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +1 -1
  50. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs.map +1 -1
  51. package/.output/server/chunks/routes/api/workshop/dcw/_id/bindings.put.mjs +33 -0
  52. package/.output/server/chunks/routes/api/workshop/dcw/_id/bindings.put.mjs.map +1 -0
  53. package/.output/server/chunks/routes/renderer.mjs +1 -1
  54. package/.output/server/chunks/virtual/entry.mjs +16 -8
  55. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  56. package/.output/server/package.json +1 -1
  57. package/app/assets/css/main.css +306 -161
  58. package/app/components/workshop/blocks/ClusterArtifact.vue +0 -16
  59. package/app/components/workshop/town/TownView.vue +7082 -7076
  60. package/app/composables/workshop/useDaqStream.ts +10 -0
  61. package/app/pages/daq/[id].vue +919 -937
  62. package/app/pages/daq/index.vue +67 -43
  63. package/app/pages/dcw/[id].vue +6 -5
  64. package/app/pages/dcw/index.vue +1 -30
  65. package/app/pages/logs/index.vue +99 -87
  66. package/i18n/locales/en.ts +3 -0
  67. package/i18n/locales/zh-CN.ts +5 -0
  68. package/package.json +148 -148
  69. package/scripts/_dbg-device-bind-e2e.mjs +129 -0
  70. package/scripts/_dbg-logs-ui-e2e.py +125 -0
  71. package/server/api/workshop/daq/[id]/bind.post.ts +5 -2
  72. package/server/api/workshop/daq/[id]/bindings.put.ts +22 -0
  73. package/server/api/workshop/dcw/[id]/bind.post.ts +4 -2
  74. package/server/api/workshop/dcw/[id]/bindings.put.ts +21 -0
  75. package/server/data/daqs.json +405 -100
  76. package/server/data/dcw-lines.json +7 -0
  77. package/server/data/dcw-rollback.json +21 -10
  78. package/server/data/dcw-runs.json +50 -54
  79. package/server/data/dcw-writes.json +24 -0
  80. package/server/data/dcws.json +505 -216
  81. package/server/data/line-runs.json +18 -18
  82. package/server/services/workshop/agents/industrial-context.ts +231 -222
  83. package/server/services/workshop/daq/daq-controller.ts +76 -23
  84. package/server/services/workshop/daq/daq-node.ts +11 -1
  85. package/server/services/workshop/dcw/dcw-controller.ts +50 -2
  86. package/server/services/workshop/dcw/dcw-node.ts +10 -1
  87. package/shared/daq-protocol.ts +2 -0
  88. package/shared/dcw-protocol.ts +2 -0
  89. package/.output/public/_nuxt/B_C3GLsD.js +0 -1
  90. package/.output/public/_nuxt/Ba7YofCb.js +0 -2
  91. package/.output/public/_nuxt/C_2bTK0C.js +0 -1
  92. package/.output/public/_nuxt/CgT5wMfz.js +0 -1
  93. package/.output/public/_nuxt/D4CLp1hc.js +0 -1
  94. package/.output/public/_nuxt/_id_.DIxEKj88.css +0 -1
  95. package/.output/public/_nuxt/_id_.IbmpkhH4.css +0 -1
  96. package/.output/public/_nuxt/_wsId_.BFyCuUwS.css +0 -1
  97. package/.output/public/_nuxt/builds/meta/5d344836-03a5-4f47-a0a7-fd30192f5a8f.json +0 -1
  98. package/.output/public/_nuxt/daq.6IrhVVfy.css +0 -1
  99. package/.output/public/_nuxt/dcw.rpqpOYQ8.css +0 -1
  100. package/.output/public/_nuxt/entry.DRUzDwmX.css +0 -1
  101. package/.output/public/_nuxt/logs.BarkrvUp.css +0 -1
  102. package/.output/server/chunks/build/_id_-Bs-euJPu.mjs.map +0 -1
  103. package/.output/server/chunks/build/_id_-CwR5oLu9.mjs.map +0 -1
  104. package/.output/server/chunks/build/daq-epWL_sC7.mjs.map +0 -1
  105. package/.output/server/chunks/build/logs-Bz1p6x_5.mjs.map +0 -1
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentworkshop-prod",
3
- "version": "0.7.21",
3
+ "version": "0.7.23",
4
4
  "type": "module",
5
5
  "private": true,
6
6
  "dependencies": {
@@ -617,6 +617,151 @@ ul.task-list {
617
617
  border-color: var(--line-strong);
618
618
  }
619
619
 
620
+ /* ── 页面按钮词汇(全局唯一权威定义,原各页散落定义已收编)──
621
+ * pill-btn 主操作(accent 药丸)/ outline 次级 / danger·stop 危险;
622
+ * ghost-btn 取消/次要;mini-btn 轻量紧凑。形态语言与 aw-pill 同族。 */
623
+ .pill-btn {
624
+ display: inline-flex;
625
+ align-items: center;
626
+ justify-content: center;
627
+ gap: 6px;
628
+ padding: 7px 15px;
629
+ font-family: var(--font-body);
630
+ font-size: 12.5px;
631
+ font-weight: 600;
632
+ line-height: 1.2;
633
+ color: var(--on-accent);
634
+ cursor: pointer;
635
+ user-select: none;
636
+ background: var(--accent);
637
+ border: 1px solid var(--accent);
638
+ border-radius: var(--radius-pill);
639
+ text-decoration: none;
640
+ transition:
641
+ background-color var(--transition-fast),
642
+ border-color var(--transition-fast),
643
+ color var(--transition-fast),
644
+ box-shadow var(--transition-fast),
645
+ transform 160ms cubic-bezier(0.22, 1, 0.36, 1);
646
+ }
647
+
648
+ .pill-btn:hover:not(:disabled) {
649
+ background: var(--accent-strong);
650
+ border-color: var(--accent-strong);
651
+ box-shadow: 0 0 14px var(--accent-soft);
652
+ }
653
+
654
+ .pill-btn:active:not(:disabled) {
655
+ transform: scale(0.97);
656
+ }
657
+
658
+ .pill-btn:disabled {
659
+ opacity: 0.45;
660
+ cursor: default;
661
+ }
662
+
663
+ .pill-btn.outline {
664
+ color: var(--ink);
665
+ background: var(--paper-raised);
666
+ border-color: var(--line-strong);
667
+ }
668
+
669
+ .pill-btn.outline:hover:not(:disabled) {
670
+ background: var(--paper-deep);
671
+ border-color: var(--line-strong);
672
+ box-shadow: none;
673
+ }
674
+
675
+ .pill-btn.danger,
676
+ .pill-btn.stop {
677
+ color: var(--tone-danger-dot);
678
+ background: var(--tone-danger-bg);
679
+ border-color: transparent;
680
+ }
681
+
682
+ .pill-btn.danger:hover:not(:disabled),
683
+ .pill-btn.stop:hover:not(:disabled) {
684
+ background: color-mix(in srgb, var(--tone-danger-dot) 26%, transparent);
685
+ box-shadow: none;
686
+ }
687
+
688
+ .ghost-btn {
689
+ display: inline-flex;
690
+ align-items: center;
691
+ justify-content: center;
692
+ gap: 6px;
693
+ padding: 7px 14px;
694
+ font-family: var(--font-body);
695
+ font-size: 12.5px;
696
+ font-weight: 500;
697
+ line-height: 1.2;
698
+ color: var(--ink-soft);
699
+ cursor: pointer;
700
+ background: transparent;
701
+ border: 1px solid var(--line-strong);
702
+ border-radius: var(--radius-pill);
703
+ transition:
704
+ background-color var(--transition-fast),
705
+ border-color var(--transition-fast),
706
+ color var(--transition-fast),
707
+ transform 160ms cubic-bezier(0.22, 1, 0.36, 1);
708
+ }
709
+
710
+ .ghost-btn:hover:not(:disabled) {
711
+ color: var(--ink);
712
+ background: var(--hover-tint);
713
+ }
714
+
715
+ .ghost-btn:active:not(:disabled) {
716
+ transform: scale(0.97);
717
+ }
718
+
719
+ .ghost-btn:disabled {
720
+ opacity: 0.45;
721
+ cursor: default;
722
+ }
723
+
724
+ .mini-btn {
725
+ display: inline-flex;
726
+ align-items: center;
727
+ justify-content: center;
728
+ gap: 4px;
729
+ padding: 4px 11px;
730
+ font-family: var(--font-body);
731
+ font-size: 12px;
732
+ font-weight: 500;
733
+ line-height: 1.3;
734
+ color: var(--ink-soft);
735
+ cursor: pointer;
736
+ background: var(--paper-deep);
737
+ border: 1px solid var(--line-strong);
738
+ border-radius: var(--radius-chip);
739
+ transition:
740
+ background-color var(--transition-fast),
741
+ border-color var(--transition-fast),
742
+ color var(--transition-fast),
743
+ transform 160ms cubic-bezier(0.22, 1, 0.36, 1);
744
+ }
745
+
746
+ .mini-btn:hover:not(:disabled) {
747
+ color: var(--ink);
748
+ background: var(--hover-tint);
749
+ border-color: var(--ink-fainter);
750
+ }
751
+
752
+ .mini-btn:active:not(:disabled) {
753
+ transform: scale(0.97);
754
+ }
755
+
756
+ .mini-btn.danger {
757
+ color: var(--tone-danger-dot);
758
+ }
759
+
760
+ .mini-btn:disabled {
761
+ opacity: 0.45;
762
+ cursor: default;
763
+ }
764
+
620
765
  /* 幽灵图标钮(28px 方,hover 浮 surface;按压缩放反馈) */
621
766
  .aw-ghost {
622
767
  display: inline-flex;
@@ -1255,164 +1400,164 @@ ul.task-list {
1255
1400
  animation-duration: 200ms !important;
1256
1401
  }
1257
1402
  }
1258
-
1259
- /* ============================================================
1260
- * Warm Editorial · v2 polish(0.7.12)
1261
- * 评审驱动的五笔:图表色板归位 / 表格系统细化 / 空态组件 / 页眉归队 / 动效补全。
1262
- * 原则不变:transform/opacity only;reduced-motion 收敛;反 AI 味。
1263
- * ============================================================ */
1264
-
1265
- :root {
1266
- /* 图表调色板:暖纸体系的同类色序(替代 ECharts 默认荧光绿/蓝绿琥珀三连) */
1267
- --chart-1: #4a6b57; /* 墨绿 —— 首序 */
1268
- --chart-2: #8aa07c; /* 苔绿 */
1269
- --chart-3: #c9a26a; /* 琥珀纸 */
1270
- --chart-4: #b3714f; /* 陶赭 */
1271
- --chart-5: #6f8296; /* 青灰 */
1272
- --chart-track: color-mix(in srgb, var(--ink) 8%, transparent);
1273
-
1274
- /* 动效时长刻度(animate 规范:UI <300ms;hover 100-160;浮层 150-250) */
1275
- --dur-press: 120ms;
1276
- --dur-control: 160ms;
1277
- --dur-overlay: 220ms;
1278
- }
1279
-
1280
- /* ── 图表:坐标轴/图例融入油墨体系;数据序用暖纸色板 ── */
1281
- .aw-chart .ant-table,
1282
- .aw-chart text {
1283
- font-family: var(--font-body);
1284
- }
1285
-
1286
- /* ── 表格系统细化:数字等宽 / 行内操作渐显 / 表头字距 ── */
1287
- .ant-table .ant-table-cell {
1288
- font-variant-numeric: tabular-nums;
1289
- }
1290
-
1291
- .ant-table .ant-table-tbody > tr {
1292
- transition: background-color var(--transition-fast);
1293
- }
1294
-
1295
- /* 行内操作默认半隐,行悬停渐显(降低常驻视觉噪音;触屏/键盘可达性不受影响) */
1296
- @media (hover: hover) and (pointer: fine) {
1297
- .ant-table .ant-table-tbody .row-quiet {
1298
- opacity: 0.45;
1299
- transition: opacity var(--transition-fast);
1300
- }
1301
-
1302
- .ant-table .ant-table-tbody > tr:hover .row-quiet,
1303
- .ant-table .ant-table-tbody > tr:focus-within .row-quiet {
1304
- opacity: 1;
1305
- }
1306
- }
1307
-
1308
- /* ── 空态:细线一道 + 衬线一句 + 导语(拒绝大块剪影图形) ── */
1309
- .aw-empty {
1310
- display: flex;
1311
- flex-direction: column;
1312
- gap: 10px;
1313
- align-items: center;
1314
- padding: 72px 0;
1315
- text-align: center;
1316
- }
1317
-
1318
- .aw-empty::before {
1319
- content: '';
1320
- width: 44px;
1321
- height: 1px;
1322
- background: var(--ink-fainter);
1323
- }
1324
-
1325
- .aw-empty .aw-empty-title {
1326
- font-family: var(--font-display);
1327
- font-size: 19px;
1328
- color: var(--ink-soft);
1329
- }
1330
-
1331
- .aw-empty .aw-empty-sub {
1332
- max-width: 46ch;
1333
- font-size: 12.5px;
1334
- color: var(--ink-faint);
1335
- }
1336
-
1337
- /* ── 状态呼吸点:运行中/live 信号(2s 缓呼吸;reduced-motion 静止) ── */
1338
- .aw-live-dot {
1339
- display: inline-block;
1340
- width: 7px;
1341
- height: 7px;
1342
- margin-right: 6px;
1343
- vertical-align: 1px;
1344
- border-radius: 50%;
1345
- background: var(--tone-live-dot, #b9770e);
1346
- }
1347
-
1348
- @media (prefers-reduced-motion: no-preference) {
1349
- .aw-live-dot {
1350
- animation: aw-breathe 2.2s ease-in-out infinite;
1351
- }
1352
-
1353
- @keyframes aw-breathe {
1354
- 0%, 100% { opacity: 1; }
1355
- 50% { opacity: 0.35; }
1356
- }
1357
- }
1358
-
1359
- /* ── 卡片悬停抬升:统一递给所有 .aw-liftable(4px 上移 + hairline 转墨) ── */
1360
- @media (hover: hover) and (pointer: fine) and (prefers-reduced-motion: no-preference) {
1361
- .aw-liftable {
1362
- transition:
1363
- transform var(--dur-control) var(--ease-out-quart),
1364
- border-color var(--transition-fast),
1365
- box-shadow var(--dur-control) var(--ease-out-quart);
1366
- }
1367
-
1368
- .aw-liftable:hover {
1369
- transform: translateY(-3px);
1370
- border-color: color-mix(in srgb, var(--ink) 24%, transparent);
1371
- box-shadow: 0 6px 18px rgb(12 10 9 / 7%);
1372
- }
1373
- }
1374
-
1375
- /* ── 页面进场编排的网格扩展:stagger 之前只覆盖 6 个子元素,补到 12(卡片墙/表格页) ── */
1376
- @media (prefers-reduced-motion: no-preference) {
1377
- .aw-stagger > :nth-child(7) { animation-delay: 0.3s; }
1378
- .aw-stagger > :nth-child(8) { animation-delay: 0.35s; }
1379
- .aw-stagger > :nth-child(9) { animation-delay: 0.4s; }
1380
- .aw-stagger > :nth-child(10) { animation-delay: 0.45s; }
1381
- .aw-stagger > :nth-child(11) { animation-delay: 0.5s; }
1382
- .aw-stagger > :nth-child(12) { animation-delay: 0.55s; }
1383
- }
1384
-
1385
- /* ── 表头对齐:左对齐与正文一致(数字列右对齐由页面按列声明) ── */
1386
- .ant-table .ant-table-thead > tr > th {
1387
- text-align: left;
1388
- }
1389
-
1390
- /* ── 空表占位:替换 ant 默认黑色团状图形为细线风格 ── */
1391
- .ant-empty-image {
1392
- display: flex;
1393
- justify-content: center;
1394
- }
1395
-
1396
- .ant-empty-image svg {
1397
- width: 44px;
1398
- height: 44px;
1399
- fill: none;
1400
- stroke: var(--ink-fainter);
1401
- stroke-width: 1.25;
1402
- opacity: 0.8;
1403
- }
1404
-
1405
- .ant-empty-description {
1406
- color: var(--ink-faint);
1407
- font-size: 12.5px;
1408
- }
1409
-
1410
- /* ── tokens 吊销:安静墨灰,悬停转红(红色只留给确认瞬间) ── */
1411
- .tok-revoke {
1412
- color: var(--ink-faint) !important;
1413
- transition: color var(--transition-fast);
1414
- }
1415
-
1416
- .tok-revoke:hover {
1417
- color: var(--tone-danger-dot, #c25a4e) !important;
1418
- }
1403
+
1404
+ /* ============================================================
1405
+ * Warm Editorial · v2 polish(0.7.12)
1406
+ * 评审驱动的五笔:图表色板归位 / 表格系统细化 / 空态组件 / 页眉归队 / 动效补全。
1407
+ * 原则不变:transform/opacity only;reduced-motion 收敛;反 AI 味。
1408
+ * ============================================================ */
1409
+
1410
+ :root {
1411
+ /* 图表调色板:暖纸体系的同类色序(替代 ECharts 默认荧光绿/蓝绿琥珀三连) */
1412
+ --chart-1: #4a6b57; /* 墨绿 —— 首序 */
1413
+ --chart-2: #8aa07c; /* 苔绿 */
1414
+ --chart-3: #c9a26a; /* 琥珀纸 */
1415
+ --chart-4: #b3714f; /* 陶赭 */
1416
+ --chart-5: #6f8296; /* 青灰 */
1417
+ --chart-track: color-mix(in srgb, var(--ink) 8%, transparent);
1418
+
1419
+ /* 动效时长刻度(animate 规范:UI <300ms;hover 100-160;浮层 150-250) */
1420
+ --dur-press: 120ms;
1421
+ --dur-control: 160ms;
1422
+ --dur-overlay: 220ms;
1423
+ }
1424
+
1425
+ /* ── 图表:坐标轴/图例融入油墨体系;数据序用暖纸色板 ── */
1426
+ .aw-chart .ant-table,
1427
+ .aw-chart text {
1428
+ font-family: var(--font-body);
1429
+ }
1430
+
1431
+ /* ── 表格系统细化:数字等宽 / 行内操作渐显 / 表头字距 ── */
1432
+ .ant-table .ant-table-cell {
1433
+ font-variant-numeric: tabular-nums;
1434
+ }
1435
+
1436
+ .ant-table .ant-table-tbody > tr {
1437
+ transition: background-color var(--transition-fast);
1438
+ }
1439
+
1440
+ /* 行内操作默认半隐,行悬停渐显(降低常驻视觉噪音;触屏/键盘可达性不受影响) */
1441
+ @media (hover: hover) and (pointer: fine) {
1442
+ .ant-table .ant-table-tbody .row-quiet {
1443
+ opacity: 0.45;
1444
+ transition: opacity var(--transition-fast);
1445
+ }
1446
+
1447
+ .ant-table .ant-table-tbody > tr:hover .row-quiet,
1448
+ .ant-table .ant-table-tbody > tr:focus-within .row-quiet {
1449
+ opacity: 1;
1450
+ }
1451
+ }
1452
+
1453
+ /* ── 空态:细线一道 + 衬线一句 + 导语(拒绝大块剪影图形) ── */
1454
+ .aw-empty {
1455
+ display: flex;
1456
+ flex-direction: column;
1457
+ gap: 10px;
1458
+ align-items: center;
1459
+ padding: 72px 0;
1460
+ text-align: center;
1461
+ }
1462
+
1463
+ .aw-empty::before {
1464
+ content: '';
1465
+ width: 44px;
1466
+ height: 1px;
1467
+ background: var(--ink-fainter);
1468
+ }
1469
+
1470
+ .aw-empty .aw-empty-title {
1471
+ font-family: var(--font-display);
1472
+ font-size: 19px;
1473
+ color: var(--ink-soft);
1474
+ }
1475
+
1476
+ .aw-empty .aw-empty-sub {
1477
+ max-width: 46ch;
1478
+ font-size: 12.5px;
1479
+ color: var(--ink-faint);
1480
+ }
1481
+
1482
+ /* ── 状态呼吸点:运行中/live 信号(2s 缓呼吸;reduced-motion 静止) ── */
1483
+ .aw-live-dot {
1484
+ display: inline-block;
1485
+ width: 7px;
1486
+ height: 7px;
1487
+ margin-right: 6px;
1488
+ vertical-align: 1px;
1489
+ border-radius: 50%;
1490
+ background: var(--tone-live-dot, #b9770e);
1491
+ }
1492
+
1493
+ @media (prefers-reduced-motion: no-preference) {
1494
+ .aw-live-dot {
1495
+ animation: aw-breathe 2.2s ease-in-out infinite;
1496
+ }
1497
+
1498
+ @keyframes aw-breathe {
1499
+ 0%, 100% { opacity: 1; }
1500
+ 50% { opacity: 0.35; }
1501
+ }
1502
+ }
1503
+
1504
+ /* ── 卡片悬停抬升:统一递给所有 .aw-liftable(4px 上移 + hairline 转墨) ── */
1505
+ @media (hover: hover) and (pointer: fine) and (prefers-reduced-motion: no-preference) {
1506
+ .aw-liftable {
1507
+ transition:
1508
+ transform var(--dur-control) var(--ease-out-quart),
1509
+ border-color var(--transition-fast),
1510
+ box-shadow var(--dur-control) var(--ease-out-quart);
1511
+ }
1512
+
1513
+ .aw-liftable:hover {
1514
+ transform: translateY(-3px);
1515
+ border-color: color-mix(in srgb, var(--ink) 24%, transparent);
1516
+ box-shadow: 0 6px 18px rgb(12 10 9 / 7%);
1517
+ }
1518
+ }
1519
+
1520
+ /* ── 页面进场编排的网格扩展:stagger 之前只覆盖 6 个子元素,补到 12(卡片墙/表格页) ── */
1521
+ @media (prefers-reduced-motion: no-preference) {
1522
+ .aw-stagger > :nth-child(7) { animation-delay: 0.3s; }
1523
+ .aw-stagger > :nth-child(8) { animation-delay: 0.35s; }
1524
+ .aw-stagger > :nth-child(9) { animation-delay: 0.4s; }
1525
+ .aw-stagger > :nth-child(10) { animation-delay: 0.45s; }
1526
+ .aw-stagger > :nth-child(11) { animation-delay: 0.5s; }
1527
+ .aw-stagger > :nth-child(12) { animation-delay: 0.55s; }
1528
+ }
1529
+
1530
+ /* ── 表头对齐:左对齐与正文一致(数字列右对齐由页面按列声明) ── */
1531
+ .ant-table .ant-table-thead > tr > th {
1532
+ text-align: left;
1533
+ }
1534
+
1535
+ /* ── 空表占位:替换 ant 默认黑色团状图形为细线风格 ── */
1536
+ .ant-empty-image {
1537
+ display: flex;
1538
+ justify-content: center;
1539
+ }
1540
+
1541
+ .ant-empty-image svg {
1542
+ width: 44px;
1543
+ height: 44px;
1544
+ fill: none;
1545
+ stroke: var(--ink-fainter);
1546
+ stroke-width: 1.25;
1547
+ opacity: 0.8;
1548
+ }
1549
+
1550
+ .ant-empty-description {
1551
+ color: var(--ink-faint);
1552
+ font-size: 12.5px;
1553
+ }
1554
+
1555
+ /* ── tokens 吊销:安静墨灰,悬停转红(红色只留给确认瞬间) ── */
1556
+ .tok-revoke {
1557
+ color: var(--ink-faint) !important;
1558
+ transition: color var(--transition-fast);
1559
+ }
1560
+
1561
+ .tok-revoke:hover {
1562
+ color: var(--tone-danger-dot, #c25a4e) !important;
1563
+ }
@@ -55,22 +55,6 @@ const expanded = ref(props.block.dupStream)
55
55
  font-size: 10px;
56
56
  color: var(--ink-faint);
57
57
  }
58
- .mini-btn {
59
- padding: 1px 10px;
60
- font-family: var(--font-mono);
61
- font-size: 10px;
62
- color: var(--ink-faint);
63
- cursor: pointer;
64
- background: transparent;
65
- border: 1px solid var(--line-strong);
66
- border-radius: var(--radius-chip);
67
- transition: color var(--transition-fast), border-color var(--transition-fast), background var(--transition-fast);
68
- }
69
- .mini-btn:hover {
70
- color: var(--ink);
71
- background: var(--hover-tint);
72
- border-color: var(--ink-fainter);
73
- }
74
58
  .artifact-cluster > :deep(.artifact-card) {
75
59
  margin-top: 4px;
76
60
  }