agentworkshop 0.7.34 → 0.7.38

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 (985) hide show
  1. package/.output/.AgentWorkShop/aml-python/aml_eval.py +171 -0
  2. package/.output/.AgentWorkShop/aml-python/amlkit.py +120 -0
  3. package/.output/.AgentWorkShop/aml-python/requirements.txt +7 -0
  4. package/.output/.AgentWorkShop/aml-python/train-example.py +92 -0
  5. package/.output/.AgentWorkShop/schema.json +2 -1
  6. package/.output/nitro.json +1 -1
  7. package/.output/public/_nuxt/{DLljr7g0.js → 45zuyAso.js} +1 -1
  8. package/.output/public/_nuxt/4sIEbgcl.js +42 -0
  9. package/.output/public/_nuxt/8NMOXZOV.js +1 -0
  10. package/.output/public/_nuxt/BCGafdXT.js +2 -0
  11. package/.output/public/_nuxt/BDNMzG2s2.js +1 -0
  12. package/.output/public/_nuxt/{C-mDhyEd.js → BDmh31hl.js} +1 -1
  13. package/.output/public/_nuxt/BFkgkW8u.js +4 -0
  14. package/.output/public/_nuxt/BG8sCcwx.js +14 -0
  15. package/.output/public/_nuxt/{D8CqF0yy.js → BHA40aHa.js} +1 -1
  16. package/.output/public/_nuxt/BJHKLJJU.js +1 -0
  17. package/.output/public/_nuxt/{DoTdlVVe2.js → BN6iuJEg2.js} +1 -1
  18. package/.output/public/_nuxt/BNT8gYU92.js +4 -0
  19. package/.output/public/_nuxt/BU83-NnX.js +106 -0
  20. package/.output/public/_nuxt/BYhEUx8t.js +17 -0
  21. package/.output/public/_nuxt/BzHEilTt.js +1 -0
  22. package/.output/public/_nuxt/{Ct-WOVr4.js → C3J6FYKa.js} +1 -1
  23. package/.output/public/_nuxt/C3gwHTz0.js +1 -0
  24. package/.output/public/_nuxt/C4DWUZ6d2.js +1 -0
  25. package/.output/public/_nuxt/C5gUkRwn.js +1 -0
  26. package/.output/public/_nuxt/CClOy-Hz2.js +1 -0
  27. package/.output/public/_nuxt/{CUXCQXjG.js → CM12FuB42.js} +1 -1
  28. package/.output/public/_nuxt/{BSCpFtzG.js → CSkxz2NX.js} +1 -1
  29. package/.output/public/_nuxt/CWoJjWmZ.js +1 -0
  30. package/.output/public/_nuxt/CY9LbPCI.js +1 -0
  31. package/.output/public/_nuxt/CYWVXZTS.js +7 -0
  32. package/.output/public/_nuxt/CZiw7sEV.js +1 -0
  33. package/.output/public/_nuxt/C_OLzD09.js +1 -0
  34. package/.output/public/_nuxt/C__m4EhR.js +1 -0
  35. package/.output/public/_nuxt/Cbq-mryP.js +1 -0
  36. package/.output/public/_nuxt/{C4OAdbVK2.js → Cc_9VzD42.js} +1 -1
  37. package/.output/public/_nuxt/{BASN8nZ0.js → CdPzkOMV.js} +1 -1
  38. package/.output/public/_nuxt/Cec0Ua3F.js +1 -0
  39. package/.output/public/_nuxt/{DYKVPzN-.js → CoNpEq5X.js} +1 -1
  40. package/.output/public/_nuxt/CojCTLKD.js +1 -0
  41. package/.output/public/_nuxt/{B7wL3pDk.js → Crod5z2f.js} +1 -1
  42. package/.output/public/_nuxt/CzlMDL5H.js +13 -0
  43. package/.output/public/_nuxt/{G0qIw7Gq2.js → D0ZBQrN_2.js} +1 -1
  44. package/.output/public/_nuxt/{Lp7Ll94I.js → D1YDxZpZ.js} +1 -1
  45. package/.output/public/_nuxt/{Bc0AmjfT.js → D20Yamr4.js} +1 -1
  46. package/.output/public/_nuxt/D6uzXueg.js +2 -0
  47. package/.output/public/_nuxt/D9Oidm5I.js +1 -0
  48. package/.output/public/_nuxt/DAe0h2MB.js +1 -0
  49. package/.output/public/_nuxt/DBHNsT1Y.js +23 -0
  50. package/.output/public/_nuxt/DDShH71m.js +1 -0
  51. package/.output/public/_nuxt/DDgJcSET.js +19 -0
  52. package/.output/public/_nuxt/DHFrCUxA2.js +13 -0
  53. package/.output/public/_nuxt/{BcrN7QEl2.js → DIaZ2PTo2.js} +1 -1
  54. package/.output/public/_nuxt/DPnwL14Y.js +1 -0
  55. package/.output/public/_nuxt/DR12_WCA.js +3 -0
  56. package/.output/public/_nuxt/{B9nXmjSB.js → DUrecWPx.js} +4 -4
  57. package/.output/public/_nuxt/DVsjtsvZ2.js +1 -0
  58. package/.output/public/_nuxt/DYr1VMiQ.js +6 -0
  59. package/.output/public/_nuxt/DZtm4l-P2.js +1 -0
  60. package/.output/public/_nuxt/DdD9mCHM.js +1 -0
  61. package/.output/public/_nuxt/DeJykBFf.js +9 -0
  62. package/.output/public/_nuxt/{DoMxCWN52.js → DeyBFhKH2.js} +1 -1
  63. package/.output/public/_nuxt/DkGQ7lnb2.js +1 -0
  64. package/.output/public/_nuxt/DmqknNvV.js +18 -0
  65. package/.output/public/_nuxt/DnUuIR83.js +1 -0
  66. package/.output/public/_nuxt/DrYV5i68.js +1 -0
  67. package/.output/public/_nuxt/{B5S_UyaC.js → DtYHUi5Z.js} +1 -1
  68. package/.output/public/_nuxt/Dz_Q3Lpw2.js +1 -0
  69. package/.output/public/_nuxt/DzbFpZRk.js +3 -0
  70. package/.output/public/_nuxt/HBLJ-wei.js +1 -0
  71. package/.output/public/_nuxt/JCoYF4IJ.js +31 -0
  72. package/.output/public/_nuxt/JTLM-kqr2.js +1 -0
  73. package/.output/public/_nuxt/{BeIfu4N3.js → KZQX7xoM.js} +2 -2
  74. package/.output/public/_nuxt/S_fVQwJK.js +1 -0
  75. package/.output/public/_nuxt/TownView.0oLiQgTC.css +1 -0
  76. package/.output/public/_nuxt/YnQxK3eG.js +1 -0
  77. package/.output/public/_nuxt/_id_.D-SYuyZb.css +1 -0
  78. package/.output/public/_nuxt/_id_.hma_BU6T.css +1 -0
  79. package/.output/public/_nuxt/_wsId_.B12v3PhY.css +1 -0
  80. package/.output/public/_nuxt/aLLjF2K-2.js +1 -0
  81. package/.output/public/_nuxt/aWWIh8YL.js +24 -0
  82. package/.output/public/_nuxt/ahgEJu2R.js +1 -0
  83. package/.output/public/_nuxt/aml.COEKNNqK.css +1 -0
  84. package/.output/public/_nuxt/builds/latest.json +1 -1
  85. package/.output/public/_nuxt/builds/meta/44b66249-54d0-4c8a-9057-9755a32329e2.json +1 -0
  86. package/.output/public/_nuxt/daq.B3265ZDn.css +1 -0
  87. package/.output/public/_nuxt/dcw.DLYZqEhT.css +1 -0
  88. package/.output/public/_nuxt/default.DE_vT238.css +1 -0
  89. package/.output/public/_nuxt/entry.BB-Eeh-J.css +1 -0
  90. package/.output/public/_nuxt/jZsY8yYz.js +1 -0
  91. package/.output/public/_nuxt/logs.CqFyMrJw.css +1 -0
  92. package/.output/public/_nuxt/pages.ooEzrMm9.css +1 -0
  93. package/.output/public/_nuxt/pdk8jLGT.js +1 -0
  94. package/.output/public/_nuxt/plugins.5e5chZ67.css +1 -0
  95. package/.output/public/_nuxt/pz2JDAM7.js +2 -0
  96. package/.output/public/_nuxt/settings.Dm3M0RLy.css +1 -0
  97. package/.output/public/_nuxt/town.DKIAhKnx.css +1 -0
  98. package/.output/public/_nuxt/users.CXnP2E08.css +1 -0
  99. package/.output/public/_nuxt/vRTjoWqd.js +1 -0
  100. package/.output/public/_nuxt/workshop.Jk5HxWPE.css +1 -0
  101. package/.output/public/_nuxt/zIGh7R49.js +75 -0
  102. package/.output/public/_nuxt/zq5t1vyX.js +1 -0
  103. package/.output/server/chunks/_/character-asset.repo.mjs +1 -1
  104. package/.output/server/chunks/_/entity.mjs +174 -0
  105. package/.output/server/chunks/_/entity.mjs.map +1 -0
  106. package/.output/server/chunks/_/env-manager.mjs +162 -0
  107. package/.output/server/chunks/_/env-manager.mjs.map +1 -0
  108. package/.output/server/chunks/_/host-bindings.mjs +1 -1
  109. package/.output/server/chunks/_/nitro.mjs +1657 -1162
  110. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  111. package/.output/server/chunks/_/scene-layout.repo.mjs +1 -1
  112. package/.output/server/chunks/build/{TownView-BdHnAilw.mjs → TownView-jVazYOjN.mjs} +141 -141
  113. package/.output/server/chunks/build/{TownView-BdHnAilw.mjs.map → TownView-jVazYOjN.mjs.map} +1 -1
  114. package/.output/server/chunks/build/{_id_-Cb845FHR.mjs → _id_-CfVosNg3.mjs} +136 -136
  115. package/.output/server/chunks/build/{_id_-Cb845FHR.mjs.map → _id_-CfVosNg3.mjs.map} +1 -1
  116. package/.output/server/chunks/build/{_id_-fadFPl2i.mjs → _id_-Hwr4rZpr.mjs} +32 -32
  117. package/.output/server/chunks/build/{_id_-fadFPl2i.mjs.map → _id_-Hwr4rZpr.mjs.map} +1 -1
  118. package/.output/server/chunks/build/{_wsId_-CTZswnm5.mjs → _wsId_-BVg3bB77.mjs} +175 -165
  119. package/.output/server/chunks/build/{_wsId_-CTZswnm5.mjs.map → _wsId_-BVg3bB77.mjs.map} +1 -1
  120. package/.output/server/chunks/build/aml-BCSJCdX7.mjs +588 -0
  121. package/.output/server/chunks/build/aml-BCSJCdX7.mjs.map +1 -0
  122. package/.output/server/chunks/build/{daq-BvihjQyW.mjs → daq-C03Uu5UE.mjs} +108 -106
  123. package/.output/server/chunks/build/daq-C03Uu5UE.mjs.map +1 -0
  124. package/.output/server/chunks/build/{dcw-Ks2vJ4PF.mjs → dcw-6vEYVeje.mjs} +44 -44
  125. package/.output/server/chunks/build/{dcw-Ks2vJ4PF.mjs.map → dcw-6vEYVeje.mjs.map} +1 -1
  126. package/.output/server/chunks/build/{default-GgHt4O2R.mjs → default-hseyOqBT.mjs} +30 -27
  127. package/.output/server/chunks/build/{default-GgHt4O2R.mjs.map → default-hseyOqBT.mjs.map} +1 -1
  128. package/.output/server/chunks/build/{logs-CYBhkQwh.mjs → logs-B-xhuqln.mjs} +35 -35
  129. package/.output/server/chunks/build/{logs-CYBhkQwh.mjs.map → logs-B-xhuqln.mjs.map} +1 -1
  130. package/.output/server/chunks/build/{pages-C-6BRtv8.mjs → pages-BO7yZsXA.mjs} +18 -27
  131. package/.output/server/chunks/build/pages-BO7yZsXA.mjs.map +1 -0
  132. package/.output/server/chunks/build/{plugins-dZRegC7m.mjs → plugins-CUWmMdyt.mjs} +17 -17
  133. package/.output/server/chunks/build/{plugins-dZRegC7m.mjs.map → plugins-CUWmMdyt.mjs.map} +1 -1
  134. package/.output/server/chunks/build/{settings-CgDLkP3s.mjs → settings-DoQ2Oq3P.mjs} +43 -43
  135. package/.output/server/chunks/build/{settings-CgDLkP3s.mjs.map → settings-DoQ2Oq3P.mjs.map} +1 -1
  136. package/.output/server/chunks/build/{town-DJ-V5G9U.mjs → town-BOl6hs9B.mjs} +7 -7
  137. package/.output/server/chunks/build/{town-DJ-V5G9U.mjs.map → town-BOl6hs9B.mjs.map} +1 -1
  138. package/.output/server/chunks/build/useDaqStream-CIBaiGAl.mjs +1 -1
  139. package/.output/server/chunks/build/useDcwStream-CBbiYnWe.mjs +1 -1
  140. package/.output/server/chunks/build/{useWorkshopWs-CprkZEdq.mjs → useWorkshopWs-C_I7q9As.mjs} +110 -32
  141. package/.output/server/chunks/build/{useWorkshopWs-CprkZEdq.mjs.map → useWorkshopWs-C_I7q9As.mjs.map} +1 -1
  142. package/.output/server/chunks/build/{users-4nzxTjFT.mjs → users-fohSmF-J.mjs} +6 -6
  143. package/.output/server/chunks/build/{users-4nzxTjFT.mjs.map → users-fohSmF-J.mjs.map} +1 -1
  144. package/.output/server/chunks/build/{workshop-81xhz368.mjs → workshop-DX5-ldc4.mjs} +15 -15
  145. package/.output/server/chunks/build/{workshop-81xhz368.mjs.map → workshop-DX5-ldc4.mjs.map} +1 -1
  146. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs +21 -8
  147. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs.map +1 -1
  148. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id/preview.get.mjs +1 -1
  149. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.delete.mjs +58 -0
  150. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.delete.mjs.map +1 -0
  151. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs +27 -6
  152. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs.map +1 -1
  153. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.patch.mjs +49 -0
  154. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.patch.mjs.map +1 -0
  155. package/.output/server/chunks/routes/api/workshop/aml/entities/prune.post.mjs +45 -0
  156. package/.output/server/chunks/routes/api/workshop/aml/entities/prune.post.mjs.map +1 -0
  157. package/.output/server/chunks/routes/api/workshop/aml/env/recheck.post.mjs +30 -0
  158. package/.output/server/chunks/routes/api/workshop/aml/env/recheck.post.mjs.map +1 -0
  159. package/.output/server/chunks/routes/api/workshop/aml/env/uv.post.mjs +40 -0
  160. package/.output/server/chunks/routes/api/workshop/aml/env/uv.post.mjs.map +1 -0
  161. package/.output/server/chunks/routes/api/workshop/aml/env/venv.post.mjs +42 -0
  162. package/.output/server/chunks/routes/api/workshop/aml/env/venv.post.mjs.map +1 -0
  163. package/.output/server/chunks/routes/api/workshop/aml/index.get.mjs +1 -1
  164. package/.output/server/chunks/routes/api/workshop/aml/index.post.mjs +1 -1
  165. package/.output/server/chunks/routes/api/workshop/aml/index2.get.mjs +4 -22
  166. package/.output/server/chunks/routes/api/workshop/aml/index2.get.mjs.map +1 -1
  167. package/.output/server/chunks/routes/api/workshop/aml/index2.post.mjs +1 -1
  168. package/.output/server/chunks/routes/api/workshop/aml/index3.get.mjs +4 -16
  169. package/.output/server/chunks/routes/api/workshop/aml/index3.get.mjs.map +1 -1
  170. package/.output/server/chunks/routes/api/workshop/aml/index4.get.mjs +19 -34
  171. package/.output/server/chunks/routes/api/workshop/aml/index4.get.mjs.map +1 -1
  172. package/.output/server/chunks/routes/api/workshop/aml/index5.get.mjs +41 -0
  173. package/.output/server/chunks/routes/api/workshop/aml/index5.get.mjs.map +1 -0
  174. package/.output/server/chunks/routes/api/workshop/aml/index6.get.mjs +62 -0
  175. package/.output/server/chunks/routes/api/workshop/aml/index6.get.mjs.map +1 -0
  176. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/cancel.post.mjs +1 -1
  177. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/logs.get.mjs +1 -1
  178. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/retry.post.mjs +1 -1
  179. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.delete.mjs +63 -0
  180. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.delete.mjs.map +1 -0
  181. package/.output/server/chunks/routes/api/workshop/aml/models/_id/predict.post.mjs +1 -1
  182. package/.output/server/chunks/routes/api/workshop/aml/models/_id/promote.post.mjs +1 -1
  183. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.delete.mjs +54 -0
  184. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.delete.mjs.map +1 -0
  185. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.patch.mjs +46 -0
  186. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.patch.mjs.map +1 -0
  187. package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs +1 -1
  188. package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs +1 -1
  189. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +2 -2
  190. package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs +1 -1
  191. package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs +1 -1
  192. package/.output/server/chunks/routes/api/workshop/channels/_id/index.put.mjs +1 -1
  193. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs +1 -1
  194. package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs +1 -1
  195. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs +1 -1
  196. package/.output/server/chunks/routes/api/workshop/channels.post.mjs +4 -4
  197. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs +1 -1
  198. package/.output/server/chunks/routes/api/workshop/daq/_id/bindings.put.mjs +1 -1
  199. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +1 -1
  200. package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs +1 -1
  201. package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs +1 -1
  202. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs +1 -1
  203. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs +1 -1
  204. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs +1 -1
  205. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs +1 -1
  206. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs +1 -1
  207. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +1 -1
  208. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +1 -1
  209. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +1 -1
  210. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +1 -1
  211. package/.output/server/chunks/routes/api/workshop/dcw/_id/bindings.put.mjs +1 -1
  212. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs +1 -1
  213. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs +1 -1
  214. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +1 -1
  215. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +1 -1
  216. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +1 -1
  217. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +1 -1
  218. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +1 -1
  219. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs +1 -1
  220. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +1 -1
  221. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +1 -1
  222. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +1 -1
  223. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs +1 -1
  224. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +1 -1
  225. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +1 -1
  226. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +1 -1
  227. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +1 -1
  228. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +1 -1
  229. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs +1 -1
  230. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +1 -1
  231. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +1 -1
  232. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +1 -1
  233. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +1 -1
  234. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +1 -1
  235. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs +1 -1
  236. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs +1 -1
  237. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +1 -1
  238. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +1 -1
  239. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +1 -1
  240. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +1 -1
  241. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +1 -1
  242. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs +1 -1
  243. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +1 -1
  244. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +1 -1
  245. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs +1 -1
  246. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +1 -1
  247. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +1 -1
  248. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs +1 -1
  249. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs +1 -1
  250. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs +1 -1
  251. package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs +1 -1
  252. package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs +1 -1
  253. package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs +1 -1
  254. package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs +1 -1
  255. package/.output/server/chunks/routes/api/workshop/index.put.mjs +1 -1
  256. package/.output/server/chunks/routes/api/workshop/index2.get.mjs +12 -1
  257. package/.output/server/chunks/routes/api/workshop/index2.get.mjs.map +1 -1
  258. package/.output/server/chunks/routes/api/workshop/index3.post.mjs +1 -1
  259. package/.output/server/chunks/routes/api/workshop/index4.post.mjs +1 -1
  260. package/.output/server/chunks/routes/api/workshop/index5.get.mjs +1 -1
  261. package/.output/server/chunks/routes/api/workshop/index5.post.mjs +1 -1
  262. package/.output/server/chunks/routes/api/workshop/index6.get.mjs +1 -1
  263. package/.output/server/chunks/routes/api/workshop/index6.post.mjs +1 -1
  264. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +1 -1
  265. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +1 -1
  266. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +1 -1
  267. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +1 -1
  268. package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs +1 -1
  269. package/.output/server/chunks/routes/api/workshop/teams/_id/index.put.mjs +1 -1
  270. package/.output/server/chunks/routes/api/workshop/teams/_id/index2.get.mjs +1 -1
  271. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +2 -2
  272. package/.output/server/chunks/routes/renderer.mjs +2 -2
  273. package/.output/server/chunks/virtual/entry.mjs +103 -17
  274. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  275. package/.output/server/package.json +1 -1
  276. package/README-zh.md +578 -507
  277. package/README.md +125 -51
  278. package/app/assets/css/main.css +329 -22
  279. package/app/components/AppHeader.vue +5 -4
  280. package/app/components/AppSidebar.vue +5 -4
  281. package/app/components/AwChart.vue +17 -0
  282. package/app/components/workshop/AgentLanesView.vue +2 -2
  283. package/app/components/workshop/ChannelSessionList.vue +3 -3
  284. package/app/components/workshop/CommandPalette.vue +1 -2
  285. package/app/components/workshop/Composer.vue +4 -4
  286. package/app/components/workshop/DaqNodeRow.vue +20 -1
  287. package/app/components/workshop/EventBlock.vue +3 -3
  288. package/app/components/workshop/MentionHoverCard.vue +1 -1
  289. package/app/components/workshop/MultiChannelView.vue +1 -1
  290. package/app/components/workshop/TaskBoardView.vue +5 -5
  291. package/app/components/workshop/TranscriptTimeline.vue +3 -3
  292. package/app/components/workshop/blocks/ClusterRoute.vue +3 -3
  293. package/app/components/workshop/blocks/ClusterStream.vue +1 -1
  294. package/app/components/workshop/blocks/ClusterTool.vue +1 -1
  295. package/app/components/workshop/lanes/LaneBlocks.vue +5 -2
  296. package/app/components/workshop/town/TownView.vue +0 -7
  297. package/app/composables/workshop/useClusteredBlocks.ts +22 -3
  298. package/app/composables/workshop/useEscClose.ts +44 -0
  299. package/app/config/index.ts +2 -1
  300. package/app/layouts/default.vue +25 -8
  301. package/app/pages/aml/index.vue +626 -4
  302. package/app/pages/daq/[id].vue +1 -1
  303. package/app/pages/daq/index.vue +10 -12
  304. package/app/pages/dcw/[id].vue +2 -2
  305. package/app/pages/dcw/index.vue +7 -11
  306. package/app/pages/index.vue +24 -6
  307. package/app/pages/logs/index.vue +2 -6
  308. package/app/pages/plugins/index.vue +1 -1
  309. package/app/pages/settings.vue +2 -2
  310. package/app/pages/town.vue +0 -2
  311. package/app/pages/users.vue +1 -1
  312. package/app/pages/workshop/index.vue +2 -2
  313. package/app/plugins/esc-close.client.ts +31 -0
  314. package/app/stores/workshop/events.ts +186 -36
  315. package/bin/aw.mjs +7 -2
  316. package/cli/aw.mjs +19 -34
  317. package/cli/commands/build.mjs +18 -1
  318. package/cli/commands/config.mjs +2 -0
  319. package/cli/commands/plugin.mjs +45 -18
  320. package/cli/commands/register.mjs +6 -2
  321. package/cli/commands/status.mjs +2 -1
  322. package/cli/commands/update.mjs +1 -1
  323. package/cli/commands/version.mjs +1 -1
  324. package/cli/core/args.mjs +76 -4
  325. package/cli/core/help.mjs +3 -1
  326. package/cli/core/meta.mjs +38 -0
  327. package/cli/core/post-build.mjs +96 -0
  328. package/cli/core/registry.mjs +6 -3
  329. package/config.yml +28 -26
  330. package/docs/aml.md +99 -0
  331. package/docs/cli.en.md +445 -0
  332. package/docs/cli.md +410 -220
  333. package/docs/full-test-plan.md +174 -0
  334. package/docs/multi-harness-architecture.md +248 -0
  335. package/docs/plugins.en.md +534 -0
  336. package/docs/plugins.md +531 -179
  337. package/docs/sdk.en.md +922 -0
  338. package/docs/sdk.md +725 -129
  339. package/i18n/dicts/aml.json +43 -1
  340. package/i18n/locales/en.ts +1928 -1885
  341. package/i18n/locales/zh-CN.ts +1928 -1885
  342. package/nuxt.config.ts +27 -2
  343. package/package.json +164 -153
  344. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.continue.json +1 -0
  345. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.json +1 -0
  346. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/054bb4bc4e4217a2ab0b0c6b663747214a9af464f5568ea60e784704e340bb0f.source +153 -0
  347. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/0554197c3d2bac203a1f5c48a5d52495d1336db1bd7aa4f4c19875810363e684.source +153 -0
  348. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/05c203d12a954fffba942e1d626e3f5fec05b18a5aef2bac003b7884a4b77406.source +431 -0
  349. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/145a6e6ba811af35aed31e0cc3211f53706a14980fa069ee9e3c1591139f96f0.source +180 -0
  350. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/1ae0fb281f97899c025e368ca73f41349b01fb5f85b19e08d7ebccff49095ed5.source +112 -0
  351. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/20ee9967aa0541c516db7575bdd4a1a745939bc7016bd10d7635903113edb8ec.source +227 -0
  352. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/233751843aeba9d4c5263f275b8102de00443c06f286918cbd23e0b6729e01aa.source +131 -0
  353. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/263c2e05b425e5c322e60c6475279f963bab3a873eb521b21df7fec935a46597.source +160 -0
  354. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/2ac5eaac28eaaee2178c4b32014df8e732f9dd432a285a872f5b7f31c1395fa4.source +157 -0
  355. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/33a0db0d2d95d2c11d0720090458e5fba1425376f5ceb5b422d1d3471be3226b.source +348 -0
  356. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/359e474ae83db35e4615d3728de6bf694b64d4dce9b536730a3b6518f9c0494a.source +296 -0
  357. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/37a4c3c31c4b70f6b719c53d1e9c4fcba603f31adfdd11bb6ef9f0d094923c56.source +285 -0
  358. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/461feca1c14a695eb8b0f17a6f95fe97eeceabc0510faaea4ba6d25bde147d8d.source +217 -0
  359. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/4cfadbda8591f29d5e1e230dc000e701b756e850441b3900fb596a4d2f6e98c2.source +301 -0
  360. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/50ca2810cf0b248c96948994c0c404531bbad6e553166b6816b3b03bfa0f75d2.source +151 -0
  361. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/52d9e8cb591a9ae86e238c3620a610cd386717bee222c0f37b25b2ac7e523dc4.source +135 -0
  362. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/6c87daafa4c006560a954636a97333f6123153c9d34d96203f7ee3a14e556357.source +156 -0
  363. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/77bc47854b577900621cacf1697f81fa2bc005af129d37614a97a3441c08f99f.source +72 -0
  364. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/7bbb789d3a527817118cf8399ed1861d6a962ade10878fd07223435d333a7089.source +469 -0
  365. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/86b7c1daafc8b60ba9982dde5bf1bcc74265709483c176e71f23ec6fc267451f.source +259 -0
  366. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/8df66d62bd41984d0970e8236882080c5085ac937d07a29779463d6a03b37c76.source +97 -0
  367. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/9962f2d1b3a85137bd40cc835725600b39f89ee02a27c06b2e0402e1eafde115.source +277 -0
  368. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/a1090ea066b792cb201739f4994e37bf7c12f52e805239a1eab87f18a537f266.source +171 -0
  369. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/a5241091650134d0919897e086a606a3846c8b2b54f8b4c84a8696c145ac3e9e.source +425 -0
  370. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/af19fa4c6e34d5540028be4b17600161283af3a2a2dfc61a3fdc0834436a0c14.source +99 -0
  371. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/b3713d78e2b2f93905ff6be8d58a8d0a2f42dea322eb67c987fda22ff6a084d5.source +325 -0
  372. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/b3849943c3aff102d1af815631fc843a2a52c17646a4b04696ece323e483bbec.source +332 -0
  373. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/bac735a3803a6650b7f1eb8f587e6dc5c68ea055000c3c99a11789438b78e837.source +43 -0
  374. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/d32c24d61eb8b33c73e5a8fc7e4dc7ef437aed238ee4371c2b00617e6104090a.source +154 -0
  375. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/d5170dc9a9879fda04fdf91d8a110d4efb6787ee38dda596d4da899883d36a72.source +531 -0
  376. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/dc59bcd7bb397be63ba2f2c3fec23f3782dcb17d2d75a9981eeced761f33eb32.source +439 -0
  377. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/eb5ff8cf66b92aec7bf6726781d8df74faa2b030c3aaac17d6b00c1fc04c9b32.source +323 -0
  378. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/f10615a6fae18436e70d1201b2d44fdae3174a3aa7bb4db97dea1b3ed291d721.source +433 -0
  379. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/f36d3e271668bc1260c2823542d22dbf1d0f7041ff16b1ac175bce2256e582ca.source +280 -0
  380. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/f94449380af09f31ac352152007146a75cc80bae8d6411ffe57b2c56f933b0ff.source +117 -0
  381. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/fe4dfd81178fd6b648335f6405d9ede71319aebde796008e50db21f8adf44c99.source +160 -0
  382. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/ffb4e3aa548cfdadabaa44ab599f9b6a3ca6288176a2cc7a4b2fc2a12b5fb848.source +101 -0
  383. package/scripts/.mimosa/hook-status/sess_aeaecb58-8833-4b83-b93c-050467d21e03-d944d71bb3.json +14 -0
  384. package/scripts/_audit/aml-layout-diag.mjs +83 -0
  385. package/scripts/_audit/bump-version.mjs +51 -0
  386. package/scripts/_audit/channel-inspect.mjs +49 -0
  387. package/scripts/_audit/cleanup-apply.mjs +89 -0
  388. package/scripts/_audit/cleanup-plan.mjs +82 -0
  389. package/scripts/_audit/contrast-check.mjs +43 -0
  390. package/scripts/_audit/dcw-unrecorded-write.ts +1 -1
  391. package/scripts/_audit/design-shots.mjs +145 -0
  392. package/scripts/_audit/docs-font-probe.mjs +68 -0
  393. package/scripts/_audit/docs-probe.mjs +107 -0
  394. package/scripts/_audit/docs-shots.mjs +171 -0
  395. package/scripts/_audit/docs-v3-verify.mjs +255 -0
  396. package/scripts/_audit/docs-vue-lint.mjs +81 -0
  397. package/scripts/_audit/docs-vue-lint2.mjs +91 -0
  398. package/scripts/_audit/exp-cost-scaling.mjs +4 -1
  399. package/scripts/_audit/exp-envelope-and-png.mjs +2 -1
  400. package/scripts/_audit/exp-sweep-fairness.mjs +4 -2
  401. package/scripts/_audit/fix-settings-count.mjs +57 -0
  402. package/scripts/_audit/glass-verify.mjs +155 -0
  403. package/scripts/_audit/hydration-diff.mjs +104 -0
  404. package/scripts/_audit/hydration-head.mjs +36 -0
  405. package/scripts/_audit/hydration-probe.mjs +59 -0
  406. package/scripts/_audit/lead-matrix-test.mjs +172 -0
  407. package/scripts/_audit/plc-agent-task.mjs +74 -0
  408. package/scripts/_audit/plc-clean-scenario.mjs +434 -0
  409. package/scripts/_audit/plc-clean-shots.mjs +161 -0
  410. package/scripts/_audit/plc-fc10-probe.mjs +30 -0
  411. package/scripts/_audit/probe-binding.mjs +114 -103
  412. package/scripts/_audit/review-fix-verify.mjs +158 -0
  413. package/scripts/_audit/seed-demo.mjs +165 -0
  414. package/scripts/_audit/town-focus-shot.mjs +129 -0
  415. package/scripts/_audit/town-reposition.mjs +85 -0
  416. package/scripts/_audit/ts-resolve-hook.mjs +57 -22
  417. package/scripts/_audit/verify-cleanup.mjs +67 -0
  418. package/scripts/_audit/verify-release-pack.mjs +82 -0
  419. package/scripts/_audit/watchdog-recovery-test.mjs +127 -0
  420. package/scripts/_dbg-audit-all-pages.mjs +43 -43
  421. package/scripts/_dbg-configroot-audit.mjs +84 -84
  422. package/scripts/_dbg-daq-intervals-func.mjs +94 -94
  423. package/scripts/_dbg-daq-rowstyle-verify.mjs +112 -112
  424. package/scripts/_dbg-groups-ui-verify.mjs +122 -122
  425. package/scripts/_dbg-harness-e2e.mjs +92 -92
  426. package/scripts/_dbg-harness-ui-e2e.py +97 -97
  427. package/scripts/_dbg-hitl-timeout-e2e.mjs +93 -93
  428. package/scripts/_dbg-multiharness-live-e2e.mjs +254 -254
  429. package/scripts/_dbg-opslog-agent-e2e.mjs +194 -194
  430. package/scripts/_dbg-opt-team-e2e.mjs +133 -133
  431. package/scripts/_dbg-recipe-e2e.mjs +176 -176
  432. package/scripts/_dbg-recipe-stale-e2e.mjs +135 -135
  433. package/scripts/_dbg-render-perf.mjs +142 -142
  434. package/scripts/_dbg-render-regression.mjs +130 -130
  435. package/scripts/_dbg-town-smoke.mjs +54 -54
  436. package/scripts/aw-start-smoke.mjs +27 -8
  437. package/scripts/check-docs-sync.mjs +367 -0
  438. package/scripts/e2e-full-closedloop.mjs +36 -18
  439. package/scripts/production-closed-loop-e2e.mjs +300 -303
  440. package/scripts/test-cli-exit.mjs +129 -21
  441. package/scripts/test-daq-frame-race.mjs +144 -96
  442. package/scripts/test-events-index.mjs +176 -0
  443. package/scripts/test-lru.mjs +34 -11
  444. package/scripts/test-memory-month-query.mjs +11 -3
  445. package/scripts/test-plugin-hardening.mjs +39 -2
  446. package/scripts/test-plugin-lifecycle.mjs +173 -0
  447. package/scripts/test-rollback-index.mjs +76 -18
  448. package/scripts/test-sdk-surface.mjs +6 -3
  449. package/sdk/client.mjs +16 -7
  450. package/sdk/context.mjs +21 -9
  451. package/sdk/examples/line-sentinel/client.mjs +13 -6
  452. package/sdk/examples/line-sentinel/index.mjs +5 -2
  453. package/sdk/examples/ops-notifier/client.mjs +3 -1
  454. package/sdk/examples/sample-insight/client.mjs +4 -2
  455. package/sdk/index.d.mts +133 -16
  456. package/sdk/index.mjs +3 -2
  457. package/sdk/lifecycle.mjs +8 -3
  458. package/server/api/workshop/agent-tools/bindings/index.post.ts +22 -7
  459. package/server/api/workshop/aml/datasets/[id].delete.ts +39 -0
  460. package/server/api/workshop/aml/datasets/[id].get.ts +31 -9
  461. package/server/api/workshop/aml/datasets/[id].patch.ts +30 -0
  462. package/server/api/workshop/aml/entities/index.get.ts +13 -0
  463. package/server/api/workshop/aml/entities/prune.post.ts +28 -0
  464. package/server/api/workshop/aml/env/index.get.ts +13 -0
  465. package/server/api/workshop/aml/env/recheck.post.ts +14 -0
  466. package/server/api/workshop/aml/env/uv.post.ts +21 -0
  467. package/server/api/workshop/aml/env/venv.post.ts +24 -0
  468. package/server/api/workshop/aml/index.get.ts +14 -1
  469. package/server/api/workshop/aml/jobs/[id].delete.ts +44 -0
  470. package/server/api/workshop/aml/models/[id].delete.ts +35 -0
  471. package/server/api/workshop/aml/models/[id].patch.ts +30 -0
  472. package/server/plugins/dev-stability-guard.ts +40 -63
  473. package/server/services/workshop/agents/agent-interface.ts +3 -0
  474. package/server/services/workshop/agents/codex-agent.ts +4 -7
  475. package/server/services/workshop/agents/dsh-agent.ts +4 -7
  476. package/server/services/workshop/agents/opencode-agent.ts +5 -7
  477. package/server/services/workshop/aml/aml.repo.ts +18 -0
  478. package/server/services/workshop/aml/dataset-builder.ts +4 -0
  479. package/server/services/workshop/aml/entity.ts +365 -0
  480. package/server/services/workshop/aml/env-manager.ts +242 -0
  481. package/server/services/workshop/aml/job-orchestrator.ts +4 -15
  482. package/server/services/workshop/aml/model-registry.ts +6 -0
  483. package/server/services/workshop/aml/python-runtime.ts +396 -62
  484. package/server/services/workshop/aml/runtime.ts +95 -4
  485. package/server/services/workshop/daq/bus/mqtt.adapter.ts +3 -1
  486. package/server/services/workshop/daq/daq-controller.ts +95 -47
  487. package/server/services/workshop/daq/daq-node.repo.ts +0 -10
  488. package/server/services/workshop/daq/daq-runtime.ts +0 -5
  489. package/server/services/workshop/json-store.mjs +35 -2
  490. package/server/services/workshop/plugins/host.mjs +14 -5
  491. package/server/services/workshop/runtime/manager.ts +28 -1
  492. package/server/services/workshop/runtime/scheduler-loop.ts +10 -1
  493. package/server/services/workshop/settings.ts +2 -0
  494. package/server/utils/stability-severity.ts +66 -0
  495. package/shared/config/home.mjs +58 -0
  496. package/shared/config/schema.json +2 -1
  497. package/shared/lru.mjs +4 -1
  498. package/.output/public/_nuxt/-6OnbLFb.js +0 -1
  499. package/.output/public/_nuxt/-nb2uqVg.js +0 -1
  500. package/.output/public/_nuxt/4bHdIqEg.js +0 -18
  501. package/.output/public/_nuxt/6PZPfFcO.js +0 -17
  502. package/.output/public/_nuxt/BBBtwOpo.js +0 -9
  503. package/.output/public/_nuxt/BBwMH_hG.js +0 -7
  504. package/.output/public/_nuxt/BDUjyaF4.js +0 -42
  505. package/.output/public/_nuxt/BNXfwXpE.js +0 -1
  506. package/.output/public/_nuxt/BN_PdN3J.js +0 -24
  507. package/.output/public/_nuxt/BSSUlJnx2.js +0 -1
  508. package/.output/public/_nuxt/BWSE6hR6.js +0 -1
  509. package/.output/public/_nuxt/BZGNTgTQ2.js +0 -1
  510. package/.output/public/_nuxt/BZv4RFYN.js +0 -1
  511. package/.output/public/_nuxt/BcmbLh2z2.js +0 -1
  512. package/.output/public/_nuxt/BfGc7TJp.js +0 -1
  513. package/.output/public/_nuxt/BgTB6h_q.js +0 -2
  514. package/.output/public/_nuxt/BkLJA9J5.js +0 -1
  515. package/.output/public/_nuxt/Bp5luxkg2.js +0 -1
  516. package/.output/public/_nuxt/BuCHayqN.js +0 -1
  517. package/.output/public/_nuxt/BuvcLKh1.js +0 -19
  518. package/.output/public/_nuxt/C3tCneTM.js +0 -1
  519. package/.output/public/_nuxt/C77oC8yC2.js +0 -7
  520. package/.output/public/_nuxt/C9f8QMp12.js +0 -1
  521. package/.output/public/_nuxt/CKfhtOt7.js +0 -13
  522. package/.output/public/_nuxt/CQvmN-Mi.js +0 -1
  523. package/.output/public/_nuxt/CUDrOuW7.js +0 -1
  524. package/.output/public/_nuxt/CZcC-gpk.js +0 -1
  525. package/.output/public/_nuxt/CbzsPO5H.js +0 -1
  526. package/.output/public/_nuxt/CdSOrh2c.js +0 -1
  527. package/.output/public/_nuxt/Cgx818r-.js +0 -1
  528. package/.output/public/_nuxt/Cjm7VogC.js +0 -1
  529. package/.output/public/_nuxt/Cm5mDxzH.js +0 -1
  530. package/.output/public/_nuxt/CmHzfVc5.js +0 -3
  531. package/.output/public/_nuxt/Cn3J3NXR.js +0 -23
  532. package/.output/public/_nuxt/Cno6kYiO2.js +0 -1
  533. package/.output/public/_nuxt/Cp6z0RN7.js +0 -1
  534. package/.output/public/_nuxt/CwqIxJGj.js +0 -2
  535. package/.output/public/_nuxt/D-Ca4BGY.js +0 -70
  536. package/.output/public/_nuxt/D0fhp-Ga.js +0 -75
  537. package/.output/public/_nuxt/D1z7i2UP.js +0 -31
  538. package/.output/public/_nuxt/DIaTPH1M.js +0 -1
  539. package/.output/public/_nuxt/DTYBfjRY.js +0 -1
  540. package/.output/public/_nuxt/DXRZPxGs.js +0 -1
  541. package/.output/public/_nuxt/DZzGarBE2.js +0 -13
  542. package/.output/public/_nuxt/DaMCzQhv.js +0 -1
  543. package/.output/public/_nuxt/DoLasgPj2.js +0 -1
  544. package/.output/public/_nuxt/DpojD719.js +0 -1
  545. package/.output/public/_nuxt/DsVcWfyR.js +0 -1
  546. package/.output/public/_nuxt/DtBu71ev.js +0 -32
  547. package/.output/public/_nuxt/Dy-mxvXY2.js +0 -1
  548. package/.output/public/_nuxt/DzuC31-i.js +0 -2
  549. package/.output/public/_nuxt/FQri3dV3.js +0 -1
  550. package/.output/public/_nuxt/ORt9oDIy2.js +0 -1
  551. package/.output/public/_nuxt/TownView.CtskuMXS.css +0 -1
  552. package/.output/public/_nuxt/VLI2Zy4t.js +0 -5
  553. package/.output/public/_nuxt/_id_.MbzdFygI.css +0 -1
  554. package/.output/public/_nuxt/_id_.hRYo-EAB.css +0 -1
  555. package/.output/public/_nuxt/_wsId_.gXMEOYgX.css +0 -1
  556. package/.output/public/_nuxt/aml.WU_bh87J.css +0 -1
  557. package/.output/public/_nuxt/arUY5dyq2.js +0 -4
  558. package/.output/public/_nuxt/builds/meta/adc365b6-f636-4a2b-9527-79819c1e874b.json +0 -1
  559. package/.output/public/_nuxt/daq.Bb6l44-O.css +0 -1
  560. package/.output/public/_nuxt/dcw.rXH2fc2Z.css +0 -1
  561. package/.output/public/_nuxt/default.jNT73_hq.css +0 -1
  562. package/.output/public/_nuxt/ekuGmQ7R.js +0 -1
  563. package/.output/public/_nuxt/entry.jFrFAWuA.css +0 -1
  564. package/.output/public/_nuxt/logs.DMOM-iHe.css +0 -1
  565. package/.output/public/_nuxt/niDwBOZW.js +0 -3
  566. package/.output/public/_nuxt/pMoIO6rr.js +0 -14
  567. package/.output/public/_nuxt/pages.Cc8GX9T1.css +0 -1
  568. package/.output/public/_nuxt/plugins.wIPyfPn-.css +0 -1
  569. package/.output/public/_nuxt/rqZ-1SoP.js +0 -2
  570. package/.output/public/_nuxt/settings.BCm4NZIc.css +0 -1
  571. package/.output/public/_nuxt/town.C_DsNW0J.css +0 -1
  572. package/.output/public/_nuxt/users.DuAt_Zwf.css +0 -1
  573. package/.output/public/_nuxt/vJ4FPb-_.js +0 -1
  574. package/.output/public/_nuxt/workshop.BJg84pOK.css +0 -1
  575. package/.output/server/chunks/build/aml-uBNIppIf.mjs +0 -508
  576. package/.output/server/chunks/build/aml-uBNIppIf.mjs.map +0 -1
  577. package/.output/server/chunks/build/daq-BvihjQyW.mjs.map +0 -1
  578. package/.output/server/chunks/build/pages-C-6BRtv8.mjs.map +0 -1
  579. package/scripts/_audit/.tmp/audit-data/dcws.json +0 -28
  580. package/scripts/_audit/.tmp/dcw-writes.json +0 -15650
  581. package/scripts/_audit/.tmp/dcws.json +0 -9033
  582. package/scripts/_audit/.tmp/pollution-backup/dcw-rollback.polluted.json +0 -470006
  583. package/scripts/_audit/.tmp/pollution-backup/dcws.polluted.json +0 -9085
  584. package/scripts/_audit/.tmp/probe-cwd.txt +0 -1
  585. package/scripts/_audit/awhome/commands/README.md +0 -3
  586. package/scripts/_audit/awhome/commands/hello.mjs +0 -12
  587. package/scripts/_audit/diag-cwd.ts +0 -20
  588. package/scripts/_audit/diag-cwd2.ts +0 -19
  589. package/scripts/_audit/hello.mjs +0 -12
  590. package/scripts/_audit/ndjson-partial-line-repro.mjs +0 -77
  591. package/scripts/_audit/opencode-await-ternary-repro.mjs +0 -20
  592. package/scripts/_audit/part-frag.txt +0 -84
  593. package/scripts/_audit/part-head.txt +0 -45
  594. package/scripts/_audit/probe-child.mjs +0 -17
  595. package/scripts/_audit/probe-envelope.mjs +0 -49
  596. package/scripts/_audit/probe-packlist.mjs +0 -67
  597. package/scripts/_audit/probe-routes.mjs +0 -47
  598. package/scripts/_audit/probe-routes2.mjs +0 -38
  599. package/scripts/_audit/probe.ts +0 -9
  600. package/scripts/_audit/probe2.ts +0 -6
  601. package/scripts/_audit/probe3.ts +0 -3
  602. package/scripts/_audit/probe4.ts +0 -3
  603. package/scripts/_audit/proj/.AgentWorkShop/commands/echoargs.mjs +0 -13
  604. package/scripts/_audit/proj/config.yml +0 -1
  605. package/scripts/_audit/run.mjs +0 -30
  606. package/scripts/_audit/tsconfig.probe.json +0 -24
  607. package/scripts/_audit/typecheck-out.txt +0 -466
  608. package/scripts/_daq-realtime-probe.mjs +0 -68
  609. package/scripts/_daq-warn-probe.mjs +0 -50
  610. package/scripts/_dbg-acc-1-setup.mjs +0 -57
  611. package/scripts/_dbg-acc-2-diag.mjs +0 -14
  612. package/scripts/_dbg-acc-2-intervals.mjs +0 -81
  613. package/scripts/_dbg-acc-3-daq.mjs +0 -48
  614. package/scripts/_dbg-acc-4-team.mjs +0 -92
  615. package/scripts/_dbg-acc-5-visual.mjs +0 -63
  616. package/scripts/_dbg-acc-5b-ws-town.mjs +0 -18
  617. package/scripts/_dbg-acc-5c-town.mjs +0 -12
  618. package/scripts/_dbg-acc-6-i18n.mjs +0 -19
  619. package/scripts/_dbg-agent-tools-audit.mjs +0 -154
  620. package/scripts/_dbg-agent-workflow-audit.mjs +0 -177
  621. package/scripts/_dbg-agents-dropdown-shot.py +0 -33
  622. package/scripts/_dbg-anim-verify.mjs +0 -81
  623. package/scripts/_dbg-app-shot.mjs +0 -48
  624. package/scripts/_dbg-autoframe.mjs +0 -103
  625. package/scripts/_dbg-availability-probe.ts +0 -11
  626. package/scripts/_dbg-beacon-final.mjs +0 -181
  627. package/scripts/_dbg-bind-bidi-e2e.mjs +0 -239
  628. package/scripts/_dbg-callout-near.mjs +0 -108
  629. package/scripts/_dbg-catalog-smoke.ts +0 -20
  630. package/scripts/_dbg-cf-line-shot.mjs +0 -18
  631. package/scripts/_dbg-chan-focus.mjs +0 -49
  632. package/scripts/_dbg-channel-plugin-ui.mjs +0 -94
  633. package/scripts/_dbg-cleanup.mjs +0 -31
  634. package/scripts/_dbg-closedloop-ui-shot.mjs +0 -61
  635. package/scripts/_dbg-codex-handshake.ts +0 -30
  636. package/scripts/_dbg-codex-probe.mjs +0 -58
  637. package/scripts/_dbg-codex-sandbox.ts +0 -58
  638. package/scripts/_dbg-codex-turn.ts +0 -65
  639. package/scripts/_dbg-collab-scenario-e2e.mjs +0 -185
  640. package/scripts/_dbg-config-smoke.ts +0 -28
  641. package/scripts/_dbg-console-audit.mjs +0 -61
  642. package/scripts/_dbg-console-probe.mjs +0 -23
  643. package/scripts/_dbg-context-inject-audit.mjs +0 -231
  644. package/scripts/_dbg-cpu-profile.mjs +0 -53
  645. package/scripts/_dbg-crash-recovery.mjs +0 -143
  646. package/scripts/_dbg-crop-shot.mjs +0 -16
  647. package/scripts/_dbg-cross-channel-e2e.mjs +0 -157
  648. package/scripts/_dbg-cross-team-visibility-e2e.mjs +0 -129
  649. package/scripts/_dbg-crush-probe.sh +0 -21
  650. package/scripts/_dbg-crush-spawn-probe.ts +0 -22
  651. package/scripts/_dbg-daq-acc-probe.mjs +0 -24
  652. package/scripts/_dbg-daq-attrib.mjs +0 -34
  653. package/scripts/_dbg-daq-bind-audit.mjs +0 -119
  654. package/scripts/_dbg-daq-cadence.mjs +0 -104
  655. package/scripts/_dbg-daq-debug.mjs +0 -22
  656. package/scripts/_dbg-daq-diag.mjs +0 -33
  657. package/scripts/_dbg-daq-e2e.mjs +0 -171
  658. package/scripts/_dbg-daq-film.mjs +0 -136
  659. package/scripts/_dbg-daq-filter-e2e.mjs +0 -109
  660. package/scripts/_dbg-daq-filter-e2e2.mjs +0 -62
  661. package/scripts/_dbg-daq-final-regression.mjs +0 -78
  662. package/scripts/_dbg-daq-frame-alarm.mjs +0 -49
  663. package/scripts/_dbg-daq-frame-ui.mjs +0 -62
  664. package/scripts/_dbg-daq-frame-ws.mjs +0 -72
  665. package/scripts/_dbg-daq-full-check.mjs +0 -179
  666. package/scripts/_dbg-daq-line-note-verify.mjs +0 -61
  667. package/scripts/_dbg-daq-linebanner-audit.mjs +0 -107
  668. package/scripts/_dbg-daq-pages-shot.mjs +0 -37
  669. package/scripts/_dbg-daq-perf.mjs +0 -61
  670. package/scripts/_dbg-daq-probe.mjs +0 -27
  671. package/scripts/_dbg-daq-recipe-e2e.mjs +0 -30
  672. package/scripts/_dbg-daq-redesign-shot.mjs +0 -88
  673. package/scripts/_dbg-daq-rows-probe.mjs +0 -26
  674. package/scripts/_dbg-daq-rowstate-e2e.mjs +0 -152
  675. package/scripts/_dbg-daq-rowstate-shot.mjs +0 -45
  676. package/scripts/_dbg-daq-rowstate-shot2.mjs +0 -38
  677. package/scripts/_dbg-daq-tpl.mjs +0 -144
  678. package/scripts/_dbg-dash-console-check.mjs +0 -49
  679. package/scripts/_dbg-dash-deep-probe.mjs +0 -61
  680. package/scripts/_dbg-dash-hitpoint.mjs +0 -44
  681. package/scripts/_dbg-dash-live-shot.mjs +0 -36
  682. package/scripts/_dbg-dash-shot.mjs +0 -21
  683. package/scripts/_dbg-dashboard-shot.mjs +0 -35
  684. package/scripts/_dbg-dcw-audit.mjs +0 -126
  685. package/scripts/_dbg-dcw-card-e2e.mjs +0 -108
  686. package/scripts/_dbg-dcw-channel-ui.mjs +0 -144
  687. package/scripts/_dbg-dcw-examples.mjs +0 -81
  688. package/scripts/_dbg-dcw-light-shot.mjs +0 -19
  689. package/scripts/_dbg-dcw-line-audit.mjs +0 -107
  690. package/scripts/_dbg-dcw-pause-tpl-audit.mjs +0 -161
  691. package/scripts/_dbg-dcw-pause-ui.mjs +0 -175
  692. package/scripts/_dbg-dcw-read-toolface.ts +0 -13
  693. package/scripts/_dbg-dcw-read-ui.mjs +0 -74
  694. package/scripts/_dbg-dcw-scene.mjs +0 -72
  695. package/scripts/_dbg-dcw-shot2.mjs +0 -14
  696. package/scripts/_dbg-dcw-twin-e2e.mjs +0 -192
  697. package/scripts/_dbg-diag-mock-loop.mjs +0 -89
  698. package/scripts/_dbg-diag-watch.mjs +0 -95
  699. package/scripts/_dbg-docs-site-shot.mjs +0 -32
  700. package/scripts/_dbg-dsh-probe.mjs +0 -31
  701. package/scripts/_dbg-dt-interact.mjs +0 -193
  702. package/scripts/_dbg-error-probe.mjs +0 -54
  703. package/scripts/_dbg-filter-light-verify.mjs +0 -54
  704. package/scripts/_dbg-final-acceptance-2.mjs +0 -72
  705. package/scripts/_dbg-final-acceptance.mjs +0 -192
  706. package/scripts/_dbg-final-agent-e2e.mjs +0 -151
  707. package/scripts/_dbg-final-features.mjs +0 -155
  708. package/scripts/_dbg-final-fixups.mjs +0 -62
  709. package/scripts/_dbg-final-full-e2e.mjs +0 -218
  710. package/scripts/_dbg-final-line-e2e.mjs +0 -173
  711. package/scripts/_dbg-final-shots.mjs +0 -32
  712. package/scripts/_dbg-final-t6-hitl.mjs +0 -38
  713. package/scripts/_dbg-final-visual.mjs +0 -29
  714. package/scripts/_dbg-fix-unused-imports.py +0 -41
  715. package/scripts/_dbg-focus-range.mjs +0 -115
  716. package/scripts/_dbg-fresh-scene-e2e.mjs +0 -125
  717. package/scripts/_dbg-fullchain-e2e.mjs +0 -178
  718. package/scripts/_dbg-gate-debug.mjs +0 -37
  719. package/scripts/_dbg-gif-encode.mjs +0 -111
  720. package/scripts/_dbg-gizmo.mjs +0 -95
  721. package/scripts/_dbg-glass-probe.mjs +0 -57
  722. package/scripts/_dbg-glass-shot.mjs +0 -50
  723. package/scripts/_dbg-glass-sweep.mjs +0 -25
  724. package/scripts/_dbg-glb-probe.mjs +0 -43
  725. package/scripts/_dbg-goose-probe.mjs +0 -33
  726. package/scripts/_dbg-goose-probe.sh +0 -10
  727. package/scripts/_dbg-hardening-probe.mjs +0 -90
  728. package/scripts/_dbg-harness-cancel-repro.mjs +0 -81
  729. package/scripts/_dbg-harness-ui-dbg.py +0 -49
  730. package/scripts/_dbg-harness-ui-shot.py +0 -109
  731. package/scripts/_dbg-hero-btn-probe.mjs +0 -21
  732. package/scripts/_dbg-hidden-check.mjs +0 -21
  733. package/scripts/_dbg-hmi-audit.mjs +0 -164
  734. package/scripts/_dbg-home-repro.mjs +0 -24
  735. package/scripts/_dbg-home-stack.mjs +0 -13
  736. package/scripts/_dbg-host.mjs +0 -16
  737. package/scripts/_dbg-huashu-survey.mjs +0 -31
  738. package/scripts/_dbg-huashu-survey2.mjs +0 -35
  739. package/scripts/_dbg-huashu-verify.mjs +0 -25
  740. package/scripts/_dbg-huashu-verify2.mjs +0 -26
  741. package/scripts/_dbg-hydration-detail.mjs +0 -18
  742. package/scripts/_dbg-i18n-debug.mjs +0 -27
  743. package/scripts/_dbg-i18n-debug2.mjs +0 -26
  744. package/scripts/_dbg-i18n-final.mjs +0 -42
  745. package/scripts/_dbg-i18n-scan.mjs +0 -38
  746. package/scripts/_dbg-infra-lifecycle.mjs +0 -44
  747. package/scripts/_dbg-interval-config.mjs +0 -156
  748. package/scripts/_dbg-interval-scenario.mjs +0 -126
  749. package/scripts/_dbg-kicker-check.mjs +0 -11
  750. package/scripts/_dbg-line-aura-shots.mjs +0 -54
  751. package/scripts/_dbg-line-control-e2e.mjs +0 -120
  752. package/scripts/_dbg-line-gate-audit.mjs +0 -108
  753. package/scripts/_dbg-line-live-e2e.mjs +0 -144
  754. package/scripts/_dbg-line-repo-test.ts +0 -10
  755. package/scripts/_dbg-line-scenario-e2e.mjs +0 -256
  756. package/scripts/_dbg-line-spawn.ts +0 -31
  757. package/scripts/_dbg-live-engine-probe.mjs +0 -80
  758. package/scripts/_dbg-login-debug.py +0 -23
  759. package/scripts/_dbg-login-e2e.mjs +0 -26
  760. package/scripts/_dbg-logs-ui-e2e.py +0 -126
  761. package/scripts/_dbg-mcp-bridge-probe.mjs +0 -147
  762. package/scripts/_dbg-modbus-latency.mjs +0 -22
  763. package/scripts/_dbg-mqtt-chain-e2e.mjs +0 -90
  764. package/scripts/_dbg-mqtt-publisher.mjs +0 -17
  765. package/scripts/_dbg-nav-rpg.mjs +0 -84
  766. package/scripts/_dbg-nav-shot.mjs +0 -28
  767. package/scripts/_dbg-nav.mjs +0 -27
  768. package/scripts/_dbg-oneshot-impl-probe.ts +0 -67
  769. package/scripts/_dbg-opencode-sse.mjs +0 -101
  770. package/scripts/_dbg-opencode-start.ts +0 -57
  771. package/scripts/_dbg-opslog-e2e.mjs +0 -121
  772. package/scripts/_dbg-opslog-shots.mjs +0 -62
  773. package/scripts/_dbg-optimization-e2e.mjs +0 -94
  774. package/scripts/_dbg-orbit.mjs +0 -58
  775. package/scripts/_dbg-overview-probe.sh +0 -31
  776. package/scripts/_dbg-panesplitter-fix-check.mjs +0 -62
  777. package/scripts/_dbg-perms-visual.mjs +0 -36
  778. package/scripts/_dbg-pg-tcp-probe.cjs +0 -27
  779. package/scripts/_dbg-phase-e3-monitor.mjs +0 -25
  780. package/scripts/_dbg-pi-spawn-probe.ts +0 -33
  781. package/scripts/_dbg-plc-agent-loop.ts +0 -102
  782. package/scripts/_dbg-plc-e2e.mjs +0 -171
  783. package/scripts/_dbg-plugin-agent-read.ts +0 -56
  784. package/scripts/_dbg-plugin-config-ui.mjs +0 -111
  785. package/scripts/_dbg-plugin-matrix.mjs +0 -212
  786. package/scripts/_dbg-plugin-panels-ui.mjs +0 -54
  787. package/scripts/_dbg-plugin-sink-rest.mjs +0 -70
  788. package/scripts/_dbg-plugin-sink-ui.mjs +0 -81
  789. package/scripts/_dbg-plugin-tools-inject.ts +0 -80
  790. package/scripts/_dbg-plugin-ui-wizard.mjs +0 -125
  791. package/scripts/_dbg-plugin-verify-e2e.mjs +0 -123
  792. package/scripts/_dbg-plugins-e2e.mjs +0 -101
  793. package/scripts/_dbg-pop-clamp-verify.mjs +0 -77
  794. package/scripts/_dbg-preset-e2e.mjs +0 -116
  795. package/scripts/_dbg-preview-console.mjs +0 -28
  796. package/scripts/_dbg-preview-minrepro.mjs +0 -156
  797. package/scripts/_dbg-preview-pixels.mjs +0 -93
  798. package/scripts/_dbg-prompts-hotreload-test.ts +0 -76
  799. package/scripts/_dbg-prompts-resolve-test.ts +0 -39
  800. package/scripts/_dbg-quality-pages-e2e.mjs +0 -84
  801. package/scripts/_dbg-query-cancel.ts +0 -12
  802. package/scripts/_dbg-qwen-acp-probe.mjs +0 -30
  803. package/scripts/_dbg-qwen-capture.mjs +0 -21
  804. package/scripts/_dbg-rail-tree-e2e.mjs +0 -183
  805. package/scripts/_dbg-real-driver-e2e.mjs +0 -55
  806. package/scripts/_dbg-redesign-shots.mjs +0 -34
  807. package/scripts/_dbg-registry-smoke.ts +0 -14
  808. package/scripts/_dbg-release-smoke.mjs +0 -104
  809. package/scripts/_dbg-repo-setup-verify.mjs +0 -31
  810. package/scripts/_dbg-resolve-probe.ts +0 -6
  811. package/scripts/_dbg-restart-persist.mjs +0 -41
  812. package/scripts/_dbg-retention-test.ts +0 -25
  813. package/scripts/_dbg-rollback-mgr-audit.mjs +0 -169
  814. package/scripts/_dbg-rpg.mjs +0 -71
  815. package/scripts/_dbg-sc001-dispatch.mjs +0 -63
  816. package/scripts/_dbg-scenario-final-shot.mjs +0 -24
  817. package/scripts/_dbg-scenario-phase-e2.mjs +0 -75
  818. package/scripts/_dbg-scenario-phase-e3.mjs +0 -96
  819. package/scripts/_dbg-scenario-phase1.mjs +0 -90
  820. package/scripts/_dbg-scenario-phase2.mjs +0 -105
  821. package/scripts/_dbg-scenario-phase3-monitor.mjs +0 -48
  822. package/scripts/_dbg-scenario-phase3.mjs +0 -111
  823. package/scripts/_dbg-scene-polish-shot.mjs +0 -118
  824. package/scripts/_dbg-selring-probe.mjs +0 -47
  825. package/scripts/_dbg-settings-draft-probe.mjs +0 -39
  826. package/scripts/_dbg-settings-probe.mjs +0 -33
  827. package/scripts/_dbg-setup-e2e.mjs +0 -88
  828. package/scripts/_dbg-sideinfo.mjs +0 -101
  829. package/scripts/_dbg-sim-keeper.mjs +0 -100
  830. package/scripts/_dbg-splitter.mjs +0 -88
  831. package/scripts/_dbg-swatch-check.mjs +0 -10
  832. package/scripts/_dbg-task-cancel-probe.mjs +0 -66
  833. package/scripts/_dbg-team-drill.mjs +0 -173
  834. package/scripts/_dbg-town-alarm-e2e.mjs +0 -40
  835. package/scripts/_dbg-town-beauty-shots.mjs +0 -54
  836. package/scripts/_dbg-town-daq-shot.mjs +0 -26
  837. package/scripts/_dbg-town-full-e2e.mjs +0 -104
  838. package/scripts/_dbg-town-gate.mjs +0 -44
  839. package/scripts/_dbg-town-ins-probe.mjs +0 -37
  840. package/scripts/_dbg-town-perf.mjs +0 -50
  841. package/scripts/_dbg-town-polish-shots.mjs +0 -82
  842. package/scripts/_dbg-town-realtime.mjs +0 -42
  843. package/scripts/_dbg-town-shot.py +0 -25
  844. package/scripts/_dbg-town-shot3.mjs +0 -17
  845. package/scripts/_dbg-town-truth.mjs +0 -37
  846. package/scripts/_dbg-town-truth2.mjs +0 -27
  847. package/scripts/_dbg-transform-audit.mjs +0 -98
  848. package/scripts/_dbg-trend-expand-test.mjs +0 -38
  849. package/scripts/_dbg-twindaq-focus.mjs +0 -81
  850. package/scripts/_dbg-ui-polish-shot.mjs +0 -43
  851. package/scripts/_dbg-ui-polish-verify1.mjs +0 -92
  852. package/scripts/_dbg-ui-polish-verify2.mjs +0 -50
  853. package/scripts/_dbg-ui-polish-verify3.mjs +0 -51
  854. package/scripts/_dbg-ui-polish-verify4.mjs +0 -50
  855. package/scripts/_dbg-ui-shot.mjs +0 -26
  856. package/scripts/_dbg-ui-shots.mjs +0 -28
  857. package/scripts/_dbg-ui-survey.py +0 -52
  858. package/scripts/_dbg-unify-shot.mjs +0 -43
  859. package/scripts/_dbg-uplink-probe.mjs +0 -36
  860. package/scripts/_dbg-wizard-preview-shot.mjs +0 -58
  861. package/scripts/_dbg-wizard-ui-e2e.mjs +0 -93
  862. package/scripts/_dbg-ws-probe.mjs +0 -86
  863. package/scripts/_dbg-ws-shot2.mjs +0 -23
  864. package/scripts/_dbg-wsdot-sanity.mjs +0 -25
  865. package/scripts/_dev-stack.mjs +0 -46
  866. package/scripts/_http-driver-probe.mjs +0 -30
  867. package/scripts/_mqtt-driver-probe.mjs +0 -30
  868. package/scripts/_newdriver-rest-probe.mjs +0 -100
  869. package/scripts/_node-state-probe.mjs +0 -5
  870. package/scripts/_opcua-driver-probe.mjs +0 -31
  871. package/scripts/_rtu-debug.mjs +0 -41
  872. package/scripts/_rtu-direct.mjs +0 -6
  873. package/scripts/_rtu-driver-probe.mjs +0 -53
  874. package/scripts/_spike-pitui.mjs +0 -116
  875. package/scripts/_tmp-args-probe.mjs +0 -20
  876. package/scripts/_tmp-cyc-entry.mjs +0 -8
  877. package/scripts/_tmp-cyc-main.mjs +0 -5
  878. package/scripts/_tmp-cyc-mod.mjs +0 -2
  879. package/scripts/_tmp-cycle-a.mjs +0 -6
  880. package/scripts/_tmp-cycle-b.mjs +0 -2
  881. package/scripts/_tmp-cycle-probe.mjs +0 -4
  882. package/scripts/_tmp-entry-variant.mjs +0 -2
  883. package/scripts/_tmp-help-probe.mjs +0 -19
  884. package/scripts/_tmp-help-probe2.mjs +0 -2
  885. package/scripts/_tmp-trace-preload.mjs +0 -1
  886. package/scripts/_wizard-shots.mjs +0 -90
  887. package/scripts/acceptance-suite.py +0 -207
  888. package/scripts/aml-agent-bridge.ts +0 -230
  889. package/scripts/aml-industrial-loop.ts +0 -232
  890. package/scripts/build-film-devices.mjs +0 -227
  891. package/scripts/collab-live-test.py +0 -177
  892. package/scripts/debug-mcp-http.ts +0 -64
  893. package/scripts/demo-lead-worker.ts +0 -256
  894. package/scripts/demo-modes.ts +0 -415
  895. package/scripts/demo-omp-channel.ts +0 -135
  896. package/scripts/design-preflight.mjs +0 -223
  897. package/scripts/design-verify-templates.mjs +0 -110
  898. package/scripts/design-verify.mjs +0 -170
  899. package/scripts/dev-window.cmd +0 -6
  900. package/scripts/device-line-restore.mjs +0 -34
  901. package/scripts/diag-lead-status.ts +0 -101
  902. package/scripts/e2e-a2a-steer-live.mjs +0 -193
  903. package/scripts/e2e-dual-drive-comm.ts +0 -259
  904. package/scripts/e2e-full-scenario.ts +0 -321
  905. package/scripts/e2e-harness-consistency.ts +0 -204
  906. package/scripts/e2e-harness-provider-task.mjs +0 -126
  907. package/scripts/e2e-line-live.mjs +0 -144
  908. package/scripts/e2e-memory-persistence.ts +0 -320
  909. package/scripts/e2e-omp-modes.ts +0 -274
  910. package/scripts/e2e-omp-realtime.ts +0 -258
  911. package/scripts/e2e-plc-scenario.mjs +0 -292
  912. package/scripts/e2e-real-scenario.mjs +0 -466
  913. package/scripts/e2e-tab-close.mjs +0 -136
  914. package/scripts/e2e-token-ui.mjs +0 -149
  915. package/scripts/final-soup-run.py +0 -192
  916. package/scripts/final-soup-watch.py +0 -83
  917. package/scripts/i18n-codemod.mjs +0 -173
  918. package/scripts/i18n-fix-en.py +0 -28
  919. package/scripts/i18n-fix-en2.py +0 -31
  920. package/scripts/i18n-merge.mjs +0 -191
  921. package/scripts/migrate-local-time.mjs +0 -123
  922. package/scripts/omp-real-test.py +0 -328
  923. package/scripts/team-plugins-api-smoke.mjs +0 -149
  924. package/scripts/test-a2a-relay.mjs +0 -222
  925. package/scripts/test-aml-integration.ts +0 -159
  926. package/scripts/test-aml-job.ts +0 -174
  927. package/scripts/test-aml-unit.ts +0 -184
  928. package/scripts/test-api-client.ts +0 -108
  929. package/scripts/test-api-suite.mjs +0 -271
  930. package/scripts/test-block-consumption.mjs +0 -194
  931. package/scripts/test-cmd-render.mjs +0 -218
  932. package/scripts/test-collab-omp.mjs +0 -192
  933. package/scripts/test-config-precedence.ts +0 -124
  934. package/scripts/test-context-governor.ts +0 -176
  935. package/scripts/test-daq-frames.ts +0 -180
  936. package/scripts/test-daq-minio.ts +0 -77
  937. package/scripts/test-dedup-logic.ts +0 -132
  938. package/scripts/test-e2e-collaboration.ts +0 -262
  939. package/scripts/test-e2e-monitor.ts +0 -192
  940. package/scripts/test-event-history.ts +0 -112
  941. package/scripts/test-exec-modes.ts +0 -316
  942. package/scripts/test-fifo-realtime.mjs +0 -193
  943. package/scripts/test-final-e2e.mjs +0 -290
  944. package/scripts/test-goal-summary.ts +0 -202
  945. package/scripts/test-harness-liveness.ts +0 -109
  946. package/scripts/test-harness-terminal.ts +0 -164
  947. package/scripts/test-header-trail.mjs +0 -95
  948. package/scripts/test-hitl.ts +0 -360
  949. package/scripts/test-koda-restyle.mjs +0 -105
  950. package/scripts/test-lane-raw.ts +0 -67
  951. package/scripts/test-lanes-history-render.mjs +0 -138
  952. package/scripts/test-loop-omp.mjs +0 -154
  953. package/scripts/test-mdlite.ts +0 -53
  954. package/scripts/test-memory-brief-chronicle.ts +0 -180
  955. package/scripts/test-memory-rrf-mmr.ts +0 -114
  956. package/scripts/test-mock-collab.mjs +0 -226
  957. package/scripts/test-modern-render.mjs +0 -174
  958. package/scripts/test-omp-terminal.mjs +0 -187
  959. package/scripts/test-plugin-ext.ts +0 -173
  960. package/scripts/test-prompts-loader.ts +0 -56
  961. package/scripts/test-real-scenario.mjs +0 -290
  962. package/scripts/test-stream-render.ts +0 -37
  963. package/scripts/test-task-drawer.mjs +0 -204
  964. package/scripts/test-task-invariants.mjs +0 -169
  965. package/scripts/test-town-3d.mjs +0 -121
  966. package/scripts/test-town-layout.mjs +0 -200
  967. package/scripts/test-town-page.mjs +0 -136
  968. package/scripts/test-town-scene-math.ts +0 -169
  969. package/scripts/test-town-twin.mjs +0 -121
  970. package/scripts/test-town-upload.mjs +0 -89
  971. package/scripts/test-town-user-flow.mjs +0 -619
  972. package/scripts/test-town-world.mjs +0 -76
  973. package/scripts/test-town-wuwa.mjs +0 -198
  974. package/scripts/test-user-isolation.mjs +0 -193
  975. package/scripts/test-workshop-entries.ts +0 -370
  976. package/scripts/test-workspace-api.ts +0 -329
  977. package/scripts/test-ws-aep.mjs +0 -187
  978. package/scripts/test-ws-protocol.ts +0 -134
  979. package/scripts/town-demo-seed.mjs +0 -75
  980. package/scripts/town-scene-clear.mjs +0 -56
  981. package/scripts/verify-exec-modes-report.ts +0 -248
  982. package/scripts/verify-lead-mail.ts +0 -188
  983. package/scripts/verify-page-smoke.mjs +0 -87
  984. package/scripts/ws-test.mjs +0 -176
  985. package/scripts/ws-test.py +0 -4
