agentworkshop 0.7.33 → 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 (945) 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 +1568 -1043
  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 -191
  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 -300
  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/base-agent.ts +9 -0
  435. package/server/services/workshop/agents/codex-agent.ts +743 -729
  436. package/server/services/workshop/agents/dsh-agent.ts +4 -7
  437. package/server/services/workshop/agents/opencode-agent.ts +5 -7
  438. package/server/services/workshop/aml/aml.repo.ts +18 -0
  439. package/server/services/workshop/aml/dataset-builder.ts +4 -0
  440. package/server/services/workshop/aml/entity.ts +365 -0
  441. package/server/services/workshop/aml/env-manager.ts +242 -0
  442. package/server/services/workshop/aml/job-orchestrator.ts +4 -15
  443. package/server/services/workshop/aml/model-registry.ts +6 -0
  444. package/server/services/workshop/aml/python-runtime.ts +396 -62
  445. package/server/services/workshop/aml/runtime.ts +95 -4
  446. package/server/services/workshop/daq/bus/mqtt.adapter.ts +3 -1
  447. package/server/services/workshop/daq/daq-controller.ts +95 -47
  448. package/server/services/workshop/daq/daq-node.repo.ts +0 -10
  449. package/server/services/workshop/daq/daq-runtime.ts +0 -5
  450. package/server/services/workshop/json-store.mjs +35 -2
  451. package/server/services/workshop/plugins/host.mjs +18 -12
  452. package/server/services/workshop/runtime/agent-runtime.ts +32 -3
  453. package/server/services/workshop/runtime/manager.ts +28 -1
  454. package/server/services/workshop/runtime/scheduler-loop.ts +10 -1
  455. package/server/services/workshop/settings.ts +2 -0
  456. package/shared/config/home.mjs +58 -0
  457. package/shared/config/schema.json +2 -1
  458. package/shared/lru.mjs +4 -1
  459. package/.output/public/_nuxt/-6OnbLFb.js +0 -1
  460. package/.output/public/_nuxt/-nb2uqVg.js +0 -1
  461. package/.output/public/_nuxt/4bHdIqEg.js +0 -18
  462. package/.output/public/_nuxt/6PZPfFcO.js +0 -17
  463. package/.output/public/_nuxt/BBBtwOpo.js +0 -9
  464. package/.output/public/_nuxt/BBwMH_hG.js +0 -7
  465. package/.output/public/_nuxt/BDUjyaF4.js +0 -42
  466. package/.output/public/_nuxt/BNXfwXpE.js +0 -1
  467. package/.output/public/_nuxt/BN_PdN3J.js +0 -24
  468. package/.output/public/_nuxt/BSSUlJnx2.js +0 -1
  469. package/.output/public/_nuxt/BWSE6hR6.js +0 -1
  470. package/.output/public/_nuxt/BZGNTgTQ2.js +0 -1
  471. package/.output/public/_nuxt/BZv4RFYN.js +0 -1
  472. package/.output/public/_nuxt/BcmbLh2z2.js +0 -1
  473. package/.output/public/_nuxt/BfGc7TJp.js +0 -1
  474. package/.output/public/_nuxt/BgTB6h_q.js +0 -2
  475. package/.output/public/_nuxt/BkLJA9J5.js +0 -1
  476. package/.output/public/_nuxt/Bp5luxkg2.js +0 -1
  477. package/.output/public/_nuxt/BuCHayqN.js +0 -1
  478. package/.output/public/_nuxt/BuvcLKh1.js +0 -19
  479. package/.output/public/_nuxt/C3tCneTM.js +0 -1
  480. package/.output/public/_nuxt/C77oC8yC2.js +0 -7
  481. package/.output/public/_nuxt/C9f8QMp12.js +0 -1
  482. package/.output/public/_nuxt/CKfhtOt7.js +0 -13
  483. package/.output/public/_nuxt/CQvmN-Mi.js +0 -1
  484. package/.output/public/_nuxt/CUDrOuW7.js +0 -1
  485. package/.output/public/_nuxt/CZcC-gpk.js +0 -1
  486. package/.output/public/_nuxt/CbzsPO5H.js +0 -1
  487. package/.output/public/_nuxt/CdSOrh2c.js +0 -1
  488. package/.output/public/_nuxt/Cgx818r-.js +0 -1
  489. package/.output/public/_nuxt/Cjm7VogC.js +0 -1
  490. package/.output/public/_nuxt/Cm5mDxzH.js +0 -1
  491. package/.output/public/_nuxt/CmHzfVc5.js +0 -3
  492. package/.output/public/_nuxt/Cn3J3NXR.js +0 -23
  493. package/.output/public/_nuxt/Cno6kYiO2.js +0 -1
  494. package/.output/public/_nuxt/Cp6z0RN7.js +0 -1
  495. package/.output/public/_nuxt/CwqIxJGj.js +0 -2
  496. package/.output/public/_nuxt/D-Ca4BGY.js +0 -70
  497. package/.output/public/_nuxt/D0fhp-Ga.js +0 -75
  498. package/.output/public/_nuxt/D1z7i2UP.js +0 -31
  499. package/.output/public/_nuxt/DIaTPH1M.js +0 -1
  500. package/.output/public/_nuxt/DTYBfjRY.js +0 -1
  501. package/.output/public/_nuxt/DXRZPxGs.js +0 -1
  502. package/.output/public/_nuxt/DZzGarBE2.js +0 -13
  503. package/.output/public/_nuxt/DaMCzQhv.js +0 -1
  504. package/.output/public/_nuxt/DoLasgPj2.js +0 -1
  505. package/.output/public/_nuxt/DpojD719.js +0 -1
  506. package/.output/public/_nuxt/DsVcWfyR.js +0 -1
  507. package/.output/public/_nuxt/DtBu71ev.js +0 -32
  508. package/.output/public/_nuxt/Dy-mxvXY2.js +0 -1
  509. package/.output/public/_nuxt/DzuC31-i.js +0 -2
  510. package/.output/public/_nuxt/FQri3dV3.js +0 -1
  511. package/.output/public/_nuxt/ORt9oDIy2.js +0 -1
  512. package/.output/public/_nuxt/TownView.CtskuMXS.css +0 -1
  513. package/.output/public/_nuxt/VLI2Zy4t.js +0 -5
  514. package/.output/public/_nuxt/_id_.MbzdFygI.css +0 -1
  515. package/.output/public/_nuxt/_id_.hRYo-EAB.css +0 -1
  516. package/.output/public/_nuxt/_wsId_.gXMEOYgX.css +0 -1
  517. package/.output/public/_nuxt/aml.WU_bh87J.css +0 -1
  518. package/.output/public/_nuxt/arUY5dyq2.js +0 -4
  519. package/.output/public/_nuxt/builds/meta/291ef3e6-fa6a-4dee-8f46-05da1aeab815.json +0 -1
  520. package/.output/public/_nuxt/daq.Bb6l44-O.css +0 -1
  521. package/.output/public/_nuxt/dcw.rXH2fc2Z.css +0 -1
  522. package/.output/public/_nuxt/default.jNT73_hq.css +0 -1
  523. package/.output/public/_nuxt/ekuGmQ7R.js +0 -1
  524. package/.output/public/_nuxt/entry.jFrFAWuA.css +0 -1
  525. package/.output/public/_nuxt/logs.DMOM-iHe.css +0 -1
  526. package/.output/public/_nuxt/niDwBOZW.js +0 -3
  527. package/.output/public/_nuxt/pMoIO6rr.js +0 -14
  528. package/.output/public/_nuxt/pages.Cc8GX9T1.css +0 -1
  529. package/.output/public/_nuxt/plugins.wIPyfPn-.css +0 -1
  530. package/.output/public/_nuxt/rqZ-1SoP.js +0 -2
  531. package/.output/public/_nuxt/settings.BCm4NZIc.css +0 -1
  532. package/.output/public/_nuxt/town.C_DsNW0J.css +0 -1
  533. package/.output/public/_nuxt/users.DuAt_Zwf.css +0 -1
  534. package/.output/public/_nuxt/vJ4FPb-_.js +0 -1
  535. package/.output/public/_nuxt/workshop.BJg84pOK.css +0 -1
  536. package/.output/server/chunks/build/aml-uBNIppIf.mjs +0 -508
  537. package/.output/server/chunks/build/aml-uBNIppIf.mjs.map +0 -1
  538. package/.output/server/chunks/build/daq-BvihjQyW.mjs.map +0 -1
  539. package/.output/server/chunks/build/pages-C-6BRtv8.mjs.map +0 -1
  540. package/scripts/_audit/.tmp/audit-data/dcws.json +0 -28
  541. package/scripts/_audit/.tmp/dcw-writes.json +0 -15650
  542. package/scripts/_audit/.tmp/dcws.json +0 -9033
  543. package/scripts/_audit/.tmp/pollution-backup/dcw-rollback.polluted.json +0 -470006
  544. package/scripts/_audit/.tmp/pollution-backup/dcws.polluted.json +0 -9085
  545. package/scripts/_audit/.tmp/probe-cwd.txt +0 -1
  546. package/scripts/_audit/awhome/commands/README.md +0 -3
  547. package/scripts/_audit/awhome/commands/hello.mjs +0 -12
  548. package/scripts/_audit/diag-cwd.ts +0 -20
  549. package/scripts/_audit/diag-cwd2.ts +0 -19
  550. package/scripts/_audit/hello.mjs +0 -12
  551. package/scripts/_audit/ndjson-partial-line-repro.mjs +0 -77
  552. package/scripts/_audit/opencode-await-ternary-repro.mjs +0 -20
  553. package/scripts/_audit/part-frag.txt +0 -84
  554. package/scripts/_audit/part-head.txt +0 -45
  555. package/scripts/_audit/probe-child.mjs +0 -17
  556. package/scripts/_audit/probe-envelope.mjs +0 -49
  557. package/scripts/_audit/probe-packlist.mjs +0 -67
  558. package/scripts/_audit/probe-routes.mjs +0 -47
  559. package/scripts/_audit/probe-routes2.mjs +0 -38
  560. package/scripts/_audit/probe.ts +0 -9
  561. package/scripts/_audit/probe2.ts +0 -6
  562. package/scripts/_audit/probe3.ts +0 -3
  563. package/scripts/_audit/probe4.ts +0 -3
  564. package/scripts/_audit/proj/.AgentWorkShop/commands/echoargs.mjs +0 -13
  565. package/scripts/_audit/proj/config.yml +0 -1
  566. package/scripts/_audit/run.mjs +0 -30
  567. package/scripts/_audit/tsconfig.probe.json +0 -24
  568. package/scripts/_audit/typecheck-out.txt +0 -466
  569. package/scripts/_daq-realtime-probe.mjs +0 -68
  570. package/scripts/_daq-warn-probe.mjs +0 -50
  571. package/scripts/_dbg-acc-1-setup.mjs +0 -57
  572. package/scripts/_dbg-acc-2-diag.mjs +0 -14
  573. package/scripts/_dbg-acc-2-intervals.mjs +0 -81
  574. package/scripts/_dbg-acc-3-daq.mjs +0 -48
  575. package/scripts/_dbg-acc-4-team.mjs +0 -92
  576. package/scripts/_dbg-acc-5-visual.mjs +0 -63
  577. package/scripts/_dbg-acc-5b-ws-town.mjs +0 -18
  578. package/scripts/_dbg-acc-5c-town.mjs +0 -12
  579. package/scripts/_dbg-acc-6-i18n.mjs +0 -19
  580. package/scripts/_dbg-agent-tools-audit.mjs +0 -154
  581. package/scripts/_dbg-agent-workflow-audit.mjs +0 -177
  582. package/scripts/_dbg-agents-dropdown-shot.py +0 -33
  583. package/scripts/_dbg-anim-verify.mjs +0 -81
  584. package/scripts/_dbg-app-shot.mjs +0 -48
  585. package/scripts/_dbg-autoframe.mjs +0 -103
  586. package/scripts/_dbg-availability-probe.ts +0 -11
  587. package/scripts/_dbg-beacon-final.mjs +0 -181
  588. package/scripts/_dbg-bind-bidi-e2e.mjs +0 -239
  589. package/scripts/_dbg-callout-near.mjs +0 -108
  590. package/scripts/_dbg-catalog-smoke.ts +0 -20
  591. package/scripts/_dbg-cf-line-shot.mjs +0 -18
  592. package/scripts/_dbg-chan-focus.mjs +0 -49
  593. package/scripts/_dbg-channel-plugin-ui.mjs +0 -94
  594. package/scripts/_dbg-cleanup.mjs +0 -31
  595. package/scripts/_dbg-closedloop-ui-shot.mjs +0 -61
  596. package/scripts/_dbg-codex-handshake.ts +0 -30
  597. package/scripts/_dbg-codex-probe.mjs +0 -58
  598. package/scripts/_dbg-codex-sandbox.ts +0 -58
  599. package/scripts/_dbg-codex-turn.ts +0 -65
  600. package/scripts/_dbg-collab-scenario-e2e.mjs +0 -185
  601. package/scripts/_dbg-config-smoke.ts +0 -28
  602. package/scripts/_dbg-console-audit.mjs +0 -61
  603. package/scripts/_dbg-console-probe.mjs +0 -23
  604. package/scripts/_dbg-context-inject-audit.mjs +0 -231
  605. package/scripts/_dbg-cpu-profile.mjs +0 -53
  606. package/scripts/_dbg-crash-recovery.mjs +0 -143
  607. package/scripts/_dbg-crop-shot.mjs +0 -16
  608. package/scripts/_dbg-cross-channel-e2e.mjs +0 -157
  609. package/scripts/_dbg-cross-team-visibility-e2e.mjs +0 -129
  610. package/scripts/_dbg-crush-probe.sh +0 -21
  611. package/scripts/_dbg-crush-spawn-probe.ts +0 -22
  612. package/scripts/_dbg-daq-acc-probe.mjs +0 -24
  613. package/scripts/_dbg-daq-attrib.mjs +0 -34
  614. package/scripts/_dbg-daq-bind-audit.mjs +0 -119
  615. package/scripts/_dbg-daq-cadence.mjs +0 -104
  616. package/scripts/_dbg-daq-debug.mjs +0 -22
  617. package/scripts/_dbg-daq-diag.mjs +0 -33
  618. package/scripts/_dbg-daq-e2e.mjs +0 -171
  619. package/scripts/_dbg-daq-film.mjs +0 -136
  620. package/scripts/_dbg-daq-filter-e2e.mjs +0 -109
  621. package/scripts/_dbg-daq-filter-e2e2.mjs +0 -62
  622. package/scripts/_dbg-daq-final-regression.mjs +0 -78
  623. package/scripts/_dbg-daq-frame-alarm.mjs +0 -49
  624. package/scripts/_dbg-daq-frame-ui.mjs +0 -62
  625. package/scripts/_dbg-daq-frame-ws.mjs +0 -72
  626. package/scripts/_dbg-daq-full-check.mjs +0 -179
  627. package/scripts/_dbg-daq-line-note-verify.mjs +0 -61
  628. package/scripts/_dbg-daq-linebanner-audit.mjs +0 -107
  629. package/scripts/_dbg-daq-pages-shot.mjs +0 -37
  630. package/scripts/_dbg-daq-perf.mjs +0 -61
  631. package/scripts/_dbg-daq-probe.mjs +0 -27
  632. package/scripts/_dbg-daq-recipe-e2e.mjs +0 -30
  633. package/scripts/_dbg-daq-redesign-shot.mjs +0 -88
  634. package/scripts/_dbg-daq-rows-probe.mjs +0 -26
  635. package/scripts/_dbg-daq-rowstate-e2e.mjs +0 -152
  636. package/scripts/_dbg-daq-rowstate-shot.mjs +0 -45
  637. package/scripts/_dbg-daq-rowstate-shot2.mjs +0 -38
  638. package/scripts/_dbg-daq-tpl.mjs +0 -144
  639. package/scripts/_dbg-dash-console-check.mjs +0 -49
  640. package/scripts/_dbg-dash-deep-probe.mjs +0 -61
  641. package/scripts/_dbg-dash-hitpoint.mjs +0 -44
  642. package/scripts/_dbg-dash-live-shot.mjs +0 -36
  643. package/scripts/_dbg-dash-shot.mjs +0 -21
  644. package/scripts/_dbg-dashboard-shot.mjs +0 -35
  645. package/scripts/_dbg-dcw-audit.mjs +0 -126
  646. package/scripts/_dbg-dcw-card-e2e.mjs +0 -108
  647. package/scripts/_dbg-dcw-channel-ui.mjs +0 -144
  648. package/scripts/_dbg-dcw-examples.mjs +0 -81
  649. package/scripts/_dbg-dcw-light-shot.mjs +0 -19
  650. package/scripts/_dbg-dcw-line-audit.mjs +0 -107
  651. package/scripts/_dbg-dcw-pause-tpl-audit.mjs +0 -161
  652. package/scripts/_dbg-dcw-pause-ui.mjs +0 -175
  653. package/scripts/_dbg-dcw-read-toolface.ts +0 -13
  654. package/scripts/_dbg-dcw-read-ui.mjs +0 -74
  655. package/scripts/_dbg-dcw-scene.mjs +0 -72
  656. package/scripts/_dbg-dcw-shot2.mjs +0 -14
  657. package/scripts/_dbg-dcw-twin-e2e.mjs +0 -192
  658. package/scripts/_dbg-diag-mock-loop.mjs +0 -89
  659. package/scripts/_dbg-diag-watch.mjs +0 -95
  660. package/scripts/_dbg-docs-site-shot.mjs +0 -32
  661. package/scripts/_dbg-dsh-probe.mjs +0 -31
  662. package/scripts/_dbg-dt-interact.mjs +0 -193
  663. package/scripts/_dbg-error-probe.mjs +0 -54
  664. package/scripts/_dbg-filter-light-verify.mjs +0 -54
  665. package/scripts/_dbg-final-acceptance-2.mjs +0 -72
  666. package/scripts/_dbg-final-acceptance.mjs +0 -192
  667. package/scripts/_dbg-final-agent-e2e.mjs +0 -151
  668. package/scripts/_dbg-final-features.mjs +0 -155
  669. package/scripts/_dbg-final-fixups.mjs +0 -62
  670. package/scripts/_dbg-final-full-e2e.mjs +0 -218
  671. package/scripts/_dbg-final-line-e2e.mjs +0 -173
  672. package/scripts/_dbg-final-shots.mjs +0 -32
  673. package/scripts/_dbg-final-t6-hitl.mjs +0 -38
  674. package/scripts/_dbg-final-visual.mjs +0 -29
  675. package/scripts/_dbg-fix-unused-imports.py +0 -41
  676. package/scripts/_dbg-focus-range.mjs +0 -115
  677. package/scripts/_dbg-fresh-scene-e2e.mjs +0 -125
  678. package/scripts/_dbg-fullchain-e2e.mjs +0 -178
  679. package/scripts/_dbg-gate-debug.mjs +0 -37
  680. package/scripts/_dbg-gif-encode.mjs +0 -111
  681. package/scripts/_dbg-gizmo.mjs +0 -95
  682. package/scripts/_dbg-glass-probe.mjs +0 -57
  683. package/scripts/_dbg-glass-shot.mjs +0 -50
  684. package/scripts/_dbg-glass-sweep.mjs +0 -25
  685. package/scripts/_dbg-glb-probe.mjs +0 -43
  686. package/scripts/_dbg-goose-probe.mjs +0 -33
  687. package/scripts/_dbg-goose-probe.sh +0 -10
  688. package/scripts/_dbg-hardening-probe.mjs +0 -90
  689. package/scripts/_dbg-harness-ui-dbg.py +0 -49
  690. package/scripts/_dbg-harness-ui-shot.py +0 -109
  691. package/scripts/_dbg-hero-btn-probe.mjs +0 -21
  692. package/scripts/_dbg-hidden-check.mjs +0 -21
  693. package/scripts/_dbg-hmi-audit.mjs +0 -164
  694. package/scripts/_dbg-home-repro.mjs +0 -24
  695. package/scripts/_dbg-home-stack.mjs +0 -13
  696. package/scripts/_dbg-host.mjs +0 -16
  697. package/scripts/_dbg-huashu-survey.mjs +0 -31
  698. package/scripts/_dbg-huashu-survey2.mjs +0 -35
  699. package/scripts/_dbg-huashu-verify.mjs +0 -25
  700. package/scripts/_dbg-huashu-verify2.mjs +0 -26
  701. package/scripts/_dbg-hydration-detail.mjs +0 -18
  702. package/scripts/_dbg-i18n-debug.mjs +0 -27
  703. package/scripts/_dbg-i18n-debug2.mjs +0 -26
  704. package/scripts/_dbg-i18n-final.mjs +0 -42
  705. package/scripts/_dbg-i18n-scan.mjs +0 -38
  706. package/scripts/_dbg-infra-lifecycle.mjs +0 -44
  707. package/scripts/_dbg-interval-config.mjs +0 -156
  708. package/scripts/_dbg-interval-scenario.mjs +0 -126
  709. package/scripts/_dbg-kicker-check.mjs +0 -11
  710. package/scripts/_dbg-line-aura-shots.mjs +0 -54
  711. package/scripts/_dbg-line-control-e2e.mjs +0 -120
  712. package/scripts/_dbg-line-gate-audit.mjs +0 -108
  713. package/scripts/_dbg-line-live-e2e.mjs +0 -144
  714. package/scripts/_dbg-line-repo-test.ts +0 -10
  715. package/scripts/_dbg-line-scenario-e2e.mjs +0 -256
  716. package/scripts/_dbg-line-spawn.ts +0 -31
  717. package/scripts/_dbg-live-engine-probe.mjs +0 -80
  718. package/scripts/_dbg-login-debug.py +0 -23
  719. package/scripts/_dbg-login-e2e.mjs +0 -26
  720. package/scripts/_dbg-logs-ui-e2e.py +0 -126
  721. package/scripts/_dbg-mcp-bridge-probe.mjs +0 -147
  722. package/scripts/_dbg-modbus-latency.mjs +0 -22
  723. package/scripts/_dbg-mqtt-chain-e2e.mjs +0 -90
  724. package/scripts/_dbg-mqtt-publisher.mjs +0 -17
  725. package/scripts/_dbg-nav-rpg.mjs +0 -84
  726. package/scripts/_dbg-nav-shot.mjs +0 -28
  727. package/scripts/_dbg-nav.mjs +0 -27
  728. package/scripts/_dbg-oneshot-impl-probe.ts +0 -67
  729. package/scripts/_dbg-opencode-sse.mjs +0 -101
  730. package/scripts/_dbg-opencode-start.ts +0 -57
  731. package/scripts/_dbg-opslog-e2e.mjs +0 -121
  732. package/scripts/_dbg-opslog-shots.mjs +0 -62
  733. package/scripts/_dbg-optimization-e2e.mjs +0 -94
  734. package/scripts/_dbg-orbit.mjs +0 -58
  735. package/scripts/_dbg-overview-probe.sh +0 -31
  736. package/scripts/_dbg-panesplitter-fix-check.mjs +0 -62
  737. package/scripts/_dbg-perms-visual.mjs +0 -36
  738. package/scripts/_dbg-pg-tcp-probe.cjs +0 -27
  739. package/scripts/_dbg-phase-e3-monitor.mjs +0 -25
  740. package/scripts/_dbg-pi-spawn-probe.ts +0 -33
  741. package/scripts/_dbg-plc-agent-loop.ts +0 -102
  742. package/scripts/_dbg-plc-e2e.mjs +0 -171
  743. package/scripts/_dbg-plugin-agent-read.ts +0 -56
  744. package/scripts/_dbg-plugin-config-ui.mjs +0 -111
  745. package/scripts/_dbg-plugin-matrix.mjs +0 -212
  746. package/scripts/_dbg-plugin-panels-ui.mjs +0 -54
  747. package/scripts/_dbg-plugin-sink-rest.mjs +0 -70
  748. package/scripts/_dbg-plugin-sink-ui.mjs +0 -81
  749. package/scripts/_dbg-plugin-tools-inject.ts +0 -80
  750. package/scripts/_dbg-plugin-ui-wizard.mjs +0 -125
  751. package/scripts/_dbg-plugin-verify-e2e.mjs +0 -123
  752. package/scripts/_dbg-plugins-e2e.mjs +0 -101
  753. package/scripts/_dbg-pop-clamp-verify.mjs +0 -77
  754. package/scripts/_dbg-preset-e2e.mjs +0 -116
  755. package/scripts/_dbg-preview-console.mjs +0 -28
  756. package/scripts/_dbg-preview-minrepro.mjs +0 -156
  757. package/scripts/_dbg-preview-pixels.mjs +0 -93
  758. package/scripts/_dbg-prompts-hotreload-test.ts +0 -76
  759. package/scripts/_dbg-prompts-resolve-test.ts +0 -39
  760. package/scripts/_dbg-quality-pages-e2e.mjs +0 -84
  761. package/scripts/_dbg-query-cancel.ts +0 -12
  762. package/scripts/_dbg-qwen-acp-probe.mjs +0 -30
  763. package/scripts/_dbg-qwen-capture.mjs +0 -21
  764. package/scripts/_dbg-rail-tree-e2e.mjs +0 -183
  765. package/scripts/_dbg-real-driver-e2e.mjs +0 -55
  766. package/scripts/_dbg-redesign-shots.mjs +0 -34
  767. package/scripts/_dbg-registry-smoke.ts +0 -14
  768. package/scripts/_dbg-release-smoke.mjs +0 -104
  769. package/scripts/_dbg-repo-setup-verify.mjs +0 -31
  770. package/scripts/_dbg-resolve-probe.ts +0 -6
  771. package/scripts/_dbg-restart-persist.mjs +0 -41
  772. package/scripts/_dbg-retention-test.ts +0 -25
  773. package/scripts/_dbg-rollback-mgr-audit.mjs +0 -169
  774. package/scripts/_dbg-rpg.mjs +0 -71
  775. package/scripts/_dbg-sc001-dispatch.mjs +0 -63
  776. package/scripts/_dbg-scenario-final-shot.mjs +0 -24
  777. package/scripts/_dbg-scenario-phase-e2.mjs +0 -75
  778. package/scripts/_dbg-scenario-phase-e3.mjs +0 -96
  779. package/scripts/_dbg-scenario-phase1.mjs +0 -90
  780. package/scripts/_dbg-scenario-phase2.mjs +0 -105
  781. package/scripts/_dbg-scenario-phase3-monitor.mjs +0 -48
  782. package/scripts/_dbg-scenario-phase3.mjs +0 -111
  783. package/scripts/_dbg-scene-polish-shot.mjs +0 -118
  784. package/scripts/_dbg-selring-probe.mjs +0 -47
  785. package/scripts/_dbg-settings-draft-probe.mjs +0 -39
  786. package/scripts/_dbg-settings-probe.mjs +0 -33
  787. package/scripts/_dbg-setup-e2e.mjs +0 -88
  788. package/scripts/_dbg-sideinfo.mjs +0 -101
  789. package/scripts/_dbg-sim-keeper.mjs +0 -100
  790. package/scripts/_dbg-splitter.mjs +0 -88
  791. package/scripts/_dbg-swatch-check.mjs +0 -10
  792. package/scripts/_dbg-task-cancel-probe.mjs +0 -66
  793. package/scripts/_dbg-team-drill.mjs +0 -173
  794. package/scripts/_dbg-town-alarm-e2e.mjs +0 -40
  795. package/scripts/_dbg-town-beauty-shots.mjs +0 -54
  796. package/scripts/_dbg-town-daq-shot.mjs +0 -26
  797. package/scripts/_dbg-town-full-e2e.mjs +0 -104
  798. package/scripts/_dbg-town-gate.mjs +0 -44
  799. package/scripts/_dbg-town-ins-probe.mjs +0 -37
  800. package/scripts/_dbg-town-perf.mjs +0 -50
  801. package/scripts/_dbg-town-polish-shots.mjs +0 -82
  802. package/scripts/_dbg-town-realtime.mjs +0 -42
  803. package/scripts/_dbg-town-shot.py +0 -25
  804. package/scripts/_dbg-town-shot3.mjs +0 -17
  805. package/scripts/_dbg-town-truth.mjs +0 -37
  806. package/scripts/_dbg-town-truth2.mjs +0 -27
  807. package/scripts/_dbg-transform-audit.mjs +0 -98
  808. package/scripts/_dbg-trend-expand-test.mjs +0 -38
  809. package/scripts/_dbg-twindaq-focus.mjs +0 -81
  810. package/scripts/_dbg-ui-polish-shot.mjs +0 -43
  811. package/scripts/_dbg-ui-polish-verify1.mjs +0 -92
  812. package/scripts/_dbg-ui-polish-verify2.mjs +0 -50
  813. package/scripts/_dbg-ui-polish-verify3.mjs +0 -51
  814. package/scripts/_dbg-ui-polish-verify4.mjs +0 -50
  815. package/scripts/_dbg-ui-shot.mjs +0 -26
  816. package/scripts/_dbg-ui-shots.mjs +0 -28
  817. package/scripts/_dbg-ui-survey.py +0 -52
  818. package/scripts/_dbg-unify-shot.mjs +0 -43
  819. package/scripts/_dbg-uplink-probe.mjs +0 -36
  820. package/scripts/_dbg-wizard-preview-shot.mjs +0 -58
  821. package/scripts/_dbg-wizard-ui-e2e.mjs +0 -93
  822. package/scripts/_dbg-ws-probe.mjs +0 -86
  823. package/scripts/_dbg-ws-shot2.mjs +0 -23
  824. package/scripts/_dbg-wsdot-sanity.mjs +0 -25
  825. package/scripts/_dev-stack.mjs +0 -46
  826. package/scripts/_http-driver-probe.mjs +0 -30
  827. package/scripts/_mqtt-driver-probe.mjs +0 -30
  828. package/scripts/_newdriver-rest-probe.mjs +0 -100
  829. package/scripts/_node-state-probe.mjs +0 -5
  830. package/scripts/_opcua-driver-probe.mjs +0 -31
  831. package/scripts/_rtu-debug.mjs +0 -41
  832. package/scripts/_rtu-direct.mjs +0 -6
  833. package/scripts/_rtu-driver-probe.mjs +0 -53
  834. package/scripts/_spike-pitui.mjs +0 -116
  835. package/scripts/_tmp-args-probe.mjs +0 -20
  836. package/scripts/_tmp-cyc-entry.mjs +0 -8
  837. package/scripts/_tmp-cyc-main.mjs +0 -5
  838. package/scripts/_tmp-cyc-mod.mjs +0 -2
  839. package/scripts/_tmp-cycle-a.mjs +0 -6
  840. package/scripts/_tmp-cycle-b.mjs +0 -2
  841. package/scripts/_tmp-cycle-probe.mjs +0 -4
  842. package/scripts/_tmp-entry-variant.mjs +0 -2
  843. package/scripts/_tmp-help-probe.mjs +0 -19
  844. package/scripts/_tmp-help-probe2.mjs +0 -2
  845. package/scripts/_tmp-trace-preload.mjs +0 -1
  846. package/scripts/_wizard-shots.mjs +0 -90
  847. package/scripts/acceptance-suite.py +0 -207
  848. package/scripts/aml-agent-bridge.ts +0 -230
  849. package/scripts/aml-industrial-loop.ts +0 -232
  850. package/scripts/build-film-devices.mjs +0 -227
  851. package/scripts/collab-live-test.py +0 -177
  852. package/scripts/debug-mcp-http.ts +0 -64
  853. package/scripts/demo-lead-worker.ts +0 -256
  854. package/scripts/demo-modes.ts +0 -415
  855. package/scripts/demo-omp-channel.ts +0 -135
  856. package/scripts/design-preflight.mjs +0 -223
  857. package/scripts/design-verify-templates.mjs +0 -110
  858. package/scripts/design-verify.mjs +0 -170
  859. package/scripts/dev-window.cmd +0 -6
  860. package/scripts/device-line-restore.mjs +0 -34
  861. package/scripts/diag-lead-status.ts +0 -101
  862. package/scripts/e2e-a2a-steer-live.mjs +0 -193
  863. package/scripts/e2e-dual-drive-comm.ts +0 -259
  864. package/scripts/e2e-full-scenario.ts +0 -321
  865. package/scripts/e2e-harness-consistency.ts +0 -204
  866. package/scripts/e2e-harness-provider-task.mjs +0 -126
  867. package/scripts/e2e-line-live.mjs +0 -144
  868. package/scripts/e2e-memory-persistence.ts +0 -320
  869. package/scripts/e2e-omp-modes.ts +0 -274
  870. package/scripts/e2e-omp-realtime.ts +0 -258
  871. package/scripts/e2e-plc-scenario.mjs +0 -292
  872. package/scripts/e2e-real-scenario.mjs +0 -466
  873. package/scripts/e2e-tab-close.mjs +0 -136
  874. package/scripts/e2e-token-ui.mjs +0 -149
  875. package/scripts/final-soup-run.py +0 -192
  876. package/scripts/final-soup-watch.py +0 -83
  877. package/scripts/i18n-codemod.mjs +0 -173
  878. package/scripts/i18n-fix-en.py +0 -28
  879. package/scripts/i18n-fix-en2.py +0 -31
  880. package/scripts/i18n-merge.mjs +0 -191
  881. package/scripts/migrate-local-time.mjs +0 -123
  882. package/scripts/omp-real-test.py +0 -328
  883. package/scripts/team-plugins-api-smoke.mjs +0 -149
  884. package/scripts/test-a2a-relay.mjs +0 -222
  885. package/scripts/test-aml-integration.ts +0 -159
  886. package/scripts/test-aml-job.ts +0 -174
  887. package/scripts/test-aml-unit.ts +0 -184
  888. package/scripts/test-api-client.ts +0 -108
  889. package/scripts/test-api-suite.mjs +0 -271
  890. package/scripts/test-block-consumption.mjs +0 -194
  891. package/scripts/test-cmd-render.mjs +0 -218
  892. package/scripts/test-collab-omp.mjs +0 -192
  893. package/scripts/test-config-precedence.ts +0 -124
  894. package/scripts/test-context-governor.ts +0 -176
  895. package/scripts/test-daq-frames.ts +0 -180
  896. package/scripts/test-daq-minio.ts +0 -77
  897. package/scripts/test-dedup-logic.ts +0 -132
  898. package/scripts/test-e2e-collaboration.ts +0 -262
  899. package/scripts/test-e2e-monitor.ts +0 -192
  900. package/scripts/test-event-history.ts +0 -112
  901. package/scripts/test-exec-modes.ts +0 -316
  902. package/scripts/test-fifo-realtime.mjs +0 -193
  903. package/scripts/test-final-e2e.mjs +0 -290
  904. package/scripts/test-goal-summary.ts +0 -202
  905. package/scripts/test-harness-liveness.ts +0 -109
  906. package/scripts/test-harness-terminal.ts +0 -164
  907. package/scripts/test-header-trail.mjs +0 -95
  908. package/scripts/test-hitl.ts +0 -360
  909. package/scripts/test-koda-restyle.mjs +0 -105
  910. package/scripts/test-lane-raw.ts +0 -67
  911. package/scripts/test-lanes-history-render.mjs +0 -138
  912. package/scripts/test-loop-omp.mjs +0 -154
  913. package/scripts/test-mdlite.ts +0 -53
  914. package/scripts/test-memory-brief-chronicle.ts +0 -180
  915. package/scripts/test-memory-rrf-mmr.ts +0 -114
  916. package/scripts/test-mock-collab.mjs +0 -226
  917. package/scripts/test-modern-render.mjs +0 -174
  918. package/scripts/test-omp-terminal.mjs +0 -187
  919. package/scripts/test-plugin-ext.ts +0 -173
  920. package/scripts/test-prompts-loader.ts +0 -56
  921. package/scripts/test-real-scenario.mjs +0 -290
  922. package/scripts/test-stream-render.ts +0 -37
  923. package/scripts/test-task-drawer.mjs +0 -204
  924. package/scripts/test-task-invariants.mjs +0 -169
  925. package/scripts/test-town-3d.mjs +0 -121
  926. package/scripts/test-town-layout.mjs +0 -200
  927. package/scripts/test-town-page.mjs +0 -136
  928. package/scripts/test-town-scene-math.ts +0 -169
  929. package/scripts/test-town-twin.mjs +0 -121
  930. package/scripts/test-town-upload.mjs +0 -89
  931. package/scripts/test-town-user-flow.mjs +0 -619
  932. package/scripts/test-town-world.mjs +0 -76
  933. package/scripts/test-town-wuwa.mjs +0 -198
  934. package/scripts/test-user-isolation.mjs +0 -193
  935. package/scripts/test-workshop-entries.ts +0 -370
  936. package/scripts/test-workspace-api.ts +0 -329
  937. package/scripts/test-ws-aep.mjs +0 -187
  938. package/scripts/test-ws-protocol.ts +0 -134
  939. package/scripts/town-demo-seed.mjs +0 -75
  940. package/scripts/town-scene-clear.mjs +0 -56
  941. package/scripts/verify-exec-modes-report.ts +0 -248
  942. package/scripts/verify-lead-mail.ts +0 -188
  943. package/scripts/verify-page-smoke.mjs +0 -87
  944. package/scripts/ws-test.mjs +0 -176
  945. 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)