agentworkshop 0.7.39 → 0.7.41

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 (405) hide show
  1. package/.AgentWorkShop/prompts/host-tools.json +55 -0
  2. package/.output/.AgentWorkShop/prompts/host-tools.json +55 -0
  3. package/.output/nitro.json +1 -1
  4. package/.output/public/_nuxt/88GOowgO2.js +1 -0
  5. package/.output/public/_nuxt/{BNT8gYU92.js → BC9wjTJK2.js} +2 -2
  6. package/.output/public/_nuxt/{CY9LbPCI.js → BN16aRdQ.js} +1 -1
  7. package/.output/public/_nuxt/BWVhZntO.js +1 -0
  8. package/.output/public/_nuxt/{HBLJ-wei.js → BXxH0UQE.js} +1 -1
  9. package/.output/public/_nuxt/{zIGh7R49.js → BneN7fbu.js} +1 -1
  10. package/.output/public/_nuxt/BsROmY89.js +1 -0
  11. package/.output/public/_nuxt/{DUrecWPx.js → C0ZrS1KL.js} +2 -2
  12. package/.output/public/_nuxt/{C_OLzD09.js → C4oW1HsE.js} +1 -1
  13. package/.output/public/_nuxt/{CUDwzgLV.js → C4s_niy-.js} +9 -9
  14. package/.output/public/_nuxt/CFxtLwjp.js +1 -0
  15. package/.output/public/_nuxt/{Cec0Ua3F.js → CS50LB_l.js} +1 -1
  16. package/.output/public/_nuxt/CssgYAAL2.js +1 -0
  17. package/.output/public/_nuxt/D6mbFA-a.js +1 -0
  18. package/.output/public/_nuxt/D98NH8kG.js +1 -0
  19. package/.output/public/_nuxt/DGIuvyRN2.js +1 -0
  20. package/.output/public/_nuxt/DGbd-UiG.js +1 -0
  21. package/.output/public/_nuxt/{CojCTLKD.js → DGj-WEBg.js} +1 -1
  22. package/.output/public/_nuxt/{DDShH71m.js → DS8qj8EL.js} +1 -1
  23. package/.output/public/_nuxt/DTFCy6h-.js +1 -0
  24. package/.output/public/_nuxt/{DrYV5i68.js → DUjW5Yq5.js} +1 -1
  25. package/.output/public/_nuxt/{45zuyAso.js → D_OTvQza.js} +1 -1
  26. package/.output/public/_nuxt/Dap5PmTL.js +2 -0
  27. package/.output/public/_nuxt/Dqw1lpr-.js +1 -0
  28. package/.output/public/_nuxt/DvLxILQP.js +1 -0
  29. package/.output/public/_nuxt/IREZ1eC2.js +1 -0
  30. package/.output/public/_nuxt/TownView.f-YOdXRs.css +1 -0
  31. package/.output/public/_nuxt/_id_.D9ymtHB5.css +1 -0
  32. package/.output/public/_nuxt/_id_.jf-_8E_c.css +1 -0
  33. package/.output/public/_nuxt/_wsId_.B4WiqkIS.css +1 -0
  34. package/.output/public/_nuxt/agents.ZD0rVdHE.css +1 -0
  35. package/.output/public/_nuxt/aml.BN8ZEW4h.css +1 -0
  36. package/.output/public/_nuxt/builds/latest.json +1 -1
  37. package/.output/public/_nuxt/builds/meta/78a295bb-2072-48a4-8b46-6d545fdae743.json +1 -0
  38. package/.output/public/_nuxt/ca4TJ3Op.js +1 -0
  39. package/.output/public/_nuxt/channel-templates.BOtahzPi.css +1 -0
  40. package/.output/public/_nuxt/daq.DjSgY94l.css +1 -0
  41. package/.output/public/_nuxt/dcw.8Y7FqCVN.css +1 -0
  42. package/.output/public/_nuxt/default.J32SgqFY.css +1 -0
  43. package/.output/public/_nuxt/entry.bdm0tv6M.css +1 -0
  44. package/.output/public/_nuxt/eqq3wWQF.js +18 -0
  45. package/.output/public/_nuxt/logs.BpKzmKsh.css +1 -0
  46. package/.output/public/_nuxt/monitor.D9pe7qN6.css +1 -0
  47. package/.output/public/_nuxt/pages.D7aSDlUI.css +1 -0
  48. package/.output/public/_nuxt/permissions.DwTVlFe6.css +1 -0
  49. package/.output/public/_nuxt/plugins.sb4nDGqr.css +1 -0
  50. package/.output/public/_nuxt/{Cbq-mryP.js → qr6R6Ha1.js} +1 -1
  51. package/.output/public/_nuxt/settings.BTgR-NiE.css +1 -0
  52. package/.output/public/_nuxt/teams.CxnxKVVs.css +1 -0
  53. package/.output/public/_nuxt/tokens.BFY7qv4f.css +1 -0
  54. package/.output/public/_nuxt/{town.DKIAhKnx.css → town.BBXZmeoP.css} +1 -1
  55. package/.output/public/_nuxt/users.DLgZ1D0h.css +1 -0
  56. package/.output/public/_nuxt/workshop.CR_QzeAN.css +1 -0
  57. package/.output/public/_nuxt/{BzHEilTt.js → xh3_vYcu.js} +1 -1
  58. package/.output/public/_nuxt/yF0aYMF1.js +4 -0
  59. package/.output/server/chunks/_/entity.mjs.map +1 -1
  60. package/.output/server/chunks/_/nitro.mjs +2355 -1362
  61. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  62. package/.output/server/chunks/build/{TownView-jVazYOjN.mjs → TownView--otsnr_7.mjs} +290 -208
  63. package/.output/server/chunks/build/TownView--otsnr_7.mjs.map +1 -0
  64. package/.output/server/chunks/build/{_id_-CfVosNg3.mjs → _id_-Brv-JSvr.mjs} +142 -141
  65. package/.output/server/chunks/build/_id_-Brv-JSvr.mjs.map +1 -0
  66. package/.output/server/chunks/build/{_id_-Hwr4rZpr.mjs → _id_-D9pl1OZy.mjs} +38 -36
  67. package/.output/server/chunks/build/_id_-D9pl1OZy.mjs.map +1 -0
  68. package/.output/server/chunks/build/{_wsId_-BVg3bB77.mjs → _wsId_-BASfDf0s.mjs} +295 -261
  69. package/.output/server/chunks/build/{_wsId_-BVg3bB77.mjs.map → _wsId_-BASfDf0s.mjs.map} +1 -1
  70. package/.output/server/chunks/build/{agents-Bvin73QY.mjs → agents-CLQqJF2y.mjs} +21 -27
  71. package/.output/server/chunks/build/agents-CLQqJF2y.mjs.map +1 -0
  72. package/.output/server/chunks/build/{aml-BCSJCdX7.mjs → aml-_7FdFL2p.mjs} +109 -109
  73. package/.output/server/chunks/build/{aml-BCSJCdX7.mjs.map → aml-_7FdFL2p.mjs.map} +1 -1
  74. package/.output/server/chunks/build/api-error-dul30BYQ.mjs.map +1 -1
  75. package/.output/server/chunks/build/{channel-templates-BTq8570n.mjs → channel-templates-p6SZNjlM.mjs} +19 -19
  76. package/.output/server/chunks/build/{channel-templates-BTq8570n.mjs.map → channel-templates-p6SZNjlM.mjs.map} +1 -1
  77. package/.output/server/chunks/build/{daq-C03Uu5UE.mjs → daq-DkMvD8sg.mjs} +193 -126
  78. package/.output/server/chunks/build/daq-DkMvD8sg.mjs.map +1 -0
  79. package/.output/server/chunks/build/{dcw-6vEYVeje.mjs → dcw-C1jgVJkO.mjs} +46 -46
  80. package/.output/server/chunks/build/{dcw-6vEYVeje.mjs.map → dcw-C1jgVJkO.mjs.map} +1 -1
  81. package/.output/server/chunks/build/{default-CZmZFpqH.mjs → default-BE4r0FZN.mjs} +152 -58
  82. package/.output/server/chunks/build/{default-CZmZFpqH.mjs.map → default-BE4r0FZN.mjs.map} +1 -1
  83. package/.output/server/chunks/build/{logs-B-xhuqln.mjs → logs--dByNyhw.mjs} +35 -35
  84. package/.output/server/chunks/build/{logs-B-xhuqln.mjs.map → logs--dByNyhw.mjs.map} +1 -1
  85. package/.output/server/chunks/build/{monitor-CyfDt4nR.mjs → monitor-C0okQaXz.mjs} +33 -33
  86. package/.output/server/chunks/build/{monitor-CyfDt4nR.mjs.map → monitor-C0okQaXz.mjs.map} +1 -1
  87. package/.output/server/chunks/build/{pages-BO7yZsXA.mjs → pages-B0bUWnC6.mjs} +35 -19
  88. package/.output/server/chunks/build/pages-B0bUWnC6.mjs.map +1 -0
  89. package/.output/server/chunks/build/{permissions-B52oOmaO.mjs → permissions-68SsNjex.mjs} +12 -12
  90. package/.output/server/chunks/build/{permissions-B52oOmaO.mjs.map → permissions-68SsNjex.mjs.map} +1 -1
  91. package/.output/server/chunks/build/{plugins-CUWmMdyt.mjs → plugins-lGlUr1lj.mjs} +17 -17
  92. package/.output/server/chunks/build/{plugins-CUWmMdyt.mjs.map → plugins-lGlUr1lj.mjs.map} +1 -1
  93. package/.output/server/chunks/build/{settings-DoQ2Oq3P.mjs → settings-Ddd1qx2Z.mjs} +50 -47
  94. package/.output/server/chunks/build/settings-Ddd1qx2Z.mjs.map +1 -0
  95. package/.output/server/chunks/build/{teams-2kz3CusY.mjs → teams-MEDLZdMn.mjs} +38 -34
  96. package/.output/server/chunks/build/teams-MEDLZdMn.mjs.map +1 -0
  97. package/.output/server/chunks/build/{tokens-BbWLqtVz.mjs → tokens-C7fTM5C2.mjs} +14 -14
  98. package/.output/server/chunks/build/{tokens-BbWLqtVz.mjs.map → tokens-C7fTM5C2.mjs.map} +1 -1
  99. package/.output/server/chunks/build/{town-BOl6hs9B.mjs → town-CoQdblbZ.mjs} +38 -12
  100. package/.output/server/chunks/build/town-CoQdblbZ.mjs.map +1 -0
  101. package/.output/server/chunks/build/{useDaqStream-CIBaiGAl.mjs → useDaqStream-DfCFpb3p.mjs} +9 -3
  102. package/.output/server/chunks/build/useDaqStream-DfCFpb3p.mjs.map +1 -0
  103. package/.output/server/chunks/build/{useDcwStream-CBbiYnWe.mjs → useDcwStream-UPiX-3iO.mjs} +11 -2
  104. package/.output/server/chunks/build/useDcwStream-UPiX-3iO.mjs.map +1 -0
  105. package/.output/server/chunks/build/useResponsive-BKDMGTHs.mjs +49 -0
  106. package/.output/server/chunks/build/useResponsive-BKDMGTHs.mjs.map +1 -0
  107. package/.output/server/chunks/build/{users-fohSmF-J.mjs → users-Cfd5-l2-.mjs} +6 -6
  108. package/.output/server/chunks/build/{users-fohSmF-J.mjs.map → users-Cfd5-l2-.mjs.map} +1 -1
  109. package/.output/server/chunks/build/{workshop-DX5-ldc4.mjs → workshop-BL5bhfs0.mjs} +15 -15
  110. package/.output/server/chunks/build/{workshop-DX5-ldc4.mjs.map → workshop-BL5bhfs0.mjs.map} +1 -1
  111. package/.output/server/chunks/build/{workspaces-BuydxM-3.mjs → workspaces-Bgz5Ekwp.mjs} +18 -3
  112. package/.output/server/chunks/build/workspaces-Bgz5Ekwp.mjs.map +1 -0
  113. package/.output/server/chunks/routes/api/system/config-groups/_id_.patch.mjs.map +1 -1
  114. package/.output/server/chunks/routes/api/system/index.patch.mjs.map +1 -1
  115. package/.output/server/chunks/routes/api/system/index.post.mjs.map +1 -1
  116. package/.output/server/chunks/routes/api/system/settings/events.get.mjs.map +1 -1
  117. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs +6 -2
  118. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs.map +1 -1
  119. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs +2 -1
  120. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs.map +1 -1
  121. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +1 -1
  122. package/.output/server/chunks/routes/api/workshop/channels.post.mjs +3 -3
  123. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs.map +1 -1
  124. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs.map +1 -1
  125. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs.map +1 -1
  126. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +3 -2
  127. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs.map +1 -1
  128. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +2 -1
  129. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs.map +1 -1
  130. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +8 -6
  131. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs.map +1 -1
  132. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +5 -5
  133. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs.map +1 -1
  134. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +14 -4
  135. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs.map +1 -1
  136. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +4 -4
  137. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs.map +1 -1
  138. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +4 -3
  139. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs.map +1 -1
  140. package/.output/server/chunks/routes/api/workshop/dcw/index5.post.mjs +31 -0
  141. package/.output/server/chunks/routes/api/workshop/dcw/index5.post.mjs.map +1 -0
  142. package/.output/server/chunks/routes/api/workshop/dcw/index6.get.mjs +28 -0
  143. package/.output/server/chunks/routes/api/workshop/dcw/index6.get.mjs.map +1 -0
  144. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +1 -1
  145. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +1 -1
  146. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs.map +1 -1
  147. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/read.post.mjs +32 -0
  148. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/read.post.mjs.map +1 -0
  149. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/write.post.mjs +34 -0
  150. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/write.post.mjs.map +1 -0
  151. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.delete.mjs +33 -0
  152. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.delete.mjs.map +1 -0
  153. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.patch.mjs +34 -0
  154. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.patch.mjs.map +1 -0
  155. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +1 -1
  156. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +1 -1
  157. package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs +1 -1
  158. package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs +1 -1
  159. package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs +1 -1
  160. package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs +1 -1
  161. package/.output/server/chunks/routes/api/workshop/index.put.mjs +1 -1
  162. package/.output/server/chunks/routes/api/workshop/index5.get.mjs +3 -1
  163. package/.output/server/chunks/routes/api/workshop/index5.get.mjs.map +1 -1
  164. package/.output/server/chunks/routes/api/workshop/index6.get.mjs +5 -1
  165. package/.output/server/chunks/routes/api/workshop/index6.get.mjs.map +1 -1
  166. package/.output/server/chunks/routes/api/workshop/index9.get.mjs +3 -1
  167. package/.output/server/chunks/routes/api/workshop/index9.get.mjs.map +1 -1
  168. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +1 -1
  169. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +1 -1
  170. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +1 -1
  171. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +1 -1
  172. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +1 -1
  173. package/.output/server/chunks/routes/renderer.mjs +3 -3
  174. package/.output/server/chunks/virtual/entry.mjs +51 -25
  175. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  176. package/.output/server/package.json +1 -1
  177. package/README-zh.md +203 -39
  178. package/README.md +739 -591
  179. package/app/app.vue +9 -3
  180. package/app/assets/css/main.css +517 -7
  181. package/app/components/AppHeader.vue +98 -7
  182. package/app/components/AppSidebar.vue +117 -11
  183. package/app/components/AwChart.vue +2 -1
  184. package/app/components/workshop/AgentInspectorDrawer.vue +6 -6
  185. package/app/components/workshop/AgentLanesView.vue +52 -1
  186. package/app/components/workshop/AssetLibrary.vue +4 -2
  187. package/app/components/workshop/ChannelSessionList.vue +4 -2
  188. package/app/components/workshop/Composer.vue +96 -0
  189. package/app/components/workshop/DaqNodeRow.vue +19 -0
  190. package/app/components/workshop/DaqTemplateIcon.vue +33 -0
  191. package/app/components/workshop/DeviceTwinPanel.vue +37 -35
  192. package/app/components/workshop/EventBlock.vue +3 -3
  193. package/app/components/workshop/InspectorPanel.vue +47 -11
  194. package/app/components/workshop/LiveAgentBar.vue +34 -0
  195. package/app/components/workshop/TaskBoardView.vue +83 -33
  196. package/app/components/workshop/TranscriptTimeline.vue +56 -0
  197. package/app/components/workshop/blocks/ClusterError.vue +1 -1
  198. package/app/components/workshop/blocks/ClusterRoute.vue +3 -1
  199. package/app/components/workshop/blocks/ClusterStatus.vue +2 -2
  200. package/app/components/workshop/blocks/ClusterStream.vue +8 -2
  201. package/app/components/workshop/town/ModelPreview3D.vue +1 -1
  202. package/app/components/workshop/town/TownView.vue +507 -82
  203. package/app/composables/useResponsive.ts +88 -0
  204. package/app/composables/useRouteMeta.ts +3 -0
  205. package/app/composables/workshop/useDaqStream.ts +7 -4
  206. package/app/composables/workshop/useDcwStream.ts +8 -2
  207. package/app/composables/workshop/useVisibleInterval.ts +2 -2
  208. package/app/composables/workshop/useWorkshopApi.ts +1 -1
  209. package/app/layouts/default.vue +46 -2
  210. package/app/pages/aml/index.vue +712 -616
  211. package/app/pages/daq/[id].vue +12 -7
  212. package/app/pages/daq/index.vue +216 -13
  213. package/app/pages/dcw/[id].vue +117 -32
  214. package/app/pages/dcw/index.vue +83 -23
  215. package/app/pages/index.vue +35 -1
  216. package/app/pages/logs/index.vue +147 -13
  217. package/app/pages/monitor.vue +56 -12
  218. package/app/pages/permissions/index.vue +34 -0
  219. package/app/pages/plugins/index.vue +35 -4
  220. package/app/pages/settings.vue +90 -21
  221. package/app/pages/tokens.vue +23 -0
  222. package/app/pages/town.vue +50 -5
  223. package/app/pages/users.vue +23 -0
  224. package/app/pages/workshop/agents.vue +92 -2
  225. package/app/pages/workshop/channel-templates.vue +53 -0
  226. package/app/pages/workshop/index.vue +14 -0
  227. package/app/pages/workshop/teams.vue +66 -6
  228. package/app/pages/workshop/w/[wsId].vue +202 -14
  229. package/app/plugins/aw-plugins.client.ts +13 -8
  230. package/app/stores/app.ts +33 -1
  231. package/app/stores/workshop/user.ts +1 -1
  232. package/app/stores/workshop/workspaces.ts +18 -2
  233. package/app/utils/api-error.ts +1 -1
  234. package/cli/commands/build.mjs +8 -1
  235. package/docker-compose.yml +6 -0
  236. package/docs/cli.en.md +2 -2
  237. package/docs/cli.md +2 -2
  238. package/docs/plugins.en.md +33 -1
  239. package/docs/plugins.md +29 -1
  240. package/docs/sdk.en.md +1 -1
  241. package/docs/sdk.md +1 -1
  242. package/i18n/locales/en.ts +2 -0
  243. package/i18n/locales/zh-CN.ts +2 -0
  244. package/nuxt.config.ts +31 -0
  245. package/package.json +11 -2
  246. package/scripts/_dbg-param-map-e2e.ts +242 -0
  247. package/scripts/_dbg-param-map-rest-smoke.mjs +73 -0
  248. package/scripts/_dbg-param-real-scenario.mjs +153 -0
  249. package/scripts/_loop-biax-campaign.mjs +124 -0
  250. package/scripts/api-live-e2e.mjs +40 -8
  251. package/scripts/capture-walkthrough.mjs +232 -0
  252. package/scripts/render-walkthrough-figure.mjs +46 -0
  253. package/scripts/seed-walkthrough-fixture.mjs +143 -0
  254. package/scripts/test-plugin-hardening.mjs +8 -0
  255. package/scripts/test-serial-bridge.mjs +418 -0
  256. package/scripts/ui/admin-shots.mjs +46 -0
  257. package/scripts/ui/audit-layout.mjs +301 -0
  258. package/scripts/ui/bump-microfont.mjs +39 -0
  259. package/scripts/ui/e2e-interactive.mjs +328 -0
  260. package/scripts/ui/lib.mjs +198 -0
  261. package/scripts/ui/linkcheck2.mjs +37 -0
  262. package/scripts/ui/live-render-check.mjs +72 -0
  263. package/scripts/ui/md-lint.mjs +80 -0
  264. package/scripts/ui/perf-audit.mjs +132 -0
  265. package/scripts/ui/readme-assets.mjs +30 -0
  266. package/scripts/ui/readme-shots.mjs +42 -0
  267. package/scripts/ui/record.mjs +225 -0
  268. package/scripts/ui/seed-admin.mjs +68 -0
  269. package/scripts/ui/seed-demo.mjs +83 -0
  270. package/scripts/ui/seed-industrial-demo.mjs +171 -0
  271. package/scripts/ui/shot-hero.mjs +25 -0
  272. package/scripts/ui/shots.mjs +75 -0
  273. package/scripts/ui/sim-ui-shot.mjs +16 -0
  274. package/scripts/ui/verify-nav.mjs +51 -0
  275. package/scripts/ui/verify-responsive.mjs +285 -0
  276. package/server/api/system/config-groups/[id].patch.ts +1 -1
  277. package/server/api/system/config-groups/index.post.ts +1 -1
  278. package/server/api/system/settings/events.get.ts +1 -1
  279. package/server/api/system/settings/index.patch.ts +1 -1
  280. package/server/api/workshop/agent-tools/invoke.post.ts +16 -2
  281. package/server/api/workshop/aml/datasets/[id].get.ts +8 -1
  282. package/server/api/workshop/daq/index.get.ts +3 -1
  283. package/server/api/workshop/daq/infra/reconnect.post.ts +1 -1
  284. package/server/api/workshop/daq/templates/[key].delete.ts +1 -0
  285. package/server/api/workshop/daq/templates/[key].patch.ts +1 -0
  286. package/server/api/workshop/daq/templates/index.post.ts +1 -0
  287. package/server/api/workshop/dcw/[id]/write.post.ts +10 -2
  288. package/server/api/workshop/dcw/[id].delete.ts +5 -2
  289. package/server/api/workshop/dcw/index.get.ts +5 -0
  290. package/server/api/workshop/dcw/lines/[id].patch.ts +1 -1
  291. package/server/api/workshop/dcw/params/[id]/read.post.ts +17 -0
  292. package/server/api/workshop/dcw/params/[id]/write.post.ts +21 -0
  293. package/server/api/workshop/dcw/params/[id].delete.ts +19 -0
  294. package/server/api/workshop/dcw/params/[id].patch.ts +23 -0
  295. package/server/api/workshop/dcw/params/index.get.ts +27 -0
  296. package/server/api/workshop/dcw/params/index.post.ts +25 -0
  297. package/server/api/workshop/permissions/index.get.ts +3 -1
  298. package/server/plugins/aw-plugins.ts +23 -10
  299. package/server/plugins/dev-stability-guard.ts +3 -1
  300. package/server/plugins/system-config.ts +6 -1
  301. package/server/plugins-builtin/serial-bridge/client.mjs +210 -0
  302. package/server/plugins-builtin/serial-bridge/drivers.mjs +409 -0
  303. package/server/plugins-builtin/serial-bridge/i18n.json +62 -0
  304. package/server/plugins-builtin/serial-bridge/index.mjs +247 -0
  305. package/server/plugins-builtin/serial-bridge/lib.mjs +208 -0
  306. package/server/plugins-builtin/serial-bridge/rtu.mjs +168 -0
  307. package/server/services/system-config.ts +28 -9
  308. package/server/services/workshop/agents/adapters/one-shot-cli-agent.ts +2 -1
  309. package/server/services/workshop/agents/agent-interface.ts +8 -6
  310. package/server/services/workshop/agents/base-agent.ts +18 -4
  311. package/server/services/workshop/agents/claude-agent.ts +7 -3
  312. package/server/services/workshop/agents/codex-agent.ts +3 -3
  313. package/server/services/workshop/agents/dsh-agent.ts +3 -3
  314. package/server/services/workshop/agents/goose-agent.ts +0 -1
  315. package/server/services/workshop/agents/harness-terminal.ts +14 -1
  316. package/server/services/workshop/agents/hermes-agent.ts +4 -2
  317. package/server/services/workshop/agents/host-tool-bridge.ts +5 -1
  318. package/server/services/workshop/agents/industrial-context.ts +4 -1
  319. package/server/services/workshop/agents/industrial-tools.ts +164 -6
  320. package/server/services/workshop/agents/omp-agent.ts +15 -9
  321. package/server/services/workshop/agents/opencode-agent.ts +47 -21
  322. package/server/services/workshop/agents/qwen-agent.ts +10 -5
  323. package/server/services/workshop/aml/entity.ts +3 -1
  324. package/server/services/workshop/aml/python-runtime.ts +3 -2
  325. package/server/services/workshop/daq/bus/mqtt.adapter.ts +8 -4
  326. package/server/services/workshop/daq/daq-controller.ts +25 -5
  327. package/server/services/workshop/daq/daq-runtime.ts +5 -3
  328. package/server/services/workshop/daq/drivers.ts +141 -11
  329. package/server/services/workshop/daq/host-ports.ts +3 -2
  330. package/server/services/workshop/daq/storage/timescale.adapter.ts +3 -1
  331. package/server/services/workshop/db/channel.repo.ts +4 -0
  332. package/server/services/workshop/db/ops.repo.ts +5 -2
  333. package/server/services/workshop/db/retention.ts +8 -3
  334. package/server/services/workshop/dcw/dcw-controller.ts +147 -16
  335. package/server/services/workshop/dcw/dcw-product.repo.ts +38 -1
  336. package/server/services/workshop/dcw/dcw-runtime.ts +3 -2
  337. package/server/services/workshop/dcw/drivers.ts +90 -4
  338. package/server/services/workshop/dcw/param-conversion.ts +78 -0
  339. package/server/services/workshop/dcw/param-limits.ts +142 -0
  340. package/server/services/workshop/dcw/param-map.repo.ts +305 -0
  341. package/server/services/workshop/dcw/plugin-bridge.ts +45 -0
  342. package/server/services/workshop/dcw/recipe-rollback-manager.ts +13 -7
  343. package/server/services/workshop/plugins/host.mjs +30 -0
  344. package/server/services/workshop/runtime/agent-runtime.ts +4 -0
  345. package/server/services/workshop/runtime/manager.ts +9 -2
  346. package/server/services/workshop/settings.ts +4 -2
  347. package/server/types/pg.d.ts +49 -0
  348. package/server/utils/stability-severity.ts +13 -2
  349. package/shared/config/groups.mjs +22 -1
  350. package/shared/config/home.d.mts +28 -0
  351. package/shared/daq-protocol.ts +15 -0
  352. package/shared/dcw-protocol.ts +136 -0
  353. package/uno.config.ts +12 -1
  354. package/.output/public/_nuxt/8NMOXZOV.js +0 -1
  355. package/.output/public/_nuxt/BFkgkW8u.js +0 -4
  356. package/.output/public/_nuxt/C5gUkRwn.js +0 -1
  357. package/.output/public/_nuxt/CM12FuB42.js +0 -1
  358. package/.output/public/_nuxt/CZiw7sEV.js +0 -1
  359. package/.output/public/_nuxt/Cc_9VzD42.js +0 -1
  360. package/.output/public/_nuxt/CdPzkOMV.js +0 -1
  361. package/.output/public/_nuxt/CmsOtOAA2.js +0 -1
  362. package/.output/public/_nuxt/D1YDxZpZ.js +0 -1
  363. package/.output/public/_nuxt/D20Yamr4.js +0 -1
  364. package/.output/public/_nuxt/DAe0h2MB.js +0 -1
  365. package/.output/public/_nuxt/DmqknNvV.js +0 -18
  366. package/.output/public/_nuxt/DnUuIR83.js +0 -1
  367. package/.output/public/_nuxt/S_fVQwJK.js +0 -1
  368. package/.output/public/_nuxt/TownView.0oLiQgTC.css +0 -1
  369. package/.output/public/_nuxt/_id_.D-SYuyZb.css +0 -1
  370. package/.output/public/_nuxt/_id_.hma_BU6T.css +0 -1
  371. package/.output/public/_nuxt/_wsId_.B12v3PhY.css +0 -1
  372. package/.output/public/_nuxt/agents.BV70ioCv.css +0 -1
  373. package/.output/public/_nuxt/ahgEJu2R.js +0 -1
  374. package/.output/public/_nuxt/aml.COEKNNqK.css +0 -1
  375. package/.output/public/_nuxt/builds/meta/4457d63f-0866-4cea-b320-04a321f24795.json +0 -1
  376. package/.output/public/_nuxt/channel-templates.C-M5nKcC.css +0 -1
  377. package/.output/public/_nuxt/daq.B3265ZDn.css +0 -1
  378. package/.output/public/_nuxt/dcw.DLYZqEhT.css +0 -1
  379. package/.output/public/_nuxt/default.BXI_fZUi.css +0 -1
  380. package/.output/public/_nuxt/entry.BB-Eeh-J.css +0 -1
  381. package/.output/public/_nuxt/logs.CqFyMrJw.css +0 -1
  382. package/.output/public/_nuxt/monitor.B--1dPzs.css +0 -1
  383. package/.output/public/_nuxt/pages.ooEzrMm9.css +0 -1
  384. package/.output/public/_nuxt/permissions.B1pjGChZ.css +0 -1
  385. package/.output/public/_nuxt/plugins.5e5chZ67.css +0 -1
  386. package/.output/public/_nuxt/pz2JDAM7.js +0 -2
  387. package/.output/public/_nuxt/settings.Dm3M0RLy.css +0 -1
  388. package/.output/public/_nuxt/teams.BC75EGnR.css +0 -1
  389. package/.output/public/_nuxt/tokens.xRb1fSPU.css +0 -1
  390. package/.output/public/_nuxt/users.CXnP2E08.css +0 -1
  391. package/.output/public/_nuxt/workshop.Jk5HxWPE.css +0 -1
  392. package/.output/server/chunks/build/TownView-jVazYOjN.mjs.map +0 -1
  393. package/.output/server/chunks/build/_id_-CfVosNg3.mjs.map +0 -1
  394. package/.output/server/chunks/build/_id_-Hwr4rZpr.mjs.map +0 -1
  395. package/.output/server/chunks/build/agents-Bvin73QY.mjs.map +0 -1
  396. package/.output/server/chunks/build/daq-C03Uu5UE.mjs.map +0 -1
  397. package/.output/server/chunks/build/pages-BO7yZsXA.mjs.map +0 -1
  398. package/.output/server/chunks/build/settings-DoQ2Oq3P.mjs.map +0 -1
  399. package/.output/server/chunks/build/teams-2kz3CusY.mjs.map +0 -1
  400. package/.output/server/chunks/build/town-BOl6hs9B.mjs.map +0 -1
  401. package/.output/server/chunks/build/useDaqStream-CIBaiGAl.mjs.map +0 -1
  402. package/.output/server/chunks/build/useDcwStream-CBbiYnWe.mjs.map +0 -1
  403. package/.output/server/chunks/build/workspaces-BuydxM-3.mjs.map +0 -1
  404. /package/.output/public/_nuxt/{36oeS8_R2.js → 36oeS8_R.js} +0 -0
  405. /package/.output/public/_nuxt/{CYWVXZTS.js → CYWVXZTS2.js} +0 -0
