agentworkshop 0.7.38 → 0.7.40

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 (392) hide show
  1. package/.AgentWorkShop/prompts/aml-mission-default.md +20 -20
  2. package/.AgentWorkShop/prompts/aml-playbook.md +49 -49
  3. package/.AgentWorkShop/prompts/host-tools.json +1293 -1238
  4. package/.AgentWorkShop/prompts/peer-reply-cross-channel.md +10 -10
  5. package/.output/.AgentWorkShop/prompts/aml-mission-default.md +20 -20
  6. package/.output/.AgentWorkShop/prompts/aml-playbook.md +49 -49
  7. package/.output/.AgentWorkShop/prompts/host-tools.json +1293 -1238
  8. package/.output/.AgentWorkShop/prompts/peer-reply-cross-channel.md +10 -10
  9. package/.output/nitro.json +1 -1
  10. package/.output/public/_nuxt/88GOowgO2.js +1 -0
  11. package/.output/public/_nuxt/{BNT8gYU92.js → BC9wjTJK2.js} +2 -2
  12. package/.output/public/_nuxt/BOt2SP4z.js +1 -0
  13. package/.output/public/_nuxt/BP-NyKVG.js +18 -0
  14. package/.output/public/_nuxt/{HBLJ-wei.js → BXxH0UQE.js} +1 -1
  15. package/.output/public/_nuxt/{zIGh7R49.js → BneN7fbu.js} +1 -1
  16. package/.output/public/_nuxt/BsROmY89.js +1 -0
  17. package/.output/public/_nuxt/{C_OLzD09.js → C4oW1HsE.js} +1 -1
  18. package/.output/public/_nuxt/CFxtLwjp.js +1 -0
  19. package/.output/public/_nuxt/{Cec0Ua3F.js → CS50LB_l.js} +1 -1
  20. package/.output/public/_nuxt/C_iYD-EB.js +1 -0
  21. package/.output/public/_nuxt/{DAe0h2MB.js → ClILjvWH.js} +1 -1
  22. package/.output/public/_nuxt/CssgYAAL2.js +1 -0
  23. package/.output/public/_nuxt/{CY9LbPCI.js → CzOCSGLe.js} +1 -1
  24. package/.output/public/_nuxt/D8qvkfyY.js +1 -0
  25. package/.output/public/_nuxt/DCn7QZ5N.js +2 -0
  26. package/.output/public/_nuxt/DGIuvyRN2.js +1 -0
  27. package/.output/public/_nuxt/{CojCTLKD.js → DGj-WEBg.js} +1 -1
  28. package/.output/public/_nuxt/{DDShH71m.js → DS8qj8EL.js} +1 -1
  29. package/.output/public/_nuxt/DTFCy6h-.js +1 -0
  30. package/.output/public/_nuxt/{DrYV5i68.js → DUjW5Yq5.js} +1 -1
  31. package/.output/public/_nuxt/DZshyNLa.js +1 -0
  32. package/.output/public/_nuxt/{45zuyAso.js → D_OTvQza.js} +1 -1
  33. package/.output/public/_nuxt/DcsCcxp4.js +1 -0
  34. package/.output/public/_nuxt/{DUrecWPx.js → Dihnimlk.js} +2 -2
  35. package/.output/public/_nuxt/Dqw1lpr-.js +1 -0
  36. package/.output/public/_nuxt/{BG8sCcwx.js → Dr9v6C0f.js} +9 -9
  37. package/.output/public/_nuxt/{8NMOXZOV.js → Du9ZJtnj.js} +1 -1
  38. package/.output/public/_nuxt/TownView.f-YOdXRs.css +1 -0
  39. package/.output/public/_nuxt/_id_.CM4bIgKY.css +1 -0
  40. package/.output/public/_nuxt/_id_.bNV69Dtf.css +1 -0
  41. package/.output/public/_nuxt/_wsId_.B4WiqkIS.css +1 -0
  42. package/.output/public/_nuxt/agents.ZD0rVdHE.css +1 -0
  43. package/.output/public/_nuxt/aml.BN8ZEW4h.css +1 -0
  44. package/.output/public/_nuxt/builds/latest.json +1 -1
  45. package/.output/public/_nuxt/builds/meta/f4707884-7cf4-4a31-80d2-e3d72b73745f.json +1 -0
  46. package/.output/public/_nuxt/channel-templates.BOtahzPi.css +1 -0
  47. package/.output/public/_nuxt/daq.B0D3dPAc.css +1 -0
  48. package/.output/public/_nuxt/dcw.8Y7FqCVN.css +1 -0
  49. package/.output/public/_nuxt/default.J32SgqFY.css +1 -0
  50. package/.output/public/_nuxt/entry.bdm0tv6M.css +1 -0
  51. package/.output/public/_nuxt/logs.BpKzmKsh.css +1 -0
  52. package/.output/public/_nuxt/monitor.D9pe7qN6.css +1 -0
  53. package/.output/public/_nuxt/pages.D7aSDlUI.css +1 -0
  54. package/.output/public/_nuxt/permissions.DwTVlFe6.css +1 -0
  55. package/.output/public/_nuxt/plugins.sb4nDGqr.css +1 -0
  56. package/.output/public/_nuxt/{Cbq-mryP.js → qr6R6Ha1.js} +1 -1
  57. package/.output/public/_nuxt/settings.BTgR-NiE.css +1 -0
  58. package/.output/public/_nuxt/teams.CxnxKVVs.css +1 -0
  59. package/.output/public/_nuxt/tokens.BFY7qv4f.css +1 -0
  60. package/.output/public/_nuxt/{town.DKIAhKnx.css → town.BBXZmeoP.css} +1 -1
  61. package/.output/public/_nuxt/users.DLgZ1D0h.css +1 -0
  62. package/.output/public/_nuxt/workshop.CR_QzeAN.css +1 -0
  63. package/.output/public/_nuxt/{BzHEilTt.js → xh3_vYcu.js} +1 -1
  64. package/.output/public/_nuxt/yF0aYMF1.js +4 -0
  65. package/.output/server/chunks/_/entity.mjs.map +1 -1
  66. package/.output/server/chunks/_/nitro.mjs +2244 -1464
  67. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  68. package/.output/server/chunks/build/{TownView-jVazYOjN.mjs → TownView-BuLAsmpR.mjs} +288 -206
  69. package/.output/server/chunks/build/TownView-BuLAsmpR.mjs.map +1 -0
  70. package/.output/server/chunks/build/{_id_-CfVosNg3.mjs → _id_-BU1wfOID.mjs} +138 -138
  71. package/.output/server/chunks/build/{_id_-CfVosNg3.mjs.map → _id_-BU1wfOID.mjs.map} +1 -1
  72. package/.output/server/chunks/build/{_id_-Hwr4rZpr.mjs → _id_-BYsEua57.mjs} +33 -32
  73. package/.output/server/chunks/build/_id_-BYsEua57.mjs.map +1 -0
  74. package/.output/server/chunks/build/{_wsId_-BVg3bB77.mjs → _wsId_-BxlDcJHg.mjs} +293 -259
  75. package/.output/server/chunks/build/{_wsId_-BVg3bB77.mjs.map → _wsId_-BxlDcJHg.mjs.map} +1 -1
  76. package/.output/server/chunks/build/{agents-Bvin73QY.mjs → agents-CLQqJF2y.mjs} +21 -27
  77. package/.output/server/chunks/build/agents-CLQqJF2y.mjs.map +1 -0
  78. package/.output/server/chunks/build/{aml-BCSJCdX7.mjs → aml-_7FdFL2p.mjs} +109 -109
  79. package/.output/server/chunks/build/{aml-BCSJCdX7.mjs.map → aml-_7FdFL2p.mjs.map} +1 -1
  80. package/.output/server/chunks/build/api-error-dul30BYQ.mjs.map +1 -1
  81. package/.output/server/chunks/build/{channel-templates-BTq8570n.mjs → channel-templates-p6SZNjlM.mjs} +19 -19
  82. package/.output/server/chunks/build/{channel-templates-BTq8570n.mjs.map → channel-templates-p6SZNjlM.mjs.map} +1 -1
  83. package/.output/server/chunks/build/{daq-C03Uu5UE.mjs → daq-cgyjKmJu.mjs} +188 -122
  84. package/.output/server/chunks/build/daq-cgyjKmJu.mjs.map +1 -0
  85. package/.output/server/chunks/build/{dcw-6vEYVeje.mjs → dcw-CoTxBlAZ.mjs} +45 -45
  86. package/.output/server/chunks/build/{dcw-6vEYVeje.mjs.map → dcw-CoTxBlAZ.mjs.map} +1 -1
  87. package/.output/server/chunks/build/{default-hseyOqBT.mjs → default-BE4r0FZN.mjs} +158 -79
  88. package/.output/server/chunks/build/{default-hseyOqBT.mjs.map → default-BE4r0FZN.mjs.map} +1 -1
  89. package/.output/server/chunks/build/{logs-B-xhuqln.mjs → logs-BSOeZwwI.mjs} +34 -34
  90. package/.output/server/chunks/build/{logs-B-xhuqln.mjs.map → logs-BSOeZwwI.mjs.map} +1 -1
  91. package/.output/server/chunks/build/{monitor-CyfDt4nR.mjs → monitor-C0okQaXz.mjs} +33 -33
  92. package/.output/server/chunks/build/{monitor-CyfDt4nR.mjs.map → monitor-C0okQaXz.mjs.map} +1 -1
  93. package/.output/server/chunks/build/{pages-BO7yZsXA.mjs → pages-DFxjn9Xa.mjs} +33 -17
  94. package/.output/server/chunks/build/pages-DFxjn9Xa.mjs.map +1 -0
  95. package/.output/server/chunks/build/{permissions-B52oOmaO.mjs → permissions-68SsNjex.mjs} +12 -12
  96. package/.output/server/chunks/build/{permissions-B52oOmaO.mjs.map → permissions-68SsNjex.mjs.map} +1 -1
  97. package/.output/server/chunks/build/{plugins-CUWmMdyt.mjs → plugins-lGlUr1lj.mjs} +17 -17
  98. package/.output/server/chunks/build/{plugins-CUWmMdyt.mjs.map → plugins-lGlUr1lj.mjs.map} +1 -1
  99. package/.output/server/chunks/build/{settings-DoQ2Oq3P.mjs → settings-Ddd1qx2Z.mjs} +50 -47
  100. package/.output/server/chunks/build/settings-Ddd1qx2Z.mjs.map +1 -0
  101. package/.output/server/chunks/build/{teams-2kz3CusY.mjs → teams-MEDLZdMn.mjs} +38 -34
  102. package/.output/server/chunks/build/teams-MEDLZdMn.mjs.map +1 -0
  103. package/.output/server/chunks/build/{tokens-BbWLqtVz.mjs → tokens-C7fTM5C2.mjs} +14 -14
  104. package/.output/server/chunks/build/{tokens-BbWLqtVz.mjs.map → tokens-C7fTM5C2.mjs.map} +1 -1
  105. package/.output/server/chunks/build/{town-BOl6hs9B.mjs → town-qMPql9Se.mjs} +36 -10
  106. package/.output/server/chunks/build/town-qMPql9Se.mjs.map +1 -0
  107. package/.output/server/chunks/build/useDaqStream-CIBaiGAl.mjs +1 -1
  108. package/.output/server/chunks/build/useDcwStream-CBbiYnWe.mjs +1 -1
  109. package/.output/server/chunks/build/useResponsive-BKDMGTHs.mjs +49 -0
  110. package/.output/server/chunks/build/useResponsive-BKDMGTHs.mjs.map +1 -0
  111. package/.output/server/chunks/build/{users-fohSmF-J.mjs → users-Cfd5-l2-.mjs} +6 -6
  112. package/.output/server/chunks/build/{users-fohSmF-J.mjs.map → users-Cfd5-l2-.mjs.map} +1 -1
  113. package/.output/server/chunks/build/{workshop-DX5-ldc4.mjs → workshop-BL5bhfs0.mjs} +15 -15
  114. package/.output/server/chunks/build/{workshop-DX5-ldc4.mjs.map → workshop-BL5bhfs0.mjs.map} +1 -1
  115. package/.output/server/chunks/build/{workspaces-BuydxM-3.mjs → workspaces-Bgz5Ekwp.mjs} +18 -3
  116. package/.output/server/chunks/build/workspaces-Bgz5Ekwp.mjs.map +1 -0
  117. package/.output/server/chunks/routes/api/system/config-groups/_id_.patch.mjs.map +1 -1
  118. package/.output/server/chunks/routes/api/system/index.patch.mjs.map +1 -1
  119. package/.output/server/chunks/routes/api/system/index.post.mjs.map +1 -1
  120. package/.output/server/chunks/routes/api/system/settings/events.get.mjs.map +1 -1
  121. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs +6 -2
  122. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs.map +1 -1
  123. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs +2 -1
  124. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs.map +1 -1
  125. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +1 -1
  126. package/.output/server/chunks/routes/api/workshop/channels.post.mjs +3 -3
  127. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs.map +1 -1
  128. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs.map +1 -1
  129. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs.map +1 -1
  130. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +3 -2
  131. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs.map +1 -1
  132. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +2 -1
  133. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs.map +1 -1
  134. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +8 -6
  135. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs.map +1 -1
  136. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +5 -5
  137. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs.map +1 -1
  138. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +14 -4
  139. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs.map +1 -1
  140. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +4 -4
  141. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs.map +1 -1
  142. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +4 -3
  143. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs.map +1 -1
  144. package/.output/server/chunks/routes/api/workshop/dcw/index5.post.mjs +31 -0
  145. package/.output/server/chunks/routes/api/workshop/dcw/index5.post.mjs.map +1 -0
  146. package/.output/server/chunks/routes/api/workshop/dcw/index6.get.mjs +28 -0
  147. package/.output/server/chunks/routes/api/workshop/dcw/index6.get.mjs.map +1 -0
  148. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs.map +1 -1
  149. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/read.post.mjs +32 -0
  150. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/read.post.mjs.map +1 -0
  151. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/write.post.mjs +34 -0
  152. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/write.post.mjs.map +1 -0
  153. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.delete.mjs +33 -0
  154. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.delete.mjs.map +1 -0
  155. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.patch.mjs +34 -0
  156. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.patch.mjs.map +1 -0
  157. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +1 -1
  158. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +1 -1
  159. package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs +1 -1
  160. package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs +1 -1
  161. package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs +1 -1
  162. package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs +1 -1
  163. package/.output/server/chunks/routes/api/workshop/index.put.mjs +1 -1
  164. package/.output/server/chunks/routes/api/workshop/index6.get.mjs +2 -0
  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 +53 -25
  175. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  176. package/.output/server/package.json +1 -1
  177. package/README-zh.md +204 -40
  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 -24
  182. package/app/components/AppSidebar.vue +118 -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/useDcwStream.ts +1 -1
  206. package/app/composables/workshop/useVisibleInterval.ts +2 -2
  207. package/app/composables/workshop/useWorkshopApi.ts +1 -1
  208. package/app/layouts/default.vue +46 -2
  209. package/app/pages/aml/index.vue +712 -616
  210. package/app/pages/daq/[id].vue +3 -2
  211. package/app/pages/daq/index.vue +209 -9
  212. package/app/pages/dcw/[id].vue +109 -28
  213. package/app/pages/dcw/index.vue +83 -23
  214. package/app/pages/index.vue +35 -1
  215. package/app/pages/logs/index.vue +147 -13
  216. package/app/pages/monitor.vue +56 -12
  217. package/app/pages/permissions/index.vue +34 -0
  218. package/app/pages/plugins/index.vue +35 -4
  219. package/app/pages/settings.vue +90 -21
  220. package/app/pages/tokens.vue +23 -0
  221. package/app/pages/town.vue +50 -5
  222. package/app/pages/users.vue +23 -0
  223. package/app/pages/workshop/agents.vue +92 -2
  224. package/app/pages/workshop/channel-templates.vue +53 -0
  225. package/app/pages/workshop/index.vue +14 -0
  226. package/app/pages/workshop/teams.vue +66 -6
  227. package/app/pages/workshop/w/[wsId].vue +202 -14
  228. package/app/plugins/aw-plugins.client.ts +13 -8
  229. package/app/stores/app.ts +33 -1
  230. package/app/stores/workshop/user.ts +1 -1
  231. package/app/stores/workshop/workspaces.ts +18 -2
  232. package/app/utils/api-error.ts +1 -1
  233. package/cli/commands/build.mjs +8 -1
  234. package/docker-compose.yml +6 -0
  235. package/docs/full-test-plan.md +4 -0
  236. package/docs/plugins.en.md +1 -0
  237. package/docs/plugins.md +1 -0
  238. package/i18n/locales/en.ts +3 -0
  239. package/i18n/locales/zh-CN.ts +3 -0
  240. package/nuxt.config.ts +31 -0
  241. package/package.json +9 -1
  242. package/scripts/_audit/detached-start.mjs +103 -0
  243. package/scripts/_audit/guard-upstream-liveness.mjs +104 -0
  244. package/scripts/_dbg-param-map-e2e.ts +242 -0
  245. package/scripts/_dbg-param-map-rest-smoke.mjs +73 -0
  246. package/scripts/_dbg-param-real-scenario.mjs +153 -0
  247. package/scripts/_dbg-perms-e2e.mjs +10 -3
  248. package/scripts/_dbg-protocol-matrix.mjs +453 -441
  249. package/scripts/_dbg-render-regression.mjs +151 -130
  250. package/scripts/_dbg-town-agents-probe.mjs +60 -0
  251. package/scripts/_dbg-visual-acceptance.mjs +63 -0
  252. package/scripts/api-live-e2e.mjs +40 -8
  253. package/scripts/capture-walkthrough.mjs +232 -0
  254. package/scripts/e2e-agent-team.mjs +5 -3
  255. package/scripts/render-walkthrough-figure.mjs +46 -0
  256. package/scripts/seed-walkthrough-fixture.mjs +143 -0
  257. package/scripts/test-plugin-hardening.mjs +8 -0
  258. package/scripts/three-system-e2e.mjs +6 -6
  259. package/scripts/ui/admin-shots.mjs +46 -0
  260. package/scripts/ui/audit-layout.mjs +301 -0
  261. package/scripts/ui/bump-microfont.mjs +39 -0
  262. package/scripts/ui/lib.mjs +198 -0
  263. package/scripts/ui/linkcheck2.mjs +37 -0
  264. package/scripts/ui/live-render-check.mjs +72 -0
  265. package/scripts/ui/md-lint.mjs +80 -0
  266. package/scripts/ui/perf-audit.mjs +132 -0
  267. package/scripts/ui/readme-assets.mjs +30 -0
  268. package/scripts/ui/readme-shots.mjs +42 -0
  269. package/scripts/ui/record.mjs +225 -0
  270. package/scripts/ui/seed-admin.mjs +68 -0
  271. package/scripts/ui/seed-demo.mjs +83 -0
  272. package/scripts/ui/shot-hero.mjs +25 -0
  273. package/scripts/ui/shots.mjs +75 -0
  274. package/scripts/ui/sim-ui-shot.mjs +16 -0
  275. package/scripts/ui/verify-nav.mjs +51 -0
  276. package/scripts/ui/verify-responsive.mjs +285 -0
  277. package/server/api/system/config-groups/[id].patch.ts +1 -1
  278. package/server/api/system/config-groups/index.post.ts +1 -1
  279. package/server/api/system/settings/events.get.ts +1 -1
  280. package/server/api/system/settings/index.patch.ts +1 -1
  281. package/server/api/workshop/agent-tools/invoke.post.ts +16 -2
  282. package/server/api/workshop/aml/datasets/[id].get.ts +8 -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 +2 -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 +14 -3
  299. package/server/plugins/dev-stability-guard.ts +3 -1
  300. package/server/plugins/system-config.ts +6 -1
  301. package/server/plugins-builtin/rag-bridge/index.mjs +9 -2
  302. package/server/services/system-config.ts +28 -9
  303. package/server/services/workshop/agents/adapters/one-shot-cli-agent.ts +2 -1
  304. package/server/services/workshop/agents/agent-interface.ts +8 -6
  305. package/server/services/workshop/agents/base-agent.ts +18 -4
  306. package/server/services/workshop/agents/claude-agent.ts +7 -3
  307. package/server/services/workshop/agents/codex-agent.ts +3 -3
  308. package/server/services/workshop/agents/dsh-agent.ts +3 -3
  309. package/server/services/workshop/agents/goose-agent.ts +0 -1
  310. package/server/services/workshop/agents/harness-terminal.ts +14 -1
  311. package/server/services/workshop/agents/hermes-agent.ts +4 -2
  312. package/server/services/workshop/agents/host-tool-bridge.ts +5 -1
  313. package/server/services/workshop/agents/industrial-context.ts +4 -1
  314. package/server/services/workshop/agents/industrial-tools.ts +164 -6
  315. package/server/services/workshop/agents/omp-agent.ts +15 -9
  316. package/server/services/workshop/agents/opencode-agent.ts +47 -21
  317. package/server/services/workshop/agents/qwen-agent.ts +10 -5
  318. package/server/services/workshop/aml/entity.ts +3 -1
  319. package/server/services/workshop/aml/python-runtime.ts +3 -2
  320. package/server/services/workshop/daq/bus/mqtt.adapter.ts +8 -4
  321. package/server/services/workshop/daq/daq-controller.ts +18 -3
  322. package/server/services/workshop/daq/daq-runtime.ts +5 -3
  323. package/server/services/workshop/daq/drivers.ts +63 -8
  324. package/server/services/workshop/daq/host-ports.ts +3 -2
  325. package/server/services/workshop/daq/storage/timescale.adapter.ts +3 -1
  326. package/server/services/workshop/db/channel.repo.ts +4 -0
  327. package/server/services/workshop/db/ops.repo.ts +5 -2
  328. package/server/services/workshop/db/retention.ts +8 -3
  329. package/server/services/workshop/dcw/dcw-controller.ts +143 -16
  330. package/server/services/workshop/dcw/dcw-product.repo.ts +38 -1
  331. package/server/services/workshop/dcw/dcw-runtime.ts +3 -2
  332. package/server/services/workshop/dcw/drivers.ts +5 -2
  333. package/server/services/workshop/dcw/param-conversion.ts +78 -0
  334. package/server/services/workshop/dcw/param-limits.ts +142 -0
  335. package/server/services/workshop/dcw/param-map.repo.ts +305 -0
  336. package/server/services/workshop/dcw/recipe-rollback-manager.ts +13 -7
  337. package/server/services/workshop/runtime/agent-runtime.ts +4 -0
  338. package/server/services/workshop/runtime/manager.ts +9 -2
  339. package/server/services/workshop/settings.ts +4 -2
  340. package/server/types/pg.d.ts +49 -0
  341. package/server/utils/stability-severity.ts +13 -2
  342. package/shared/config/groups.mjs +22 -1
  343. package/shared/config/home.d.mts +28 -0
  344. package/shared/dcw-protocol.ts +136 -0
  345. package/uno.config.ts +12 -1
  346. package/.output/public/_nuxt/BFkgkW8u.js +0 -4
  347. package/.output/public/_nuxt/C5gUkRwn.js +0 -1
  348. package/.output/public/_nuxt/CM12FuB42.js +0 -1
  349. package/.output/public/_nuxt/CZiw7sEV.js +0 -1
  350. package/.output/public/_nuxt/Cc_9VzD42.js +0 -1
  351. package/.output/public/_nuxt/CdPzkOMV.js +0 -1
  352. package/.output/public/_nuxt/D1YDxZpZ.js +0 -1
  353. package/.output/public/_nuxt/D20Yamr4.js +0 -1
  354. package/.output/public/_nuxt/DVsjtsvZ2.js +0 -1
  355. package/.output/public/_nuxt/DmqknNvV.js +0 -18
  356. package/.output/public/_nuxt/DnUuIR83.js +0 -1
  357. package/.output/public/_nuxt/S_fVQwJK.js +0 -1
  358. package/.output/public/_nuxt/TownView.0oLiQgTC.css +0 -1
  359. package/.output/public/_nuxt/_id_.D-SYuyZb.css +0 -1
  360. package/.output/public/_nuxt/_id_.hma_BU6T.css +0 -1
  361. package/.output/public/_nuxt/_wsId_.B12v3PhY.css +0 -1
  362. package/.output/public/_nuxt/agents.BV70ioCv.css +0 -1
  363. package/.output/public/_nuxt/ahgEJu2R.js +0 -1
  364. package/.output/public/_nuxt/aml.COEKNNqK.css +0 -1
  365. package/.output/public/_nuxt/builds/meta/44b66249-54d0-4c8a-9057-9755a32329e2.json +0 -1
  366. package/.output/public/_nuxt/channel-templates.C-M5nKcC.css +0 -1
  367. package/.output/public/_nuxt/daq.B3265ZDn.css +0 -1
  368. package/.output/public/_nuxt/dcw.DLYZqEhT.css +0 -1
  369. package/.output/public/_nuxt/default.DE_vT238.css +0 -1
  370. package/.output/public/_nuxt/entry.BB-Eeh-J.css +0 -1
  371. package/.output/public/_nuxt/logs.CqFyMrJw.css +0 -1
  372. package/.output/public/_nuxt/monitor.B--1dPzs.css +0 -1
  373. package/.output/public/_nuxt/pages.ooEzrMm9.css +0 -1
  374. package/.output/public/_nuxt/permissions.B1pjGChZ.css +0 -1
  375. package/.output/public/_nuxt/plugins.5e5chZ67.css +0 -1
  376. package/.output/public/_nuxt/pz2JDAM7.js +0 -2
  377. package/.output/public/_nuxt/settings.Dm3M0RLy.css +0 -1
  378. package/.output/public/_nuxt/teams.BC75EGnR.css +0 -1
  379. package/.output/public/_nuxt/tokens.xRb1fSPU.css +0 -1
  380. package/.output/public/_nuxt/users.CXnP2E08.css +0 -1
  381. package/.output/public/_nuxt/workshop.Jk5HxWPE.css +0 -1
  382. package/.output/server/chunks/build/TownView-jVazYOjN.mjs.map +0 -1
  383. package/.output/server/chunks/build/_id_-Hwr4rZpr.mjs.map +0 -1
  384. package/.output/server/chunks/build/agents-Bvin73QY.mjs.map +0 -1
  385. package/.output/server/chunks/build/daq-C03Uu5UE.mjs.map +0 -1
  386. package/.output/server/chunks/build/pages-BO7yZsXA.mjs.map +0 -1
  387. package/.output/server/chunks/build/settings-DoQ2Oq3P.mjs.map +0 -1
  388. package/.output/server/chunks/build/teams-2kz3CusY.mjs.map +0 -1
  389. package/.output/server/chunks/build/town-BOl6hs9B.mjs.map +0 -1
  390. package/.output/server/chunks/build/workspaces-BuydxM-3.mjs.map +0 -1
  391. /package/.output/public/_nuxt/{36oeS8_R2.js → 36oeS8_R.js} +0 -0
  392. /package/.output/public/_nuxt/{CYWVXZTS.js → CYWVXZTS2.js} +0 -0