@@ -1,107 +0,0 @@
1
- /** 一次性:产线运营全链路审计(mock 自定义模板/节点绑定/实时读数/设参/开跑门控/逐样本打标/产品隔离查询/停止) */
2
- const TOKEN = process.env.DAQ_TOKEN ?? 'ut-ffc1dfbbc0c1444c87c1ec69a9e8208c'
3
- const ROOT = (process.env.DAQ_BASE ?? 'http://127.0.0.1:3000')
4
- const DCW = ROOT + '/api/workshop/dcw'
5
- const DAQ = ROOT + '/api/workshop/daq'
6
- const DEV = ROOT + '/api/workshop/device-twins'
7
- const H = { authorization: `Bearer ${TOKEN}`, 'content-type': 'application/json' }
8
- const fail = (m) => { console.error('FAIL:', m); process.exitCode = 1 }
9
- const sleep = (ms) => new Promise(r => setTimeout(r, ms))
10
- const jpost = (u, b) => fetch(u, { method: 'POST', headers: H, body: JSON.stringify(b) }).then(r => r.json())
11
- const jdel = (u) => fetch(u, { method: 'DELETE', headers: H }).then(r => r.json())
12
-
13
- // ===== 1. mock 自定义模板(数采 + 智控) =====
14
- const daqTpl = (await jpost(DAQ + '/templates', { name: '线审计-厚度', unit: 'um', min: 30, max: 60, decimals: 1, icon: 'gateway', ch: '膜厚' })).data.template
15
- const dcwTpl = (await jpost(DCW + '/templates', { name: '线审计-厚度设定', unit: 'um', min: 30, max: 60, decimals: 1, icon: 'gateway', ch: '膜厚设定' })).data.template
16
- console.log('templates:', daqTpl?.key, dcwTpl?.key)
17
- if (!daqTpl || !dcwTpl) { console.error('FAIL: create templates'); process.exit(1) }
18
-
19
- // ===== 1.5 产线夹具(节点挂线;逐产线门控) =====
20
- const { makeLineFixture } = await import('./_lib-dcw-line.mjs')
21
- const fx = await makeLineFixture(ROOT, H, '线审计产线A')
22
-
23
- // ===== 2. 节点 + 设备绑定(mock 驱动) =====
24
- const devList = (await fetch(DEV, { headers: H }).then(r => r.json())).data?.twins ?? []
25
- const dev = devList.find(t => t.kind !== 'daq' && typeof t.posX === 'number')
26
- if (!dev) { console.error('FAIL: no device twin for binding'); process.exit(1) }
27
- const dq = (await jpost(DAQ, { templateRef: `daq-${daqTpl.key}`, name: '线审计-厚度通道', intervalMs: 500, posX: dev.posX + 40, posZ: dev.posZ + 40, lineId: fx.line.id })).data.node
28
- const dw = (await jpost(DCW, { templateRef: `dcw-${dcwTpl.key}`, name: '线审计-厚度设定', posX: dev.posX - 40, posZ: dev.posZ - 40 })).data.node
29
- await jpost(`${DAQ}/${dq.id}/bind`, { deviceId: dev.id })
30
- await jpost(`${DCW}/${dw.id}/bind`, { deviceId: dev.id })
31
- const daqNode = (await fetch(DAQ, { headers: H }).then(r => r.json())).data.nodes.find(n => n.id === dq.id)
32
- const dcwNode = (await fetch(DCW, { headers: H }).then(r => r.json())).data.nodes.find(n => n.id === dw.id)
33
- console.log('bound:', daqNode?.deviceBindingId === dev.id, dcwNode?.deviceBindingId === dev.id)
34
- if (daqNode?.deviceBindingId === dev.id && dcwNode?.deviceBindingId === dev.id) console.log('PASS daq+dcw nodes bound to same device')
35
- else fail('bind failed')
36
-
37
- // ===== 3. 设参(mock;写控制不受产线门控) =====
38
- const w = await jpost(`${DCW}/${dw.id}/write`, { value: 45 })
39
- if (w.data?.outcome?.ok) console.log('PASS set control param 45um (mock PLC ACK)')
40
- else fail(`write failed: ${JSON.stringify(w).slice(0, 100)}`)
41
-
42
- // ===== 4. 产品/配方 + 开跑门控(逐产线) =====
43
- const prod = (await jpost(DCW + '/products', { name: '线审计产品A', description: '隔离验证', lineId: fx.line.id })).data.product
44
- const rc = (await jpost(DCW + '/recipes', { productId: prod.id, name: '线审计配方', params: [{ templateRef: `dcw-${dcwTpl.key}`, nodeId: dw.id, value: 45 }] })).data.recipe
45
- // 4.1 未知配方开跑 → 404
46
- const g1 = await fx.start('rc-nonexist')
47
- if (g1.code === 'NOT_FOUND') console.log('PASS start gating: unknown recipe rejected')
48
- else fail(`gating unknown recipe: ${g1.code}`)
49
- // 4.2 空参数配方 → 400
50
- const rcEmpty = (await jpost(DCW + '/recipes', { productId: prod.id, name: '空参数配方', params: [] })).data.recipe
51
- const g2 = await fx.start(rcEmpty.id)
52
- if (g2.code === 'VALIDATION_ERROR') console.log('PASS start gating: recipe without params rejected ——', (g2.message ?? '').slice(0, 24))
53
- else fail(`gating empty recipe: ${g2.code}`)
54
-
55
- // ===== 5. 开跑:参数下发 + 窗口打标 =====
56
- const st = await fx.start(rc.id)
57
- console.log('line start:', st.data?.run?.id, '| recipe applied:', JSON.stringify(st.data?.run?.results?.[0]?.ok))
58
- if (st.data?.line?.active && st.data?.run?.results?.[0]?.ok === true) console.log('PASS line started with recipe applied')
59
- else fail(`line start wrong: ${JSON.stringify(st).slice(0, 160)}`)
60
- // 重复开跑 → 409
61
- const again = await fx.start(rc.id)
62
- if (again.code === 'CONFLICT') console.log('PASS double-start rejected (409)')
63
- else fail(`double start: ${again.code}`)
64
-
65
- await sleep(3500) // 收集打标样本(500ms 通道)
66
- // 实时读数(产线开跑后;门控语义:配方驱动采集)
67
- const live = (await fetch(DAQ, { headers: H }).then(r => r.json())).data.nodes.find(n => n.id === dq.id)
68
- console.log('live value:', live?.value, live?.state)
69
- if (live?.value != null && live?.state !== 'offline') console.log('PASS real-time daq reading flowing (recipe-driven)')
70
- else fail('no live reading while line active')
71
-
72
- // ===== 6. 逐样本打标验证:按产品+配方+参数查询,数据必须归属本产品 =====
73
- const q = await fetch(`${DCW}/line/query?productId=${prod.id}&recipeId=${rc.id}&paramKey=${daqTpl.key}&from=${Date.now() - 60_000}&to=${Date.now()}&bucketMs=1000`, { headers: H }).then(r => r.json())
74
- const ch = q.data?.channels?.find(c => c.nodeId === dq.id)
75
- console.log(`tagged query: channels=${q.data?.channels?.length}, points on target=${ch?.points?.length}`)
76
- if ((ch?.points?.length ?? 0) > 0) console.log('PASS tagged samples queryable by product+recipe+param')
77
- else fail(`tagged query empty: ${JSON.stringify(q).slice(0, 160)}`)
78
-
79
- // 6.2 换一个不存在的产品查询 → 空(隔离)
80
- const q2 = await fetch(`${DCW}/line/query?productId=pd-nonexist&from=${Date.now() - 60_000}&to=${Date.now()}`, { headers: H }).then(r => r.json())
81
- if ((q2.data?.channels ?? []).length === 0) console.log('PASS isolation: other product sees no data')
82
- else fail(`isolation broken: ${q2.data.channels.length} channels leaked`)
83
-
84
- // ===== 7. 停止:窗口封闭,新样本不再打标 =====
85
- const sp = await fx.stop()
86
- if (sp.data?.run?.endedAt) console.log('PASS line stopped, run sealed:', sp.data.run.endedAt)
87
- else fail('stop failed')
88
- await sleep(1600)
89
- const q3 = await fetch(`${DCW}/line/query?productId=${prod.id}&from=${Date.now() - 120_000}&to=${Date.now()}&bucketMs=1000`, { headers: H }).then(r => r.json())
90
- const pts3 = q3.data?.channels?.find(c => c.nodeId === dq.id)?.points ?? []
91
- const lastAt = pts3.length ? Math.max(...pts3.map(p => p.at)) : 0
92
- const stopAt = Date.parse(sp.data.run.endedAt)
93
- if (lastAt <= stopAt + 1500) console.log(`PASS post-stop samples untagged (last tagged ${lastAt - stopAt}ms before/at stop)`)
94
- else fail(`samples tagged after stop: +${lastAt - stopAt}ms`)
95
-
96
- // ===== 清理 =====
97
- await jdel(`${DAQ}/${dq.id}`)
98
- await jdel(`${DCW}/${dw.id}`)
99
- await jdel(`${DCW}/recipes/${rc.id}`)
100
- await jdel(`${DCW}/recipes/${rcEmpty.id}`)
101
- await jdel(`${DCW}/products/${prod.id}`)
102
- await jdel(`${DAQ}/templates/${daqTpl.key}`)
103
- await jdel(`${DCW}/templates/${dcwTpl.key}`)
104
- await fx.cleanup()
105
- console.log('cleanup done')
106
- console.log(process.exitCode ? 'AUDIT FAILED' : 'AUDIT ALL PASS')
107
- process.exit(process.exitCode ?? 0)
@@ -1,161 +0,0 @@
1
- /**
2
- * 一次性审计:控制暂停门控 + 自定义控制模板(产线管理界面新功能全链路)。
3
- *
4
- * A. 自定义模板:POST /dcw/templates 创建 → GET /dcw 载荷可见(向导下拉数据源)
5
- * → 从自定义模板建节点继承域(单位/量程/小数位)。
6
- * B. 节点级控制暂停:PATCH enabled → 写拒绝(409「当前节点暂停」)→ 配方下发部分失败
7
- * 隔离 → 恢复后写 ACK;WS dcw.node.changed 状态同步帧断言。
8
- * C. 网关全局暂停(暂停全部控制):stop → 写/配方/开跑全拒绝(「控制网关已暂停」)
9
- * → start 恢复。收尾恢复 running=true 并清理全部夹具。
10
- */
11
- const TOKEN = process.env.DAQ_TOKEN ?? 'ut-ffc1dfbbc0c1444c87c1ec69a9e8208c'
12
- const ROOT = process.env.DAQ_BASE ?? 'http://127.0.0.1:3000'
13
- const DCW = ROOT + '/api/workshop/dcw'
14
- const H = { authorization: `Bearer ${TOKEN}`, 'content-type': 'application/json' }
15
- const fail = (m) => { console.error('FAIL:', m); process.exitCode = 1 }
16
- const sleep = (ms) => new Promise(r => setTimeout(r, ms))
17
- const jget = (u) => fetch(ROOT + u, { headers: H }).then(r => r.json())
18
- const jpost = (u, b) => fetch(ROOT + u, { method: 'POST', headers: H, body: JSON.stringify(b ?? {}) }).then(r => r.json())
19
- const jpatch = (u, b) => fetch(ROOT + u, { method: 'PATCH', headers: H, body: JSON.stringify(b ?? {}) }).then(r => r.json())
20
- const jdel = (u) => fetch(ROOT + u, { method: 'DELETE', headers: H }).then(r => r.json())
21
- const SFX = Math.random().toString(36).slice(2, 7)
22
-
23
- // ===== 0. 健康检查 =====
24
- const health = await jget('/api/workshop/dcw')
25
- if (health.code !== 0) { console.error('FAIL: dev server / dcw api 不可达:', health.message); process.exit(1) }
26
- console.log('PASS dcw api reachable; nodes:', health.data.nodes.length)
27
-
28
- // ===== 1. 自定义控制模板:创建 → 目录可见 =====
29
- const tplName = `暂停审计-扭矩设定-${SFX}`
30
- const tplRes = await jpost('/api/workshop/dcw/templates', {
31
- name: tplName, ch: '主轴扭矩', code: `SPindle · T-${SFX}`, unit: 'N·m',
32
- min: 10, max: 50, decimals: 1, icon: 'encoder', semantics: '审计夹具:主轴扭矩设定,调整需小步幅。',
33
- })
34
- const tpl = tplRes.data?.template
35
- if (tpl && tpl.key.startsWith('cw-') && tpl.builtin === false) console.log('PASS custom template created:', tpl.key)
36
- else { console.error('FAIL create template:', JSON.stringify(tplRes).slice(0, 160)); process.exit(1) }
37
- const dir = await jget('/api/workshop/dcw')
38
- const tplInDir = dir.data.templates.find(t => t.key === tpl.key)
39
- if (tplInDir) console.log('PASS custom template in directory (向导下拉数据源)')
40
- else fail('custom template missing from directory payload')
41
-
42
- // ===== 2. 从自定义模板建节点(未挂线,避开产线联锁) =====
43
- const nodeRes = await jpost('/api/workshop/dcw', { templateRef: `dcw-${tpl.key}`, name: `暂停审计-扭矩节点-${SFX}` })
44
- const node = nodeRes.data?.node
45
- if (node && node.min === 10 && node.max === 50 && node.unit === 'N·m' && node.decimals === 1 && node.enabled === true) {
46
- console.log('PASS node created from custom template (domain inherited, enabled default)')
47
- } else { fail(`node domain wrong: ${JSON.stringify(nodeRes).slice(0, 200)}`); process.exit(1) }
48
-
49
- // ===== 3. 启用态写 → ACK =====
50
- const w1 = await jpost(`/api/workshop/dcw/${node.id}/write`, { value: 30 })
51
- if (w1.data?.outcome?.ok === true) console.log('PASS write ACK while enabled (value 30 N·m)')
52
- else fail(`baseline write failed: ${JSON.stringify(w1).slice(0, 160)}`)
53
-
54
- // ===== 4. 暂停节点:PATCH enabled=false → 状态同步 offline =====
55
- await jpatch(`/api/workshop/dcw/${node.id}`, { enabled: false })
56
- let view = (await jget('/api/workshop/dcw')).data.nodes.find(n => n.id === node.id)
57
- if (view?.enabled === false && view?.state === 'offline') console.log('PASS paused: enabled=false, state=offline (REST 权威)')
58
- else fail(`pause state wrong: ${JSON.stringify(view && { enabled: view.enabled, state: view.state })}`)
59
-
60
- // ===== 5. 暂停态写 → 409「当前节点暂停」 =====
61
- const w2 = await jpost(`/api/workshop/dcw/${node.id}/write`, { value: 31 })
62
- if (w2.code === 'CONFLICT' && (w2.message ?? '').includes('当前节点暂停')) {
63
- console.log('PASS paused write rejected 409 「当前节点暂停」')
64
- } else fail(`paused write not gated: ${JSON.stringify(w2).slice(0, 160)}`)
65
-
66
- // ===== 6. 配方下发路径:暂停节点参数记失败不阻塞其余(部分失败隔离) =====
67
- const prod = (await jpost('/api/workshop/dcw/products', { name: `暂停审计产品-${SFX}` })).data?.product
68
- const rc = (await jpost('/api/workshop/dcw/recipes', { productId: prod.id, name: `暂停审计配方-${SFX}`, params: [{ nodeId: node.id, value: 32 }] })).data?.recipe
69
- const apply1 = await jpost(`/api/workshop/dcw/recipes/${rc.id}/apply`)
70
- const r0 = apply1.data?.run?.results?.[0]
71
- if (r0 && r0.ok === false && (r0.message ?? '').includes('当前节点暂停') && r0.nodeId === node.id) {
72
- console.log('PASS recipe apply: paused node param failed with 「当前节点暂停」(isolated)')
73
- } else fail(`recipe gating wrong: ${JSON.stringify(apply1).slice(0, 200)}`)
74
-
75
- // ===== 7. 恢复控制 → 状态回待机,写恢复 ACK =====
76
- await jpatch(`/api/workshop/dcw/${node.id}`, { enabled: true })
77
- view = (await jget('/api/workshop/dcw')).data.nodes.find(n => n.id === node.id)
78
- const w3 = await jpost(`/api/workshop/dcw/${node.id}/write`, { value: 33 })
79
- if (view?.enabled === true && view?.state !== 'offline' && w3.data?.outcome?.ok === true) {
80
- console.log('PASS resumed: state back (idle/ok), write ACK again')
81
- } else fail(`resume wrong: state=${view?.state}, write=${JSON.stringify(w3).slice(0, 120)}`)
82
-
83
- // ===== 8. WS 状态同步:dcw.node.changed 帧直推 enabled 变更 =====
84
- const chans = (await jget('/api/workshop/channels')).data ?? []
85
- const chanId = chans[0]?.id
86
- if (chanId) {
87
- const ws = new WebSocket(`ws://127.0.0.1:3000/api/workshop/ws?channelId=${chanId}&token=${TOKEN}`)
88
- const frames = []
89
- ws.onmessage = (ev) => { try { frames.push(JSON.parse(String(ev.data))) } catch { /* 忽略 */ } }
90
- await new Promise((res, rej) => {
91
- ws.onopen = res
92
- ws.onerror = () => rej(new Error('ws connect failed'))
93
- setTimeout(() => rej(new Error('ws open timeout')), 8000)
94
- })
95
- await sleep(600) // 等快照对齐
96
- await jpatch(`/api/workshop/dcw/${node.id}`, { enabled: false })
97
- let gotPause = false
98
- for (let i = 0; i < 20 && !gotPause; i++) {
99
- await sleep(250)
100
- gotPause = frames.some(f => f.type === 'dcw.node.changed' && f.payload?.node?.id === node.id && f.payload?.node?.enabled === false)
101
- }
102
- await jpatch(`/api/workshop/dcw/${node.id}`, { enabled: true })
103
- let gotResume = false
104
- for (let i = 0; i < 20 && !gotResume; i++) {
105
- await sleep(250)
106
- gotResume = frames.some(f => f.type === 'dcw.node.changed' && f.payload?.node?.id === node.id && f.payload?.node?.enabled === true)
107
- }
108
- ws.close()
109
- if (gotPause && gotResume) console.log('PASS WS sync: dcw.node.changed frames pushed enabled=false/true')
110
- else fail(`WS sync frames missing: pause=${gotPause} resume=${gotResume}`)
111
- } else {
112
- console.log('SKIP WS sync assertion(无可见 channel);REST 权威态已在第 4/7 步断言')
113
- }
114
-
115
- // ===== 9. 网关全局暂停(暂停全部控制) =====
116
- let ctl = (await jpost('/api/workshop/dcw/controller', { action: 'stop' })).data?.controller
117
- if (ctl?.running === false && ctl?.nodesOnline === 0) console.log('PASS gateway stopped: running=false, nodesOnline=0')
118
- else fail(`gateway stop wrong: ${JSON.stringify(ctl)}`)
119
- const w4 = await jpost(`/api/workshop/dcw/${node.id}/write`, { value: 34 })
120
- if (w4.code === 'CONFLICT' && (w4.message ?? '').includes('控制网关已暂停')) {
121
- console.log('PASS gateway-paused write rejected (暂停全部控制现在真正拦截下发)')
122
- } else fail(`gateway write gate wrong: ${JSON.stringify(w4).slice(0, 160)}`)
123
- const apply2 = await jpost(`/api/workshop/dcw/recipes/${rc.id}/apply`)
124
- const r1 = apply2.data?.run?.results?.[0]
125
- if (r1 && r1.ok === false && (r1.message ?? '').includes('控制网关已暂停')) {
126
- console.log('PASS gateway-paused recipe apply rejected')
127
- } else fail(`gateway recipe gate wrong: ${JSON.stringify(apply2).slice(0, 200)}`)
128
-
129
- // ===== 10. 网关暂停时开跑门控 =====
130
- const { makeLineFixture } = await import('./_lib-dcw-line.mjs')
131
- const fx = await makeLineFixture(ROOT, H, `暂停审计线-${SFX}`)
132
- const prod2 = (await jpost('/api/workshop/dcw/products', { name: `暂停审计产品B-${SFX}`, lineId: fx.line.id })).data?.product
133
- const rc2 = (await jpost('/api/workshop/dcw/recipes', { productId: prod2.id, name: `暂停审计配方B-${SFX}`, params: [{ nodeId: node.id, value: 35 }] })).data?.recipe
134
- const g1 = await fx.start(rc2.id)
135
- if (g1.code === 'CONFLICT' && (g1.message ?? '').includes('控制网关已暂停')) {
136
- console.log('PASS line start gated while gateway paused')
137
- } else fail(`line start gate wrong: ${JSON.stringify(g1).slice(0, 160)}`)
138
- await fx.cleanup()
139
-
140
- // ===== 11. 恢复全部控制 → 写恢复 ACK =====
141
- ctl = (await jpost('/api/workshop/dcw/controller', { action: 'start' })).data?.controller
142
- view = (await jget('/api/workshop/dcw')).data.nodes.find(n => n.id === node.id)
143
- const w5 = await jpost(`/api/workshop/dcw/${node.id}/write`, { value: 36 })
144
- if (ctl?.running === true && view?.state !== 'offline' && w5.data?.outcome?.ok === true) {
145
- console.log('PASS gateway resumed: enabled node back online, write ACK')
146
- } else fail(`gateway resume wrong: ${JSON.stringify({ ctl, state: view?.state, w: w5.message ?? w5.data?.outcome?.message }).slice(0, 200)}`)
147
-
148
- // ===== 清理:夹具全删 + 网关确保 running =====
149
- await jdel(`/api/workshop/dcw/recipes/${rc.id}`)
150
- await jdel(`/api/workshop/dcw/products/${prod.id}`)
151
- await jdel(`/api/workshop/dcw/${node.id}`)
152
- await jdel(`/api/workshop/dcw/templates/${tpl.key}`)
153
- const after = await jget('/api/workshop/dcw')
154
- const cleaned = !after.data.templates.some(t => t.key === tpl.key) && !after.data.nodes.some(n => n.id === node.id)
155
- if (cleaned) console.log('PASS cleanup: fixtures removed')
156
- else fail('cleanup incomplete')
157
- const finalCtl = after.data.controller
158
- if (finalCtl.running === true) console.log('PASS final: gateway running=true (环境还原)')
159
- else { await jpost('/api/workshop/dcw/controller', { action: 'start' }); fail('gateway was left stopped — restored') }
160
-
161
- console.log(process.exitCode ? '\n=== AUDIT FAILED ===' : '\n=== ALL PASS ===')
@@ -1,175 +0,0 @@
1
- /**
2
- * 一次性审计:产线详情页(/dcw/{id})新增 UI 端到端。
3
- * ①「添加控制模板」button → Modal 填表创建自定义模板 → 成功提示 + chips 出现
4
- * → 「添加控制节点」向导自动选中新模板(数据源同 store)。
5
- * ② 节点行「控制」开关:暂停 → 行转已暂停 + 下发禁用 + 服务端 enabled=false
6
- * → 恢复 → 控制中 + 可写。截图留档,清理夹具。
7
- */
8
- import puppeteer from 'puppeteer-core'
9
-
10
- const TOKEN = process.env.DAQ_TOKEN ?? 'ut-ffc1dfbbc0c1444c87c1ec69a9e8208c'
11
- const ROOT = 'http://127.0.0.1:3000'
12
- const H = { authorization: `Bearer ${TOKEN}`, 'content-type': 'application/json' }
13
- const SFX = Math.random().toString(36).slice(2, 7)
14
- const TPL_NAME = `UI审计模板-${SFX}`
15
- const fail = (msg) => { console.error('FAIL:', msg); process.exitCode = 1 }
16
- const sleep = ms => new Promise(r => setTimeout(r, ms))
17
-
18
- // 选一条控制节点最多的产线(保证节点表有行可验开关)
19
- const lines = (await fetch(`${ROOT}/api/workshop/dcw`, { headers: H }).then(r => r.json())).data
20
- const nodeCountByLine = new Map()
21
- for (const n of lines.nodes) nodeCountByLine.set(n.lineId, (nodeCountByLine.get(n.lineId) ?? 0) + 1)
22
- const target = lines.lines
23
- .map(l => ({ id: l.id, name: l.name, nodes: nodeCountByLine.get(l.id) ?? 0 }))
24
- .sort((a, b) => b.nodes - a.nodes)[0]
25
- if (!target || target.nodes === 0) { console.error('FAIL: 没有带控制节点的产线可验'); process.exit(1) }
26
- console.log('target line:', target.name, `(${target.nodes} nodes)`)
27
-
28
- const browser = await puppeteer.launch({
29
- executablePath: 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe',
30
- headless: 'new',
31
- args: ['--no-sandbox', '--disable-gpu', '--window-size=1600,1200'],
32
- })
33
- const page = await browser.newPage()
34
- await page.setViewport({ width: 1600, height: 1200 })
35
- await page.setCookie({ name: 'token', value: TOKEN, domain: '127.0.0.1', path: '/' })
36
- await page.goto(`${ROOT}/dcw/${target.id}`, { waitUntil: 'domcontentloaded', timeout: 60000 })
37
- await sleep(4000)
38
-
39
- // ===== 1. 「添加控制模板」按钮存在 → 点击开弹窗(hydration 就绪前重试) =====
40
- let modalUp = false
41
- for (let i = 0; i < 8 && !modalUp; i++) {
42
- const clicked = await page.evaluate(() => {
43
- const b = [...document.querySelectorAll('button')].find(x => x.textContent.includes('添加控制模板'))
44
- if (!b) return false
45
- b.click()
46
- return true
47
- })
48
- if (!clicked) { await sleep(800); continue }
49
- await sleep(500)
50
- modalUp = await page.evaluate(() => {
51
- const m = document.querySelector('.modal')
52
- return !!m && m.textContent.includes('添加控制节点模板') && m.textContent.includes('新建自定义模板')
53
- })
54
- if (!modalUp) await sleep(600)
55
- }
56
- if (modalUp) console.log('PASS 添加控制模板 modal opened')
57
- else { fail('template modal did not open'); await page.screenshot({ path: 'docs/audit/screenshots/dcw-pause-ui-fail.png' }); await browser.close(); process.exit(1) }
58
-
59
- // ===== 2. 填表创建自定义模板 =====
60
- await page.evaluate((name) => {
61
- const modal = document.querySelector('.modal')
62
- const grid = modal.querySelector('.f-grid.tpl-form')
63
- const inputs = [...grid.querySelectorAll('input.inp')]
64
- const setter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, 'value').set
65
- const set = (el, v) => { setter.call(el, String(v)); el.dispatchEvent(new Event('input', { bubbles: true })) }
66
- set(inputs[0], name) // 名称
67
- set(inputs[1], '测试扭矩') // 参数语义
68
- set(inputs[2], `SPINDLE · T-${name.slice(-5)}`) // 位号代号
69
- set(inputs[3], 'N·m') // 单位
70
- set(inputs[4], '10') // 量程下限
71
- set(inputs[5], '50') // 量程上限
72
- set(inputs[6], '1') // 小数位
73
- }, TPL_NAME)
74
- await sleep(250) // v-model nextTick(输入+点击分两拍)
75
- await page.evaluate(() => {
76
- const m = document.querySelector('.modal')
77
- ;[...m.querySelectorAll('button')].find(b => b.textContent.includes('创建模板'))?.click()
78
- })
79
- await sleep(900)
80
- const created = await page.evaluate((name) => {
81
- const m = document.querySelector('.modal')
82
- return {
83
- okBanner: m.querySelector('.banner.good')?.textContent ?? '',
84
- chip: [...m.querySelectorAll('.tpl-chip')].some(c => c.textContent.includes(name) && c.textContent.includes('自定义')),
85
- }
86
- }, TPL_NAME)
87
- if (created.okBanner.includes(TPL_NAME) && created.okBanner.includes('已创建')) console.log('PASS template created with success banner')
88
- else fail(`creation banner wrong: "${created.okBanner.trim()}"`)
89
- if (created.chip) console.log('PASS new template visible in modal chips (自定义 tag)')
90
- else fail('new template chip missing')
91
- await page.screenshot({ path: 'docs/audit/screenshots/dcw-pause-ui-tpl-modal.png' })
92
-
93
- // ===== 3. 向导自动选中新模板 =====
94
- await page.evaluate(() => {
95
- const m = document.querySelector('.modal')
96
- ;[...m.querySelectorAll('button')].find(b => b.textContent.trim() === '关闭')?.click()
97
- })
98
- await sleep(300)
99
- const wizardSel = await page.evaluate((name) => {
100
- ;[...document.querySelectorAll('button')].find(x => x.textContent.includes('添加控制节点') && !x.textContent.includes('模板'))?.click()
101
- return new Promise((resolve) => {
102
- setTimeout(() => {
103
- const m = document.querySelector('.modal')
104
- const sel = m?.querySelector('.f-grid select.inp')
105
- resolve(sel ? sel.selectedOptions[0]?.textContent ?? '' : '(no modal)')
106
- }, 400)
107
- })
108
- }, TPL_NAME)
109
- if (wizardSel.includes(TPL_NAME)) console.log('PASS add-node wizard auto-selected the new template')
110
- else fail(`wizard selection wrong: "${wizardSel.trim()}"`)
111
- await page.evaluate(() => document.querySelector('.modal-mask')?.click())
112
- await sleep(300)
113
-
114
- // ===== 4. 节点「控制」开关:暂停 → 已暂停 + 下发禁用 + 服务端同步 =====
115
- const toggle1 = await page.evaluate(() => {
116
- const rows = [...document.querySelectorAll('.nodes-table tbody tr')].filter(r => r.querySelector('.ctrl-toggle'))
117
- const row = rows[0]
118
- if (!row) return null
119
- const before = row.querySelector('.ctrl-toggle').textContent.trim()
120
- row.querySelector('.ctrl-toggle').click()
121
- return { before, rowIndex: 0, lineNodeCount: rows.length }
122
- })
123
- if (!toggle1) { fail('no node row with ctrl-toggle found'); await browser.close(); process.exit(1) }
124
- await sleep(800)
125
- const afterPause = await page.evaluate(() => {
126
- const row = [...document.querySelectorAll('.nodes-table tbody tr')].find(r => r.querySelector('.ctrl-toggle'))
127
- return {
128
- btn: row.querySelector('.ctrl-toggle').textContent.trim(),
129
- pill: row.querySelector('.st-pill')?.textContent.trim() ?? '',
130
- inputDisabled: row.querySelector('.write-inp')?.disabled ?? null,
131
- writeBtnDisabled: row.querySelector('.write-btn')?.disabled ?? null,
132
- }
133
- })
134
- // 行序 = store 序 = 本产线 API 节点序(行内 id 是 slice(0,8) 截断展示,不能反查)
135
- const lineNodesApi = (await fetch(`${ROOT}/api/workshop/dcw`, { headers: H }).then(r => r.json())).data.nodes
136
- .filter(n => n.lineId === target.id)
137
- const serverView = lineNodesApi[toggle1.rowIndex]
138
- if (toggle1.before === '控制中' && afterPause.btn === '已暂停' && afterPause.pill === '已暂停'
139
- && afterPause.inputDisabled === true && afterPause.writeBtnDisabled === true
140
- && serverView?.enabled === false && serverView?.state === 'offline') {
141
- console.log('PASS node paused: toggle=已暂停, pill=已暂停, 下发禁用, server enabled=false/offline (状态同步)')
142
- } else {
143
- fail(`pause toggle wrong: ${JSON.stringify({ toggle1, afterPause, server: serverView && { enabled: serverView.enabled, state: serverView.state } })}`)
144
- }
145
- await page.screenshot({ path: 'docs/audit/screenshots/dcw-pause-ui-node-paused.png' })
146
-
147
- // ===== 5. 恢复控制 → 控制中 + 可写 =====
148
- await page.evaluate(() => {
149
- const row = [...document.querySelectorAll('.nodes-table tbody tr')].find(r => r.querySelector('.ctrl-toggle'))
150
- row.querySelector('.ctrl-toggle').click()
151
- })
152
- await sleep(800)
153
- const afterResume = await page.evaluate(() => {
154
- const row = [...document.querySelectorAll('.nodes-table tbody tr')].find(r => r.querySelector('.ctrl-toggle'))
155
- return {
156
- btn: row.querySelector('.ctrl-toggle').textContent.trim(),
157
- inputDisabled: row.querySelector('.write-inp')?.disabled ?? null,
158
- }
159
- })
160
- const serverView2 = lineNodesApi[toggle1.rowIndex]
161
- const serverView2Fresh = (await fetch(`${ROOT}/api/workshop/dcw`, { headers: H }).then(r => r.json())).data.nodes
162
- .find(n => n.id === serverView2?.id)
163
- if (afterResume.btn === '控制中' && afterResume.inputDisabled === false && serverView2Fresh?.enabled === true) {
164
- console.log('PASS node resumed: toggle=控制中, 下发可用, server enabled=true')
165
- } else fail(`resume wrong: ${JSON.stringify({ afterResume, server: serverView2Fresh && { enabled: serverView2Fresh.enabled } })}`)
166
-
167
- // ===== 清理:删除 UI 创建的模板 =====
168
- const dir = (await fetch(`${ROOT}/api/workshop/dcw`, { headers: H }).then(r => r.json())).data
169
- const tpl = dir.templates.find(t => t.name === TPL_NAME)
170
- if (tpl) {
171
- await fetch(`${ROOT}/api/workshop/dcw/templates/${tpl.key}`, { method: 'DELETE', headers: H })
172
- console.log('cleanup: template removed')
173
- }
174
- await browser.close()
175
- console.log(process.exitCode ? '\n=== UI AUDIT FAILED ===' : '\n=== UI ALL PASS ===')
@@ -1,13 +0,0 @@
1
- /**
2
- * 一次性检查:dcw_read 进入 hostToolsForRole 工具面(worker/lead)。
3
- * 运行: npx tsx --tsconfig .nuxt/tsconfig.server.json scripts/_dbg-dcw-read-toolface.ts
4
- */
5
- import { hostToolsForRole } from '../server/services/workshop/agents/omp-agent'
6
-
7
- for (const role of ['worker', 'lead'] as const) {
8
- const names = hostToolsForRole(role).map(t => t.name)
9
- const hit = names.includes('dcw_read')
10
- console.log(`${role}: dcw_read ${hit ? '在工具面' : '缺失!'}(${names.length} 个工具)`)
11
- if (role === 'worker' && !hit) process.exit(1)
12
- }
13
- console.log('TOOLFACE PASS')
@@ -1,74 +0,0 @@
1
- /**
2
- * DCW 读写集成 UI 目视验证:/dcw/[line] 节点表「PLC 读数」列(含真实 Modbus 节点)
3
- * + /town 设备卡 ACT 读数行。截图落 .e2e-shots/。
4
- * 运行: node scripts/_dbg-dcw-read-ui.mjs
5
- */
6
- import puppeteer from 'puppeteer-core'
7
- import { mkdirSync } from 'node:fs'
8
-
9
- const ROOT = process.env.E2E_ROOT ?? 'http://127.0.0.1:3000'
10
- const LINE = process.env.LINE ?? 'ln-af002514'
11
- const DEV = '循环泵 #01'
12
- const sleep = ms => new Promise(r => setTimeout(r, ms))
13
- let failed = 0
14
- const check = (name, cond, detail = '') => { console.log(` ${cond ? 'PASS' : 'FAIL'} ${name}${detail ? ` — ${detail}` : ''}`); if (!cond) failed++ }
15
- const shot = async (page, name) => {
16
- mkdirSync('.e2e-shots', { recursive: true })
17
- await page.screenshot({ path: `.e2e-shots/${name}.png` })
18
- }
19
-
20
- const login = await fetch(`${ROOT}/api/users/login`, { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ email: process.env.E2E_USER ?? 'zhangwei@awshop.io', password: process.env.E2E_PASS ?? 'Awshop@123' }) }).then(r => r.json())
21
-
22
- const browser = await puppeteer.launch({ executablePath: 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe', headless: 'new', args: ['--no-sandbox', '--disable-gpu', '--window-size=1600,1000'] })
23
- const page = await browser.newPage()
24
- await page.setViewport({ width: 1600, height: 1000 })
25
- await page.setCookie({ name: 'token', value: login.data.token, domain: '127.0.0.1', path: '/' })
26
- try {
27
- // ① /dcw/[line] 节点表:PLC 读数列 + 读取按钮 + 各节点读数值
28
- await page.goto(`${ROOT}/dcw/${LINE}`, { waitUntil: 'networkidle2', timeout: 90000 })
29
- await page.waitForSelector('.nodes-table tbody tr', { timeout: 30000 })
30
- await sleep(3000)
31
- const head = await page.evaluate(() => [...document.querySelectorAll('.nodes-table th')].map(t => t.textContent.trim()))
32
- check('①表头含「PLC 读数」列', head.some(t => t.includes('PLC 读数')), head.join('|'))
33
- const rows = await page.evaluate(() => [...document.querySelectorAll('.nodes-table tbody tr')].map((tr) => {
34
- const cells = [...tr.querySelectorAll('td')]
35
- const name = tr.querySelector('td b')?.textContent?.trim() ?? ''
36
- return { name, read: cells[4]?.textContent?.replace(/\s+/g, ' ').trim() ?? '', hasReadBtn: !!cells[4]?.querySelector('.read-btn') }
37
- }).filter(r => r.name.includes('读写验证')))
38
- check('①四个测试节点都在行内', rows.length >= 4, rows.map(r => `${r.name}:${r.read}`).join(' | ').slice(0, 160))
39
- check('①行内有「读取」按钮', rows.every(r => r.hasReadBtn) && rows.length > 0)
40
- check('①Modbus 真实节点 ACT 已回填', rows.some(r => r.name.includes('Modbus') && /\d/.test(r.read)), rows.find(r => r.name.includes('Modbus'))?.read)
41
- await shot(page, 'dcw-line-read-column')
42
-
43
- // ② 点「读取」按钮 → 读数刷新(手动读 UI 路径)
44
- const btnOk = await page.evaluate(() => {
45
- const row = [...document.querySelectorAll('.nodes-table tbody tr')].find(tr => tr.textContent?.includes('mock 手动'))
46
- const btn = row?.querySelector('.read-btn')
47
- if (!btn) return false
48
- btn.click()
49
- return true
50
- })
51
- await sleep(1500)
52
- check('②点击「读取」按钮执行手动读', btnOk)
53
-
54
- // ③ /town 设备卡:SET + ACT 两行实时
55
- await page.goto(`${ROOT}/town`, { waitUntil: 'domcontentloaded', timeout: 90000 })
56
- await sleep(20000)
57
- const act = () => page.evaluate((dev) => {
58
- const card = [...document.querySelectorAll('.twin-card')].find(c => c.querySelector('.twin-name')?.textContent?.includes(dev))
59
- const items = card ? [...card.querySelectorAll('.dcw-item')].map(e => ({
60
- set: e.querySelector('.dcw-set')?.textContent?.replace(/\s+/g, '') ?? '',
61
- act: e.querySelector('.dcw-act b')?.textContent?.replace(/\s+/g, '') ?? null,
62
- })) : []
63
- return items
64
- }, DEV)
65
- const a1 = await act()
66
- check('③/town 设备卡出现智控通道(SET)', a1.length > 0, JSON.stringify(a1).slice(0, 120))
67
- check('③通道带 ACT 读数行', a1.some(r => r.act != null && /\d/.test(r.act)), JSON.stringify(a1.map(r => r.act)))
68
- await shot(page, 'town-dcw-act')
69
- }
70
- finally {
71
- await browser.close().catch(() => {})
72
- }
73
- console.log(failed === 0 ? '\nDCW-READ-UI ALL PASS' : `\nDCW-READ-UI FAILED(${failed})`)
74
- process.exit(failed === 0 ? 0 : 1)
@@ -1,72 +0,0 @@
1
- /** 一次性:Town 智控节点场景挂载 + 设定值联动验证(REST 建 dcw 节点 → 场景实例 → 设定值变化) */
2
- import puppeteer from 'puppeteer-core'
3
-
4
- const TOKEN = 'ut-ffc1dfbbc0c1444c87c1ec69a9e8208c'
5
- const H = { authorization: `Bearer ${TOKEN}`, 'content-type': 'application/json' }
6
- const fail = (m) => { console.error('FAIL:', m); process.exitCode = 1 }
7
- const sleep = (ms) => new Promise(r => setTimeout(r, ms))
8
-
9
- const browser = await puppeteer.launch({
10
- executablePath: 'C:/Program Files/Google/Chrome/Application/chrome.exe',
11
- headless: 'new',
12
- args: ['--no-sandbox', '--disable-gpu', '--window-size=1600,1200'],
13
- })
14
- const page = await browser.newPage()
15
- await page.setViewport({ width: 1600, height: 1200 })
16
- await page.setCookie({ name: 'token', value: TOKEN, domain: '127.0.0.1', path: '/' })
17
- await page.goto('http://127.0.0.1:3000/town', { waitUntil: 'domcontentloaded', timeout: 90000 })
18
- for (let i = 0; i < 30; i++) {
19
- if (await page.evaluate(() => (window.__town?.scene?.deviceNodes?.size ?? 0) > 0)) break
20
- await sleep(1000)
21
- }
22
- await sleep(3000)
23
- const before = await page.evaluate(() => window.__town.scene.deviceNodes.size)
24
- console.log('scene devices before:', before)
25
-
26
- // REST 创建 2 个智控节点(带落点)→ townBus dcw.node.changed / 签名 watch 收敛
27
- const made = []
28
- for (const tpl of ['temp-sp', 'speed-sp']) {
29
- const r = await fetch('http://127.0.0.1:3000/api/workshop/dcw', {
30
- method: 'POST',
31
- headers: H,
32
- body: JSON.stringify({ templateRef: `dcw-${tpl}`, posX: 800 + made.length * 130, posZ: 1500 }),
33
- }).then(x => x.json())
34
- if (r.data?.node) made.push(r.data.node)
35
- await sleep(1200) // 等 WS 帧/签名 watch 收敛
36
- }
37
- const afterCreate = await page.evaluate(() => {
38
- const s = window.__town.scene
39
- const dcw = [...s.deviceNodes.values()].filter(d => (d.modelRef ?? '').startsWith('dcw-'))
40
- return { total: s.deviceNodes.size, dcw: dcw.length, ids: dcw.map(d => d.twinId) }
41
- })
42
- console.log('after create:', JSON.stringify(afterCreate))
43
- // 场景可能已有持久化 dcw 节点(示例等用户数据)→ 只要求新建节点全部挂载
44
- if (made.every(m => afterCreate.ids.includes(m.id))) {
45
- console.log(`PASS ${made.length} dcw nodes mounted in town scene`)
46
- }
47
- else fail(`dcw scene mount wrong: ${JSON.stringify(afterCreate)}`)
48
-
49
- // 设定值下发 → dcw.written 帧 → 场景节点 value 收敛(telemetry.value)
50
- await fetch(`http://127.0.0.1:3000/api/workshop/dcw/${made[0].id}/write`, {
51
- method: 'POST', headers: H, body: JSON.stringify({ value: 185 }),
52
- })
53
- await sleep(2000)
54
- const setVal = await page.evaluate((id) => {
55
- const s = window.__town.scene
56
- const d = [...s.deviceNodes.values()].find(x => x.twinId === id)
57
- return d?.telemetry?.value ?? null
58
- }, made[0].id)
59
- console.log('scene telemetry.value after write:', setVal)
60
- if (setVal === 185) console.log('PASS setpoint write reflected in scene node telemetry')
61
- else fail(`setpoint not reflected: ${setVal}`)
62
-
63
- // 清理
64
- for (const n of made) await fetch(`http://127.0.0.1:3000/api/workshop/dcw/${n.id}`, { method: 'DELETE', headers: H })
65
- await sleep(1500)
66
- const cleaned = await page.evaluate(id => ![...window.__town.scene.deviceNodes.values()].some(d => d.twinId === id), made[0].id)
67
- if (cleaned) console.log('PASS dcw node removal converges in scene')
68
- else fail('dcw node not removed from scene')
69
-
70
- await page.screenshot({ path: 'docs/audit/screenshots/town-dcw.png' })
71
- await browser.close()
72
- console.log(process.exitCode ? 'AUDIT FAILED' : 'AUDIT ALL PASS')
@@ -1,14 +0,0 @@
1
- import puppeteer from 'puppeteer-core'
2
- const ROOT = 'http://127.0.0.1:3000'
3
- const sleep = ms => new Promise(r => setTimeout(r, ms))
4
- const login = await fetch(`${ROOT}/api/users/login`, { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ email: process.env.E2E_USER ?? 'zhangwei@awshop.io', password: process.env.E2E_PASS ?? 'Awshop@123' }) }).then(r => r.json())
5
- const browser = await puppeteer.launch({ executablePath: 'C:/Program Files/Google/Chrome/Application/chrome.exe', headless: 'new', args: ['--no-sandbox', '--disable-gpu', '--window-size=1600,1000'] })
6
- const page = await browser.newPage()
7
- await page.setViewport({ width: 1600, height: 1000, deviceScaleFactor: 1.25 })
8
- await page.setCookie({ name: 'token', value: login.data.token, domain: '127.0.0.1', path: '/' })
9
- await page.goto(`${ROOT}/dcw`, { waitUntil: 'domcontentloaded', timeout: 45000 })
10
- await sleep(6000)
11
- const el = await page.$('.page')
12
- await el.screenshot({ path: 'docs/audit/screenshots/redesign0831/dcw-filter2.png' })
13
- await browser.close()
14
- console.log('DONE')