package/app/app.vue CHANGED
@@ -68,7 +68,10 @@ const accentBase = computed(() => store.accent ?? String(runtimeCfg.effective['t
68
68
  const themeConfig = computed(() => {
69
69
  const dark = store.isDark
70
70
  // 暗:品牌绿保持饱和(仅微提亮);亮:压深保证白字对比
71
- const accent = dark ? mixWhite(accentBase.value, 0.16) : mixBlack(accentBase.value, 0.36)
71
+ // 亮色档主色压深系数 0.36 → 0.46:实测 mixBlack(0.36) 得到的 #228f66
72
+ // 作为**按钮底色**配白字只有 4.05:1、作为**链接文字**配暖纸底同样 4.02:1,
73
+ // 都差一点点达不到 AA。0.46 后两处都过 5:1,色相不变(仍是同一支品牌绿)。
74
+ const accent = dark ? mixWhite(accentBase.value, 0.16) : mixBlack(accentBase.value, 0.46)
72
75
  const paper = dark ? '#070b13' : '#f5f5f5' // colorBgLayout(canvas)
73
76
  const raised = dark ? '#0d1420' : '#ffffff' // colorBgContainer(surface card)
74
77
  const elevated = dark ? '#111a2b' : '#ffffff' // 弹层
@@ -84,6 +87,9 @@ const themeConfig = computed(() => {
84
87
  token: {
85
88
  colorPrimary: accent,
86
89
  colorInfo: dark ? '#41c8f4' : '#3f6094',
90
+ // antd 默认 error 色 #ff4d4f 在暖纸底上只有 3.27:1(实测 danger 文字按钮)
91
+ // —— 亮色档改用同色相的深红,暗色档反相提亮。
92
+ colorError: dark ? '#ff8080' : '#c0261f',
87
93
  colorLink: accent,
88
94
  borderRadius: 8,
89
95
  // 与 main.css --font-body 同源:Geist Variable(实际加载的字体;中文回退系统栈)
@@ -133,7 +139,7 @@ const themeConfig = computed(() => {
133
139
  // 强调色注入为 CSS 变量,供自定义样式消费(实时响应设置页换色);
134
140
  // lang 透传 i18n locale(保持 <html lang> 响应式)
135
141
  const accentStrong = computed(() =>
136
- store.isDark ? mixWhite(accentBase.value, 0.3) : mixBlack(accentBase.value, 0.5),
142
+ store.isDark ? mixWhite(accentBase.value, 0.3) : mixBlack(accentBase.value, 0.58),
137
143
  )
138
144
 
139
145
  useHead({
@@ -141,7 +147,7 @@ useHead({
141
147
  lang: locale,
142
148
  style: computed(() => [
143
149
  `--color-primary: ${accentBase.value}`,
144
- `--accent: ${store.isDark ? mixWhite(accentBase.value, 0.16) : mixBlack(accentBase.value, 0.36)}`,
150
+ `--accent: ${store.isDark ? mixWhite(accentBase.value, 0.16) : mixBlack(accentBase.value, 0.46)}`,
145
151
  `--accent-strong: ${accentStrong.value}`,
146
152
  `--on-accent: ${store.isDark ? '#08130d' : '#ffffff'}`,
147
153
  ]),
@@ -35,7 +35,7 @@
35
35
  --ink: #0c0a09;
36
36
  --ink-soft: #4b463f;
37
37
  /* 文字最淡一档(实测 5.0:1 @暖纸 / 5.45:1 @raised,达 AA) */
38
- --ink-faint: #6f6860;
38
+ --ink-faint: #5f5850;
39
39
  /* ⚠️ --ink-fainter 是**纯装饰**令牌(分隔发丝线/刻度点/装饰底),
40
40
  * **不得用作 color** —— 它的对比度(亮 2.53:1 / 暗 3.37:1)不达 WCAG AA 的 4.5:1。
41
41
  * 全站文字用法已收敛到 --ink-faint;此处保留令牌是因为"装饰线就该淡",
@@ -76,16 +76,22 @@
76
76
  --accent-violet: var(--tone-retry-dot);
77
77
 
78
78
  /* tone 语义状态系统(仅表真实状态,不做装饰;open-tag 状态声部) */
79
- --tone-neutral-dot: #a8a29e;
79
+ /* #a8a29e 在浅灰底上只有 2.3:1 —— "停用/离线/未运行"这类**状态标签的文字**
80
+ 用的就是它,是不可读的实测来源。压深到与 --ink-faint 同族。 */
81
+ --tone-neutral-dot: #5c564f;
80
82
  --tone-neutral-bg: #efeeec;
83
+ /* 亮色档记号色按**最深承载面**(--paper-deep #efebe5, L≈0.826)反推:
84
+ * 要求 (0.876)/(L+0.05) ≥ 4.5 → L ≤ 0.145。原 #4c8f63 / #b9770e / #c25a4e
85
+ * 在白底上尚可,一落到 paper-deep(表格斑马行、面板底)就掉到 3.7–4.3 —— 实测审计在
86
+ * 亮色档稳定报出 60+ 处不达标,全部来自这三个记号色被当**文字色**用。 */
81
87
  --tone-success-bg: #eaf7ef;
82
- --tone-success-dot: #4c8f63;
88
+ --tone-success-dot: #367048;
83
89
  --tone-info-bg: #eef3fb;
84
90
  --tone-info-dot: #3f6094;
85
91
  --tone-warning-bg: #faf1df;
86
- --tone-warning-dot: #b9770e;
92
+ --tone-warning-dot: #8f5c07;
87
93
  --tone-danger-bg: #fdecea;
88
- --tone-danger-dot: #c25a4e;
94
+ --tone-danger-dot: #a83f34;
89
95
  --tone-retry-bg: #f1eef9;
90
96
  --tone-retry-dot: #6b5aa0;
91
97
  /* 运行中信号(busy 呼吸点/运行指示;比 warning-dot 更亮的琥珀,仅作指示点) */
@@ -623,7 +629,12 @@ ul.task-list {
623
629
  display: flex;
624
630
  align-items: flex-end;
625
631
  justify-content: space-between;
626
- gap: 16px;
632
+ /* 允许换行:右侧徽标组的内容长度是**数据驱动**的(例如 AML 页的
633
+ * "UV · uv 0.11.29 (901092ee1 2026-07-15 · x86_64-pc-windows-msvc)" 这种长串),
634
+ * 不换行时它被压成一列三行的窄条,而左侧描述也被挤成两行 —— 两边都难看。
635
+ * 给了 wrap 之后,放不下就整组落到第二行,各自都有整行可用。 */
636
+ flex-wrap: wrap;
637
+ gap: 12px 16px;
627
638
  margin-bottom: 18px;
628
639
  }
629
640
 
@@ -635,9 +646,12 @@ ul.task-list {
635
646
  letter-spacing: -0.015em;
636
647
  }
637
648
 
638
- /* 版本铭牌:hairline 小片 */
649
+ /* 版本铭牌:hairline 小片。
650
+ * width:fit-content 是必须的 —— 它是 inline-flex,一旦落在 display:flex/grid 的
651
+ * 父级里就会被拉伸成整行宽,在窄屏变成一条横贯屏幕的空药丸(实测 /settings)。 */
639
652
  .aw-stamp {
640
653
  display: inline-flex;
654
+ width: fit-content;
641
655
  align-items: center;
642
656
  gap: 6px;
643
657
  padding: 3px 10px;
@@ -2269,4 +2283,500 @@ html.dark .aw-gauge-band {
2269
2283
  }
2270
2284
  }
2271
2285
 
2286
+ /* ══════════════════════════════════════════════════════════════════════════
2287
+ v5 · 响应式层 —— 「叠层仪表台」
2288
+ ──────────────────────────────────────────────────────────────────────────
2289
+ 形态来自产品本身:这是一间产线控制室,桌面是**三栏仪表台**(刻度轨 + 画布 +
2290
+ 侧检视)。窄屏不是"把仪表台缩小",而是换成另一台仪器:
2291
+
2292
+ ≥1024 三栏仪表台 刻度轨(228) + 画布 + 侧检视
2293
+ 900–1023 双栏 刻度轨收成图标轨(64) + 画布
2294
+ 640–899 手持巡检仪 刻度轨变抽屉(汉堡拉出),页头纵向堆叠,表格成"账页条"
2295
+ <640 单手巡检 单列,主操作占满行,读数码降一档
2296
+
2297
+ ⚠️ 断点值是**内容驱动**推导的,不是设备宽度:
2298
+ · 900 = 刻度轨 228 + 画布最小可用宽 672(DAQ 主表 6 列不折行的下限)
2299
+ · 640 = 单据类页面"一行一事"的下限(低于它,行内键值对必须改堆叠)
2300
+ · 420 = 窄机(iPhone SE 一类),连 12px 标签都要让位给内容
2301
+ ⚠️ CSS 变量不能用在 media query 条件里,所以断点只能写数值 ——
2302
+ 上面这段注释就是这些数值的**唯一出处**,不要在别处再散落魔数。
2303
+ ══════════════════════════════════════════════════════════════════════════ */
2304
+
2305
+ /* ── 结构性兜底:任何容器都不允许把内容顶出视口 ──
2306
+ overflow-x: clip 而非 hidden:clip 不产生滚动容器,
2307
+ 因此不会破坏侧栏/浮层的 position: sticky 与 fixed。 */
2308
+ html,
2309
+ body {
2310
+ max-width: 100%;
2311
+ overflow-x: clip;
2312
+ }
2313
+
2314
+ /* 长 token(节点 ID / run id / hash)在窄屏必须能断,否则整页被顶宽 */
2315
+ @media (max-width: 900px) {
2316
+ .aw-mono,
2317
+ code,
2318
+ kbd,
2319
+ samp {
2320
+ overflow-wrap: anywhere;
2321
+ }
2322
+ }
2323
+
2324
+ /* ── 画布留白:窄屏收边(桌面 12/16,手持 8/10)—— 手持设备每像素都贵 ── */
2325
+ @media (max-width: 900px) {
2326
+ .app-content {
2327
+ margin: 10px 10px 0;
2328
+ }
2329
+
2330
+ .app-footer {
2331
+ padding: 0 16px;
2332
+ }
2333
+ }
2334
+
2335
+ @media (max-width: 640px) {
2336
+ .app-content {
2337
+ margin: 8px 8px 0;
2338
+ }
2339
+ }
2340
+
2341
+ /* ══ 1. 页头:量程线在窄屏从"两端对齐"改为"纵向堆叠" ══════════════════════
2342
+ desktop 的 justify-content: space-between 要求两侧都有余量;
2343
+ 窄屏两侧一挤,标题就被压成一列竖排字(实测 /daq「暂 停 全 部 采 集」)。
2344
+ 堆叠顺序 = 阅读顺序:kicker → 标题 → 描述 → 操作。 */
2345
+ @media (max-width: 900px) {
2346
+ .aw-page-head {
2347
+ flex-direction: column;
2348
+ align-items: stretch;
2349
+ gap: 12px;
2350
+ }
2351
+
2352
+ .aw-page-head > div,
2353
+ .aw-page-head > header {
2354
+ min-width: 0;
2355
+ }
2356
+
2357
+ .aw-page-head h1 {
2358
+ font-size: 24px;
2359
+ line-height: 1.2;
2360
+ }
2361
+ }
2362
+
2363
+ @media (max-width: 640px) {
2364
+ .aw-page-head {
2365
+ padding-bottom: 12px;
2366
+ margin-bottom: 14px;
2367
+ }
2368
+
2369
+ .aw-page-head h1 {
2370
+ font-size: 21px;
2371
+ }
2372
+ }
2373
+
2374
+ /* 行内操作渐显(仅鼠标语境):一张 16 行的表里 32 个红色文字按钮同时在喊,
2375
+ * 数据本身反而被淹没 —— 这是既有设计语言里就写明的"行内操作渐显",
2376
+ * 之前只在少数页面手工实现。这里收敛成一条全局规则。
2377
+ * 触屏没有 hover,所以整条规则包在 (hover: hover) 里,手机上按钮始终可见。 */
2378
+ @media (hover: hover) and (pointer: fine) {
2379
+ .ant-table-tbody > tr .ant-btn-text,
2380
+ .ant-table-tbody > tr .mini-btn {
2381
+ opacity: 0.6;
2382
+ transition: opacity var(--transition-fast);
2383
+ }
2384
+
2385
+ .ant-table-tbody > tr:hover .ant-btn-text,
2386
+ .ant-table-tbody > tr:hover .mini-btn,
2387
+ .ant-table-tbody > tr .ant-btn-text:focus-visible,
2388
+ .ant-table-tbody > tr .mini-btn:focus-visible {
2389
+ opacity: 1;
2390
+ }
2391
+ }
2392
+
2393
+ /* 页头右侧的操作/徽标组:窄屏允许换行,不参与"压扁标题" */
2394
+ @media (max-width: 900px) {
2395
+ .aw-page-head > .badges,
2396
+ .aw-page-head > .actions,
2397
+ .aw-page-head > .head-actions,
2398
+ .aw-page-head > .head-right {
2399
+ display: flex;
2400
+ flex-wrap: wrap;
2401
+ gap: 8px;
2402
+ align-items: center;
2403
+ justify-content: flex-start;
2404
+ }
2405
+ }
2406
+
2407
+ /* ══ 2. 分段控件 / 筛选条:窄屏横向滚动,绝不顶破视口 ══════════════════════
2408
+ antd Segmented 是定宽块,项目里当筛选条用;窄屏必须能横扫。
2409
+ 用 mask 在右缘渐隐,提示"还有更多"——比直接裁断诚实。 */
2410
+ @media (max-width: 900px) {
2411
+ .ant-segmented {
2412
+ max-width: 100%;
2413
+ overflow-x: auto;
2414
+ overflow-y: hidden;
2415
+ scrollbar-width: none;
2416
+ -webkit-mask-image: linear-gradient(90deg, #000 0 calc(100% - 22px), transparent 100%);
2417
+ mask-image: linear-gradient(90deg, #000 0 calc(100% - 22px), transparent 100%);
2418
+ }
2419
+
2420
+ .ant-segmented::-webkit-scrollbar {
2421
+ display: none;
2422
+ }
2423
+
2424
+ .ant-segmented-group {
2425
+ flex-wrap: nowrap;
2426
+ }
2427
+
2428
+ .ant-segmented-item-label {
2429
+ white-space: nowrap;
2430
+ }
2431
+ }
2432
+
2433
+ /* ══ 3. 表格:窄屏成为"账页条"(可横扫,首列钉住) ═══════════════════════════
2434
+ 窄屏不把表格重排成卡片 —— 那会丢掉列语义(哪一列是"驱动"哪一列是"产线")。
2435
+ 保留列,只给它一条可扫的卷轴,并把身份列(第一列)钉在左缘:
2436
+ 横扫时始终知道"这一行是谁"。 */
2437
+ @media (max-width: 900px) {
2438
+ .ant-table-wrapper {
2439
+ max-width: 100%;
2440
+ }
2441
+
2442
+ .ant-table-wrapper .ant-table-content,
2443
+ .ant-table-wrapper .ant-table-body {
2444
+ overflow-x: auto !important;
2445
+ -webkit-overflow-scrolling: touch;
2446
+ }
2447
+
2448
+ .ant-table-wrapper .ant-table-thead > tr > th:first-child,
2449
+ .ant-table-wrapper .ant-table-tbody > tr > td:first-child {
2450
+ position: sticky;
2451
+ left: 0;
2452
+ z-index: 2;
2453
+ background: var(--paper-raised);
2454
+ box-shadow: 1px 0 0 var(--line);
2455
+ }
2456
+
2457
+ .ant-table-wrapper .ant-table-thead > tr > th:first-child {
2458
+ z-index: 3;
2459
+ }
2460
+ }
2461
+
2462
+ /* 分页器窄屏收边 */
2463
+ @media (max-width: 640px) {
2464
+ .ant-pagination {
2465
+ flex-wrap: wrap;
2466
+ row-gap: 6px;
2467
+ }
2468
+
2469
+ /* 表格单元格内距降档:antd 的 middle 尺寸是 16px 上下内距,
2470
+ * 单行数据行会被撑到 76px —— 手机上 7 行就占掉三屏(实测 /tokens)。
2471
+ * 降到 10px 后行高回到 ~60px,信息密度翻倍,且不损失可点面积
2472
+ * (行内按钮另有 34px 下限)。 */
2473
+ .ant-table-wrapper .ant-table-tbody > tr > td,
2474
+ .ant-table-wrapper .ant-table-thead > tr > th {
2475
+ padding: 10px 8px;
2476
+ }
2477
+ }
2478
+
2479
+ /* ══ 4. 面板/仪表:窄屏统一收边 + 头部换行 ════════════════════════════════ */
2480
+ @media (max-width: 900px) {
2481
+ .aw-bench,
2482
+ .aw-tile,
2483
+ .aw-glass-panel {
2484
+ border-radius: var(--radius-panel-sm, 10px);
2485
+ }
2486
+
2487
+ .aw-bench-hd {
2488
+ flex-wrap: wrap;
2489
+ gap: 8px;
2490
+ }
2491
+ }
2492
+
2493
+ /* 统计带:桌面是一行分格量规,窄屏折成 2 列(数值本身不被压扁) */
2494
+ @media (max-width: 900px) {
2495
+ .aw-gauge-band {
2496
+ flex-wrap: wrap;
2497
+ }
2498
+
2499
+ .aw-gauge {
2500
+ flex: 1 1 calc(50% - 12px);
2501
+ min-width: 132px;
2502
+ }
2503
+ }
2504
+
2505
+ @media (max-width: 420px) {
2506
+ .aw-gauge {
2507
+ flex: 1 1 100%;
2508
+ }
2509
+ }
2510
+
2511
+ /* ══ 5. 设置行:桌面是"键 — 值"两端对齐,窄屏必须上下堆叠 ══════════════════
2512
+ 不堆叠时键名会被压成一列竖排字(实测 /settings 主题设置的描述整段竖排)。 */
2513
+ @media (max-width: 720px) {
2514
+ .aw-row {
2515
+ flex-direction: column;
2516
+ align-items: stretch;
2517
+ gap: 6px;
2518
+ }
2519
+
2520
+ .aw-row-key,
2521
+ .aw-row-val {
2522
+ width: 100%;
2523
+ max-width: 100%;
2524
+ }
2525
+
2526
+ .aw-row-val {
2527
+ justify-content: flex-start;
2528
+ }
2529
+ }
2530
+
2531
+ /* ══ 6. 触摸目标:粗指针设备上所有可点元素至少 40px 高 ════════════════════
2532
+ 只在 coarse pointer 上生效 —— 桌面鼠标精度高,放大反而破坏密度。 */
2533
+ @media (pointer: coarse) {
2534
+ .ant-btn,
2535
+ .pill-btn,
2536
+ .ghost-btn,
2537
+ .mini-btn,
2538
+ .aw-pill,
2539
+ .aw-ghost,
2540
+ .icon-btn,
2541
+ .lib-link,
2542
+ .collapse-btn,
2543
+ .aw-diag-btn {
2544
+ min-height: 40px;
2545
+ }
2546
+
2547
+ .ant-btn-sm {
2548
+ min-height: 34px;
2549
+ }
2550
+
2551
+ .menu-item {
2552
+ min-height: 44px;
2553
+ }
2554
+
2555
+ /* 命中区外扩:控件本体只有 16–28px(设计如此),不该为了达标把视觉尺寸撑大,
2556
+ * 正确做法是把**可点区域**扩到 40px。审计量的也是命中区,不是盒子大小。
2557
+ *
2558
+ * ⚠️ 只能用 ::after,而且要先确认该元素没被组件库占用这个伪元素 ——
2559
+ * antd 的表格展开图标恰恰是用 ::before/::after 画那根 +/− 横竖线的,
2560
+ * 用 ::after 去"扩命中区"会直接把图标画坏(曾误加到列表里,已撤)。
2561
+ * 对这类"伪元素已占用"的控件,只能老实把盒子做大。 */
2562
+ /* ⚠️ **不要改这个图标的盒子尺寸**。antd 的 +/− 是用固定像素偏移画的
2563
+ * (::before 的 top:7px/left:3px、::after 的 left:7px…),这些偏移是按 17px 盒子调的;
2564
+ * 把盒子改大,横竖线的交汇点就跑到左上角,图标看起来像"表格边框坏了"(实测踩过)。
2565
+ *
2566
+ * 正确的放大方式是**等比缩放整个图标**:antd 本来就给它加了 transform: scale(.941176),
2567
+ * 覆盖成 1.8 即可 —— 图形与偏移一起放大,永不跑位,命中区也从 16px 变成 30.6px。
2568
+ * (展开态的差异是靠 ::after 的旋转,不在元素 transform 上,所以覆盖它是安全的。) */
2569
+ .ant-table-row-expand-icon {
2570
+ transform: scale(1.8) !important;
2571
+ }
2572
+
2573
+ .ant-switch,
2574
+ .ant-checkbox-wrapper,
2575
+ .ant-radio-button-wrapper {
2576
+ position: relative;
2577
+ }
2578
+
2579
+ .ant-switch::after {
2580
+ position: absolute;
2581
+ inset: -12px;
2582
+ content: '';
2583
+ }
2584
+
2585
+ .ant-checkbox-wrapper::after,
2586
+ .ant-radio-button-wrapper::after {
2587
+ position: absolute;
2588
+ inset: -10px -6px;
2589
+ content: '';
2590
+ }
2591
+ }
2592
+
2593
+ /* ══ 6b. 手持档的语义级字号地板:<small> 就是"小字",手机上它不该真的小 ═════
2594
+ * 逐类点名修了二十几个类名之后仍然漏(实测 /daq 单页还剩 120+ 处,分散在
2595
+ * DaqNodeRow、line-pill、infra-banner 各处,而且被更高特异度的规则盖回来)。
2596
+ * <small> 是语义标签:它在手持档的**下限**由可读性决定,不由排版细节决定 ——
2597
+ * 所以这里用一条语义级兜底,而不是继续加类名。 */
2598
+ @media (max-width: 900px) {
2599
+ /* 用 body 而不是 .app-content:浮层(抽屉/tooltip/popover)被 teleport 到 body 下,
2600
+ * 不属于 .app-content,用后者会漏掉它们(实测:同一批 <small> 在页面里修好、
2601
+ * 在浮层里照旧)。 */
2602
+ body small,
2603
+ body small *,
2604
+ body :not(pre) > code {
2605
+ font-size: 11.5px !important;
2606
+ }
2607
+
2608
+ /* 行内代码同属"要被读的正文",且它常承载 ID / 参数。pre 里的代码块不在此列
2609
+ (代码块有自己的等宽排版,放大反而破坏对齐)。 */
2610
+ .app-content :not(pre) > code {
2611
+ font-size: 11.5px;
2612
+ }
2613
+ }
2614
+
2615
+ /* ══ 7. 字号地板:窄屏不允许出现"看得见但读不了"的微字 ═════════════════════
2616
+ 桌面 10–11px 的 mono 微标签是**仪器铭牌**语言,保留;
2617
+ 手持距离(≈30cm)下 10px 只剩 6px 有效字号,必须抬到 11.5px 起。 */
2618
+ /* ⚠️ 这里必须 !important:页脚与侧栏铭牌的字号定义在**组件的 scoped 样式**里
2619
+ * (`.app-footer[data-v-x]` = 0,2,0),全局层同选择器只有 0,1,0,靠源码顺序取胜不可靠
2620
+ * (构建后组件样式与 main.css 的先后会被打包器重排)。而"手持视距下的字号地板"是
2621
+ * 无障碍要求,不是主题偏好 —— 它就应该盖过组件里的 10px 微字。 */
2622
+ @media (max-width: 640px) {
2623
+ .aw-kicker,
2624
+ .aw-bench-kicker,
2625
+ .aw-bench-meta,
2626
+ .aw-gauge-label,
2627
+ .aw-gauge .aw-readout small,
2628
+ .app-footer,
2629
+ .app-footer span,
2630
+ .footer-line,
2631
+ /* 几处"分节小标"散落在页面自己的 scoped 样式里(8.5–10px),
2632
+ 逐页去改不如在全局层给这一类语义一个统一地板:它们都是**给人读的分节名**。 */
2633
+ .lc-state,
2634
+ .ctl-sec,
2635
+ .dock-mode,
2636
+ .st-pill {
2637
+ font-size: 11.5px !important;
2638
+ }
2639
+
2640
+ /* 壳层铭牌同样受字号地板约束:它们不是"装饰刻度"而是身份/分区信息,
2641
+ 手持视距下 8.5–10px 等于读不了(实测审计在 375 每页稳定报 8 条)。 */
2642
+ .logo-sub,
2643
+ .menu-group-text,
2644
+ .sider-footer,
2645
+ .sider-footer .footer-line,
2646
+ .app-footer .sep {
2647
+ font-size: 11.5px;
2648
+ }
2649
+
2650
+ .menu-group-text {
2651
+ letter-spacing: 0.1em;
2652
+ }
2653
+ }
2654
+
2655
+ /* 抽屉打开时(on≤900 的窄屏形态),侧栏铭牌的可读距离比桌面更近,
2656
+ 但抽屉宽度只有 264px —— 抬字号同时要收一点字距,避免分组标顶到刻度线。 */
2657
+ @media (max-width: 900px) {
2658
+ body.nav-drawer .app-sider .logo-sub,
2659
+ body.nav-drawer .app-sider .menu-group-text,
2660
+ body.nav-drawer .app-sider .footer-line,
2661
+ body.nav-drawer .app-sider .logo-title {
2662
+ font-size: 11.5px !important;
2663
+ }
2664
+
2665
+ body.nav-drawer .app-sider .menu-group-text {
2666
+ letter-spacing: 0.1em;
2667
+ }
2668
+ }
2669
+
2670
+ /* ══ 8. 浮层:窄屏抽屉/模态占满可用宽,底部留安全区 ═══════════════════════ */
2671
+ @media (max-width: 640px) {
2672
+ .ant-drawer-content-wrapper {
2673
+ max-width: 100vw;
2674
+ }
2675
+
2676
+ .ant-modal {
2677
+ max-width: calc(100vw - 16px);
2678
+ margin: 8px auto;
2679
+ }
2680
+
2681
+ .ant-drawer-body,
2682
+ .ant-modal-body {
2683
+ padding-bottom: max(16px, env(safe-area-inset-bottom));
2684
+ }
2685
+ }
2686
+
2687
+ /* ══ 9. 横屏手机(高度 ≤ 520 且宽 > 640):纵向空间才是瓶颈 ════════════════
2688
+ 横屏多用于"看趋势图",此时不该再给页头留桌面级留白。 */
2689
+ @media (max-height: 520px) and (min-width: 641px) {
2690
+ .aw-page-head {
2691
+ padding-bottom: 10px;
2692
+ margin-bottom: 12px;
2693
+ }
2694
+
2695
+ .aw-page-head h1 {
2696
+ font-size: 22px;
2697
+ }
2698
+
2699
+ .app-footer {
2700
+ display: none;
2701
+ }
2702
+ }
2703
+
2704
+ /* ══ 9b. 亮色档:antd 预设 tag 的文字色按"彩色小标签"设计,不是按 AA 正文设计 ══
2705
+ 实测 gold preset 的 #d48806 落在 #fffbe6 上只有 2.76:1。
2706
+ 这里只压深**文字**、保留色相与底色 —— 色相本身在传信息(lead/worker/阶段),
2707
+ 改成灰标签等于把信息抹掉。currentColor 在 color 属性里解析为**继承值**,
2708
+ 所以这条既通用又不需要枚举 antd 的十种 preset。 */
2709
+ html:not(.dark) .ant-tag {
2710
+ color: color-mix(in srgb, currentColor 70%, #000);
2711
+ }
2712
+
2713
+ /* antd 开关的"关闭态文字"(unCheckedChildren)是白字压在 #bfbfbf 轨道上,只有 1.9:1。
2714
+ * 这不是我们的配色,而是组件库对"彩色轨道"的默认假设 —— 在浅色主题里轨道是灰的,
2715
+ * 白字必须换成墨色。开启态轨道是品牌绿,白字仍然成立,不动。 */
2716
+ html:not(.dark) .ant-switch .ant-switch-inner .ant-switch-inner-unchecked,
2717
+ html:not(.dark) .ant-switch-inner-unchecked {
2718
+ color: #3a3733 !important;
2719
+ }
2720
+
2721
+ /* ══ 10. 侧栏三种形态:full(≥1024) / rail(900–1023) / drawer(<900) ═══════
2722
+ 形态判据写在 <body> 的类上(由 AppSidebar 的 useResponsive 镜像),
2723
+ 而不是打 a-layout-sider 自己的 class —— 实测 antd Sider 不透传动态 class,
2724
+ 把**结构性布局**挂在第三方组件的 attr 透传行为上是脆的。
2725
+
2726
+ 为什么窄屏侧栏必须离开文档流:
2727
+ 1. 228px 文字轨 + 画布在 390px 屏上只剩 162px —— 任何页面都读不了;
2728
+ 2. antd Sider 的 breakpoint 会把 collapsed 写回持久化偏好,
2729
+ "在手机上打开过一次" 就变成 "桌面侧栏永久收起"(实测复现)。 */
2730
+ body.nav-drawer .app-sider {
2731
+ position: fixed;
2732
+ inset: 0 auto 0 0;
2733
+ z-index: 1200;
2734
+ width: 264px !important;
2735
+ min-width: 264px !important;
2736
+ max-width: 264px !important;
2737
+ height: 100dvh;
2738
+ transform: translateX(-100%);
2739
+ transition:
2740
+ transform 0.28s var(--spring-soft, cubic-bezier(0.22, 1, 0.36, 1)),
2741
+ box-shadow 0.28s ease;
2742
+ will-change: transform;
2743
+ }
2744
+
2745
+ body.nav-drawer.nav-drawer-open .app-sider {
2746
+ transform: translateX(0);
2747
+ box-shadow: 0 24px 60px rgb(0 0 0 / 45%);
2748
+ }
2749
+
2750
+ /* 关闭态彻底移出可达树:transform 只是"看不见",元素仍在文档里可被 Tab 聚焦、
2751
+ 也会被几何审计记成"fixed 元素越界"(每个页面稳定 1 条假阳性)。
2752
+ visibility 用延时切换,保证关门动画播完再隐藏。 */
2753
+ body.nav-drawer:not(.nav-drawer-open) .app-sider {
2754
+ visibility: hidden;
2755
+ transition:
2756
+ transform 0.28s var(--spring-soft, cubic-bezier(0.22, 1, 0.36, 1)),
2757
+ visibility 0s linear 0.28s;
2758
+ }
2759
+
2760
+ /* 抽屉内条目回到手指友好的尺寸(桌面 34px 对拇指太窄) */
2761
+ body.nav-drawer .app-sider .menu-item {
2762
+ min-height: 44px;
2763
+ font-size: 14px;
2764
+ }
2765
+
2766
+ body.nav-drawer .app-sider .logo {
2767
+ height: 56px;
2768
+ }
2769
+
2770
+ body.nav-drawer .app-sider .app-menu {
2771
+ padding-bottom: 84px;
2772
+ }
2773
+
2774
+ @media (prefers-reduced-motion: reduce) {
2775
+ body.nav-drawer .app-sider {
2776
+ transition: none;
2777
+ }
2778
+ }
2779
+
2780
+
2781
+
2272
2782