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,108 +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 H = { authorization: `Bearer ${TOKEN}`, 'content-type': 'application/json' }
7
- const fail = (m) => { console.error('FAIL:', m); process.exitCode = 1 }
8
- const sleep = (ms) => new Promise(r => setTimeout(r, ms))
9
- const post = (u, b) => fetch(u, { method: 'POST', headers: H, body: JSON.stringify(b) }).then(r => r.json())
10
- const del = (u) => fetch(u, { method: 'DELETE', headers: H })
11
- const get = (u) => fetch(u, { headers: H }).then(r => r.json())
12
-
13
- // 0) 产线夹具(逐产线门控)
14
- const { makeLineFixture } = await import('./_lib-dcw-line.mjs')
15
- const fx = await makeLineFixture(ROOT, H, '门控审计产线')
16
-
17
- // 1) mock 自定义模板 + 节点 + 双向绑定
18
- const daqTpl = (await post(DAQ + '/templates', { name: '门控-厚度', unit: 'um', min: 30, max: 60, decimals: 1, icon: 'gateway', ch: '膜厚' })).data.template
19
- const dcwTpl = (await post(DCW + '/templates', { name: '门控-厚度设定', unit: 'um', min: 30, max: 60, decimals: 1, icon: 'gateway', ch: '膜厚设定' })).data.template
20
- const devList = (await get(ROOT + '/api/workshop/device-twins')).data?.twins ?? []
21
- const dev = devList.find(t => t.kind !== 'daq' && typeof t.posX === 'number')
22
- const dq = (await post(DAQ, { templateRef: `daq-${daqTpl.key}`, name: '门控-厚度通道', intervalMs: 500, posX: dev.posX + 40, posZ: dev.posZ + 40, lineId: fx.line.id })).data.node
23
- const dw = (await post(DCW, { templateRef: `dcw-${dcwTpl.key}`, name: '门控-厚度设定', posX: dev.posX - 40, posZ: dev.posZ - 40 })).data.node
24
- await post(`${DAQ}/${dq.id}/bind`, { deviceId: dev.id })
25
- await post(`${DCW}/${dw.id}/bind`, { deviceId: dev.id })
26
- const daqN = (await get(DAQ)).data.nodes.find(n => n.id === dq.id)
27
- const dcwN = (await get(DCW)).data.nodes.find(n => n.id === dw.id)
28
- if (daqN?.deviceBindingId === dev.id && dcwN?.deviceBindingId === dev.id) console.log('PASS daq+dcw both bound to device(数字孪生绑定)')
29
- else fail('bind failed')
30
-
31
- // 2) 门控-未开跑:produced 不增(不采样不推流)
32
- const p0 = (await get(DAQ)).data.controller.produced
33
- await sleep(2600)
34
- const p1 = (await get(DAQ)).data.controller.produced
35
- console.log(`gated(idle): produced ${p0} -> ${p1}`)
36
- if (p1 === p0) console.log('PASS no acquisition without active recipe')
37
- else fail(`sampling while line idle: +${p1 - p0}`)
38
-
39
- // 3) 产品/配方管理 + 设定值查看
40
- const prod = (await post(DCW + '/products', { name: '门控审计产品', description: 'recipe mgmt', lineId: fx.line.id })).data.product
41
- const rc = (await post(DCW + '/recipes', {
42
- productId: prod.id,
43
- name: '门控审计配方',
44
- params: [{ templateRef: `dcw-${dcwTpl.key}`, nodeId: dw.id, value: 45 }],
45
- })).data.recipe
46
- const rcList = (await get(DCW)).data.recipes.find(r => r.id === rc.id)
47
- console.log('recipe params(设定值):', JSON.stringify(rcList?.params))
48
- if (rcList?.productId === prod.id && rcList?.params?.[0]?.value === 45 && rcList?.params?.[0]?.nodeId === dw.id) {
49
- console.log('PASS product/recipe mgmt + setpoint viewable (45 um → 指定节点)')
50
- }
51
- else fail('recipe mgmt/setpoint wrong')
52
-
53
- // 4) 开跑:配方下发(节点 value=45)+ 采集启动 + 实时帧
54
- const st = await fx.start(rc.id)
55
- if (!st.data?.line?.active) { fail(`line start: ${JSON.stringify(st).slice(0, 140)}`); process.exit(1) }
56
- const dwApplied = (await get(DCW)).data.nodes.find(n => n.id === dw.id)
57
- console.log('recipe applied to node:', dwApplied?.value, dwApplied?.state)
58
- if (dwApplied?.value === 45 && dwApplied?.state === 'ok') console.log('PASS recipe setpoint applied via line start')
59
- else fail(`apply wrong: ${dwApplied?.value}/${dwApplied?.state}`)
60
-
61
- // WS 实时消费帧(订阅真实频道)
62
- const channels = await get(ROOT + '/api/workshop/channels')
63
- const channelId = channels.data?.[0]?.id
64
- const ws = new WebSocket(ROOT.replace('http', 'ws') + '/api/workshop/ws')
65
- let frames = 0
66
- ws.onmessage = (ev) => {
67
- const f = JSON.parse(ev.data)
68
- if (f.type === 'daq.reading' && f.payload.nodeId === dq.id) frames++
69
- }
70
- ws.onopen = () => ws.send(JSON.stringify({ type: 'sub', channelId, token: TOKEN }))
71
- await sleep(1000)
72
- const p2 = (await get(DAQ)).data.controller.produced
73
- frames = 0
74
- await sleep(3800)
75
- const p3 = (await get(DAQ)).data.controller.produced
76
- ws.close()
77
- console.log(`running: produced +${p3 - p2} in ~3.8s, ws frames on target=${frames}, node value=${(await get(DAQ)).data.nodes.find(n => n.id === dq.id)?.value}`)
78
- if (p3 - p2 >= 3) console.log('PASS acquisition runs while recipe active')
79
- else fail(`no sampling after start: +${p3 - p2}`)
80
- if (frames >= 3) console.log('PASS real-time WS consumption flowing')
81
- else fail(`ws frames low: ${frames}`)
82
-
83
- // 5) 打标数据归产品(隔离)
84
- const q = await get(`${DCW}/line/query?productId=${prod.id}&recipeId=${rc.id}&paramKey=${daqTpl.key}&from=${Date.now() - 60_000}&to=${Date.now()}`)
85
- const pts = q.data?.channels?.find(c => c.nodeId === dq.id)?.points ?? []
86
- if (pts.length >= 3) console.log(`PASS tagged data under product+recipe (${pts.length} points)`)
87
- else fail(`tagged points: ${pts.length}`)
88
-
89
- // 6) 停线:采集即停 + 节点 offline
90
- const sp = await fx.stop()
91
- await sleep(2600)
92
- const p4 = (await get(DAQ)).data.controller.produced
93
- const nodesAfter = (await get(DAQ)).data.nodes.find(n => n.id === dq.id)
94
- console.log(`after stop: produced +${p4 - p3}, node state=${nodesAfter?.state}`)
95
- if (p4 === p3) console.log('PASS acquisition halted after line stop')
96
- else fail(`still sampling after stop: +${p4 - p3}`)
97
-
98
- // cleanup
99
- await del(`${DAQ}/${dq.id}`)
100
- await del(`${DCW}/${dw.id}`)
101
- await del(`${DCW}/recipes/${rc.id}`)
102
- await del(`${DCW}/products/${prod.id}`)
103
- await del(`${DAQ}/templates/${daqTpl.key}`)
104
- await del(`${DCW}/templates/${dcwTpl.key}`)
105
- await fx.cleanup()
106
- console.log('cleanup done')
107
- console.log(process.exitCode ? 'AUDIT FAILED' : 'AUDIT ALL PASS')
108
- process.exit(process.exitCode ?? 0)
@@ -1,144 +0,0 @@
1
- /**
2
- * 一次性 E2E:开跑产线 → 数控/数采/数字孪生三链路活体验证。
3
- * ①REST 开跑(配方参数节点级绑定)→ 控制节点设定值=配方目标(写 ACK/写历史带批次);
4
- * ②数采由配方门控启动:produced 增长、节点实时值随采样变化;
5
- * ③数字孪生面板(/town):callout 数据卡展示实时值,8s 内值变化(WS→townBus→callout 全链);
6
- * ④停线:数采节点 offline、produced 冻结、孪生值收敛 '--'。结束还原环境。
7
- */
8
- import puppeteer from 'puppeteer-core'
9
-
10
- const TOKEN = process.env.DAQ_TOKEN ?? 'ut-ffc1dfbbc0c1444c87c1ec69a9e8208c'
11
- const ROOT = process.env.E2E_ROOT ?? 'http://127.0.0.1:3000'
12
- const H = { authorization: `Bearer ${TOKEN}`, 'content-type': 'application/json' }
13
- const j = (u, m = 'GET', b) => fetch(ROOT + u, { method: m, headers: H, body: b ? JSON.stringify(b) : undefined }).then(r => r.json())
14
- const fail = (msg) => { console.error('FAIL:', msg); process.exitCode = 1 }
15
- const sleep = ms => new Promise(r => setTimeout(r, ms))
16
-
17
- // ===== 选目标产线:同时具备 数采节点 + 控制节点 + 参数级绑定配方 =====
18
- const d = (await j('/api/workshop/dcw')).data
19
- const daqAll = (await j('/api/workshop/daq')).data
20
- const cand = d.lines.map((l) => {
21
- const recipe = d.recipes.find(r => r.lineId === l.id && r.params.length > 0 && r.params.every(p => p.nodeId))
22
- const dcwNodes = d.nodes.filter(n => n.lineId === l.id)
23
- const daqNodes = daqAll.nodes.filter(n => n.lineId === l.id)
24
- return { line: l, recipe, dcwNodes, daqNodes }
25
- }).find(x => x.recipe && x.dcwNodes.length > 0 && x.daqNodes.length > 0)
26
- if (!cand) { console.error('FAIL: 无同时具备 数采/数控/配方 的产线'); process.exit(1) }
27
- const { line, recipe, dcwNodes, daqNodes } = cand
28
- console.log('target:', line.name, '| recipe:', recipe.name, `| dcw×${dcwNodes.length} daq×${daqNodes.length}`)
29
-
30
- // ===== 0. 前置停线 + 基线 =====
31
- await j(`/api/workshop/dcw/lines/${line.id}/stop`, 'POST').catch(() => {})
32
- await sleep(1200)
33
- const produced0 = (await j('/api/workshop/daq')).data.meta.produced
34
- console.log('baseline produced:', produced0, '| daq node:', daqNodes[0].value, daqNodes[0].state)
35
-
36
- // ===== 1. 开跑:配方参数随开跑下发(数控链路) =====
37
- const st = await j(`/api/workshop/dcw/lines/${line.id}/start`, 'POST', { recipeId: recipe.id })
38
- if (!st.data?.line?.active) { console.error('FAIL: line start:', JSON.stringify(st).slice(0, 200)); process.exit(1) }
39
- console.log('line started, run:', st.data.line.runId?.slice(0, 8))
40
- // 控制节点设定值 = 配方目标值(节点级绑定;mock 回读 = 指令值)
41
- let dcwOk = 0
42
- for (const p of recipe.params) {
43
- const node = (await j('/api/workshop/dcw')).data.nodes.find(n => n.id === p.nodeId)
44
- const hit = node && Math.abs((node.value ?? NaN) - p.value) < 0.01 && node.state === 'ok'
45
- if (hit) dcwOk++
46
- else fail(`dcw node ${p.nodeId} value=${node?.value} (expect ${p.value}) state=${node?.state}`)
47
- }
48
- if (dcwOk === recipe.params.length) console.log(`PASS 数控下发: ${dcwOk}/${recipe.params.length} 参数 ACK 且设定值=配方目标`)
49
- const hist = (await j('/api/workshop/dcw')).data.history.filter(h => h.recipeRunId === st.data.line.runId)
50
- if (hist.length >= recipe.params.length && hist.every(h => h.ok)) console.log('PASS 写历史:', hist.length, '条带批次 runId 全 ACK')
51
- else fail(`write history wrong: ${hist.length}`)
52
-
53
- // ===== 2. 数采门控启动:produced 增长 + 实时值变化 =====
54
- await sleep(4000)
55
- const mid = (await j('/api/workshop/daq')).data
56
- const midNode = mid.nodes.find(n => n.id === daqNodes[0].id)
57
- if (mid.meta.produced > produced0) console.log(`PASS 数采门控启动: produced ${produced0} → ${mid.meta.produced}`)
58
- else fail(`produced not growing: ${produced0} → ${mid.meta.produced}`)
59
- await sleep(4000)
60
- const mid2 = (await j('/api/workshop/daq')).data
61
- const mid2Node = mid2.nodes.find(n => n.id === daqNodes[0].id)
62
- if (mid2.meta.produced > mid.meta.produced) console.log(`PASS 采样持续: produced → ${mid2.meta.produced}`)
63
- else fail('produced stalled while line active')
64
- if (mid2Node.value != null && mid2Node.value !== midNode.value) console.log(`PASS 节点实时值变化: ${midNode.value} → ${mid2Node.value} ${mid2Node.unit} (${mid2Node.state})`)
65
- else fail(`daq value not updating: ${midNode.value} → ${mid2Node.value}`)
66
-
67
- // ===== 3. 数字孪生面板:callout 实时值展示且随采样刷新 =====
68
- const login = await fetch(`${ROOT}/api/users/login`, {
69
- method: 'POST',
70
- headers: { 'content-type': 'application/json' },
71
- body: JSON.stringify({ email: process.env.E2E_USER ?? 'zhangwei@awshop.io', password: process.env.E2E_PASS ?? 'Awshop@123' }),
72
- }).then(r => r.json())
73
- const browser = await puppeteer.launch({
74
- executablePath: 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe',
75
- headless: 'new',
76
- args: ['--no-sandbox', '--disable-gpu', '--window-size=1600,1000'],
77
- })
78
- const page = await browser.newPage()
79
- await page.setViewport({ width: 1600, height: 1000 })
80
- await page.setCookie({ name: 'token', value: login.data.token, domain: '127.0.0.1', path: '/' })
81
- await page.goto(`${ROOT}/town`, { waitUntil: 'domcontentloaded', timeout: 60000 })
82
- await sleep(20000) // 3D 场景装配
83
- // 断言面 = 右轨「关键设备监控」面板(不受相机距离门限制):
84
- // .daq-item = 数采实时值,.dcw-set = 智控设定值(.dcw-src=配方 来源标签)
85
- const panelDaqVals = () => page.evaluate(() =>
86
- [...document.querySelectorAll('.twin-daq .daq-item b')].map(e => e.textContent.replace(/\s+/g, '')))
87
- const panelDcwRows = () => page.evaluate(() =>
88
- [...document.querySelectorAll('.twin-dcw .dcw-item')].map(e => ({
89
- ch: e.querySelector('.dcw-head em')?.textContent.replace(/\s+/g, ''),
90
- set: e.querySelector('.dcw-set')?.textContent.replace(/\s+/g, ''),
91
- src: e.querySelector('.dcw-src')?.textContent ?? '',
92
- })))
93
- const daq1 = await panelDaqVals()
94
- const dcwRows = await panelDcwRows()
95
- console.log('town panel: daq rows', daq1.length, '| dcw rows', JSON.stringify(dcwRows))
96
- if (daq1.length === 0) fail('panel has no daq rows (town 未出数据)')
97
- // 智控:配方参数节点若绑定在面板展示的设备上 → 行应显示 配方目标+来源「配方」;
98
- // 未绑定的参数节点不在设备面板展示(下发正确性已由 §1 的 ACK+回读断言权威覆盖)
99
- let panelChecked = 0
100
- for (const p of recipe.params) {
101
- const node = d.nodes.find(n => n.id === p.nodeId)
102
- const hit = dcwRows.some(r => (r.set ?? '').includes(String(p.value)) && r.src === '配方')
103
- if (hit) {
104
- panelChecked++
105
- console.log(`PASS 孪生面板智控设定展示: ${node?.name} = ${p.value} (来源标签「配方」)`)
106
- }
107
- }
108
- if (panelChecked === 0) console.log('INFO 配方参数节点均未绑定面板设备 —— 面板断言跳过(下发链路由 §1 ACK+回读权威覆盖)')
109
- await page.screenshot({ path: 'docs/audit/screenshots/town-live-t0.png' })
110
- // 数采:8s 内面板实时值变化(仅运行产线的节点在采样,变化即证明 WS→townBus→面板全链)
111
- await sleep(8000)
112
- const daq2 = await panelDaqVals()
113
- await page.screenshot({ path: 'docs/audit/screenshots/town-live-t8.png' })
114
- const changedCount = daq2.filter((v, i) => v !== daq1[i]).length
115
- if (changedCount > 0) console.log(`PASS 孪生面板数采实时刷新: ${changedCount}/${daq1.length} 通道 8s 内值变化`)
116
- else fail(`panel daq values static: ${JSON.stringify(daq1.slice(0, 4))}`)
117
-
118
- // ===== 4. 停线:数采停摆 + 孪生值收敛 =====
119
- // 注:produced 是全局计数(所有活跃产线),多产线并发时不能用作本线停线判据;
120
- // 本线语义看两点 —— ①本线打标样本(taggedSamples)停涨;②本线数采节点 offline
121
- await j(`/api/workshop/dcw/lines/${line.id}/stop`, 'POST')
122
- await sleep(3000)
123
- const after = (await j('/api/workshop/daq')).data
124
- const afterLine = (await j('/api/workshop/dcw')).data.lineStates.find(s => s.lineId === line.id)
125
- const afterNode = after.nodes.find(n => n.id === daqNodes[0].id)
126
- await sleep(3000)
127
- const afterLine2 = (await j('/api/workshop/dcw')).data.lineStates.find(s => s.lineId === line.id)
128
- if (afterLine2.taggedSamples === afterLine.taggedSamples) console.log(`PASS 停线冻结: 本线打标样本停在 ${afterLine2.taggedSamples}`)
129
- else fail(`本线打标样本仍在增长: ${afterLine.taggedSamples} → ${afterLine2.taggedSamples}`)
130
- if (afterNode.state === 'offline') console.log('PASS 停线联动: 数采节点 offline')
131
- else fail(`daq node state after stop: ${afterNode.state}`)
132
- // 孪生面板收敛:停线后先前变化的数采通道冻结(不再产生新值)
133
- await page.reload({ waitUntil: 'domcontentloaded' })
134
- await sleep(18000)
135
- const frozen1 = await panelDaqVals()
136
- await sleep(6000)
137
- const frozen2 = await panelDaqVals()
138
- const stillChanging = frozen2.filter((v, i) => v !== frozen1[i]).length
139
- if (stillChanging === 0) console.log('PASS 孪生面板停线收敛: 数采通道值冻结(无新样本)')
140
- else fail(`panel still changing after stop: ${stillChanging} rows`)
141
- await page.screenshot({ path: 'docs/audit/screenshots/town-live-stopped.png' })
142
- await browser.close()
143
-
144
- console.log(process.exitCode ? '\n=== E2E FAILED ===' : '\n=== E2E ALL PASS ===')
@@ -1,10 +0,0 @@
1
- /** 调试 dcw-controller 可用性 */
2
- const { getDcwLineRepo } = await import('../server/services/workshop/dcw/dcw-line.repo')
3
- const line = getDcwLineRepo().create({ name: 'debug-line' })
4
- console.log('line:', line.id)
5
- const { getDcwController } = await import('../server/services/workshop/dcw/dcw-controller')
6
- console.log('controller loaded')
7
- const ctrl = getDcwController()
8
- console.log('ctrl got')
9
- const node = ctrl.create({ templateRef: 'dcw-temp-sp', name: 'debug-sp', driver: 'mock', lineId: line.id, min: 150, max: 200, unit: '℃' })
10
- console.log('node:', node.id)
@@ -1,256 +0,0 @@
1
- /** 真实场景端到端审计:双产线建节点/采集/写入/配方数采窗口越限报警/孪生渲染/UI 交互 */
2
- import puppeteer from 'puppeteer-core'
3
-
4
- const TOKEN = 'ut-ffc1dfbbc0c1444c87c1ec69a9e8208c'
5
- const ROOT = 'http://127.0.0.1:3000'
6
- const H = { authorization: `Bearer ${TOKEN}`, 'content-type': 'application/json' }
7
- const sleep = (ms) => new Promise(r => setTimeout(r, ms))
8
- const fail = (m) => { console.error('FAIL:', m); process.exitCode = 1 }
9
- const jpost = (u, b) => fetch(ROOT + u, { method: 'POST', headers: H, body: JSON.stringify(b ?? {}) }).then(r => r.json())
10
- const jpatch = (u, b) => fetch(ROOT + u, { method: 'PATCH', headers: H, body: JSON.stringify(b ?? {}) }).then(r => r.json())
11
- const jdel = (u) => fetch(ROOT + u, { method: 'DELETE', headers: H }).then(r => r.json())
12
- const jget = (u) => fetch(ROOT + u, { headers: H }).then(r => r.json())
13
-
14
- const daqNodes = () => jget('/api/workshop/daq').then(d => d.data.nodes)
15
- const dcwNodes = () => jget('/api/workshop/dcw').then(d => d.data.nodes)
16
-
17
- // ============ 1. 建两条产线 ============
18
- const mkLine = async (name) => (await jpost('/api/workshop/dcw/lines', { name })).data.line
19
- const lineA = await mkLine('场景-1号产线')
20
- const lineB = await mkLine('场景-2号产线')
21
- if (!lineA || !lineB) { console.error('FAIL: create lines'); process.exit(1) }
22
- console.log('lines:', lineA.name, lineA.color, '|', lineB.name, lineB.color)
23
-
24
- // ============ 2. 每线建数采 + 数控节点(mock 驱动;绑定同一设备便于孪生联动) ============
25
- const twins = (await jget('/api/workshop/device-twins')).data.twins.filter(t => t.kind !== 'daq')
26
- const dev = twins.find(t => t.name.includes('控制台')) ?? twins[0]
27
- const mkD = async (base, body) => (await jpost(base, body)).data.node
28
- const dqA = await mkD('/api/workshop/daq', { templateRef: 'daq-temp-tc', name: '场景-温度采集A', lineId: lineA.id, intervalMs: 500, posX: dev.posX + 60, posZ: dev.posZ + 60 })
29
- const dwA = await mkD('/api/workshop/dcw', { templateRef: 'dcw-temp-sp', name: '场景-温度设定A', lineId: lineA.id, posX: dev.posX - 60, posZ: dev.posZ - 60 })
30
- const dqB = await mkD('/api/workshop/daq', { templateRef: 'daq-temp-tc', name: '场景-温度采集B', lineId: lineB.id, intervalMs: 500, posX: dev.posX + 120, posZ: dev.posZ + 120 })
31
- const dwB = await mkD('/api/workshop/dcw', { templateRef: 'dcw-temp-sp', name: '场景-温度设定B', lineId: lineB.id, posX: dev.posX - 120, posZ: dev.posZ - 120 })
32
- for (const [n, id] of [[dqA, dqA.id], [dwA, dwA.id], [dqB, dqB.id], [dwB, dwB.id]]) {
33
- await jpost(`/api/workshop/${n === dqA || n === dqB ? 'daq' : 'dcw'}/${id}/bind`, { deviceId: dev.id })
34
- }
35
- console.log('nodes created: A(daq+dcw) B(daq+dcw), bound to', dev.name)
36
-
37
- // ============ 3. 每线产品 + 配方(参数节点级 + 数采监控窗口) ============
38
- const prodA = (await jpost('/api/workshop/dcw/products', { name: '场景产品A', lineId: lineA.id })).data.product
39
- const prodB = (await jpost('/api/workshop/dcw/products', { name: '场景产品B', lineId: lineB.id })).data.product
40
- const rcA = (await jpost('/api/workshop/dcw/recipes', {
41
- productId: prodA.id, name: '场景配方A',
42
- params: [{ templateRef: 'dcw-temp-sp', nodeId: dwA.id, value: 180, min: 176, max: 188 }],
43
- // 数采监控窗口:初始宽松(全量程内,不报警)
44
- daqWindows: [{ nodeId: dqA.id, min: 100, max: 260 }],
45
- })).data.recipe
46
- const rcB = (await jpost('/api/workshop/dcw/recipes', {
47
- productId: prodB.id, name: '场景配方B',
48
- params: [{ templateRef: 'dcw-temp-sp', nodeId: dwB.id, value: 165, min: 156, max: 170 }],
49
- daqWindows: [{ nodeId: dqB.id, min: 100, max: 260 }],
50
- })).data.recipe
51
- if (!rcA?.daqWindows?.length || !rcB?.daqWindows?.length) { console.error('FAIL: recipe daqWindows missing', JSON.stringify(rcA)); process.exit(1) }
52
- console.log('recipes with daq windows:', rcA.name, JSON.stringify(rcA.daqWindows))
53
-
54
- // ============ 4. 开跑 A 线:采集/写入/窗口联锁 ============
55
- const st = await jpost(`/api/workshop/dcw/lines/${lineA.id}/start`, { recipeId: rcA.id })
56
- if (!st.data?.line?.active) { console.error('FAIL: line A start', JSON.stringify(st).slice(0, 140)); process.exit(1) }
57
- await sleep(3000)
58
-
59
- const daqNow = await daqNodes()
60
- const dqALive = daqNow.find(n => n.id === dqA.id)
61
- console.log('A daq value:', dqALive?.value, dqALive?.state)
62
- if (dqALive?.value != null && dqALive?.state !== 'offline') console.log('PASS A 线数采流动(500ms 周期)')
63
- else fail('A 线无数采数据')
64
-
65
- const dqBLive = daqNow.find(n => n.id === dqB.id)
66
- if (dqBLive?.value == null || dqBLive?.state === 'offline') console.log('PASS B 线未开跑 → 不采集(产线隔离)')
67
- else fail('B 线未开跑却在采样')
68
-
69
- // 数控写入:窗口内 180 OK;越窗 195 拒绝(服务端配方联锁)
70
- const wIn = await jpost(`/api/workshop/dcw/${dwA.id}/write`, { value: 180 })
71
- const wOut = await jpost(`/api/workshop/dcw/${dwA.id}/write`, { value: 195 })
72
- if (wIn.data?.outcome?.ok === true) console.log('PASS A 线数控写入 180 成功(真实下发链路)')
73
- else fail(`A 线写入失败: ${JSON.stringify(wIn).slice(0, 100)}`)
74
- if (wOut.code === 'VALIDATION_ERROR') console.log('PASS A 线越窗写入 195 被配方联锁拒绝:', (wOut.message ?? '').slice(0, 44))
75
- else fail('A 线越窗写入未被拒绝')
76
-
77
- // 跨线联锁隔离:B 线节点(A 线配方不含)写 195 不受 A 配方约束
78
- const wCross = await jpost(`/api/workshop/dcw/${dwB.id}/write`, { value: 195 })
79
- if (wCross.data?.outcome?.ok === true) console.log('PASS 跨线隔离:B 线节点不受 A 线配方窗口约束')
80
- else fail('跨线联锁泄漏')
81
-
82
- // ============ 5. 配方数采窗口越限 → 实时报警 ============
83
- const dwNarrow = await jpatch(`/api/workshop/dcw/recipes/${rcA.id}`, { daqWindows: [{ nodeId: dqA.id, min: 0, max: 1 }] })
84
- if (!dwNarrow.data?.recipe) { console.error('FAIL: patch narrow window', JSON.stringify(dwNarrow).slice(0, 120)); process.exit(1) }
85
- console.log('narrow window [0,1] applied — 等待越限报警…')
86
- let alarmed = false
87
- for (let i = 0; i < 12; i++) {
88
- await sleep(1000)
89
- const n = (await daqNodes()).find(x => x.id === dqA.id)
90
- if (n?.state === 'alarm') { alarmed = true; break }
91
- }
92
- const alVal = (await daqNodes()).find(x => x.id === dqA.id)
93
- if (alarmed) console.log('PASS 配方窗口越限 → 节点实时 alarm(值', alVal.value, '∉ [0,1])')
94
- else fail('越限未触发 alarm')
95
-
96
- // 恢复宽窗口 → 自动回落 ok
97
- await jpatch(`/api/workshop/dcw/recipes/${rcA.id}`, { daqWindows: [{ nodeId: dqA.id, min: 100, max: 260 }] })
98
- let recovered = false
99
- for (let i = 0; i < 10; i++) {
100
- await sleep(1000)
101
- const n = (await daqNodes()).find(x => x.id === dqA.id)
102
- if (n?.state === 'ok') { recovered = true; break }
103
- }
104
- if (recovered) console.log('PASS 窗口恢复 → 状态自动回落 ok')
105
- else fail('窗口恢复后未回落')
106
-
107
- // ============ 6. 停 A 开 B:采集切换 + B 配方生效 ============
108
- await jpost(`/api/workshop/dcw/lines/${lineA.id}/stop`, {})
109
- const stB = await jpost(`/api/workshop/dcw/lines/${lineB.id}/start`, { recipeId: rcB.id })
110
- if (!stB.data?.line?.active) fail('line B start failed')
111
- await sleep(3000)
112
- const after = await daqNodes()
113
- const aAfter = after.find(n => n.id === dqA.id)
114
- const bAfter = after.find(n => n.id === dqB.id)
115
- if (aAfter?.state === 'offline') console.log('PASS A 停 → A 节点 offline')
116
- else fail(`A 停后未 offline: ${aAfter?.state}`)
117
- if (bAfter?.value != null && bAfter?.state !== 'offline') console.log('PASS B 开 → B 数采流动(隔离切换)')
118
- else fail('B 开后无数采')
119
-
120
- // B 配方写入窗口(156~170):165 OK
121
- const wB = await jpost(`/api/workshop/dcw/${dwB.id}/write`, { value: 165 })
122
- if (wB.data?.outcome?.ok === true) console.log('PASS B 线配方窗口内写入 165 成功')
123
- else fail('B 线写入失败')
124
-
125
- // ============ 7. 浏览器:/daq 行标红 + /town 孪生报警 ============
126
- // 重新制造 A 线越限(A 线已停 → 用 B 线验证浏览器报警链)
127
- const dwNarrowB = await jpatch(`/api/workshop/dcw/recipes/${rcB.id}`, { daqWindows: [{ nodeId: dqB.id, min: 0, max: 1 }] })
128
- if (!dwNarrowB.data?.recipe) fail('patch B narrow failed')
129
- let alarmedB = false
130
- for (let i = 0; i < 12; i++) {
131
- await sleep(1000)
132
- const n = (await daqNodes()).find(x => x.id === dqB.id)
133
- if (n?.state === 'alarm') { alarmedB = true; break }
134
- }
135
- if (!alarmedB) fail('B 越限未报警')
136
- else console.log('B 线越限报警就绪 — 开始浏览器验证')
137
-
138
- const browser = await puppeteer.launch({
139
- executablePath: 'C:/Program Files/Google/Chrome/Application/chrome.exe',
140
- headless: 'new',
141
- args: ['--no-sandbox', '--disable-gpu', '--window-size=1920,1080'],
142
- })
143
- const page = await browser.newPage()
144
- await page.setViewport({ width: 1920, height: 1080 })
145
- await page.setCookie({ name: 'token', value: TOKEN, domain: '127.0.0.1', path: '/' })
146
- const pageErrors = []
147
- page.on('pageerror', (err) => pageErrors.push(String(err).slice(0, 120)))
148
-
149
- // 7.1 /daq 页:页面挂载后制造越限跳变 → 行标红 + pill 文案 + 告警面板
150
- await page.goto(`${ROOT}/daq`, { waitUntil: 'domcontentloaded', timeout: 90000 })
151
- // 首访页面 dev server 需现场编译 → 轮询等行渲染
152
- let rowReady = false
153
- for (let i = 0; i < 30; i++) {
154
- rowReady = await page.evaluate((name) => [...document.querySelectorAll('tbody tr')].some(r => r.textContent.includes(name)), '场景-温度采集B')
155
- if (rowReady) break
156
- await sleep(1000)
157
- }
158
- if (!rowReady) fail('/daq 行未渲染(等待超时)')
159
-
160
- // 恢复宽窗口 → 等回 ok → 收窄制造页面内的状态跳变(alarm 由 watch 实时上屏)
161
- await jpatch(`/api/workshop/dcw/recipes/${rcB.id}`, { daqWindows: [{ nodeId: dqB.id, min: 100, max: 260 }] })
162
- for (let i = 0; i < 12; i++) {
163
- await sleep(1000)
164
- const n = (await daqNodes()).find(x => x.id === dqB.id)
165
- if (n?.state === 'ok') break
166
- }
167
- await jpatch(`/api/workshop/dcw/recipes/${rcB.id}`, { daqWindows: [{ nodeId: dqB.id, min: 0, max: 1 }] })
168
- let daqUi = { rowRed: false, pillText: '' }
169
- for (let i = 0; i < 15; i++) {
170
- await sleep(1000)
171
- daqUi = await page.evaluate((name) => {
172
- const row = [...document.querySelectorAll('tbody tr')].find(r => r.textContent.includes(name))
173
- return {
174
- rowFound: !!row,
175
- rowRed: row?.classList.contains('row-recipe-alarm') ?? false,
176
- pillText: row?.querySelector('.st-pill')?.textContent.trim() ?? '',
177
- }
178
- }, '场景-温度采集B')
179
- if (daqUi.rowRed && daqUi.pillText.includes('配方越限')) break
180
- }
181
- console.log('/daq ui:', JSON.stringify(daqUi))
182
- if (daqUi.rowFound && daqUi.rowRed && daqUi.pillText.includes('配方越限')) console.log('PASS /daq 越限行标红 + 「配方越限」pill')
183
- else fail(`/daq 行标红缺失: ${JSON.stringify(daqUi)}`)
184
- await page.screenshot({ path: 'docs/audit/screenshots/scenario-daq-alarm.png' })
185
-
186
- // 告警面板条目(跳变已在页面上发生 → raiseAlarm crit)
187
- await sleep(500)
188
- const alarmOnDaq = await page.evaluate((name) => [...document.querySelectorAll('.al-txt')].map(e => e.textContent).find(t => t.includes(name)) ?? '', '场景-温度采集B')
189
-
190
- // 7.2 /town:孪生节点红环 + 实时告警
191
- await page.goto(`${ROOT}/town`, { waitUntil: 'domcontentloaded', timeout: 90000 })
192
- for (let i = 0; i < 40; i++) {
193
- if (await page.evaluate(() => (window.__town?.scene?.deviceNodes?.size ?? 0) > 0)) break
194
- await sleep(1000)
195
- }
196
- await sleep(4500)
197
- // 页面就绪后制造跳变:先恢复(→ok)再收窄(→alarm),watch 实时上屏
198
- await jpatch(`/api/workshop/dcw/recipes/${rcB.id}`, { daqWindows: [{ nodeId: dqB.id, min: 100, max: 260 }] })
199
- let townOk = false
200
- for (let i = 0; i < 12; i++) {
201
- await sleep(1000)
202
- const n = (await daqNodes()).find(x => x.id === dqB.id)
203
- if (n?.state === 'ok') { townOk = true; break }
204
- }
205
- if (townOk) console.log('PASS 孪生页面内窗口恢复 → 状态回落 ok')
206
- await jpatch(`/api/workshop/dcw/recipes/${rcB.id}`, { daqWindows: [{ nodeId: dqB.id, min: 0, max: 1 }] })
207
- let townUi = { found: false, state: '', ring: '', alarmText: '' }
208
- for (let i = 0; i < 15; i++) {
209
- await sleep(1000)
210
- townUi = await page.evaluate((id, name) => {
211
- const s = window.__town.scene
212
- const dev2 = [...s.deviceNodes.values()].find(x => x.twinId === id)
213
- return {
214
- found: !!dev2,
215
- state: dev2?.state ?? '',
216
- ring: dev2 ? `#${dev2.ring.material.color.getHexString()}` : '',
217
- alarmText: [...document.querySelectorAll('.al-txt')].map(e => e.textContent).find(t => t.includes('越限量程')) ?? '',
218
- alRows: [...document.querySelectorAll('.al-txt')].map(e => e.textContent.trim().slice(0, 40)),
219
- }
220
- }, dqB.id, '场景-温度采集B')
221
- if (townUi.state === 'alarm' && townUi.ring === '#ff6b5c' && townUi.alarmText) break
222
- }
223
- if (!townUi.alarmText) console.log(' [diag] al rows:', JSON.stringify(townUi.alRows))
224
- console.log('/town ui:', JSON.stringify(townUi))
225
- if (townUi.found && townUi.state === 'alarm' && townUi.ring === '#ff6b5c') console.log('PASS 孪生节点 alarm 状态 + 红环')
226
- else fail(`孪生报警缺失: ${JSON.stringify(townUi)}`)
227
- if (townUi.alarmText) console.log('PASS 实时告警面板出现越限告警:', townUi.alarmText.slice(0, 50))
228
- else fail('告警面板无越限条目')
229
- await page.screenshot({ path: 'docs/audit/screenshots/scenario-town-alarm.png' })
230
- if (alarmOnDaq) console.log('PASS /daq 页告警面板同步出现越限条目')
231
-
232
- // 7.3 /dcw/[lineId] 详情页渲染(A 线):节点表 + 配方卡 + 批次
233
- await page.goto(`${ROOT}/dcw/${lineA.id}`, { waitUntil: 'domcontentloaded', timeout: 90000 })
234
- await sleep(6000)
235
- const detailUi = await page.evaluate(() => ({
236
- h1: document.querySelector('h1')?.textContent ?? '',
237
- hasRecipe: document.body.textContent.includes('场景配方A'),
238
- }))
239
- console.log('/dcw/[id] ui:', JSON.stringify(detailUi))
240
- if (detailUi.h1.includes('1号产线') && detailUi.hasRecipe) console.log('PASS 产线详情页渲染(A 线数据)')
241
- else fail(`详情页渲染异常: ${JSON.stringify(detailUi)}`)
242
-
243
- if (pageErrors.length) { console.error('pageerrors:', pageErrors.slice(0, 3)); fail('页面 JS 错误') }
244
- await browser.close()
245
-
246
- // ============ 清理 ============
247
- await jpost(`/api/workshop/dcw/lines/${lineB.id}/stop`, {})
248
- for (const id of [dqA.id, dqB.id]) await jdel(`/api/workshop/daq/${id}`)
249
- for (const id of [dwA.id, dwB.id]) await jdel(`/api/workshop/dcw/${id}`)
250
- for (const id of [rcA.id, rcB.id]) await jdel(`/api/workshop/dcw/recipes/${id}`)
251
- for (const id of [prodA.id, prodB.id]) await jdel(`/api/workshop/dcw/products/${id}`)
252
- for (const id of [lineA.id, lineB.id]) await jdel(`/api/workshop/dcw/lines/${id}`)
253
- console.log('cleanup done')
254
-
255
- console.log(process.exitCode ? 'SCENARIO FAILED' : 'SCENARIO ALL PASS')
256
- process.exit(process.exitCode ?? 0)
@@ -1,31 +0,0 @@
1
- /**
2
- * line-spawn 聚焦探针:验证 codex(.cmd shim)经受控包装拉起并可 stdio 通信。
3
- * 运行:npx tsx --tsconfig .nuxt/tsconfig.server.json scripts/_dbg-line-spawn.ts
4
- */
5
- import { spawnLineProcess } from '../server/services/workshop/agents/adapters/line-spawn'
6
-
7
- async function main(): Promise<void> {
8
- console.log('── spawn codex --version(.cmd shim 经 cmd.exe 包装)──')
9
- const child = spawnLineProcess('codex', ['--version'], {})
10
- let out = ''
11
- child.stdout?.setEncoding('utf-8')
12
- child.stdout?.on('data', (d: string) => {
13
- out += d
14
- })
15
- const code = await new Promise<number | null>((resolve) => {
16
- child.on('exit', c => resolve(c))
17
- child.on('error', (e) => {
18
- console.log('spawn error:', e.message)
19
- resolve(-1)
20
- })
21
- })
22
- console.log('exit=', code, 'stdout=', out.trim())
23
- if (code !== 0 || !out.includes('codex')) {
24
- console.log('FAIL')
25
- process.exit(1)
26
- }
27
- console.log('PASS')
28
- process.exit(0)
29
- }
30
-
31
- void main()
@@ -1,80 +0,0 @@
1
- /**
2
- * 最小实时探针:单 worker(harness 可选)+ mock lead,注入 requireReply 消息,
3
- * 全量拉取 AEP 事件(含 error/delta/status),观察引擎回合的真实行为。
4
- * 运行:node scripts/_dbg-live-engine-probe.mjs codex|dsh|omp
5
- */
6
- const BASE = process.env.AW_BASE ?? 'http://127.0.0.1:3000'
7
- const harness = process.argv[2] ?? 'dsh'
8
-
9
- const reg = await fetch(`${BASE}/api/workshop/users/register`, {
10
- method: 'POST', headers: { 'content-type': 'application/json' },
11
- body: JSON.stringify({ name: `probe-${harness}-${Date.now() % 100000}` }),
12
- }).then(r => r.json())
13
- const T = reg?.data?.token
14
- if (!T) { console.error('注册失败'); process.exit(1) }
15
- const api = async (method, path, body) => {
16
- const res = await fetch(`${BASE}${path}`, {
17
- method, headers: { 'content-type': 'application/json', authorization: `Bearer ${T}` },
18
- body: body !== undefined ? JSON.stringify(body) : undefined,
19
- })
20
- return await res.json().catch(() => ({}))
21
- }
22
-
23
- const ch = await api('POST', '/api/workshop/channels', { name: `probe-${harness}`, leadAgent: { name: 'lead', harness: 'mock' } })
24
- const cid = ch?.data?.channelId
25
- const w = await api('POST', `/api/workshop/channels/${cid}/agents`, {
26
- name: `w-${harness}`, harness, role: 'worker',
27
- config: harness === 'codex' ? { approvalPolicy: 'on-request', sandbox: 'workspace-write' } : {},
28
- })
29
- console.log(`channel=${cid} worker=${w?.data?.id} harness=${harness}`)
30
-
31
- // 事件录制流由首个 WS 订阅触发(无订阅者不落库),故先接 WS 再触发事件
32
- const { createRequire } = await import('node:module')
33
- const sleep = (ms) => new Promise(r => setTimeout(r, ms))
34
- const { WebSocket } = createRequire(import.meta.url)('D:/codes/ABO/AgentWorkShop/node_modules/.pnpm/ws@8.21.3/node_modules/ws')
35
- const ws = new WebSocket(BASE.replace(/^http/, 'ws') + '/api/workshop/ws')
36
- ws.on('open', () => ws.send(JSON.stringify({ type: 'sub', channelId: cid, token: T })))
37
- ws.on('error', (e) => console.log('[ws error]', e.message))
38
- await sleep(1200)
39
-
40
- const seen = []
41
- let lastSeq = 0
42
- const poll = async () => {
43
- const res = await api('GET', `/api/workshop/channels/${cid}/events?limit=500`)
44
- for (const f of (res?.data?.items ?? [])) {
45
- if (Number(f.seq ?? 0) > lastSeq) {
46
- lastSeq = Number(f.seq)
47
- seen.push(f)
48
- const p = f.payload ?? {}
49
- if (f.type === 'error') console.log(`[evt] ERROR ${p.code}: ${String(p.message ?? '').slice(0, 200)}`)
50
- else if (f.type === 'a2a.message') console.log(`[evt] message ${(p.parts ?? []).map(x => x.text ?? '').join('').slice(0, 120)}`)
51
- else if (f.type === 'agent.status.message') console.log(`[evt] status: ${String(p.text ?? '').slice(0, 140)}`)
52
- else if (f.type === 'agent.delta') process.stdout.write('.')
53
- else if (f.type === 'a2a.artifact') console.log(`[evt] artifact: ${(p.artifact?.parts ?? []).map(x => x.text ?? '').join('').slice(0, 260)}`)
54
- else if (f.type === 'task.status') console.log(`[evt] task ${p.state}`)
55
- else if (f.type === 'hitl.request') console.log(`[evt] HITL ${p.kind}`)
56
- }
57
- }
58
- }
59
- const poller = setInterval(() => { void poll().catch(() => {}) }, 1500)
60
-
61
- const m = await api('POST', `/api/workshop/channels/${cid}/messages`, {
62
- toAgentId: w?.data?.id, fromLabel: '探针员', requireReply: true,
63
- text: `兼容性检查:请用一句话说明你的引擎(${harness}),然后原样回复"${harness} 在线"。`,
64
- })
65
- console.log('message sent:', m.status, m?.data?.messageId?.slice(0, 8))
66
-
67
- const deadline = Date.now() + 300_000
68
- let replied = false
69
- while (Date.now() < deadline) {
70
- await new Promise(r => setTimeout(r, 2000))
71
- await poll()
72
- replied = seen.some(f => f.type === 'a2a.message' && f.payload?.metadata?.['x-aw-in-reply-to'] === m?.data?.messageId)
73
- if (replied) break
74
- }
75
- clearInterval(poller)
76
- console.log(replied ? '\n=== 回执已收到 ===' : '\n=== 300s 未收到回执 ===')
77
- const byType = {}
78
- for (const f of seen) byType[f.type] = (byType[f.type] ?? 0) + 1
79
- console.log('帧分布:', JSON.stringify(byType))
80
- process.exit(0)