@@ -0,0 +1,33 @@
1
+ <script setup lang="ts">
2
+ /**
3
+ * 数采/智控模板图标 —— 全项目唯一的 SVG 片段注入口。
4
+ *
5
+ * 为什么这里必须用 v-html:DAQ_ICONS 的值是 SVG **绘制片段**(path/circle/rect),
6
+ * 必须按 SVG 命名空间解析成图元,文本插值只会把它们画成字面文本。
7
+ * 为什么是安全的:DAO_ICONS 是编译期静态字面量表 —— 键来自 #shared 协议的图标枚举,
8
+ * 值全部是本文件里手写的字符串,不含用户输入、不含 <script>/on* 事件属性/外部引用。
9
+ * 收敛收益:TownView 原先有 6 处 v-html(各自重复同样的判断),现在只此一处。
10
+ */
11
+ const props = defineProps<{ icon: string }>()
12
+
13
+ /** 数采模板图标(设计稿 ICONS;SVG path 直嵌) */
14
+ const DAQ_ICONS: Record<string, string> = {
15
+ thermo: '<path d="M10 4a2 2 0 0 1 4 0v9a4 4 0 1 1-4 0V4Z"/><circle cx="12" cy="16.5" r="1.6"/>',
16
+ pressure: '<circle cx="12" cy="12" r="8"/><path d="m12 12 3.5-3.5"/><circle cx="12" cy="12" r="1.2"/>',
17
+ tension: '<circle cx="12" cy="10" r="4"/><path d="M4 18.5h16M8 18.5V14M16 18.5V14"/><path d="M2.5 10H8M16 10h5.5"/>',
18
+ encoder: '<circle cx="12" cy="12" r="8"/><circle cx="12" cy="12" r="2"/><path d="M12 4v3M12 17v3M4 12h3M17 12h3"/>',
19
+ camera: '<rect x="3" y="7" width="13" height="10" rx="2"/><path d="m16 11 5-3v8l-5-3"/><circle cx="8" cy="12" r="2.5"/>',
20
+ gateway: '<rect x="8" y="11" width="8" height="10" rx="1.5"/><circle cx="12" cy="5.5" r="1.5"/><path d="M12 10V7M8.5 8.5a5 5 0 0 1 7 0M6 6a8.5 8.5 0 0 1 12 0"/>',
21
+ }
22
+
23
+ const markup = computed(() => DAQ_ICONS[props.icon] ?? DAQ_ICONS.gateway!)
24
+ </script>
25
+
26
+ <template>
27
+ <!-- eslint-disable vue/no-v-html -- DAQ_ICONS 是编译期静态 SVG 绘制片段(见 script 顶部),不含任何用户输入 -->
28
+ <svg
29
+ viewBox="0 0 24 24"
30
+ v-html="markup"
31
+ />
32
+ <!-- eslint-enable vue/no-v-html -->
33
+ </template>
@@ -164,56 +164,56 @@ function doDcwWrite(r: DcwLiveRow): void {
164
164
  class="twin-list"
165
165
  >
166
166
  <button
167
- v-for="t in twins.twins"
168
- :key="t.id"
167
+ v-for="tw in twins.twins"
168
+ :key="tw.id"
169
169
  class="twin-card"
170
- :class="{ daq: isDaq(t) }"
170
+ :class="{ daq: isDaq(tw) }"
171
171
  type="button"
172
- @click="$emit('focus-device', t)"
172
+ @click="$emit('focus-device', tw)"
173
173
  >
174
174
  <div class="twin-row">
175
- <span class="twin-model-tag">{{ modelTag(t.modelRef || t.name) }}</span>
175
+ <span class="twin-model-tag">{{ modelTag(tw.modelRef || tw.name) }}</span>
176
176
  <div class="twin-idbar">
177
- <span class="twin-name">{{ t.name }}</span>
178
- <span class="twin-code">{{ isDaq(t) ? 'DAQ' : devNo(t.id) }}</span>
177
+ <span class="twin-name">{{ tw.name }}</span>
178
+ <span class="twin-code">{{ isDaq(tw) ? 'DAQ' : devNo(tw.id) }}</span>
179
179
  </div>
180
180
  <button
181
181
  class="twin-del"
182
- :class="{ armed: armedId === t.id }"
183
- :disabled="busyId === t.id"
184
- :title="armedId === t.id ? '再次点击确认删除该设备实例' : '删除该设备实例'"
185
- @click.stop="removeTwin(t)"
182
+ :class="{ armed: armedId === tw.id }"
183
+ :disabled="busyId === tw.id"
184
+ :title="armedId === tw.id ? '再次点击确认删除该设备实例' : '删除该设备实例'"
185
+ @click.stop="removeTwin(tw)"
186
186
  >
187
- {{ armedId === t.id ? $t('deviceTwinPanel.k44653007') : '✕' }}
187
+ {{ armedId === tw.id ? $t('deviceTwinPanel.k44653007') : '✕' }}
188
188
  </button>
189
189
  <span
190
190
  class="twin-state"
191
- :class="`s-${t.state}`"
191
+ :class="`s-${tw.state}`"
192
192
  >
193
193
  <i
194
194
  class="twin-state-dot"
195
- :style="{ background: stateColor[t.state] || 'var(--hud-dim)' }"
195
+ :style="{ background: stateColor[tw.state] || 'var(--hud-dim)' }"
196
196
  />
197
- {{ stateLabel[t.state] || t.state }}
197
+ {{ stateLabel[tw.state] || tw.state }}
198
198
  </span>
199
199
  </div>
200
200
  <div
201
- v-if="Object.keys(t.telemetry).length"
201
+ v-if="Object.keys(tw.telemetry).length"
202
202
  class="twin-tele"
203
203
  >
204
204
  <span
205
- v-for="(v, k) in t.telemetry"
205
+ v-for="(v, k) in tw.telemetry"
206
206
  :key="k"
207
207
  class="tele-item"
208
208
  ><em>{{ k }}</em><b>{{ fmt(v) }}</b></span>
209
209
  </div>
210
210
  <!-- 实时数采(绿色;数采节点 = 自身通道,设备 = 绑定通道) -->
211
211
  <div
212
- v-if="daqLive?.[t.id]?.length"
212
+ v-if="daqLive?.[tw.id]?.length"
213
213
  class="twin-daq"
214
214
  >
215
215
  <span
216
- v-for="(d, i) in daqLive[t.id]"
216
+ v-for="(d, i) in daqLive[tw.id]"
217
217
  :key="`${d.ch}-${i}`"
218
218
  class="daq-item"
219
219
  :class="{ alarm: d.alarm }"
@@ -224,11 +224,11 @@ function doDcwWrite(r: DcwLiveRow): void {
224
224
  </div>
225
225
  <!-- 智控设定(绑定通道的当前 set 值展示 + 生效上下限 + 窗口内直写下发) -->
226
226
  <div
227
- v-if="dcwLive?.[t.id]?.length"
227
+ v-if="dcwLive?.[tw.id]?.length"
228
228
  class="twin-dcw"
229
229
  >
230
230
  <div
231
- v-for="r in dcwLive[t.id]"
231
+ v-for="r in dcwLive[tw.id]"
232
232
  :key="r.id"
233
233
  class="dcw-item"
234
234
  >
@@ -400,7 +400,9 @@ function doDcwWrite(r: DcwLiveRow): void {
400
400
  flex: none;
401
401
  min-width: 30px;
402
402
  font-family: var(--font-mono);
403
- font-size: 9px;
403
+ /* 9px 的 mono 铭牌在 1440 下也读不动(实测每屏稳定被判为不可读);
404
+ 10px 是孪生侧栏这套 HUD 在桌面档的地板。 */
405
+ font-size: 10px;
404
406
  font-weight: 600;
405
407
  letter-spacing: 0.08em;
406
408
  color: var(--hud-faint);
@@ -416,7 +418,7 @@ function doDcwWrite(r: DcwLiveRow): void {
416
418
  }
417
419
  .twin-code {
418
420
  font-family: var(--font-mono);
419
- font-size: 9px;
421
+ font-size: 10px;
420
422
  letter-spacing: 0.08em;
421
423
  color: var(--hud-dim);
422
424
  }
@@ -425,7 +427,7 @@ function doDcwWrite(r: DcwLiveRow): void {
425
427
  width: 18px;
426
428
  height: 18px;
427
429
  font-family: var(--font-mono);
428
- font-size: 9px;
430
+ font-size: 10px;
429
431
  line-height: 1;
430
432
  color: var(--hud-dim, #8496a5);
431
433
  background: transparent;
@@ -452,7 +454,7 @@ function doDcwWrite(r: DcwLiveRow): void {
452
454
  gap: 5px;
453
455
  align-items: center;
454
456
  font-family: var(--font-mono);
455
- font-size: 8.5px;
457
+ font-size: 10px;
456
458
  letter-spacing: 0.08em;
457
459
  color: var(--hud-dim);
458
460
  padding: 2px 5px;
@@ -510,7 +512,7 @@ function doDcwWrite(r: DcwLiveRow): void {
510
512
  opacity: 0.85;
511
513
  }
512
514
  .daq-item b { font-weight: 700; font-size: 10.5px; white-space: nowrap; }
513
- .daq-item b i { font-style: normal; font-size: 8.5px; font-weight: 500; margin-left: 2px; opacity: 0.75; }
515
+ .daq-item b i { font-style: normal; font-size: 10px; font-weight: 500; margin-left: 2px; opacity: 0.75; }
514
516
  .daq-item.alarm { color: var(--hud-amber, #f6c453); }
515
517
  /* 智控设定区(每通道:set 值 + 上下限 + 窗口内直写) */
516
518
  .twin-dcw {
@@ -539,7 +541,7 @@ function doDcwWrite(r: DcwLiveRow): void {
539
541
  }
540
542
  .dcw-src {
541
543
  font-style: normal;
542
- font-size: 8px;
544
+ font-size: 10px;
543
545
  padding: 0 3px;
544
546
  margin-left: 4px;
545
547
  color: var(--hud-amber, #f6c453);
@@ -555,7 +557,7 @@ function doDcwWrite(r: DcwLiveRow): void {
555
557
  }
556
558
  .dcw-set i {
557
559
  font-style: normal;
558
- font-size: 8.5px;
560
+ font-size: 10px;
559
561
  font-weight: 500;
560
562
  margin-left: 2px;
561
563
  opacity: 0.75;
@@ -566,10 +568,10 @@ function doDcwWrite(r: DcwLiveRow): void {
566
568
  align-items: baseline;
567
569
  gap: 6px;
568
570
  font-family: var(--font-mono);
569
- font-size: 9px;
571
+ font-size: 10px;
570
572
  color: var(--hud-dim);
571
573
  }
572
- .dcw-act em { font-style: normal; font-size: 8px; letter-spacing: 0.08em; color: var(--hud-faint); }
574
+ .dcw-act em { font-style: normal; font-size: 10px; letter-spacing: 0.08em; color: var(--hud-faint); }
573
575
  .dcw-act b {
574
576
  font-size: 11.5px;
575
577
  font-weight: 700;
@@ -577,11 +579,11 @@ function doDcwWrite(r: DcwLiveRow): void {
577
579
  color: var(--hud-accent, #35e0a0);
578
580
  white-space: nowrap;
579
581
  }
580
- .dcw-act b i { font-style: normal; font-size: 8.5px; font-weight: 500; margin-left: 2px; opacity: 0.75; }
581
- .dcw-act-at { font-style: normal; font-size: 8px; color: var(--hud-faint); }
582
+ .dcw-act b i { font-style: normal; font-size: 10px; font-weight: 500; margin-left: 2px; opacity: 0.75; }
583
+ .dcw-act-at { font-style: normal; font-size: 10px; color: var(--hud-faint); }
582
584
  .dcw-win {
583
585
  font-family: var(--font-mono);
584
- font-size: 8.5px;
586
+ font-size: 10px;
585
587
  font-variant-numeric: tabular-nums;
586
588
  color: var(--hud-faint);
587
589
  letter-spacing: 0.04em;
@@ -604,12 +606,12 @@ function doDcwWrite(r: DcwLiveRow): void {
604
606
  }
605
607
  .dcw-err {
606
608
  font-family: var(--font-mono);
607
- font-size: 8.5px;
609
+ font-size: 10px;
608
610
  color: var(--hud-danger, #ff6b5c);
609
611
  }
610
612
  .ctrl-btn {
611
613
  padding: 3px 7px;
612
- font-size: 9px;
614
+ font-size: 10px;
613
615
  letter-spacing: 0.06em;
614
616
  font-weight: 600;
615
617
  font-family: var(--font-mono);
@@ -343,7 +343,7 @@ const quoteToComposer = (): void => {
343
343
  gap: 3px;
344
344
  align-items: center;
345
345
  padding: 0 5px;
346
- font-size: 9px;
346
+ font-size: 10px;
347
347
  color: var(--tone-warning-dot);
348
348
  background: color-mix(in srgb, var(--tone-warning-dot) 13%, transparent);
349
349
  border-radius: var(--radius-chip);
@@ -480,7 +480,7 @@ const quoteToComposer = (): void => {
480
480
  align-items: center;
481
481
  padding: 0 2px;
482
482
  font-family: var(--font-mono);
483
- font-size: 9px;
483
+ font-size: 10px;
484
484
  letter-spacing: 0.06em;
485
485
  line-height: 14px;
486
486
  color: var(--ink-faint);
@@ -523,7 +523,7 @@ const quoteToComposer = (): void => {
523
523
  z-index: 2;
524
524
  padding: 0 5px;
525
525
  font-family: var(--font-mono);
526
- font-size: 9px;
526
+ font-size: 10px;
527
527
  font-variant-numeric: tabular-nums;
528
528
  color: var(--ink-faint);
529
529
  pointer-events: none;
@@ -126,26 +126,26 @@ const stateDot: Record<string, string> = {
126
126
  tab="任务"
127
127
  >
128
128
  <div
129
- v-for="t in rootTasks"
130
- :key="t.id"
129
+ v-for="task in rootTasks"
130
+ :key="task.id"
131
131
  class="task aw-tile"
132
132
  role="button"
133
133
  tabindex="0"
134
- @click="emit('openTask', t.id)"
135
- @keydown.enter="emit('openTask', t.id)"
134
+ @click="emit('openTask', task.id)"
135
+ @keydown.enter="emit('openTask', task.id)"
136
136
  >
137
137
  <div class="task-head">
138
- <span class="state-chip aw-mono">{{ t.state }}</span>
139
- <span class="task-title">{{ t.title }}</span>
138
+ <span class="state-chip aw-mono">{{ task.state }}</span>
139
+ <span class="task-title">{{ task.title }}</span>
140
140
  </div>
141
141
  <div class="task-meta">
142
- {{ t.id.slice(0, 8) }} · {{ t.progress }}%
143
- <span v-if="childCount(t.id)">· {{ $t('inspectorPanel.k3mp44x003') }} {{ childCount(t.id) }}</span>
144
- <span v-if="t.artifacts">· {{ $t('inspectorPanel.k3w9q9004') }} {{ t.artifacts }}</span>
142
+ {{ task.id.slice(0, 8) }} · {{ task.progress }}%
143
+ <span v-if="childCount(task.id)">· {{ $t('inspectorPanel.k3mp44x003') }} {{ childCount(task.id) }}</span>
144
+ <span v-if="task.artifacts">· {{ $t('inspectorPanel.k3w9q9004') }} {{ task.artifacts }}</span>
145
145
  </div>
146
146
  <a-progress
147
- v-if="t.state === 'WORKING'"
148
- :percent="t.progress"
147
+ v-if="task.state === 'WORKING'"
148
+ :percent="task.progress"
149
149
  size="small"
150
150
  :show-info="false"
151
151
  />
@@ -262,4 +262,40 @@ const stateDot: Record<string, string> = {
262
262
  }
263
263
  .task-meta { font-size: 11px; font-family: var(--font-mono); color: var(--ink-faint); }
264
264
  .empty { padding: 16px 8px; font-size: 12px; color: var(--ink-faint); }
265
+
266
+ /* ── 窄屏(≤1023):本面板在窄屏不再是右侧常驻栏,而是切换条上的第 4 区 ──
267
+ 因此要能占满整宽、行高够手指点、铭牌字号抬到可读。 */
268
+ @media (max-width: 1023.98px) {
269
+ .inspector {
270
+ width: 100%;
271
+ padding: 0 10px;
272
+ }
273
+
274
+ .tabs :deep(.ant-tabs-tab) {
275
+ min-height: 44px;
276
+ }
277
+
278
+ .member,
279
+ .task {
280
+ padding: 10px;
281
+ min-height: 44px;
282
+ }
283
+
284
+ .member-meta,
285
+ .task-meta,
286
+ .member-cap,
287
+ .role-chip,
288
+ .state-chip {
289
+ font-size: 11.5px;
290
+ }
291
+
292
+ .role-chip,
293
+ .state-chip {
294
+ line-height: 18px;
295
+ }
296
+
297
+ .empty {
298
+ font-size: 13px;
299
+ }
300
+ }
265
301
  </style>
@@ -359,4 +359,38 @@ const open = (a: LiveAgent) => {
359
359
  @media (prefers-reduced-motion: reduce) {
360
360
  .live-pip::after { animation: none; opacity: 0; }
361
361
  }
362
+
363
+ /* ── 窄屏(≤1023):活动条在抽屉/窄列里同样要点得中、读得清 ── */
364
+ @media (max-width: 1023.98px) {
365
+ .live-main {
366
+ min-height: 44px;
367
+ }
368
+
369
+ .live-more {
370
+ min-height: 40px;
371
+ padding: 0 10px;
372
+ font-size: 12px;
373
+ }
374
+
375
+ .idle-text,
376
+ .live-detail,
377
+ .live-pop-detail,
378
+ .live-pop-title {
379
+ font-size: 11.5px;
380
+ }
381
+
382
+ .live-pop-item {
383
+ min-height: 44px;
384
+ }
385
+
386
+ .live-avatar-sm {
387
+ width: 24px;
388
+ height: 24px;
389
+ font-size: 11px;
390
+ }
391
+
392
+ .live-pop {
393
+ max-height: 46dvh;
394
+ }
395
+ }
362
396
  </style>
@@ -131,10 +131,10 @@ const onDrop = async (ev: DragEvent, col: Column) => {
131
131
  const acting = ref(new Set<string>())
132
132
  const applyMove = async (taskId: string, action: 'cancel' | 'retry'): Promise<void> => {
133
133
  if (acting.value.has(taskId)) return
134
- const t = taskById(taskId)
135
- if (!t) return
134
+ const task = taskById(taskId)
135
+ if (!task) return
136
136
  acting.value.add(taskId)
137
- const prev = t.state
137
+ const prev = task.state
138
138
  // 乐观预移:cancel → CANCELED;retry → ASSIGNED
139
139
  const next = action === 'cancel' ? 'CANCELED' : 'ASSIGNED'
140
140
  const opt = new Map(optimistic.value)
@@ -165,22 +165,22 @@ const applyMove = async (taskId: string, action: 'cancel' | 'retry'): Promise<vo
165
165
 
166
166
  /** 状态胶囊菜单(动作 + 详情);fixed 定位并按视口收敛 */
167
167
  const menu = ref<{ task: TaskView, x: number, y: number } | null>(null)
168
- const openMenu = (ev: MouseEvent, t: TaskView) => {
168
+ const openMenu = (ev: MouseEvent, task: TaskView) => {
169
169
  const x = Math.min(ev.clientX, Math.max(window.innerWidth - 156, 8))
170
170
  const y = Math.min(ev.clientY, Math.max(window.innerHeight - 160, 8))
171
- menu.value = { task: t, x, y }
171
+ menu.value = { task, x, y }
172
172
  }
173
173
  const closeMenu = () => {
174
174
  menu.value = null
175
175
  }
176
176
  const menuActions = computed(() => {
177
- const t = menu.value?.task
178
- if (!t) return []
177
+ const task = menu.value?.task
178
+ if (!task) return []
179
179
  const acts: Array<{ key: 'cancel' | 'retry' | 'detail', label: string, danger?: boolean }> = []
180
- if (['SUBMITTED', 'ASSIGNED', 'WORKING', 'WAITING', 'FAILED'].includes(t.state)) {
180
+ if (['SUBMITTED', 'ASSIGNED', 'WORKING', 'WAITING', 'FAILED'].includes(task.state)) {
181
181
  acts.push({ key: 'cancel', label: t('taskBoardView.k1bs0t9b016'), danger: true })
182
182
  }
183
- if (['FAILED', 'CANCELED'].includes(t.state)) {
183
+ if (['FAILED', 'CANCELED'].includes(task.state)) {
184
184
  acts.push({ key: 'retry', label: t('taskBoardView.k1lclwk6017') })
185
185
  }
186
186
  acts.push({ key: 'detail', label: t('taskBoardView.k1dx9ysj018') })
@@ -260,39 +260,39 @@ const onMenuAction = async (key: 'cancel' | 'retry' | 'detail') => {
260
260
  </div>
261
261
  <div class="task-col-body">
262
262
  <div
263
- v-for="t in col.items"
264
- :key="t.id"
263
+ v-for="task in col.items"
264
+ :key="task.id"
265
265
  class="card task"
266
- :class="{ dragging: dragId === t.id }"
266
+ :class="{ dragging: dragId === task.id }"
267
267
  draggable="true"
268
- @dragstart="onDragStart($event, t, col.key)"
268
+ @dragstart="onDragStart($event, task, col.key)"
269
269
  @dragend="onDragEnd"
270
- @click="emit('openTask', t.id)"
270
+ @click="emit('openTask', task.id)"
271
271
  >
272
272
  <div class="tk-chan">
273
- <span>#{{ agentName(t.assigneeId) }}</span>
273
+ <span>#{{ agentName(task.assigneeId) }}</span>
274
274
  <span
275
- v-if="childCount(t.id)"
275
+ v-if="childCount(task.id)"
276
276
  class="tk-num"
277
- >{{ $t('taskBoardView.k4b1x005') }} {{ childCount(t.id) }}</span>
277
+ >{{ $t('taskBoardView.k4b1x005') }} {{ childCount(task.id) }}</span>
278
278
  <span
279
- v-if="t.artifacts"
279
+ v-if="task.artifacts"
280
280
  class="tk-num"
281
- ><span class="i-tabler-package" /> {{ t.artifacts }}</span>
281
+ ><span class="i-tabler-package" /> {{ task.artifacts }}</span>
282
282
  </div>
283
283
  <div class="tk-title">
284
- {{ t.title }}
284
+ {{ task.title }}
285
285
  </div>
286
286
  <div
287
- v-if="t.routeReason"
287
+ v-if="task.routeReason"
288
288
  class="tk-route"
289
- :title="$t('taskBoardView.k8m7hm6020', { p0: t.routeReason })"
289
+ :title="$t('taskBoardView.k8m7hm6020', { p0: task.routeReason })"
290
290
  >
291
- ↳ {{ t.routeReason }}
291
+ ↳ {{ task.routeReason }}
292
292
  </div>
293
293
  <a-progress
294
- v-if="t.state === 'WORKING' && t.progress > 0"
295
- :percent="t.progress"
294
+ v-if="task.state === 'WORKING' && task.progress > 0"
295
+ :percent="task.progress"
296
296
  size="small"
297
297
  :show-info="false"
298
298
  />
@@ -300,7 +300,7 @@ const onMenuAction = async (key: 'cancel' | 'retry' | 'detail') => {
300
300
  <button
301
301
  type="button"
302
302
  class="st-pill-btn"
303
- @click.stop="openMenu($event, t)"
303
+ @click.stop="openMenu($event, task)"
304
304
  >
305
305
  <span
306
306
  class="st-pill"
@@ -340,19 +340,19 @@ const onMenuAction = async (key: 'cancel' | 'retry' | 'detail') => {
340
340
  <span class="sec-cnt">{{ col.items.length }}</span>
341
341
  </div>
342
342
  <div
343
- v-for="t in col.items"
344
- :key="t.id"
343
+ v-for="task in col.items"
344
+ :key="task.id"
345
345
  class="list-row"
346
- @click="emit('openTask', t.id)"
346
+ @click="emit('openTask', task.id)"
347
347
  >
348
- <span class="grow">{{ t.title }}</span>
349
- <span class="lnum">#{{ agentName(t.assigneeId) }}</span>
350
- <span class="meta">{{ t.id.slice(0, 8) }}</span>
348
+ <span class="grow">{{ task.title }}</span>
349
+ <span class="lnum">#{{ agentName(task.assigneeId) }}</span>
350
+ <span class="meta">{{ task.id.slice(0, 8) }}</span>
351
351
  <span
352
352
  class="st-pill"
353
353
  :style="{ color: col.dot, borderColor: col.dot }"
354
354
  >
355
- {{ stateOf(t) }}
355
+ {{ stateOf(task) }}
356
356
  </span>
357
357
  </div>
358
358
  </template>
@@ -633,4 +633,54 @@ const onMenuAction = async (key: 'cancel' | 'retry' | 'detail') => {
633
633
  }
634
634
  .st-menu button:hover { background: var(--paper-deep); color: var(--ink); }
635
635
  .st-menu button.danger { color: var(--tone-danger-dot); }
636
+
637
+ /* ── 窄屏(≤1023):看板列从"全高等宽四列"改为"一次一列"的横向卷轴 ──
638
+ 300px 定宽列在 390px 下只能露出半列 + 半列,状态语义读不出来;
639
+ 改为 86% 宽 + scroll-snap:一屏一个状态列。列表视图行允许折行,不竖排。 */
640
+ @media (max-width: 1023.98px) {
641
+ .toolbar {
642
+ flex-wrap: wrap;
643
+ gap: 8px;
644
+ padding: 10px;
645
+ }
646
+
647
+ .count,
648
+ .sec-cnt,
649
+ .tk-route,
650
+ .meta,
651
+ .st-pill {
652
+ font-size: 11.5px;
653
+ }
654
+
655
+ .board {
656
+ padding: 10px;
657
+ scroll-snap-type: x mandatory;
658
+ -webkit-overflow-scrolling: touch;
659
+ }
660
+
661
+ .task-col {
662
+ flex: 0 0 86%;
663
+ min-width: 0;
664
+ scroll-snap-align: center;
665
+ }
666
+
667
+ /* 行内四项(标题/成员/ID/状态)在 370px 下必然挤:允许折行,不允许压成竖排 */
668
+ .list-row {
669
+ flex-wrap: wrap;
670
+ row-gap: 4px;
671
+ min-height: 44px;
672
+ }
673
+
674
+ .list-row .grow {
675
+ flex: 1 1 60%;
676
+ }
677
+
678
+ .st-pill-btn {
679
+ min-height: 40px;
680
+ }
681
+
682
+ .st-menu button {
683
+ min-height: 44px;
684
+ }
685
+ }
636
686
  </style>
@@ -542,4 +542,60 @@ const blockDayFlags = computed(() => {
542
542
  @media (prefers-reduced-motion: reduce) {
543
543
  .skel-row { animation: none; }
544
544
  }
545
+
546
+ /* ── 窄屏(≤1023):阅读列收边 + 富文本/代码/终端块横向滚动而非顶破视口 ──
547
+ 消息体由 workshop-event-block(及其内部的 prose/code-block)渲染,
548
+ 这里用 :deep 给它们一条自己的卷轴:代码不折行(折行会毁掉缩进语义),
549
+ 改为在自己块内横扫;图片/画布一律不超列宽。 */
550
+ @media (max-width: 1023.98px) {
551
+ .filter-bar {
552
+ flex-wrap: wrap;
553
+ gap: 8px;
554
+ padding: 6px 10px;
555
+ }
556
+
557
+ .filter-bar :deep(.ant-segmented) {
558
+ flex: 1 1 100%;
559
+ }
560
+
561
+ .count,
562
+ .sync-chip,
563
+ .earlier-done {
564
+ font-size: 11.5px;
565
+ }
566
+
567
+ .column {
568
+ padding: 8px 8px 22px;
569
+ }
570
+
571
+ .column :deep(pre),
572
+ .column :deep(table),
573
+ .column :deep(.code-block),
574
+ .column :deep(.st-text) {
575
+ max-width: 100%;
576
+ overflow-x: auto;
577
+ -webkit-overflow-scrolling: touch;
578
+ }
579
+
580
+ .column :deep(img),
581
+ .column :deep(video),
582
+ .column :deep(canvas) {
583
+ max-width: 100%;
584
+ height: auto;
585
+ }
586
+
587
+ .empty-hint {
588
+ font-size: 13px;
589
+ }
590
+
591
+ .earlier-btn,
592
+ .jump-latest {
593
+ min-height: 40px;
594
+ }
595
+
596
+ .jump-latest {
597
+ padding: 8px 14px;
598
+ font-size: 12px;
599
+ }
600
+ }
545
601
  </style>
@@ -63,7 +63,7 @@ const hasMore = computed(() => lines.value.length > MAX)
63
63
  background: var(--tone-danger-bg);
64
64
  border-radius: var(--radius-chip);
65
65
  }
66
- .error-code { padding: 0 5px; font-size: 9px; background: color-mix(in srgb, var(--tone-danger-dot) 14%, transparent); border-radius: var(--radius-chip); }
66
+ .error-code { padding: 0 5px; font-size: 10px; background: color-mix(in srgb, var(--tone-danger-dot) 14%, transparent); border-radius: var(--radius-chip); }
67
67
  .error-text { overflow-wrap: anywhere; word-break: break-word; }
68
68
  .more-btn {
69
69
  margin-top: 4px;
@@ -170,11 +170,13 @@ const hasMore = computed(() => rows.value.length > MAX)
170
170
  <span class="chat-time aw-mono">{{ r.time }}</span>
171
171
  </div>
172
172
  <!-- 正文:markdown-lite + @提及 pill -->
173
+ <!-- eslint-disable vue/no-v-html -- 源文本先经 mdLite 的 escapeHtml(useEventBlocks.ts:526),仅追加受控标签与 @提及 pill -->
173
174
  <div
174
175
  v-if="r.text"
175
176
  class="chat-body prose"
176
177
  v-html="shownRendered[ri]"
177
178
  />
179
+ <!-- eslint-enable vue/no-v-html -->
178
180
  </div>
179
181
  <button
180
182
  v-if="hasMore"
@@ -241,7 +243,7 @@ const hasMore = computed(() => rows.value.length > MAX)
241
243
  .who-ava {
242
244
  width: 18px;
243
245
  height: 18px;
244
- font-size: 9px;
246
+ font-size: 10px;
245
247
  }
246
248
 
247
249
  .to-arrow {
@@ -89,7 +89,7 @@ const toggle = (): void => {
89
89
  .st-toggle:hover { background: color-mix(in srgb, var(--ink) 4%, transparent); }
90
90
  .chev {
91
91
  flex: 0 0 auto;
92
- font-size: 9px;
92
+ font-size: 10px;
93
93
  line-height: 15px;
94
94
  color: var(--ink-faint);
95
95
  transition: transform 0.12s ease;
@@ -103,7 +103,7 @@ const toggle = (): void => {
103
103
  .st-count {
104
104
  flex: 0 0 auto;
105
105
  padding: 0 4px;
106
- font-size: 9px;
106
+ font-size: 10px;
107
107
  line-height: 13px;
108
108
  color: var(--ink-soft);
109
109
  background: color-mix(in srgb, var(--ink) 8%, transparent);