agentworkshop 0.7.22 → 0.7.24

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 (208) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/0jKrzLuM.js +19 -0
  3. package/.output/public/_nuxt/{Cor9siSf.js → 6PZPfFcO.js} +1 -1
  4. package/.output/public/_nuxt/BAfp6tmu.js +14 -0
  5. package/.output/public/_nuxt/{B-xskWta.js → BCJFMBQ6.js} +1 -1
  6. package/.output/public/_nuxt/{DNxVTfhe.js → BMb80_tm.js} +1 -1
  7. package/.output/public/_nuxt/{n3vMFfrv.js → Bc-_IsBP.js} +3 -3
  8. package/.output/public/_nuxt/BvNJUu3s.js +1 -0
  9. package/.output/public/_nuxt/C1CSiSBN.js +1 -0
  10. package/.output/public/_nuxt/CAGL7TNK.js +1 -0
  11. package/.output/public/_nuxt/{ed5qX-x5.js → CDLv-n51.js} +1 -1
  12. package/.output/public/_nuxt/CJviSvm-.js +1 -0
  13. package/.output/public/_nuxt/CLZWFhZC.js +1 -0
  14. package/.output/public/_nuxt/{Cr9DkD1d.js → CYzpZzB_.js} +1 -1
  15. package/.output/public/_nuxt/Cb3SnTM8.js +1 -0
  16. package/.output/public/_nuxt/CjXIpPMR.js +1 -0
  17. package/.output/public/_nuxt/CmHzfVc5.js +3 -0
  18. package/.output/public/_nuxt/Cn3J3NXR.js +23 -0
  19. package/.output/public/_nuxt/Coik560n.js +1 -0
  20. package/.output/public/_nuxt/{DA4lxCWC2.js → Ct68Z0232.js} +1 -1
  21. package/.output/public/_nuxt/CuVGPuP1.js +1 -0
  22. package/.output/public/_nuxt/CxY6LfeN.js +1 -0
  23. package/.output/public/_nuxt/{CfVAr2nf.js → Cz9gD2Yo.js} +1 -1
  24. package/.output/public/_nuxt/D6HDb-vN2.js +1 -0
  25. package/.output/public/_nuxt/{E88a-JCG.js → DGAOugLt.js} +1 -1
  26. package/.output/public/_nuxt/DKHcFE1i.js +1 -0
  27. package/.output/public/_nuxt/{BxtpDtzC.js → DNQF_TXX.js} +1 -1
  28. package/.output/public/_nuxt/DSa2O56y.js +1 -0
  29. package/.output/public/_nuxt/DUToq-k_.js +1 -0
  30. package/.output/public/_nuxt/Dfe8vXdG.js +1 -0
  31. package/.output/public/_nuxt/{0exC4jVL.js → Djir5rSD.js} +2 -2
  32. package/.output/public/_nuxt/DjtE7AYt.js +1 -0
  33. package/.output/public/_nuxt/{BBwMH_hG.js → DoAlYsiF.js} +1 -1
  34. package/.output/public/_nuxt/{DWcEk1ur2.js → DvgKXPgu2.js} +1 -1
  35. package/.output/public/_nuxt/JOwsShod.js +2 -0
  36. package/.output/public/_nuxt/X6IraCTB.js +1 -0
  37. package/.output/public/_nuxt/_id_.C-YXjn8Q.css +1 -0
  38. package/.output/public/_nuxt/_id_.MbzdFygI.css +1 -0
  39. package/.output/public/_nuxt/_wsId_.BqWBlY7X.css +1 -0
  40. package/.output/public/_nuxt/{CYBq3kS7.js → b50gYVZl.js} +1 -1
  41. package/.output/public/_nuxt/builds/latest.json +1 -1
  42. package/.output/public/_nuxt/builds/meta/024de5f7-6a10-4f53-82ab-bc65f3ec9e35.json +1 -0
  43. package/.output/public/_nuxt/daq.3OKj58HH.css +1 -0
  44. package/.output/public/_nuxt/dcw.rXH2fc2Z.css +1 -0
  45. package/.output/public/_nuxt/entry.AZM1Culo.css +1 -0
  46. package/.output/public/_nuxt/logs.DMOM-iHe.css +1 -0
  47. package/.output/public/_nuxt/monitor.B--1dPzs.css +1 -0
  48. package/.output/public/_nuxt/permissions.B1pjGChZ.css +1 -0
  49. package/.output/public/_nuxt/plugins.DpCuwaJt.css +1 -0
  50. package/.output/public/_nuxt/tokens.xRb1fSPU.css +1 -0
  51. package/.output/public/_nuxt/users.DuAt_Zwf.css +1 -0
  52. package/.output/public/_nuxt/workshop.BJg84pOK.css +1 -0
  53. package/.output/server/chunks/_/nitro.mjs +777 -798
  54. package/.output/server/chunks/build/{OmpTerminalPanel-Ban3yJZ4.mjs → OmpTerminalPanel-Cw_Vw9oO.mjs} +3 -3
  55. package/.output/server/chunks/build/{OmpTerminalPanel-Ban3yJZ4.mjs.map → OmpTerminalPanel-Cw_Vw9oO.mjs.map} +1 -1
  56. package/.output/server/chunks/build/{_id_-B9RvEQFC.mjs → _id_-DQDqj-cZ.mjs} +31 -31
  57. package/.output/server/chunks/build/{_id_-B9RvEQFC.mjs.map → _id_-DQDqj-cZ.mjs.map} +1 -1
  58. package/.output/server/chunks/build/{_id_-CqF0R5W5.mjs → _id_-DY6v6sqB.mjs} +135 -135
  59. package/.output/server/chunks/build/{_id_-CqF0R5W5.mjs.map → _id_-DY6v6sqB.mjs.map} +1 -1
  60. package/.output/server/chunks/build/{_wsId_-YC2t_fRt.mjs → _wsId_-D38Vx6Ky.mjs} +11 -13
  61. package/.output/server/chunks/build/{_wsId_-YC2t_fRt.mjs.map → _wsId_-D38Vx6Ky.mjs.map} +1 -1
  62. package/.output/server/chunks/build/{agents--6bzGtES.mjs → agents-GnmUGZir.mjs} +6 -8
  63. package/.output/server/chunks/build/agents-GnmUGZir.mjs.map +1 -0
  64. package/.output/server/chunks/build/button-DEcZFcqN.mjs +1 -1
  65. package/.output/server/chunks/build/{card-CCPQoKlh.mjs → card-Dipvaykh.mjs} +4 -4
  66. package/.output/server/chunks/build/{card-CCPQoKlh.mjs.map → card-Dipvaykh.mjs.map} +1 -1
  67. package/.output/server/chunks/build/{channel-templates-C1Bb-U75.mjs → channel-templates-B4z6v8Z5.mjs} +4 -6
  68. package/.output/server/chunks/build/channel-templates-B4z6v8Z5.mjs.map +1 -0
  69. package/.output/server/chunks/build/{checkbox-Dv1kjaUZ.mjs → checkbox-dzcpU_Cd.mjs} +2 -2
  70. package/.output/server/chunks/build/{checkbox-Dv1kjaUZ.mjs.map → checkbox-dzcpU_Cd.mjs.map} +1 -1
  71. package/.output/server/chunks/build/{daq-Bhwwz9vp.mjs → daq-B-3xCp_2.mjs} +103 -103
  72. package/.output/server/chunks/build/{daq-Bhwwz9vp.mjs.map → daq-B-3xCp_2.mjs.map} +1 -1
  73. package/.output/server/chunks/build/{dcw-CBPaFj2f.mjs → dcw-BL2dhuz7.mjs} +43 -43
  74. package/.output/server/chunks/build/{dcw-CBPaFj2f.mjs.map → dcw-BL2dhuz7.mjs.map} +1 -1
  75. package/.output/server/chunks/build/{default-DdV642BY.mjs → default-CLf5m0NE.mjs} +2 -3
  76. package/.output/server/chunks/build/{default-DdV642BY.mjs.map → default-CLf5m0NE.mjs.map} +1 -1
  77. package/.output/server/chunks/build/dropdown-vhn1NPFs.mjs +1 -1
  78. package/.output/server/chunks/build/{input-number-CZ3ZrCsy.mjs → input-number-Bd55elNN.mjs} +3 -3
  79. package/.output/server/chunks/build/{input-number-CZ3ZrCsy.mjs.map → input-number-Bd55elNN.mjs.map} +1 -1
  80. package/.output/server/chunks/build/{input-DxDqeyQW.mjs → input-sf_BT6o6.mjs} +553 -5
  81. package/.output/server/chunks/build/input-sf_BT6o6.mjs.map +1 -0
  82. package/.output/server/chunks/build/{logs-Bz1p6x_5.mjs → logs-Dto_umFY.mjs} +44 -38
  83. package/.output/server/chunks/build/logs-Dto_umFY.mjs.map +1 -0
  84. package/.output/server/chunks/build/menu-WCrlpYVh.mjs +2 -2
  85. package/.output/server/chunks/build/modal-yvUquPj5.mjs +2 -2
  86. package/.output/server/chunks/build/{monitor-miqq9xHB.mjs → monitor-Cp4V-H2n.mjs} +70 -192
  87. package/.output/server/chunks/build/monitor-Cp4V-H2n.mjs.map +1 -0
  88. package/.output/server/chunks/build/{pages-D9tOoJsf.mjs → pages-Dc2H1QFu.mjs} +2 -3
  89. package/.output/server/chunks/build/pages-Dc2H1QFu.mjs.map +1 -0
  90. package/.output/server/chunks/build/{permissions-CxEgXic0.mjs → permissions-BTRW2CVd.mjs} +288 -194
  91. package/.output/server/chunks/build/permissions-BTRW2CVd.mjs.map +1 -0
  92. package/.output/server/chunks/build/{plugins-wLIKHcIE.mjs → plugins-DZR0T4Mh.mjs} +17 -17
  93. package/.output/server/chunks/build/{plugins-wLIKHcIE.mjs.map → plugins-DZR0T4Mh.mjs.map} +1 -1
  94. package/.output/server/chunks/build/popconfirm-CRaHcz5O.mjs +1 -1
  95. package/.output/server/chunks/build/{segmented-ChmQZwz6.mjs → segmented-LPPREMtZ.mjs} +336 -5
  96. package/.output/server/chunks/build/{segmented-ChmQZwz6.mjs.map → segmented-LPPREMtZ.mjs.map} +1 -1
  97. package/.output/server/chunks/build/{settings-BPBll_7K.mjs → settings-UfGyDgM7.mjs} +6 -8
  98. package/.output/server/chunks/build/settings-UfGyDgM7.mjs.map +1 -0
  99. package/.output/server/chunks/build/space-CCBYAkXt.mjs +1 -1
  100. package/.output/server/chunks/build/switch-CelRXpcy.mjs +1 -1
  101. package/.output/server/chunks/build/{table-BtksyDlQ.mjs → table-Cswq-l2r.mjs} +5 -5
  102. package/.output/server/chunks/build/{table-BtksyDlQ.mjs.map → table-Cswq-l2r.mjs.map} +1 -1
  103. package/.output/server/chunks/build/{tabs-DQv-_-R6.mjs → tabs-BM3tAh_J.mjs} +2 -2
  104. package/.output/server/chunks/build/{tabs-DQv-_-R6.mjs.map → tabs-BM3tAh_J.mjs.map} +1 -1
  105. package/.output/server/chunks/build/{tag-A0tZ2Ouq.mjs → tag-NO9jEqKy.mjs} +3 -3
  106. package/.output/server/chunks/build/{tag-A0tZ2Ouq.mjs.map → tag-NO9jEqKy.mjs.map} +1 -1
  107. package/.output/server/chunks/build/{teams-DD8ZXTKL.mjs → teams-Cbg27MWW.mjs} +4 -6
  108. package/.output/server/chunks/build/teams-Cbg27MWW.mjs.map +1 -0
  109. package/.output/server/chunks/build/{tokens-Dxnuw96_.mjs → tokens-Bmm6rDfj.mjs} +296 -200
  110. package/.output/server/chunks/build/tokens-Bmm6rDfj.mjs.map +1 -0
  111. package/.output/server/chunks/build/{users-D6RNylrW.mjs → users-B50HHrfi.mjs} +12 -13
  112. package/.output/server/chunks/build/users-B50HHrfi.mjs.map +1 -0
  113. package/.output/server/chunks/build/{workshop-CTcYDq2i.mjs → workshop-81xhz368.mjs} +21 -22
  114. package/.output/server/chunks/build/workshop-81xhz368.mjs.map +1 -0
  115. package/.output/server/chunks/routes/renderer.mjs +2 -2
  116. package/.output/server/chunks/virtual/entry.mjs +53 -21
  117. package/.output/server/chunks/virtual/entry.mjs.map +1 -1
  118. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  119. package/.output/server/package.json +1 -1
  120. package/app/app.vue +7 -0
  121. package/app/assets/css/main.css +318 -162
  122. package/app/components/workshop/blocks/ClusterArtifact.vue +0 -16
  123. package/app/pages/daq/[id].vue +919 -938
  124. package/app/pages/daq/index.vue +1 -22
  125. package/app/pages/dcw/[id].vue +1 -4
  126. package/app/pages/dcw/index.vue +1 -30
  127. package/app/pages/logs/index.vue +99 -87
  128. package/app/pages/monitor.vue +56 -68
  129. package/app/pages/permissions/index.vue +86 -82
  130. package/app/pages/plugins/index.vue +12 -7
  131. package/app/pages/tokens.vue +94 -96
  132. package/app/pages/users.vue +10 -18
  133. package/app/pages/workshop/index.vue +34 -5
  134. package/i18n/locales/en.ts +4 -1
  135. package/i18n/locales/zh-CN.ts +6 -1
  136. package/package.json +1 -1
  137. package/scripts/_dbg-logs-ui-e2e.py +126 -0
  138. package/scripts/_dbg-ui-survey.py +52 -0
  139. package/server/data/daqs.json +101 -101
  140. package/server/data/dcw-lines.json +7 -0
  141. package/server/data/dcw-products.json +7 -0
  142. package/server/data/dcw-recipes.json +22 -0
  143. package/server/data/dcw-rollback.json +84 -10
  144. package/server/data/dcw-runs.json +52 -54
  145. package/server/data/dcw-writes.json +36 -0
  146. package/server/data/dcws.json +533 -216
  147. package/server/data/line-runs.json +18 -18
  148. package/.output/public/_nuxt/BAbAEW0D.js +0 -1
  149. package/.output/public/_nuxt/BWC4HQHQ.js +0 -1
  150. package/.output/public/_nuxt/BbZAzXjZ2.js +0 -1
  151. package/.output/public/_nuxt/BgOhoDTI.js +0 -1
  152. package/.output/public/_nuxt/BuiGDfMB.js +0 -1
  153. package/.output/public/_nuxt/BxPPAkGA.js +0 -3
  154. package/.output/public/_nuxt/C_2bTK0C.js +0 -1
  155. package/.output/public/_nuxt/CcwJ2mrD2.js +0 -1
  156. package/.output/public/_nuxt/Ci0uX4c4.js +0 -1
  157. package/.output/public/_nuxt/D6B0xnjk.js +0 -1
  158. package/.output/public/_nuxt/DTYBfjRY.js +0 -1
  159. package/.output/public/_nuxt/DVoWWlUW.js +0 -1
  160. package/.output/public/_nuxt/Dhqra7NB.js +0 -1
  161. package/.output/public/_nuxt/DlRO_q5L.js +0 -1
  162. package/.output/public/_nuxt/DsUUYP292.js +0 -1
  163. package/.output/public/_nuxt/Dsdy4Ua-.js +0 -1
  164. package/.output/public/_nuxt/QT54MQV9.js +0 -1
  165. package/.output/public/_nuxt/RzXYI9FM.js +0 -23
  166. package/.output/public/_nuxt/UtviM1bg.js +0 -1
  167. package/.output/public/_nuxt/_id_.C2VHq_vT.css +0 -1
  168. package/.output/public/_nuxt/_id_.Dswy2p0I.css +0 -1
  169. package/.output/public/_nuxt/_wsId_.BFyCuUwS.css +0 -1
  170. package/.output/public/_nuxt/bAFueD6a.js +0 -1
  171. package/.output/public/_nuxt/builds/meta/e2341fc0-6f3f-4680-abf8-935a7c9fb912.json +0 -1
  172. package/.output/public/_nuxt/c3mwkHWP.js +0 -14
  173. package/.output/public/_nuxt/daq.BTdEun-8.css +0 -1
  174. package/.output/public/_nuxt/dbi5bHkY.js +0 -2
  175. package/.output/public/_nuxt/dcw.rpqpOYQ8.css +0 -1
  176. package/.output/public/_nuxt/eHYnGew0.js +0 -19
  177. package/.output/public/_nuxt/entry.DRUzDwmX.css +0 -1
  178. package/.output/public/_nuxt/jyQyulh-.js +0 -1
  179. package/.output/public/_nuxt/logs.BarkrvUp.css +0 -1
  180. package/.output/public/_nuxt/monitor.CmwpEUCI.css +0 -1
  181. package/.output/public/_nuxt/permissions.DTRtZeTw.css +0 -1
  182. package/.output/public/_nuxt/plugins.BcSEwwGb.css +0 -1
  183. package/.output/public/_nuxt/tokens.BVXU1jOK.css +0 -1
  184. package/.output/public/_nuxt/users.D8lcLE62.css +0 -1
  185. package/.output/public/_nuxt/workshop.CbymC2LY.css +0 -1
  186. package/.output/public/_nuxt/zVkqCZ78.js +0 -1
  187. package/.output/server/chunks/build/Col-biaNnEPf.mjs +0 -338
  188. package/.output/server/chunks/build/Col-biaNnEPf.mjs.map +0 -1
  189. package/.output/server/chunks/build/agents--6bzGtES.mjs.map +0 -1
  190. package/.output/server/chunks/build/channel-templates-C1Bb-U75.mjs.map +0 -1
  191. package/.output/server/chunks/build/hasIn-vQ9LWt-J.mjs +0 -554
  192. package/.output/server/chunks/build/hasIn-vQ9LWt-J.mjs.map +0 -1
  193. package/.output/server/chunks/build/input-DxDqeyQW.mjs.map +0 -1
  194. package/.output/server/chunks/build/logs-Bz1p6x_5.mjs.map +0 -1
  195. package/.output/server/chunks/build/monitor-miqq9xHB.mjs.map +0 -1
  196. package/.output/server/chunks/build/pages-D9tOoJsf.mjs.map +0 -1
  197. package/.output/server/chunks/build/permissions-CxEgXic0.mjs.map +0 -1
  198. package/.output/server/chunks/build/settings-BPBll_7K.mjs.map +0 -1
  199. package/.output/server/chunks/build/teams-DD8ZXTKL.mjs.map +0 -1
  200. package/.output/server/chunks/build/tokens-Dxnuw96_.mjs.map +0 -1
  201. package/.output/server/chunks/build/useSiteConfig-DJe_KMVr.mjs +0 -27
  202. package/.output/server/chunks/build/useSiteConfig-DJe_KMVr.mjs.map +0 -1
  203. package/.output/server/chunks/build/users-D6RNylrW.mjs.map +0 -1
  204. package/.output/server/chunks/build/workshop-CTcYDq2i.mjs.map +0 -1
  205. /package/.output/public/_nuxt/{CNs_Ozdc.js → CNs_Ozdc2.js} +0 -0
  206. /package/.output/public/_nuxt/{Cno6kYiO.js → Cno6kYiO2.js} +0 -0
  207. /package/.output/public/_nuxt/{DAR70Lf5.js → DAR70Lf52.js} +0 -0
  208. /package/.output/public/_nuxt/{ORt9oDIy2.js → ORt9oDIy.js} +0 -0
