agentworkshop 0.7.34 → 0.7.37

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 (944) 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/a66fdef7-dcfd-453b-b1f6-543c7dfd98d5.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 +1523 -1027
  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-status/sess_aeaecb58-8833-4b83-b93c-050467d21e03-d944d71bb3.json +14 -0
  345. package/scripts/_audit/aml-layout-diag.mjs +83 -0
  346. package/scripts/_audit/bump-version.mjs +51 -0
  347. package/scripts/_audit/channel-inspect.mjs +49 -0
  348. package/scripts/_audit/cleanup-apply.mjs +89 -0
  349. package/scripts/_audit/cleanup-plan.mjs +82 -0
  350. package/scripts/_audit/contrast-check.mjs +43 -0
  351. package/scripts/_audit/dcw-unrecorded-write.ts +1 -1
  352. package/scripts/_audit/design-shots.mjs +145 -0
  353. package/scripts/_audit/docs-font-probe.mjs +68 -0
  354. package/scripts/_audit/docs-probe.mjs +107 -0
  355. package/scripts/_audit/docs-shots.mjs +171 -0
  356. package/scripts/_audit/docs-v3-verify.mjs +255 -0
  357. package/scripts/_audit/docs-vue-lint.mjs +81 -0
  358. package/scripts/_audit/docs-vue-lint2.mjs +91 -0
  359. package/scripts/_audit/exp-cost-scaling.mjs +4 -1
  360. package/scripts/_audit/exp-envelope-and-png.mjs +2 -1
  361. package/scripts/_audit/exp-sweep-fairness.mjs +4 -2
  362. package/scripts/_audit/fix-settings-count.mjs +57 -0
  363. package/scripts/_audit/glass-verify.mjs +155 -0
  364. package/scripts/_audit/hydration-diff.mjs +104 -0
  365. package/scripts/_audit/hydration-head.mjs +36 -0
  366. package/scripts/_audit/hydration-probe.mjs +59 -0
  367. package/scripts/_audit/lead-matrix-test.mjs +172 -0
  368. package/scripts/_audit/plc-agent-task.mjs +74 -0
  369. package/scripts/_audit/plc-clean-scenario.mjs +434 -0
  370. package/scripts/_audit/plc-clean-shots.mjs +161 -0
  371. package/scripts/_audit/plc-fc10-probe.mjs +30 -0
  372. package/scripts/_audit/probe-binding.mjs +114 -103
  373. package/scripts/_audit/review-fix-verify.mjs +158 -0
  374. package/scripts/_audit/seed-demo.mjs +165 -0
  375. package/scripts/_audit/town-focus-shot.mjs +129 -0
  376. package/scripts/_audit/town-reposition.mjs +85 -0
  377. package/scripts/_audit/ts-resolve-hook.mjs +57 -22
  378. package/scripts/_audit/verify-cleanup.mjs +67 -0
  379. package/scripts/_audit/verify-release-pack.mjs +82 -0
  380. package/scripts/_audit/watchdog-recovery-test.mjs +127 -0
  381. package/scripts/_dbg-audit-all-pages.mjs +43 -43
  382. package/scripts/_dbg-configroot-audit.mjs +84 -84
  383. package/scripts/_dbg-daq-intervals-func.mjs +94 -94
  384. package/scripts/_dbg-daq-rowstyle-verify.mjs +112 -112
  385. package/scripts/_dbg-groups-ui-verify.mjs +122 -122
  386. package/scripts/_dbg-harness-e2e.mjs +92 -92
  387. package/scripts/_dbg-harness-ui-e2e.py +97 -97
  388. package/scripts/_dbg-hitl-timeout-e2e.mjs +93 -93
  389. package/scripts/_dbg-multiharness-live-e2e.mjs +254 -254
  390. package/scripts/_dbg-opslog-agent-e2e.mjs +194 -194
  391. package/scripts/_dbg-opt-team-e2e.mjs +133 -133
  392. package/scripts/_dbg-recipe-e2e.mjs +176 -176
  393. package/scripts/_dbg-recipe-stale-e2e.mjs +135 -135
  394. package/scripts/_dbg-render-perf.mjs +142 -142
  395. package/scripts/_dbg-render-regression.mjs +130 -130
  396. package/scripts/_dbg-town-smoke.mjs +54 -54
  397. package/scripts/aw-start-smoke.mjs +27 -8
  398. package/scripts/check-docs-sync.mjs +367 -0
  399. package/scripts/e2e-full-closedloop.mjs +36 -18
  400. package/scripts/production-closed-loop-e2e.mjs +300 -303
  401. package/scripts/test-cli-exit.mjs +129 -21
  402. package/scripts/test-daq-frame-race.mjs +144 -96
  403. package/scripts/test-events-index.mjs +176 -0
  404. package/scripts/test-lru.mjs +34 -11
  405. package/scripts/test-memory-month-query.mjs +11 -3
  406. package/scripts/test-plugin-hardening.mjs +7 -2
  407. package/scripts/test-plugin-lifecycle.mjs +173 -0
  408. package/scripts/test-rollback-index.mjs +76 -18
  409. package/scripts/test-sdk-surface.mjs +6 -3
  410. package/sdk/client.mjs +16 -7
  411. package/sdk/context.mjs +21 -9
  412. package/sdk/examples/line-sentinel/client.mjs +13 -6
  413. package/sdk/examples/line-sentinel/index.mjs +5 -2
  414. package/sdk/examples/ops-notifier/client.mjs +3 -1
  415. package/sdk/examples/sample-insight/client.mjs +4 -2
  416. package/sdk/index.d.mts +133 -16
  417. package/sdk/index.mjs +3 -2
  418. package/sdk/lifecycle.mjs +8 -3
  419. package/server/api/workshop/agent-tools/bindings/index.post.ts +22 -7
  420. package/server/api/workshop/aml/datasets/[id].delete.ts +39 -0
  421. package/server/api/workshop/aml/datasets/[id].get.ts +31 -9
  422. package/server/api/workshop/aml/datasets/[id].patch.ts +30 -0
  423. package/server/api/workshop/aml/entities/index.get.ts +13 -0
  424. package/server/api/workshop/aml/entities/prune.post.ts +28 -0
  425. package/server/api/workshop/aml/env/index.get.ts +13 -0
  426. package/server/api/workshop/aml/env/recheck.post.ts +14 -0
  427. package/server/api/workshop/aml/env/uv.post.ts +21 -0
  428. package/server/api/workshop/aml/env/venv.post.ts +24 -0
  429. package/server/api/workshop/aml/index.get.ts +14 -1
  430. package/server/api/workshop/aml/jobs/[id].delete.ts +44 -0
  431. package/server/api/workshop/aml/models/[id].delete.ts +35 -0
  432. package/server/api/workshop/aml/models/[id].patch.ts +30 -0
  433. package/server/services/workshop/agents/agent-interface.ts +3 -0
  434. package/server/services/workshop/agents/codex-agent.ts +4 -7
  435. package/server/services/workshop/agents/dsh-agent.ts +4 -7
  436. package/server/services/workshop/agents/opencode-agent.ts +5 -7
  437. package/server/services/workshop/aml/aml.repo.ts +18 -0
  438. package/server/services/workshop/aml/dataset-builder.ts +4 -0
  439. package/server/services/workshop/aml/entity.ts +365 -0
  440. package/server/services/workshop/aml/env-manager.ts +242 -0
  441. package/server/services/workshop/aml/job-orchestrator.ts +4 -15
  442. package/server/services/workshop/aml/model-registry.ts +6 -0
  443. package/server/services/workshop/aml/python-runtime.ts +396 -62
  444. package/server/services/workshop/aml/runtime.ts +95 -4
  445. package/server/services/workshop/daq/bus/mqtt.adapter.ts +3 -1
  446. package/server/services/workshop/daq/daq-controller.ts +95 -47
  447. package/server/services/workshop/daq/daq-node.repo.ts +0 -10
  448. package/server/services/workshop/daq/daq-runtime.ts +0 -5
  449. package/server/services/workshop/json-store.mjs +35 -2
  450. package/server/services/workshop/plugins/host.mjs +14 -5
  451. package/server/services/workshop/runtime/manager.ts +28 -1
  452. package/server/services/workshop/runtime/scheduler-loop.ts +10 -1
  453. package/server/services/workshop/settings.ts +2 -0
  454. package/shared/config/home.mjs +58 -0
  455. package/shared/config/schema.json +2 -1
  456. package/shared/lru.mjs +4 -1
  457. package/.output/public/_nuxt/-6OnbLFb.js +0 -1
  458. package/.output/public/_nuxt/-nb2uqVg.js +0 -1
  459. package/.output/public/_nuxt/4bHdIqEg.js +0 -18
  460. package/.output/public/_nuxt/6PZPfFcO.js +0 -17
  461. package/.output/public/_nuxt/BBBtwOpo.js +0 -9
  462. package/.output/public/_nuxt/BBwMH_hG.js +0 -7
  463. package/.output/public/_nuxt/BDUjyaF4.js +0 -42
  464. package/.output/public/_nuxt/BNXfwXpE.js +0 -1
  465. package/.output/public/_nuxt/BN_PdN3J.js +0 -24
  466. package/.output/public/_nuxt/BSSUlJnx2.js +0 -1
  467. package/.output/public/_nuxt/BWSE6hR6.js +0 -1
  468. package/.output/public/_nuxt/BZGNTgTQ2.js +0 -1
  469. package/.output/public/_nuxt/BZv4RFYN.js +0 -1
  470. package/.output/public/_nuxt/BcmbLh2z2.js +0 -1
  471. package/.output/public/_nuxt/BfGc7TJp.js +0 -1
  472. package/.output/public/_nuxt/BgTB6h_q.js +0 -2
  473. package/.output/public/_nuxt/BkLJA9J5.js +0 -1
  474. package/.output/public/_nuxt/Bp5luxkg2.js +0 -1
  475. package/.output/public/_nuxt/BuCHayqN.js +0 -1
  476. package/.output/public/_nuxt/BuvcLKh1.js +0 -19
  477. package/.output/public/_nuxt/C3tCneTM.js +0 -1
  478. package/.output/public/_nuxt/C77oC8yC2.js +0 -7
  479. package/.output/public/_nuxt/C9f8QMp12.js +0 -1
  480. package/.output/public/_nuxt/CKfhtOt7.js +0 -13
  481. package/.output/public/_nuxt/CQvmN-Mi.js +0 -1
  482. package/.output/public/_nuxt/CUDrOuW7.js +0 -1
  483. package/.output/public/_nuxt/CZcC-gpk.js +0 -1
  484. package/.output/public/_nuxt/CbzsPO5H.js +0 -1
  485. package/.output/public/_nuxt/CdSOrh2c.js +0 -1
  486. package/.output/public/_nuxt/Cgx818r-.js +0 -1
  487. package/.output/public/_nuxt/Cjm7VogC.js +0 -1
  488. package/.output/public/_nuxt/Cm5mDxzH.js +0 -1
  489. package/.output/public/_nuxt/CmHzfVc5.js +0 -3
  490. package/.output/public/_nuxt/Cn3J3NXR.js +0 -23
  491. package/.output/public/_nuxt/Cno6kYiO2.js +0 -1
  492. package/.output/public/_nuxt/Cp6z0RN7.js +0 -1
  493. package/.output/public/_nuxt/CwqIxJGj.js +0 -2
  494. package/.output/public/_nuxt/D-Ca4BGY.js +0 -70
  495. package/.output/public/_nuxt/D0fhp-Ga.js +0 -75
  496. package/.output/public/_nuxt/D1z7i2UP.js +0 -31
  497. package/.output/public/_nuxt/DIaTPH1M.js +0 -1
  498. package/.output/public/_nuxt/DTYBfjRY.js +0 -1
  499. package/.output/public/_nuxt/DXRZPxGs.js +0 -1
  500. package/.output/public/_nuxt/DZzGarBE2.js +0 -13
  501. package/.output/public/_nuxt/DaMCzQhv.js +0 -1
  502. package/.output/public/_nuxt/DoLasgPj2.js +0 -1
  503. package/.output/public/_nuxt/DpojD719.js +0 -1
  504. package/.output/public/_nuxt/DsVcWfyR.js +0 -1
  505. package/.output/public/_nuxt/DtBu71ev.js +0 -32
  506. package/.output/public/_nuxt/Dy-mxvXY2.js +0 -1
  507. package/.output/public/_nuxt/DzuC31-i.js +0 -2
  508. package/.output/public/_nuxt/FQri3dV3.js +0 -1
  509. package/.output/public/_nuxt/ORt9oDIy2.js +0 -1
  510. package/.output/public/_nuxt/TownView.CtskuMXS.css +0 -1
  511. package/.output/public/_nuxt/VLI2Zy4t.js +0 -5
  512. package/.output/public/_nuxt/_id_.MbzdFygI.css +0 -1
  513. package/.output/public/_nuxt/_id_.hRYo-EAB.css +0 -1
  514. package/.output/public/_nuxt/_wsId_.gXMEOYgX.css +0 -1
  515. package/.output/public/_nuxt/aml.WU_bh87J.css +0 -1
  516. package/.output/public/_nuxt/arUY5dyq2.js +0 -4
  517. package/.output/public/_nuxt/builds/meta/adc365b6-f636-4a2b-9527-79819c1e874b.json +0 -1
  518. package/.output/public/_nuxt/daq.Bb6l44-O.css +0 -1
  519. package/.output/public/_nuxt/dcw.rXH2fc2Z.css +0 -1
  520. package/.output/public/_nuxt/default.jNT73_hq.css +0 -1
  521. package/.output/public/_nuxt/ekuGmQ7R.js +0 -1
  522. package/.output/public/_nuxt/entry.jFrFAWuA.css +0 -1
  523. package/.output/public/_nuxt/logs.DMOM-iHe.css +0 -1
  524. package/.output/public/_nuxt/niDwBOZW.js +0 -3
  525. package/.output/public/_nuxt/pMoIO6rr.js +0 -14
  526. package/.output/public/_nuxt/pages.Cc8GX9T1.css +0 -1
  527. package/.output/public/_nuxt/plugins.wIPyfPn-.css +0 -1
  528. package/.output/public/_nuxt/rqZ-1SoP.js +0 -2
  529. package/.output/public/_nuxt/settings.BCm4NZIc.css +0 -1
  530. package/.output/public/_nuxt/town.C_DsNW0J.css +0 -1
  531. package/.output/public/_nuxt/users.DuAt_Zwf.css +0 -1
  532. package/.output/public/_nuxt/vJ4FPb-_.js +0 -1
  533. package/.output/public/_nuxt/workshop.BJg84pOK.css +0 -1
  534. package/.output/server/chunks/build/aml-uBNIppIf.mjs +0 -508
  535. package/.output/server/chunks/build/aml-uBNIppIf.mjs.map +0 -1
  536. package/.output/server/chunks/build/daq-BvihjQyW.mjs.map +0 -1
  537. package/.output/server/chunks/build/pages-C-6BRtv8.mjs.map +0 -1
  538. package/scripts/_audit/.tmp/audit-data/dcws.json +0 -28
  539. package/scripts/_audit/.tmp/dcw-writes.json +0 -15650
  540. package/scripts/_audit/.tmp/dcws.json +0 -9033
  541. package/scripts/_audit/.tmp/pollution-backup/dcw-rollback.polluted.json +0 -470006
  542. package/scripts/_audit/.tmp/pollution-backup/dcws.polluted.json +0 -9085
  543. package/scripts/_audit/.tmp/probe-cwd.txt +0 -1
  544. package/scripts/_audit/awhome/commands/README.md +0 -3
  545. package/scripts/_audit/awhome/commands/hello.mjs +0 -12
  546. package/scripts/_audit/diag-cwd.ts +0 -20
  547. package/scripts/_audit/diag-cwd2.ts +0 -19
  548. package/scripts/_audit/hello.mjs +0 -12
  549. package/scripts/_audit/ndjson-partial-line-repro.mjs +0 -77
  550. package/scripts/_audit/opencode-await-ternary-repro.mjs +0 -20
  551. package/scripts/_audit/part-frag.txt +0 -84
  552. package/scripts/_audit/part-head.txt +0 -45
  553. package/scripts/_audit/probe-child.mjs +0 -17
  554. package/scripts/_audit/probe-envelope.mjs +0 -49
  555. package/scripts/_audit/probe-packlist.mjs +0 -67
  556. package/scripts/_audit/probe-routes.mjs +0 -47
  557. package/scripts/_audit/probe-routes2.mjs +0 -38
  558. package/scripts/_audit/probe.ts +0 -9
  559. package/scripts/_audit/probe2.ts +0 -6
  560. package/scripts/_audit/probe3.ts +0 -3
  561. package/scripts/_audit/probe4.ts +0 -3
  562. package/scripts/_audit/proj/.AgentWorkShop/commands/echoargs.mjs +0 -13
  563. package/scripts/_audit/proj/config.yml +0 -1
  564. package/scripts/_audit/run.mjs +0 -30
  565. package/scripts/_audit/tsconfig.probe.json +0 -24
  566. package/scripts/_audit/typecheck-out.txt +0 -466
  567. package/scripts/_daq-realtime-probe.mjs +0 -68
  568. package/scripts/_daq-warn-probe.mjs +0 -50
  569. package/scripts/_dbg-acc-1-setup.mjs +0 -57
  570. package/scripts/_dbg-acc-2-diag.mjs +0 -14
  571. package/scripts/_dbg-acc-2-intervals.mjs +0 -81
  572. package/scripts/_dbg-acc-3-daq.mjs +0 -48
  573. package/scripts/_dbg-acc-4-team.mjs +0 -92
  574. package/scripts/_dbg-acc-5-visual.mjs +0 -63
  575. package/scripts/_dbg-acc-5b-ws-town.mjs +0 -18
  576. package/scripts/_dbg-acc-5c-town.mjs +0 -12
  577. package/scripts/_dbg-acc-6-i18n.mjs +0 -19
  578. package/scripts/_dbg-agent-tools-audit.mjs +0 -154
  579. package/scripts/_dbg-agent-workflow-audit.mjs +0 -177
  580. package/scripts/_dbg-agents-dropdown-shot.py +0 -33
  581. package/scripts/_dbg-anim-verify.mjs +0 -81
  582. package/scripts/_dbg-app-shot.mjs +0 -48
  583. package/scripts/_dbg-autoframe.mjs +0 -103
  584. package/scripts/_dbg-availability-probe.ts +0 -11
  585. package/scripts/_dbg-beacon-final.mjs +0 -181
  586. package/scripts/_dbg-bind-bidi-e2e.mjs +0 -239
  587. package/scripts/_dbg-callout-near.mjs +0 -108
  588. package/scripts/_dbg-catalog-smoke.ts +0 -20
  589. package/scripts/_dbg-cf-line-shot.mjs +0 -18
  590. package/scripts/_dbg-chan-focus.mjs +0 -49
  591. package/scripts/_dbg-channel-plugin-ui.mjs +0 -94
  592. package/scripts/_dbg-cleanup.mjs +0 -31
  593. package/scripts/_dbg-closedloop-ui-shot.mjs +0 -61
  594. package/scripts/_dbg-codex-handshake.ts +0 -30
  595. package/scripts/_dbg-codex-probe.mjs +0 -58
  596. package/scripts/_dbg-codex-sandbox.ts +0 -58
  597. package/scripts/_dbg-codex-turn.ts +0 -65
  598. package/scripts/_dbg-collab-scenario-e2e.mjs +0 -185
  599. package/scripts/_dbg-config-smoke.ts +0 -28
  600. package/scripts/_dbg-console-audit.mjs +0 -61
  601. package/scripts/_dbg-console-probe.mjs +0 -23
  602. package/scripts/_dbg-context-inject-audit.mjs +0 -231
  603. package/scripts/_dbg-cpu-profile.mjs +0 -53
  604. package/scripts/_dbg-crash-recovery.mjs +0 -143
  605. package/scripts/_dbg-crop-shot.mjs +0 -16
  606. package/scripts/_dbg-cross-channel-e2e.mjs +0 -157
  607. package/scripts/_dbg-cross-team-visibility-e2e.mjs +0 -129
  608. package/scripts/_dbg-crush-probe.sh +0 -21
  609. package/scripts/_dbg-crush-spawn-probe.ts +0 -22
  610. package/scripts/_dbg-daq-acc-probe.mjs +0 -24
  611. package/scripts/_dbg-daq-attrib.mjs +0 -34
  612. package/scripts/_dbg-daq-bind-audit.mjs +0 -119
  613. package/scripts/_dbg-daq-cadence.mjs +0 -104
  614. package/scripts/_dbg-daq-debug.mjs +0 -22
  615. package/scripts/_dbg-daq-diag.mjs +0 -33
  616. package/scripts/_dbg-daq-e2e.mjs +0 -171
  617. package/scripts/_dbg-daq-film.mjs +0 -136
  618. package/scripts/_dbg-daq-filter-e2e.mjs +0 -109
  619. package/scripts/_dbg-daq-filter-e2e2.mjs +0 -62
  620. package/scripts/_dbg-daq-final-regression.mjs +0 -78
  621. package/scripts/_dbg-daq-frame-alarm.mjs +0 -49
  622. package/scripts/_dbg-daq-frame-ui.mjs +0 -62
  623. package/scripts/_dbg-daq-frame-ws.mjs +0 -72
  624. package/scripts/_dbg-daq-full-check.mjs +0 -179
  625. package/scripts/_dbg-daq-line-note-verify.mjs +0 -61
  626. package/scripts/_dbg-daq-linebanner-audit.mjs +0 -107
  627. package/scripts/_dbg-daq-pages-shot.mjs +0 -37
  628. package/scripts/_dbg-daq-perf.mjs +0 -61
  629. package/scripts/_dbg-daq-probe.mjs +0 -27
  630. package/scripts/_dbg-daq-recipe-e2e.mjs +0 -30
  631. package/scripts/_dbg-daq-redesign-shot.mjs +0 -88
  632. package/scripts/_dbg-daq-rows-probe.mjs +0 -26
  633. package/scripts/_dbg-daq-rowstate-e2e.mjs +0 -152
  634. package/scripts/_dbg-daq-rowstate-shot.mjs +0 -45
  635. package/scripts/_dbg-daq-rowstate-shot2.mjs +0 -38
  636. package/scripts/_dbg-daq-tpl.mjs +0 -144
  637. package/scripts/_dbg-dash-console-check.mjs +0 -49
  638. package/scripts/_dbg-dash-deep-probe.mjs +0 -61
  639. package/scripts/_dbg-dash-hitpoint.mjs +0 -44
  640. package/scripts/_dbg-dash-live-shot.mjs +0 -36
  641. package/scripts/_dbg-dash-shot.mjs +0 -21
  642. package/scripts/_dbg-dashboard-shot.mjs +0 -35
  643. package/scripts/_dbg-dcw-audit.mjs +0 -126
  644. package/scripts/_dbg-dcw-card-e2e.mjs +0 -108
  645. package/scripts/_dbg-dcw-channel-ui.mjs +0 -144
  646. package/scripts/_dbg-dcw-examples.mjs +0 -81
  647. package/scripts/_dbg-dcw-light-shot.mjs +0 -19
  648. package/scripts/_dbg-dcw-line-audit.mjs +0 -107
  649. package/scripts/_dbg-dcw-pause-tpl-audit.mjs +0 -161
  650. package/scripts/_dbg-dcw-pause-ui.mjs +0 -175
  651. package/scripts/_dbg-dcw-read-toolface.ts +0 -13
  652. package/scripts/_dbg-dcw-read-ui.mjs +0 -74
  653. package/scripts/_dbg-dcw-scene.mjs +0 -72
  654. package/scripts/_dbg-dcw-shot2.mjs +0 -14
  655. package/scripts/_dbg-dcw-twin-e2e.mjs +0 -192
  656. package/scripts/_dbg-diag-mock-loop.mjs +0 -89
  657. package/scripts/_dbg-diag-watch.mjs +0 -95
  658. package/scripts/_dbg-docs-site-shot.mjs +0 -32
  659. package/scripts/_dbg-dsh-probe.mjs +0 -31
  660. package/scripts/_dbg-dt-interact.mjs +0 -193
  661. package/scripts/_dbg-error-probe.mjs +0 -54
  662. package/scripts/_dbg-filter-light-verify.mjs +0 -54
  663. package/scripts/_dbg-final-acceptance-2.mjs +0 -72
  664. package/scripts/_dbg-final-acceptance.mjs +0 -192
  665. package/scripts/_dbg-final-agent-e2e.mjs +0 -151
  666. package/scripts/_dbg-final-features.mjs +0 -155
  667. package/scripts/_dbg-final-fixups.mjs +0 -62
  668. package/scripts/_dbg-final-full-e2e.mjs +0 -218
  669. package/scripts/_dbg-final-line-e2e.mjs +0 -173
  670. package/scripts/_dbg-final-shots.mjs +0 -32
  671. package/scripts/_dbg-final-t6-hitl.mjs +0 -38
  672. package/scripts/_dbg-final-visual.mjs +0 -29
  673. package/scripts/_dbg-fix-unused-imports.py +0 -41
  674. package/scripts/_dbg-focus-range.mjs +0 -115
  675. package/scripts/_dbg-fresh-scene-e2e.mjs +0 -125
  676. package/scripts/_dbg-fullchain-e2e.mjs +0 -178
  677. package/scripts/_dbg-gate-debug.mjs +0 -37
  678. package/scripts/_dbg-gif-encode.mjs +0 -111
  679. package/scripts/_dbg-gizmo.mjs +0 -95
  680. package/scripts/_dbg-glass-probe.mjs +0 -57
  681. package/scripts/_dbg-glass-shot.mjs +0 -50
  682. package/scripts/_dbg-glass-sweep.mjs +0 -25
  683. package/scripts/_dbg-glb-probe.mjs +0 -43
  684. package/scripts/_dbg-goose-probe.mjs +0 -33
  685. package/scripts/_dbg-goose-probe.sh +0 -10
  686. package/scripts/_dbg-hardening-probe.mjs +0 -90
  687. package/scripts/_dbg-harness-cancel-repro.mjs +0 -81
  688. package/scripts/_dbg-harness-ui-dbg.py +0 -49
  689. package/scripts/_dbg-harness-ui-shot.py +0 -109
  690. package/scripts/_dbg-hero-btn-probe.mjs +0 -21
  691. package/scripts/_dbg-hidden-check.mjs +0 -21
  692. package/scripts/_dbg-hmi-audit.mjs +0 -164
  693. package/scripts/_dbg-home-repro.mjs +0 -24
  694. package/scripts/_dbg-home-stack.mjs +0 -13
  695. package/scripts/_dbg-host.mjs +0 -16
  696. package/scripts/_dbg-huashu-survey.mjs +0 -31
  697. package/scripts/_dbg-huashu-survey2.mjs +0 -35
  698. package/scripts/_dbg-huashu-verify.mjs +0 -25
  699. package/scripts/_dbg-huashu-verify2.mjs +0 -26
  700. package/scripts/_dbg-hydration-detail.mjs +0 -18
  701. package/scripts/_dbg-i18n-debug.mjs +0 -27
  702. package/scripts/_dbg-i18n-debug2.mjs +0 -26
  703. package/scripts/_dbg-i18n-final.mjs +0 -42
  704. package/scripts/_dbg-i18n-scan.mjs +0 -38
  705. package/scripts/_dbg-infra-lifecycle.mjs +0 -44
  706. package/scripts/_dbg-interval-config.mjs +0 -156
  707. package/scripts/_dbg-interval-scenario.mjs +0 -126
  708. package/scripts/_dbg-kicker-check.mjs +0 -11
  709. package/scripts/_dbg-line-aura-shots.mjs +0 -54
  710. package/scripts/_dbg-line-control-e2e.mjs +0 -120
  711. package/scripts/_dbg-line-gate-audit.mjs +0 -108
  712. package/scripts/_dbg-line-live-e2e.mjs +0 -144
  713. package/scripts/_dbg-line-repo-test.ts +0 -10
  714. package/scripts/_dbg-line-scenario-e2e.mjs +0 -256
  715. package/scripts/_dbg-line-spawn.ts +0 -31
  716. package/scripts/_dbg-live-engine-probe.mjs +0 -80
  717. package/scripts/_dbg-login-debug.py +0 -23
  718. package/scripts/_dbg-login-e2e.mjs +0 -26
  719. package/scripts/_dbg-logs-ui-e2e.py +0 -126
  720. package/scripts/_dbg-mcp-bridge-probe.mjs +0 -147
  721. package/scripts/_dbg-modbus-latency.mjs +0 -22
  722. package/scripts/_dbg-mqtt-chain-e2e.mjs +0 -90
  723. package/scripts/_dbg-mqtt-publisher.mjs +0 -17
  724. package/scripts/_dbg-nav-rpg.mjs +0 -84
  725. package/scripts/_dbg-nav-shot.mjs +0 -28
  726. package/scripts/_dbg-nav.mjs +0 -27
  727. package/scripts/_dbg-oneshot-impl-probe.ts +0 -67
  728. package/scripts/_dbg-opencode-sse.mjs +0 -101
  729. package/scripts/_dbg-opencode-start.ts +0 -57
  730. package/scripts/_dbg-opslog-e2e.mjs +0 -121
  731. package/scripts/_dbg-opslog-shots.mjs +0 -62
  732. package/scripts/_dbg-optimization-e2e.mjs +0 -94
  733. package/scripts/_dbg-orbit.mjs +0 -58
  734. package/scripts/_dbg-overview-probe.sh +0 -31
  735. package/scripts/_dbg-panesplitter-fix-check.mjs +0 -62
  736. package/scripts/_dbg-perms-visual.mjs +0 -36
  737. package/scripts/_dbg-pg-tcp-probe.cjs +0 -27
  738. package/scripts/_dbg-phase-e3-monitor.mjs +0 -25
  739. package/scripts/_dbg-pi-spawn-probe.ts +0 -33
  740. package/scripts/_dbg-plc-agent-loop.ts +0 -102
  741. package/scripts/_dbg-plc-e2e.mjs +0 -171
  742. package/scripts/_dbg-plugin-agent-read.ts +0 -56
  743. package/scripts/_dbg-plugin-config-ui.mjs +0 -111
  744. package/scripts/_dbg-plugin-matrix.mjs +0 -212
  745. package/scripts/_dbg-plugin-panels-ui.mjs +0 -54
  746. package/scripts/_dbg-plugin-sink-rest.mjs +0 -70
  747. package/scripts/_dbg-plugin-sink-ui.mjs +0 -81
  748. package/scripts/_dbg-plugin-tools-inject.ts +0 -80
  749. package/scripts/_dbg-plugin-ui-wizard.mjs +0 -125
  750. package/scripts/_dbg-plugin-verify-e2e.mjs +0 -123
  751. package/scripts/_dbg-plugins-e2e.mjs +0 -101
  752. package/scripts/_dbg-pop-clamp-verify.mjs +0 -77
  753. package/scripts/_dbg-preset-e2e.mjs +0 -116
  754. package/scripts/_dbg-preview-console.mjs +0 -28
  755. package/scripts/_dbg-preview-minrepro.mjs +0 -156
  756. package/scripts/_dbg-preview-pixels.mjs +0 -93
  757. package/scripts/_dbg-prompts-hotreload-test.ts +0 -76
  758. package/scripts/_dbg-prompts-resolve-test.ts +0 -39
  759. package/scripts/_dbg-quality-pages-e2e.mjs +0 -84
  760. package/scripts/_dbg-query-cancel.ts +0 -12
  761. package/scripts/_dbg-qwen-acp-probe.mjs +0 -30
  762. package/scripts/_dbg-qwen-capture.mjs +0 -21
  763. package/scripts/_dbg-rail-tree-e2e.mjs +0 -183
  764. package/scripts/_dbg-real-driver-e2e.mjs +0 -55
  765. package/scripts/_dbg-redesign-shots.mjs +0 -34
  766. package/scripts/_dbg-registry-smoke.ts +0 -14
  767. package/scripts/_dbg-release-smoke.mjs +0 -104
  768. package/scripts/_dbg-repo-setup-verify.mjs +0 -31
  769. package/scripts/_dbg-resolve-probe.ts +0 -6
  770. package/scripts/_dbg-restart-persist.mjs +0 -41
  771. package/scripts/_dbg-retention-test.ts +0 -25
  772. package/scripts/_dbg-rollback-mgr-audit.mjs +0 -169
  773. package/scripts/_dbg-rpg.mjs +0 -71
  774. package/scripts/_dbg-sc001-dispatch.mjs +0 -63
  775. package/scripts/_dbg-scenario-final-shot.mjs +0 -24
  776. package/scripts/_dbg-scenario-phase-e2.mjs +0 -75
  777. package/scripts/_dbg-scenario-phase-e3.mjs +0 -96
  778. package/scripts/_dbg-scenario-phase1.mjs +0 -90
  779. package/scripts/_dbg-scenario-phase2.mjs +0 -105
  780. package/scripts/_dbg-scenario-phase3-monitor.mjs +0 -48
  781. package/scripts/_dbg-scenario-phase3.mjs +0 -111
  782. package/scripts/_dbg-scene-polish-shot.mjs +0 -118
  783. package/scripts/_dbg-selring-probe.mjs +0 -47
  784. package/scripts/_dbg-settings-draft-probe.mjs +0 -39
  785. package/scripts/_dbg-settings-probe.mjs +0 -33
  786. package/scripts/_dbg-setup-e2e.mjs +0 -88
  787. package/scripts/_dbg-sideinfo.mjs +0 -101
  788. package/scripts/_dbg-sim-keeper.mjs +0 -100
  789. package/scripts/_dbg-splitter.mjs +0 -88
  790. package/scripts/_dbg-swatch-check.mjs +0 -10
  791. package/scripts/_dbg-task-cancel-probe.mjs +0 -66
  792. package/scripts/_dbg-team-drill.mjs +0 -173
  793. package/scripts/_dbg-town-alarm-e2e.mjs +0 -40
  794. package/scripts/_dbg-town-beauty-shots.mjs +0 -54
  795. package/scripts/_dbg-town-daq-shot.mjs +0 -26
  796. package/scripts/_dbg-town-full-e2e.mjs +0 -104
  797. package/scripts/_dbg-town-gate.mjs +0 -44
  798. package/scripts/_dbg-town-ins-probe.mjs +0 -37
  799. package/scripts/_dbg-town-perf.mjs +0 -50
  800. package/scripts/_dbg-town-polish-shots.mjs +0 -82
  801. package/scripts/_dbg-town-realtime.mjs +0 -42
  802. package/scripts/_dbg-town-shot.py +0 -25
  803. package/scripts/_dbg-town-shot3.mjs +0 -17
  804. package/scripts/_dbg-town-truth.mjs +0 -37
  805. package/scripts/_dbg-town-truth2.mjs +0 -27
  806. package/scripts/_dbg-transform-audit.mjs +0 -98
  807. package/scripts/_dbg-trend-expand-test.mjs +0 -38
  808. package/scripts/_dbg-twindaq-focus.mjs +0 -81
  809. package/scripts/_dbg-ui-polish-shot.mjs +0 -43
  810. package/scripts/_dbg-ui-polish-verify1.mjs +0 -92
  811. package/scripts/_dbg-ui-polish-verify2.mjs +0 -50
  812. package/scripts/_dbg-ui-polish-verify3.mjs +0 -51
  813. package/scripts/_dbg-ui-polish-verify4.mjs +0 -50
  814. package/scripts/_dbg-ui-shot.mjs +0 -26
  815. package/scripts/_dbg-ui-shots.mjs +0 -28
  816. package/scripts/_dbg-ui-survey.py +0 -52
  817. package/scripts/_dbg-unify-shot.mjs +0 -43
  818. package/scripts/_dbg-uplink-probe.mjs +0 -36
  819. package/scripts/_dbg-wizard-preview-shot.mjs +0 -58
  820. package/scripts/_dbg-wizard-ui-e2e.mjs +0 -93
  821. package/scripts/_dbg-ws-probe.mjs +0 -86
  822. package/scripts/_dbg-ws-shot2.mjs +0 -23
  823. package/scripts/_dbg-wsdot-sanity.mjs +0 -25
  824. package/scripts/_dev-stack.mjs +0 -46
  825. package/scripts/_http-driver-probe.mjs +0 -30
  826. package/scripts/_mqtt-driver-probe.mjs +0 -30
  827. package/scripts/_newdriver-rest-probe.mjs +0 -100
  828. package/scripts/_node-state-probe.mjs +0 -5
  829. package/scripts/_opcua-driver-probe.mjs +0 -31
  830. package/scripts/_rtu-debug.mjs +0 -41
  831. package/scripts/_rtu-direct.mjs +0 -6
  832. package/scripts/_rtu-driver-probe.mjs +0 -53
  833. package/scripts/_spike-pitui.mjs +0 -116
  834. package/scripts/_tmp-args-probe.mjs +0 -20
  835. package/scripts/_tmp-cyc-entry.mjs +0 -8
  836. package/scripts/_tmp-cyc-main.mjs +0 -5
  837. package/scripts/_tmp-cyc-mod.mjs +0 -2
  838. package/scripts/_tmp-cycle-a.mjs +0 -6
  839. package/scripts/_tmp-cycle-b.mjs +0 -2
  840. package/scripts/_tmp-cycle-probe.mjs +0 -4
  841. package/scripts/_tmp-entry-variant.mjs +0 -2
  842. package/scripts/_tmp-help-probe.mjs +0 -19
  843. package/scripts/_tmp-help-probe2.mjs +0 -2
  844. package/scripts/_tmp-trace-preload.mjs +0 -1
  845. package/scripts/_wizard-shots.mjs +0 -90
  846. package/scripts/acceptance-suite.py +0 -207
  847. package/scripts/aml-agent-bridge.ts +0 -230
  848. package/scripts/aml-industrial-loop.ts +0 -232
  849. package/scripts/build-film-devices.mjs +0 -227
  850. package/scripts/collab-live-test.py +0 -177
  851. package/scripts/debug-mcp-http.ts +0 -64
  852. package/scripts/demo-lead-worker.ts +0 -256
  853. package/scripts/demo-modes.ts +0 -415
  854. package/scripts/demo-omp-channel.ts +0 -135
  855. package/scripts/design-preflight.mjs +0 -223
  856. package/scripts/design-verify-templates.mjs +0 -110
  857. package/scripts/design-verify.mjs +0 -170
  858. package/scripts/dev-window.cmd +0 -6
  859. package/scripts/device-line-restore.mjs +0 -34
  860. package/scripts/diag-lead-status.ts +0 -101
  861. package/scripts/e2e-a2a-steer-live.mjs +0 -193
  862. package/scripts/e2e-dual-drive-comm.ts +0 -259
  863. package/scripts/e2e-full-scenario.ts +0 -321
  864. package/scripts/e2e-harness-consistency.ts +0 -204
  865. package/scripts/e2e-harness-provider-task.mjs +0 -126
  866. package/scripts/e2e-line-live.mjs +0 -144
  867. package/scripts/e2e-memory-persistence.ts +0 -320
  868. package/scripts/e2e-omp-modes.ts +0 -274
  869. package/scripts/e2e-omp-realtime.ts +0 -258
  870. package/scripts/e2e-plc-scenario.mjs +0 -292
  871. package/scripts/e2e-real-scenario.mjs +0 -466
  872. package/scripts/e2e-tab-close.mjs +0 -136
  873. package/scripts/e2e-token-ui.mjs +0 -149
  874. package/scripts/final-soup-run.py +0 -192
  875. package/scripts/final-soup-watch.py +0 -83
  876. package/scripts/i18n-codemod.mjs +0 -173
  877. package/scripts/i18n-fix-en.py +0 -28
  878. package/scripts/i18n-fix-en2.py +0 -31
  879. package/scripts/i18n-merge.mjs +0 -191
  880. package/scripts/migrate-local-time.mjs +0 -123
  881. package/scripts/omp-real-test.py +0 -328
  882. package/scripts/team-plugins-api-smoke.mjs +0 -149
  883. package/scripts/test-a2a-relay.mjs +0 -222
  884. package/scripts/test-aml-integration.ts +0 -159
  885. package/scripts/test-aml-job.ts +0 -174
  886. package/scripts/test-aml-unit.ts +0 -184
  887. package/scripts/test-api-client.ts +0 -108
  888. package/scripts/test-api-suite.mjs +0 -271
  889. package/scripts/test-block-consumption.mjs +0 -194
  890. package/scripts/test-cmd-render.mjs +0 -218
  891. package/scripts/test-collab-omp.mjs +0 -192
  892. package/scripts/test-config-precedence.ts +0 -124
  893. package/scripts/test-context-governor.ts +0 -176
  894. package/scripts/test-daq-frames.ts +0 -180
  895. package/scripts/test-daq-minio.ts +0 -77
  896. package/scripts/test-dedup-logic.ts +0 -132
  897. package/scripts/test-e2e-collaboration.ts +0 -262
  898. package/scripts/test-e2e-monitor.ts +0 -192
  899. package/scripts/test-event-history.ts +0 -112
  900. package/scripts/test-exec-modes.ts +0 -316
  901. package/scripts/test-fifo-realtime.mjs +0 -193
  902. package/scripts/test-final-e2e.mjs +0 -290
  903. package/scripts/test-goal-summary.ts +0 -202
  904. package/scripts/test-harness-liveness.ts +0 -109
  905. package/scripts/test-harness-terminal.ts +0 -164
  906. package/scripts/test-header-trail.mjs +0 -95
  907. package/scripts/test-hitl.ts +0 -360
  908. package/scripts/test-koda-restyle.mjs +0 -105
  909. package/scripts/test-lane-raw.ts +0 -67
  910. package/scripts/test-lanes-history-render.mjs +0 -138
  911. package/scripts/test-loop-omp.mjs +0 -154
  912. package/scripts/test-mdlite.ts +0 -53
  913. package/scripts/test-memory-brief-chronicle.ts +0 -180
  914. package/scripts/test-memory-rrf-mmr.ts +0 -114
  915. package/scripts/test-mock-collab.mjs +0 -226
  916. package/scripts/test-modern-render.mjs +0 -174
  917. package/scripts/test-omp-terminal.mjs +0 -187
  918. package/scripts/test-plugin-ext.ts +0 -173
  919. package/scripts/test-prompts-loader.ts +0 -56
  920. package/scripts/test-real-scenario.mjs +0 -290
  921. package/scripts/test-stream-render.ts +0 -37
  922. package/scripts/test-task-drawer.mjs +0 -204
  923. package/scripts/test-task-invariants.mjs +0 -169
  924. package/scripts/test-town-3d.mjs +0 -121
  925. package/scripts/test-town-layout.mjs +0 -200
  926. package/scripts/test-town-page.mjs +0 -136
  927. package/scripts/test-town-scene-math.ts +0 -169
  928. package/scripts/test-town-twin.mjs +0 -121
  929. package/scripts/test-town-upload.mjs +0 -89
  930. package/scripts/test-town-user-flow.mjs +0 -619
  931. package/scripts/test-town-world.mjs +0 -76
  932. package/scripts/test-town-wuwa.mjs +0 -198
  933. package/scripts/test-user-isolation.mjs +0 -193
  934. package/scripts/test-workshop-entries.ts +0 -370
  935. package/scripts/test-workspace-api.ts +0 -329
  936. package/scripts/test-ws-aep.mjs +0 -187
  937. package/scripts/test-ws-protocol.ts +0 -134
  938. package/scripts/town-demo-seed.mjs +0 -75
  939. package/scripts/town-scene-clear.mjs +0 -56
  940. package/scripts/verify-exec-modes-report.ts +0 -248
  941. package/scripts/verify-lead-mail.ts +0 -188
  942. package/scripts/verify-page-smoke.mjs +0 -87
  943. package/scripts/ws-test.mjs +0 -176
  944. package/scripts/ws-test.py +0 -4