@@ -2225,7 +2225,7 @@ tr.row-recipe-alarm td:first-child { box-shadow: inset 3px 0 0 var(--tone-danger
2225
2225
  .infra-banner .txt a { color: var(--accent); text-decoration: underline; }
2226
2226
  .infra-banner .txt b { font-weight: 600; }
2227
2227
  .infra-banner .txt small { margin-left: 8px; font-size: 10.5px; opacity: 0.75; }
2228
- .infra-banner .pill-btn { flex: 0 0 auto; color: var(--paper-raised); text-decoration: none; }
2228
+ .infra-banner .pill-btn { flex: 0 0 auto; }
2229
2229
 
2230
2230
  /* ---------- 未确认报警条(S5) ---------- */
2231
2231
  .alarm-bar {
@@ -2351,16 +2351,6 @@ tr.row-recipe-alarm td:first-child { box-shadow: inset 3px 0 0 var(--tone-danger
2351
2351
  }
2352
2352
  .hint { font-size: 10px; color: var(--ink-fainter); }
2353
2353
  .test-row { display: flex; gap: 10px; align-items: center; margin: 6px 0 4px; }
2354
- .pill-btn {
2355
- padding: 7px 14px;
2356
- font-size: 12.5px;
2357
- cursor: pointer;
2358
- color: var(--paper-raised);
2359
- background: var(--accent);
2360
- border: 1px solid var(--accent);
2361
- border-radius: var(--radius-pill);
2362
- }
2363
- .pill-btn:disabled { opacity: 0.5; cursor: default; }
2364
2354
  .test-result { font-family: var(--font-mono); font-size: 11px; }
2365
2355
  .test-result.ok { color: var(--tone-success-dot); }
2366
2356
  .test-result.bad { color: var(--tone-danger-dot); }
@@ -2383,17 +2373,6 @@ tr.row-recipe-alarm td:first-child { box-shadow: inset 3px 0 0 var(--tone-danger
2383
2373
  .tpl-table .range { font-size: 11.5px; color: var(--ink-soft); }
2384
2374
  .tpl-table .empty { color: var(--ink-fainter); font-size: 12px; text-align: center; padding: 14px 0; }
2385
2375
  .tpl-table .actions { white-space: nowrap; }
2386
- .mini-btn {
2387
- padding: 3px 10px;
2388
- font-size: 11.5px;
2389
- cursor: pointer;
2390
- color: var(--ink-soft);
2391
- background: var(--paper-deep);
2392
- border: 1px solid var(--line-strong);
2393
- border-radius: var(--radius-chip);
2394
- }
2395
- .mini-btn.danger { color: var(--tone-danger-dot); }
2396
- .mini-btn:hover { border-color: var(--accent); color: var(--accent); }
2397
2376
 
2398
2377
  /* ---------- 节点筛选工具条 ---------- */
2399
2378
  .tbl-toolbar {
@@ -2443,7 +2443,7 @@ h1 { margin: 2px 0 4px; font-size: 30px; font-weight: 400; letter-spacing: -0.01
2443
2443
  .write-row { display: flex; gap: 6px; align-items: center; }
2444
2444
  .write-inp { width: 92px; padding: 4px 8px; }
2445
2445
  .write-btn { padding: 5px 12px; }
2446
- .mini-btn { padding: 4px 10px; font-size: 11.5px; cursor: pointer; color: var(--ink-soft); background: var(--paper-deep); border: 1px solid var(--line-strong); border-radius: var(--radius-chip); margin-right: 4px; }
2446
+ .mini-btn { margin-right: 4px; }
2447
2447
  .mini-btn.danger { color: var(--tone-danger-dot); }
2448
2448
  .mini-btn:hover { border-color: var(--accent); color: var(--accent); }
2449
2449
  .inp { padding: 5px 9px; font-size: 12.5px; color: var(--ink); background: var(--paper-deep); border: 1px solid var(--line-strong); border-radius: var(--radius-chip); }
@@ -2497,9 +2497,6 @@ h1 { margin: 2px 0 4px; font-size: 30px; font-weight: 400; letter-spacing: -0.01
2497
2497
  .ver-diff { margin: 4px 0 0; font-size: 11px; color: var(--ink-faint); }
2498
2498
  .sec-label { margin: 14px 0 6px; font-size: 11px; font-weight: 600; letter-spacing: 0.06em; text-transform: uppercase; color: var(--ink-faint); }
2499
2499
  .runs { margin-top: 6px; }
2500
- .pill-btn { padding: 6px 14px; font-size: 12.5px; cursor: pointer; color: var(--paper-raised); background: var(--accent); border: 1px solid var(--accent); border-radius: var(--radius-pill); }
2501
- .pill-btn.outline { color: var(--ink); background: var(--paper-raised); border-color: var(--line-strong); }
2502
- .pill-btn:disabled { opacity: 0.5; cursor: default; }
2503
2500
 
2504
2501
  .modal-mask { position: fixed; z-index: 50; inset: 0; display: flex; align-items: center; justify-content: center; background: var(--scrim); backdrop-filter: blur(2px); }
2505
2502
  .modal { width: 680px; max-width: 94vw; max-height: 88vh; overflow-y: auto; padding: 22px 24px; background: var(--surface-glass-strong); backdrop-filter: var(--aurora-blur); -webkit-backdrop-filter: var(--aurora-blur); border: 1px solid var(--glass-line); border-radius: var(--radius-panel); box-shadow: var(--glass-edge), var(--shadow-float); }
@@ -925,25 +925,7 @@ const builtinCount = computed(() => dcw.templates.filter(t => t.builtin).length)
925
925
  border-radius: var(--radius-panel-sm);
926
926
  }
927
927
  .lc-ctl .inp:focus { outline: none; border-color: var(--tone-success-dot); box-shadow: 0 0 0 3px var(--accent-soft); }
928
- .pill-btn {
929
- flex: none;
930
- height: 30px;
931
- padding: 0 14px;
932
- font-size: 11.5px;
933
- font-weight: 600;
934
- color: var(--on-accent);
935
- background: var(--accent);
936
- border: 0;
937
- border-radius: var(--radius-panel-sm);
938
- cursor: pointer;
939
- transition: background 0.15s, box-shadow 0.15s;
940
- }
941
- .pill-btn:hover:not(:disabled) { background: var(--accent-strong); box-shadow: 0 0 14px var(--accent-soft); }
942
- .pill-btn:disabled { opacity: 0.4; cursor: default; }
943
- .pill-btn.danger,
944
- .pill-btn.stop { background: var(--tone-danger-bg); color: var(--tone-danger-dot); }
945
- .pill-btn.danger:hover:not(:disabled),
946
- .pill-btn.stop:hover:not(:disabled) { background: color-mix(in srgb, var(--tone-danger-dot) 26%, transparent); box-shadow: none; }
928
+ .lc-ctl .pill-btn { flex: none; }
947
929
  .lc-manage {
948
930
  font-size: 11.5px;
949
931
  font-weight: 600;
@@ -1065,15 +1047,4 @@ const builtinCount = computed(() => dcw.templates.filter(t => t.builtin).length)
1065
1047
  .tpl-form { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
1066
1048
  .tpl-sem { flex: 1; color: var(--ink-faint); }
1067
1049
  textarea.inp { height: auto; padding: 6px 9px; font-size: 11.5px; resize: vertical; }
1068
- .mini-btn {
1069
- padding: 4px 10px;
1070
- font-size: 10.5px;
1071
- color: var(--ink-faint);
1072
- background: var(--paper-deep);
1073
- border: 1px solid var(--line-strong);
1074
- border-radius: 7px;
1075
- cursor: pointer;
1076
- }
1077
- .mini-btn:hover { border-color: var(--ink-faint); color: var(--ink); }
1078
- .mini-btn.danger { color: var(--tone-danger-dot); }
1079
1050
  </style>
@@ -1,14 +1,12 @@
1
1
  <template>
2
2
  <div class="page">
3
- <!-- 页头:标题 + 手动记录入口 -->
4
- <header class="head">
3
+ <!-- 页头(aw-page-head 规范:kicker + 大标题 + 描述)+ 手动记录入口 -->
4
+ <header class="aw-page-head">
5
5
  <div>
6
6
  <p class="aw-kicker">
7
7
  agentworkshop / audit log
8
8
  </p>
9
- <h1 class="h1">
10
- {{ $t('logs.title') }}
11
- </h1>
9
+ <h1>{{ $t('logs.title') }}</h1>
12
10
  <p class="sub">
13
11
  {{ $t('logs.sub') }}
14
12
  </p>
@@ -182,67 +180,78 @@
182
180
  </tr>
183
181
  </thead>
184
182
  <tbody>
185
- <tr
183
+ <template
186
184
  v-for="row in opsLog.results"
187
- :key="`${row.id}-${row.at}`"
185
+ :key="row.id"
188
186
  >
189
- <td class="mono dim">
190
- {{ fmtTime(row.at) }}
191
- </td>
192
- <td>
193
- <span
194
- class="src-badge"
195
- :class="row.actorKind"
196
- >{{ srcLabel(row.actorKind) }}</span>
197
- </td>
198
- <td class="actor">
199
- {{ row.actorName || row.actor || '—' }}
200
- </td>
201
- <td>
202
- <span
203
- class="kind-chip"
204
- :class="row.kind"
205
- >{{ kindLabel(row.kind) }}</span>
206
- </td>
207
- <td class="summary">
208
- {{ row.summary }}
209
- <small class="mono dim action">{{ row.action }}</small>
210
- </td>
211
- <td class="scope">
212
- <span
213
- v-if="lineName(row.lineId)"
214
- class="scope-chip"
215
- :title="$t('logs.fLine')"
216
- >{{ lineName(row.lineId) }}</span>
217
- <span
218
- v-if="productName(row.productId)"
219
- class="scope-chip"
220
- :title="$t('logs.fProduct')"
221
- >{{ productName(row.productId) }}</span>
222
- <span
223
- v-if="recipeName(row.recipeId)"
224
- class="scope-chip"
225
- :title="'Recipe'"
226
- >{{ recipeName(row.recipeId) }}</span>
227
- <span
228
- v-if="!row.lineId && !row.productId && !row.recipeId"
229
- class="dim"
230
- >—</span>
231
- </td>
232
- <td class="detail-cell">
233
- <button
234
- v-if="row.detailJson && row.detailJson !== '{}'"
235
- class="mini-btn"
236
- @click="toggle(row)"
187
+ <tr>
188
+ <td class="mono dim">
189
+ {{ fmtTime(row.at) }}
190
+ </td>
191
+ <td>
192
+ <span
193
+ class="src-badge"
194
+ :class="row.actorKind"
195
+ >{{ srcLabel(row.actorKind) }}</span>
196
+ </td>
197
+ <td class="actor">
198
+ {{ row.actorName || row.actor || '—' }}
199
+ </td>
200
+ <td>
201
+ <span
202
+ class="kind-chip"
203
+ :class="row.kind"
204
+ >{{ kindLabel(row.kind) }}</span>
205
+ </td>
206
+ <td class="summary">
207
+ {{ row.summary }}
208
+ <small class="mono dim action">{{ row.action }}</small>
209
+ </td>
210
+ <td class="scope">
211
+ <span
212
+ v-if="lineName(row.lineId)"
213
+ class="scope-chip"
214
+ :title="$t('logs.fLine')"
215
+ >{{ lineName(row.lineId) }}</span>
216
+ <span
217
+ v-if="productName(row.productId)"
218
+ class="scope-chip"
219
+ :title="$t('logs.fProduct')"
220
+ >{{ productName(row.productId) }}</span>
221
+ <span
222
+ v-if="recipeName(row.recipeId)"
223
+ class="scope-chip"
224
+ :title="'Recipe'"
225
+ >{{ recipeName(row.recipeId) }}</span>
226
+ <span
227
+ v-if="!row.lineId && !row.productId && !row.recipeId"
228
+ class="dim"
229
+ >—</span>
230
+ </td>
231
+ <td class="detail-cell">
232
+ <button
233
+ v-if="hasDetail(row)"
234
+ class="mini-btn"
235
+ @click="toggle(row)"
236
+ >
237
+ {{ expandedId === row.id ? $t('logs.fold') : $t('logs.expand') }}
238
+ </button>
239
+ <span
240
+ v-else
241
+ class="dim"
242
+ >{{ $t('logs.noDetail') }}</span>
243
+ </td>
244
+ </tr>
245
+ <!-- 详情行内展开:紧贴事件行,点击即见(不再沉到表尾) -->
246
+ <tr v-if="expandedId === row.id">
247
+ <td
248
+ colspan="7"
249
+ class="detail-td"
237
250
  >
238
- {{ expanded === row ? $t('logs.fold') : $t('logs.expand') }}
239
- </button>
240
- <span
241
- v-else
242
- class="dim"
243
- >—</span>
244
- </td>
245
- </tr>
251
+ <pre class="detail-box mono">{{ pretty(row.detailJson) }}</pre>
252
+ </td>
253
+ </tr>
254
+ </template>
246
255
  <tr>
247
256
  <td
248
257
  v-if="opsLog.results.length === 0"
@@ -259,10 +268,6 @@
259
268
  </tr>
260
269
  </tbody>
261
270
  </table>
262
- <pre
263
- v-if="expanded"
264
- class="detail-box mono"
265
- >{{ pretty(expanded.detailJson) }}</pre>
266
271
  </section>
267
272
 
268
273
  <!-- 人工记录弹窗 -->
@@ -284,6 +289,14 @@
284
289
  :placeholder="$t('logs.mSummaryPh')"
285
290
  />
286
291
  </label>
292
+ <label class="m-f">
293
+ <span>{{ $t('logs.mDetail') }}</span>
294
+ <textarea
295
+ v-model="manual.detail"
296
+ rows="2"
297
+ :placeholder="$t('logs.mDetailPh')"
298
+ />
299
+ </label>
287
300
  <div class="m-grid">
288
301
  <label class="m-f">
289
302
  <span>{{ $t('logs.fLine') }}</span>
@@ -385,9 +398,10 @@ const opsLog = useOpsLog()
385
398
  const KINDS = ['write', 'manual', 'alarm', 'line', 'recipe', 'rollback', 'daq', 'system'] as const
386
399
 
387
400
  const q = reactive({ lineId: '', productId: '', recipeId: '', actorKind: '', kind: '', text: '' })
388
- const expanded = ref<OpsLogRow | null>(null)
401
+ /** 当前展开详情的行(audit_log 行 id;null = 全部收起) */
402
+ const expandedId = ref<number | null>(null)
389
403
  const manualOpen = ref(false)
390
- const manual = reactive({ summary: '', lineId: '', productId: '', recipeId: '' })
404
+ const manual = reactive({ summary: '', detail: '', lineId: '', productId: '', recipeId: '' })
391
405
 
392
406
  const hasFilter = computed(() => !!(q.lineId || q.productId || q.recipeId || q.actorKind || q.kind || q.text.trim()))
393
407
  const productsOfLine = computed(() => dcw.products.filter(p => !q.lineId || p.lineId === q.lineId))
@@ -404,7 +418,7 @@ function doQuery(): void {
404
418
  q: q.text.trim(),
405
419
  limit: 300,
406
420
  })
407
- expanded.value = null
421
+ expandedId.value = null
408
422
  }
409
423
 
410
424
  function resetFilters(): void {
@@ -419,6 +433,7 @@ function resetFilters(): void {
419
433
 
420
434
  function openManual(): void {
421
435
  manual.summary = ''
436
+ manual.detail = ''
422
437
  manual.lineId = q.lineId
423
438
  manual.productId = q.productId
424
439
  manual.recipeId = q.recipeId
@@ -427,11 +442,13 @@ function openManual(): void {
427
442
 
428
443
  async function submitManual(): Promise<void> {
429
444
  try {
445
+ const note = manual.detail.trim()
430
446
  await opsLog.postManual({
431
447
  summary: manual.summary.trim(),
432
448
  lineId: manual.lineId,
433
449
  productId: manual.productId,
434
450
  recipeId: manual.recipeId,
451
+ ...(note ? { detail: { note } } : {}),
435
452
  })
436
453
  message.success(tt('logs.mOk'))
437
454
  manualOpen.value = false
@@ -442,8 +459,13 @@ async function submitManual(): Promise<void> {
442
459
  }
443
460
  }
444
461
 
462
+ /** 该行是否带结构化详情(空对象 = 无) */
463
+ function hasDetail(row: OpsLogRow): boolean {
464
+ return !!row.detailJson && row.detailJson !== '{}'
465
+ }
466
+
445
467
  function toggle(row: OpsLogRow): void {
446
- expanded.value = expanded.value === row ? null : row
468
+ expandedId.value = expandedId.value === row.id ? null : row.id
447
469
  }
448
470
 
449
471
  function pretty(json: string): string {
@@ -496,10 +518,8 @@ export default { name: 'OpsLogsPage' }
496
518
 
497
519
  <style scoped>
498
520
  .page { display: flex; flex-direction: column; gap: 12px; }
499
- .head { display: flex; align-items: flex-end; justify-content: space-between; gap: 12px; }
500
- .h1 { display: flex; gap: 8px; align-items: center; margin: 0; font-size: 20px; font-weight: 700; color: var(--ink); }
501
- .sub { margin: 4px 0 0; font-size: 12.5px; color: var(--ink-faint); }
502
- .head-actions { display: flex; gap: 10px; align-items: center; }
521
+ .head-actions { display: flex; gap: 10px; align-items: center; padding-bottom: 4px; }
522
+ .sub { margin: 8px 0 0; font-size: 12.5px; color: var(--ink-faint); }
503
523
  .live-dot {
504
524
  width: 8px; height: 8px; border-radius: 50%;
505
525
  background: var(--tone-success-dot);
@@ -530,12 +550,6 @@ export default { name: 'OpsLogsPage' }
530
550
  border: 1px solid var(--glass-line); border-radius: 7px; outline: none;
531
551
  }
532
552
  .inp-sel:focus { border-color: color-mix(in srgb, var(--tone-info-dot) 55%, transparent); }
533
- .mini-btn {
534
- padding: 6px 11px; font-size: 12px; color: var(--ink-soft);
535
- background: var(--frost-bg); border: 1px solid var(--glass-line); border-radius: 7px;
536
- cursor: pointer;
537
- }
538
- .mini-btn:hover { border-color: color-mix(in srgb, var(--tone-info-dot) 45%, transparent); }
539
553
 
540
554
  .table-card {
541
555
  background: var(--surface-glass);
@@ -569,10 +583,12 @@ export default { name: 'OpsLogsPage' }
569
583
  }
570
584
  .detail-cell { white-space: nowrap; }
571
585
  .empty { padding: 22px 0 !important; color: var(--ink-faint); text-align: center; }
586
+ /* 详情行内展开:紧贴事件行的整行 pre 面板 */
587
+ .detail-td { padding: 0 !important; }
572
588
  .detail-box {
573
589
  max-height: 260px; margin: 0; padding: 10px 14px; overflow: auto;
574
- font-size: 11.5px; color: var(--ink-soft);
575
- background: var(--frost-bg); border-top: 1px solid var(--glass-line);
590
+ font-size: 11.5px; color: var(--ink-soft); white-space: pre-wrap; word-break: break-word;
591
+ background: var(--paper-deep); border-top: 1px solid var(--glass-line);
576
592
  }
577
593
  .src-badge {
578
594
  display: inline-block; padding: 1px 8px; font-size: 10.5px;
@@ -616,8 +632,4 @@ export default { name: 'OpsLogsPage' }
616
632
  .m-f textarea:focus, .m-f .inp-sel:focus { border-color: color-mix(in srgb, var(--tone-info-dot) 55%, transparent); }
617
633
  .m-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; margin-top: 8px; }
618
634
  .m-actions { display: flex; gap: 8px; justify-content: flex-end; margin-top: 12px; }
619
- .ghost-btn {
620
- padding: 7px 14px; font-size: 12.5px; color: var(--ink-soft);
621
- background: transparent; border: 1px solid var(--glass-line); border-radius: 8px; cursor: pointer;
622
- }
623
635
  </style>
@@ -293,73 +293,50 @@ const processColumns = computed(() => [
293
293
  </a-card>
294
294
 
295
295
  <template v-else>
296
- <!-- 概要统计 -->
297
- <a-row
298
- :gutter="[16, 16]"
299
- class="summary"
300
- >
301
- <a-col
302
- :xs="12"
303
- :md="6"
304
- >
305
- <a-card class="aw-panel stat">
306
- <p class="stat-label">
307
- {{ t('monitor.channels') }}
308
- </p>
309
- <p class="stat-value aw-mono">
310
- {{ snapshot?.counts.channels ?? '–' }}
311
- </p>
312
- </a-card>
313
- </a-col>
314
- <a-col
315
- :xs="12"
316
- :md="6"
317
- >
318
- <a-card class="aw-panel stat">
319
- <p class="stat-label">
320
- {{ t('monitor.agents') }}
321
- </p>
322
- <p class="stat-value aw-mono">
323
- {{ snapshot?.counts.agents ?? '–' }}
324
- </p>
325
- </a-card>
326
- </a-col>
327
- <a-col
328
- :xs="12"
329
- :md="6"
330
- >
331
- <a-card class="aw-panel stat">
332
- <p class="stat-label">
333
- {{ t('monitor.aliveProcesses') }}
334
- </p>
335
- <p class="stat-value aw-mono">
336
- {{ snapshot?.counts.aliveProcesses ?? '–' }}
337
- <span
338
- v-if="(snapshot?.counts.orphanProcesses ?? 0) > 0"
339
- class="orphan-badge"
340
- >
341
- +{{ snapshot?.counts.orphanProcesses }} {{ t('monitor.orphan') }}
342
- </span>
343
- </p>
344
- </a-card>
345
- </a-col>
346
- <a-col
347
- :xs="12"
348
- :md="6"
349
- >
350
- <a-card class="aw-panel stat">
351
- <p class="stat-label">
352
- {{ t('monitor.server') }}
353
- </p>
354
- <p class="stat-value aw-mono small">
355
- PID {{ snapshot?.serverPid ?? '–' }} · {{ snapshot ? uptimeText(snapshot.uptimeMs) : '' }}
356
- </p>
357
- <p class="stat-updated">
358
- {{ lastUpdated }} · {{ t('monitor.updated') }} {{ snapshot?.generatedAt ?? '' }}
359
- </p>
360
- </a-card>
361
- </a-col>
362
- </a-row>
296
+ <!-- 概要统计(CSS grid:antd Grid 样式在部分构建下缺失,col 会退化 100% 宽) -->
297
+ <div class="stat-grid">
298
+ <a-card class="aw-panel stat">
299
+ <p class="stat-label">
300
+ {{ t('monitor.channels') }}
301
+ </p>
302
+ <p class="stat-value aw-mono">
303
+ {{ snapshot?.counts.channels ?? '–' }}
304
+ </p>
305
+ </a-card>
306
+ <a-card class="aw-panel stat">
307
+ <p class="stat-label">
308
+ {{ t('monitor.agents') }}
309
+ </p>
310
+ <p class="stat-value aw-mono">
311
+ {{ snapshot?.counts.agents ?? '–' }}
312
+ </p>
313
+ </a-card>
314
+ <a-card class="aw-panel stat">
315
+ <p class="stat-label">
316
+ {{ t('monitor.aliveProcesses') }}
317
+ </p>
318
+ <p class="stat-value aw-mono">
319
+ {{ snapshot?.counts.aliveProcesses ?? '–' }}
320
+ <span
321
+ v-if="(snapshot?.counts.orphanProcesses ?? 0) > 0"
322
+ class="orphan-badge"
323
+ >
324
+ +{{ snapshot?.counts.orphanProcesses }} {{ t('monitor.orphan') }}
325
+ </span>
326
+ </p>
327
+ </a-card>
328
+ <a-card class="aw-panel stat">
329
+ <p class="stat-label">
330
+ {{ t('monitor.server') }}
331
+ </p>
332
+ <p class="stat-value aw-mono small">
333
+ PID {{ snapshot?.serverPid ?? '–' }} · {{ snapshot ? uptimeText(snapshot.uptimeMs) : '' }}
334
+ </p>
335
+ <p class="stat-updated">
336
+ {{ lastUpdated }} · {{ t('monitor.updated') }} {{ snapshot?.generatedAt ?? '' }}
337
+ </p>
338
+ </a-card>
339
+ </div>
363
340
 
364
341
  <!-- ChannelRuntime 表 -->
365
342
  <a-card
@@ -603,10 +580,21 @@ const processColumns = computed(() => [
603
580
  align-items: center;
604
581
  }
605
582
 
606
- .summary {
583
+ .stat-grid {
584
+ display: grid;
585
+ grid-template-columns: repeat(4, minmax(0, 1fr));
586
+ gap: 14px;
607
587
  margin-bottom: 16px;
608
588
  }
609
589
 
590
+ @media (max-width: 1100px) {
591
+ .stat-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
592
+ }
593
+
594
+ @media (max-width: 640px) {
595
+ .stat-grid { grid-template-columns: 1fr; }
596
+ }
597
+
610
598
  .stat {
611
599
  height: 100%;
612
600
  }