@@ -1,104 +0,0 @@
1
- /**
2
- * 发布前五大功能烟囱测试:产线管理 / 数采数控 / 插件处理节点 / Agent 团队作业 / 数字孪生。
3
- * 运行: node scripts/_dbg-release-smoke.mjs
4
- */
5
- import puppeteer from 'puppeteer-core'
6
-
7
- const ROOT = 'http://127.0.0.1:3000'
8
- const sleep = ms => new Promise(r => setTimeout(r, ms))
9
- let failed = 0
10
- const ok = (name, cond, detail = '') => { console.log(` ${cond ? 'PASS' : 'FAIL'} ${name}${detail ? ` — ${detail}` : ''}`); if (!cond) failed++ }
11
-
12
- const login = await fetch(`${ROOT}/api/users/login`, { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ email: process.env.E2E_USER ?? 'zhangwei@awshop.io', password: process.env.E2E_PASS ?? 'Awshop@123' }) }).then(r => r.json())
13
- const H = { authorization: `Bearer ${login.data.token}`, 'content-type': 'application/json' }
14
- const j = (u, m = 'GET', b) => fetch(ROOT + u, { method: m, headers: H, body: b ? JSON.stringify(b) : undefined }).then(r => r.json())
15
-
16
- // ===== ① 产线管理 =====
17
- console.log('\n--- ① 产线管理 ---')
18
- {
19
- const d = (await j('/api/workshop/dcw')).data
20
- ok('产线清单可读', (d.lines?.length ?? 0) > 0, `${d.lines?.length} 条`)
21
- ok('配方清单可读', (d.recipes?.length ?? 0) > 0, `${d.recipes?.length} 条`)
22
- const cand = d.lines.map(l => ({ line: l, recipe: d.recipes.find(r => r.lineId === l.id) })).find(x => x.recipe)
23
- const stop = await j(`/api/workshop/dcw/lines/${cand.line.id}/stop`, 'POST').catch(() => null)
24
- ok('停线操作可用', stop !== null)
25
- await sleep(800)
26
- const st = await j(`/api/workshop/dcw/lines/${cand.line.id}/start`, 'POST', { recipeId: cand.recipe.id })
27
- ok('开跑操作可用(产线激活)', st.data?.line?.active === true)
28
- const daqA = (await j('/api/workshop/daq')).data
29
- await sleep(4000)
30
- const daqB = (await j('/api/workshop/daq')).data
31
- ok('产线运行态保持(采样持续)', daqB.meta.produced > daqA.meta.produced, `produced ${daqA.meta.produced} → ${daqB.meta.produced}`)
32
- // 保持运行(后续数采/插件节点依赖);结束统一停线
33
- globalThis.__smokeLine = cand.line.id
34
- }
35
-
36
- // ===== ② 数采数控 =====
37
- console.log('\n--- ② 数采数控 ---')
38
- {
39
- const daq = (await j('/api/workshop/daq')).data
40
- ok('数采节点清单可读', (daq.nodes?.length ?? 0) > 0, `${daq.nodes.length} 节点`)
41
- ok('数采后端就绪(timescale/mqtt/minio)', daq.meta.tsdb === 'timescale' && daq.meta.queue === 'mqtt' && daq.meta.objectstore === 'minio', JSON.stringify({ tsdb: daq.meta.tsdb, queue: daq.meta.queue, os: daq.meta.objectstore }))
42
- const live = daq.nodes.filter(n => n.value != null && n.state === 'ok').length
43
- ok('标量节点实时采集中', live > 0, `${live} 节点有值`)
44
- const dcw = (await j('/api/workshop/dcw')).data
45
- const dcwLive = dcw.nodes?.filter(n => n.value != null) ?? []
46
- ok('数控节点有设定/回读值', dcwLive.length > 0, `${dcwLive.length} 节点`)
47
- const framesOk = daq.meta.framesStored == null || daq.meta.framesStored >= 0
48
- ok('帧管线指标可用', framesOk, `framesStored=${daq.meta.framesStored}`)
49
- }
50
-
51
- // ===== ③ 插件处理节点 =====
52
- console.log('\n--- ③ 插件处理节点 ---')
53
- {
54
- const daq = (await j('/api/workshop/daq')).data
55
- ok('插件模板在目录(plug-demo-roughness)', daq.templates.some(t => t.plugin && t.signalKind === 'vector'))
56
- const manifest = await fetch(`${ROOT}/api/plugins/manifest`).then(r => r.json())
57
- const names = ((manifest.data ?? manifest).plugins ?? []).map(p => p.name)
58
- ok('三个扩展插件已装载', ['daq-vector-demo', 'omp-sensor-tools', 'daq-sink-verify'].every(n => names.includes(n)), names.join(','))
59
- }
60
-
61
- // ===== ④ Agent 团队作业 =====
62
- console.log('\n--- ④ Agent 团队作业 ---')
63
- {
64
- const agents = (await j('/api/workshop/agents')).data
65
- const list = agents.agents ?? agents
66
- ok('Agent 实例清单可读', list.length > 0, `${list.length} 实例`)
67
- const channels = (await j('/api/workshop/channels')).data
68
- const chList = channels.data ?? channels
69
- ok('Channel 清单可读', (Array.isArray(chList) ? chList : chList.channels ?? []).length >= 0)
70
- const chList2 = (await j('/api/workshop/channels')).data
71
- const ch0 = (Array.isArray(chList2) ? chList2 : chList2.channels ?? [])[0]
72
- const memories = ch0 ? await j(`/api/workshop/channels/${ch0.id}/memories?limit=3`).catch(e => ({ data: null })) : { data: null }
73
- ok('记忆系统可读(channel 级)', Array.isArray(memories.data))
74
- }
75
-
76
- // ===== ⑤ 数字孪生控制(浏览器)=====
77
- console.log('\n--- ⑤ 数字孪生 ---')
78
- {
79
- const browser = await puppeteer.launch({ executablePath: 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe', headless: 'new', args: ['--no-sandbox', '--disable-gpu', '--window-size=1600,1000'] })
80
- const page = await browser.newPage()
81
- await page.setViewport({ width: 1600, height: 1000 })
82
- await page.setCookie({ name: 'token', value: login.data.token, domain: '127.0.0.1', path: '/' })
83
- let pageError = false
84
- page.on('pageerror', () => { pageError = true })
85
- await page.goto(`${ROOT}/town`, { waitUntil: 'domcontentloaded', timeout: 90000 })
86
- await sleep(22000)
87
- const town = await page.evaluate(() => ({
88
- canvas: document.querySelectorAll('canvas').length,
89
- panelDaq: document.querySelectorAll('.twin-daq .daq-item').length,
90
- panelDcw: document.querySelectorAll('.twin-dcw .dcw-item').length,
91
- }))
92
- ok('/town 页面加载(canvas 场景)', town.canvas > 0, `${town.canvas} canvas`)
93
- ok('孪生面板数采监控行', town.panelDaq > 0, `${town.panelDaq} 行`)
94
- ok('孪生面板数控设定行', town.panelDcw > 0, `${town.panelDcw} 行`)
95
- ok('/town 无页面级 JS 错误', !pageError)
96
- // 控制面:DCW 设定行存在即数控控制面已接入面板
97
- await browser.close()
98
- }
99
-
100
- // ===== 收尾:停线 =====
101
- if (globalThis.__smokeLine) await j(`/api/workshop/dcw/lines/${globalThis.__smokeLine}/stop`, 'POST').catch(() => {})
102
-
103
- console.log(failed === 0 ? '\nRELEASE SMOKE ALL PASS' : `\nRELEASE SMOKE FAILED(${failed})`)
104
- process.exit(failed === 0 ? 0 : 1)
@@ -1,31 +0,0 @@
1
- // repo 实例 setup 流程 API 验证:轮询等待服务起来 → 立刻注册(抢在探针前) → 断言 admin
2
- const BASE = 'http://127.0.0.1:3001'
3
- const CREDS = { name: 'admin', email: 'admin@awshop.local', password: 'Awshop2026' }
4
- const api = async (path, opts = {}) => {
5
- const res = await fetch(`${BASE}${path}`, { ...opts, headers: { 'content-type': 'application/json', ...opts.headers } })
6
- return { status: res.status, body: await res.json().catch(() => null) }
7
- }
8
-
9
- let alive = false
10
- for (let i = 0; i < 120; i++) {
11
- try { await fetch(`${BASE}/api/health`, { signal: AbortSignal.timeout(800) }); alive = true; break }
12
- catch { await new Promise(r => setTimeout(r, 500)) }
13
- }
14
- if (!alive) { console.error('✖ 服务未在超时内就绪'); process.exit(1) }
15
-
16
- const s0 = await api('/api/users/setup-status')
17
- console.log('setup-status 初始:', JSON.stringify(s0.body?.data), s0.status === 200 && s0.body?.data?.needsSetup === true ? '✔' : '✖')
18
- if (s0.body?.data?.needsSetup !== true) process.exit(1)
19
-
20
- const reg = await api('/api/users/register', { method: 'POST', body: JSON.stringify(CREDS) })
21
- console.log('注册首个账号:', reg.body?.data?.user?.email, reg.body?.data?.user?.role, reg.body?.data?.user?.role === 'admin' ? '✔' : '✖')
22
- if (reg.body?.data?.user?.role !== 'admin') process.exit(1)
23
-
24
- const s1 = await api('/api/users/setup-status')
25
- console.log('注册后 setup-status:', JSON.stringify(s1.body?.data), s1.body?.data?.needsSetup === false ? '✔' : '✖')
26
-
27
- const login = await api('/api/users/login', { method: 'POST', body: JSON.stringify({ email: CREDS.email, password: CREDS.password }) })
28
- console.log('新管理员登录:', login.body?.data?.user?.role === 'admin' ? '✔' : '✖')
29
- const me = await api('/api/users/me', { headers: { authorization: `Bearer ${login.body?.data?.token}` } })
30
- console.log('/api/users/me:', me.body?.data?.role === 'admin' ? '✔' : '✖')
31
- console.log(me.body?.data?.role === 'admin' ? 'REPO-SETUP-OK' : 'REPO-SETUP-FAIL')
@@ -1,6 +0,0 @@
1
- /** resolveOnPath 探针:验证增强 PATH 下 cursor-agent 可解析 */
2
- import { resolveOnPath } from '../server/services/workshop/agents/adapters/line-spawn'
3
-
4
- for (const cmd of ['cursor-agent', 'gemini', 'goose', 'copilot', 'crush', 'qwen']) {
5
- console.log(`${cmd} => ${resolveOnPath(cmd) ?? 'NOT FOUND'}`)
6
- }
@@ -1,41 +0,0 @@
1
- /**
2
- * 一次性:重启存活验证 —— dev 重启后,前端配置的节点(daqs.json)仍存在,
3
- * 且 driverConfig 完整、采集在真实 MQTT/Timescale 链路上恢复。
4
- * 前置:外部已重启 dev(本脚本轮询 health 最多 3 分钟),然后查节点+样本增量。
5
- */
6
- const BASE = 'http://127.0.0.1:3000'
7
- let ready = false
8
- for (let i = 0; i < 36; i++) {
9
- try {
10
- const r = await fetch(`${BASE}/api/health`).then(x => x.json())
11
- if (r?.code === 0) { ready = true; break }
12
- }
13
- catch { /* 未就绪 */ }
14
- await new Promise(rr => setTimeout(rr, 5000))
15
- }
16
- if (!ready) { console.error('dev 未就绪'); process.exit(1) }
17
-
18
- const login = await fetch(`${BASE}/api/users/login`, {
19
- method: 'POST',
20
- headers: { 'content-type': 'application/json' },
21
- body: JSON.stringify({ email: process.env.E2E_USER ?? 'zhangwei@awshop.io', password: process.env.E2E_PASS ?? 'Awshop@123' }),
22
- }).then(r => r.json())
23
- const H = { 'authorization': `Bearer ${login.data.token}`, 'content-type': 'application/json' }
24
-
25
- const list = await fetch(`${BASE}/api/workshop/daq`, { headers: H }).then(r => r.json())
26
- const audit = list.data.nodes.find(n => n.name.includes('MQTT链路审计'))
27
- if (!audit) { console.error('FAIL: 重启后审计节点丢失'); process.exit(1) }
28
- console.log('[survived]', audit.id, '| driver =', audit.driver, '| cfg =', JSON.stringify(audit.driverConfig))
29
-
30
- const s1 = await fetch(`${BASE}/api/workshop/daq/${audit.id}/samples?limit=500`, { headers: H }).then(r => r.json())
31
- console.log('[samples after restart]', (s1.data?.points ?? []).length, 'rows(时序库随卷持久化)')
32
-
33
- const infra = list.data.infra
34
- console.log('[infra]', JSON.stringify(infra))
35
- const ok = audit.driver === 'modbus-tcp' && audit.driverConfig?.host === '127.0.0.1' && audit.driverConfig?.register === 40001
36
- && infra?.mqttOnline === true && infra?.tsdbOnline === true
37
- console.log(ok ? '=== RESTART PERSISTENCE PASS ===' : '=== RESTART PERSISTENCE FAIL ===')
38
-
39
- // 清理审计节点
40
- await fetch(`${BASE}/api/workshop/daq/${audit.id}`, { method: 'DELETE', headers: H })
41
- process.exit(ok ? 0 : 1)
@@ -1,25 +0,0 @@
1
- /**
2
- * 保留策略单元验证(hardening GROW-1 / AC-5):临时库种过期行 → sweep → 断言。
3
- * 用法:npx tsx scripts/_dbg-retention-test.ts
4
- */
5
- import { DatabaseSync } from 'node:sqlite'
6
- import { runRetentionSweep } from '../server/services/workshop/db/retention'
7
-
8
- const db = new DatabaseSync(':memory:')
9
- db.exec('CREATE TABLE messages (id TEXT PRIMARY KEY, created_at TEXT NOT NULL)')
10
- db.exec('CREATE TABLE audit_log (id INTEGER PRIMARY KEY AUTOINCREMENT, at TEXT NOT NULL)')
11
- db.exec('CREATE TABLE approval_history (id TEXT PRIMARY KEY, created_at TEXT NOT NULL)')
12
- const old = new Date(Date.now() - 40 * 86_400_000).toISOString()
13
- const ancient = new Date(Date.now() - 120 * 86_400_000).toISOString()
14
- const fresh = new Date(Date.now() - 1000).toISOString()
15
- for (let i = 0; i < 12; i++) {
16
- db.prepare('INSERT INTO messages VALUES (?,?)').run(`m${i}`, i < 8 ? old : fresh)
17
- db.prepare('INSERT INTO audit_log (at) VALUES (?)').run(i < 6 ? ancient : fresh)
18
- db.prepare('INSERT INTO approval_history VALUES (?,?)').run(`a${i}`, fresh)
19
- }
20
- console.log('SWEEP =', JSON.stringify(runRetentionSweep(db)))
21
- const c = (t: string) => String((db.prepare(`SELECT COUNT(*) c FROM ${t}`).get() as { c: number }).c)
22
- console.log(`剩量 messages=${c('messages')}(期望4) audit=${c('audit_log')}(期望6) approval=${c('approval_history')}(期望12)`)
23
-
24
- process.env.AW_RETENTION_DISABLED = '1'
25
- console.log('逃生门 =', JSON.stringify(runRetentionSweep(db)), '(期望 [])')
@@ -1,169 +0,0 @@
1
- /**
2
- * 调控闭环 M1/M2 审计:RecipeRollBackManager + Repo + 设定历史在册 + 窗口归属 + 判定/回退/护栏。
3
- * 全 REST 真链路;对齐 _dbg-dcw-audit 风格。用法:AW_PAGE_TOKEN=<token> node scripts/_dbg-rollback-mgr-audit.mjs
4
- */
5
- const BASE = process.env.AW_PAGE_BASE ?? 'http://127.0.0.1:3000'
6
- const TOKEN = process.env.AW_PAGE_TOKEN ?? ''
7
- const H = { 'authorization': `Bearer ${process.env.ADMIN_TOKEN ?? TOKEN}`, 'content-type': 'application/json' }
8
- let pass = 0
9
- let fail = 0
10
- const ok = (cond, label) => {
11
- if (cond) { pass++; console.log(`PASS ${label}`) }
12
- else { fail++; console.log(`FAIL ${label}`) }
13
- }
14
- const sleep = ms => new Promise(r => setTimeout(r, ms))
15
- const jget = p => fetch(`${BASE}/api/workshop/dcw${p}`, { headers: H }).then(r => r.json())
16
- const jpost = async (p, b) => {
17
- const r = await fetch(`${BASE}/api/workshop/dcw${p}`, { method: 'POST', headers: H, body: JSON.stringify(b ?? {}) })
18
- const j = await r.json().catch(() => ({}))
19
- if (!r.ok || j.code !== 0) console.log(` [debug] POST ${p} → ${r.status} ${JSON.stringify(j).slice(0, 200)}`)
20
- return j
21
- }
22
- const jpatch = (p, b) => fetch(`${BASE}/api/workshop/dcw${p}`, { method: 'PATCH', headers: H, body: JSON.stringify(b ?? {}) }).then(r => r.json())
23
- const inv = async (agentId, tool, args) => {
24
- const r = await fetch(`${BASE}/api/workshop/agent-tools/invoke`, { method: 'POST', headers: H, body: JSON.stringify({ agentId, tool, args }) })
25
- const j = await r.json().catch(() => ({}))
26
- if (!r.ok || j.code !== 0) console.log(` [debug] invoke ${tool} → ${r.status} ${JSON.stringify(j).slice(0, 200)}`)
27
- return j
28
- }
29
- const rand = () => Math.random().toString(36).slice(2, 7)
30
- const AGENT1 = `rb-agent-${rand()}`
31
- const AGENT2 = `rb-agent-${rand()}`
32
-
33
- // ---- 0) 网关确保运行 ----
34
- {
35
- const r = await fetch(`${BASE}/api/workshop/dcw`, { headers: H }).then(x => x.json())
36
- if (!r?.data?.controller?.running)
37
- await fetch(`${BASE}/api/workshop/dcw/controller?action=resume`, { method: 'POST', headers: H }).then(x => x.json())
38
- }
39
- const ctrl = await jget('')
40
- ok(ctrl?.data?.controller?.running === true, '网关运行中')
41
-
42
- // ---- 1) 造实体:产线 L + 数控节点 N1/N2 + 产品 P + 配方 R ----
43
- const line = (await jpost('/lines', { name: `RB审计线-${rand()}` })).data.line
44
- const n1 = (await jpost('', { templateRef: 'dcw-temp-sp', name: `RB审计-温度设定-${rand()}`, lineId: line.id })).data.node
45
- const n2 = (await jpost('', { templateRef: 'dcw-temp-sp', name: `RB审计-压力设定-${rand()}`, lineId: line.id })).data.node
46
- ok(!!line?.id && !!n1?.id && !!n2?.id, `实体创建(线 ${line.id} / 节点 ${n1.id},${n2.id})`)
47
- const product = (await jpost('/products', { lineId: line.id, name: `RB审计产品-${rand()}` })).data.product
48
- const recipe = (await jpost('/recipes', { productId: product.id, name: `RB审计配方-${rand()}`, params: [{ nodeId: n1.id, value: 175, min: 160, max: 180 }] })).data.recipe
49
- ok(!!product?.id && !!recipe?.id, '产品/配方创建')
50
-
51
- // ---- 2) 手动写 → 锚在册(AC1.1/1.3) ----
52
- const w1 = await jpost(`/${n1.id}/write`, { value: 170 })
53
- ok(w1.data?.outcome?.ok === true, `手动写 170 ACK(锚 ${w1.data?.outcome?.anchorId ?? '-'})`)
54
- const w2 = await jpost(`/${n1.id}/write`, { value: 172 })
55
- ok(w2.data?.outcome?.ok === true && w2.data?.outcome?.anchorId, '手动写 172 ACK + 锚')
56
- let journal = (await jget(`/journal?nodeId=${n1.id}&limit=50`)).data.anchors
57
- const a170 = journal.find(a => a.prevValue == null && a.newValue === 170)
58
- const a172 = journal.find(a => a.prevValue === 170 && a.newValue === 172)
59
- ok(!!a170 && !!a172 && a170.source === 'manual' && a172.source === 'manual', `手动写锚在册(source=manual;首写 prevValue=null)`)
60
- // 心跳/同值 5s 内不重复记锚(AC1.2):立刻同值再写 → 锚数不变
61
- await jpost(`/${n1.id}/write`, { value: 172 })
62
- const journal2 = (await jget(`/journal?nodeId=${n1.id}&limit=50`)).data.anchors
63
- ok(journal2.length === journal.length, '同值 5s 内重复写不产生新锚')
64
-
65
- // ---- 3) 配方 apply → recipe 锚 + run.paramsSnapshot(AC1.4) ----
66
- const applyRes = await jpost(`/recipes/${recipe.id}/apply`, {})
67
- const run1 = applyRes.data?.run
68
- ok(!!run1?.id && Array.isArray(run1.paramsSnapshot) && run1.paramsSnapshot[0]?.nodeId === n1.id && run1.paramsSnapshot[0]?.value === 175, 'apply 建批 + paramsSnapshot 冻结')
69
- journal = (await jget(`/journal?nodeId=${n1.id}&limit=50`)).data.anchors
70
- ok(journal.some(a => a.source === 'recipe' && a.newValue === 175 && a.recipeRunId === run1.id), '配方路径锚在册(source=recipe,带 runId)')
71
-
72
- // ---- 4) Agent 路径:auto 绑定 → dcw_control 开记录(AC1.4) ----
73
- await fetch(`${BASE}/api/workshop/agent-tools/bindings`, { method: 'POST', headers: H, body: JSON.stringify({ agentId: AGENT1, nodeId: n1.id, kind: 'dcw', mode: 'auto' }) }).then(r => r.json())
74
- const c1 = await inv(AGENT1, 'dcw_control', { node_id: n1.id, value: 176, hypothesis: 'RB审计假设:提温 1℃ 预期张力 +2%' })
75
- ok(/下发成功/.test(c1.data?.result?.text ?? '') && /优化记录/.test(c1.data?.result?.text ?? ''), `dcw_control 成功 + 闭环回包(${(c1.data?.result?.text ?? '').slice(0, 40)}...)`)
76
- const recId = (c1.data?.result?.text.match(/优化记录 (opt-[0-9a-f]+)/) ?? [])[1]
77
- ok(!!recId, `优化记录 id 回包(${recId})`)
78
- let records = (await jget(`/optimizations?nodeId=${n1.id}`)).data.records
79
- const rec = records.find(r => r.id === recId)
80
- ok(rec?.status === 'open' && rec?.agentId === AGENT1 && rec?.policy === 'auto_rollback' && rec?.params[0]?.from === 175 && rec?.params[0]?.to === 176, '记录字段完整(open/agentId/policy/from→to)')
81
- ok(rec?.hypothesis?.includes('RB审计假设'), '假设入册(hypothesis)')
82
-
83
- // ---- 5) 窗口归属:再次设定 → 旧记录关闭 + windowAgg 异步补齐(AC1.5) ----
84
- await sleep(1500)
85
- const c2 = await inv(AGENT1, 'dcw_control', { node_id: n1.id, value: 177 })
86
- const recId2 = (c2.data?.result?.text.match(/优化记录 (opt-[0-9a-f]+)/) ?? [])[1]
87
- await sleep(2500)
88
- records = (await jget(`/optimizations?nodeId=${n1.id}`)).data.records
89
- const recClosed = records.find(r => r.id === recId)
90
- ok(recClosed?.status === 'superseded' && recClosed?.closedBy === 'superseded' && !!recClosed?.closedAt, '旧记录被新设定关闭(superseded)')
91
- ok(recClosed?.aggPending === false && Array.isArray(recClosed?.windowAgg?.channels), `windowAgg 异步回填完成(aggPending=false,通道 ${recClosed?.windowAgg?.channels?.length ?? 0})`)
92
-
93
- // ---- 6) series 接口(AC2.6 部分) ----
94
- const series = (await jget(`/optimizations/${recId}/series`)).data
95
- ok(Array.isArray(series?.channels) && series.channels.length >= 0 && !!series?.record, `series 接口可用(通道 ${series?.channels?.length ?? 0})`)
96
-
97
- // ---- 7) dcw_judge keep → lastGood(AC2.1 部分) ----
98
- const judge = await inv(AGENT1, 'dcw_judge', { record_id: recId2, verdict: 'keep', reason: 'RB审计:窗口内张力 +2.1%,收敛达标' })
99
- ok(/判定已入册/.test(judge.data?.result?.text ?? ''), 'dcw_judge keep 入册')
100
- records = (await jget(`/optimizations?nodeId=${n1.id}`)).data.records
101
- ok(records.find(r => r.id === recId2)?.status === 'judged-keep', 'keep 后记录状态 judged-keep')
102
- // lineStart(开跑按 T4 语义重下发配方值)后:再走一轮 keep → markGood 生效(active run 才能标记)
103
- const startRes = await jpost(`/lines/${line.id}/start`, { recipeId: recipe.id })
104
- ok(startRes.code === 0, `产线开跑(${startRes.code})`)
105
- const cKeep = await inv(AGENT1, 'dcw_control', { node_id: n1.id, value: 177, hypothesis: 'RB审计:二次微调' })
106
- const recIdK = (cKeep.data?.result?.text.match(/优化记录 (opt-[0-9a-f]+)/) ?? [])[1]
107
- const jk = await inv(AGENT1, 'dcw_judge', { record_id: recIdK, verdict: 'keep', reason: 'RB审计:开跑后复测收敛' })
108
- console.log(` [debug] keep-judge: ${(jk.data?.result?.text ?? '').slice(0, 90)} | recIdK=${recIdK}`)
109
- const goodCheck = (await jget('/recipes')).data.recipes.find(r => r.id === recipe.id)
110
- console.log(` [debug] recipe.lastGoodRunId=${goodCheck?.lastGoodRunId}`)
111
- const ledger = (await jget(`/${n1.id}/param-ledger`)).data.ledger
112
- ok(ledger?.current != null && ledger?.recipeTarget != null && ledger?.lastGood != null, `参数台账三值(current=${ledger?.current},target=${ledger?.recipeTarget},lastGood=${ledger?.lastGood})`)
113
- ok(ledger?.journal?.length > 0 && ledger?.records?.length > 0, '台账含 journal + records')
114
-
115
- // ---- 8) judge rollback + dcw_rollback 执行 → 回退记录 + 冷却(AC2.1/2.3/2.4) ----
116
- const c3 = await inv(AGENT1, 'dcw_control', { node_id: n1.id, value: 179 })
117
- const recId3 = (c3.data?.result?.text.match(/优化记录 (opt-[0-9a-f]+)/) ?? [])[1]
118
- ok(!!recId3, '第三条优化记录开出')
119
- const jr = await inv(AGENT1, 'dcw_judge', { record_id: recId3, verdict: 'rollback', reason: 'RB审计:张力越窗,判应回退' })
120
- ok(/判定已入册/.test(jr.data?.result?.text ?? ''), 'judge rollback 入册(不执行)')
121
- const beforeVal = (await jget(`/${n1.id}/param-ledger`)).data.ledger.current
122
- const rbRes = await inv(AGENT1, 'dcw_rollback', { record_id: recId3 })
123
- ok(/回退已执行/.test(rbRes.data?.result?.text ?? ''), `dcw_rollback 执行(${(rbRes.data?.result?.text ?? '').slice(0, 50)})`)
124
- records = (await jget(`/optimizations?nodeId=${n1.id}`)).data.records
125
- ok(records.find(r => r.id === recId3)?.status === 'rolled-back', '原记录 rolled-back')
126
- const rbRecord = records.find(r => r.rollbackOf === recId3)
127
- const origFrom = records.find(r => r.id === recId3)?.params[0]?.from
128
- ok(!!rbRecord && rbRecord.params[0]?.from === beforeVal && rbRecord.params[0]?.to === origFrom, `回退新记录在册(rollbackOf 回指,${beforeVal} → ${rbRecord?.params[0]?.to},目标=原记录基线 ${origFrom})`)
129
- // 冷却:agent 立即同向写 → 409
130
- const c4 = await inv(AGENT1, 'dcw_control', { node_id: n1.id, value: 179 })
131
- ok(/冷却/.test(c4.data?.result?.text ?? ''), `冷却护栏生效(${(c4.data?.result?.text ?? '').slice(0, 60)})`)
132
-
133
- // ---- 9) Agent 互斥(F):agent2 未判定时写同节点 → 409 ----
134
- const bindDebug = await fetch(`${BASE}/api/workshop/agent-tools/bindings`, { method: 'POST', headers: H, body: JSON.stringify({ agentId: AGENT2, nodeId: n2.id, kind: 'dcw', mode: 'auto' }) })
135
- console.log(` [debug] bind AGENT2→n2: ${bindDebug.status} ${(await bindDebug.text()).slice(0, 120)}`)
136
- const bindDebug2 = await fetch(`${BASE}/api/workshop/agent-tools/bindings`, { method: 'POST', headers: H, body: JSON.stringify({ agentId: AGENT1, nodeId: n2.id, kind: 'dcw', mode: 'auto' }) })
137
- console.log(` [debug] bind AGENT1→n2: ${bindDebug2.status} ${(await bindDebug2.text()).slice(0, 120)}`)
138
- const a1n2 = await inv(AGENT1, 'dcw_control', { node_id: n2.id, value: 171 })
139
- console.log(` [debug] AGENT1→n2: ${(a1n2.data?.result?.text ?? '').slice(0, 100)}`)
140
- const mutex = await inv(AGENT2, 'dcw_control', { node_id: n2.id, value: 172 })
141
- ok(/正在优化试验中/.test(mutex.data?.result?.text ?? ''), `Agent 互斥护栏(第二 Agent 被拒:${(mutex.data?.result?.text ?? '').slice(0, 50)})`)
142
- // 手动写不被阻塞但 supersede(AC2.4 部分)
143
- const mw = await jpost(`/${n2.id}/write`, { value: 173 })
144
- ok(mw.data?.outcome?.ok === true, '手动写不被互斥阻塞')
145
- records = (await jget(`/optimizations?nodeId=${n2.id}`)).data.records
146
- ok(records[0]?.status === 'superseded-manual', `手动写 supersede open 记录(${records[0]?.closedBy})`)
147
-
148
- // ---- 10) Recipe 版本化(AC1.5) ----
149
- const beforeVersion = (await jget('/recipes')).data.recipes.find(r => r.id === recipe.id).version ?? 1
150
- await jpatch(`/recipes/${recipe.id}`, { params: [{ nodeId: n1.id, value: 176, min: 160, max: 180 }] })
151
- const afterRecipe = (await jget('/recipes')).data.recipes.find(r => r.id === recipe.id)
152
- ok((afterRecipe.version ?? 1) === beforeVersion + 1 && (afterRecipe.paramsHistory?.length ?? 0) > 0, `参数版本化(version ${beforeVersion}→${afterRecipe.version},history ${afterRecipe.paramsHistory?.length})`)
153
-
154
- // ---- 11) lineStop 封窗 + mark-good/rollback-good ----
155
- await jpost(`/lines/${line.id}/stop`, {})
156
- records = (await jget(`/optimizations?lineId=${line.id}&status=open`)).data.records
157
- ok(records.length === 0, 'lineStop 封窗(open 记录清零)')
158
- await jpost(`/recipes/${recipe.id}/mark-good`, { runId: run1.id })
159
- const goodRecipe = (await jget('/recipes')).data.recipes.find(r => r.id === recipe.id)
160
- ok(goodRecipe?.lastGoodRunId === run1.id, 'mark-good 标记良好批次')
161
- await jpost(`/lines/${line.id}/start`, { recipeId: recipe.id })
162
- const rg = await jpost(`/recipes/${recipe.id}/rollback-good`, {})
163
- const rgOut = rg.data?.outcomes ?? []
164
- ok(rgOut.length > 0 && rgOut.every(o => o.ok), `基准恢复执行(${rgOut.length} 参数全 ACK)`)
165
-
166
- // ---- 12) 清场(非破坏:停线;节点删除走 purge 既有级联) ----
167
- await jpost(`/lines/${line.id}/stop`, {})
168
- console.log(`\n=== 结果:${pass} PASS / ${fail} FAIL ===`)
169
- process.exit(fail > 0 ? 1 : 0)
@@ -1,71 +0,0 @@
1
- import puppeteer from 'puppeteer-core'
2
-
3
- const BASE = process.env.AW_PAGE_BASE ?? 'http://127.0.0.1:3000'
4
- const TOKEN = process.env.AW_PAGE_TOKEN ?? ''
5
- const browser = await puppeteer.launch({
6
- executablePath: 'C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe',
7
- headless: 'new', args: ['--no-sandbox', '--disable-gpu', '--window-size=1600,1000'],
8
- })
9
- const page = await browser.newPage()
10
- await page.setViewport({ width: 1600, height: 1000 })
11
- await page.setCookie({ name: 'token', value: TOKEN, domain: '127.0.0.1', path: '/' })
12
- const errors = []
13
- page.on('pageerror', e => errors.push(String(e).slice(0, 160)))
14
- await page.goto(`${BASE}/town`, { waitUntil: 'domcontentloaded', timeout: 60000 })
15
- for (let i = 0; i < 30; i++) {
16
- if (await page.evaluate(() => !!window.__town?.scene?.agents?.size)) break
17
- await new Promise(r => setTimeout(r, 1000))
18
- }
19
- await new Promise(r => setTimeout(r, 5000))
20
-
21
- const state = await page.evaluate(() => {
22
- const s = window.__town?.scene
23
- const previews = [...document.querySelectorAll('.model-card .model-preview-3d canvas')].map(c => ({
24
- w: c.width, h: c.height,
25
- }))
26
- const uploadBoxText = document.querySelector('.upload-box .upload-name')?.textContent?.trim() ?? ''
27
- const hasDrop = !!document.querySelector('.upload-box')
28
- return {
29
- previewCount: previews.length,
30
- previewSizes: previews.slice(0, 3),
31
- uploadBoxText,
32
- hasDrop,
33
- agentCount: s?.agents?.size ?? 0,
34
- }
35
- })
36
- console.log('library:', JSON.stringify(state))
37
-
38
- // 选中调度主管 → RPG 对话窗(历史+实时)
39
- const sel = await page.evaluate(() => {
40
- const s = window.__town.scene
41
- const agent = [...s.agents.values()].find(a => a.name === '调度主管') ?? [...s.agents.values()][0]
42
- s.setSelected?.({ kind: 'agent', id: agent.agentId })
43
- return { id: agent.agentId, name: agent.name }
44
- })
45
- console.log('selected:', JSON.stringify(sel))
46
- await page.evaluate(() => {
47
- const s = window.__town.scene
48
- // 注入几个实时消息,触发对话窗 live 内容
49
- s.handleTownEvent?.({
50
- v: 1, type: 'a2a.message', seq: 9001, at: Date.now(), channelId: s.blocks.keys().next().value,
51
- agentId: 'x',
52
- payload: { fromAgentId: 'lead', parts: [{ text: '泵组巡检数据已汇总,一切正常' }] },
53
- })
54
- })
55
- await new Promise(r => setTimeout(r, 2600))
56
- const dialog = await page.evaluate(() => {
57
- const d = document.querySelector('.rpg-dialog')
58
- if (!d) return { err: 'no rpg-dialog' }
59
- return {
60
- head: d.querySelector('.rpg-nameplate .agent-chat-name')?.textContent,
61
- tag: d.querySelector('.rpg-tag')?.textContent,
62
- histCount: d.querySelectorAll('.rpg-line.hist').length,
63
- liveCount: d.querySelectorAll('.rpg-line.live').length,
64
- divider: [...d.querySelectorAll('.rpg-divider')].map(e => e.textContent.trim()),
65
- hasPortrait: !!d.querySelector('.rpg-portrait'),
66
- }
67
- })
68
- console.log('dialog:', JSON.stringify(dialog))
69
- console.log('errors:', errors.slice(0, 6))
70
- await page.screenshot({ path: 'docs/audit/screenshots/town-rpg-dialog.png' })
71
- await browser.close()
@@ -1,63 +0,0 @@
1
- /** 终验:工艺变更单模式的一次性确定性下发(184 → 178)+ 完成后取消 loop 链 */
2
- const BASE = 'http://127.0.0.1:3000'
3
- const CHANNEL = '52979e79-5592-46df-87eb-02658168f7ac'
4
- const LINE = 'ln-af002514'
5
- const login = await fetch(`${BASE}/api/users/login`, {
6
- method: 'POST',
7
- headers: { 'content-type': 'application/json' },
8
- body: JSON.stringify({ email: process.env.E2E_USER ?? 'zhangwei@awshop.io', password: process.env.E2E_PASS ?? 'Awshop@123' }),
9
- }).then(r => r.json())
10
- const H = { authorization: `Bearer ${login.data.token}`, 'content-type': 'application/json' }
11
- const sleep = ms => new Promise(r => setTimeout(r, ms))
12
- const J = (u, m = 'GET', b) => fetch(BASE + u, { method: m, headers: H, body: b ? JSON.stringify(b) : undefined }).then(r => r.json())
13
- const fails = []
14
- const okIf = (m, c) => { if (c) console.log(`PASS ${m}`); else { console.log(`FAIL ${m}`); fails.push(m) } }
15
-
16
- const dwValue = async () => (await J('/api/workshop/dcw')).data.nodes.find(n => n.name === '温度设定器(示例)').value
17
- const worker = ((await J(`/api/workshop/channels/${CHANNEL}/agents`)).data).find(a => a.role === 'worker')
18
- const valueBefore = await dwValue()
19
- console.log(`worker=${worker?.id.slice(0, 8)} | 变更前设定值=${valueBefore}(目标 178)`)
20
-
21
- const task = (await J(`/api/workshop/channels/${CHANNEL}/tasks`, 'POST', {
22
- title: '工艺变更单 SC-001:烘箱温度设定 184→178',
23
- parts: [{ text: '工艺变更单 SC-001(客户工程变更,必须执行):本批次烘箱温度设定由 184℃ 调整为 178℃(在工艺窗口 176~188℃ 内)。请立即用 dcw_control 将烘箱温度设定下发为 178(该节点为手动确认模式,发起后等待用户批准),批准执行后复测设定值并汇报执行结果。旧值 184 不再符合新工艺要求,不得维持。' }],
24
- })).data
25
- const taskId = task?.task?.id ?? task?.id
26
- if (!taskId) { console.error('派发失败'); process.exit(1) }
27
- console.log('工艺变更任务已派发:', taskId.slice(0, 8))
28
-
29
- let hitlSeen = false, hitlDetail = ''
30
- for (let i = 0; i < 150; i++) {
31
- await sleep(2000)
32
- const pend = (await J(`/api/workshop/agent-tools/approvals?agentId=${worker.id}`)).data.approvals
33
- if (pend.length > 0) {
34
- if (!hitlSeen) {
35
- hitlSeen = true
36
- hitlDetail = pend[0].detail
37
- console.log(`[t+${i * 2}s] HITL 待审: ${hitlDetail.slice(0, 70)}`)
38
- }
39
- await J(`/api/workshop/agent-tools/approvals/${pend[0].id}/decide`, 'POST', { approved: true, comment: '工艺变更单已核对,批准' })
40
- await sleep(1200)
41
- }
42
- const now = await dwValue()
43
- if (Math.abs(now - 178) < 0.01) { console.log(`[t+${i * 2}s] 设定值生效 = 178`); break }
44
- if (i === 149) console.log('[超时 300s]')
45
- }
46
- const finalValue = await dwValue()
47
- okIf(`① HITL 链路: ${hitlDetail.slice(0, 60)}`, hitlSeen)
48
- okIf(`② 参数真实下发: ${valueBefore} → ${finalValue}(目标 178)`, Math.abs(finalValue - 178) < 0.01)
49
-
50
- // ── 取消 loop 任务链(防 token 空转):所有非终态 loop 任务 ──
51
- const tasks = (await J(`/api/workshop/channels/${CHANNEL}/tasks`)).data
52
- const arr = Array.isArray(tasks) ? tasks : tasks?.tasks ?? []
53
- let cancelled = 0
54
- for (const t of arr) {
55
- if (!['COMPLETED', 'FAILED', 'CANCELED'].includes(t.state)) {
56
- await fetch(`${BASE}/api/workshop/channels/${CHANNEL}/tasks/${t.id}/cancel`, { method: 'POST', headers: H, body: '{}' }).catch(() => {})
57
- cancelled++
58
- }
59
- }
60
- console.log(`③ loop 任务链已取消: ${cancelled} 个(演示现场静止)`)
61
-
62
- console.log(fails.length ? `SC-001 FAILED(${fails.length})` : 'SC-001 ALL PASS')
63
- process.exit(fails.length ? 1 : 0)
@@ -1,24 +0,0 @@
1
- /** 最终场景截图:控制台 SET=183(Agent 优化后)+ 全景实时 */
2
- import puppeteer from 'puppeteer-core'
3
- const BASE = 'http://127.0.0.1:3000'
4
- const login = await fetch(`${BASE}/api/users/login`, { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ email: process.env.E2E_USER ?? 'zhangwei@awshop.io', password: process.env.E2E_PASS ?? 'Awshop@123' }) }).then(r => r.json())
5
- const OUT = 'docs/audit/screenshots/ui-polish-0831'
6
- const browser = await puppeteer.launch({ executablePath: 'C:/Program Files/Google/Chrome/Application/chrome.exe', headless: 'new', args: ['--no-sandbox', '--disable-gpu', '--window-size=1600,1000'] })
7
- const page = await browser.newPage()
8
- await page.setViewport({ width: 1600, height: 1000 })
9
- await page.setCookie({ name: 'token', value: login.data.token, domain: '127.0.0.1', path: '/' })
10
- await page.goto(`${BASE}/town`, { waitUntil: 'domcontentloaded', timeout: 90000 })
11
- for (let i = 0; i < 45; i++) { if (await page.evaluate(() => (window.__town?.scene?.deviceNodes?.size ?? 0) > 0)) break; await new Promise(r => setTimeout(r, 1000)) }
12
- await new Promise(r => setTimeout(r, 4000))
13
- const twins = await fetch(`${BASE}/api/workshop/device-twins`, { headers: { authorization: `Bearer ${login.data.token}` } }).then(r => r.json())
14
- const consoleId = (twins.data.twins ?? []).find(t => t.name === '控制台 · CON')?.id
15
- await page.evaluate((id) => { window.__town.scene.setSelected?.({ kind: 'device', id }) }, consoleId)
16
- await new Promise(r => setTimeout(r, 1500))
17
- const rows = await page.evaluate(() => ({
18
- dcw: [...document.querySelectorAll('.twin-dcw .dcw-item')].map(el => el.textContent?.replace(/\s+/g, ' ').trim().slice(0, 50)),
19
- daq: [...document.querySelectorAll('.twin-daq .daq-item')].map(el => el.textContent?.replace(/\s+/g, ' ').trim()),
20
- }))
21
- console.log('控制台 SET rows:', JSON.stringify(rows.dcw))
22
- await page.screenshot({ path: `${OUT}/e2e-final-console-183.png` })
23
- await browser.close()
24
- console.log('final shot done')
@@ -1,75 +0,0 @@
1
- /** 端到端 Phase E 强化版:AgentTeam 反馈控制(确定性下发策略 + 未发起则重派)
2
- * ① 强化 worker 系统提示:指令给出精确目标值时必须 dcw_control 下发
3
- * ② 提交任务 → 轮询 HITL(批准)→ 断言写入生效;子任务完成但无 HITL → 重派一次
4
- */
5
- const BASE = 'http://127.0.0.1:3000'
6
- const CHANNEL = '52979e79-5592-46df-87eb-02658168f7ac'
7
- const WORKER = '0effc739-d9a0-4ab3-b14f-98596e0a44ca'
8
- const LINE = 'ln-af002514'
9
- const login = await fetch(`${BASE}/api/users/login`, {
10
- method: 'POST',
11
- headers: { 'content-type': 'application/json' },
12
- body: JSON.stringify({ email: process.env.E2E_USER ?? 'zhangwei@awshop.io', password: process.env.E2E_PASS ?? 'Awshop@123' }),
13
- }).then(r => r.json())
14
- const H = { authorization: `Bearer ${login.data.token}`, 'content-type': 'application/json' }
15
- const sleep = ms => new Promise(r => setTimeout(r, ms))
16
- const J = (u, m = 'GET', b) => fetch(BASE + u, { method: m, headers: H, body: b ? JSON.stringify(b) : undefined }).then(r => r.json())
17
- const fails = []
18
- const okIf = (m, c) => { if (c) console.log(`PASS ${m}`); else { console.log(`FAIL ${m}`); fails.push(m) } }
19
-
20
- // ── ① 强化 worker 系统提示(模板级,持久化) ──
21
- const strengthened = '你是产线工艺优化工程师。用 my_industrial_nodes 查看授权节点,用 daq_query 获取最新工况。当任务给出精确目标值时,你必须调用 dcw_control 下发该目标值(除非超出安全量程∩工艺窗口),不得以「已在窗口内/偏差可接受」为由跳过下发;下发后必须复测设定值并在结论中引用前后数值。'
22
- const agents = await J('/api/workshop/agents')
23
- const tpl = (agents.data ?? []).find(a => a.id === WORKER) ?? (agents.data ?? []).find(a => a.name?.includes('工艺优化工程师'))
24
- console.log('worker 模板:', tpl?.id, tpl?.name)
25
- const upd = await J(`/api/workshop/agents/${tpl.id}`, 'PATCH', { config: { ...(tpl.config ?? {}), systemPromptPrefix: strengthened } })
26
- okIf('① worker 系统提示已强化(强制精确下发策略)', upd.code === 0)
27
-
28
- // ── ② 提交任务 + 观察循环(最多两轮;第一轮无 HITL 则重派) ──
29
- const dwValue = () => J('/api/workshop/dcw').then(r => r.data.nodes.find(n => n.name === '温度设定器(示例)').value)
30
- const valueBefore = await dwValue()
31
- console.log(`当前设定值: ${valueBefore} → 任务目标: 185`)
32
-
33
- let hitlSeen = false, hitlDetail = ''
34
- let finalSub = null
35
- for (let attempt = 1; attempt <= 2; attempt++) {
36
- console.log(`━━━ 派发尝试 #${attempt} ━━━`)
37
- const task = (await J(`/api/workshop/channels/${CHANNEL}/tasks`, 'POST', {
38
- title: `烘箱温度反馈控制(E-${attempt})`,
39
- parts: [{ text: `确定性控制指令:将烘箱温度设定精确调整到 185℃ 并通过 dcw_control 下发(工艺窗口 176~188℃;手动确认模式,发起后等待批准),随后复测设定值并汇报前后对比。` }],
40
- mode: 'loop',
41
- })).data
42
- const taskId = task?.task?.id ?? task?.id
43
- if (!taskId) { fails.push('派发失败'); continue }
44
- let sub = null
45
- for (let i = 0; i < 200; i++) {
46
- await sleep(2000)
47
- const tasks = (await J(`/api/workshop/channels/${CHANNEL}/tasks`)).data
48
- const arr = Array.isArray(tasks) ? tasks : tasks?.tasks ?? []
49
- sub = arr.find(t => t.parentId === taskId)
50
- if (sub && !finalSub) { finalSub = sub; console.log(`[t+${i * 2}s] 子任务派发 → ${sub.assigneeId?.slice(0, 8)} (${sub.state})`) }
51
- const pend = (await J(`/api/workshop/agent-tools/approvals?agentId=${WORKER}`)).data.approvals
52
- if (pend.length > 0) {
53
- if (!hitlSeen) { hitlSeen = true; console.log(`[t+${i * 2}s] HITL 待审: ${pend[0].detail.slice(0, 70)}`) }
54
- await J(`/api/workshop/agent-tools/approvals/${pend[0].id}/decide`, 'POST', { approved: true, comment: '窗口内反馈控制,批准' })
55
- console.log('[HITL] 已批准')
56
- }
57
- const done = sub && ['COMPLETED', 'FAILED', 'CANCELED'].includes(sub.state)
58
- const now = await dwValue()
59
- if (Math.abs(now - 185) < 0.01) { console.log(`[t+${i * 2}s] 设定值已生效 = ${now}`); break }
60
- if (done) { console.log(`[t+${i * 2}s] 子任务 ${sub.state} 结束,设定值=${now},无 HITL=${!hitlSeen}`); break }
61
- if (i === 199) console.log('[超时 400s]')
62
- }
63
- const now = await dwValue()
64
- if (Math.abs(now - 185) < 0.01) break
65
- if (attempt === 1) console.log('第一轮 worker 未下发 → 重派一次')
66
- }
67
-
68
- // ── ③ 断言 ──
69
- const finalValue = await dwValue()
70
- okIf(`② HITL 审批链路(发起+批准)`, hitlSeen)
71
- okIf(`③ 参数真实下发生效: 设定值 = ${finalValue}(目标 185)`, Math.abs(finalValue - 185) < 0.01)
72
- const states = (await J('/api/workshop/dcw/lines')).data.states
73
- okIf(`④ 打标持续: taggedSamples=${states.find(s => s.lineId === LINE)?.taggedSamples}`, (states.find(s => s.lineId === LINE)?.taggedSamples ?? 0) > 0)
74
- console.log(fails.length ? `PHASE-E FAILED(${fails.length})` : 'PHASE-E ALL PASS')
75
- process.exit(fails.length ? 1 : 0)